@one-grid-core/angular 0.5.1 → 0.5.2
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.
|
@@ -144,6 +144,24 @@ export class OneGridBodyComponent {
|
|
|
144
144
|
* MAX_BUFFER_PX keeps roughly twenty rows of overscan either side instead.
|
|
145
145
|
*/
|
|
146
146
|
this.MAX_BUFFER_PX = 600;
|
|
147
|
+
/**
|
|
148
|
+
* Params for a component cell renderer.
|
|
149
|
+
*
|
|
150
|
+
* The cell params, plus whatever the column declared in
|
|
151
|
+
* `cellRendererParams` — a field that exists precisely so a renderer can be
|
|
152
|
+
* configured per column, and that nothing had ever forwarded to it. Column
|
|
153
|
+
* config goes first so the grid's own fields win a name collision.
|
|
154
|
+
*/
|
|
155
|
+
/**
|
|
156
|
+
* Cached per cell, keyed on the identities that mean "this cell changed":
|
|
157
|
+
* its cellStates object (replaced on every edit and state refresh) and its
|
|
158
|
+
* data object. Building a fresh object per call — which a template method
|
|
159
|
+
* does per change-detection pass — made the renderer directive see "params
|
|
160
|
+
* changed" every pass and re-run the component's oneInit each time. A
|
|
161
|
+
* renderer whose oneInit touched grid state (a custom tree expander is the
|
|
162
|
+
* classic case) then re-triggered change detection and looped forever.
|
|
163
|
+
*/
|
|
164
|
+
this.rendererParamsCache = new Map();
|
|
147
165
|
// ---------------------------------------------------------------------------
|
|
148
166
|
// Cell navigation
|
|
149
167
|
//
|
|
@@ -213,6 +231,8 @@ export class OneGridBodyComponent {
|
|
|
213
231
|
*/
|
|
214
232
|
this.subscriptions.add(this.eventService.addEventListener('columnChanged', (payload) => {
|
|
215
233
|
this.columnDefs = [...payload.columns];
|
|
234
|
+
// Params carry the columnDef, so a column change invalidates them all.
|
|
235
|
+
this.rendererParamsCache.clear();
|
|
216
236
|
this.cellRenderer = this.columnDefs.some(col => col.cellRendererComponent);
|
|
217
237
|
this.rowWidth = this.columnDefs.reduce((sum, col) => sum + resolveColumnWidth(col), 0);
|
|
218
238
|
// A column change can alter the width left for flex columns (a hide, a
|
|
@@ -228,6 +248,9 @@ export class OneGridBodyComponent {
|
|
|
228
248
|
// The full post-filter count, reported before the page slice is taken,
|
|
229
249
|
// so the host's paging totals see everything.
|
|
230
250
|
this.rowCountChanged.emit(allNodes?.length ?? 0);
|
|
251
|
+
// New rows, new renderer params — and removed rows leave no stale
|
|
252
|
+
// cache entries behind.
|
|
253
|
+
this.rendererParamsCache.clear();
|
|
231
254
|
const nodes = this.api.pageNodes(allNodes);
|
|
232
255
|
setTimeout(() => {
|
|
233
256
|
this.viewport?.checkViewportSize();
|
|
@@ -256,6 +279,7 @@ export class OneGridBodyComponent {
|
|
|
256
279
|
* Listen Pinned Row Data Changed Event
|
|
257
280
|
*/
|
|
258
281
|
this.subscriptions.add(this.eventService.addEventListener('pinnedRowDataChanged', ({ side, nodes }) => {
|
|
282
|
+
this.rendererParamsCache.clear();
|
|
259
283
|
if (side === 'top') {
|
|
260
284
|
this.pinnedTopNodes = nodes;
|
|
261
285
|
}
|
|
@@ -838,16 +862,14 @@ export class OneGridBodyComponent {
|
|
|
838
862
|
cellParams(node, column) {
|
|
839
863
|
return this.cellService.cellParams(column, node);
|
|
840
864
|
}
|
|
841
|
-
/**
|
|
842
|
-
* Params for a component cell renderer.
|
|
843
|
-
*
|
|
844
|
-
* The cell params, plus whatever the column declared in
|
|
845
|
-
* `cellRendererParams` — a field that exists precisely so a renderer can be
|
|
846
|
-
* configured per column, and that nothing had ever forwarded to it. Column
|
|
847
|
-
* config goes first so the grid's own fields win a name collision.
|
|
848
|
-
*/
|
|
849
865
|
rendererParams(node, column) {
|
|
850
|
-
|
|
866
|
+
const key = getCellKey(node.rowId, column.field ?? column.id ?? '');
|
|
867
|
+
const cached = this.rendererParamsCache.get(key);
|
|
868
|
+
if (cached && cached.states === node.cellStates && cached.data === node.data)
|
|
869
|
+
return cached.params;
|
|
870
|
+
const params = { ...(column?.cellRendererParams ?? {}), ...this.cellParams(node, column) };
|
|
871
|
+
this.rendererParamsCache.set(key, { states: node.cellStates, data: node.data, params });
|
|
872
|
+
return params;
|
|
851
873
|
}
|
|
852
874
|
/**
|
|
853
875
|
* `aria-rowindex` is 1-based over the whole grid, not over what is rendered.
|
|
@@ -1231,4 +1253,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
1231
1253
|
type: HostListener,
|
|
1232
1254
|
args: ['document:mouseup']
|
|
1233
1255
|
}] } });
|
|
1234
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtYm9keS9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1ib2R5L29uZS1ncmlkLWJvZHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWdDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLdE8sT0FBTyxFQUFXLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBR3pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDNUYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDM0gsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sa0VBQWtF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bEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGNBQWM7c0JBQXZCLE1BQU07Z0JBQ0csa0JBQWtCO3NCQUEzQixNQUFNO2dCQUNHLGVBQWU7c0JBQXhCLE1BQU07Z0JBRUcsZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBQ0csZ0JBQWdCO3NCQUF6QixNQUFNO2dCQUNHLFVBQVU7c0JBQW5CLE1BQU07Z0JBK1VQLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxnQkFBZ0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkFrQjFDLGVBQWU7c0JBRGQsWUFBWTt1QkFBQyxrQkFBa0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBRdWVyeUxpc3QsIFRlbXBsYXRlUmVmLCBUeXBlLCBWaWV3Q2hpbGQsIFZpZXdDaGlsZHJlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ2VsbFNlbGVjdGlvbiwgT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtcywgT25lQ2VsbFJlbmRlcmVyUGFyYW1zLCBPbmVDb2x1bW5EZWYgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtY29sdW1uLWRlZi10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtdHJlZS1kYXRhLm1vZGVsJztcbmltcG9ydCB7IE9uZVJvd05vZGUgfSBmcm9tICcuLi8uLi9jb3JlL2luc3RhbnRzL29uZS1yb3ctbm9kZS5jbGFzcyc7XG5pbXBvcnQgeyBPbmVHcmlkQXBpIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtZ3JpZC1hcGkuY2xhc3MnO1xuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBPbmVHcmlkR2V0Um93SWRQYXJhbXMsIE9uZUdyaWRSZWFkeUV2ZW50LCBPbmVHcmlkUm93QWN0aW9uRXZlbnQsIE9uZUdyaWRUeXBlIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWdyaWQtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lR3JpZEV2ZW50U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtZXZlbnQuc2VydmljZSc7XG5pbXBvcnQgeyBDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQsIENvbHVtbkNoYW5nZWRFdmVudCwgRXhwYW5zaW9uQ2hhbmdlZEV2ZW50LCBQaW5uZWRSb3dEYXRhQ2hhbmdlZEV2ZW50LCBSb3dEYXRhQ2hhbmdlZEV2ZW50LCBSb3dPcmRlckNoYW5nZWRFdmVudCwgU2VsZWN0aW9uQ2hhbmdlZEV2ZW50LCBTb3J0Q2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWV2ZW50LXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcyB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1tYXN0ZXItZGV0YWlsLm1vZGVsJztcbmltcG9ydCB7IENlbGxFZGl0YWJsZVBpcGUgfSBmcm9tICcuLi8uLi9jb3JlL3BpcGVzL2NlbGwtZWRpdGFibGUucGlwZSc7XG5pbXBvcnQgeyBnZXRDZWxsS2V5LCBnZXRGaWVsZFZhbHVlIH0gZnJvbSAnLi4vLi4vaGVscGVycy9vbmUtY2VsbC5oZWxwZXInO1xuaW1wb3J0IHsgT25lR3JpZENlbGxTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1jZWxsLnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCBTY3JvbGxpbmdNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7IE9nQ29sdW1uU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb2ctY29sdW1uLnNlcnZpY2UnO1xuaW1wb3J0IHsgcmVzb2x2ZUNvbHVtbldpZHRoIH0gZnJvbSAnLi4vLi4vaGVscGVycy9vbmUtY29sdW1uLWRlZi5oZWxwZXInO1xuaW1wb3J0IHsgT25lR3JpZFJvd0RyYWdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9vbmUtZ3JpZC1yb3ctZHJhZy5zZXJ2aWNlJztcbmltcG9ydCB7IE9uZVJvd0RyYWdFdmVudCwgT25lUm93RHJhZ1N0YXRlLCBPbmVSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbiB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1yb3ctZHJhZy5tb2RlbCc7XG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ1N0eWxlLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE9uZUdyaWRDaGVja2JveENvbXBvbmVudCB9IGZyb20gJy4uL29uZS1ncmlkLWNoZWNrYm94L29uZS1ncmlkLWNoZWNrYm94LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPbmVHcmlkQ2VsbEdyb3VwUmVuZGVyZXJDb21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyL29uZS1ncmlkLWNlbGwtZ3JvdXAtcmVuZGVyZXIuY29tcG9uZW50JztcbmltcG9ydCB7IE9uZUdyaWRDZWxsT3B0aW9uTWVudUNvbXBvbmVudCB9IGZyb20gJy4uL29uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnUvb25lLWdyaWQtY2VsbC1vcHRpb24tbWVudS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT25lR3JpZFJvd0FjdGlvbkNvbXBvbmVudCB9IGZyb20gJy4uL29uZS1ncmlkLXJvdy1hY3Rpb24vb25lLWdyaWQtcm93LWFjdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgT25lR3JpZFJvd0RyYWdIYW5kbGVDb21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1yb3ctZHJhZy1oYW5kbGUvb25lLWdyaWQtcm93LWRyYWctaGFuZGxlLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPbmVDZWxsSW5wdXRWYWxpZGF0b3JEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvb25lLWNlbGwtaW5wdXQtdmFsaWRhdG9yLmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvb25lLWNlbGwtcmVuZGVyZXItY29tcG9uZW50LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBPbmVDZWxsVGV4dEV4cGFuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uL2NvcmUvZGlyZWN0aXZlcy9vbmUtY2VsbC10ZXh0LWV4cGFuZC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgQ2VsbEFjdGlvbkJ1dHRvbkVuYWJsZVBpcGUgfSBmcm9tICcuLi8uLi9jb3JlL3BpcGVzL2NlbGwtYWN0aW9uLWJ1dHRvbi1lbmFibGUucGlwZSc7XG5pbXBvcnQgeyBDZWxsSW52YWxpZFBpcGUgfSBmcm9tICcuLi8uLi9jb3JlL3BpcGVzL2NlbGwtaW52YWxpZC5waXBlJztcbmltcG9ydCB7IENlbGxLZXlQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLWtleS5waXBlJztcbmltcG9ydCB7IENlbGxMZXZlbFBhZGRpbmdQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLWxldmVsLXBhZGRpbmcucGlwZSc7XG5pbXBvcnQgeyBDZWxsU2VsZWN0ZWRQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLXNlbGVjdGVkLnBpcGUnO1xuaW1wb3J0IHsgQ2VsbFN0YXRlUmVuZGVyZXJQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLXN0YXRlLXJlbmRlcmVyLnBpcGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE5nQ2xhc3MsXG4gICAgTmdTdHlsZSxcbiAgICBOZ1RlbXBsYXRlT3V0bGV0LFxuICAgIFNjcm9sbGluZ01vZHVsZSxcbiAgICBPbmVHcmlkQ2hlY2tib3hDb21wb25lbnQsXG4gICAgT25lR3JpZENlbGxHcm91cFJlbmRlcmVyQ29tcG9uZW50LFxuICAgIE9uZUdyaWRDZWxsT3B0aW9uTWVudUNvbXBvbmVudCxcbiAgICBPbmVHcmlkUm93QWN0aW9uQ29tcG9uZW50LFxuICAgIE9uZUdyaWRSb3dEcmFnSGFuZGxlQ29tcG9uZW50LFxuICAgIE9uZUNlbGxJbnB1dFZhbGlkYXRvckRpcmVjdGl2ZSxcbiAgICBPbmVDZWxsUmVuZGVyZXJDb21wb25lbnREaXJlY3RpdmUsXG4gICAgT25lQ2VsbFRleHRFeHBhbmREaXJlY3RpdmUsXG4gICAgQ2VsbEFjdGlvbkJ1dHRvbkVuYWJsZVBpcGUsXG4gICAgQ2VsbEVkaXRhYmxlUGlwZSxcbiAgICBDZWxsSW52YWxpZFBpcGUsXG4gICAgQ2VsbEtleVBpcGUsXG4gICAgQ2VsbExldmVsUGFkZGluZ1BpcGUsXG4gICAgQ2VsbFNlbGVjdGVkUGlwZSxcbiAgICBDZWxsU3RhdGVSZW5kZXJlclBpcGUsXG4gIF0sXG4gIHNlbGVjdG9yOiAnb25lLWdyaWQtYm9keScsXG4gIC8vIFRoZSBob3N0IHNpdHMgYmV0d2VlbiByb2xlPVwiZ3JpZFwiIGFuZCB0aGUgcm93cyBpdCBtdXN0IG93bjsgYSBnZW5lcmljXG4gIC8vIGVsZW1lbnQgdGhlcmUgYnJlYWtzIHRoZSBvd25lcnNoaXAgY2hhaW4sIHNvIGl0IGxlYXZlcyB0aGUgYTExeSB0cmVlLlxuICBob3N0OiB7ICdyb2xlJzogJ3ByZXNlbnRhdGlvbicgfSxcbiAgdGVtcGxhdGVVcmw6ICcuL29uZS1ncmlkLWJvZHkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vb25lLWdyaWQtYm9keS5jb21wb25lbnQuc2NzcycsXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBPbmVHcmlkQm9keUNvbXBvbmVudDxUPiBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95IHtcblxuICAvKipcbiAgICogQ29yZSBQcm9wZXJ0aWVzXG4gICAqL1xuICBAVmlld0NoaWxkKCdib2R5UmVmJywgeyBzdGF0aWM6IHRydWUgfSkgYm9keVJlZiE6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+O1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSByb3dEYXRhOiBUW10gPSBbXTtcbiAgQElucHV0KCkgcm93TnVtYmVyOiBib29sZWFuO1xuICBASW5wdXQoKSBhcGkhOiBPbmVHcmlkQXBpPFQ+O1xuICBASW5wdXQoKSBwYWdpbmF0aW9uOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIGFsbG93ZWRFZGl0OiBib29sZWFuID0gdHJ1ZTtcbiAgQElucHV0KCkgZW5hYmxlR3JvdXBDb2x1bW5EZWZzOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHN1Ym1pdHRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBgJ2Z1bGxSb3cnYDogYSBkb3VibGUtY2xpY2sgb3BlbnMgZXZlcnkgZWRpdGFibGUgY2VsbCBvZiB0aGUgcm93LCBFbnRlciBvclxuICAgKiBmb2N1cyBsZWF2aW5nIHRoZSByb3cgY29tbWl0cyB0aGVtIHRvZ2V0aGVyLCBFc2NhcGUgY2xvc2VzIHRoZW0gYWxsXG4gICAqIHdpdGhvdXQgY29tbWl0dGluZy4gRGVmYXVsdDogb25lIGNlbGwgYXQgYSB0aW1lLlxuICAgKi9cbiAgQElucHV0KCkgZWRpdFR5cGU6ICdmdWxsUm93JyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKSBjb250ZXh0OiBhbnkgPSBudWxsO1xuICBASW5wdXQoKSBnZXRSb3dJZDogKHBhcmFtczogT25lR3JpZEdldFJvd0lkUGFyYW1zPFQ+KSA9PiBzdHJpbmc7XG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pIGdyaWRDb3B5JCE6IFN1YmplY3Q8Q2xpcGJvYXJkRXZlbnQ+O1xuXG4gIC8qKlxuICAgKiBQaW5uZWQgcm93cyBhcmUgYm91bmQgb25seSBzbyB0aGUgY29tcG9uZW50IHJlLXJlbmRlcnMgd2hlbiB0aGV5IGNoYW5nZTtcbiAgICogdGhlIG5vZGVzIHRoZW1zZWx2ZXMgY29tZSBmcm9tIHRoZSBBUEksIHdoaWNoIG93bnMgdGhlbS5cbiAgICovXG4gIEBJbnB1dCgpIHBpbm5lZFRvcFJvd0RhdGE6IFRbXSA9IFtdO1xuICBASW5wdXQoKSBwaW5uZWRCb3R0b21Sb3dEYXRhOiBUW10gPSBbXTtcblxuICAvKipcbiAgICogVGhlIHBpbm5lZCByb3cgY29udGFpbmVycyBzaXQgb3V0c2lkZSB0aGUgc2Nyb2xsIHZpZXdwb3J0LCBzbyB0aGV5IGhhdmUgdG9cbiAgICogYmUgdG9sZCB0aGUgaG9yaXpvbnRhbCBvZmZzZXQg4oCUIHRoZSBzYW1lIGFycmFuZ2VtZW50IHRoZSBoZWFkZXIgdXNlcy5cbiAgICovXG4gIEBWaWV3Q2hpbGRyZW4oJ3Bpbm5lZFZpZXdwb3J0JykgcHJpdmF0ZSBwaW5uZWRWaWV3cG9ydHM/OiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRWxlbWVudD4+O1xuXG4gIHByb3RlY3RlZCBwaW5uZWRUb3BOb2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIHByb3RlY3RlZCBwaW5uZWRCb3R0b21Ob2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG4gIEBWaWV3Q2hpbGQoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0KSB2aWV3cG9ydCE6IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydDtcblxuICBwcm90ZWN0ZWQgY29sdW1uRGVmczogT25lQ29sdW1uRGVmPFQ+W10gPSBbXTtcbiAgcHJvdGVjdGVkIGNlbGxSZW5kZXJlcjogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIC8qKlxuICAgKiBNYXN0ZXIgRGV0YWlsIFByb3BlcnRpZXNcbiAgICovXG4gIEBJbnB1dCgpIGdyaWRUeXBlOiBPbmVHcmlkVHlwZSA9ICdzaW1wbGUnO1xuICBASW5wdXQoKSBtYXN0ZXJEZXRhaWw6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgbWFzdGVyTm9kZTogT25lUm93Tm9kZTxUPiA9IG51bGw7XG4gIC8vIEBJbnB1dCgpIGRldGFpbFJvd0hlaWdodDogbnVtYmVyID0gbnVsbDtcbiAgLy8gQElucHV0KCkgZGV0YWlsUm93QXV0b0hlaWdodDogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBkZXRhaWxSb3dNYXhIZWlnaHQ6IG51bWJlciA9IG51bGw7XG4gIEBJbnB1dCgpIGRldGFpbENlbGxSZW5kZXJlclBhcmFtczogT25lRGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zO1xuICBASW5wdXQoKSBkZXRhaWxHcmlkVGVtcGxhdGU6IFRlbXBsYXRlUmVmPHVua25vd24+ID0gbnVsbDtcbiAgQElucHV0KCkgZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ6IFR5cGU8T25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50PjtcblxuICAvKipcbiAgICogVHJlZSBEYXRhIFByb3BlcnRpZXNcbiAgICovXG4gIEBJbnB1dCgpIHRyZWVEYXRhOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIHRyZWVEYXRhQ2hpbGRyZW5GaWVsZDogc3RyaW5nO1xuICBASW5wdXQoKSBhdXRvR3JvdXBDb2x1bW5EZWY6IE9uZUNvbHVtbkRlZjxUPjtcbiAgQElucHV0KCkgZ3JvdXBEZWZhdWx0RXhwYW5kZWQ6IG51bWJlciA9IC0xOyAvLyBJdCdzIHdvcmsgd2l0aCBtYXN0ZXIgZGV0YWlsIGFsc29cblxuICAvKipcbiAgICogUGFzc2luZyBSb3cgQWN0aW9uIEV2ZW50cyB0byBQYXJlbnRcbiAgICovXG4gIEBPdXRwdXQoKSBvblJvd0dvdG9EZXRhaWwgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93QWRkTmV3ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1ZpZXcgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q29weSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dMb2NhdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dEb2N1bWVudCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dEZWxldGUgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93R290b0xpc3QgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RWRpdCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dQcmludCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dIaXN0b3J5ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd09wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dMYW5ndWFnZSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dDZWxsT3B0aW9uID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd1NlbGVjdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25TaGlmdERvdWJsZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSByb3dDb3VudENoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICBAT3V0cHV0KCkgZXhwYW5zaW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXI8RXhwYW5zaW9uQ2hhbmdlZEV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgYm9keVNjcm9sbCA9IG5ldyBFdmVudEVtaXR0ZXI8bnVtYmVyPigpO1xuICBAT3V0cHV0KCkgY2VsbE9wdGlvblNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCkgcm93RHJhZ0VuZCA9IG5ldyBFdmVudEVtaXR0ZXI8T25lUm93RHJhZ0V2ZW50PFQ+PigpO1xuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gUmFuZ2UgVmFyaWFibGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgcm93V2lkdGg6IG51bWJlciA9IDA7XG4gIHByb3RlY3RlZCBub2RlczogT25lUm93Tm9kZTxUPltdID0gW107XG5cbiAgLyoqXG4gICAqIFJvdyBkcmFnIHN0YXRlLCBtaXJyb3JlZCBmcm9tIHRoZSBzZXJ2aWNlIHNvIHRoZSB0ZW1wbGF0ZSBjYW4gcmVhZCBpdFxuICAgKiBzeW5jaHJvbm91c2x5LiBgbnVsbGAgd2hlbmV2ZXIgbm8gZHJhZyBpcyBpbiBmbGlnaHQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZHJhZ1N0YXRlOiBPbmVSb3dEcmFnU3RhdGUgfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIGRyYWdBbm5vdW5jZW1lbnQgPSAnJztcbiAgcHJvdGVjdGVkIHJvd0RyYWdTdXBwcmVzc2VkOiBPbmVSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbiB8IG51bGwgPSBudWxsO1xuICBwcm90ZWN0ZWQgc2VsZWN0ZWRDZWxscyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBwcml2YXRlIGlzTW91c2VEb3duID0gZmFsc2U7XG4gIHByaXZhdGUgc3RhcnRDZWxsOiBDZWxsU2VsZWN0aW9uID0gbnVsbDtcbiAgcHJpdmF0ZSBsYXN0U2Nyb2xsTGVmdCA9IDA7XG4gIHByaXZhdGUgY2VsbEVkaXRhYmxlUGlwZSA9IG5ldyBDZWxsRWRpdGFibGVQaXBlKCk7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9ucyA9IG5ldyBTdWJzY3JpcHRpb24oKTtcblxuICBwcm90ZWN0ZWQgY2VsbFJlbmRlcmVyUGFyYW1zOiBPbmVDZWxsUmVuZGVyZXJQYXJhbXMgPSB7XG4gICAgICBnb3RvRGV0YWlsQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgYWRkTmV3QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgdmlld0J1dHRvblN0YXR1czogMSxcbiAgICAgIGxvY2F0aW9uQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgZG9jdW1lbnRCdXR0b25TdGF0dXM6IDEsXG4gICAgICBjb3B5QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgZGVsZXRlQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgZ290b0xpc3RCdXR0b25TdGF0dXM6IDEsXG4gICAgICBvcHRpb25CdXR0b25TdGF0dXM6IDEsXG4gICAgICBsYW5ndWFnZUJ1dHRvblN0YXR1czogMSxcbiAgICAgIGVkaXRCdXR0b25TdGF0dXM6IDEsXG4gICAgICBwcmludEJ1dHRvblN0YXR1czogMSxcbiAgICAgIGhpc3RvcnlCdXR0b25TdGF0dXM6IDEsXG4gIH1cblxuICAvKipcbiAgICogVmlydHVhbCBTY3JvbGwgUHJvcGVydGllc1xuICAgKi9cbiAgcHJvdGVjdGVkIGl0ZW1TaXplOiBudW1iZXIgPSAzMDtcbiAgcHJvdGVjdGVkIG1pbkJ1ZmZlclB4OiBudW1iZXIgPSAyMDA7XG4gIHByb3RlY3RlZCBtYXhCdWZmZXJQeDogbnVtYmVyID0gNDAwO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBjb2xTZXJ2aWNlOiBPZ0NvbHVtblNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIGNlbGxTZXJ2aWNlOiBPbmVHcmlkQ2VsbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudFNlcnZpY2U6IE9uZUdyaWRFdmVudFNlcnZpY2UsXG4gICAgcHJvdGVjdGVkIHJvd0RyYWdTZXJ2aWNlOiBPbmVHcmlkUm93RHJhZ1NlcnZpY2U8VD4sXG4gICAgcHJpdmF0ZSBjZHI6IENoYW5nZURldGVjdG9yUmVmXG4gICkgeyB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gR3JpZCBDb3B5IEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmdyaWRDb3B5JC5zdWJzY3JpYmUoKGV2ZW50OiBDbGlwYm9hcmRFdmVudCkgPT4ge1xuXG4gICAgICB0aGlzLm9uR3JpZENvcHkoZXZlbnQpO1xuICAgIH0pKTtcblxuICAgIC8qKlxuICAgICAqIFJvdyBkcmFnXG4gICAgICpcbiAgICAgKiBUaGUgc2VydmljZSBvd25zIHRoZSBnZXN0dXJlOyB0aGUgYm9keSBvbmx5IHJlbmRlcnMgaXQgYW5kIGxlbmRzIGl0IHRoZVxuICAgICAqIHZpZXdwb3J0LCB0aGUgcm93IGhlaWdodCBhbmQgYSB3YXkgdG8gYXBwbHkgYSBtb3ZlLiBUaGUgc3VwcHJlc3Npb25cbiAgICAgKiByZWFzb24gaXMgcmUtcmVhZCBvbiBldmVyeSBldmVudCB0aGF0IGNvdWxkIGNoYW5nZSB0aGUgb3JkZXIsIHNvIHRoZVxuICAgICAqIGhhbmRsZSBkaXNhYmxlcyBpdHNlbGYgdGhlIG1vbWVudCBhIHNvcnQgb3IgZmlsdGVyIGlzIGFwcGxpZWQuXG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLnJvd0RyYWdTZXJ2aWNlLnN0YXRlJC5zdWJzY3JpYmUoKHN0YXRlKSA9PiB7XG5cbiAgICAgIHRoaXMuZHJhZ1N0YXRlID0gc3RhdGU7XG5cbiAgICAgIHRoaXMudXBkYXRlRHJvcEluZGljYXRvcigpO1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMucm93RHJhZ1NlcnZpY2UuYW5ub3VuY2VtZW50JC5zdWJzY3JpYmUoKG1lc3NhZ2UpID0+IHtcblxuICAgICAgdGhpcy5kcmFnQW5ub3VuY2VtZW50ID0gbWVzc2FnZTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIENvbHVtbiBDaGFuZ2VkIEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdjb2x1bW5DaGFuZ2VkJywgKHBheWxvYWQ6IENvbHVtbkNoYW5nZWRFdmVudCkgPT4ge1xuXG4gICAgICB0aGlzLmNvbHVtbkRlZnMgPSBbLi4ucGF5bG9hZC5jb2x1bW5zXSBhcyBPbmVDb2x1bW5EZWZbXTtcblxuICAgICAgdGhpcy5jZWxsUmVuZGVyZXIgPSB0aGlzLmNvbHVtbkRlZnMuc29tZShjb2wgPT4gY29sLmNlbGxSZW5kZXJlckNvbXBvbmVudCk7XG5cbiAgICAgIHRoaXMucm93V2lkdGggPSB0aGlzLmNvbHVtbkRlZnMucmVkdWNlKChzdW0sIGNvbCkgPT4gc3VtICsgcmVzb2x2ZUNvbHVtbldpZHRoKGNvbCksIDApO1xuXG4gICAgICAvLyBBIGNvbHVtbiBjaGFuZ2UgY2FuIGFsdGVyIHRoZSB3aWR0aCBsZWZ0IGZvciBmbGV4IGNvbHVtbnMgKGEgaGlkZSwgYVxuICAgICAgLy8gcmVzaXplLCBuZXcgZGVmcykuIFJlLWZsZXhpbmcgb25seSBkaXNwYXRjaGVzIHdoZW4gYSB3aWR0aCBhY3R1YWxseVxuICAgICAgLy8gY2hhbmdlcywgc28gdGhpcyBjYW5ub3QgcGluZy1wb25nLlxuICAgICAgdGhpcy5hcHBseUZsZXhXaWR0aHMoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFJvdyBEYXRhIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd0RhdGFDaGFuZ2VkJywgKHsgbm9kZXM6IGFsbE5vZGVzIH06IFJvd0RhdGFDaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgLy8gVGhlIGZ1bGwgcG9zdC1maWx0ZXIgY291bnQsIHJlcG9ydGVkIGJlZm9yZSB0aGUgcGFnZSBzbGljZSBpcyB0YWtlbixcbiAgICAgIC8vIHNvIHRoZSBob3N0J3MgcGFnaW5nIHRvdGFscyBzZWUgZXZlcnl0aGluZy5cbiAgICAgIHRoaXMucm93Q291bnRDaGFuZ2VkLmVtaXQoYWxsTm9kZXM/Lmxlbmd0aCA/PyAwKTtcblxuICAgICAgY29uc3Qgbm9kZXMgPSB0aGlzLmFwaS5wYWdlTm9kZXMoYWxsTm9kZXMpO1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcblxuICAgICAgICB0aGlzLnZpZXdwb3J0Py5jaGVja1ZpZXdwb3J0U2l6ZSgpO1xuXG4gICAgICAgIHRoaXMuc2V0VmlydHVhbFNjcm9sbChub2Rlcz8ubGVuZ3RoKTtcblxuICAgICAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgICAgIHRoaXMubm9kZXMgPSBub2Rlcy5tYXAoKG5vZGU6IE9uZVJvd05vZGUpID0+IHtcblxuICAgICAgICAgICAgaWYgKG5vZGUubGVhZiAmJiB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50KSB7XG5cbiAgICAgICAgICAgICAgbm9kZS5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCA9IHRoaXMuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERldGFpbCByb3dzIGNhbiBzdGlsbCBiZSBpbiBmbGlnaHQgd2hlbiBhIHJvdyBpcyBleHBhbmRlZCwgYW5kXG4gICAgICAgICAgICAvLyBzcHJlYWRpbmcgbnVsbCB0aHJvd3MuIE5vdGhpbmcgdG8gcmUtc2VlZCB1bnRpbCB0aGV5IGFycml2ZS5cbiAgICAgICAgICAgIGlmIChub2RlLmV4cGFuZGVkICYmIG5vZGUuZGV0YWlsUm93RGF0YSkge1xuXG4gICAgICAgICAgICAgIHRoaXMuYXBpLnNldERldGFpbFJvd0RhdGEobm9kZSwgWy4uLm5vZGUuZGV0YWlsUm93RGF0YV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbm9kZTtcbiAgICAgICAgICB9KTtcblxuICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgdGhpcy5ub2RlcyA9IG5vZGVzIGFzIE9uZVJvd05vZGU8VD5bXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucmVmcmVzaFJvd0RyYWdTdXBwcmVzc2VkKCk7XG5cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9KTtcbiAgICB9KSk7XG5cblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBQaW5uZWQgUm93IERhdGEgQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcigncGlubmVkUm93RGF0YUNoYW5nZWQnLCAoeyBzaWRlLCBub2RlcyB9OiBQaW5uZWRSb3dEYXRhQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgIGlmIChzaWRlID09PSAndG9wJykge1xuXG4gICAgICAgIHRoaXMucGlubmVkVG9wTm9kZXMgPSBub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W107XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgdGhpcy5waW5uZWRCb3R0b21Ob2RlcyA9IG5vZGVzIGFzIE9uZVJvd05vZGU8VD5bXTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFNvcnQgQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignc29ydENoYW5nZWQnLCAoeyBub2RlcyB9OiBTb3J0Q2hhbmdlZEV2ZW50KSA9PiB7XG5cbiAgICAgIHRoaXMubm9kZXMgPSB0aGlzLmFwaS5wYWdlTm9kZXMobm9kZXMgYXMgT25lUm93Tm9kZTxUPltdKTtcblxuICAgICAgLy8gU29ydGluZyB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIG9yZGVyIGF3YXkgZnJvbSB0aGUgdXNlciwgc28gdGhlIGhhbmRsZXNcbiAgICAgIC8vIGhhdmUgdG8gZGlzYWJsZSBpbiB0aGUgc2FtZSBmcmFtZSB0aGUgcm93cyByZS1zb3J0LlxuICAgICAgdGhpcy5yZWZyZXNoUm93RHJhZ1N1cHByZXNzZWQoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFJvdyBPcmRlciBDaGFuZ2VkIEV2ZW50XG4gICAgICpcbiAgICAgKiBEZWxpYmVyYXRlbHkgbm90IGZvbGRlZCBpbnRvIGByb3dEYXRhQ2hhbmdlZGA6IHRoYXQgcGF0aCBkZWZlcnMgYSBmcmFtZVxuICAgICAqIGFuZCByZS1zZWVkcyBkZXRhaWwgcm93cywgd2hpY2ggaXMgcmlnaHQgZm9yIGEgZGF0YSBsb2FkIGFuZCBmYXIgdG9vIG11Y2hcbiAgICAgKiBmb3IgYSBtb3ZlLiBBIHJlb3JkZXIgaXMgdGhlIHNhbWUgbm9kZXMgaW4gYSBkaWZmZXJlbnQgb3JkZXIuXG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdyb3dPcmRlckNoYW5nZWQnLCAoeyBub2RlcyB9OiBSb3dPcmRlckNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICB0aGlzLm5vZGVzID0gdGhpcy5hcGkucGFnZU5vZGVzKFsuLi5ub2Rlc10gYXMgT25lUm93Tm9kZTxUPltdKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIENlbGwgU3RhdGUgQ2hhbmdlZCBFdmVudFxuICAgICAqXG4gICAgICogVGhlIGJvZHkgcmVuZGVycyBPblB1c2gsIHNvIHJlZ2VuZXJhdGluZyBhIHJvdydzIGNlbGwgc3RhdGUgaXMgaW52aXNpYmxlXG4gICAgICogdW50aWwgc29tZXRoaW5nIG1hcmtzIHRoZSBib2R5IGRpcnR5LiBUaGlzIGlzIHRoYXQgc29tZXRoaW5nLlxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY2VsbFN0YXRlQ2hhbmdlZCcsICgpID0+IHtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFNlbGVjdGlvbiBDaGFuZ2VkIEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3Rpb25DaGFuZ2VkJywgKHBheWxvYWQ6IFNlbGVjdGlvbkNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICBpZiAocGF5bG9hZCkge1xuXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuICAgIH0pKTtcbiAgfVxuXG4gIG9uR3JpZFJlYWR5KHBhcmFtczogT25lR3JpZFJlYWR5RXZlbnQpIHtcblxuICAgIHBhcmFtcy5hcGkuc2V0Um93RGF0YSh0aGlzLm1hc3Rlck5vZGU/LmRldGFpbFJvd0RhdGEgPz8gW10pO1xuICB9XG5cbiAgb25Cb2R5U2Nyb2xsKGV2ZW50OiBFdmVudCkge1xuXG4gICAgY29uc3Qgc2Nyb2xsTGVmdCA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpLnNjcm9sbExlZnQ7XG5cbiAgICBpZiAoc2Nyb2xsTGVmdCAhPT0gdGhpcy5sYXN0U2Nyb2xsTGVmdCkge1xuXG4gICAgICB0aGlzLmxhc3RTY3JvbGxMZWZ0ID0gc2Nyb2xsTGVmdDtcblxuICAgICAgdGhpcy5zeW5jUGlubmVkUm93cyhzY3JvbGxMZWZ0KTtcblxuICAgICAgdGhpcy5ib2R5U2Nyb2xsLmVtaXQoc2Nyb2xsTGVmdCk7XG5cbiAgICAgIC8vIFRoZSBpbmRpY2F0b3IgaXMgY2xpcHBlZCB0byB0aGUgcm93IGNvbnRlbnQsIHdoaWNoIG1vdmVzIHNpZGV3YXlzIHRvby5cbiAgICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuXG4gICAgICAgIHRoaXMudXBkYXRlRHJvcEluZGljYXRvcigpO1xuXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVmVydGljYWw6IHRoZSBkcm9wIGluZGljYXRvciBpcyBhbmNob3JlZCB0byB0aGUgYm9keSwgbm90IHRoZSBjb250ZW50LCBzb1xuICAgIC8vIGl0IGhhcyB0byBiZSByZXBvc2l0aW9uZWQgYXMgdGhlIHJvd3MgbW92ZSBiZW5lYXRoIGl0IOKAlCB3aGljaCB0aGV5IGRvIG9uXG4gICAgLy8gdGhlaXIgb3duIGR1cmluZyBhdXRvLXNjcm9sbCwgd2l0aCB0aGUgcG9pbnRlciBzdGFuZGluZyBzdGlsbC5cbiAgICBpZiAodGhpcy5kcmFnU3RhdGUpIHtcblxuICAgICAgdGhpcy51cGRhdGVEcm9wSW5kaWNhdG9yKCk7XG5cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBLZWVwIHRoZSBwaW5uZWQgcm93cyBpbiBzdGVwIHdpdGggdGhlIGJvZHkncyBob3Jpem9udGFsIHBvc2l0aW9uLlxuICAgKlxuICAgKiBBc3NpZ25lZCByYXRoZXIgdGhhbiB0cmFuc2Zvcm1lZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcyB0aGUgaGVhZGVyOiBzdGlja3lcbiAgICogcG9zaXRpb25pbmcgZm9yIHBpbm5lZCAqY29sdW1ucyogaGFzIHRvIHJlc29sdmUgYWdhaW5zdCBhIHJlYWwgc2Nyb2xscG9ydCxcbiAgICogYW5kIGEgdHJhbnNmb3JtZWQgYW5jZXN0b3IgaXMgbm90IG9uZS4gUGlubmVkIHJvd3MgYW5kIHBpbm5lZCBjb2x1bW5zXG4gICAqIHRoZXJlZm9yZSBjb21wb3NlIOKAlCBhIGZyb3plbiBjb3JuZXIgY2VsbCBzdGF5cyBmcm96ZW4gb24gYm90aCBheGVzLlxuICAgKi9cbiAgcHJpdmF0ZSBzeW5jUGlubmVkUm93cyhzY3JvbGxMZWZ0OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIHRoaXMucGlubmVkVmlld3BvcnRzPy5mb3JFYWNoKHZpZXdwb3J0ID0+ICh2aWV3cG9ydC5uYXRpdmVFbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0KSk7XG4gIH1cblxuICAvKipcbiAgICogVHJhY2sgUmVuZGVyaW5nIFJvdyBOb2RlIEJ5IFJvdyBJRFxuICAgKi9cbiAgdHJhY2tCeVJvd0lkKGluZGV4OiBudW1iZXIsIG5vZGU6IE9uZVJvd05vZGU8VD4pOiBzdHJpbmcge1xuXG4gICAgcmV0dXJuIG5vZGUucm93SWQ7XG4gIH1cblxuICAvKipcbiAgICogQ2VsbCBTZWxlY3Rpb24gUmFuZ2UgRmVhdHVyZVxuICAgKi9cbiAgc3RhcnRTZWxlY3Rpb24ocm93SWQ6IHN0cmluZywgZmllbGQ6IHN0cmluZykge1xuXG4gICAgdGhpcy5pc01vdXNlRG93biA9IHRydWU7XG4gICAgdGhpcy5zdGFydENlbGwgPSB7IHJvd0lkLCBmaWVsZCB9O1xuICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5jbGVhcigpO1xuICAgIHRoaXMuc2VsZWN0ZWRDZWxscyA9IG5ldyBTZXQodGhpcy5zZWxlY3RlZENlbGxzKS5hZGQoZ2V0Q2VsbEtleShyb3dJZCwgZmllbGQpKTtcbiAgfVxuXG4gIGV4dGVuZFNlbGVjdGlvbihyb3dJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nKSB7XG5cbiAgICBpZiAoIXRoaXMuaXNNb3VzZURvd24gfHwgIXRoaXMuc3RhcnRDZWxsKSByZXR1cm47XG5cbiAgICBjb25zdCByb3dzID0gdGhpcy5ub2RlczsgLy8gYWxyZWFkeSBzb3J0ZWRcbiAgICBjb25zdCBzdGFydFJvd0luZGV4ID0gcm93cy5maW5kSW5kZXgociA9PiByLnJvd0lkID09PSB0aGlzLnN0YXJ0Q2VsbCEucm93SWQpO1xuICAgIGNvbnN0IGVuZFJvd0luZGV4ICAgPSByb3dzLmZpbmRJbmRleChyID0+IHIucm93SWQgPT09IHJvd0lkKTtcblxuICAgIGlmIChzdGFydFJvd0luZGV4ID09PSAtMSB8fCBlbmRSb3dJbmRleCA9PT0gLTEpIHJldHVybjtcblxuICAgIGNvbnN0IGNvbFN0YXJ0SW5kZXggPSB0aGlzLmNvbHVtbkRlZnMuZmluZEluZGV4KGMgPT4gYy5maWVsZCA9PT0gdGhpcy5zdGFydENlbGwhLmZpZWxkKTtcbiAgICBjb25zdCBjb2xFbmRJbmRleCAgID0gdGhpcy5jb2x1bW5EZWZzLmZpbmRJbmRleChjID0+IGMuZmllbGQgPT09IGZpZWxkKTtcblxuICAgIGlmIChjb2xTdGFydEluZGV4ID09PSAtMSB8fCBjb2xFbmRJbmRleCA9PT0gLTEpIHJldHVybjtcblxuICAgIGNvbnN0IHJvd1N0YXJ0ID0gTWF0aC5taW4oc3RhcnRSb3dJbmRleCwgZW5kUm93SW5kZXgpO1xuICAgIGNvbnN0IHJvd0VuZCAgID0gTWF0aC5tYXgoc3RhcnRSb3dJbmRleCwgZW5kUm93SW5kZXgpO1xuICAgIGNvbnN0IGNvbFN0YXJ0ID0gTWF0aC5taW4oY29sU3RhcnRJbmRleCwgY29sRW5kSW5kZXgpO1xuICAgIGNvbnN0IGNvbEVuZCAgID0gTWF0aC5tYXgoY29sU3RhcnRJbmRleCwgY29sRW5kSW5kZXgpO1xuXG4gICAgY29uc3QgbmV4dCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChsZXQgciA9IHJvd1N0YXJ0OyByIDw9IHJvd0VuZDsgcisrKSB7XG4gICAgICBmb3IgKGxldCBjID0gY29sU3RhcnQ7IGMgPD0gY29sRW5kOyBjKyspIHtcbiAgICAgICAgbmV4dC5hZGQoZ2V0Q2VsbEtleShyb3dzW3JdLnJvd0lkLCB0aGlzLmNvbHVtbkRlZnNbY10uZmllbGQpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdGVkQ2VsbHMgPSBuZXh0O1xuICB9XG5cblxuICBlbmRTZWxlY3Rpb24oKSB7XG5cbiAgICB0aGlzLmlzTW91c2VEb3duID0gZmFsc2U7XG4gICAgdGhpcy5zdGFydENlbGwgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIENlbGxzIFNlbGVjdGVkXG4gICAqL1xuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpjbGljaycsIFsnJGV2ZW50J10pXG4gIG9uRG9jdW1lbnRDbGljayhldmVudDogTW91c2VFdmVudCk6IHZvaWQge1xuXG4gICAgaWYgKHRoaXMuYm9keVJlZj8ubmF0aXZlRWxlbWVudCkge1xuXG4gICAgICBjb25zdCBjbGlja2VkSW5zaWRlID0gdGhpcy5ib2R5UmVmLm5hdGl2ZUVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0IGFzIE5vZGUpO1xuXG4gICAgICBpZiAoIWNsaWNrZWRJbnNpZGUpIHtcblxuICAgICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0aW9uIFJhbmdlIEV2ZW50IEhvbGQgTW91c2UgQ2xpY2tcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNldXAnKVxuICBvbkdsb2JhbE1vdXNlVXAoKSB7XG5cbiAgICB0aGlzLmVuZFNlbGVjdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIExpc3RlbiBDb3B5IENsaXBib2FyZCBFdmVudFxuICAgKi9cbiAgb25HcmlkQ29weShldmVudDogQ2xpcGJvYXJkRXZlbnQpIHtcblxuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICBpZiAodGhpcy5zZWxlY3RlZENlbGxzLnNpemUgPiAwKSB7XG5cbiAgICAgIGNvbnN0IHRleHQgPSB0aGlzLmJ1aWxkQ2xpcGJvYXJkVGV4dCgpO1xuXG4gICAgICBldmVudC5jbGlwYm9hcmREYXRhPy5zZXREYXRhKCd0ZXh0L3BsYWluJywgdGV4dCk7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5mb3JFYWNoKGNlbGxJZCA9PiB7XG5cbiAgICAgICAgY29uc3QgY2VsbEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1jZWxsLWlkPVwiJHtjZWxsSWR9XCJdYCk7XG5cbiAgICAgICAgaWYgKGNlbGxFbGVtZW50KSB7XG5cbiAgICAgICAgICBjZWxsRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdvbmUtY2VsbC1jb3BpZWQnKTtcblxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gY2VsbEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnb25lLWNlbGwtY29waWVkJyksIDQwMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIGNvcHlUb0NsaXBib2FyZCh2YWx1ZTogc3RyaW5nKSB7XG5cbiAgICBpZiAobmF2aWdhdG9yLmNsaXBib2FyZD8ud3JpdGVUZXh0KSB7XG5cbiAgICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHZhbHVlKTtcblxuICAgIH0gZWxzZSB7XG5cbiAgICAgIC8vIEZhbGxiYWNrIChTYWZhcmkgLyBvbGRlciBicm93c2VycylcbiAgICAgIGNvbnN0IHRleHRhcmVhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGV4dGFyZWEnKTtcbiAgICAgIHRleHRhcmVhLnZhbHVlID0gdmFsdWU7XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7XG4gICAgICB0ZXh0YXJlYS5zdHlsZS5vcGFjaXR5ID0gJzAnO1xuICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0YXJlYSk7XG4gICAgICB0ZXh0YXJlYS5zZWxlY3QoKTtcbiAgICAgIGRvY3VtZW50LmV4ZWNDb21tYW5kKCdjb3B5Jyk7XG4gICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHRleHRhcmVhKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgQ29weSBDZWxsIFRleHQgdG8gQ2xpcGJvYXJkXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkQ2xpcGJvYXJkVGV4dCgpOiBzdHJpbmcge1xuXG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2VsbHMuc2l6ZSkgcmV0dXJuICcnO1xuXG4gICAgLy8gUGFyc2Ugc2VsZWN0ZWQgY2VsbHNcbiAgICBjb25zdCBzZWxlY3RlZCA9IEFycmF5LmZyb20odGhpcy5zZWxlY3RlZENlbGxzKS5tYXAoa2V5ID0+IHtcblxuICAgICAgY29uc3QgW3Jvd0lkLCBmaWVsZF0gPSBrZXkuc3BsaXQoJy0tJyk7XG4gICAgICByZXR1cm4geyByb3dJZCwgZmllbGQgfTtcbiAgICB9KTtcblxuICAgIC8vIFJlc29sdmUgdmlzdWFsIHJvdyBpbmRleGVzIGZyb20gZGlzcGxheWVkUm93c1xuICAgIGNvbnN0IHJvd0luZGV4ZXMgPSBzZWxlY3RlZFxuICAgICAgLm1hcChzID0+IHRoaXMubm9kZXMuZmluZEluZGV4KHIgPT4gci5yb3dJZCA9PT0gcy5yb3dJZCkpXG4gICAgICAuZmlsdGVyKGkgPT4gaSAhPT0gLTEpO1xuXG4gICAgY29uc3QgY29sSW5kZXhlcyA9IHNlbGVjdGVkXG4gICAgICAubWFwKHMgPT4gdGhpcy5jb2x1bW5EZWZzLmZpbmRJbmRleChjID0+IGMuZmllbGQgPT09IHMuZmllbGQpKVxuICAgICAgLmZpbHRlcihpID0+IGkgIT09IC0xKTtcblxuICAgIGlmICghcm93SW5kZXhlcy5sZW5ndGggfHwgIWNvbEluZGV4ZXMubGVuZ3RoKSByZXR1cm4gJyc7XG5cbiAgICBjb25zdCByb3dTdGFydCA9IE1hdGgubWluKC4uLnJvd0luZGV4ZXMpO1xuICAgIGNvbnN0IHJvd0VuZCAgID0gTWF0aC5tYXgoLi4ucm93SW5kZXhlcyk7XG4gICAgY29uc3QgY29sU3RhcnQgPSBNYXRoLm1pbiguLi5jb2xJbmRleGVzKTtcbiAgICBjb25zdCBjb2xFbmQgICA9IE1hdGgubWF4KC4uLmNvbEluZGV4ZXMpO1xuXG4gICAgY29uc3Qgc2VsZWN0ZWRGaWVsZHMgPSB0aGlzLmNvbHVtbkRlZnNcbiAgICAgIC5zbGljZShjb2xTdGFydCwgY29sRW5kICsgMSlcbiAgICAgIC5tYXAoYyA9PiBjLmZpZWxkKTtcblxuICAgIGNvbnN0IGNsaXBib2FyZExpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgZm9yIChsZXQgciA9IHJvd1N0YXJ0OyByIDw9IHJvd0VuZDsgcisrKSB7XG5cbiAgICAgIGNvbnN0IHJvdyA9IHRoaXMubm9kZXNbcl07XG4gICAgICBjb25zdCBsaW5lID0gc2VsZWN0ZWRGaWVsZHNcbiAgICAgICAgLm1hcChmaWVsZCA9PiB7XG5cbiAgICAgICAgICBjb25zdCBrZXkgPSBgJHtyb3cucm93SWR9LS0ke2ZpZWxkfWA7XG5cbiAgICAgICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDZWxscy5oYXMoa2V5KSkge1xuXG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShyb3cuZGF0YSwgZmllbGQpO1xuXG4gICAgICAgICAgcmV0dXJuIHZhbHVlID8/ICcnO1xuXG4gICAgICAgIH0pLmpvaW4oJ1xcdCcpO1xuXG4gICAgICBjbGlwYm9hcmRMaW5lcy5wdXNoKGxpbmUpO1xuICAgIH1cblxuICAgIHJldHVybiBjbGlwYm9hcmRMaW5lcy5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCaW5kaW5nIEV2ZW50cyBSb3cgQWN0aW9uIHRvIFBhcmVudFxuICAgKi9cbiAgaW52b2tlUm93QWN0aW9uR290b0RldGFpbChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93R290b0RldGFpbC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkFkZE5ldyhldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93QWRkTmV3LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uVmlldyhldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Vmlldy5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxvY2F0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dMb2NhdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkRvY3VtZW50KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dEb2N1bWVudC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkNvcHkoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0NvcHkuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25EZWxldGUoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0RlbGV0ZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkdvdG9MaXN0KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvTGlzdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkVkaXQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0VkaXQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25QcmludChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93UHJpbnQuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25IaXN0b3J5KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dIaXN0b3J5LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uT3B0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dPcHRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25MYW5ndWFnZShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93TGFuZ3VhZ2UuZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogT3BlbiB0aGUgY2VsbCBvcHRpb24gbWVudSwgYW5kIHRlbGwgdGhlIGhvc3QgaXQgd2FzIGFza2VkIGZvci5cbiAgICpcbiAgICogVGhlIG9wZW5pbmcgaXMgdGhlIHBhcnQgdGhhdCB3YXMgbWlzc2luZy4gRXZlcnl0aGluZyBlbHNlIGV4aXN0ZWQg4oCUIHRoZVxuICAgKiB0cmlnZ2VyIGJ1dHRvbiBiZWhpbmQgYGNlbGxSZW5kZXJlclBhcmFtcy5jZWxsT3B0aW9uQnV0dG9uU3RhdHVzYCwgdGhlIG1lbnVcbiAgICogY29tcG9uZW50LCB0aGUgYGNlbGxPcHRpb25NZW51YCBjb2x1bW4gcHJvcGVydHksIHRoZSBzZWxlY3Rpb24gZXZlbnQgd2lyZWRcbiAgICogdGhyb3VnaCB0byB0aGUgZ3JpZCdzIG91dHB1dCDigJQgYnV0IG5vdGhpbmcgZXZlciBzZXQgdGhlIGZsYWcgdGhlIHRlbXBsYXRlXG4gICAqIHJlbmRlcnMgb24sIHNvIHRoZSBidXR0b24gZGlkIG5vdGhpbmcgYXQgYWxsLlxuICAgKlxuICAgKiBEb25lIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIHJvdy1hY3Rpb24gY29tcG9uZW50IGJlY2F1c2UgdGhpcyBpcyB0aGVcbiAgICogY29tcG9uZW50IHdob3NlIHRlbXBsYXRlIHJlbmRlcnMgdGhlIG1lbnUsIGFuZCBzbyB0aGUgb25lIHRoYXQgaGFzIHRvIGJlXG4gICAqIG1hcmtlZCBmb3IgY2hlY2suXG4gICAqL1xuICBpbnZva2VSb3dBY3Rpb25DZWxsT3B0aW9uKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIGNvbnN0IGZpZWxkID0gZXZlbnQuY29sdW1uPy5maWVsZCBhcyBzdHJpbmc7XG5cbiAgICAvLyBOb3RoaW5nIHRvIG9wZW4gd2hlbiB0aGUgY29sdW1uIGRlY2xhcmVkIG5vIG9wdGlvbnM7IHRoZSBldmVudCBzdGlsbFxuICAgIC8vIGdvZXMgdG8gdGhlIGhvc3QsIHdoaWNoIG1heSBiZSBkcml2aW5nIHNvbWV0aGluZyBvZiBpdHMgb3duLlxuICAgIGlmIChmaWVsZCAmJiBldmVudC5ub2RlICYmIGV2ZW50LmNvbHVtbj8uY2VsbE9wdGlvbk1lbnU/Lmxlbmd0aCkge1xuXG4gICAgICBldmVudC5ub2RlLmNlbGxPcHRpb25zW2ZpZWxkXSA9IHRydWU7XG5cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cblxuICAgIHRoaXMub25Sb3dDZWxsT3B0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBtZW51IGNsb3NlZCBpdHNlbGYg4oCUIG9uIHNlbGVjdCwgb24gRXNjYXBlLCBvciBvbiBhIGNsaWNrIG91dHNpZGUuIEl0XG4gICAqIGhhcyBhbHJlYWR5IGNsZWFyZWQgaXRzIG93biBmbGFnOyB0aGlzIGlzIHdoYXQgcmVwYWludHMgd2l0aG91dCBpdC5cbiAgICovXG4gIGNlbGxPcHRpb25NZW51Q2xvc2VkKCk6IHZvaWQge1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd1NlbGVjdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUb2dnbGUgYSBncm91cCAvIG1hc3RlciByb3csIHRoZW4gcmVwb3J0IHRoZSByZXN1bHQuXG4gICAqXG4gICAqIFRoZSBncm91cCByZW5kZXJlciBpcyBwcmVzZW50YXRpb25hbDogaXQgc2F5cyBcInRoZSBleHBhbmRlciB3YXMgY2xpY2tlZFwiXG4gICAqIGFuZCBub3RoaW5nIG1vcmUuIFBlcmZvcm1pbmcgdGhlIHN0YXRlIGNoYW5nZSBiZWxvbmdzIGhlcmUsIHdoZXJlIHRoZSBBUElcbiAgICogaXMgYXZhaWxhYmxlLiBQcmV2aW91c2x5IHRoaXMgbWV0aG9kIG9ubHkgcmUtZW1pdHRlZCwgc28gdGhlIGV4cGFuZGVyXG4gICAqIHJlbmRlcmVkLCBhbmltYXRlZCBvbiBob3ZlciBhbmQgZGlkIG5vdGhpbmcgYXQgYWxsIOKAlCBldmVyeSBjb25zdW1lciBoYWQgdG9cbiAgICogZGlzY292ZXIgZm9yIGl0c2VsZiB0aGF0IGBleHBhbnNpb25DaGFuZ2VkYCB3YXMgYSByZXF1ZXN0IHJhdGhlciB0aGFuIHRoZVxuICAgKiBub3RpZmljYXRpb24gaXRzIHBhc3QtdGVuc2UgbmFtZSBwcm9taXNlcy5cbiAgICpcbiAgICogVGhlIGV2ZW50IGlzIHJlLWVtaXR0ZWQgKmFmdGVyKiB0aGUgdG9nZ2xlLCBzbyBgZXZlbnQubm9kZS5leHBhbmRlZGAgaXMgdGhlXG4gICAqIG5ldyBzdGF0ZSwgd2hpY2ggaXMgd2hhdCBhIHBhc3QtdGVuc2UgZXZlbnQgc2hvdWxkIGNhcnJ5LlxuICAgKi9cbiAgaW52b2tlRXhwYW5zaW9uQ2hhbmdlZENsaWNrKGV2ZW50OiBFeHBhbnNpb25DaGFuZ2VkRXZlbnQpOiB2b2lkIHtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChldmVudC5ub2RlLnJvd0lkKSA/PyBldmVudC5ub2RlO1xuXG4gICAgdGhpcy5hcGkuc2V0RXhwYW5kZWRCeUlkKG5vZGUucm93SWQsICFub2RlLmV4cGFuZGVkKTtcblxuICAgIHRoaXMuZXhwYW5zaW9uQ2hhbmdlZC5lbWl0KHsgLi4uZXZlbnQsIG5vZGUsIGFwaTogdGhpcy5hcGkgfSk7XG4gIH1cblxuICBjZWxsT3B0aW9uTWVudVNlbGVjdGVkKGV2ZW50OiBDZWxsT3B0aW9uTWVudVNlbGVjdGVkRXZlbnQpIHtcblxuICAgIHRoaXMuY2VsbE9wdGlvblNlbGVjdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTcGVjaWFsIEV2ZW50c1xuICAgKi9cbiAgcHJpdmF0ZSBpbnZva2VTaGlmdERvdWJsZUNsaWNrKG5vZGU6T25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWYpOiB2b2lkIHtcblxuICAgIGxldCBldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50ID0geyBub2RlLCBjb2x1bW4sIGRhdGE6IG5vZGUuZGF0YSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGdyaWRUeXBlOiBudWxsIH07XG5cbiAgICBpZiAodGhpcy5tYXN0ZXJEZXRhaWwpIHtcblxuICAgICAgZXZlbnQgPSB7IC4uLmV2ZW50LCBncmlkVHlwZTogdGhpcy5ncmlkVHlwZSwgbWFzdGVyTm9kZTogdGhpcy5tYXN0ZXJOb2RlIH07XG4gICAgfVxuXG4gICAgdGhpcy5vblNoaWZ0RG91YmxlQ2xpY2suZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogQ2VsbCBFZGl0IEZlYXR1cmVcbiAgICovXG4gIHN0YXJ0RWRpdChldmVudDogTW91c2VFdmVudCwgbm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pIHtcblxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudDtcblxuICAgIGlmICh0YXJnZXQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnaScpIHtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuXG4gICAgICB0aGlzLmludm9rZVNoaWZ0RG91YmxlQ2xpY2sobm9kZSwgY29sdW1uKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2VsbEVkaXRhYmxlUGlwZS50cmFuc2Zvcm0obm9kZS5jZWxsU3RhdGVzLCBjb2x1bW4sIG5vZGUsIHRoaXMuY2VsbFNlcnZpY2UuZWRpdGFibGVGbiwgdGhpcy5jZWxsU2VydmljZS51cGRhdGFibGVGbiwgdGhpcy5hbGxvd2VkRWRpdCkpIHtcblxuICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLmNsZWFyKCk7XG5cbiAgICAgIGNvbnN0IGNlbGxLZXkgPSBnZXRDZWxsS2V5KG5vZGUucm93SWQsIGNvbHVtbi5maWVsZCk7XG5cbiAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5hZGQoY2VsbEtleSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcm93Tm9kZTogT25lUm93Tm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKHJvd05vZGUpIHtcblxuICAgICAgaWYgKHRoaXMuZWRpdFR5cGUgPT09ICdmdWxsUm93Jykge1xuXG4gICAgICAgIC8vIFRoZSB3aG9sZSByb3cgZWRpdHMgdG9nZXRoZXIsIHNvIGV2ZXJ5IGNlbGwgdGhhdCB3b3VsZCBhY2NlcHQgaXRzXG4gICAgICAgIC8vIG93biBkb3VibGUtY2xpY2sgb3BlbnMgbm93LiBUaGUgY2xpY2tlZCBvbmUgc3RpbGwgdGFrZXMgZm9jdXMgYmVsb3cuXG4gICAgICAgIGZvciAoY29uc3QgY29sIG9mIHRoaXMuY29sdW1uRGVmcykge1xuXG4gICAgICAgICAgaWYgKCFjb2wuZmllbGQpIGNvbnRpbnVlO1xuXG4gICAgICAgICAgaWYgKHRoaXMuY2VsbEVkaXRhYmxlUGlwZS50cmFuc2Zvcm0ocm93Tm9kZS5jZWxsU3RhdGVzLCBjb2wsIHJvd05vZGUsIHRoaXMuY2VsbFNlcnZpY2UuZWRpdGFibGVGbiwgdGhpcy5jZWxsU2VydmljZS51cGRhdGFibGVGbiwgdGhpcy5hbGxvd2VkRWRpdCkpIHtcblxuICAgICAgICAgICAgcm93Tm9kZS5lZGl0aW5nW2NvbC5maWVsZF0gPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdID0gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgY29uc3QgaW5wdXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MU2VsZWN0RWxlbWVudD4oYFtkYXRhLWNlbGwtaWQ9XCIkeyBnZXRDZWxsS2V5KG5vZGUucm93SWQsIGNvbHVtbi5maWVsZCkgfVwiXSBpbnB1dCwgW2RhdGEtY2VsbC1pZD1cIiR7IGdldENlbGxLZXkobm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkKSB9XCJdIHNlbGVjdGApO1xuXG4gICAgICAgIGlmIChpbnB1dCkge1xuXG4gICAgICAgICAgaW5wdXQuZm9jdXMoKTtcblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW5wdXQudmFsdWU7XG5cbiAgICAgICAgICAvLyBBIHNlbGVjdCByZXBvcnRzIHR5cGUgJ3NlbGVjdC1vbmUnLCBzbyBvbmx5IGEgdGV4dCBpbnB1dCBnZXRzIGl0c1xuICAgICAgICAgIC8vIGNhcmV0IHBsYWNlZC5cbiAgICAgICAgICBpZiAodmFsdWUgJiYgW1widGV4dFwiXS5pbmNsdWRlcyhpbnB1dC50eXBlKSAmJiAnc2V0U2VsZWN0aW9uUmFuZ2UnIGluIGlucHV0KSB7XG5cbiAgICAgICAgICAgIGlucHV0LnNldFNlbGVjdGlvblJhbmdlKHZhbHVlLmxlbmd0aCwgdmFsdWUubGVuZ3RoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LCAxMCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgQ2VsbCBFZGl0IE1vZGVcbiAgICovXG4gIHN0b3BFZGl0KG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+LCBldmVudDogYW55KSB7XG5cbiAgICBpZiAodGhpcy5lZGl0VHlwZSA9PT0gJ2Z1bGxSb3cnKSB7XG5cbiAgICAgIHRoaXMuc3RvcFJvd0VkaXRGcm9tRXZlbnQobm9kZSwgZXZlbnQpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJvd05vZGU6IE9uZVJvd05vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIC8vIFRoZSBlZGl0aW5nIGd1YXJkIG1ha2VzIGEgc2Vjb25kIGNvbW1pdCBmb3Igb25lIGVkaXQgYSBuby1vcDogYSBzZWxlY3RcbiAgICAvLyBjb21taXRzIG9uIChjaGFuZ2UpLCB3aGljaCBjbG9zZXMgdGhlIGVkaXRvciwgYW5kIHRoZSAoYmx1cikgdGhhdCBjYW5cbiAgICAvLyBmb2xsb3cgbXVzdCBub3QgY29tbWl0IGFnYWluLlxuICAgIGlmIChyb3dOb2RlICYmIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdKSB7XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgY29uc3QgdmFsdWUgPSBldmVudC50YXJnZXQudmFsdWUgPz8gJyc7XG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHJvd05vZGUuZGF0YVtjb2x1bW4uZmllbGRdO1xuXG4gICAgICB0aGlzLnNldENlbGxWYWx1ZUJ5Um93SWQobm9kZS5yb3dJZCwgY29sdW1uLCB2YWx1ZSk7XG5cbiAgICAgIHRoaXMuZmluaXNoRWRpdChyb3dOb2RlLCBjb2x1bW4sIG9sZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBhIGBzZWxlY3RgIGVkaXRvcidzIGNob2ljZS5cbiAgICpcbiAgICogU2VwYXJhdGUgZnJvbSBgc3RvcEVkaXRgIGJlY2F1c2UgdGhlIHZhbHVlIGlzIG5vdCB0aGUgZWxlbWVudCdzIHN0cmluZzpcbiAgICogdGhlIGNob3NlbiBpbmRleCBtYXBzIGJhY2sgaW50byBgc2VsZWN0T3B0aW9uc2AsIHNvIHRoZSBjb21taXR0ZWQgdmFsdWVcbiAgICoga2VlcHMgd2hhdGV2ZXIgdHlwZSB0aGUgb3B0aW9uIGRlY2xhcmVkLlxuICAgKi9cbiAgc3RvcEVkaXRTZWxlY3Qobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4sIGV2ZW50OiBhbnkpIHtcblxuICAgIGlmICh0aGlzLmVkaXRUeXBlID09PSAnZnVsbFJvdycpIHtcblxuICAgICAgLy8gKGNoYW5nZSkgaXMgbm90IGEgY29tbWl0IGluIGZ1bGwtcm93IG1vZGUg4oCUIHRoZSBjaG9pY2Ugc2l0cyBpbiB0aGVcbiAgICAgIC8vIHNlbGVjdCB1bnRpbCB0aGUgcm93IGNvbW1pdHMgYW5kIHJlYWRzIGV2ZXJ5IGVkaXRvciBhdCBvbmNlLiBPbmx5IGFcbiAgICAgIC8vIGJsdXIgdGhhdCBhY3R1YWxseSBsZWF2ZXMgdGhlIHJvdyBjbG9zZXMgaXQuXG4gICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2JsdXInKSB0aGlzLnN0b3BSb3dFZGl0RnJvbUV2ZW50KG5vZGUsIGV2ZW50KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByb3dOb2RlOiBPbmVSb3dOb2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSAmJiByb3dOb2RlLmVkaXRpbmdbY29sdW1uLmZpZWxkXSkge1xuXG4gICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5zZWxlY3RPcHRpb25zID8/IFtdO1xuICAgICAgY29uc3Qgb3B0aW9uID0gb3B0aW9uc1soZXZlbnQudGFyZ2V0IGFzIEhUTUxTZWxlY3RFbGVtZW50KS5zZWxlY3RlZEluZGV4XTtcblxuICAgICAgaWYgKCFvcHRpb24pIHJldHVybjtcblxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSByb3dOb2RlLmRhdGFbY29sdW1uLmZpZWxkXTtcblxuICAgICAgcm93Tm9kZS5kYXRhW2NvbHVtbi5maWVsZF0gPSBvcHRpb24udmFsdWU7XG5cbiAgICAgIHRoaXMuZmluaXNoRWRpdChyb3dOb2RlLCBjb2x1bW4sIG9sZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQ2xvc2UgdGhlIGVkaXRvciBhbmQgYW5ub3VuY2UgdGhlIGNvbW1pdC4gU2hhcmVkIGJ5IGJvdGggZWRpdG9yIGtpbmRzLiAqL1xuICBwcml2YXRlIGZpbmlzaEVkaXQocm93Tm9kZTogT25lUm93Tm9kZSwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4sIG9sZFZhbHVlOiBhbnkpIHtcblxuICAgIGNvbnN0IG5ld1ZhbHVlID0gcm93Tm9kZS5kYXRhW2NvbHVtbi5maWVsZF07XG5cbiAgICByb3dOb2RlLmNlbGxTdGF0ZXMgPSB0aGlzLmNlbGxTZXJ2aWNlLmdlbmVyYXRlQ2VsbFN0YXRlcyhyb3dOb2RlKTtcbiAgICByb3dOb2RlLmVkaXRpbmdbY29sdW1uLmZpZWxkXSA9IGZhbHNlO1xuXG4gICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY2VsbFN0YXRlQ2hhbmdlZCcsIHtcbiAgICAgIGRhdGE6IHJvd05vZGUuZGF0YSxcbiAgICAgIG5vZGU6IHJvd05vZGUsXG4gICAgICBjb2x1bW46IGNvbHVtblxuICAgIH0pO1xuXG4gICAgLy8gQ29tcGFyZWQgYWZ0ZXIgbm9ybWFsaXNhdGlvbiAoJycgLT4gbnVsbCwgbnVtYmVyIGNvZXJjaW9uKSwgc28gYSBibHVyXG4gICAgLy8gdGhhdCBsZWF2ZXMgdGhlIHZhbHVlIGFzIGl0IHdhcyBkb2VzIG5vdCBhbm5vdW5jZSBhbiBlZGl0LlxuICAgIGlmIChuZXdWYWx1ZSAhPT0gb2xkVmFsdWUpIHtcblxuICAgICAgdGhpcy5ldmVudFNlcnZpY2UuZGlzcGF0Y2hFdmVudCgnY2VsbFZhbHVlQ2hhbmdlZCcsIHtcbiAgICAgICAgbm9kZTogcm93Tm9kZSxcbiAgICAgICAgZGF0YTogcm93Tm9kZS5kYXRhLFxuICAgICAgICBjb2x1bW46IGNvbHVtbixcbiAgICAgICAgZmllbGQ6IGNvbHVtbi5maWVsZCxcbiAgICAgICAgb2xkVmFsdWUsXG4gICAgICAgIG5ld1ZhbHVlLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbmNlbCBDZWxsIEVkaXQgTW9kZVxuICAgKi9cbiAgY2FuY2VsRWRpdChub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgbGV0IHJvd05vZGU6IE9uZVJvd05vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlKSB7XG5cbiAgICAgIGlmICh0aGlzLmVkaXRUeXBlID09PSAnZnVsbFJvdycpIHtcblxuICAgICAgICAvLyBFc2NhcGUgYWJhbmRvbnMgdGhlIHdob2xlIHJvdzogZXZlcnkgZWRpdG9yIGNsb3Nlcywgbm90aGluZyBjb21taXRzLlxuICAgICAgICBPYmplY3Qua2V5cyhyb3dOb2RlLmVkaXRpbmcpLmZvckVhY2goZmllbGQgPT4gcm93Tm9kZS5lZGl0aW5nW2ZpZWxkXSA9IGZhbHNlKTtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGwtcm93IGNvbW1pdCwgcm91dGVkIGZyb20gYW55IG9uZSBlZGl0b3IncyBFbnRlciBvciBibHVyLlxuICAgKlxuICAgKiBBIGJsdXIgdGhhdCBsYW5kcyBvbiBhbm90aGVyIGVkaXRvciBpbiB0aGUgc2FtZSByb3cgaXMgdGhlIHVzZXIgdGFiYmluZ1xuICAgKiBiZXR3ZWVuIGZpZWxkcywgbm90IGxlYXZpbmcgdGhlIHJvdyDigJQgdGhlIGVkaXRvcnMgc3RheSBvcGVuIGFuZCB0aGVpclxuICAgKiB0eXBlZCB2YWx1ZXMgc3RheSBpbiB0aGUgRE9NIHVudGlsIHRoZSByb3cgY29tbWl0cy5cbiAgICovXG4gIHByaXZhdGUgc3RvcFJvd0VkaXRGcm9tRXZlbnQobm9kZTogT25lUm93Tm9kZTxUPiwgZXZlbnQ6IGFueSkge1xuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdibHVyJykge1xuXG4gICAgICBjb25zdCBuZXh0ID0gKGV2ZW50IGFzIEZvY3VzRXZlbnQpLnJlbGF0ZWRUYXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgICBpZiAobmV4dD8ubWF0Y2hlcz8uKCdpbnB1dC5vbmUtY2VsbC1pbnB1dCwgc2VsZWN0Lm9uZS1jZWxsLWlucHV0JylcbiAgICAgICAgJiYgbmV4dC5jbG9zZXN0Py4oYFtkYXRhLWNlbGwtaWRePVwiJHtub2RlLnJvd0lkfS0tXCJdYCkpIHtcblxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQ/LigpO1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbj8uKCk7XG5cbiAgICB0aGlzLnN0b3BSb3dFZGl0KG5vZGUpO1xuICB9XG5cbiAgLyoqIENvbW1pdCBldmVyeSBvcGVuIGVkaXRvciBvZiBvbmUgcm93LCByZWFkaW5nIGVhY2ggZnJvbSB0aGUgRE9NLiAqL1xuICBwcml2YXRlIHN0b3BSb3dFZGl0KG5vZGU6IE9uZVJvd05vZGU8VD4pIHtcblxuICAgIGNvbnN0IHJvd05vZGU6IE9uZVJvd05vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmICghcm93Tm9kZSkgcmV0dXJuO1xuXG4gICAgZm9yIChjb25zdCBjb2x1bW4gb2YgdGhpcy5jb2x1bW5EZWZzKSB7XG5cbiAgICAgIGNvbnN0IGZpZWxkID0gY29sdW1uLmZpZWxkIGFzIHN0cmluZztcblxuICAgICAgaWYgKCFmaWVsZCB8fCAhcm93Tm9kZS5lZGl0aW5nW2ZpZWxkXSkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGtleSA9IGdldENlbGxLZXkocm93Tm9kZS5yb3dJZCwgZmllbGQpO1xuICAgICAgY29uc3QgZWRpdG9yID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcjxIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFNlbGVjdEVsZW1lbnQ+KFxuICAgICAgICBgW2RhdGEtY2VsbC1pZD1cIiR7a2V5fVwiXSBpbnB1dCwgW2RhdGEtY2VsbC1pZD1cIiR7a2V5fVwiXSBzZWxlY3RgKTtcblxuICAgICAgY29uc3Qgb2xkVmFsdWUgPSByb3dOb2RlLmRhdGFbZmllbGRdO1xuXG4gICAgICBpZiAoZWRpdG9yPy50YWdOYW1lID09PSAnU0VMRUNUJykge1xuXG4gICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb2x1bW4uY2VsbFJlbmRlcmVyUGFyYW1zPy5zZWxlY3RPcHRpb25zID8/IFtdO1xuICAgICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zWyhlZGl0b3IgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnNlbGVjdGVkSW5kZXhdO1xuXG4gICAgICAgIGlmIChvcHRpb24pIHJvd05vZGUuZGF0YVtmaWVsZF0gPSBvcHRpb24udmFsdWU7XG5cbiAgICAgIH0gZWxzZSBpZiAoZWRpdG9yKSB7XG5cbiAgICAgICAgY29uc3QgcmF3ID0gZWRpdG9yLnZhbHVlID8/ICcnO1xuXG4gICAgICAgIHJvd05vZGUuZGF0YVtmaWVsZF0gPSByYXcgPT09ICcnXG4gICAgICAgICAgPyBudWxsXG4gICAgICAgICAgOiBjb2x1bW4uY2VsbFJlbmRlcmVyUGFyYW1zPy5pbnB1dFR5cGUgPT09ICdudW1iZXInID8gTnVtYmVyKHJhdykgOiByYXc7XG4gICAgICB9XG5cbiAgICAgIC8vIGZpbmlzaEVkaXQgY2xvc2VzIHRoZSBlZGl0b3IsIHJlZnJlc2hlcyB0aGUgY2VsbCBzdGF0ZSBhbmQgcmFpc2VzXG4gICAgICAvLyBjZWxsVmFsdWVDaGFuZ2VkIHdoZW4gdGhlIHZhbHVlIG1vdmVkIOKAlCBvbmUgZXZlbnQgcGVyIGNoYW5nZWQgY2VsbCxcbiAgICAgIC8vIHRoZSBzYW1lIGNvbnRyYWN0IGFzIHNpbmdsZS1jZWxsIGVkaXRpbmcuXG4gICAgICB0aGlzLmZpbmlzaEVkaXQocm93Tm9kZSwgY29sdW1uLCBvbGRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldCBDZWxsIFZhbHVlXG4gICAqL1xuICBzZXRDZWxsVmFsdWVCeVJvd0lkKHJvd0lkOiBzdHJpbmcsIGNvbHVtbjogT25lQ29sdW1uRGVmLCB2YWx1ZTogYW55KSB7XG5cbiAgICBjb25zdCBub2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQocm93SWQpO1xuXG4gICAgaWYgKG5vZGUgJiYgY29sdW1uLmZpZWxkKSB7XG5cbiAgICAgIGlmIChjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8uaW5wdXRUeXBlICE9PSAnbnVtYmVyJykge1xuXG4gICAgICAgIG5vZGUuZGF0YVtjb2x1bW4uZmllbGRdID0gdmFsdWUgPT09ICcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIG5vZGUuZGF0YVtjb2x1bW4uZmllbGRdID0gdmFsdWUgPT09ICcnID8gbnVsbCA6IE51bWJlcih2YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZpcnR1YWwgU2Nyb2xsIFByb3BlcnRpZXNcbiAgICpcbiAgICogVGhlIGJ1ZmZlciBzY2FsZXMgd2l0aCB0aGUgcm93IGNvdW50IHNvIHNtYWxsIGdyaWRzIHJlbmRlciBpbiBvbmUgcGFzcywgYnV0XG4gICAqIGl0IGlzIGNhcHBlZDogYGl0ZW1TaXplICogaXRlbXMgKiAxLjVgIGlzIDEuNXggdGhlICp0b3RhbCogY29udGVudCBoZWlnaHQsXG4gICAqIGFuZCBDZGtGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsIGV4cGFuZHMgaXRzIHJlbmRlcmVkIHJhbmdlIHVudGlsIHRoZSBidWZmZXIgaXNcbiAgICogc2F0aXNmaWVkLiBVbmNhcHBlZCwgdGhhdCBtYWtlcyB0aGUgdmlld3BvcnQgbWF0ZXJpYWxpc2UgZXZlcnkgcm93IGFuZFxuICAgKiB2aXJ0dWFsIHNjcm9sbGluZyBzdG9wcyBkb2luZyBhbnl0aGluZyBhdCBhbGwgKDEwMGsgcm93cyBsb2NrZWQgdGhlIHRhYikuXG4gICAqIE1BWF9CVUZGRVJfUFgga2VlcHMgcm91Z2hseSB0d2VudHkgcm93cyBvZiBvdmVyc2NhbiBlaXRoZXIgc2lkZSBpbnN0ZWFkLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfQlVGRkVSX1BYOiBudW1iZXIgPSA2MDA7XG5cbiAgc2V0VmlydHVhbFNjcm9sbChpdGVtczogbnVtYmVyID0gMCk6IHZvaWQge1xuXG4gICAgdGhpcy5taW5CdWZmZXJQeCA9IE1hdGgubWluKHRoaXMuaXRlbVNpemUgKiBpdGVtcyAqIDEuNSwgdGhpcy5NQVhfQlVGRkVSX1BYKTtcblxuICAgIHRoaXMubWF4QnVmZmVyUHggPSB0aGlzLm1pbkJ1ZmZlclB4ICogMjtcbiAgfVxuXG4gIC8qKlxuICAgKiBVbnN1YnNjcmliZSBBbGwgU3Vic2NyaXB0aW9uc1xuICAgKi9cbiAgLyoqXG4gICAqIEhhbmQgdGhlIGRyYWcgc2VydmljZSB3aGF0IGl0IG5lZWRzIHRvIHJ1biBhIGdlc3R1cmUuXG4gICAqXG4gICAqIERlZmVycmVkIHRvIGhlcmUgYmVjYXVzZSB0aGUgdmlld3BvcnQgZWxlbWVudCBkb2VzIG5vdCBleGlzdCB1bnRpbCB0aGUgdmlld1xuICAgKiBpcyB1cCwgYW5kIGBub2Rlc2AgaXMgcGFzc2VkIGFzIGEgZ2V0dGVyIHJhdGhlciB0aGFuIGEgdmFsdWUg4oCUIGEgZHJhZ1xuICAgKiBtdXRhdGVzIHRoZSBvcmRlciB1bmRlcm5lYXRoIGl0LCBzbyBhIHNuYXBzaG90IHRha2VuIGF0IGF0dGFjaCB0aW1lIHdvdWxkXG4gICAqIGdvIHN0YWxlIG9uIHRoZSBmaXJzdCBtb3ZlLlxuICAgKi9cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuXG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMudmlld3BvcnQ/LmVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoIWVsZW1lbnQpIHJldHVybjtcblxuICAgIHRoaXMucm93RHJhZ1NlcnZpY2UuYXR0YWNoKHtcbiAgICAgIHZpZXdwb3J0OiBlbGVtZW50LFxuICAgICAgaXRlbVNpemU6IHRoaXMuaXRlbVNpemUsXG4gICAgICBub2RlczogKCkgPT4gdGhpcy5ub2RlcyxcbiAgICAgIG1vdmU6IChmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyKSA9PiB7XG5cbiAgICAgICAgY29uc3QgbW92ZWQgPSB0aGlzLmFwaS5tb3ZlUm93KGZyb21JbmRleCwgdG9JbmRleCk7XG5cbiAgICAgICAgaWYgKG1vdmVkKSB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcblxuICAgICAgICByZXR1cm4gbW92ZWQ7XG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgdGhpcy5yZWZyZXNoUm93RHJhZ1N1cHByZXNzZWQoKTtcblxuICAgIC8vIFRoZSBDREsgaW5zZXJ0cyBpdHMgb3duIGNvbnRlbnQgd3JhcHBlciBiZXR3ZWVuIHRoZSB2aWV3cG9ydCBhbmQgdGhlXG4gICAgLy8gcm93cy4gSXQgaGFzIG5vIHRlbXBsYXRlIG9mIG91cnMgdG8gYW5ub3RhdGUsIGFuZCBsZWZ0IGdlbmVyaWMgaXQgYnJlYWtzXG4gICAgLy8gdGhlIGBncmlkID4gcm93YCBvd25lcnNoaXAgdGhlIHJvbGVzIGRlcGVuZCBvbi5cbiAgICBjb25zdCB3cmFwcGVyID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yKCcuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcicpO1xuXG4gICAgd3JhcHBlcj8uc2V0QXR0cmlidXRlKCdyb2xlJywgJ3ByZXNlbnRhdGlvbicpO1xuXG4gICAgLy8gRmxleCBjb2x1bW5zIHNpemUgYWdhaW5zdCB0aGlzIHZpZXdwb3J0LCBub3cgYW5kIHdoZW5ldmVyIGl0IHJlc2l6ZXMuXG4gICAgLy8gYXBwbHlGbGV4V2lkdGhzIGlzIGEgbm8tb3Agd2l0aG91dCBmbGV4IGNvbHVtbnMgYW5kIGRpc3BhdGNoZXMgb25seSBvbiBhXG4gICAgLy8gcmVhbCBjaGFuZ2UsIHNvIGdyaWRzIHRoYXQgbmV2ZXIgdXNlIGZsZXggcGF5IG5vdGhpbmcgaGVyZS5cbiAgICB0aGlzLmFwcGx5RmxleFdpZHRocygpO1xuXG4gICAgaWYgKHR5cGVvZiBSZXNpemVPYnNlcnZlciAhPT0gJ3VuZGVmaW5lZCcpIHtcblxuICAgICAgdGhpcy5mbGV4UmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdGhpcy5hcHBseUZsZXhXaWR0aHMoKSk7XG4gICAgICB0aGlzLmZsZXhSZXNpemVPYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZmxleFJlc2l6ZU9ic2VydmVyPzogUmVzaXplT2JzZXJ2ZXI7XG5cbiAgcHJpdmF0ZSBhcHBseUZsZXhXaWR0aHMoKTogdm9pZCB7XG5cbiAgICBjb25zdCB3aWR0aCA9IHRoaXMudmlld3BvcnQ/LmVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWVudFdpZHRoID8/IDA7XG5cbiAgICBpZiAod2lkdGggPiAwKSB0aGlzLmFwaS5hcHBseUZsZXhXaWR0aHMod2lkdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBwYXJhbXMgZXZlcnkgcGVyLWNlbGwgY2FsbGJhY2sgcmVjZWl2ZXMuXG4gICAqXG4gICAqIEJ1aWx0IGhlcmUgcmF0aGVyIHRoYW4gaW5saW5lIGluIHRoZSB0ZW1wbGF0ZSBzbyB0aGUgd2hvbGUgZG9jdW1lbnRlZFxuICAgKiBzaGFwZSBpcyBwYXNzZWQg4oCUIGB2YWx1ZWAsIGBmaWVsZGAsIGByb3dJbmRleGAsIGBhcGlgIGFuZCBgY29udGV4dGAgd2VyZVxuICAgKiBhbGwgZGVjbGFyZWQgb24gYE9uZUNlbGxSZW5kZXJlclBhcmFtc2AgYW5kIG5vbmUgb2YgdGhlbSB3ZXJlIGJlaW5nIHNlbnQsXG4gICAqIHNvIGEgYGNlbGxDbGFzc2AgcmVhZGluZyBgcGFyYW1zLnZhbHVlYCBzaWxlbnRseSBnb3QgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwcm90ZWN0ZWQgY2VsbFBhcmFtcyhub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPik6IE9uZUNlbGxQcmVzZW50YXRpb25QYXJhbXM8VD4ge1xuXG4gICAgcmV0dXJuIHRoaXMuY2VsbFNlcnZpY2UuY2VsbFBhcmFtcyhjb2x1bW4sIG5vZGUpIGFzIE9uZUNlbGxQcmVzZW50YXRpb25QYXJhbXM8VD47XG4gIH1cblxuICAvKipcbiAgICogUGFyYW1zIGZvciBhIGNvbXBvbmVudCBjZWxsIHJlbmRlcmVyLlxuICAgKlxuICAgKiBUaGUgY2VsbCBwYXJhbXMsIHBsdXMgd2hhdGV2ZXIgdGhlIGNvbHVtbiBkZWNsYXJlZCBpblxuICAgKiBgY2VsbFJlbmRlcmVyUGFyYW1zYCDigJQgYSBmaWVsZCB0aGF0IGV4aXN0cyBwcmVjaXNlbHkgc28gYSByZW5kZXJlciBjYW4gYmVcbiAgICogY29uZmlndXJlZCBwZXIgY29sdW1uLCBhbmQgdGhhdCBub3RoaW5nIGhhZCBldmVyIGZvcndhcmRlZCB0byBpdC4gQ29sdW1uXG4gICAqIGNvbmZpZyBnb2VzIGZpcnN0IHNvIHRoZSBncmlkJ3Mgb3duIGZpZWxkcyB3aW4gYSBuYW1lIGNvbGxpc2lvbi5cbiAgICovXG4gIHByb3RlY3RlZCByZW5kZXJlclBhcmFtcyhub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPik6IE9uZUNlbGxSZW5kZXJlclBhcmFtczxUPiB7XG5cbiAgICByZXR1cm4geyAuLi4oY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXMgPz8ge30pLCAuLi50aGlzLmNlbGxQYXJhbXMobm9kZSwgY29sdW1uKSB9O1xuICB9XG5cbiAgLyoqXG4gICAqIGBhcmlhLXJvd2luZGV4YCBpcyAxLWJhc2VkIG92ZXIgdGhlIHdob2xlIGdyaWQsIG5vdCBvdmVyIHdoYXQgaXMgcmVuZGVyZWQuXG4gICAqXG4gICAqIFRoYXQgaXMgdGhlIHBvaW50IG9mIGl0OiB0aGUgYm9keSB2aXJ0dWFsaXNlcywgc28gdGhlIERPTSBob2xkcyBhIHNsaWRpbmdcbiAgICogd2luZG93IG9mIHJvd3MgYW5kIHRoZSBpbmRleCBpcyBob3cgYSBzY3JlZW4gcmVhZGVyIGtub3dzIHdoZXJlIHRoZSB3aW5kb3dcbiAgICogc2l0cy4gUm93IDEgaXMgdGhlIGhlYWRlciwgdGhlbiBhbnkgcGlubmVkLXRvcCByb3dzLCB0aGVuIHRoZSBkYXRhLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRhdGFSb3dBcmlhSW5kZXgobm9kZTogT25lUm93Tm9kZTxUPik6IG51bWJlciB7XG5cbiAgICByZXR1cm4gMiArIHRoaXMucGlubmVkVG9wTm9kZXMubGVuZ3RoICsgbm9kZS5yb3dJbmRleDtcbiAgfVxuXG4gIC8qKiBQaW5uZWQgcm93cyBicmFja2V0IHRoZSBkYXRhOiB0b3Agb25lcyBmb2xsb3cgdGhlIGhlYWRlciwgYm90dG9tIG9uZXMgZW5kIHRoZSBncmlkLiAqL1xuICBwcm90ZWN0ZWQgcGlubmVkUm93QXJpYUluZGV4KG5vZGU6IE9uZVJvd05vZGU8VD4sIHNpZGU6ICd0b3AnIHwgJ2JvdHRvbScpOiBudW1iZXIge1xuXG4gICAgY29uc3QgaW5kZXggPSAoc2lkZSA9PT0gJ3RvcCcgPyB0aGlzLnBpbm5lZFRvcE5vZGVzIDogdGhpcy5waW5uZWRCb3R0b21Ob2RlcykuaW5kZXhPZihub2RlKTtcblxuICAgIHJldHVybiBzaWRlID09PSAndG9wJ1xuICAgICAgPyAyICsgaW5kZXhcbiAgICAgIDogMiArIHRoaXMucGlubmVkVG9wTm9kZXMubGVuZ3RoICsgdGhpcy5ub2Rlcy5sZW5ndGggKyBpbmRleDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHJvd3MgY2FuIGJlIHNlbGVjdGVkIGF0IGFsbC5cbiAgICpcbiAgICogYGFyaWEtc2VsZWN0ZWQ9XCJmYWxzZVwiYCBvbiBldmVyeSByb3cgb2YgYSBncmlkIG5vYm9keSBjYW4gc2VsZWN0IGFubm91bmNlc1xuICAgKiBhIHNlbGVjdGlvbiBhZmZvcmRhbmNlIHRoYXQgZG9lcyBub3QgZXhpc3QsIHNvIHRoZSBhdHRyaWJ1dGUgaXMgb21pdHRlZFxuICAgKiByYXRoZXIgdGhhbiBzZXQgZmFsc2UuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IHJvd1NlbGVjdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7XG5cbiAgICByZXR1cm4gISF0aGlzLmFwaT8ucm93U2VsZWN0aW9uO1xuICB9XG5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gIC8vIENlbGwgbmF2aWdhdGlvblxuICAvL1xuICAvLyBUaGUgV0FJLUFSSUEgZ3JpZCBwYXR0ZXJuOiB0aGUgd2hvbGUgZ3JpZCBpcyBvbmUgdGFiIHN0b3AsIGFuZCB0aGUgYXJyb3dzXG4gIC8vIG1vdmUgYSBmb2N1c2VkIGNlbGwgd2l0aGluIGl0LiBCZWZvcmUgdGhpcyB0aGUgb25seSB0YWIgc3RvcCB3YXMgdGhlIHNjcm9sbFxuICAvLyB2aWV3cG9ydCwgc28gYSBrZXlib2FyZCB1c2VyIGNvdWxkIHNjcm9sbCB0aGUgcm93cyBhbmQgcmVhY2ggbm90aGluZyBpblxuICAvLyB0aGVtIOKAlCBhbmQgYSBzY3JlZW4gcmVhZGVyIGhhZCBubyBjdXJzb3IgdG8gcmVhZCBhIGNlbGwgZnJvbS5cbiAgLy9cbiAgLy8gRm9jdXMgaXMgcmVhbCBET00gZm9jdXMgb24gYSByb3ZpbmcgdGFiaW5kZXggcmF0aGVyIHRoYW5cbiAgLy8gYGFyaWEtYWN0aXZlZGVzY2VuZGFudGAsIGJlY2F1c2UgdGhlIHJvd3MgYXJlIHZpcnR1YWxpc2VkOiB0aGUgZWxlbWVudCBhXG4gIC8vIGRlc2NlbmRhbnQgaWQgcG9pbnRlZCBhdCB3b3VsZCBrZWVwIGJlaW5nIGRlc3Ryb3llZCB1bmRlcm5lYXRoIGl0LlxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAvKiogVGhlIGNlbGwgaG9sZGluZyB0aGUgZ3JpZCdzIHRhYiBzdG9wLiBOdWxsIHVudGlsIHNvbWV0aGluZyBpcyBmb2N1c2VkLiAqL1xuICBwcm90ZWN0ZWQgYWN0aXZlQ2VsbDogeyByb3dJZDogc3RyaW5nOyBmaWVsZDogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcblxuICBwcm90ZWN0ZWQgaXNBY3RpdmVDZWxsKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KTogYm9vbGVhbiB7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVDZWxsKSB7XG5cbiAgICAgIHJldHVybiB0aGlzLmFjdGl2ZUNlbGwucm93SWQgPT09IG5vZGUucm93SWQgJiYgdGhpcy5hY3RpdmVDZWxsLmZpZWxkID09PSBjb2x1bW4uZmllbGQ7XG4gICAgfVxuXG4gICAgLy8gTm90aGluZyBmb2N1c2VkIHlldCwgc28gdGhlIGZpcnN0IGNlbGwgaG9sZHMgdGhlIHRhYiBzdG9wLiBXaXRob3V0IHRoaXNcbiAgICAvLyBmYWxsYmFjayBhIGdyaWQgbm9ib2R5IGhhcyBjbGlja2VkIGhhcyAqbm8qIHRhYmJhYmxlIGNlbGwsIGFuZCBhIGtleWJvYXJkXG4gICAgLy8gdXNlciBjYW5ub3QgZ2V0IGludG8gaXQgYXQgYWxsIOKAlCB0aGUgcm92aW5nIHRhYmluZGV4IGhhcyB0byBzdGFydFxuICAgIC8vIHNvbWV3aGVyZS5cbiAgICByZXR1cm4gbm9kZSA9PT0gdGhpcy5ub2Rlc1swXSAmJiBjb2x1bW4gPT09IHRoaXMubmF2aWdhYmxlQ29sdW1ucygpWzBdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkb3B0IHdoYXRldmVyIHRoZSB1c2VyIGZvY3VzZWQsIGhvd2V2ZXIgdGhleSBnb3QgdGhlcmUg4oCUIGNsaWNrLCB0YWIsIG9yXG4gICAqIHRoZSBhcnJvdyBrZXlzIGJlbG93LiBLZWVwaW5nIHRoaXMgaW4gb25lIHBsYWNlIGlzIHdoYXQgc3RvcHMgdGhlIHJvdmluZ1xuICAgKiB0YWJpbmRleCBkcmlmdGluZyBhd2F5IGZyb20gdGhlIGVsZW1lbnQgdGhhdCBhY3R1YWxseSBoYXMgZm9jdXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgb25DZWxsRm9jdXMobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pOiB2b2lkIHtcblxuICAgIGlmICh0aGlzLmlzQWN0aXZlQ2VsbChub2RlLCBjb2x1bW4pKSByZXR1cm47XG5cbiAgICB0aGlzLmFjdGl2ZUNlbGwgPSB7IHJvd0lkOiBub2RlLnJvd0lkLCBmaWVsZDogY29sdW1uLmZpZWxkIGFzIHN0cmluZyB9O1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb25HcmlkS2V5ZG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuXG4gICAgLy8gVW5kby9yZWRvIG9mIGNvbW1pdHRlZCBlZGl0cywgYW55d2hlcmUgaW4gdGhlIGdyaWQgZXhjZXB0IGluc2lkZSBhblxuICAgIC8vIG9wZW4gZWRpdG9yIOKAlCBhIHRleHQgaW5wdXQncyBDdHJsK1ogaXMgdGhlIGJyb3dzZXIncywgYW5kIGl0IG9wZXJhdGVzXG4gICAgLy8gb24gdGhlIHVuY29tbWl0dGVkIHRleHQuXG4gICAgaWYgKChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpICYmIFsneicsICd5J10uaW5jbHVkZXMoZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkpKSB7XG5cbiAgICAgIGNvbnN0IHRhZyA9IChldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpPy50YWdOYW1lPy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgICBpZiAodGFnID09PSAnaW5wdXQnIHx8IHRhZyA9PT0gJ3NlbGVjdCcgfHwgdGFnID09PSAndGV4dGFyZWEnKSByZXR1cm47XG5cbiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgIGNvbnN0IHJlZG8gPSBldmVudC5rZXkudG9Mb3dlckNhc2UoKSA9PT0gJ3knIHx8IGV2ZW50LnNoaWZ0S2V5O1xuICAgICAgY29uc3QgYXBwbGllZCA9IHJlZG8gPyB0aGlzLmFwaS5yZWRvQ2VsbEVkaXRpbmcoKSA6IHRoaXMuYXBpLnVuZG9DZWxsRWRpdGluZygpO1xuXG4gICAgICBpZiAoYXBwbGllZCkgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5uYXZpZ2FibGVDb2x1bW5zKCk7XG5cbiAgICBpZiAoIXRoaXMubm9kZXMubGVuZ3RoIHx8ICFjb2x1bW5zLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgLy8gTmF2aWdhdGUgb25seSB3aGVuIGEgY2VsbCBpdHNlbGYgaG9sZHMgZm9jdXMuIEFueXRoaW5nIGZvY3VzYWJsZSAqaW5zaWRlKlxuICAgIC8vIGEgY2VsbCBvd25zIGl0cyBvd24ga2V5cyDigJQgYSB0ZXh0IGVkaXRvcidzIGNhcmV0LCB0aGUgcm93IGRyYWcgaGFuZGxlJ3NcbiAgICAvLyByZW9yZGVyIGtleXMsIHRoZSBvcHRpb24gbWVudSdzIGFycm93cyDigJQgYW5kIGFsbCBvZiB0aGVtIGJ1YmJsZSB0byBoZXJlLlxuICAgIC8vIENoZWNraW5nIHRoZSB0YXJnZXQgcmF0aGVyIHRoYW4gYmxvY2tsaXN0aW5nIHRhZyBuYW1lcyBpcyB3aGF0IGtlZXBzIHRoaXNcbiAgICAvLyBjb3JyZWN0IGFzIG1vcmUgY29udHJvbHMgYXJlIGFkZGVkIHRvIGNlbGxzLlxuICAgIGNvbnN0IHRhcmdldCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICBpZiAoIXRhcmdldD8ubWF0Y2hlcz8uKCdbcm9sZT1cImdyaWRjZWxsXCJdJykpIHJldHVybjtcblxuICAgIGNvbnN0IGN1cnJlbnQgPSB0aGlzLmFjdGl2ZUNlbGxQb3NpdGlvbihjb2x1bW5zKTtcblxuICAgIGxldCByb3cgPSBjdXJyZW50LnJvdztcbiAgICBsZXQgY29sID0gY3VycmVudC5jb2w7XG5cbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuXG4gICAgICBjYXNlICdBcnJvd0Rvd24nOiAgcm93ICs9IDE7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dVcCc6ICAgIHJvdyAtPSAxOyBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOiBjb2wgKz0gMTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd0xlZnQnOiAgY29sIC09IDE7IGJyZWFrO1xuXG4gICAgICAvLyBTZWxlY3Rpb24uIFNwYWNlIGlzIHRoZSBncmlkIHBhdHRlcm4ncyB0b2dnbGUsIGFuZCBpdCBoYXMgdG8gYmUgY2F1Z2h0XG4gICAgICAvLyBoZXJlIG9yIHRoZSBicm93c2VyIHNjcm9sbHMgdGhlIHBhZ2Ugd2l0aCBpdC5cbiAgICAgIGNhc2UgJyAnOiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzW2N1cnJlbnQucm93XTtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMudG9nZ2xlUm93U2VsZWN0aW9uKG5vZGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY2FzZSAnYSc6XG4gICAgICBjYXNlICdBJzpcbiAgICAgICAgaWYgKCFldmVudC5jdHJsS2V5ICYmICFldmVudC5tZXRhS2V5KSByZXR1cm47XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuYXBpLnNlbGVjdEFsbCgpO1xuICAgICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICAgICAgcmV0dXJuO1xuXG4gICAgICBjYXNlICdIb21lJzpcbiAgICAgICAgY29sID0gMDtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgcm93ID0gMDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VuZCc6XG4gICAgICAgIGNvbCA9IGNvbHVtbnMubGVuZ3RoIC0gMTtcbiAgICAgICAgaWYgKGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleSkgcm93ID0gdGhpcy5ub2Rlcy5sZW5ndGggLSAxO1xuICAgICAgICBicmVhaztcblxuICAgICAgLy8gQSBwYWdlIGlzIHdoYXQgdGhlIHZpZXdwb3J0IGNhbiBzaG93LCB3aGljaCBpcyB0aGUgb25seSBkZWZpbml0aW9uIHRoYXRcbiAgICAgIC8vIG1hdGNoZXMgd2hhdCB0aGUgdXNlciBzZWVzIG1vdmUuXG4gICAgICBjYXNlICdQYWdlRG93bic6IHJvdyArPSB0aGlzLnJvd3NQZXJQYWdlKCk7IGJyZWFrO1xuICAgICAgY2FzZSAnUGFnZVVwJzogICByb3cgLT0gdGhpcy5yb3dzUGVyUGFnZSgpOyBicmVhaztcblxuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgY2FzZSAnRjInOiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzW2N1cnJlbnQucm93XTtcbiAgICAgICAgY29uc3QgY29sdW1uID0gY29sdW1uc1tjdXJyZW50LmNvbF07XG4gICAgICAgIGlmIChub2RlICYmIGNvbHVtbikge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5zdGFydEVkaXQoeyB0YXJnZXQ6IGV2ZW50LnRhcmdldCB9IGFzIHVua25vd24gYXMgTW91c2VFdmVudCwgbm9kZSwgY29sdW1uKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGRlZmF1bHQ6IHJldHVybjtcbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgY29uc3QgdGFyZ2V0Um93ID0gTWF0aC5taW4oTWF0aC5tYXgocm93LCAwKSwgdGhpcy5ub2Rlcy5sZW5ndGggLSAxKTtcblxuICAgIHRoaXMuZm9jdXNDZWxsKHRhcmdldFJvdywgTWF0aC5taW4oTWF0aC5tYXgoY29sLCAwKSwgY29sdW1ucy5sZW5ndGggLSAxKSk7XG5cbiAgICAvLyBTaGlmdCB3aXRoIGEgdmVydGljYWwgbW92ZSBleHRlbmRzIHRoZSBzZWxlY3Rpb24sIGFuY2hvcmVkIHdoZXJlIHRoZVxuICAgIC8vIGV4dGVuc2lvbiBiZWdhbiDigJQgdGhlIHNhbWUgZ2VzdHVyZSBhIGZpbGUgbGlzdCB1c2VzLlxuICAgIGlmIChldmVudC5zaGlmdEtleSAmJiB0YXJnZXRSb3cgIT09IGN1cnJlbnQucm93KSB7XG5cbiAgICAgIHRoaXMuZXh0ZW5kU2VsZWN0aW9uVG8oY3VycmVudC5yb3csIHRhcmdldFJvdyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIFRoZSByb3cgYSBzaGlmdC1leHRlbmRlZCBzZWxlY3Rpb24gaXMgbWVhc3VyZWQgZnJvbS4gKi9cbiAgcHJpdmF0ZSBzZWxlY3Rpb25BbmNob3JSb3dJZDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgcHJpdmF0ZSB0b2dnbGVSb3dTZWxlY3Rpb24obm9kZTogT25lUm93Tm9kZTxUPik6IHZvaWQge1xuXG4gICAgaWYgKCF0aGlzLmFwaS50b2dnbGVSb3dTZWxlY3Rpb24obm9kZS5yb3dJZCwgIW5vZGUuc2VsZWN0ZWQpKSByZXR1cm47XG5cbiAgICAvLyBXaGVyZSBhIHN1YnNlcXVlbnQgc2hpZnQtZXh0ZW5zaW9uIGNvdW50cyBmcm9tLlxuICAgIHRoaXMuc2VsZWN0aW9uQW5jaG9yUm93SWQgPSBub2RlLnJvd0lkO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBwcml2YXRlIGV4dGVuZFNlbGVjdGlvblRvKGZyb21Sb3c6IG51bWJlciwgdG9Sb3c6IG51bWJlcik6IHZvaWQge1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gdGhpcy5ub2Rlc1t0b1Jvd107XG5cbiAgICBpZiAoIXRhcmdldCkgcmV0dXJuO1xuXG4gICAgLy8gV2l0aCBub3RoaW5nIHNlbGVjdGVkIHlldCB0aGUgcm93IHRoZSBleHRlbnNpb24gc3RhcnRlZCBvbiBiZWNvbWVzIHRoZVxuICAgIC8vIGFuY2hvciwgc28gc2hpZnQrYXJyb3cgc2VsZWN0cyBib3RoIGVuZHMgcmF0aGVyIHRoYW4gb25seSB0aGUgZmFyIG9uZS5cbiAgICBjb25zdCBhbmNob3IgPSB0aGlzLnNlbGVjdGlvbkFuY2hvclJvd0lkID8/IHRoaXMubm9kZXNbZnJvbVJvd10/LnJvd0lkO1xuXG4gICAgaWYgKCFhbmNob3IpIHJldHVybjtcblxuICAgIHRoaXMuc2VsZWN0aW9uQW5jaG9yUm93SWQgPSBhbmNob3I7XG5cbiAgICB0aGlzLmFwaS5zZWxlY3RSb3dSYW5nZShhbmNob3IsIHRhcmdldC5yb3dJZCk7XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb2x1bW5zIGEgY2VsbCBjdXJzb3IgY2FuIGxhbmQgb24uXG4gICAqXG4gICAqIEEgY29sdW1uIHdpdGggbm8gZmllbGQgcmVuZGVycyBubyBjZWxsIHN0YXRlIGFuZCBpcyBrZXllZCBieSBmaWVsZCwgc28gaXRcbiAgICogY2Fubm90IGJlIGFkZHJlc3NlZCDigJQgYW4gYWN0aW9uLW9ubHkgY29sdW1uIGlzIGEgbGVnaXRpbWF0ZSBleGFtcGxlLlxuICAgKi9cbiAgcHJpdmF0ZSBuYXZpZ2FibGVDb2x1bW5zKCk6IE9uZUNvbHVtbkRlZjxUPltdIHtcblxuICAgIHJldHVybiB0aGlzLmNvbHVtbkRlZnMuZmlsdGVyKGNvbHVtbiA9PiAhIWNvbHVtbj8uZmllbGQpO1xuICB9XG5cbiAgcHJpdmF0ZSBhY3RpdmVDZWxsUG9zaXRpb24oY29sdW1uczogT25lQ29sdW1uRGVmPFQ+W10pOiB7IHJvdzogbnVtYmVyOyBjb2w6IG51bWJlciB9IHtcblxuICAgIGlmICghdGhpcy5hY3RpdmVDZWxsKSByZXR1cm4geyByb3c6IDAsIGNvbDogMCB9O1xuXG4gICAgY29uc3Qgcm93ID0gdGhpcy5ub2Rlcy5maW5kSW5kZXgobm9kZSA9PiBub2RlLnJvd0lkID09PSB0aGlzLmFjdGl2ZUNlbGwhLnJvd0lkKTtcbiAgICBjb25zdCBjb2wgPSBjb2x1bW5zLmZpbmRJbmRleChjb2x1bW4gPT4gY29sdW1uLmZpZWxkID09PSB0aGlzLmFjdGl2ZUNlbGwhLmZpZWxkKTtcblxuICAgIHJldHVybiB7IHJvdzogcm93IDwgMCA/IDAgOiByb3csIGNvbDogY29sIDwgMCA/IDAgOiBjb2wgfTtcbiAgfVxuXG4gIHByaXZhdGUgcm93c1BlclBhZ2UoKTogbnVtYmVyIHtcblxuICAgIGNvbnN0IGhlaWdodCA9IHRoaXMudmlld3BvcnQ/LmVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ/LmNsaWVudEhlaWdodCA/PyAwO1xuXG4gICAgcmV0dXJuIE1hdGgubWF4KDEsIE1hdGguZmxvb3IoaGVpZ2h0IC8gdGhpcy5pdGVtU2l6ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1vdmUgdGhlIGN1cnNvciwgc2Nyb2xsaW5nIHRoZSByb3cgaW50byB2aWV3IGZpcnN0IHdoZW4gaXQgaXMgb3V0c2lkZSB0aGVcbiAgICogcmVuZGVyZWQgd2luZG93LlxuICAgKlxuICAgKiBUaGUgc2Nyb2xsIGlzIHRoZSByZWFzb24gZm9jdXNpbmcgaXMgZGVmZXJyZWQ6IGEgdmlydHVhbGlzZWQgcm93IHRoYXQgaXNcbiAgICogbm90IG9uIHNjcmVlbiBoYXMgbm8gZWxlbWVudCB0byBmb2N1cyB1bnRpbCB0aGUgdmlld3BvcnQgaGFzIHJlbmRlcmVkIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBmb2N1c0NlbGwocm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcik6IHZvaWQge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMubm9kZXNbcm93SW5kZXhdO1xuICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMubmF2aWdhYmxlQ29sdW1ucygpW2NvbEluZGV4XTtcblxuICAgIGlmICghbm9kZSB8fCAhY29sdW1uKSByZXR1cm47XG5cbiAgICB0aGlzLmFjdGl2ZUNlbGwgPSB7IHJvd0lkOiBub2RlLnJvd0lkLCBmaWVsZDogY29sdW1uLmZpZWxkIGFzIHN0cmluZyB9O1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG5cbiAgICBjb25zdCByYW5nZSA9IHRoaXMudmlld3BvcnQ/LmdldFJlbmRlcmVkUmFuZ2UoKTtcbiAgICBjb25zdCByZW5kZXJlZCA9IHJhbmdlICYmIHJvd0luZGV4ID49IHJhbmdlLnN0YXJ0ICYmIHJvd0luZGV4IDwgcmFuZ2UuZW5kO1xuXG4gICAgaWYgKHJlbmRlcmVkKSB7XG5cbiAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5mb2N1c0NlbGxFbGVtZW50KG5vZGUsIGNvbHVtbikpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy52aWV3cG9ydD8uc2Nyb2xsVG9JbmRleChyb3dJbmRleCk7XG5cbiAgICAvLyBTY3JvbGxpbmcgaXMgbm90IGVub3VnaDogdGhlIENESyByZW5kZXJzIG9uIGl0cyBvd24gc2NoZWR1bGUsIHNvIHRoZSByb3dcbiAgICAvLyBoYXMgbm8gZWxlbWVudCB0byBmb2N1cyB1bnRpbCBpdCBoYXMuIFdhaXRpbmcgZm9yIHRoZSByZW5kZXJlZCByYW5nZSB0b1xuICAgIC8vIGFjdHVhbGx5IGNvbnRhaW4gdGhlIHJvdyBpcyB0aGUgb25seSByZWxpYWJsZSBzaWduYWwg4oCUIGEgZml4ZWQgZGVsYXlcbiAgICAvLyByYWNlcyB0aGUgdmlld3BvcnQgYW5kIHNpbGVudGx5IGRyb3BzIGZvY3VzIHdoZW4gaXQgbG9zZXMuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChcbiAgICAgIHRoaXMudmlld3BvcnQ/LnJlbmRlcmVkUmFuZ2VTdHJlYW1cbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgZmlsdGVyKG5leHQgPT4gcm93SW5kZXggPj0gbmV4dC5zdGFydCAmJiByb3dJbmRleCA8IG5leHQuZW5kKSxcbiAgICAgICAgICB0YWtlKDEpLFxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gc2V0VGltZW91dCgoKSA9PiB0aGlzLmZvY3VzQ2VsbEVsZW1lbnQobm9kZSwgY29sdW1uKSkpLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGZvY3VzQ2VsbEVsZW1lbnQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4pOiB2b2lkIHtcblxuICAgIGNvbnN0IGtleSA9IGdldENlbGxLZXkobm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkIGFzIHN0cmluZyk7XG5cbiAgICB0aGlzLmJvZHlSZWY/Lm5hdGl2ZUVsZW1lbnQ/LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KGBbZGF0YS1jZWxsLWlkPVwiJHtrZXl9XCJdYCk/LmZvY3VzKCk7XG4gIH1cblxuICAvKiogSXMgdGhpcyB0aGUgcm93IGN1cnJlbnRseSBiZWluZyBtb3ZlZD8gKi9cbiAgcHJvdGVjdGVkIGlzUm93RHJhZ2dpbmcobm9kZTogT25lUm93Tm9kZTxUPik6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuIHRoaXMuZHJhZ1N0YXRlPy5yb3dJZCA9PT0gbm9kZS5yb3dJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGVyZSB0byBwYWludCB0aGUgZHJvcCBpbmRpY2F0b3IsIGluIHBpeGVscyBmcm9tIHRoZSB0b3Agb2YgdGhlIGJvZHkuXG4gICAqXG4gICAqIGBpbnNlcnRBdGAgaXMgYSBib3VuZGFyeSwgc28gdGhlIGxpbmUgc2l0cyBhdCByb3ctaGVpZ2h0IHRpbWVzIHRoZSBudW1iZXJcbiAgICogb2Ygcm93cyBhYm92ZSBpdCDigJQgaW4gY29udGVudCBzcGFjZS4gVGhlIGluZGljYXRvciBpcyBhIHNpYmxpbmcgb2YgdGhlXG4gICAqIHZpZXdwb3J0IHJhdGhlciB0aGFuIGEgY2hpbGQsIGJlY2F1c2UgYW55dGhpbmcgaW5zaWRlIGl0IGVpdGhlciBzY3JvbGxzXG4gICAqIGF3YXkgd2l0aCB0aGUgdHJhbnNmb3JtZWQgY29udGVudCB3cmFwcGVyIG9yIGlnbm9yZXMgdGhlIHNjcm9sbCBlbnRpcmVseSxcbiAgICogc28gdGhlIHZpZXdwb3J0J3Mgb3duIHNjcm9sbCBvZmZzZXQgYW5kIGl0cyBwb3NpdGlvbiB3aXRoaW4gdGhlIGJvZHkgYXJlXG4gICAqIGJvdGggc3VidHJhY3RlZCBiYWNrIG91dCBoZXJlLlxuICAgKlxuICAgKiBBIGZpZWxkIHJhdGhlciB0aGFuIGEgZ2V0dGVyOiBpdCBpcyByZWFkIGZyb20gdGhlIHRlbXBsYXRlIG9uIGV2ZXJ5IGNoYW5nZVxuICAgKiBkZXRlY3Rpb24gcGFzcywgYW5kIGl0IG9ubHkgYWN0dWFsbHkgbW92ZXMgd2hlbiB0aGUgZHJhZyBzdGF0ZSBvciB0aGVcbiAgICogc2Nyb2xsIHBvc2l0aW9uIGRvZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZHJvcEluZGljYXRvclRvcDogbnVtYmVyIHwgbnVsbCA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEhvdyB3aWRlIHRoZSBsaW5lIGlzIGRyYXduLiBSb3dzIGFyZSBgd2lkdGg6IGZpdC1jb250ZW50YCwgc28gdGhleSBhcmVcbiAgICogb2Z0ZW4gbmFycm93ZXIgdGhhbiB0aGUgdmlld3BvcnQg4oCUIGEgZnVsbC1ibGVlZCBsaW5lIHdvdWxkIGhhbmcgcGFzdCB0aGVcbiAgICogbGFzdCBjb2x1bW4gaW50byBlbXB0eSBzcGFjZSBhbmQgcmVhZCBhcyBwYXJ0IG9mIHRoZSBmcmFtZSByYXRoZXIgdGhhbiB0aGVcbiAgICogcm93cy4gVGhpcyBpcyB0aGUgdmlzaWJsZSBleHRlbnQgb2YgdGhlIHJvdyBjb250ZW50LCB3aGljaCBhbHNvIHNocmlua3NcbiAgICogY29ycmVjdGx5IGFzIHRoZSBncmlkIGlzIHNjcm9sbGVkIHNpZGV3YXlzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRyb3BJbmRpY2F0b3JXaWR0aCA9IDA7XG5cbiAgcHJpdmF0ZSB1cGRhdGVEcm9wSW5kaWNhdG9yKCk6IHZvaWQge1xuXG4gICAgY29uc3Qgc3RhdGUgPSB0aGlzLmRyYWdTdGF0ZTtcbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy52aWV3cG9ydD8uZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudDtcblxuICAgIGlmIChzdGF0ZT8uc291cmNlICE9PSAncG9pbnRlcicgfHwgIWVsZW1lbnQpIHtcblxuICAgICAgdGhpcy5kcm9wSW5kaWNhdG9yVG9wID0gbnVsbDtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZHJvcEluZGljYXRvclRvcCA9IChzdGF0ZS5pbnNlcnRBdCAqIHRoaXMuaXRlbVNpemUpIC0gZWxlbWVudC5zY3JvbGxUb3AgKyBlbGVtZW50Lm9mZnNldFRvcDtcblxuICAgIHRoaXMuZHJvcEluZGljYXRvcldpZHRoID0gTWF0aC5tYXgoTWF0aC5taW4odGhpcy5yb3dXaWR0aCAtIGVsZW1lbnQuc2Nyb2xsTGVmdCwgZWxlbWVudC5jbGllbnRXaWR0aCksIDApO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uUm93RHJhZ0VuZChldmVudDogT25lUm93RHJhZ0V2ZW50PFQ+KTogdm9pZCB7XG5cbiAgICB0aGlzLnJvd0RyYWdFbmQuZW1pdChldmVudCk7XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hSb3dEcmFnU3VwcHJlc3NlZCgpOiB2b2lkIHtcblxuICAgIGNvbnN0IHJlYXNvbiA9IHRoaXMuYXBpPy5nZXRSb3dEcmFnU3VwcHJlc3NlZFJlYXNvbj8uKCkgPz8gbnVsbDtcblxuICAgIGlmIChyZWFzb24gPT09IHRoaXMucm93RHJhZ1N1cHByZXNzZWQpIHJldHVybjtcblxuICAgIHRoaXMucm93RHJhZ1N1cHByZXNzZWQgPSByZWFzb247XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gICAgdGhpcy5mbGV4UmVzaXplT2JzZXJ2ZXI/LmRpc2Nvbm5lY3QoKTtcblxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy51bnN1YnNjcmliZSgpO1xuICB9XG59XG4iLCI8ZGl2ICNib2R5UmVmIGNsYXNzPVwib25lLWdyaWQtYm9keVwiIHJvbGU9XCJwcmVzZW50YXRpb25cIj5cblxuICAgIDwhLS0gUGlubmVkIHJvd3MgbGl2ZSBvdXRzaWRlIHRoZSBzY3JvbGwgdmlld3BvcnQgc28gdGhleSBuZXZlciBzY3JvbGxcbiAgICAgICAgIHZlcnRpY2FsbHksIGFuZCBtaXJyb3IgaXRzIHNjcm9sbExlZnQgc28gdGhlIGNvbHVtbnMgc3RheSBhbGlnbmVkLiAtLT5cbiAgICBAaWYgKHBpbm5lZFRvcE5vZGVzLmxlbmd0aCkge1xuICAgICAgICA8ZGl2ICNwaW5uZWRWaWV3cG9ydCBjbGFzcz1cIm9uZS1waW5uZWQtcm93cyBvbmUtcGlubmVkLXJvd3MtdG9wXCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBpbm5lZFJvd3NcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBub2RlczogcGlubmVkVG9wTm9kZXMsIHNpZGU6ICd0b3AnIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuXG4gICAgPCEtLSB0YWJpbmRleCBtYWtlcyB0aGUgc2Nyb2xsIGNvbnRhaW5lciByZWFjaGFibGUsIHNvIGEga2V5Ym9hcmQgdXNlciBjYW5cbiAgICAgICAgIHNjcm9sbCB0aGUgcm93cyB3aXRoIHRoZSBhcnJvdyBrZXlzLCBQYWdlIFVwL0Rvd24gYW5kIEhvbWUvRW5kLiBXaXRob3V0XG4gICAgICAgICBpdCB0aGUgYm9keSBpcyBzY3JvbGxhYmxlIGJ5IHBvaW50ZXIgb25seSAoV0NBRyAyLjEuMSkuIC0tPlxuICAgIDxjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnRcbiAgICAgICAgY2xhc3M9XCJvbmUtZ3JpZC1ib2R5LXZpZXdwb3J0XCJcbiAgICAgICAgcm9sZT1cInJvd2dyb3VwXCJcbiAgICAgICAgW2F0dHIudGFiaW5kZXhdPVwibm9kZXM/Lmxlbmd0aCA/IG51bGwgOiAwXCJcbiAgICAgICAgKGtleWRvd24pPVwib25HcmlkS2V5ZG93bigkZXZlbnQpXCJcbiAgICAgICAgW2l0ZW1TaXplXT1cIml0ZW1TaXplXCJcbiAgICAgICAgW21pbkJ1ZmZlclB4XT1cIm1pbkJ1ZmZlclB4XCJcbiAgICAgICAgW21heEJ1ZmZlclB4XT1cIm1heEJ1ZmZlclB4XCJcbiAgICAgICAgKHNjcm9sbCk9XCJvbkJvZHlTY3JvbGwoJGV2ZW50KVwiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKmNka1ZpcnR1YWxGb3I9XCJsZXQgbm9kZSBvZiBub2RlczsgdHJhY2tCeTogdHJhY2tCeVJvd0lkO1wiPlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXJvd1wiXG4gICAgICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1yb3dpbmRleF09XCJkYXRhUm93QXJpYUluZGV4KG5vZGUpXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLXNlbGVjdGVkXT1cInJvd1NlbGVjdGlvbkVuYWJsZWQgPyBub2RlLnNlbGVjdGVkIDogbnVsbFwiXG4gICAgICAgICAgICAgICAgW2F0dHIuZGF0YS1yb3ctaWRdPVwibm9kZS5yb3dJZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm9uZS1yb3ctc2VsZWN0ZWRdPVwibm9kZS5zZWxlY3RlZFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLm9uZS1yb3ctZHJhZ2dpbmddPVwiaXNSb3dEcmFnZ2luZyhub2RlKVwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbCBvZiBjb2x1bW5EZWZzOyB0cmFjayBjb2wuZmllbGQ7KSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiY2VsbFRlbXBsYXRlXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgbm9kZSwgcm93SW5kZXg6IG5vZGUucm93SW5kZXgsIGNvbHVtbjogY29sLCBjb2xJbmRleDogJGluZGV4IH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPCEtLSBDdXN0b20gRGV0YWlsIENvbXBvbmVudCAtLT5cbiAgICAgICAgICAgICBAaWYobm9kZS5sZWFmICYmIG5vZGUuZGV0YWlsQWN0aXZlICYmIG5vZGU/LmRldGFpbFJlbmRlcmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICBvbmVDZWxsUmVuZGVyZXJDb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJlckNvbXBvbmVudF09XCJub2RlPy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgIFtwYXJhbXNdPVwieyBkYXRhOiBub2RlLmRhdGEsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBub2RlOiBub2RlLCBjb250ZXh0OiBjb250ZXh0IH1cIj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPCEtLSBNYXN0ZXIgRGV0YWlsIEdyaWQgKHRlbXBsYXRlIHByb3ZpZGVkIGJ5IHRoZSBwYXJlbnQgb25lLWdyaWQgdG8gYXZvaWQgYSBjb21waWxlLXRpbWUgaW1wb3J0IGN5Y2xlKSAtLT5cbiAgICAgICAgICAgIEBpZiAobWFzdGVyRGV0YWlsICYmIG5vZGUuZXhwYW5kZWQgJiYgbm9kZT8uZGV0YWlsUm93RGF0YSkge1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtcm93LWRldGFpbC1jb250YWluZXJcIiBbYXR0ci5kYXRhLXJvdy1pZF09XCJub2RlLnJvd0lkICsgJy1kZXRhaWwnXCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImRldGFpbEdyaWRUZW1wbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG5vZGUsIG5vZGU6IG5vZGUgfVwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIEBpZiAoIW5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogbWF4LWNvbnRlbnQ7IGJvcmRlci10b3A6IDFweCBzb2xpZCB0cmFuc3BhcmVudDtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IFtzdHlsZS53aWR0aC5weF09XCJyb3dXaWR0aFwiPjwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Nkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydD5cblxuICAgIDwhLS0gRHJvcCBpbmRpY2F0b3IuXG4gICAgICAgICBBIGxpbmUgYXQgdGhlIGluc2VydGlvbiBwb2ludCByYXRoZXIgdGhhbiBhIGdhcCBvcGVuZWQgYmV0d2VlbiByb3dzOlxuICAgICAgICAgdGhlIHZpZXdwb3J0IGlzIHZpcnR1YWxpc2VkIGF0IGEgZml4ZWQgaXRlbVNpemUsIHNvIHNoaWZ0aW5nIHJvd3MgYXBhcnRcbiAgICAgICAgIHdvdWxkIGRlc3luY2hyb25pc2UgdGhlIHNjcm9sbGVyIGZyb20gaXRzIG93biBnZW9tZXRyeS4gSXQgaXMgYWxzbyB0aGVcbiAgICAgICAgIGNsZWFyZXIgc2lnbmFsIOKAlCB0aGUgcm93IGxhbmRzIGV4YWN0bHkgd2hlcmUgdGhlIGxpbmUgaXMuXG4gICAgICAgICBQb3NpdGlvbmVkIGFnYWluc3QgdGhlIGJvZHksIHdpdGggdGhlIHZpZXdwb3J0J3Mgc2Nyb2xsIHN1YnRyYWN0ZWQsIHNvXG4gICAgICAgICBpdCBzdGF5cyBwdXQgd2hpbGUgdGhlIGNvbnRlbnQgbW92ZXMgdW5kZXIgaXQgZHVyaW5nIGF1dG8tc2Nyb2xsLiAtLT5cbiAgICBAaWYgKGRyb3BJbmRpY2F0b3JUb3AgIT09IG51bGwpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1yb3ctZHJvcC1pbmRpY2F0b3JcIiBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiZHJvcEluZGljYXRvclRvcFwiXG4gICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImRyb3BJbmRpY2F0b3JXaWR0aFwiPjwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gS2V5Ym9hcmQgcmVvcmRlcmluZyBoYXMgbm8gZHJhZyBpbWFnZSB0byB3YXRjaCwgc28gaXQgbmFycmF0ZXMgaW5zdGVhZC5cbiAgICAgICAgIEFzc2VydGl2ZSBiZWNhdXNlIHRoZSBtZXNzYWdlIGlzIHRoZSBvbmx5IGZlZWRiYWNrIHRoYXQgdGhlIHJvdyBtb3ZlZC4gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm9uZS1ncmlkLXZpc3VhbGx5LWhpZGRlblwiIHJvbGU9XCJzdGF0dXNcIiBhcmlhLWxpdmU9XCJhc3NlcnRpdmVcIiBhcmlhLWF0b21pYz1cInRydWVcIj57eyBkcmFnQW5ub3VuY2VtZW50IH19PC9kaXY+XG4gICAgQGlmICghbm9kZXM/Lmxlbmd0aCkge1xuICAgICAgICA8c3BhbiBjbGFzcz1cIm9uZS1ncmlkLWVtcHR5LW1lc3NhZ2VcIiBzdHlsZT1cInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiA1MCU7IGxlZnQ6IDUwJTsgdHJhbnNmb3JtOiB0cmFuc2xhdGUoLTUwJSwgLTUwJSk7XCI+Tm8gUm93cyB0byBTaG93PC9zcGFuPlxuICAgIH1cblxuICAgIEBpZiAocGlubmVkQm90dG9tTm9kZXMubGVuZ3RoKSB7XG4gICAgICAgIDxkaXYgI3Bpbm5lZFZpZXdwb3J0IGNsYXNzPVwib25lLXBpbm5lZC1yb3dzIG9uZS1waW5uZWQtcm93cy1ib3R0b21cIiByb2xlPVwicm93Z3JvdXBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwicGlubmVkUm93c1wiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG5vZGVzOiBwaW5uZWRCb3R0b21Ob2Rlcywgc2lkZTogJ2JvdHRvbScgfVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICB9XG48L2Rpdj5cblxuPCEtLSBQaW5uZWQgcm93cyBhcmUgZGlzcGxheS1vbmx5OiB0aGV5IHJlbmRlciBleGFjdGx5IHdoYXQgYSBkYXRhIGNlbGwgcmVuZGVycyxcbiAgICAgYnV0IGNhcnJ5IG5vbmUgb2YgaXRzIGludGVyYWN0aW9ucy4gQSB0b3RhbHMgcm93IHNob3VsZCBub3Qgb3BlbiBhbiBlZGl0b3JcbiAgICAgb24gZG91YmxlLWNsaWNrIG9yIHN0YXJ0IGEgcmFuZ2Ugc2VsZWN0aW9uIG9uIGRyYWcuIC0tPlxuPG5nLXRlbXBsYXRlICNwaW5uZWRSb3dzIGxldC1ub2Rlcz1cIm5vZGVzXCIgbGV0LXNpZGU9XCJzaWRlXCI+XG4gICAgQGZvciAobm9kZSBvZiBub2RlczsgdHJhY2sgbm9kZS5yb3dJZCkge1xuICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXJvdyBvbmUtcm93LXBpbm5lZFwiXG4gICAgICAgICAgICByb2xlPVwicm93XCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtcm93aW5kZXhdPVwicGlubmVkUm93QXJpYUluZGV4KG5vZGUsIHNpZGUpXCJcbiAgICAgICAgICAgIFthdHRyLmRhdGEtcm93LWlkXT1cIm5vZGUucm93SWRcIj5cbiAgICAgICAgICAgIEBmb3IgKGNvbHVtbiBvZiBjb2x1bW5EZWZzOyB0cmFjayBjb2x1bW4uZmllbGQpIHtcbiAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwib25lLWNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgIHJvbGU9XCJncmlkY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtY29saW5kZXhdPVwiJGluZGV4ICsgMVwiXG4gICAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtY2VsbC1pZF09XCJub2RlLnJvd0lkIHwgY2VsbEtleTpjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtbGVmdF09XCJjb2x1bW4ucGlubmVkID09PSAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtcmlnaHRdPVwiY29sdW1uLnBpbm5lZCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1lZGdlXT1cImNvbHVtbi5fcGlubmVkRWRnZVwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImNvbHVtbi5waW5uZWQgPT09ICdsZWZ0JyA/IGNvbHVtbi5fcGlubmVkT2Zmc2V0IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS5yaWdodC5weF09XCJjb2x1bW4ucGlubmVkID09PSAncmlnaHQnID8gY29sdW1uLl9waW5uZWRPZmZzZXQgOiBudWxsXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbj8ud2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbj8ubWluV2lkdGhcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbHVtbj8ubWF4V2lkdGhcIj5cblxuICAgICAgICAgICAgICAgICAgICBAaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJlckNvbXBvbmVudF09XCJjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BhcmFtc109XCJyZW5kZXJlclBhcmFtcyhub2RlLCBjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBAZWxzZSBpZiAoY29sdW1uPy5jZWxsUmVuZGVyZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2x1bW4ud2lkdGggKyAncHgnLCBwb3NpdGlvbjogJ3JlbGF0aXZlJyB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaW5uZXJIVE1MXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxTdGF0ZVJlbmRlcmVyOmNvbHVtbi5maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1jZWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWxpZ24tY29udGVudC1sZWZ0XT1cImNvbHVtbj8uYWxpZ25Db250ZW50ID09PSAnbGVmdCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hbGlnbi1jb250ZW50LWNlbnRlcl09XCJjb2x1bW4/LmFsaWduQ29udGVudCA9PT0gJ2NlbnRlcidcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjbGFzcy5hbGlnbi1jb250ZW50LXJpZ2h0XT1cImNvbHVtbj8uYWxpZ25Db250ZW50ID09PSAncmlnaHQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJjb2xTZXJ2aWNlLnJlc29sdmVDZWxsQ2xhc3MoY29sdW1uLCBjZWxsUGFyYW1zKG5vZGUsIGNvbHVtbikpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJjb2xTZXJ2aWNlLnJlc29sdmVDZWxsU3R5bGUoY29sdW1uLCBjZWxsUGFyYW1zKG5vZGUsIGNvbHVtbikpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1jZWxsLXRleHRcIj57eyAobm9kZS5jZWxsU3RhdGVzIHwgY2VsbFN0YXRlUmVuZGVyZXI6Y29sdW1uLmZpZWxkKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPCEtLSBNYXN0ZXIgQ29sdW1uIFRlbXBsYXRlICAtLT5cbjxuZy10ZW1wbGF0ZSAjY2VsbFRlbXBsYXRlIGxldC1ub2RlPVwibm9kZVwiIGxldC1yb3dJbmRleD1cInJvd0luZGV4XCIgbGV0LWNvbHVtbj1cImNvbHVtblwiIGxldC1jb2xJbmRleD1cImNvbEluZGV4XCI+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm9uZS1jb2x1bW5cIlxuICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICBbYXR0ci5hcmlhLWNvbGluZGV4XT1cImNvbEluZGV4ICsgMVwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cImlzQWN0aXZlQ2VsbChub2RlLCBjb2x1bW4pID8gMCA6IC0xXCJcbiAgICAgICAgW2NsYXNzLm9uZS1jZWxsLWFjdGl2ZV09XCJpc0FjdGl2ZUNlbGwobm9kZSwgY29sdW1uKVwiXG4gICAgICAgIChmb2N1cyk9XCJvbkNlbGxGb2N1cyhub2RlLCBjb2x1bW4pXCJcbiAgICAgICAgW2F0dHIuZGF0YS1jZWxsLWlkXT1cIm5vZGUucm93SWQgfCBjZWxsS2V5OmNvbHVtbi5maWVsZFwiXG4gICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1sZWZ0XT1cImNvbHVtbi5waW5uZWQgPT09ICdsZWZ0J1wiXG4gICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1yaWdodF09XCJjb2x1bW4ucGlubmVkID09PSAncmlnaHQnXCJcbiAgICAgICAgW2NsYXNzLm9uZS1jb2x1bW4tcGlubmVkLWVkZ2VdPVwiY29sdW1uLl9waW5uZWRFZGdlXCJcbiAgICAgICAgW3N0eWxlLmxlZnQucHhdPVwiY29sdW1uLnBpbm5lZCA9PT0gJ2xlZnQnID8gY29sdW1uLl9waW5uZWRPZmZzZXQgOiBudWxsXCJcbiAgICAgICAgW3N0eWxlLnJpZ2h0LnB4XT1cImNvbHVtbi5waW5uZWQgPT09ICdyaWdodCcgPyBjb2x1bW4uX3Bpbm5lZE9mZnNldCA6IG51bGxcIlxuICAgICAgICBbc3R5bGUud2lkdGgucHhdPVwiY29sdW1uPy53aWR0aFwiXG4gICAgICAgIFtzdHlsZS5taW4td2lkdGgucHhdPVwiY29sdW1uPy5taW5XaWR0aFwiXG4gICAgICAgIFtzdHlsZS5tYXgtd2lkdGgucHhdPVwiY29sdW1uPy5tYXhXaWR0aFwiXG4gICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLWJvcmRlci10b3BdPVwibWFzdGVyRGV0YWlsICYmIG5vZGVzPy5sZW5ndGggPiAwICYmIG5vZGVzW25vZGUucm93SW5kZXggLSAxXT8uZXhwYW5kZWRcIlxuICAgICAgICBbY2xhc3Mub25lLWNlbGwtc2VsZWN0ZWRdPVwic2VsZWN0ZWRDZWxscyB8IGNlbGxTZWxlY3RlZDpub2RlLnJvd0lkOmNvbHVtbi5maWVsZFwiXG4gICAgICAgIFtjbGFzcy5vbmUtY2VsbC1pbnZhbGlkXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxJbnZhbGlkOm5vZGUuZGF0YVtjb2x1bW4uZmllbGRdOmNvbHVtbjpub2RlOmFsbG93ZWRFZGl0OnN1Ym1pdHRlZFwiXG4gICAgICAgIChkYmxjbGljayk9XCJzdGFydEVkaXQoJGV2ZW50LCBub2RlLCBjb2x1bW4pXCJcbiAgICAgICAgKG1vdXNlZG93bik9XCJzdGFydFNlbGVjdGlvbihub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpXCJcbiAgICAgICAgKG1vdXNlZW50ZXIpPVwiZXh0ZW5kU2VsZWN0aW9uKG5vZGUucm93SWQsIGNvbHVtbi5maWVsZClcIlxuICAgICAgICAobW91c2V1cCk9XCJlbmRTZWxlY3Rpb24oKVwiPlxuXG4gICAgICAgIDwhLS0gT25lIEdyaWQgQ2VsbCBPcHRpb24gLS0+XG4gICAgICAgIEBpZiAobm9kZS5jZWxsT3B0aW9uc1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICAgICAgICA8b25lLWdyaWQtY2VsbC1vcHRpb24tbWVudVxuICAgICAgICAgICAgICAgICNjb250ZXh0T3B0aW9uTWVudVJlZlxuICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29sdW1uXCJcbiAgICAgICAgICAgICAgICBbb3B0aW9uc109XCJjb2x1bW4uY2VsbE9wdGlvbk1lbnVcIlxuICAgICAgICAgICAgICAgIChjZWxsT3B0aW9uTWVudVNlbGVjdCk9XCJjZWxsT3B0aW9uTWVudVNlbGVjdGVkKCRldmVudClcIlxuICAgICAgICAgICAgICAgIChjZWxsT3B0aW9uTWVudUNsb3NlKT1cImNlbGxPcHRpb25NZW51Q2xvc2VkKClcIi8+XG4gICAgICAgIH1cblxuICAgICAgICA8IS0tIEdyaWQgQ2VsbCBUZW1wbGF0ZSAtLT5cbiAgICAgICAgQGlmKGNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgb25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJlckNvbXBvbmVudF09XCJjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgW3BhcmFtc109XCJyZW5kZXJlclBhcmFtcyhub2RlLCBjb2x1bW4pXCI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSBpZiAobm9kZS5lZGl0aW5nW2NvbHVtbi5maWVsZF0pIHtcbiAgICAgICAgICAgIEBpZiAoY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ3NlbGVjdCcpIHtcbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgRWRpdGluZyBTZWxlY3QuIENvbW1pdHMgb24gY2hhbmdlIOKAlCBwaWNraW5nIGFuIG9wdGlvblxuICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHdob2xlIGVkaXQg4oCUIHdpdGggYmx1ciBhcyB0aGUga2V5Ym9hcmQgZmFsbGJhY2suIC0tPlxuICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJvbmUtY2VsbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7eyBub2RlLnJvd0lkICsgJycgKyBjb2x1bW4uZmllbGQgfX1cIlxuICAgICAgICAgICAgICAgICAgICAoY2hhbmdlKT1cInN0b3BFZGl0U2VsZWN0KG5vZGUsIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cInN0b3BFZGl0U2VsZWN0KG5vZGUsIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVzYyk9XCJjYW5jZWxFZGl0KG5vZGUsIGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvciAob3B0aW9uIG9mIGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5zZWxlY3RPcHRpb25zID8/IFtdOyB0cmFjayAkaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3NlbGVjdGVkXT1cIm9wdGlvbi52YWx1ZSA9PT0gbm9kZS5kYXRhW2NvbHVtbi5maWVsZF1cIj57eyBvcHRpb24ubGFiZWwgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgIDwhLS0gQ2VsbCBFZGl0aW5nIElucHV0IC0tPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cIm9uZS1jZWxsLWlucHV0XCJcbiAgICAgICAgICAgICAgICAgICAgbmFtZT1cInt7IG5vZGUucm93SWQgKyAnJyArIGNvbHVtbi5maWVsZCB9fVwiXG4gICAgICAgICAgICAgICAgICAgIG9uZUNlbGxJbnB1dFZhbGlkYXRvclxuICAgICAgICAgICAgICAgICAgICBbdmFsaWRhdGlvblR5cGVdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ251bWJlcicgPyAnbnVtYmVyJyA6ICdub25lJ1wiXG4gICAgICAgICAgICAgICAgICAgIFtwbGFjZWhvbGRlcl09XCJjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8ucGxhY2Vob2xkZXJcIlxuICAgICAgICAgICAgICAgICAgICBbdHlwZV09XCJjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8uaW5wdXRUeXBlID09PSAnbnVtYmVyJyA/ICd0ZXh0JyA6IGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5pbnB1dFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwibm9kZT8uZGF0YVtjb2x1bW4/LmZpZWxkXVwiXG4gICAgICAgICAgICAgICAgICAgIFttYXhMZW5ndGhdPVwiMjUwXCJcbiAgICAgICAgICAgICAgICAgICAgKGJsdXIpPVwic3RvcEVkaXQobm9kZSwgY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwic3RvcEVkaXQobm9kZSwgY29sdW1uLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZXNjKT1cImNhbmNlbEVkaXQobm9kZSwgY29sdW1uKVwiXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSBpZiAoY29sdW1uPy5jZWxsUmVuZGVyZXIpIHtcbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7IHdpZHRoOiBjb2x1bW4ud2lkdGggKyAncHgnICwgcG9zaXRpb246ICdyZWxhdGl2ZScgfVwiXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJub2RlLmNlbGxTdGF0ZXMgfCBjZWxsU3RhdGVSZW5kZXJlcjpjb2x1bW4uZmllbGRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5lZGl0YWJsZS1hY3RpdmVdPVwibm9kZS5jZWxsU3RhdGVzIHwgY2VsbEVkaXRhYmxlOmNvbHVtbjpub2RlOmNlbGxTZXJ2aWNlLmVkaXRhYmxlRm46Y2VsbFNlcnZpY2UudXBkYXRhYmxlRm46YWxsb3dlZEVkaXRcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtY2VsbFwiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtbGVmdF09XCJjb2x1bW4/LmFsaWduQ29udGVudCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWxpZ24tY29udGVudC1jZW50ZXJdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdjZW50ZXInXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuYWxpZ24tY29udGVudC1yaWdodF09XCJjb2x1bW4/LmFsaWduQ29udGVudCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sU2VydmljZS5yZXNvbHZlQ2VsbENsYXNzKGNvbHVtbiwgY2VsbFBhcmFtcyhub2RlLCBjb2x1bW4pKVwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sU2VydmljZS5yZXNvbHZlQ2VsbFN0eWxlKGNvbHVtbiwgY2VsbFBhcmFtcyhub2RlLCBjb2x1bW4pKVwiXG4gICAgICAgICAgICAgICAgW3N0eWxlLnBhZGRpbmctbGVmdC5weF09XCJjb2x1bW4uYXV0b0dyb3VwRmllbGQgJiYgbm9kZS5sZXZlbCB8IGNlbGxMZXZlbFBhZGRpbmc6MjRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vbmUtY2VsbC1hbGxvd2VkLWVkaXQtYWN0aXZlXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxFZGl0YWJsZTpjb2x1bW46bm9kZTpjZWxsU2VydmljZS5lZGl0YWJsZUZuOmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuOmFsbG93ZWRFZGl0XCI+XG5cbiAgICAgICAgICAgICAgICA8IS0tIFJvdyBEcmFnIEhhbmRsZSAtLT5cbiAgICAgICAgICAgICAgICBAaWYgKGNlbGxTZXJ2aWNlLnJvd0RyYWdGbihjb2x1bW4sIG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxvbmUtZ3JpZC1yb3ctZHJhZy1oYW5kbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N1cHByZXNzZWRSZWFzb25dPVwicm93RHJhZ1N1cHByZXNzZWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRyYWdFbmQpPVwib25Sb3dEcmFnRW5kKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIDwhLS0gQ2VsbCBDaGVja2JveCBTZWxlY3Rpb24gLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjb2x1bW4/LmNoZWNrYm94U2VsZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIDxvbmUtZ3JpZC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWxsb3dlZEVkaXRdPVwiYWxsb3dlZEVkaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FwaV09XCJhcGlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93U2VsZWN0aW9uKT1cImludm9rZVJvd0FjdGlvblNlbGVjdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8IS0tIEV4cGFuZCAmIENvbGxhcHNlIEljb24gLS0+XG4gICAgICAgICAgICAgICAgQGlmICgoKG5vZGU/Lmdyb3VwIHx8IGRldGFpbFJlbmRlcmVyQ29tcG9uZW50KSAmJiBjb2x1bW4/LmF1dG9Hcm91cEZpZWxkKSB8fCAobWFzdGVyRGV0YWlsICYmIG5vZGU/LmV4cGFuZGFibGUgJiYgZ3JpZFR5cGUgPT09ICdtYXN0ZXInICYmIGNvbHVtbj8ubWFzdGVyR3JvdXBGaWVsZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgPG9uZS1ncmlkLWNlbGwtZ3JvdXAtcmVuZGVyZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21hc3RlckRldGFpbF09XCJtYXN0ZXJEZXRhaWxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RldGFpbENlbGxSZW5kZXJlclBhcmFtc109XCJkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RldGFpbFJlbmRlcmVyQ29tcG9uZW50XT1cImRldGFpbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChleHBhbnNpb25DaGFuZ2VkKT1cImludm9rZUV4cGFuc2lvbkNoYW5nZWRDbGljaygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBAaWYoY29sdW1uPy5jZWxsUmVuZGVyZXJDb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgb25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBbY2VsbFJlbmRlcmVyQ29tcG9uZW50XT1cImNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJhbXNdPVwicmVuZGVyZXJQYXJhbXMobm9kZSwgY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgQGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICA8IS0tIENlbGwgVmFsdWUgT1IgUGxhY2Vob2xkZXIgLS0+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgb25lQ2VsbFRleHRFeHBhbmQgY2xhc3M9XCJvbmUtY2VsbC10ZXh0XCIgW2NsYXNzLm9uZS1jZWxsLXBsYWNlaG9sZGVyXT1cIm5vZGUuY2VsbFN0YXRlc1tjb2x1bW4uZmllbGRdPy50eXBlID09PSAncGxhY2Vob2xkZXInXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyAobm9kZS5jZWxsU3RhdGVzIHwgY2VsbFN0YXRlUmVuZGVyZXI6Y29sdW1uLmZpZWxkKSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgQWN0aW9uIEJ1dHRvbnMgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjb2x1bW4uY2VsbFJlbmRlcmVyUGFyYW1zIHwgY2VsbEFjdGlvbkJ1dHRvbkVuYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtcm93LWFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyBtYXJnaW5MZWZ0OiAnYXV0bycgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthbGxvd2VkRWRpdF09XCJhbGxvd2VkRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWFzdGVyTm9kZV09XCJtYXN0ZXJOb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtncmlkVHlwZV09XCJncmlkVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY29udGV4dF09XCJjb250ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyZXJQYXJhbXNdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93R290b0RldGFpbCk9XCJpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93QWRkTmV3KT1cImludm9rZVJvd0FjdGlvbkFkZE5ldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd1ZpZXcpPVwiaW52b2tlUm93QWN0aW9uVmlldygkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0xvY2F0aW9uKT1cImludm9rZVJvd0FjdGlvbkxvY2F0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93RG9jdW1lbnQpPVwiaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dDb3B5KT1cImludm9rZVJvd0FjdGlvbkNvcHkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dEZWxldGUpPVwiaW52b2tlUm93QWN0aW9uRGVsZXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93R290b0xpc3QpPVwiaW52b2tlUm93QWN0aW9uR290b0xpc3QoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dFZGl0KT1cImludm9rZVJvd0FjdGlvbkVkaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dQcmludCk9XCJpbnZva2VSb3dBY3Rpb25QcmludCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0hpc3RvcnkpPVwiaW52b2tlUm93QWN0aW9uSGlzdG9yeSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd09wdGlvbik9XCJpbnZva2VSb3dBY3Rpb25PcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dMYW5ndWFnZSk9XCJpbnZva2VSb3dBY3Rpb25MYW5ndWFnZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0NlbGxPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uQ2VsbE9wdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
|
|
1256
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lLWdyaWQtYm9keS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9vbmUtZ3JpZC9zcmMvbGliL2NvbXBvbmVudHMvb25lLWdyaWQtYm9keS9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL29uZS1ncmlkL3NyYy9saWIvY29tcG9uZW50cy9vbmUtZ3JpZC1ib2R5L29uZS1ncmlkLWJvZHkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQix1QkFBdUIsRUFBcUIsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFxQixNQUFNLEVBQWdDLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFLdE8sT0FBTyxFQUFXLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM3QyxPQUFPLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSzlDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQ3ZFLE9BQU8sRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFMUUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLGVBQWUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRW5GLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBR3pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDckUsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sa0RBQWtELENBQUM7QUFDNUYsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0VBQXdFLENBQUM7QUFDM0gsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0sa0VBQWtF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LE1BQU07Z0JBQ0csZUFBZTtzQkFBeEIsTUFBTTtnQkFDRyxjQUFjO3NCQUF2QixNQUFNO2dCQUNHLGtCQUFrQjtzQkFBM0IsTUFBTTtnQkFDRyxlQUFlO3NCQUF4QixNQUFNO2dCQUVHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLGdCQUFnQjtzQkFBekIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQXdWUCxlQUFlO3NCQURkLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBa0IxQyxlQUFlO3NCQURkLFlBQVk7dUJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgUXVlcnlMaXN0LCBUZW1wbGF0ZVJlZiwgVHlwZSwgVmlld0NoaWxkLCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENlbGxTZWxlY3Rpb24sIE9uZUNlbGxQcmVzZW50YXRpb25QYXJhbXMsIE9uZUNlbGxSZW5kZXJlclBhcmFtcywgT25lQ29sdW1uRGVmIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLWNvbHVtbi1kZWYtdHlwZXMubW9kZWwnO1xuaW1wb3J0IHsgT25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvb25lLXRyZWUtZGF0YS5tb2RlbCc7XG5pbXBvcnQgeyBPbmVSb3dOb2RlIH0gZnJvbSAnLi4vLi4vY29yZS9pbnN0YW50cy9vbmUtcm93LW5vZGUuY2xhc3MnO1xuaW1wb3J0IHsgT25lR3JpZEFwaSB9IGZyb20gJy4uLy4uL2NvcmUvaW5zdGFudHMvb25lLWdyaWQtYXBpLmNsYXNzJztcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgT25lR3JpZEdldFJvd0lkUGFyYW1zLCBPbmVHcmlkUmVhZHlFdmVudCwgT25lR3JpZFJvd0FjdGlvbkV2ZW50LCBPbmVHcmlkVHlwZSB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ncmlkLXR5cGVzLm1vZGVsJztcbmltcG9ydCB7IE9uZUdyaWRFdmVudFNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29uZS1ncmlkLWV2ZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgQ2VsbE9wdGlvbk1lbnVTZWxlY3RlZEV2ZW50LCBDb2x1bW5DaGFuZ2VkRXZlbnQsIEV4cGFuc2lvbkNoYW5nZWRFdmVudCwgUGlubmVkUm93RGF0YUNoYW5nZWRFdmVudCwgUm93RGF0YUNoYW5nZWRFdmVudCwgUm93T3JkZXJDaGFuZ2VkRXZlbnQsIFNlbGVjdGlvbkNoYW5nZWRFdmVudCwgU29ydENoYW5nZWRFdmVudCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL29uZS1ldmVudC10eXBlcy5tb2RlbCc7XG5pbXBvcnQgeyBPbmVEZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXMgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtbWFzdGVyLWRldGFpbC5tb2RlbCc7XG5pbXBvcnQgeyBDZWxsRWRpdGFibGVQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLWVkaXRhYmxlLnBpcGUnO1xuaW1wb3J0IHsgZ2V0Q2VsbEtleSwgZ2V0RmllbGRWYWx1ZSB9IGZyb20gJy4uLy4uL2hlbHBlcnMvb25lLWNlbGwuaGVscGVyJztcbmltcG9ydCB7IE9uZUdyaWRDZWxsU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtY2VsbC5zZXJ2aWNlJztcbmltcG9ydCB7IENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgU2Nyb2xsaW5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XG5pbXBvcnQgeyBPZ0NvbHVtblNlcnZpY2UgfSBmcm9tICcuLi8uLi9jb3JlL3NlcnZpY2VzL29nLWNvbHVtbi5zZXJ2aWNlJztcbmltcG9ydCB7IHJlc29sdmVDb2x1bW5XaWR0aCB9IGZyb20gJy4uLy4uL2hlbHBlcnMvb25lLWNvbHVtbi1kZWYuaGVscGVyJztcbmltcG9ydCB7IE9uZUdyaWRSb3dEcmFnU2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvb25lLWdyaWQtcm93LWRyYWcuc2VydmljZSc7XG5pbXBvcnQgeyBPbmVSb3dEcmFnRXZlbnQsIE9uZVJvd0RyYWdTdGF0ZSwgT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9vbmUtcm93LWRyYWcubW9kZWwnO1xuaW1wb3J0IHsgTmdDbGFzcywgTmdTdHlsZSwgTmdUZW1wbGF0ZU91dGxldCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBPbmVHcmlkQ2hlY2tib3hDb21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1jaGVja2JveC9vbmUtZ3JpZC1jaGVja2JveC5jb21wb25lbnQnO1xuaW1wb3J0IHsgT25lR3JpZENlbGxHcm91cFJlbmRlcmVyQ29tcG9uZW50IH0gZnJvbSAnLi4vb25lLWdyaWQtY2VsbC1ncm91cC1yZW5kZXJlci9vbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBPbmVHcmlkQ2VsbE9wdGlvbk1lbnVDb21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1jZWxsLW9wdGlvbi1tZW51L29uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnUuY29tcG9uZW50JztcbmltcG9ydCB7IE9uZUdyaWRSb3dBY3Rpb25Db21wb25lbnQgfSBmcm9tICcuLi9vbmUtZ3JpZC1yb3ctYWN0aW9uL29uZS1ncmlkLXJvdy1hY3Rpb24uY29tcG9uZW50JztcbmltcG9ydCB7IE9uZUdyaWRSb3dEcmFnSGFuZGxlQ29tcG9uZW50IH0gZnJvbSAnLi4vb25lLWdyaWQtcm93LWRyYWctaGFuZGxlL29uZS1ncmlkLXJvdy1kcmFnLWhhbmRsZS5jb21wb25lbnQnO1xuaW1wb3J0IHsgT25lQ2VsbElucHV0VmFsaWRhdG9yRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vY29yZS9kaXJlY3RpdmVzL29uZS1jZWxsLWlucHV0LXZhbGlkYXRvci5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgT25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vY29yZS9kaXJlY3RpdmVzL29uZS1jZWxsLXJlbmRlcmVyLWNvbXBvbmVudC5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgT25lQ2VsbFRleHRFeHBhbmREaXJlY3RpdmUgfSBmcm9tICcuLi8uLi9jb3JlL2RpcmVjdGl2ZXMvb25lLWNlbGwtdGV4dC1leHBhbmQuZGlyZWN0aXZlJztcbmltcG9ydCB7IENlbGxBY3Rpb25CdXR0b25FbmFibGVQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLWFjdGlvbi1idXR0b24tZW5hYmxlLnBpcGUnO1xuaW1wb3J0IHsgQ2VsbEludmFsaWRQaXBlIH0gZnJvbSAnLi4vLi4vY29yZS9waXBlcy9jZWxsLWludmFsaWQucGlwZSc7XG5pbXBvcnQgeyBDZWxsS2V5UGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcGlwZXMvY2VsbC1rZXkucGlwZSc7XG5pbXBvcnQgeyBDZWxsTGV2ZWxQYWRkaW5nUGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcGlwZXMvY2VsbC1sZXZlbC1wYWRkaW5nLnBpcGUnO1xuaW1wb3J0IHsgQ2VsbFNlbGVjdGVkUGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcGlwZXMvY2VsbC1zZWxlY3RlZC5waXBlJztcbmltcG9ydCB7IENlbGxTdGF0ZVJlbmRlcmVyUGlwZSB9IGZyb20gJy4uLy4uL2NvcmUvcGlwZXMvY2VsbC1zdGF0ZS1yZW5kZXJlci5waXBlJztcblxuQENvbXBvbmVudCh7XG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBOZ0NsYXNzLFxuICAgIE5nU3R5bGUsXG4gICAgTmdUZW1wbGF0ZU91dGxldCxcbiAgICBTY3JvbGxpbmdNb2R1bGUsXG4gICAgT25lR3JpZENoZWNrYm94Q29tcG9uZW50LFxuICAgIE9uZUdyaWRDZWxsR3JvdXBSZW5kZXJlckNvbXBvbmVudCxcbiAgICBPbmVHcmlkQ2VsbE9wdGlvbk1lbnVDb21wb25lbnQsXG4gICAgT25lR3JpZFJvd0FjdGlvbkNvbXBvbmVudCxcbiAgICBPbmVHcmlkUm93RHJhZ0hhbmRsZUNvbXBvbmVudCxcbiAgICBPbmVDZWxsSW5wdXRWYWxpZGF0b3JEaXJlY3RpdmUsXG4gICAgT25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50RGlyZWN0aXZlLFxuICAgIE9uZUNlbGxUZXh0RXhwYW5kRGlyZWN0aXZlLFxuICAgIENlbGxBY3Rpb25CdXR0b25FbmFibGVQaXBlLFxuICAgIENlbGxFZGl0YWJsZVBpcGUsXG4gICAgQ2VsbEludmFsaWRQaXBlLFxuICAgIENlbGxLZXlQaXBlLFxuICAgIENlbGxMZXZlbFBhZGRpbmdQaXBlLFxuICAgIENlbGxTZWxlY3RlZFBpcGUsXG4gICAgQ2VsbFN0YXRlUmVuZGVyZXJQaXBlLFxuICBdLFxuICBzZWxlY3RvcjogJ29uZS1ncmlkLWJvZHknLFxuICAvLyBUaGUgaG9zdCBzaXRzIGJldHdlZW4gcm9sZT1cImdyaWRcIiBhbmQgdGhlIHJvd3MgaXQgbXVzdCBvd247IGEgZ2VuZXJpY1xuICAvLyBlbGVtZW50IHRoZXJlIGJyZWFrcyB0aGUgb3duZXJzaGlwIGNoYWluLCBzbyBpdCBsZWF2ZXMgdGhlIGExMXkgdHJlZS5cbiAgaG9zdDogeyAncm9sZSc6ICdwcmVzZW50YXRpb24nIH0sXG4gIHRlbXBsYXRlVXJsOiAnLi9vbmUtZ3JpZC1ib2R5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL29uZS1ncmlkLWJvZHkuY29tcG9uZW50LnNjc3MnLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgT25lR3JpZEJvZHlDb21wb25lbnQ8VD4gaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG5cbiAgLyoqXG4gICAqIENvcmUgUHJvcGVydGllc1xuICAgKi9cbiAgQFZpZXdDaGlsZCgnYm9keVJlZicsIHsgc3RhdGljOiB0cnVlIH0pIGJvZHlSZWYhOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSkgcm93RGF0YTogVFtdID0gW107XG4gIEBJbnB1dCgpIHJvd051bWJlcjogYm9vbGVhbjtcbiAgQElucHV0KCkgYXBpITogT25lR3JpZEFwaTxUPjtcbiAgQElucHV0KCkgcGFnaW5hdGlvbjogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBhbGxvd2VkRWRpdDogYm9vbGVhbiA9IHRydWU7XG4gIEBJbnB1dCgpIGVuYWJsZUdyb3VwQ29sdW1uRGVmczogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBzdWJtaXR0ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogYCdmdWxsUm93J2A6IGEgZG91YmxlLWNsaWNrIG9wZW5zIGV2ZXJ5IGVkaXRhYmxlIGNlbGwgb2YgdGhlIHJvdywgRW50ZXIgb3JcbiAgICogZm9jdXMgbGVhdmluZyB0aGUgcm93IGNvbW1pdHMgdGhlbSB0b2dldGhlciwgRXNjYXBlIGNsb3NlcyB0aGVtIGFsbFxuICAgKiB3aXRob3V0IGNvbW1pdHRpbmcuIERlZmF1bHQ6IG9uZSBjZWxsIGF0IGEgdGltZS5cbiAgICovXG4gIEBJbnB1dCgpIGVkaXRUeXBlOiAnZnVsbFJvdycgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgY29udGV4dDogYW55ID0gbnVsbDtcbiAgQElucHV0KCkgZ2V0Um93SWQ6IChwYXJhbXM6IE9uZUdyaWRHZXRSb3dJZFBhcmFtczxUPikgPT4gc3RyaW5nO1xuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KSBncmlkQ29weSQhOiBTdWJqZWN0PENsaXBib2FyZEV2ZW50PjtcblxuICAvKipcbiAgICogUGlubmVkIHJvd3MgYXJlIGJvdW5kIG9ubHkgc28gdGhlIGNvbXBvbmVudCByZS1yZW5kZXJzIHdoZW4gdGhleSBjaGFuZ2U7XG4gICAqIHRoZSBub2RlcyB0aGVtc2VsdmVzIGNvbWUgZnJvbSB0aGUgQVBJLCB3aGljaCBvd25zIHRoZW0uXG4gICAqL1xuICBASW5wdXQoKSBwaW5uZWRUb3BSb3dEYXRhOiBUW10gPSBbXTtcbiAgQElucHV0KCkgcGlubmVkQm90dG9tUm93RGF0YTogVFtdID0gW107XG5cbiAgLyoqXG4gICAqIFRoZSBwaW5uZWQgcm93IGNvbnRhaW5lcnMgc2l0IG91dHNpZGUgdGhlIHNjcm9sbCB2aWV3cG9ydCwgc28gdGhleSBoYXZlIHRvXG4gICAqIGJlIHRvbGQgdGhlIGhvcml6b250YWwgb2Zmc2V0IOKAlCB0aGUgc2FtZSBhcnJhbmdlbWVudCB0aGUgaGVhZGVyIHVzZXMuXG4gICAqL1xuICBAVmlld0NoaWxkcmVuKCdwaW5uZWRWaWV3cG9ydCcpIHByaXZhdGUgcGlubmVkVmlld3BvcnRzPzogUXVlcnlMaXN0PEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+PjtcblxuICBwcm90ZWN0ZWQgcGlubmVkVG9wTm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBwcm90ZWN0ZWQgcGlubmVkQm90dG9tTm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuICBAVmlld0NoaWxkKENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCkgdmlld3BvcnQhOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQ7XG5cbiAgcHJvdGVjdGVkIGNvbHVtbkRlZnM6IE9uZUNvbHVtbkRlZjxUPltdID0gW107XG4gIHByb3RlY3RlZCBjZWxsUmVuZGVyZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAvKipcbiAgICogTWFzdGVyIERldGFpbCBQcm9wZXJ0aWVzXG4gICAqL1xuICBASW5wdXQoKSBncmlkVHlwZTogT25lR3JpZFR5cGUgPSAnc2ltcGxlJztcbiAgQElucHV0KCkgbWFzdGVyRGV0YWlsOiBib29sZWFuID0gZmFsc2U7XG4gIEBJbnB1dCgpIG1hc3Rlck5vZGU6IE9uZVJvd05vZGU8VD4gPSBudWxsO1xuICAvLyBASW5wdXQoKSBkZXRhaWxSb3dIZWlnaHQ6IG51bWJlciA9IG51bGw7XG4gIC8vIEBJbnB1dCgpIGRldGFpbFJvd0F1dG9IZWlnaHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgQElucHV0KCkgZGV0YWlsUm93TWF4SGVpZ2h0OiBudW1iZXIgPSBudWxsO1xuICBASW5wdXQoKSBkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXM6IE9uZURldGFpbENlbGxSZW5kZXJlclBhcmFtcztcbiAgQElucHV0KCkgZGV0YWlsR3JpZFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjx1bmtub3duPiA9IG51bGw7XG4gIEBJbnB1dCgpIGRldGFpbFJlbmRlcmVyQ29tcG9uZW50OiBUeXBlPE9uZUNlbGxSZW5kZXJlckNvbXBvbmVudD47XG5cbiAgLyoqXG4gICAqIFRyZWUgRGF0YSBQcm9wZXJ0aWVzXG4gICAqL1xuICBASW5wdXQoKSB0cmVlRGF0YTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSB0cmVlRGF0YUNoaWxkcmVuRmllbGQ6IHN0cmluZztcbiAgQElucHV0KCkgYXV0b0dyb3VwQ29sdW1uRGVmOiBPbmVDb2x1bW5EZWY8VD47XG4gIEBJbnB1dCgpIGdyb3VwRGVmYXVsdEV4cGFuZGVkOiBudW1iZXIgPSAtMTsgLy8gSXQncyB3b3JrIHdpdGggbWFzdGVyIGRldGFpbCBhbHNvXG5cbiAgLyoqXG4gICAqIFBhc3NpbmcgUm93IEFjdGlvbiBFdmVudHMgdG8gUGFyZW50XG4gICAqL1xuICBAT3V0cHV0KCkgb25Sb3dHb3RvRGV0YWlsID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0FkZE5ldyA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dWaWV3ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0NvcHkgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TG9jYXRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RG9jdW1lbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93RGVsZXRlID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0dvdG9MaXN0ID0gbmV3IEV2ZW50RW1pdHRlcjxPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4+KCk7XG4gIEBPdXRwdXQoKSBvblJvd0VkaXQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93UHJpbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93SGlzdG9yeSA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dPcHRpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93TGFuZ3VhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uUm93Q2VsbE9wdGlvbiA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgb25Sb3dTZWxlY3Rpb24gPSBuZXcgRXZlbnRFbWl0dGVyPE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIG9uU2hpZnREb3VibGVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8T25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+PigpO1xuICBAT3V0cHV0KCkgcm93Q291bnRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG5cbiAgQE91dHB1dCgpIGV4cGFuc2lvbkNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPEV4cGFuc2lvbkNoYW5nZWRFdmVudDxUPj4oKTtcbiAgQE91dHB1dCgpIGJvZHlTY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgQE91dHB1dCgpIGNlbGxPcHRpb25TZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIHJvd0RyYWdFbmQgPSBuZXcgRXZlbnRFbWl0dGVyPE9uZVJvd0RyYWdFdmVudDxUPj4oKTtcblxuICAvKipcbiAgICogU2VsZWN0aW9uIFJhbmdlIFZhcmlhYmxlc1xuICAgKi9cbiAgcHJvdGVjdGVkIHJvd1dpZHRoOiBudW1iZXIgPSAwO1xuICBwcm90ZWN0ZWQgbm9kZXM6IE9uZVJvd05vZGU8VD5bXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBSb3cgZHJhZyBzdGF0ZSwgbWlycm9yZWQgZnJvbSB0aGUgc2VydmljZSBzbyB0aGUgdGVtcGxhdGUgY2FuIHJlYWQgaXRcbiAgICogc3luY2hyb25vdXNseS4gYG51bGxgIHdoZW5ldmVyIG5vIGRyYWcgaXMgaW4gZmxpZ2h0LlxuICAgKi9cbiAgcHJvdGVjdGVkIGRyYWdTdGF0ZTogT25lUm93RHJhZ1N0YXRlIHwgbnVsbCA9IG51bGw7XG4gIHByb3RlY3RlZCBkcmFnQW5ub3VuY2VtZW50ID0gJyc7XG4gIHByb3RlY3RlZCByb3dEcmFnU3VwcHJlc3NlZDogT25lUm93RHJhZ1N1cHByZXNzZWRSZWFzb24gfCBudWxsID0gbnVsbDtcbiAgcHJvdGVjdGVkIHNlbGVjdGVkQ2VsbHMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgcHJpdmF0ZSBpc01vdXNlRG93biA9IGZhbHNlO1xuICBwcml2YXRlIHN0YXJ0Q2VsbDogQ2VsbFNlbGVjdGlvbiA9IG51bGw7XG4gIHByaXZhdGUgbGFzdFNjcm9sbExlZnQgPSAwO1xuICBwcml2YXRlIGNlbGxFZGl0YWJsZVBpcGUgPSBuZXcgQ2VsbEVkaXRhYmxlUGlwZSgpO1xuICBwcml2YXRlIHN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG5cbiAgcHJvdGVjdGVkIGNlbGxSZW5kZXJlclBhcmFtczogT25lQ2VsbFJlbmRlcmVyUGFyYW1zID0ge1xuICAgICAgZ290b0RldGFpbEJ1dHRvblN0YXR1czogMSxcbiAgICAgIGFkZE5ld0J1dHRvblN0YXR1czogMSxcbiAgICAgIHZpZXdCdXR0b25TdGF0dXM6IDEsXG4gICAgICBsb2NhdGlvbkJ1dHRvblN0YXR1czogMSxcbiAgICAgIGRvY3VtZW50QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgY29weUJ1dHRvblN0YXR1czogMSxcbiAgICAgIGRlbGV0ZUJ1dHRvblN0YXR1czogMSxcbiAgICAgIGdvdG9MaXN0QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgb3B0aW9uQnV0dG9uU3RhdHVzOiAxLFxuICAgICAgbGFuZ3VhZ2VCdXR0b25TdGF0dXM6IDEsXG4gICAgICBlZGl0QnV0dG9uU3RhdHVzOiAxLFxuICAgICAgcHJpbnRCdXR0b25TdGF0dXM6IDEsXG4gICAgICBoaXN0b3J5QnV0dG9uU3RhdHVzOiAxLFxuICB9XG5cbiAgLyoqXG4gICAqIFZpcnR1YWwgU2Nyb2xsIFByb3BlcnRpZXNcbiAgICovXG4gIHByb3RlY3RlZCBpdGVtU2l6ZTogbnVtYmVyID0gMzA7XG4gIHByb3RlY3RlZCBtaW5CdWZmZXJQeDogbnVtYmVyID0gMjAwO1xuICBwcm90ZWN0ZWQgbWF4QnVmZmVyUHg6IG51bWJlciA9IDQwMDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgY29sU2VydmljZTogT2dDb2x1bW5TZXJ2aWNlLFxuICAgIHByb3RlY3RlZCBjZWxsU2VydmljZTogT25lR3JpZENlbGxTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXZlbnRTZXJ2aWNlOiBPbmVHcmlkRXZlbnRTZXJ2aWNlLFxuICAgIHByb3RlY3RlZCByb3dEcmFnU2VydmljZTogT25lR3JpZFJvd0RyYWdTZXJ2aWNlPFQ+LFxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHsgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIEdyaWQgQ29weSBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ncmlkQ29weSQuc3Vic2NyaWJlKChldmVudDogQ2xpcGJvYXJkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5vbkdyaWRDb3B5KGV2ZW50KTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBSb3cgZHJhZ1xuICAgICAqXG4gICAgICogVGhlIHNlcnZpY2Ugb3ducyB0aGUgZ2VzdHVyZTsgdGhlIGJvZHkgb25seSByZW5kZXJzIGl0IGFuZCBsZW5kcyBpdCB0aGVcbiAgICAgKiB2aWV3cG9ydCwgdGhlIHJvdyBoZWlnaHQgYW5kIGEgd2F5IHRvIGFwcGx5IGEgbW92ZS4gVGhlIHN1cHByZXNzaW9uXG4gICAgICogcmVhc29uIGlzIHJlLXJlYWQgb24gZXZlcnkgZXZlbnQgdGhhdCBjb3VsZCBjaGFuZ2UgdGhlIG9yZGVyLCBzbyB0aGVcbiAgICAgKiBoYW5kbGUgZGlzYWJsZXMgaXRzZWxmIHRoZSBtb21lbnQgYSBzb3J0IG9yIGZpbHRlciBpcyBhcHBsaWVkLlxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5yb3dEcmFnU2VydmljZS5zdGF0ZSQuc3Vic2NyaWJlKChzdGF0ZSkgPT4ge1xuXG4gICAgICB0aGlzLmRyYWdTdGF0ZSA9IHN0YXRlO1xuXG4gICAgICB0aGlzLnVwZGF0ZURyb3BJbmRpY2F0b3IoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLnJvd0RyYWdTZXJ2aWNlLmFubm91bmNlbWVudCQuc3Vic2NyaWJlKChtZXNzYWdlKSA9PiB7XG5cbiAgICAgIHRoaXMuZHJhZ0Fubm91bmNlbWVudCA9IG1lc3NhZ2U7XG5cbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pKTtcblxuICAgIC8qKlxuICAgICAqIExpc3RlbiBDb2x1bW4gQ2hhbmdlZCBFdmVudFxuICAgICAqL1xuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQodGhpcy5ldmVudFNlcnZpY2UuYWRkRXZlbnRMaXN0ZW5lcignY29sdW1uQ2hhbmdlZCcsIChwYXlsb2FkOiBDb2x1bW5DaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5jb2x1bW5EZWZzID0gWy4uLnBheWxvYWQuY29sdW1uc10gYXMgT25lQ29sdW1uRGVmW107XG5cbiAgICAgIC8vIFBhcmFtcyBjYXJyeSB0aGUgY29sdW1uRGVmLCBzbyBhIGNvbHVtbiBjaGFuZ2UgaW52YWxpZGF0ZXMgdGhlbSBhbGwuXG4gICAgICB0aGlzLnJlbmRlcmVyUGFyYW1zQ2FjaGUuY2xlYXIoKTtcblxuICAgICAgdGhpcy5jZWxsUmVuZGVyZXIgPSB0aGlzLmNvbHVtbkRlZnMuc29tZShjb2wgPT4gY29sLmNlbGxSZW5kZXJlckNvbXBvbmVudCk7XG5cbiAgICAgIHRoaXMucm93V2lkdGggPSB0aGlzLmNvbHVtbkRlZnMucmVkdWNlKChzdW0sIGNvbCkgPT4gc3VtICsgcmVzb2x2ZUNvbHVtbldpZHRoKGNvbCksIDApO1xuXG4gICAgICAvLyBBIGNvbHVtbiBjaGFuZ2UgY2FuIGFsdGVyIHRoZSB3aWR0aCBsZWZ0IGZvciBmbGV4IGNvbHVtbnMgKGEgaGlkZSwgYVxuICAgICAgLy8gcmVzaXplLCBuZXcgZGVmcykuIFJlLWZsZXhpbmcgb25seSBkaXNwYXRjaGVzIHdoZW4gYSB3aWR0aCBhY3R1YWxseVxuICAgICAgLy8gY2hhbmdlcywgc28gdGhpcyBjYW5ub3QgcGluZy1wb25nLlxuICAgICAgdGhpcy5hcHBseUZsZXhXaWR0aHMoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfSkpO1xuXG4gICAgLyoqXG4gICAgICogTGlzdGVuIFJvdyBEYXRhIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd0RhdGFDaGFuZ2VkJywgKHsgbm9kZXM6IGFsbE5vZGVzIH06IFJvd0RhdGFDaGFuZ2VkRXZlbnQ8VD4pID0+IHtcblxuICAgICAgLy8gVGhlIGZ1bGwgcG9zdC1maWx0ZXIgY291bnQsIHJlcG9ydGVkIGJlZm9yZSB0aGUgcGFnZSBzbGljZSBpcyB0YWtlbixcbiAgICAgIC8vIHNvIHRoZSBob3N0J3MgcGFnaW5nIHRvdGFscyBzZWUgZXZlcnl0aGluZy5cbiAgICAgIHRoaXMucm93Q291bnRDaGFuZ2VkLmVtaXQoYWxsTm9kZXM/Lmxlbmd0aCA/PyAwKTtcblxuICAgICAgLy8gTmV3IHJvd3MsIG5ldyByZW5kZXJlciBwYXJhbXMg4oCUIGFuZCByZW1vdmVkIHJvd3MgbGVhdmUgbm8gc3RhbGVcbiAgICAgIC8vIGNhY2hlIGVudHJpZXMgYmVoaW5kLlxuICAgICAgdGhpcy5yZW5kZXJlclBhcmFtc0NhY2hlLmNsZWFyKCk7XG5cbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5hcGkucGFnZU5vZGVzKGFsbE5vZGVzKTtcblxuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG5cbiAgICAgICAgdGhpcy52aWV3cG9ydD8uY2hlY2tWaWV3cG9ydFNpemUoKTtcblxuICAgICAgICB0aGlzLnNldFZpcnR1YWxTY3JvbGwobm9kZXM/Lmxlbmd0aCk7XG5cbiAgICAgICAgaWYgKHRoaXMubWFzdGVyRGV0YWlsKSB7XG5cbiAgICAgICAgICB0aGlzLm5vZGVzID0gbm9kZXMubWFwKChub2RlOiBPbmVSb3dOb2RlKSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChub2RlLmxlYWYgJiYgdGhpcy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCkge1xuXG4gICAgICAgICAgICAgIG5vZGUuZGV0YWlsUmVuZGVyZXJDb21wb25lbnQgPSB0aGlzLmRldGFpbFJlbmRlcmVyQ29tcG9uZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXRhaWwgcm93cyBjYW4gc3RpbGwgYmUgaW4gZmxpZ2h0IHdoZW4gYSByb3cgaXMgZXhwYW5kZWQsIGFuZFxuICAgICAgICAgICAgLy8gc3ByZWFkaW5nIG51bGwgdGhyb3dzLiBOb3RoaW5nIHRvIHJlLXNlZWQgdW50aWwgdGhleSBhcnJpdmUuXG4gICAgICAgICAgICBpZiAobm9kZS5leHBhbmRlZCAmJiBub2RlLmRldGFpbFJvd0RhdGEpIHtcblxuICAgICAgICAgICAgICB0aGlzLmFwaS5zZXREZXRhaWxSb3dEYXRhKG5vZGUsIFsuLi5ub2RlLmRldGFpbFJvd0RhdGFdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIG5vZGU7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIHRoaXMubm9kZXMgPSBub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W107XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlZnJlc2hSb3dEcmFnU3VwcHJlc3NlZCgpO1xuXG4gICAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgICAgfSk7XG4gICAgfSkpO1xuXG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gUGlubmVkIFJvdyBEYXRhIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Bpbm5lZFJvd0RhdGFDaGFuZ2VkJywgKHsgc2lkZSwgbm9kZXMgfTogUGlubmVkUm93RGF0YUNoYW5nZWRFdmVudDxUPikgPT4ge1xuXG4gICAgICB0aGlzLnJlbmRlcmVyUGFyYW1zQ2FjaGUuY2xlYXIoKTtcblxuICAgICAgaWYgKHNpZGUgPT09ICd0b3AnKSB7XG5cbiAgICAgICAgdGhpcy5waW5uZWRUb3BOb2RlcyA9IG5vZGVzIGFzIE9uZVJvd05vZGU8VD5bXTtcblxuICAgICAgfSBlbHNlIHtcblxuICAgICAgICB0aGlzLnBpbm5lZEJvdHRvbU5vZGVzID0gbm9kZXMgYXMgT25lUm93Tm9kZTxUPltdO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gU29ydCBDaGFuZ2VkIEV2ZW50XG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdzb3J0Q2hhbmdlZCcsICh7IG5vZGVzIH06IFNvcnRDaGFuZ2VkRXZlbnQpID0+IHtcblxuICAgICAgdGhpcy5ub2RlcyA9IHRoaXMuYXBpLnBhZ2VOb2Rlcyhub2RlcyBhcyBPbmVSb3dOb2RlPFQ+W10pO1xuXG4gICAgICAvLyBTb3J0aW5nIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgb3JkZXIgYXdheSBmcm9tIHRoZSB1c2VyLCBzbyB0aGUgaGFuZGxlc1xuICAgICAgLy8gaGF2ZSB0byBkaXNhYmxlIGluIHRoZSBzYW1lIGZyYW1lIHRoZSByb3dzIHJlLXNvcnQuXG4gICAgICB0aGlzLnJlZnJlc2hSb3dEcmFnU3VwcHJlc3NlZCgpO1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gUm93IE9yZGVyIENoYW5nZWQgRXZlbnRcbiAgICAgKlxuICAgICAqIERlbGliZXJhdGVseSBub3QgZm9sZGVkIGludG8gYHJvd0RhdGFDaGFuZ2VkYDogdGhhdCBwYXRoIGRlZmVycyBhIGZyYW1lXG4gICAgICogYW5kIHJlLXNlZWRzIGRldGFpbCByb3dzLCB3aGljaCBpcyByaWdodCBmb3IgYSBkYXRhIGxvYWQgYW5kIGZhciB0b28gbXVjaFxuICAgICAqIGZvciBhIG1vdmUuIEEgcmVvcmRlciBpcyB0aGUgc2FtZSBub2RlcyBpbiBhIGRpZmZlcmVudCBvcmRlci5cbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3Jvd09yZGVyQ2hhbmdlZCcsICh7IG5vZGVzIH06IFJvd09yZGVyQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgIHRoaXMubm9kZXMgPSB0aGlzLmFwaS5wYWdlTm9kZXMoWy4uLm5vZGVzXSBhcyBPbmVSb3dOb2RlPFQ+W10pO1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gQ2VsbCBTdGF0ZSBDaGFuZ2VkIEV2ZW50XG4gICAgICpcbiAgICAgKiBUaGUgYm9keSByZW5kZXJzIE9uUHVzaCwgc28gcmVnZW5lcmF0aW5nIGEgcm93J3MgY2VsbCBzdGF0ZSBpcyBpbnZpc2libGVcbiAgICAgKiB1bnRpbCBzb21ldGhpbmcgbWFya3MgdGhlIGJvZHkgZGlydHkuIFRoaXMgaXMgdGhhdCBzb21ldGhpbmcuXG4gICAgICovXG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZCh0aGlzLmV2ZW50U2VydmljZS5hZGRFdmVudExpc3RlbmVyKCdjZWxsU3RhdGVDaGFuZ2VkJywgKCkgPT4ge1xuXG4gICAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgICB9KSk7XG5cbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gU2VsZWN0aW9uIENoYW5nZWQgRXZlbnRcbiAgICAgKi9cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHRoaXMuZXZlbnRTZXJ2aWNlLmFkZEV2ZW50TGlzdGVuZXIoJ3NlbGVjdGlvbkNoYW5nZWQnLCAocGF5bG9hZDogU2VsZWN0aW9uQ2hhbmdlZEV2ZW50PFQ+KSA9PiB7XG5cbiAgICAgIGlmIChwYXlsb2FkKSB7XG5cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG4gICAgfSkpO1xuICB9XG5cbiAgb25HcmlkUmVhZHkocGFyYW1zOiBPbmVHcmlkUmVhZHlFdmVudCkge1xuXG4gICAgcGFyYW1zLmFwaS5zZXRSb3dEYXRhKHRoaXMubWFzdGVyTm9kZT8uZGV0YWlsUm93RGF0YSA/PyBbXSk7XG4gIH1cblxuICBvbkJvZHlTY3JvbGwoZXZlbnQ6IEV2ZW50KSB7XG5cbiAgICBjb25zdCBzY3JvbGxMZWZ0ID0gKGV2ZW50LnRhcmdldCBhcyBIVE1MRWxlbWVudCkuc2Nyb2xsTGVmdDtcblxuICAgIGlmIChzY3JvbGxMZWZ0ICE9PSB0aGlzLmxhc3RTY3JvbGxMZWZ0KSB7XG5cbiAgICAgIHRoaXMubGFzdFNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0O1xuXG4gICAgICB0aGlzLnN5bmNQaW5uZWRSb3dzKHNjcm9sbExlZnQpO1xuXG4gICAgICB0aGlzLmJvZHlTY3JvbGwuZW1pdChzY3JvbGxMZWZ0KTtcblxuICAgICAgLy8gVGhlIGluZGljYXRvciBpcyBjbGlwcGVkIHRvIHRoZSByb3cgY29udGVudCwgd2hpY2ggbW92ZXMgc2lkZXdheXMgdG9vLlxuICAgICAgaWYgKHRoaXMuZHJhZ1N0YXRlKSB7XG5cbiAgICAgICAgdGhpcy51cGRhdGVEcm9wSW5kaWNhdG9yKCk7XG5cbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBWZXJ0aWNhbDogdGhlIGRyb3AgaW5kaWNhdG9yIGlzIGFuY2hvcmVkIHRvIHRoZSBib2R5LCBub3QgdGhlIGNvbnRlbnQsIHNvXG4gICAgLy8gaXQgaGFzIHRvIGJlIHJlcG9zaXRpb25lZCBhcyB0aGUgcm93cyBtb3ZlIGJlbmVhdGggaXQg4oCUIHdoaWNoIHRoZXkgZG8gb25cbiAgICAvLyB0aGVpciBvd24gZHVyaW5nIGF1dG8tc2Nyb2xsLCB3aXRoIHRoZSBwb2ludGVyIHN0YW5kaW5nIHN0aWxsLlxuICAgIGlmICh0aGlzLmRyYWdTdGF0ZSkge1xuXG4gICAgICB0aGlzLnVwZGF0ZURyb3BJbmRpY2F0b3IoKTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEtlZXAgdGhlIHBpbm5lZCByb3dzIGluIHN0ZXAgd2l0aCB0aGUgYm9keSdzIGhvcml6b250YWwgcG9zaXRpb24uXG4gICAqXG4gICAqIEFzc2lnbmVkIHJhdGhlciB0aGFuIHRyYW5zZm9ybWVkLCBmb3IgdGhlIHNhbWUgcmVhc29uIGFzIHRoZSBoZWFkZXI6IHN0aWNreVxuICAgKiBwb3NpdGlvbmluZyBmb3IgcGlubmVkICpjb2x1bW5zKiBoYXMgdG8gcmVzb2x2ZSBhZ2FpbnN0IGEgcmVhbCBzY3JvbGxwb3J0LFxuICAgKiBhbmQgYSB0cmFuc2Zvcm1lZCBhbmNlc3RvciBpcyBub3Qgb25lLiBQaW5uZWQgcm93cyBhbmQgcGlubmVkIGNvbHVtbnNcbiAgICogdGhlcmVmb3JlIGNvbXBvc2Ug4oCUIGEgZnJvemVuIGNvcm5lciBjZWxsIHN0YXlzIGZyb3plbiBvbiBib3RoIGF4ZXMuXG4gICAqL1xuICBwcml2YXRlIHN5bmNQaW5uZWRSb3dzKHNjcm9sbExlZnQ6IG51bWJlcik6IHZvaWQge1xuXG4gICAgdGhpcy5waW5uZWRWaWV3cG9ydHM/LmZvckVhY2godmlld3BvcnQgPT4gKHZpZXdwb3J0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFjayBSZW5kZXJpbmcgUm93IE5vZGUgQnkgUm93IElEXG4gICAqL1xuICB0cmFja0J5Um93SWQoaW5kZXg6IG51bWJlciwgbm9kZTogT25lUm93Tm9kZTxUPik6IHN0cmluZyB7XG5cbiAgICByZXR1cm4gbm9kZS5yb3dJZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDZWxsIFNlbGVjdGlvbiBSYW5nZSBGZWF0dXJlXG4gICAqL1xuICBzdGFydFNlbGVjdGlvbihyb3dJZDogc3RyaW5nLCBmaWVsZDogc3RyaW5nKSB7XG5cbiAgICB0aGlzLmlzTW91c2VEb3duID0gdHJ1ZTtcbiAgICB0aGlzLnN0YXJ0Q2VsbCA9IHsgcm93SWQsIGZpZWxkIH07XG4gICAgdGhpcy5zZWxlY3RlZENlbGxzLmNsZWFyKCk7XG4gICAgdGhpcy5zZWxlY3RlZENlbGxzID0gbmV3IFNldCh0aGlzLnNlbGVjdGVkQ2VsbHMpLmFkZChnZXRDZWxsS2V5KHJvd0lkLCBmaWVsZCkpO1xuICB9XG5cbiAgZXh0ZW5kU2VsZWN0aW9uKHJvd0lkOiBzdHJpbmcsIGZpZWxkOiBzdHJpbmcpIHtcblxuICAgIGlmICghdGhpcy5pc01vdXNlRG93biB8fCAhdGhpcy5zdGFydENlbGwpIHJldHVybjtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLm5vZGVzOyAvLyBhbHJlYWR5IHNvcnRlZFxuICAgIGNvbnN0IHN0YXJ0Um93SW5kZXggPSByb3dzLmZpbmRJbmRleChyID0+IHIucm93SWQgPT09IHRoaXMuc3RhcnRDZWxsIS5yb3dJZCk7XG4gICAgY29uc3QgZW5kUm93SW5kZXggICA9IHJvd3MuZmluZEluZGV4KHIgPT4gci5yb3dJZCA9PT0gcm93SWQpO1xuXG4gICAgaWYgKHN0YXJ0Um93SW5kZXggPT09IC0xIHx8IGVuZFJvd0luZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3QgY29sU3RhcnRJbmRleCA9IHRoaXMuY29sdW1uRGVmcy5maW5kSW5kZXgoYyA9PiBjLmZpZWxkID09PSB0aGlzLnN0YXJ0Q2VsbCEuZmllbGQpO1xuICAgIGNvbnN0IGNvbEVuZEluZGV4ICAgPSB0aGlzLmNvbHVtbkRlZnMuZmluZEluZGV4KGMgPT4gYy5maWVsZCA9PT0gZmllbGQpO1xuXG4gICAgaWYgKGNvbFN0YXJ0SW5kZXggPT09IC0xIHx8IGNvbEVuZEluZGV4ID09PSAtMSkgcmV0dXJuO1xuXG4gICAgY29uc3Qgcm93U3RhcnQgPSBNYXRoLm1pbihzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgY29uc3Qgcm93RW5kICAgPSBNYXRoLm1heChzdGFydFJvd0luZGV4LCBlbmRSb3dJbmRleCk7XG4gICAgY29uc3QgY29sU3RhcnQgPSBNYXRoLm1pbihjb2xTdGFydEluZGV4LCBjb2xFbmRJbmRleCk7XG4gICAgY29uc3QgY29sRW5kICAgPSBNYXRoLm1heChjb2xTdGFydEluZGV4LCBjb2xFbmRJbmRleCk7XG5cbiAgICBjb25zdCBuZXh0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgICBmb3IgKGxldCByID0gcm93U3RhcnQ7IHIgPD0gcm93RW5kOyByKyspIHtcbiAgICAgIGZvciAobGV0IGMgPSBjb2xTdGFydDsgYyA8PSBjb2xFbmQ7IGMrKykge1xuICAgICAgICBuZXh0LmFkZChnZXRDZWxsS2V5KHJvd3Nbcl0ucm93SWQsIHRoaXMuY29sdW1uRGVmc1tjXS5maWVsZCkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuc2VsZWN0ZWRDZWxscyA9IG5leHQ7XG4gIH1cblxuXG4gIGVuZFNlbGVjdGlvbigpIHtcblxuICAgIHRoaXMuaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICB0aGlzLnN0YXJ0Q2VsbCA9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2xlYXIgQ2VsbHMgU2VsZWN0ZWRcbiAgICovXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcbiAgb25Eb2N1bWVudENsaWNrKGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5ib2R5UmVmPy5uYXRpdmVFbGVtZW50KSB7XG5cbiAgICAgIGNvbnN0IGNsaWNrZWRJbnNpZGUgPSB0aGlzLmJvZHlSZWYubmF0aXZlRWxlbWVudC5jb250YWlucyhldmVudC50YXJnZXQgYXMgTm9kZSk7XG5cbiAgICAgIGlmICghY2xpY2tlZEluc2lkZSkge1xuXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDZWxscy5jbGVhcigpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3Rpb24gUmFuZ2UgRXZlbnQgSG9sZCBNb3VzZSBDbGlja1xuICAgKi9cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2V1cCcpXG4gIG9uR2xvYmFsTW91c2VVcCgpIHtcblxuICAgIHRoaXMuZW5kU2VsZWN0aW9uKCk7XG4gIH1cblxuICAvKipcbiAgICogTGlzdGVuIENvcHkgQ2xpcGJvYXJkIEV2ZW50XG4gICAqL1xuICBvbkdyaWRDb3B5KGV2ZW50OiBDbGlwYm9hcmRFdmVudCkge1xuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGlmICh0aGlzLnNlbGVjdGVkQ2VsbHMuc2l6ZSA+IDApIHtcblxuICAgICAgY29uc3QgdGV4dCA9IHRoaXMuYnVpbGRDbGlwYm9hcmRUZXh0KCk7XG5cbiAgICAgIGV2ZW50LmNsaXBib2FyZERhdGE/LnNldERhdGEoJ3RleHQvcGxhaW4nLCB0ZXh0KTtcblxuICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLmZvckVhY2goY2VsbElkID0+IHtcblxuICAgICAgICBjb25zdCBjZWxsRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLWNlbGwtaWQ9XCIke2NlbGxJZH1cIl1gKTtcblxuICAgICAgICBpZiAoY2VsbEVsZW1lbnQpIHtcblxuICAgICAgICAgIGNlbGxFbGVtZW50LmNsYXNzTGlzdC5hZGQoJ29uZS1jZWxsLWNvcGllZCcpO1xuXG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiBjZWxsRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdvbmUtY2VsbC1jb3BpZWQnKSwgNDAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgY29weVRvQ2xpcGJvYXJkKHZhbHVlOiBzdHJpbmcpIHtcblxuICAgIGlmIChuYXZpZ2F0b3IuY2xpcGJvYXJkPy53cml0ZVRleHQpIHtcblxuICAgICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodmFsdWUpO1xuXG4gICAgfSBlbHNlIHtcblxuICAgICAgLy8gRmFsbGJhY2sgKFNhZmFyaSAvIG9sZGVyIGJyb3dzZXJzKVxuICAgICAgY29uc3QgdGV4dGFyZWEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZXh0YXJlYScpO1xuICAgICAgdGV4dGFyZWEudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHRleHRhcmVhLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJztcbiAgICAgIHRleHRhcmVhLnN0eWxlLm9wYWNpdHkgPSAnMCc7XG4gICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRleHRhcmVhKTtcbiAgICAgIHRleHRhcmVhLnNlbGVjdCgpO1xuICAgICAgZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTtcbiAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGV4dGFyZWEpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZCBDb3B5IENlbGwgVGV4dCB0byBDbGlwYm9hcmRcbiAgICovXG4gIHByaXZhdGUgYnVpbGRDbGlwYm9hcmRUZXh0KCk6IHN0cmluZyB7XG5cbiAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDZWxscy5zaXplKSByZXR1cm4gJyc7XG5cbiAgICAvLyBQYXJzZSBzZWxlY3RlZCBjZWxsc1xuICAgIGNvbnN0IHNlbGVjdGVkID0gQXJyYXkuZnJvbSh0aGlzLnNlbGVjdGVkQ2VsbHMpLm1hcChrZXkgPT4ge1xuXG4gICAgICBjb25zdCBbcm93SWQsIGZpZWxkXSA9IGtleS5zcGxpdCgnLS0nKTtcbiAgICAgIHJldHVybiB7IHJvd0lkLCBmaWVsZCB9O1xuICAgIH0pO1xuXG4gICAgLy8gUmVzb2x2ZSB2aXN1YWwgcm93IGluZGV4ZXMgZnJvbSBkaXNwbGF5ZWRSb3dzXG4gICAgY29uc3Qgcm93SW5kZXhlcyA9IHNlbGVjdGVkXG4gICAgICAubWFwKHMgPT4gdGhpcy5ub2Rlcy5maW5kSW5kZXgociA9PiByLnJvd0lkID09PSBzLnJvd0lkKSlcbiAgICAgIC5maWx0ZXIoaSA9PiBpICE9PSAtMSk7XG5cbiAgICBjb25zdCBjb2xJbmRleGVzID0gc2VsZWN0ZWRcbiAgICAgIC5tYXAocyA9PiB0aGlzLmNvbHVtbkRlZnMuZmluZEluZGV4KGMgPT4gYy5maWVsZCA9PT0gcy5maWVsZCkpXG4gICAgICAuZmlsdGVyKGkgPT4gaSAhPT0gLTEpO1xuXG4gICAgaWYgKCFyb3dJbmRleGVzLmxlbmd0aCB8fCAhY29sSW5kZXhlcy5sZW5ndGgpIHJldHVybiAnJztcblxuICAgIGNvbnN0IHJvd1N0YXJ0ID0gTWF0aC5taW4oLi4ucm93SW5kZXhlcyk7XG4gICAgY29uc3Qgcm93RW5kICAgPSBNYXRoLm1heCguLi5yb3dJbmRleGVzKTtcbiAgICBjb25zdCBjb2xTdGFydCA9IE1hdGgubWluKC4uLmNvbEluZGV4ZXMpO1xuICAgIGNvbnN0IGNvbEVuZCAgID0gTWF0aC5tYXgoLi4uY29sSW5kZXhlcyk7XG5cbiAgICBjb25zdCBzZWxlY3RlZEZpZWxkcyA9IHRoaXMuY29sdW1uRGVmc1xuICAgICAgLnNsaWNlKGNvbFN0YXJ0LCBjb2xFbmQgKyAxKVxuICAgICAgLm1hcChjID0+IGMuZmllbGQpO1xuXG4gICAgY29uc3QgY2xpcGJvYXJkTGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBmb3IgKGxldCByID0gcm93U3RhcnQ7IHIgPD0gcm93RW5kOyByKyspIHtcblxuICAgICAgY29uc3Qgcm93ID0gdGhpcy5ub2Rlc1tyXTtcbiAgICAgIGNvbnN0IGxpbmUgPSBzZWxlY3RlZEZpZWxkc1xuICAgICAgICAubWFwKGZpZWxkID0+IHtcblxuICAgICAgICAgIGNvbnN0IGtleSA9IGAke3Jvdy5yb3dJZH0tLSR7ZmllbGR9YDtcblxuICAgICAgICAgIGlmICghdGhpcy5zZWxlY3RlZENlbGxzLmhhcyhrZXkpKSB7XG5cbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKHJvdy5kYXRhLCBmaWVsZCk7XG5cbiAgICAgICAgICByZXR1cm4gdmFsdWUgPz8gJyc7XG5cbiAgICAgICAgfSkuam9pbignXFx0Jyk7XG5cbiAgICAgIGNsaXBib2FyZExpbmVzLnB1c2gobGluZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBib2FyZExpbmVzLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRpbmcgRXZlbnRzIFJvdyBBY3Rpb24gdG8gUGFyZW50XG4gICAqL1xuICBpbnZva2VSb3dBY3Rpb25Hb3RvRGV0YWlsKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dHb3RvRGV0YWlsLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQWRkTmV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dBZGROZXcuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25WaWV3KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dWaWV3LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uTG9jYXRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0xvY2F0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRG9jdW1lbnQoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0RvY3VtZW50LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uQ29weShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93Q29weS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkRlbGV0ZShldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RGVsZXRlLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uR290b0xpc3QoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0dvdG9MaXN0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgaW52b2tlUm93QWN0aW9uRWRpdChldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93RWRpdC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblByaW50KGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dQcmludC5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkhpc3RvcnkoZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd0hpc3RvcnkuZW1pdChldmVudCk7XG4gIH1cblxuICBpbnZva2VSb3dBY3Rpb25PcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgdGhpcy5vblJvd09wdGlvbi5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvbkxhbmd1YWdlKGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQ8VD4pIHtcblxuICAgIHRoaXMub25Sb3dMYW5ndWFnZS5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPcGVuIHRoZSBjZWxsIG9wdGlvbiBtZW51LCBhbmQgdGVsbCB0aGUgaG9zdCBpdCB3YXMgYXNrZWQgZm9yLlxuICAgKlxuICAgKiBUaGUgb3BlbmluZyBpcyB0aGUgcGFydCB0aGF0IHdhcyBtaXNzaW5nLiBFdmVyeXRoaW5nIGVsc2UgZXhpc3RlZCDigJQgdGhlXG4gICAqIHRyaWdnZXIgYnV0dG9uIGJlaGluZCBgY2VsbFJlbmRlcmVyUGFyYW1zLmNlbGxPcHRpb25CdXR0b25TdGF0dXNgLCB0aGUgbWVudVxuICAgKiBjb21wb25lbnQsIHRoZSBgY2VsbE9wdGlvbk1lbnVgIGNvbHVtbiBwcm9wZXJ0eSwgdGhlIHNlbGVjdGlvbiBldmVudCB3aXJlZFxuICAgKiB0aHJvdWdoIHRvIHRoZSBncmlkJ3Mgb3V0cHV0IOKAlCBidXQgbm90aGluZyBldmVyIHNldCB0aGUgZmxhZyB0aGUgdGVtcGxhdGVcbiAgICogcmVuZGVycyBvbiwgc28gdGhlIGJ1dHRvbiBkaWQgbm90aGluZyBhdCBhbGwuXG4gICAqXG4gICAqIERvbmUgaGVyZSByYXRoZXIgdGhhbiBpbiB0aGUgcm93LWFjdGlvbiBjb21wb25lbnQgYmVjYXVzZSB0aGlzIGlzIHRoZVxuICAgKiBjb21wb25lbnQgd2hvc2UgdGVtcGxhdGUgcmVuZGVycyB0aGUgbWVudSwgYW5kIHNvIHRoZSBvbmUgdGhhdCBoYXMgdG8gYmVcbiAgICogbWFya2VkIGZvciBjaGVjay5cbiAgICovXG4gIGludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oZXZlbnQ6IE9uZUdyaWRSb3dBY3Rpb25FdmVudDxUPikge1xuXG4gICAgY29uc3QgZmllbGQgPSBldmVudC5jb2x1bW4/LmZpZWxkIGFzIHN0cmluZztcblxuICAgIC8vIE5vdGhpbmcgdG8gb3BlbiB3aGVuIHRoZSBjb2x1bW4gZGVjbGFyZWQgbm8gb3B0aW9uczsgdGhlIGV2ZW50IHN0aWxsXG4gICAgLy8gZ29lcyB0byB0aGUgaG9zdCwgd2hpY2ggbWF5IGJlIGRyaXZpbmcgc29tZXRoaW5nIG9mIGl0cyBvd24uXG4gICAgaWYgKGZpZWxkICYmIGV2ZW50Lm5vZGUgJiYgZXZlbnQuY29sdW1uPy5jZWxsT3B0aW9uTWVudT8ubGVuZ3RoKSB7XG5cbiAgICAgIGV2ZW50Lm5vZGUuY2VsbE9wdGlvbnNbZmllbGRdID0gdHJ1ZTtcblxuICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgfVxuXG4gICAgdGhpcy5vblJvd0NlbGxPcHRpb24uZW1pdChldmVudCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIG1lbnUgY2xvc2VkIGl0c2VsZiDigJQgb24gc2VsZWN0LCBvbiBFc2NhcGUsIG9yIG9uIGEgY2xpY2sgb3V0c2lkZS4gSXRcbiAgICogaGFzIGFscmVhZHkgY2xlYXJlZCBpdHMgb3duIGZsYWc7IHRoaXMgaXMgd2hhdCByZXBhaW50cyB3aXRob3V0IGl0LlxuICAgKi9cbiAgY2VsbE9wdGlvbk1lbnVDbG9zZWQoKTogdm9pZCB7XG5cbiAgICB0aGlzLmNkci5tYXJrRm9yQ2hlY2soKTtcbiAgfVxuXG4gIGludm9rZVJvd0FjdGlvblNlbGVjdGlvbihldmVudDogT25lR3JpZFJvd0FjdGlvbkV2ZW50PFQ+KSB7XG5cbiAgICB0aGlzLm9uUm93U2VsZWN0aW9uLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvZ2dsZSBhIGdyb3VwIC8gbWFzdGVyIHJvdywgdGhlbiByZXBvcnQgdGhlIHJlc3VsdC5cbiAgICpcbiAgICogVGhlIGdyb3VwIHJlbmRlcmVyIGlzIHByZXNlbnRhdGlvbmFsOiBpdCBzYXlzIFwidGhlIGV4cGFuZGVyIHdhcyBjbGlja2VkXCJcbiAgICogYW5kIG5vdGhpbmcgbW9yZS4gUGVyZm9ybWluZyB0aGUgc3RhdGUgY2hhbmdlIGJlbG9uZ3MgaGVyZSwgd2hlcmUgdGhlIEFQSVxuICAgKiBpcyBhdmFpbGFibGUuIFByZXZpb3VzbHkgdGhpcyBtZXRob2Qgb25seSByZS1lbWl0dGVkLCBzbyB0aGUgZXhwYW5kZXJcbiAgICogcmVuZGVyZWQsIGFuaW1hdGVkIG9uIGhvdmVyIGFuZCBkaWQgbm90aGluZyBhdCBhbGwg4oCUIGV2ZXJ5IGNvbnN1bWVyIGhhZCB0b1xuICAgKiBkaXNjb3ZlciBmb3IgaXRzZWxmIHRoYXQgYGV4cGFuc2lvbkNoYW5nZWRgIHdhcyBhIHJlcXVlc3QgcmF0aGVyIHRoYW4gdGhlXG4gICAqIG5vdGlmaWNhdGlvbiBpdHMgcGFzdC10ZW5zZSBuYW1lIHByb21pc2VzLlxuICAgKlxuICAgKiBUaGUgZXZlbnQgaXMgcmUtZW1pdHRlZCAqYWZ0ZXIqIHRoZSB0b2dnbGUsIHNvIGBldmVudC5ub2RlLmV4cGFuZGVkYCBpcyB0aGVcbiAgICogbmV3IHN0YXRlLCB3aGljaCBpcyB3aGF0IGEgcGFzdC10ZW5zZSBldmVudCBzaG91bGQgY2FycnkuXG4gICAqL1xuICBpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soZXZlbnQ6IEV4cGFuc2lvbkNoYW5nZWRFdmVudCk6IHZvaWQge1xuXG4gICAgY29uc3Qgbm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKGV2ZW50Lm5vZGUucm93SWQpID8/IGV2ZW50Lm5vZGU7XG5cbiAgICB0aGlzLmFwaS5zZXRFeHBhbmRlZEJ5SWQobm9kZS5yb3dJZCwgIW5vZGUuZXhwYW5kZWQpO1xuXG4gICAgdGhpcy5leHBhbnNpb25DaGFuZ2VkLmVtaXQoeyAuLi5ldmVudCwgbm9kZSwgYXBpOiB0aGlzLmFwaSB9KTtcbiAgfVxuXG4gIGNlbGxPcHRpb25NZW51U2VsZWN0ZWQoZXZlbnQ6IENlbGxPcHRpb25NZW51U2VsZWN0ZWRFdmVudCkge1xuXG4gICAgdGhpcy5jZWxsT3B0aW9uU2VsZWN0LmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwZWNpYWwgRXZlbnRzXG4gICAqL1xuICBwcml2YXRlIGludm9rZVNoaWZ0RG91YmxlQ2xpY2sobm9kZTpPbmVSb3dOb2RlLCBjb2x1bW46IE9uZUNvbHVtbkRlZik6IHZvaWQge1xuXG4gICAgbGV0IGV2ZW50OiBPbmVHcmlkUm93QWN0aW9uRXZlbnQgPSB7IG5vZGUsIGNvbHVtbiwgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgZ3JpZFR5cGU6IG51bGwgfTtcblxuICAgIGlmICh0aGlzLm1hc3RlckRldGFpbCkge1xuXG4gICAgICBldmVudCA9IHsgLi4uZXZlbnQsIGdyaWRUeXBlOiB0aGlzLmdyaWRUeXBlLCBtYXN0ZXJOb2RlOiB0aGlzLm1hc3Rlck5vZGUgfTtcbiAgICB9XG5cbiAgICB0aGlzLm9uU2hpZnREb3VibGVDbGljay5lbWl0KGV2ZW50KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDZWxsIEVkaXQgRmVhdHVyZVxuICAgKi9cbiAgc3RhcnRFZGl0KGV2ZW50OiBNb3VzZUV2ZW50LCBub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPikge1xuXG4gICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuXG4gICAgaWYgKHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpJykge1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG5cbiAgICAgIHRoaXMuaW52b2tlU2hpZnREb3VibGVDbGljayhub2RlLCBjb2x1bW4pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5jZWxsRWRpdGFibGVQaXBlLnRyYW5zZm9ybShub2RlLmNlbGxTdGF0ZXMsIGNvbHVtbiwgbm9kZSwgdGhpcy5jZWxsU2VydmljZS5lZGl0YWJsZUZuLCB0aGlzLmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuLCB0aGlzLmFsbG93ZWRFZGl0KSkge1xuXG4gICAgICB0aGlzLnNlbGVjdGVkQ2VsbHMuY2xlYXIoKTtcblxuICAgICAgY29uc3QgY2VsbEtleSA9IGdldENlbGxLZXkobm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkKTtcblxuICAgICAgdGhpcy5zZWxlY3RlZENlbGxzLmFkZChjZWxsS2V5KTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCByb3dOb2RlOiBPbmVSb3dOb2RlID0gdGhpcy5hcGkuZ2V0Um93Tm9kZUJ5SWQobm9kZS5yb3dJZCk7XG5cbiAgICBpZiAocm93Tm9kZSkge1xuXG4gICAgICBpZiAodGhpcy5lZGl0VHlwZSA9PT0gJ2Z1bGxSb3cnKSB7XG5cbiAgICAgICAgLy8gVGhlIHdob2xlIHJvdyBlZGl0cyB0b2dldGhlciwgc28gZXZlcnkgY2VsbCB0aGF0IHdvdWxkIGFjY2VwdCBpdHNcbiAgICAgICAgLy8gb3duIGRvdWJsZS1jbGljayBvcGVucyBub3cuIFRoZSBjbGlja2VkIG9uZSBzdGlsbCB0YWtlcyBmb2N1cyBiZWxvdy5cbiAgICAgICAgZm9yIChjb25zdCBjb2wgb2YgdGhpcy5jb2x1bW5EZWZzKSB7XG5cbiAgICAgICAgICBpZiAoIWNvbC5maWVsZCkgY29udGludWU7XG5cbiAgICAgICAgICBpZiAodGhpcy5jZWxsRWRpdGFibGVQaXBlLnRyYW5zZm9ybShyb3dOb2RlLmNlbGxTdGF0ZXMsIGNvbCwgcm93Tm9kZSwgdGhpcy5jZWxsU2VydmljZS5lZGl0YWJsZUZuLCB0aGlzLmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuLCB0aGlzLmFsbG93ZWRFZGl0KSkge1xuXG4gICAgICAgICAgICByb3dOb2RlLmVkaXRpbmdbY29sLmZpZWxkXSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgcm93Tm9kZS5lZGl0aW5nW2NvbHVtbi5maWVsZF0gPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcblxuICAgICAgICBjb25zdCBpbnB1dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3I8SFRNTElucHV0RWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50PihgW2RhdGEtY2VsbC1pZD1cIiR7IGdldENlbGxLZXkobm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkKSB9XCJdIGlucHV0LCBbZGF0YS1jZWxsLWlkPVwiJHsgZ2V0Q2VsbEtleShub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpIH1cIl0gc2VsZWN0YCk7XG5cbiAgICAgICAgaWYgKGlucHV0KSB7XG5cbiAgICAgICAgICBpbnB1dC5mb2N1cygpO1xuXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBpbnB1dC52YWx1ZTtcblxuICAgICAgICAgIC8vIEEgc2VsZWN0IHJlcG9ydHMgdHlwZSAnc2VsZWN0LW9uZScsIHNvIG9ubHkgYSB0ZXh0IGlucHV0IGdldHMgaXRzXG4gICAgICAgICAgLy8gY2FyZXQgcGxhY2VkLlxuICAgICAgICAgIGlmICh2YWx1ZSAmJiBbXCJ0ZXh0XCJdLmluY2x1ZGVzKGlucHV0LnR5cGUpICYmICdzZXRTZWxlY3Rpb25SYW5nZScgaW4gaW5wdXQpIHtcblxuICAgICAgICAgICAgaW5wdXQuc2V0U2VsZWN0aW9uUmFuZ2UodmFsdWUubGVuZ3RoLCB2YWx1ZS5sZW5ndGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sIDEwKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2F2ZSBDZWxsIEVkaXQgTW9kZVxuICAgKi9cbiAgc3RvcEVkaXQobm9kZTogT25lUm93Tm9kZTxUPiwgY29sdW1uOiBPbmVDb2x1bW5EZWY8VD4sIGV2ZW50OiBhbnkpIHtcblxuICAgIGlmICh0aGlzLmVkaXRUeXBlID09PSAnZnVsbFJvdycpIHtcblxuICAgICAgdGhpcy5zdG9wUm93RWRpdEZyb21FdmVudChub2RlLCBldmVudCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBsZXQgcm93Tm9kZTogT25lUm93Tm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgLy8gVGhlIGVkaXRpbmcgZ3VhcmQgbWFrZXMgYSBzZWNvbmQgY29tbWl0IGZvciBvbmUgZWRpdCBhIG5vLW9wOiBhIHNlbGVjdFxuICAgIC8vIGNvbW1pdHMgb24gKGNoYW5nZSksIHdoaWNoIGNsb3NlcyB0aGUgZWRpdG9yLCBhbmQgdGhlIChibHVyKSB0aGF0IGNhblxuICAgIC8vIGZvbGxvdyBtdXN0IG5vdCBjb21taXQgYWdhaW4uXG4gICAgaWYgKHJvd05vZGUgJiYgcm93Tm9kZS5lZGl0aW5nW2NvbHVtbi5maWVsZF0pIHtcblxuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZSA/PyAnJztcbiAgICAgIGNvbnN0IG9sZFZhbHVlID0gcm93Tm9kZS5kYXRhW2NvbHVtbi5maWVsZF07XG5cbiAgICAgIHRoaXMuc2V0Q2VsbFZhbHVlQnlSb3dJZChub2RlLnJvd0lkLCBjb2x1bW4sIHZhbHVlKTtcblxuICAgICAgdGhpcy5maW5pc2hFZGl0KHJvd05vZGUsIGNvbHVtbiwgb2xkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIGEgYHNlbGVjdGAgZWRpdG9yJ3MgY2hvaWNlLlxuICAgKlxuICAgKiBTZXBhcmF0ZSBmcm9tIGBzdG9wRWRpdGAgYmVjYXVzZSB0aGUgdmFsdWUgaXMgbm90IHRoZSBlbGVtZW50J3Mgc3RyaW5nOlxuICAgKiB0aGUgY2hvc2VuIGluZGV4IG1hcHMgYmFjayBpbnRvIGBzZWxlY3RPcHRpb25zYCwgc28gdGhlIGNvbW1pdHRlZCB2YWx1ZVxuICAgKiBrZWVwcyB3aGF0ZXZlciB0eXBlIHRoZSBvcHRpb24gZGVjbGFyZWQuXG4gICAqL1xuICBzdG9wRWRpdFNlbGVjdChub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPiwgZXZlbnQ6IGFueSkge1xuXG4gICAgaWYgKHRoaXMuZWRpdFR5cGUgPT09ICdmdWxsUm93Jykge1xuXG4gICAgICAvLyAoY2hhbmdlKSBpcyBub3QgYSBjb21taXQgaW4gZnVsbC1yb3cgbW9kZSDigJQgdGhlIGNob2ljZSBzaXRzIGluIHRoZVxuICAgICAgLy8gc2VsZWN0IHVudGlsIHRoZSByb3cgY29tbWl0cyBhbmQgcmVhZHMgZXZlcnkgZWRpdG9yIGF0IG9uY2UuIE9ubHkgYVxuICAgICAgLy8gYmx1ciB0aGF0IGFjdHVhbGx5IGxlYXZlcyB0aGUgcm93IGNsb3NlcyBpdC5cbiAgICAgIGlmIChldmVudC50eXBlID09PSAnYmx1cicpIHRoaXMuc3RvcFJvd0VkaXRGcm9tRXZlbnQobm9kZSwgZXZlbnQpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHJvd05vZGU6IE9uZVJvd05vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChub2RlLnJvd0lkKTtcblxuICAgIGlmIChyb3dOb2RlICYmIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdKSB7XG5cbiAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICBjb25zdCBvcHRpb25zID0gY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LnNlbGVjdE9wdGlvbnMgPz8gW107XG4gICAgICBjb25zdCBvcHRpb24gPSBvcHRpb25zWyhldmVudC50YXJnZXQgYXMgSFRNTFNlbGVjdEVsZW1lbnQpLnNlbGVjdGVkSW5kZXhdO1xuXG4gICAgICBpZiAoIW9wdGlvbikgcmV0dXJuO1xuXG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHJvd05vZGUuZGF0YVtjb2x1bW4uZmllbGRdO1xuXG4gICAgICByb3dOb2RlLmRhdGFbY29sdW1uLmZpZWxkXSA9IG9wdGlvbi52YWx1ZTtcblxuICAgICAgdGhpcy5maW5pc2hFZGl0KHJvd05vZGUsIGNvbHVtbiwgb2xkVmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBDbG9zZSB0aGUgZWRpdG9yIGFuZCBhbm5vdW5jZSB0aGUgY29tbWl0LiBTaGFyZWQgYnkgYm90aCBlZGl0b3Iga2luZHMuICovXG4gIHByaXZhdGUgZmluaXNoRWRpdChyb3dOb2RlOiBPbmVSb3dOb2RlLCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPiwgb2xkVmFsdWU6IGFueSkge1xuXG4gICAgY29uc3QgbmV3VmFsdWUgPSByb3dOb2RlLmRhdGFbY29sdW1uLmZpZWxkXTtcblxuICAgIHJvd05vZGUuY2VsbFN0YXRlcyA9IHRoaXMuY2VsbFNlcnZpY2UuZ2VuZXJhdGVDZWxsU3RhdGVzKHJvd05vZGUpO1xuICAgIHJvd05vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdID0gZmFsc2U7XG5cbiAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsU3RhdGVDaGFuZ2VkJywge1xuICAgICAgZGF0YTogcm93Tm9kZS5kYXRhLFxuICAgICAgbm9kZTogcm93Tm9kZSxcbiAgICAgIGNvbHVtbjogY29sdW1uXG4gICAgfSk7XG5cbiAgICAvLyBDb21wYXJlZCBhZnRlciBub3JtYWxpc2F0aW9uICgnJyAtPiBudWxsLCBudW1iZXIgY29lcmNpb24pLCBzbyBhIGJsdXJcbiAgICAvLyB0aGF0IGxlYXZlcyB0aGUgdmFsdWUgYXMgaXQgd2FzIGRvZXMgbm90IGFubm91bmNlIGFuIGVkaXQuXG4gICAgaWYgKG5ld1ZhbHVlICE9PSBvbGRWYWx1ZSkge1xuXG4gICAgICB0aGlzLmV2ZW50U2VydmljZS5kaXNwYXRjaEV2ZW50KCdjZWxsVmFsdWVDaGFuZ2VkJywge1xuICAgICAgICBub2RlOiByb3dOb2RlLFxuICAgICAgICBkYXRhOiByb3dOb2RlLmRhdGEsXG4gICAgICAgIGNvbHVtbjogY29sdW1uLFxuICAgICAgICBmaWVsZDogY29sdW1uLmZpZWxkLFxuICAgICAgICBvbGRWYWx1ZSxcbiAgICAgICAgbmV3VmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FuY2VsIENlbGwgRWRpdCBNb2RlXG4gICAqL1xuICBjYW5jZWxFZGl0KG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KSB7XG5cbiAgICBsZXQgcm93Tm9kZTogT25lUm93Tm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKHJvd05vZGUpIHtcblxuICAgICAgaWYgKHRoaXMuZWRpdFR5cGUgPT09ICdmdWxsUm93Jykge1xuXG4gICAgICAgIC8vIEVzY2FwZSBhYmFuZG9ucyB0aGUgd2hvbGUgcm93OiBldmVyeSBlZGl0b3IgY2xvc2VzLCBub3RoaW5nIGNvbW1pdHMuXG4gICAgICAgIE9iamVjdC5rZXlzKHJvd05vZGUuZWRpdGluZykuZm9yRWFjaChmaWVsZCA9PiByb3dOb2RlLmVkaXRpbmdbZmllbGRdID0gZmFsc2UpO1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcm93Tm9kZS5lZGl0aW5nW2NvbHVtbi5maWVsZF0gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRnVsbC1yb3cgY29tbWl0LCByb3V0ZWQgZnJvbSBhbnkgb25lIGVkaXRvcidzIEVudGVyIG9yIGJsdXIuXG4gICAqXG4gICAqIEEgYmx1ciB0aGF0IGxhbmRzIG9uIGFub3RoZXIgZWRpdG9yIGluIHRoZSBzYW1lIHJvdyBpcyB0aGUgdXNlciB0YWJiaW5nXG4gICAqIGJldHdlZW4gZmllbGRzLCBub3QgbGVhdmluZyB0aGUgcm93IOKAlCB0aGUgZWRpdG9ycyBzdGF5IG9wZW4gYW5kIHRoZWlyXG4gICAqIHR5cGVkIHZhbHVlcyBzdGF5IGluIHRoZSBET00gdW50aWwgdGhlIHJvdyBjb21taXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBzdG9wUm93RWRpdEZyb21FdmVudChub2RlOiBPbmVSb3dOb2RlPFQ+LCBldmVudDogYW55KSB7XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2JsdXInKSB7XG5cbiAgICAgIGNvbnN0IG5leHQgPSAoZXZlbnQgYXMgRm9jdXNFdmVudCkucmVsYXRlZFRhcmdldCBhcyBIVE1MRWxlbWVudCB8IG51bGw7XG5cbiAgICAgIGlmIChuZXh0Py5tYXRjaGVzPy4oJ2lucHV0Lm9uZS1jZWxsLWlucHV0LCBzZWxlY3Qub25lLWNlbGwtaW5wdXQnKVxuICAgICAgICAmJiBuZXh0LmNsb3Nlc3Q/LihgW2RhdGEtY2VsbC1pZF49XCIke25vZGUucm93SWR9LS1cIl1gKSkge1xuXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdD8uKCk7XG4gICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uPy4oKTtcblxuICAgIHRoaXMuc3RvcFJvd0VkaXQobm9kZSk7XG4gIH1cblxuICAvKiogQ29tbWl0IGV2ZXJ5IG9wZW4gZWRpdG9yIG9mIG9uZSByb3csIHJlYWRpbmcgZWFjaCBmcm9tIHRoZSBET00uICovXG4gIHByaXZhdGUgc3RvcFJvd0VkaXQobm9kZTogT25lUm93Tm9kZTxUPikge1xuXG4gICAgY29uc3Qgcm93Tm9kZTogT25lUm93Tm9kZSA9IHRoaXMuYXBpLmdldFJvd05vZGVCeUlkKG5vZGUucm93SWQpO1xuXG4gICAgaWYgKCFyb3dOb2RlKSByZXR1cm47XG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiB0aGlzLmNvbHVtbkRlZnMpIHtcblxuICAgICAgY29uc3QgZmllbGQgPSBjb2x1bW4uZmllbGQgYXMgc3RyaW5nO1xuXG4gICAgICBpZiAoIWZpZWxkIHx8ICFyb3dOb2RlLmVkaXRpbmdbZmllbGRdKSBjb250aW51ZTtcblxuICAgICAgY29uc3Qga2V5ID0gZ2V0Q2VsbEtleShyb3dOb2RlLnJvd0lkLCBmaWVsZCk7XG4gICAgICBjb25zdCBlZGl0b3IgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yPEhUTUxJbnB1dEVsZW1lbnQgfCBIVE1MU2VsZWN0RWxlbWVudD4oXG4gICAgICAgIGBbZGF0YS1jZWxsLWlkPVwiJHtrZXl9XCJdIGlucHV0LCBbZGF0YS1jZWxsLWlkPVwiJHtrZXl9XCJdIHNlbGVjdGApO1xuXG4gICAgICBjb25zdCBvbGRWYWx1ZSA9IHJvd05vZGUuZGF0YVtmaWVsZF07XG5cbiAgICAgIGlmIChlZGl0b3I/LnRhZ05hbWUgPT09ICdTRUxFQ1QnKSB7XG5cbiAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGNvbHVtbi5jZWxsUmVuZGVyZXJQYXJhbXM/LnNlbGVjdE9wdGlvbnMgPz8gW107XG4gICAgICAgIGNvbnN0IG9wdGlvbiA9IG9wdGlvbnNbKGVkaXRvciBhcyBIVE1MU2VsZWN0RWxlbWVudCkuc2VsZWN0ZWRJbmRleF07XG5cbiAgICAgICAgaWYgKG9wdGlvbikgcm93Tm9kZS5kYXRhW2ZpZWxkXSA9IG9wdGlvbi52YWx1ZTtcblxuICAgICAgfSBlbHNlIGlmIChlZGl0b3IpIHtcblxuICAgICAgICBjb25zdCByYXcgPSBlZGl0b3IudmFsdWUgPz8gJyc7XG5cbiAgICAgICAgcm93Tm9kZS5kYXRhW2ZpZWxkXSA9IHJhdyA9PT0gJydcbiAgICAgICAgICA/IG51bGxcbiAgICAgICAgICA6IGNvbHVtbi5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ251bWJlcicgPyBOdW1iZXIocmF3KSA6IHJhdztcbiAgICAgIH1cblxuICAgICAgLy8gZmluaXNoRWRpdCBjbG9zZXMgdGhlIGVkaXRvciwgcmVmcmVzaGVzIHRoZSBjZWxsIHN0YXRlIGFuZCByYWlzZXNcbiAgICAgIC8vIGNlbGxWYWx1ZUNoYW5nZWQgd2hlbiB0aGUgdmFsdWUgbW92ZWQg4oCUIG9uZSBldmVudCBwZXIgY2hhbmdlZCBjZWxsLFxuICAgICAgLy8gdGhlIHNhbWUgY29udHJhY3QgYXMgc2luZ2xlLWNlbGwgZWRpdGluZy5cbiAgICAgIHRoaXMuZmluaXNoRWRpdChyb3dOb2RlLCBjb2x1bW4sIG9sZFZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2V0IENlbGwgVmFsdWVcbiAgICovXG4gIHNldENlbGxWYWx1ZUJ5Um93SWQocm93SWQ6IHN0cmluZywgY29sdW1uOiBPbmVDb2x1bW5EZWYsIHZhbHVlOiBhbnkpIHtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLmFwaS5nZXRSb3dOb2RlQnlJZChyb3dJZCk7XG5cbiAgICBpZiAobm9kZSAmJiBjb2x1bW4uZmllbGQpIHtcblxuICAgICAgaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5pbnB1dFR5cGUgIT09ICdudW1iZXInKSB7XG5cbiAgICAgICAgbm9kZS5kYXRhW2NvbHVtbi5maWVsZF0gPSB2YWx1ZSA9PT0gJycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgbm9kZS5kYXRhW2NvbHVtbi5maWVsZF0gPSB2YWx1ZSA9PT0gJycgPyBudWxsIDogTnVtYmVyKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmlydHVhbCBTY3JvbGwgUHJvcGVydGllc1xuICAgKlxuICAgKiBUaGUgYnVmZmVyIHNjYWxlcyB3aXRoIHRoZSByb3cgY291bnQgc28gc21hbGwgZ3JpZHMgcmVuZGVyIGluIG9uZSBwYXNzLCBidXRcbiAgICogaXQgaXMgY2FwcGVkOiBgaXRlbVNpemUgKiBpdGVtcyAqIDEuNWAgaXMgMS41eCB0aGUgKnRvdGFsKiBjb250ZW50IGhlaWdodCxcbiAgICogYW5kIENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGwgZXhwYW5kcyBpdHMgcmVuZGVyZWQgcmFuZ2UgdW50aWwgdGhlIGJ1ZmZlciBpc1xuICAgKiBzYXRpc2ZpZWQuIFVuY2FwcGVkLCB0aGF0IG1ha2VzIHRoZSB2aWV3cG9ydCBtYXRlcmlhbGlzZSBldmVyeSByb3cgYW5kXG4gICAqIHZpcnR1YWwgc2Nyb2xsaW5nIHN0b3BzIGRvaW5nIGFueXRoaW5nIGF0IGFsbCAoMTAwayByb3dzIGxvY2tlZCB0aGUgdGFiKS5cbiAgICogTUFYX0JVRkZFUl9QWCBrZWVwcyByb3VnaGx5IHR3ZW50eSByb3dzIG9mIG92ZXJzY2FuIGVpdGhlciBzaWRlIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9CVUZGRVJfUFg6IG51bWJlciA9IDYwMDtcblxuICBzZXRWaXJ0dWFsU2Nyb2xsKGl0ZW1zOiBudW1iZXIgPSAwKTogdm9pZCB7XG5cbiAgICB0aGlzLm1pbkJ1ZmZlclB4ID0gTWF0aC5taW4odGhpcy5pdGVtU2l6ZSAqIGl0ZW1zICogMS41LCB0aGlzLk1BWF9CVUZGRVJfUFgpO1xuXG4gICAgdGhpcy5tYXhCdWZmZXJQeCA9IHRoaXMubWluQnVmZmVyUHggKiAyO1xuICB9XG5cbiAgLyoqXG4gICAqIFVuc3Vic2NyaWJlIEFsbCBTdWJzY3JpcHRpb25zXG4gICAqL1xuICAvKipcbiAgICogSGFuZCB0aGUgZHJhZyBzZXJ2aWNlIHdoYXQgaXQgbmVlZHMgdG8gcnVuIGEgZ2VzdHVyZS5cbiAgICpcbiAgICogRGVmZXJyZWQgdG8gaGVyZSBiZWNhdXNlIHRoZSB2aWV3cG9ydCBlbGVtZW50IGRvZXMgbm90IGV4aXN0IHVudGlsIHRoZSB2aWV3XG4gICAqIGlzIHVwLCBhbmQgYG5vZGVzYCBpcyBwYXNzZWQgYXMgYSBnZXR0ZXIgcmF0aGVyIHRoYW4gYSB2YWx1ZSDigJQgYSBkcmFnXG4gICAqIG11dGF0ZXMgdGhlIG9yZGVyIHVuZGVybmVhdGggaXQsIHNvIGEgc25hcHNob3QgdGFrZW4gYXQgYXR0YWNoIHRpbWUgd291bGRcbiAgICogZ28gc3RhbGUgb24gdGhlIGZpcnN0IG1vdmUuXG4gICAqL1xuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG5cbiAgICBjb25zdCBlbGVtZW50ID0gdGhpcy52aWV3cG9ydD8uZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudDtcblxuICAgIGlmICghZWxlbWVudCkgcmV0dXJuO1xuXG4gICAgdGhpcy5yb3dEcmFnU2VydmljZS5hdHRhY2goe1xuICAgICAgdmlld3BvcnQ6IGVsZW1lbnQsXG4gICAgICBpdGVtU2l6ZTogdGhpcy5pdGVtU2l6ZSxcbiAgICAgIG5vZGVzOiAoKSA9PiB0aGlzLm5vZGVzLFxuICAgICAgbW92ZTogKGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIpID0+IHtcblxuICAgICAgICBjb25zdCBtb3ZlZCA9IHRoaXMuYXBpLm1vdmVSb3coZnJvbUluZGV4LCB0b0luZGV4KTtcblxuICAgICAgICBpZiAobW92ZWQpIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICAgIHJldHVybiBtb3ZlZDtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZnJlc2hSb3dEcmFnU3VwcHJlc3NlZCgpO1xuXG4gICAgLy8gVGhlIENESyBpbnNlcnRzIGl0cyBvd24gY29udGVudCB3cmFwcGVyIGJldHdlZW4gdGhlIHZpZXdwb3J0IGFuZCB0aGVcbiAgICAvLyByb3dzLiBJdCBoYXMgbm8gdGVtcGxhdGUgb2Ygb3VycyB0byBhbm5vdGF0ZSwgYW5kIGxlZnQgZ2VuZXJpYyBpdCBicmVha3NcbiAgICAvLyB0aGUgYGdyaWQgPiByb3dgIG93bmVyc2hpcCB0aGUgcm9sZXMgZGVwZW5kIG9uLlxuICAgIGNvbnN0IHdyYXBwZXIgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJy5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyJyk7XG5cbiAgICB3cmFwcGVyPy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncHJlc2VudGF0aW9uJyk7XG5cbiAgICAvLyBGbGV4IGNvbHVtbnMgc2l6ZSBhZ2FpbnN0IHRoaXMgdmlld3BvcnQsIG5vdyBhbmQgd2hlbmV2ZXIgaXQgcmVzaXplcy5cbiAgICAvLyBhcHBseUZsZXhXaWR0aHMgaXMgYSBuby1vcCB3aXRob3V0IGZsZXggY29sdW1ucyBhbmQgZGlzcGF0Y2hlcyBvbmx5IG9uIGFcbiAgICAvLyByZWFsIGNoYW5nZSwgc28gZ3JpZHMgdGhhdCBuZXZlciB1c2UgZmxleCBwYXkgbm90aGluZyBoZXJlLlxuICAgIHRoaXMuYXBwbHlGbGV4V2lkdGhzKCk7XG5cbiAgICBpZiAodHlwZW9mIFJlc2l6ZU9ic2VydmVyICE9PSAndW5kZWZpbmVkJykge1xuXG4gICAgICB0aGlzLmZsZXhSZXNpemVPYnNlcnZlciA9IG5ldyBSZXNpemVPYnNlcnZlcigoKSA9PiB0aGlzLmFwcGx5RmxleFdpZHRocygpKTtcbiAgICAgIHRoaXMuZmxleFJlc2l6ZU9ic2VydmVyLm9ic2VydmUoZWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBmbGV4UmVzaXplT2JzZXJ2ZXI/OiBSZXNpemVPYnNlcnZlcjtcblxuICBwcml2YXRlIGFwcGx5RmxleFdpZHRocygpOiB2b2lkIHtcblxuICAgIGNvbnN0IHdpZHRoID0gdGhpcy52aWV3cG9ydD8uZWxlbWVudFJlZj8ubmF0aXZlRWxlbWVudD8uY2xpZW50V2lkdGggPz8gMDtcblxuICAgIGlmICh3aWR0aCA+IDApIHRoaXMuYXBpLmFwcGx5RmxleFdpZHRocyh3aWR0aCk7XG4gIH1cblxuICAvKipcbiAgICogVGhlIHBhcmFtcyBldmVyeSBwZXItY2VsbCBjYWxsYmFjayByZWNlaXZlcy5cbiAgICpcbiAgICogQnVpbHQgaGVyZSByYXRoZXIgdGhhbiBpbmxpbmUgaW4gdGhlIHRlbXBsYXRlIHNvIHRoZSB3aG9sZSBkb2N1bWVudGVkXG4gICAqIHNoYXBlIGlzIHBhc3NlZCDigJQgYHZhbHVlYCwgYGZpZWxkYCwgYHJvd0luZGV4YCwgYGFwaWAgYW5kIGBjb250ZXh0YCB3ZXJlXG4gICAqIGFsbCBkZWNsYXJlZCBvbiBgT25lQ2VsbFJlbmRlcmVyUGFyYW1zYCBhbmQgbm9uZSBvZiB0aGVtIHdlcmUgYmVpbmcgc2VudCxcbiAgICogc28gYSBgY2VsbENsYXNzYCByZWFkaW5nIGBwYXJhbXMudmFsdWVgIHNpbGVudGx5IGdvdCBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHByb3RlY3RlZCBjZWxsUGFyYW1zKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KTogT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtczxUPiB7XG5cbiAgICByZXR1cm4gdGhpcy5jZWxsU2VydmljZS5jZWxsUGFyYW1zKGNvbHVtbiwgbm9kZSkgYXMgT25lQ2VsbFByZXNlbnRhdGlvblBhcmFtczxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJhbXMgZm9yIGEgY29tcG9uZW50IGNlbGwgcmVuZGVyZXIuXG4gICAqXG4gICAqIFRoZSBjZWxsIHBhcmFtcywgcGx1cyB3aGF0ZXZlciB0aGUgY29sdW1uIGRlY2xhcmVkIGluXG4gICAqIGBjZWxsUmVuZGVyZXJQYXJhbXNgIOKAlCBhIGZpZWxkIHRoYXQgZXhpc3RzIHByZWNpc2VseSBzbyBhIHJlbmRlcmVyIGNhbiBiZVxuICAgKiBjb25maWd1cmVkIHBlciBjb2x1bW4sIGFuZCB0aGF0IG5vdGhpbmcgaGFkIGV2ZXIgZm9yd2FyZGVkIHRvIGl0LiBDb2x1bW5cbiAgICogY29uZmlnIGdvZXMgZmlyc3Qgc28gdGhlIGdyaWQncyBvd24gZmllbGRzIHdpbiBhIG5hbWUgY29sbGlzaW9uLlxuICAgKi9cbiAgLyoqXG4gICAqIENhY2hlZCBwZXIgY2VsbCwga2V5ZWQgb24gdGhlIGlkZW50aXRpZXMgdGhhdCBtZWFuIFwidGhpcyBjZWxsIGNoYW5nZWRcIjpcbiAgICogaXRzIGNlbGxTdGF0ZXMgb2JqZWN0IChyZXBsYWNlZCBvbiBldmVyeSBlZGl0IGFuZCBzdGF0ZSByZWZyZXNoKSBhbmQgaXRzXG4gICAqIGRhdGEgb2JqZWN0LiBCdWlsZGluZyBhIGZyZXNoIG9iamVjdCBwZXIgY2FsbCDigJQgd2hpY2ggYSB0ZW1wbGF0ZSBtZXRob2RcbiAgICogZG9lcyBwZXIgY2hhbmdlLWRldGVjdGlvbiBwYXNzIOKAlCBtYWRlIHRoZSByZW5kZXJlciBkaXJlY3RpdmUgc2VlIFwicGFyYW1zXG4gICAqIGNoYW5nZWRcIiBldmVyeSBwYXNzIGFuZCByZS1ydW4gdGhlIGNvbXBvbmVudCdzIG9uZUluaXQgZWFjaCB0aW1lLiBBXG4gICAqIHJlbmRlcmVyIHdob3NlIG9uZUluaXQgdG91Y2hlZCBncmlkIHN0YXRlIChhIGN1c3RvbSB0cmVlIGV4cGFuZGVyIGlzIHRoZVxuICAgKiBjbGFzc2ljIGNhc2UpIHRoZW4gcmUtdHJpZ2dlcmVkIGNoYW5nZSBkZXRlY3Rpb24gYW5kIGxvb3BlZCBmb3JldmVyLlxuICAgKi9cbiAgcHJpdmF0ZSByZW5kZXJlclBhcmFtc0NhY2hlID0gbmV3IE1hcDxzdHJpbmcsIHsgc3RhdGVzOiB1bmtub3duOyBkYXRhOiB1bmtub3duOyBwYXJhbXM6IE9uZUNlbGxSZW5kZXJlclBhcmFtczxUPiB9PigpO1xuXG4gIHByb3RlY3RlZCByZW5kZXJlclBhcmFtcyhub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPik6IE9uZUNlbGxSZW5kZXJlclBhcmFtczxUPiB7XG5cbiAgICBjb25zdCBrZXkgPSBnZXRDZWxsS2V5KG5vZGUucm93SWQsIChjb2x1bW4uZmllbGQgYXMgc3RyaW5nKSA/PyBjb2x1bW4uaWQgPz8gJycpO1xuICAgIGNvbnN0IGNhY2hlZCA9IHRoaXMucmVuZGVyZXJQYXJhbXNDYWNoZS5nZXQoa2V5KTtcblxuICAgIGlmIChjYWNoZWQgJiYgY2FjaGVkLnN0YXRlcyA9PT0gbm9kZS5jZWxsU3RhdGVzICYmIGNhY2hlZC5kYXRhID09PSBub2RlLmRhdGEpIHJldHVybiBjYWNoZWQucGFyYW1zO1xuXG4gICAgY29uc3QgcGFyYW1zID0geyAuLi4oY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXMgPz8ge30pLCAuLi50aGlzLmNlbGxQYXJhbXMobm9kZSwgY29sdW1uKSB9O1xuXG4gICAgdGhpcy5yZW5kZXJlclBhcmFtc0NhY2hlLnNldChrZXksIHsgc3RhdGVzOiBub2RlLmNlbGxTdGF0ZXMsIGRhdGE6IG5vZGUuZGF0YSwgcGFyYW1zIH0pO1xuXG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBgYXJpYS1yb3dpbmRleGAgaXMgMS1iYXNlZCBvdmVyIHRoZSB3aG9sZSBncmlkLCBub3Qgb3ZlciB3aGF0IGlzIHJlbmRlcmVkLlxuICAgKlxuICAgKiBUaGF0IGlzIHRoZSBwb2ludCBvZiBpdDogdGhlIGJvZHkgdmlydHVhbGlzZXMsIHNvIHRoZSBET00gaG9sZHMgYSBzbGlkaW5nXG4gICAqIHdpbmRvdyBvZiByb3dzIGFuZCB0aGUgaW5kZXggaXMgaG93IGEgc2NyZWVuIHJlYWRlciBrbm93cyB3aGVyZSB0aGUgd2luZG93XG4gICAqIHNpdHMuIFJvdyAxIGlzIHRoZSBoZWFkZXIsIHRoZW4gYW55IHBpbm5lZC10b3Agcm93cywgdGhlbiB0aGUgZGF0YS5cbiAgICovXG4gIHByb3RlY3RlZCBkYXRhUm93QXJpYUluZGV4KG5vZGU6IE9uZVJvd05vZGU8VD4pOiBudW1iZXIge1xuXG4gICAgcmV0dXJuIDIgKyB0aGlzLnBpbm5lZFRvcE5vZGVzLmxlbmd0aCArIG5vZGUucm93SW5kZXg7XG4gIH1cblxuICAvKiogUGlubmVkIHJvd3MgYnJhY2tldCB0aGUgZGF0YTogdG9wIG9uZXMgZm9sbG93IHRoZSBoZWFkZXIsIGJvdHRvbSBvbmVzIGVuZCB0aGUgZ3JpZC4gKi9cbiAgcHJvdGVjdGVkIHBpbm5lZFJvd0FyaWFJbmRleChub2RlOiBPbmVSb3dOb2RlPFQ+LCBzaWRlOiAndG9wJyB8ICdib3R0b20nKTogbnVtYmVyIHtcblxuICAgIGNvbnN0IGluZGV4ID0gKHNpZGUgPT09ICd0b3AnID8gdGhpcy5waW5uZWRUb3BOb2RlcyA6IHRoaXMucGlubmVkQm90dG9tTm9kZXMpLmluZGV4T2Yobm9kZSk7XG5cbiAgICByZXR1cm4gc2lkZSA9PT0gJ3RvcCdcbiAgICAgID8gMiArIGluZGV4XG4gICAgICA6IDIgKyB0aGlzLnBpbm5lZFRvcE5vZGVzLmxlbmd0aCArIHRoaXMubm9kZXMubGVuZ3RoICsgaW5kZXg7XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciByb3dzIGNhbiBiZSBzZWxlY3RlZCBhdCBhbGwuXG4gICAqXG4gICAqIGBhcmlhLXNlbGVjdGVkPVwiZmFsc2VcImAgb24gZXZlcnkgcm93IG9mIGEgZ3JpZCBub2JvZHkgY2FuIHNlbGVjdCBhbm5vdW5jZXNcbiAgICogYSBzZWxlY3Rpb24gYWZmb3JkYW5jZSB0aGF0IGRvZXMgbm90IGV4aXN0LCBzbyB0aGUgYXR0cmlidXRlIGlzIG9taXR0ZWRcbiAgICogcmF0aGVyIHRoYW4gc2V0IGZhbHNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIGdldCByb3dTZWxlY3Rpb25FbmFibGVkKCk6IGJvb2xlYW4ge1xuXG4gICAgcmV0dXJuICEhdGhpcy5hcGk/LnJvd1NlbGVjdGlvbjtcbiAgfVxuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAvLyBDZWxsIG5hdmlnYXRpb25cbiAgLy9cbiAgLy8gVGhlIFdBSS1BUklBIGdyaWQgcGF0dGVybjogdGhlIHdob2xlIGdyaWQgaXMgb25lIHRhYiBzdG9wLCBhbmQgdGhlIGFycm93c1xuICAvLyBtb3ZlIGEgZm9jdXNlZCBjZWxsIHdpdGhpbiBpdC4gQmVmb3JlIHRoaXMgdGhlIG9ubHkgdGFiIHN0b3Agd2FzIHRoZSBzY3JvbGxcbiAgLy8gdmlld3BvcnQsIHNvIGEga2V5Ym9hcmQgdXNlciBjb3VsZCBzY3JvbGwgdGhlIHJvd3MgYW5kIHJlYWNoIG5vdGhpbmcgaW5cbiAgLy8gdGhlbSDigJQgYW5kIGEgc2NyZWVuIHJlYWRlciBoYWQgbm8gY3Vyc29yIHRvIHJlYWQgYSBjZWxsIGZyb20uXG4gIC8vXG4gIC8vIEZvY3VzIGlzIHJlYWwgRE9NIGZvY3VzIG9uIGEgcm92aW5nIHRhYmluZGV4IHJhdGhlciB0aGFuXG4gIC8vIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgLCBiZWNhdXNlIHRoZSByb3dzIGFyZSB2aXJ0dWFsaXNlZDogdGhlIGVsZW1lbnQgYVxuICAvLyBkZXNjZW5kYW50IGlkIHBvaW50ZWQgYXQgd291bGQga2VlcCBiZWluZyBkZXN0cm95ZWQgdW5kZXJuZWF0aCBpdC5cbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgLyoqIFRoZSBjZWxsIGhvbGRpbmcgdGhlIGdyaWQncyB0YWIgc3RvcC4gTnVsbCB1bnRpbCBzb21ldGhpbmcgaXMgZm9jdXNlZC4gKi9cbiAgcHJvdGVjdGVkIGFjdGl2ZUNlbGw6IHsgcm93SWQ6IHN0cmluZzsgZmllbGQ6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG5cbiAgcHJvdGVjdGVkIGlzQWN0aXZlQ2VsbChub2RlOiBPbmVSb3dOb2RlPFQ+LCBjb2x1bW46IE9uZUNvbHVtbkRlZjxUPik6IGJvb2xlYW4ge1xuXG4gICAgaWYgKHRoaXMuYWN0aXZlQ2VsbCkge1xuXG4gICAgICByZXR1cm4gdGhpcy5hY3RpdmVDZWxsLnJvd0lkID09PSBub2RlLnJvd0lkICYmIHRoaXMuYWN0aXZlQ2VsbC5maWVsZCA9PT0gY29sdW1uLmZpZWxkO1xuICAgIH1cblxuICAgIC8vIE5vdGhpbmcgZm9jdXNlZCB5ZXQsIHNvIHRoZSBmaXJzdCBjZWxsIGhvbGRzIHRoZSB0YWIgc3RvcC4gV2l0aG91dCB0aGlzXG4gICAgLy8gZmFsbGJhY2sgYSBncmlkIG5vYm9keSBoYXMgY2xpY2tlZCBoYXMgKm5vKiB0YWJiYWJsZSBjZWxsLCBhbmQgYSBrZXlib2FyZFxuICAgIC8vIHVzZXIgY2Fubm90IGdldCBpbnRvIGl0IGF0IGFsbCDigJQgdGhlIHJvdmluZyB0YWJpbmRleCBoYXMgdG8gc3RhcnRcbiAgICAvLyBzb21ld2hlcmUuXG4gICAgcmV0dXJuIG5vZGUgPT09IHRoaXMubm9kZXNbMF0gJiYgY29sdW1uID09PSB0aGlzLm5hdmlnYWJsZUNvbHVtbnMoKVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZG9wdCB3aGF0ZXZlciB0aGUgdXNlciBmb2N1c2VkLCBob3dldmVyIHRoZXkgZ290IHRoZXJlIOKAlCBjbGljaywgdGFiLCBvclxuICAgKiB0aGUgYXJyb3cga2V5cyBiZWxvdy4gS2VlcGluZyB0aGlzIGluIG9uZSBwbGFjZSBpcyB3aGF0IHN0b3BzIHRoZSByb3ZpbmdcbiAgICogdGFiaW5kZXggZHJpZnRpbmcgYXdheSBmcm9tIHRoZSBlbGVtZW50IHRoYXQgYWN0dWFsbHkgaGFzIGZvY3VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIG9uQ2VsbEZvY3VzKG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KTogdm9pZCB7XG5cbiAgICBpZiAodGhpcy5pc0FjdGl2ZUNlbGwobm9kZSwgY29sdW1uKSkgcmV0dXJuO1xuXG4gICAgdGhpcy5hY3RpdmVDZWxsID0geyByb3dJZDogbm9kZS5yb3dJZCwgZmllbGQ6IGNvbHVtbi5maWVsZCBhcyBzdHJpbmcgfTtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJvdGVjdGVkIG9uR3JpZEtleWRvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcblxuICAgIC8vIFVuZG8vcmVkbyBvZiBjb21taXR0ZWQgZWRpdHMsIGFueXdoZXJlIGluIHRoZSBncmlkIGV4Y2VwdCBpbnNpZGUgYW5cbiAgICAvLyBvcGVuIGVkaXRvciDigJQgYSB0ZXh0IGlucHV0J3MgQ3RybCtaIGlzIHRoZSBicm93c2VyJ3MsIGFuZCBpdCBvcGVyYXRlc1xuICAgIC8vIG9uIHRoZSB1bmNvbW1pdHRlZCB0ZXh0LlxuICAgIGlmICgoZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5KSAmJiBbJ3onLCAneSddLmluY2x1ZGVzKGV2ZW50LmtleS50b0xvd2VyQ2FzZSgpKSkge1xuXG4gICAgICBjb25zdCB0YWcgPSAoZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50KT8udGFnTmFtZT8udG9Mb3dlckNhc2UoKTtcblxuICAgICAgaWYgKHRhZyA9PT0gJ2lucHV0JyB8fCB0YWcgPT09ICdzZWxlY3QnIHx8IHRhZyA9PT0gJ3RleHRhcmVhJykgcmV0dXJuO1xuXG4gICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICBjb25zdCByZWRvID0gZXZlbnQua2V5LnRvTG93ZXJDYXNlKCkgPT09ICd5JyB8fCBldmVudC5zaGlmdEtleTtcbiAgICAgIGNvbnN0IGFwcGxpZWQgPSByZWRvID8gdGhpcy5hcGkucmVkb0NlbGxFZGl0aW5nKCkgOiB0aGlzLmFwaS51bmRvQ2VsbEVkaXRpbmcoKTtcblxuICAgICAgaWYgKGFwcGxpZWQpIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1ucyA9IHRoaXMubmF2aWdhYmxlQ29sdW1ucygpO1xuXG4gICAgaWYgKCF0aGlzLm5vZGVzLmxlbmd0aCB8fCAhY29sdW1ucy5sZW5ndGgpIHJldHVybjtcblxuICAgIC8vIE5hdmlnYXRlIG9ubHkgd2hlbiBhIGNlbGwgaXRzZWxmIGhvbGRzIGZvY3VzLiBBbnl0aGluZyBmb2N1c2FibGUgKmluc2lkZSpcbiAgICAvLyBhIGNlbGwgb3ducyBpdHMgb3duIGtleXMg4oCUIGEgdGV4dCBlZGl0b3IncyBjYXJldCwgdGhlIHJvdyBkcmFnIGhhbmRsZSdzXG4gICAgLy8gcmVvcmRlciBrZXlzLCB0aGUgb3B0aW9uIG1lbnUncyBhcnJvd3Mg4oCUIGFuZCBhbGwgb2YgdGhlbSBidWJibGUgdG8gaGVyZS5cbiAgICAvLyBDaGVja2luZyB0aGUgdGFyZ2V0IHJhdGhlciB0aGFuIGJsb2NrbGlzdGluZyB0YWcgbmFtZXMgaXMgd2hhdCBrZWVwcyB0aGlzXG4gICAgLy8gY29ycmVjdCBhcyBtb3JlIGNvbnRyb2xzIGFyZSBhZGRlZCB0byBjZWxscy5cbiAgICBjb25zdCB0YXJnZXQgPSBldmVudC50YXJnZXQgYXMgSFRNTEVsZW1lbnQgfCBudWxsO1xuXG4gICAgaWYgKCF0YXJnZXQ/Lm1hdGNoZXM/LignW3JvbGU9XCJncmlkY2VsbFwiXScpKSByZXR1cm47XG5cbiAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5hY3RpdmVDZWxsUG9zaXRpb24oY29sdW1ucyk7XG5cbiAgICBsZXQgcm93ID0gY3VycmVudC5yb3c7XG4gICAgbGV0IGNvbCA9IGN1cnJlbnQuY29sO1xuXG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcblxuICAgICAgY2FzZSAnQXJyb3dEb3duJzogIHJvdyArPSAxOyBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93VXAnOiAgICByb3cgLT0gMTsgYnJlYWs7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzogY29sICs9IDE7IGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzogIGNvbCAtPSAxOyBicmVhaztcblxuICAgICAgLy8gU2VsZWN0aW9uLiBTcGFjZSBpcyB0aGUgZ3JpZCBwYXR0ZXJuJ3MgdG9nZ2xlLCBhbmQgaXQgaGFzIHRvIGJlIGNhdWdodFxuICAgICAgLy8gaGVyZSBvciB0aGUgYnJvd3NlciBzY3JvbGxzIHRoZSBwYWdlIHdpdGggaXQuXG4gICAgICBjYXNlICcgJzoge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5ub2Rlc1tjdXJyZW50LnJvd107XG4gICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLnRvZ2dsZVJvd1NlbGVjdGlvbihub2RlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNhc2UgJ2EnOlxuICAgICAgY2FzZSAnQSc6XG4gICAgICAgIGlmICghZXZlbnQuY3RybEtleSAmJiAhZXZlbnQubWV0YUtleSkgcmV0dXJuO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLmFwaS5zZWxlY3RBbGwoKTtcbiAgICAgICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gICAgICAgIHJldHVybjtcblxuICAgICAgY2FzZSAnSG9tZSc6XG4gICAgICAgIGNvbCA9IDA7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHJvdyA9IDA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFbmQnOlxuICAgICAgICBjb2wgPSBjb2x1bW5zLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHJvdyA9IHRoaXMubm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIC8vIEEgcGFnZSBpcyB3aGF0IHRoZSB2aWV3cG9ydCBjYW4gc2hvdywgd2hpY2ggaXMgdGhlIG9ubHkgZGVmaW5pdGlvbiB0aGF0XG4gICAgICAvLyBtYXRjaGVzIHdoYXQgdGhlIHVzZXIgc2VlcyBtb3ZlLlxuICAgICAgY2FzZSAnUGFnZURvd24nOiByb3cgKz0gdGhpcy5yb3dzUGVyUGFnZSgpOyBicmVhaztcbiAgICAgIGNhc2UgJ1BhZ2VVcCc6ICAgcm93IC09IHRoaXMucm93c1BlclBhZ2UoKTsgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgIGNhc2UgJ0YyJzoge1xuICAgICAgICBjb25zdCBub2RlID0gdGhpcy5ub2Rlc1tjdXJyZW50LnJvd107XG4gICAgICAgIGNvbnN0IGNvbHVtbiA9IGNvbHVtbnNbY3VycmVudC5jb2xdO1xuICAgICAgICBpZiAobm9kZSAmJiBjb2x1bW4pIHtcbiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIHRoaXMuc3RhcnRFZGl0KHsgdGFyZ2V0OiBldmVudC50YXJnZXQgfSBhcyB1bmtub3duIGFzIE1vdXNlRXZlbnQsIG5vZGUsIGNvbHVtbik7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiByZXR1cm47XG4gICAgfVxuXG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgIGNvbnN0IHRhcmdldFJvdyA9IE1hdGgubWluKE1hdGgubWF4KHJvdywgMCksIHRoaXMubm9kZXMubGVuZ3RoIC0gMSk7XG5cbiAgICB0aGlzLmZvY3VzQ2VsbCh0YXJnZXRSb3csIE1hdGgubWluKE1hdGgubWF4KGNvbCwgMCksIGNvbHVtbnMubGVuZ3RoIC0gMSkpO1xuXG4gICAgLy8gU2hpZnQgd2l0aCBhIHZlcnRpY2FsIG1vdmUgZXh0ZW5kcyB0aGUgc2VsZWN0aW9uLCBhbmNob3JlZCB3aGVyZSB0aGVcbiAgICAvLyBleHRlbnNpb24gYmVnYW4g4oCUIHRoZSBzYW1lIGdlc3R1cmUgYSBmaWxlIGxpc3QgdXNlcy5cbiAgICBpZiAoZXZlbnQuc2hpZnRLZXkgJiYgdGFyZ2V0Um93ICE9PSBjdXJyZW50LnJvdykge1xuXG4gICAgICB0aGlzLmV4dGVuZFNlbGVjdGlvblRvKGN1cnJlbnQucm93LCB0YXJnZXRSb3cpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBUaGUgcm93IGEgc2hpZnQtZXh0ZW5kZWQgc2VsZWN0aW9uIGlzIG1lYXN1cmVkIGZyb20uICovXG4gIHByaXZhdGUgc2VsZWN0aW9uQW5jaG9yUm93SWQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIHByaXZhdGUgdG9nZ2xlUm93U2VsZWN0aW9uKG5vZGU6IE9uZVJvd05vZGU8VD4pOiB2b2lkIHtcblxuICAgIGlmICghdGhpcy5hcGkudG9nZ2xlUm93U2VsZWN0aW9uKG5vZGUucm93SWQsICFub2RlLnNlbGVjdGVkKSkgcmV0dXJuO1xuXG4gICAgLy8gV2hlcmUgYSBzdWJzZXF1ZW50IHNoaWZ0LWV4dGVuc2lvbiBjb3VudHMgZnJvbS5cbiAgICB0aGlzLnNlbGVjdGlvbkFuY2hvclJvd0lkID0gbm9kZS5yb3dJZDtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRlbmRTZWxlY3Rpb25Ubyhmcm9tUm93OiBudW1iZXIsIHRvUm93OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGNvbnN0IHRhcmdldCA9IHRoaXMubm9kZXNbdG9Sb3ddO1xuXG4gICAgaWYgKCF0YXJnZXQpIHJldHVybjtcblxuICAgIC8vIFdpdGggbm90aGluZyBzZWxlY3RlZCB5ZXQgdGhlIHJvdyB0aGUgZXh0ZW5zaW9uIHN0YXJ0ZWQgb24gYmVjb21lcyB0aGVcbiAgICAvLyBhbmNob3IsIHNvIHNoaWZ0K2Fycm93IHNlbGVjdHMgYm90aCBlbmRzIHJhdGhlciB0aGFuIG9ubHkgdGhlIGZhciBvbmUuXG4gICAgY29uc3QgYW5jaG9yID0gdGhpcy5zZWxlY3Rpb25BbmNob3JSb3dJZCA/PyB0aGlzLm5vZGVzW2Zyb21Sb3ddPy5yb3dJZDtcblxuICAgIGlmICghYW5jaG9yKSByZXR1cm47XG5cbiAgICB0aGlzLnNlbGVjdGlvbkFuY2hvclJvd0lkID0gYW5jaG9yO1xuXG4gICAgdGhpcy5hcGkuc2VsZWN0Um93UmFuZ2UoYW5jaG9yLCB0YXJnZXQucm93SWQpO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29sdW1ucyBhIGNlbGwgY3Vyc29yIGNhbiBsYW5kIG9uLlxuICAgKlxuICAgKiBBIGNvbHVtbiB3aXRoIG5vIGZpZWxkIHJlbmRlcnMgbm8gY2VsbCBzdGF0ZSBhbmQgaXMga2V5ZWQgYnkgZmllbGQsIHNvIGl0XG4gICAqIGNhbm5vdCBiZSBhZGRyZXNzZWQg4oCUIGFuIGFjdGlvbi1vbmx5IGNvbHVtbiBpcyBhIGxlZ2l0aW1hdGUgZXhhbXBsZS5cbiAgICovXG4gIHByaXZhdGUgbmF2aWdhYmxlQ29sdW1ucygpOiBPbmVDb2x1bW5EZWY8VD5bXSB7XG5cbiAgICByZXR1cm4gdGhpcy5jb2x1bW5EZWZzLmZpbHRlcihjb2x1bW4gPT4gISFjb2x1bW4/LmZpZWxkKTtcbiAgfVxuXG4gIHByaXZhdGUgYWN0aXZlQ2VsbFBvc2l0aW9uKGNvbHVtbnM6IE9uZUNvbHVtbkRlZjxUPltdKTogeyByb3c6IG51bWJlcjsgY29sOiBudW1iZXIgfSB7XG5cbiAgICBpZiAoIXRoaXMuYWN0aXZlQ2VsbCkgcmV0dXJuIHsgcm93OiAwLCBjb2w6IDAgfTtcblxuICAgIGNvbnN0IHJvdyA9IHRoaXMubm9kZXMuZmluZEluZGV4KG5vZGUgPT4gbm9kZS5yb3dJZCA9PT0gdGhpcy5hY3RpdmVDZWxsIS5yb3dJZCk7XG4gICAgY29uc3QgY29sID0gY29sdW1ucy5maW5kSW5kZXgoY29sdW1uID0+IGNvbHVtbi5maWVsZCA9PT0gdGhpcy5hY3RpdmVDZWxsIS5maWVsZCk7XG5cbiAgICByZXR1cm4geyByb3c6IHJvdyA8IDAgPyAwIDogcm93LCBjb2w6IGNvbCA8IDAgPyAwIDogY29sIH07XG4gIH1cblxuICBwcml2YXRlIHJvd3NQZXJQYWdlKCk6IG51bWJlciB7XG5cbiAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnZpZXdwb3J0Py5lbGVtZW50UmVmPy5uYXRpdmVFbGVtZW50Py5jbGllbnRIZWlnaHQgPz8gMDtcblxuICAgIHJldHVybiBNYXRoLm1heCgxLCBNYXRoLmZsb29yKGhlaWdodCAvIHRoaXMuaXRlbVNpemUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNb3ZlIHRoZSBjdXJzb3IsIHNjcm9sbGluZyB0aGUgcm93IGludG8gdmlldyBmaXJzdCB3aGVuIGl0IGlzIG91dHNpZGUgdGhlXG4gICAqIHJlbmRlcmVkIHdpbmRvdy5cbiAgICpcbiAgICogVGhlIHNjcm9sbCBpcyB0aGUgcmVhc29uIGZvY3VzaW5nIGlzIGRlZmVycmVkOiBhIHZpcnR1YWxpc2VkIHJvdyB0aGF0IGlzXG4gICAqIG5vdCBvbiBzY3JlZW4gaGFzIG5vIGVsZW1lbnQgdG8gZm9jdXMgdW50aWwgdGhlIHZpZXdwb3J0IGhhcyByZW5kZXJlZCBpdC5cbiAgICovXG4gIHByaXZhdGUgZm9jdXNDZWxsKHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpOiB2b2lkIHtcblxuICAgIGNvbnN0IG5vZGUgPSB0aGlzLm5vZGVzW3Jvd0luZGV4XTtcbiAgICBjb25zdCBjb2x1bW4gPSB0aGlzLm5hdmlnYWJsZUNvbHVtbnMoKVtjb2xJbmRleF07XG5cbiAgICBpZiAoIW5vZGUgfHwgIWNvbHVtbikgcmV0dXJuO1xuXG4gICAgdGhpcy5hY3RpdmVDZWxsID0geyByb3dJZDogbm9kZS5yb3dJZCwgZmllbGQ6IGNvbHVtbi5maWVsZCBhcyBzdHJpbmcgfTtcblxuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuXG4gICAgY29uc3QgcmFuZ2UgPSB0aGlzLnZpZXdwb3J0Py5nZXRSZW5kZXJlZFJhbmdlKCk7XG4gICAgY29uc3QgcmVuZGVyZWQgPSByYW5nZSAmJiByb3dJbmRleCA+PSByYW5nZS5zdGFydCAmJiByb3dJbmRleCA8IHJhbmdlLmVuZDtcblxuICAgIGlmIChyZW5kZXJlZCkge1xuXG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZm9jdXNDZWxsRWxlbWVudChub2RlLCBjb2x1bW4pKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmlld3BvcnQ/LnNjcm9sbFRvSW5kZXgocm93SW5kZXgpO1xuXG4gICAgLy8gU2Nyb2xsaW5nIGlzIG5vdCBlbm91Z2g6IHRoZSBDREsgcmVuZGVycyBvbiBpdHMgb3duIHNjaGVkdWxlLCBzbyB0aGUgcm93XG4gICAgLy8gaGFzIG5vIGVsZW1lbnQgdG8gZm9jdXMgdW50aWwgaXQgaGFzLiBXYWl0aW5nIGZvciB0aGUgcmVuZGVyZWQgcmFuZ2UgdG9cbiAgICAvLyBhY3R1YWxseSBjb250YWluIHRoZSByb3cgaXMgdGhlIG9ubHkgcmVsaWFibGUgc2lnbmFsIOKAlCBhIGZpeGVkIGRlbGF5XG4gICAgLy8gcmFjZXMgdGhlIHZpZXdwb3J0IGFuZCBzaWxlbnRseSBkcm9wcyBmb2N1cyB3aGVuIGl0IGxvc2VzLlxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLnZpZXdwb3J0Py5yZW5kZXJlZFJhbmdlU3RyZWFtXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIGZpbHRlcihuZXh0ID0+IHJvd0luZGV4ID49IG5leHQuc3RhcnQgJiYgcm93SW5kZXggPCBuZXh0LmVuZCksXG4gICAgICAgICAgdGFrZSgxKSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHNldFRpbWVvdXQoKCkgPT4gdGhpcy5mb2N1c0NlbGxFbGVtZW50KG5vZGUsIGNvbHVtbikpKSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBmb2N1c0NlbGxFbGVtZW50KG5vZGU6IE9uZVJvd05vZGU8VD4sIGNvbHVtbjogT25lQ29sdW1uRGVmPFQ+KTogdm9pZCB7XG5cbiAgICBjb25zdCBrZXkgPSBnZXRDZWxsS2V5KG5vZGUucm93SWQsIGNvbHVtbi5maWVsZCBhcyBzdHJpbmcpO1xuXG4gICAgdGhpcy5ib2R5UmVmPy5uYXRpdmVFbGVtZW50Py5xdWVyeVNlbGVjdG9yPEhUTUxFbGVtZW50PihgW2RhdGEtY2VsbC1pZD1cIiR7a2V5fVwiXWApPy5mb2N1cygpO1xuICB9XG5cbiAgLyoqIElzIHRoaXMgdGhlIHJvdyBjdXJyZW50bHkgYmVpbmcgbW92ZWQ/ICovXG4gIHByb3RlY3RlZCBpc1Jvd0RyYWdnaW5nKG5vZGU6IE9uZVJvd05vZGU8VD4pOiBib29sZWFuIHtcblxuICAgIHJldHVybiB0aGlzLmRyYWdTdGF0ZT8ucm93SWQgPT09IG5vZGUucm93SWQ7XG4gIH1cblxuICAvKipcbiAgICogV2hlcmUgdG8gcGFpbnQgdGhlIGRyb3AgaW5kaWNhdG9yLCBpbiBwaXhlbHMgZnJvbSB0aGUgdG9wIG9mIHRoZSBib2R5LlxuICAgKlxuICAgKiBgaW5zZXJ0QXRgIGlzIGEgYm91bmRhcnksIHNvIHRoZSBsaW5lIHNpdHMgYXQgcm93LWhlaWdodCB0aW1lcyB0aGUgbnVtYmVyXG4gICAqIG9mIHJvd3MgYWJvdmUgaXQg4oCUIGluIGNvbnRlbnQgc3BhY2UuIFRoZSBpbmRpY2F0b3IgaXMgYSBzaWJsaW5nIG9mIHRoZVxuICAgKiB2aWV3cG9ydCByYXRoZXIgdGhhbiBhIGNoaWxkLCBiZWNhdXNlIGFueXRoaW5nIGluc2lkZSBpdCBlaXRoZXIgc2Nyb2xsc1xuICAgKiBhd2F5IHdpdGggdGhlIHRyYW5zZm9ybWVkIGNvbnRlbnQgd3JhcHBlciBvciBpZ25vcmVzIHRoZSBzY3JvbGwgZW50aXJlbHksXG4gICAqIHNvIHRoZSB2aWV3cG9ydCdzIG93biBzY3JvbGwgb2Zmc2V0IGFuZCBpdHMgcG9zaXRpb24gd2l0aGluIHRoZSBib2R5IGFyZVxuICAgKiBib3RoIHN1YnRyYWN0ZWQgYmFjayBvdXQgaGVyZS5cbiAgICpcbiAgICogQSBmaWVsZCByYXRoZXIgdGhhbiBhIGdldHRlcjogaXQgaXMgcmVhZCBmcm9tIHRoZSB0ZW1wbGF0ZSBvbiBldmVyeSBjaGFuZ2VcbiAgICogZGV0ZWN0aW9uIHBhc3MsIGFuZCBpdCBvbmx5IGFjdHVhbGx5IG1vdmVzIHdoZW4gdGhlIGRyYWcgc3RhdGUgb3IgdGhlXG4gICAqIHNjcm9sbCBwb3NpdGlvbiBkb2VzLlxuICAgKi9cbiAgcHJvdGVjdGVkIGRyb3BJbmRpY2F0b3JUb3A6IG51bWJlciB8IG51bGwgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBIb3cgd2lkZSB0aGUgbGluZSBpcyBkcmF3bi4gUm93cyBhcmUgYHdpZHRoOiBmaXQtY29udGVudGAsIHNvIHRoZXkgYXJlXG4gICAqIG9mdGVuIG5hcnJvd2VyIHRoYW4gdGhlIHZpZXdwb3J0IOKAlCBhIGZ1bGwtYmxlZWQgbGluZSB3b3VsZCBoYW5nIHBhc3QgdGhlXG4gICAqIGxhc3QgY29sdW1uIGludG8gZW1wdHkgc3BhY2UgYW5kIHJlYWQgYXMgcGFydCBvZiB0aGUgZnJhbWUgcmF0aGVyIHRoYW4gdGhlXG4gICAqIHJvd3MuIFRoaXMgaXMgdGhlIHZpc2libGUgZXh0ZW50IG9mIHRoZSByb3cgY29udGVudCwgd2hpY2ggYWxzbyBzaHJpbmtzXG4gICAqIGNvcnJlY3RseSBhcyB0aGUgZ3JpZCBpcyBzY3JvbGxlZCBzaWRld2F5cy5cbiAgICovXG4gIHByb3RlY3RlZCBkcm9wSW5kaWNhdG9yV2lkdGggPSAwO1xuXG4gIHByaXZhdGUgdXBkYXRlRHJvcEluZGljYXRvcigpOiB2b2lkIHtcblxuICAgIGNvbnN0IHN0YXRlID0gdGhpcy5kcmFnU3RhdGU7XG4gICAgY29uc3QgZWxlbWVudCA9IHRoaXMudmlld3BvcnQ/LmVsZW1lbnRSZWY/Lm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBpZiAoc3RhdGU/LnNvdXJjZSAhPT0gJ3BvaW50ZXInIHx8ICFlbGVtZW50KSB7XG5cbiAgICAgIHRoaXMuZHJvcEluZGljYXRvclRvcCA9IG51bGw7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRyb3BJbmRpY2F0b3JUb3AgPSAoc3RhdGUuaW5zZXJ0QXQgKiB0aGlzLml0ZW1TaXplKSAtIGVsZW1lbnQuc2Nyb2xsVG9wICsgZWxlbWVudC5vZmZzZXRUb3A7XG5cbiAgICB0aGlzLmRyb3BJbmRpY2F0b3JXaWR0aCA9IE1hdGgubWF4KE1hdGgubWluKHRoaXMucm93V2lkdGggLSBlbGVtZW50LnNjcm9sbExlZnQsIGVsZW1lbnQuY2xpZW50V2lkdGgpLCAwKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvblJvd0RyYWdFbmQoZXZlbnQ6IE9uZVJvd0RyYWdFdmVudDxUPik6IHZvaWQge1xuXG4gICAgdGhpcy5yb3dEcmFnRW5kLmVtaXQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoUm93RHJhZ1N1cHByZXNzZWQoKTogdm9pZCB7XG5cbiAgICBjb25zdCByZWFzb24gPSB0aGlzLmFwaT8uZ2V0Um93RHJhZ1N1cHByZXNzZWRSZWFzb24/LigpID8/IG51bGw7XG5cbiAgICBpZiAocmVhc29uID09PSB0aGlzLnJvd0RyYWdTdXBwcmVzc2VkKSByZXR1cm47XG5cbiAgICB0aGlzLnJvd0RyYWdTdXBwcmVzc2VkID0gcmVhc29uO1xuXG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIHRoaXMuZmxleFJlc2l6ZU9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG5cbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMudW5zdWJzY3JpYmUoKTtcbiAgfVxufVxuIiwiPGRpdiAjYm9keVJlZiBjbGFzcz1cIm9uZS1ncmlkLWJvZHlcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+XG5cbiAgICA8IS0tIFBpbm5lZCByb3dzIGxpdmUgb3V0c2lkZSB0aGUgc2Nyb2xsIHZpZXdwb3J0IHNvIHRoZXkgbmV2ZXIgc2Nyb2xsXG4gICAgICAgICB2ZXJ0aWNhbGx5LCBhbmQgbWlycm9yIGl0cyBzY3JvbGxMZWZ0IHNvIHRoZSBjb2x1bW5zIHN0YXkgYWxpZ25lZC4gLS0+XG4gICAgQGlmIChwaW5uZWRUb3BOb2Rlcy5sZW5ndGgpIHtcbiAgICAgICAgPGRpdiAjcGlubmVkVmlld3BvcnQgY2xhc3M9XCJvbmUtcGlubmVkLXJvd3Mgb25lLXBpbm5lZC1yb3dzLXRvcFwiIHJvbGU9XCJyb3dncm91cFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwaW5uZWRSb3dzXCIgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgbm9kZXM6IHBpbm5lZFRvcE5vZGVzLCBzaWRlOiAndG9wJyB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIH1cblxuICAgIDwhLS0gdGFiaW5kZXggbWFrZXMgdGhlIHNjcm9sbCBjb250YWluZXIgcmVhY2hhYmxlLCBzbyBhIGtleWJvYXJkIHVzZXIgY2FuXG4gICAgICAgICBzY3JvbGwgdGhlIHJvd3Mgd2l0aCB0aGUgYXJyb3cga2V5cywgUGFnZSBVcC9Eb3duIGFuZCBIb21lL0VuZC4gV2l0aG91dFxuICAgICAgICAgaXQgdGhlIGJvZHkgaXMgc2Nyb2xsYWJsZSBieSBwb2ludGVyIG9ubHkgKFdDQUcgMi4xLjEpLiAtLT5cbiAgICA8Y2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0XG4gICAgICAgIGNsYXNzPVwib25lLWdyaWQtYm9keS12aWV3cG9ydFwiXG4gICAgICAgIHJvbGU9XCJyb3dncm91cFwiXG4gICAgICAgIFthdHRyLnRhYmluZGV4XT1cIm5vZGVzPy5sZW5ndGggPyBudWxsIDogMFwiXG4gICAgICAgIChrZXlkb3duKT1cIm9uR3JpZEtleWRvd24oJGV2ZW50KVwiXG4gICAgICAgIFtpdGVtU2l6ZV09XCJpdGVtU2l6ZVwiXG4gICAgICAgIFttaW5CdWZmZXJQeF09XCJtaW5CdWZmZXJQeFwiXG4gICAgICAgIFttYXhCdWZmZXJQeF09XCJtYXhCdWZmZXJQeFwiXG4gICAgICAgIChzY3JvbGwpPVwib25Cb2R5U2Nyb2xsKCRldmVudClcIj5cblxuICAgICAgICA8bmctY29udGFpbmVyICpjZGtWaXJ0dWFsRm9yPVwibGV0IG5vZGUgb2Ygbm9kZXM7IHRyYWNrQnk6IHRyYWNrQnlSb3dJZDtcIj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1yb3dcIlxuICAgICAgICAgICAgICAgIHJvbGU9XCJyb3dcIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtcm93aW5kZXhdPVwiZGF0YVJvd0FyaWFJbmRleChub2RlKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1zZWxlY3RlZF09XCJyb3dTZWxlY3Rpb25FbmFibGVkID8gbm9kZS5zZWxlY3RlZCA6IG51bGxcIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtcm93LWlkXT1cIm5vZGUucm93SWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vbmUtcm93LXNlbGVjdGVkXT1cIm5vZGUuc2VsZWN0ZWRcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5vbmUtcm93LWRyYWdnaW5nXT1cImlzUm93RHJhZ2dpbmcobm9kZSlcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChjb2wgb2YgY29sdW1uRGVmczsgdHJhY2sgY29sLmZpZWxkOykge1xuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImNlbGxUZW1wbGF0ZVwiIFtuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dF09XCJ7IG5vZGUsIHJvd0luZGV4OiBub2RlLnJvd0luZGV4LCBjb2x1bW46IGNvbCwgY29sSW5kZXg6ICRpbmRleCB9XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDwhLS0gQ3VzdG9tIERldGFpbCBDb21wb25lbnQgLS0+XG4gICAgICAgICAgICAgQGlmKG5vZGUubGVhZiAmJiBub2RlLmRldGFpbEFjdGl2ZSAmJiBub2RlPy5kZXRhaWxSZW5kZXJlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgb25lQ2VsbFJlbmRlcmVyQ29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyZXJDb21wb25lbnRdPVwibm9kZT8uZGV0YWlsUmVuZGVyZXJDb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgICBbcGFyYW1zXT1cInsgZGF0YTogbm9kZS5kYXRhLCByb3dJbmRleDogbm9kZS5yb3dJbmRleCwgbm9kZTogbm9kZSwgY29udGV4dDogY29udGV4dCB9XCI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIDwhLS0gTWFzdGVyIERldGFpbCBHcmlkICh0ZW1wbGF0ZSBwcm92aWRlZCBieSB0aGUgcGFyZW50IG9uZS1ncmlkIHRvIGF2b2lkIGEgY29tcGlsZS10aW1lIGltcG9ydCBjeWNsZSkgLS0+XG4gICAgICAgICAgICBAaWYgKG1hc3RlckRldGFpbCAmJiBub2RlLmV4cGFuZGVkICYmIG5vZGU/LmRldGFpbFJvd0RhdGEpIHtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLXJvdy1kZXRhaWwtY29udGFpbmVyXCIgW2F0dHIuZGF0YS1yb3ctaWRdPVwibm9kZS5yb3dJZCArICctZGV0YWlsJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldF09XCJkZXRhaWxHcmlkVGVtcGxhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XT1cInsgJGltcGxpY2l0OiBub2RlLCBub2RlOiBub2RlIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICBAaWYgKCFub2Rlcz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IG1heC1jb250ZW50OyBib3JkZXItdG9wOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBbc3R5bGUud2lkdGgucHhdPVwicm93V2lkdGhcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG4gICAgPC9jZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQ+XG5cbiAgICA8IS0tIERyb3AgaW5kaWNhdG9yLlxuICAgICAgICAgQSBsaW5lIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQgcmF0aGVyIHRoYW4gYSBnYXAgb3BlbmVkIGJldHdlZW4gcm93czpcbiAgICAgICAgIHRoZSB2aWV3cG9ydCBpcyB2aXJ0dWFsaXNlZCBhdCBhIGZpeGVkIGl0ZW1TaXplLCBzbyBzaGlmdGluZyByb3dzIGFwYXJ0XG4gICAgICAgICB3b3VsZCBkZXN5bmNocm9uaXNlIHRoZSBzY3JvbGxlciBmcm9tIGl0cyBvd24gZ2VvbWV0cnkuIEl0IGlzIGFsc28gdGhlXG4gICAgICAgICBjbGVhcmVyIHNpZ25hbCDigJQgdGhlIHJvdyBsYW5kcyBleGFjdGx5IHdoZXJlIHRoZSBsaW5lIGlzLlxuICAgICAgICAgUG9zaXRpb25lZCBhZ2FpbnN0IHRoZSBib2R5LCB3aXRoIHRoZSB2aWV3cG9ydCdzIHNjcm9sbCBzdWJ0cmFjdGVkLCBzb1xuICAgICAgICAgaXQgc3RheXMgcHV0IHdoaWxlIHRoZSBjb250ZW50IG1vdmVzIHVuZGVyIGl0IGR1cmluZyBhdXRvLXNjcm9sbC4gLS0+XG4gICAgQGlmIChkcm9wSW5kaWNhdG9yVG9wICE9PSBudWxsKSB7XG4gICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtcm93LWRyb3AtaW5kaWNhdG9yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCJcbiAgICAgICAgICAgICBbc3R5bGUudG9wLnB4XT1cImRyb3BJbmRpY2F0b3JUb3BcIlxuICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJkcm9wSW5kaWNhdG9yV2lkdGhcIj48L2Rpdj5cbiAgICB9XG5cbiAgICA8IS0tIEtleWJvYXJkIHJlb3JkZXJpbmcgaGFzIG5vIGRyYWcgaW1hZ2UgdG8gd2F0Y2gsIHNvIGl0IG5hcnJhdGVzIGluc3RlYWQuXG4gICAgICAgICBBc3NlcnRpdmUgYmVjYXVzZSB0aGUgbWVzc2FnZSBpcyB0aGUgb25seSBmZWVkYmFjayB0aGF0IHRoZSByb3cgbW92ZWQuIC0tPlxuICAgIDxkaXYgY2xhc3M9XCJvbmUtZ3JpZC12aXN1YWxseS1oaWRkZW5cIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCIgYXJpYS1hdG9taWM9XCJ0cnVlXCI+e3sgZHJhZ0Fubm91bmNlbWVudCB9fTwvZGl2PlxuICAgIEBpZiAoIW5vZGVzPy5sZW5ndGgpIHtcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJvbmUtZ3JpZC1lbXB0eS1tZXNzYWdlXCIgc3R5bGU9XCJwb3NpdGlvbjogYWJzb2x1dGU7IHRvcDogNTAlOyBsZWZ0OiA1MCU7IHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpO1wiPk5vIFJvd3MgdG8gU2hvdzwvc3Bhbj5cbiAgICB9XG5cbiAgICBAaWYgKHBpbm5lZEJvdHRvbU5vZGVzLmxlbmd0aCkge1xuICAgICAgICA8ZGl2ICNwaW5uZWRWaWV3cG9ydCBjbGFzcz1cIm9uZS1waW5uZWQtcm93cyBvbmUtcGlubmVkLXJvd3MtYm90dG9tXCIgcm9sZT1cInJvd2dyb3VwXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInBpbm5lZFJvd3NcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBub2RlczogcGlubmVkQm90dG9tTm9kZXMsIHNpZGU6ICdib3R0b20nIH1cIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgfVxuPC9kaXY+XG5cbjwhLS0gUGlubmVkIHJvd3MgYXJlIGRpc3BsYXktb25seTogdGhleSByZW5kZXIgZXhhY3RseSB3aGF0IGEgZGF0YSBjZWxsIHJlbmRlcnMsXG4gICAgIGJ1dCBjYXJyeSBub25lIG9mIGl0cyBpbnRlcmFjdGlvbnMuIEEgdG90YWxzIHJvdyBzaG91bGQgbm90IG9wZW4gYW4gZWRpdG9yXG4gICAgIG9uIGRvdWJsZS1jbGljayBvciBzdGFydCBhIHJhbmdlIHNlbGVjdGlvbiBvbiBkcmFnLiAtLT5cbjxuZy10ZW1wbGF0ZSAjcGlubmVkUm93cyBsZXQtbm9kZXM9XCJub2Rlc1wiIGxldC1zaWRlPVwic2lkZVwiPlxuICAgIEBmb3IgKG5vZGUgb2Ygbm9kZXM7IHRyYWNrIG5vZGUucm93SWQpIHtcbiAgICAgICAgPGRpdiBjbGFzcz1cIm9uZS1yb3cgb25lLXJvdy1waW5uZWRcIlxuICAgICAgICAgICAgcm9sZT1cInJvd1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLXJvd2luZGV4XT1cInBpbm5lZFJvd0FyaWFJbmRleChub2RlLCBzaWRlKVwiXG4gICAgICAgICAgICBbYXR0ci5kYXRhLXJvdy1pZF09XCJub2RlLnJvd0lkXCI+XG4gICAgICAgICAgICBAZm9yIChjb2x1bW4gb2YgY29sdW1uRGVmczsgdHJhY2sgY29sdW1uLmZpZWxkKSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm9uZS1jb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICByb2xlPVwiZ3JpZGNlbGxcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWNvbGluZGV4XT1cIiRpbmRleCArIDFcIlxuICAgICAgICAgICAgICAgICAgICBbYXR0ci5kYXRhLWNlbGwtaWRdPVwibm9kZS5yb3dJZCB8IGNlbGxLZXk6Y29sdW1uLmZpZWxkXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9uZS1jb2x1bW4tcGlubmVkLWxlZnRdPVwiY29sdW1uLnBpbm5lZCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2NsYXNzLm9uZS1jb2x1bW4tcGlubmVkLXJpZ2h0XT1cImNvbHVtbi5waW5uZWQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtZWRnZV09XCJjb2x1bW4uX3Bpbm5lZEVkZ2VcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdC5weF09XCJjb2x1bW4ucGlubmVkID09PSAnbGVmdCcgPyBjb2x1bW4uX3Bpbm5lZE9mZnNldCA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUucmlnaHQucHhdPVwiY29sdW1uLnBpbm5lZCA9PT0gJ3JpZ2h0JyA/IGNvbHVtbi5fcGlubmVkT2Zmc2V0IDogbnVsbFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aC5weF09XCJjb2x1bW4/LndpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1pbi13aWR0aC5weF09XCJjb2x1bW4/Lm1pbldpZHRoXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLm1heC13aWR0aC5weF09XCJjb2x1bW4/Lm1heFdpZHRoXCI+XG5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZUNlbGxSZW5kZXJlckNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyZXJDb21wb25lbnRdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJDb21wb25lbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwYXJhbXNdPVwicmVuZGVyZXJQYXJhbXMobm9kZSwgY29sdW1uKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQGVsc2UgaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogY29sdW1uLndpZHRoICsgJ3B4JywgcG9zaXRpb246ICdyZWxhdGl2ZScgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJub2RlLmNlbGxTdGF0ZXMgfCBjZWxsU3RhdGVSZW5kZXJlcjpjb2x1bW4uZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtY2VsbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtbGVmdF09XCJjb2x1bW4/LmFsaWduQ29udGVudCA9PT0gJ2xlZnQnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWxpZ24tY29udGVudC1jZW50ZXJdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdjZW50ZXInXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuYWxpZ24tY29udGVudC1yaWdodF09XCJjb2x1bW4/LmFsaWduQ29udGVudCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwiY29sU2VydmljZS5yZXNvbHZlQ2VsbENsYXNzKGNvbHVtbiwgY2VsbFBhcmFtcyhub2RlLCBjb2x1bW4pKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiY29sU2VydmljZS5yZXNvbHZlQ2VsbFN0eWxlKGNvbHVtbiwgY2VsbFBhcmFtcyhub2RlLCBjb2x1bW4pKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJvbmUtY2VsbC10ZXh0XCI+e3sgKG5vZGUuY2VsbFN0YXRlcyB8IGNlbGxTdGF0ZVJlbmRlcmVyOmNvbHVtbi5maWVsZCkgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvZGl2PlxuICAgIH1cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS0gTWFzdGVyIENvbHVtbiBUZW1wbGF0ZSAgLS0+XG48bmctdGVtcGxhdGUgI2NlbGxUZW1wbGF0ZSBsZXQtbm9kZT1cIm5vZGVcIiBsZXQtcm93SW5kZXg9XCJyb3dJbmRleFwiIGxldC1jb2x1bW49XCJjb2x1bW5cIiBsZXQtY29sSW5kZXg9XCJjb2xJbmRleFwiPlxuICAgIDxkaXZcbiAgICAgICAgY2xhc3M9XCJvbmUtY29sdW1uXCJcbiAgICAgICAgcm9sZT1cImdyaWRjZWxsXCJcbiAgICAgICAgW2F0dHIuYXJpYS1jb2xpbmRleF09XCJjb2xJbmRleCArIDFcIlxuICAgICAgICBbYXR0ci50YWJpbmRleF09XCJpc0FjdGl2ZUNlbGwobm9kZSwgY29sdW1uKSA/IDAgOiAtMVwiXG4gICAgICAgIFtjbGFzcy5vbmUtY2VsbC1hY3RpdmVdPVwiaXNBY3RpdmVDZWxsKG5vZGUsIGNvbHVtbilcIlxuICAgICAgICAoZm9jdXMpPVwib25DZWxsRm9jdXMobm9kZSwgY29sdW1uKVwiXG4gICAgICAgIFthdHRyLmRhdGEtY2VsbC1pZF09XCJub2RlLnJvd0lkIHwgY2VsbEtleTpjb2x1bW4uZmllbGRcIlxuICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtbGVmdF09XCJjb2x1bW4ucGlubmVkID09PSAnbGVmdCdcIlxuICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1waW5uZWQtcmlnaHRdPVwiY29sdW1uLnBpbm5lZCA9PT0gJ3JpZ2h0J1wiXG4gICAgICAgIFtjbGFzcy5vbmUtY29sdW1uLXBpbm5lZC1lZGdlXT1cImNvbHVtbi5fcGlubmVkRWRnZVwiXG4gICAgICAgIFtzdHlsZS5sZWZ0LnB4XT1cImNvbHVtbi5waW5uZWQgPT09ICdsZWZ0JyA/IGNvbHVtbi5fcGlubmVkT2Zmc2V0IDogbnVsbFwiXG4gICAgICAgIFtzdHlsZS5yaWdodC5weF09XCJjb2x1bW4ucGlubmVkID09PSAncmlnaHQnID8gY29sdW1uLl9waW5uZWRPZmZzZXQgOiBudWxsXCJcbiAgICAgICAgW3N0eWxlLndpZHRoLnB4XT1cImNvbHVtbj8ud2lkdGhcIlxuICAgICAgICBbc3R5bGUubWluLXdpZHRoLnB4XT1cImNvbHVtbj8ubWluV2lkdGhcIlxuICAgICAgICBbc3R5bGUubWF4LXdpZHRoLnB4XT1cImNvbHVtbj8ubWF4V2lkdGhcIlxuICAgICAgICBbY2xhc3Mub25lLWNvbHVtbi1ib3JkZXItdG9wXT1cIm1hc3RlckRldGFpbCAmJiBub2Rlcz8ubGVuZ3RoID4gMCAmJiBub2Rlc1tub2RlLnJvd0luZGV4IC0gMV0/LmV4cGFuZGVkXCJcbiAgICAgICAgW2NsYXNzLm9uZS1jZWxsLXNlbGVjdGVkXT1cInNlbGVjdGVkQ2VsbHMgfCBjZWxsU2VsZWN0ZWQ6bm9kZS5yb3dJZDpjb2x1bW4uZmllbGRcIlxuICAgICAgICBbY2xhc3Mub25lLWNlbGwtaW52YWxpZF09XCJub2RlLmNlbGxTdGF0ZXMgfCBjZWxsSW52YWxpZDpub2RlLmRhdGFbY29sdW1uLmZpZWxkXTpjb2x1bW46bm9kZTphbGxvd2VkRWRpdDpzdWJtaXR0ZWRcIlxuICAgICAgICAoZGJsY2xpY2spPVwic3RhcnRFZGl0KCRldmVudCwgbm9kZSwgY29sdW1uKVwiXG4gICAgICAgIChtb3VzZWRvd24pPVwic3RhcnRTZWxlY3Rpb24obm9kZS5yb3dJZCwgY29sdW1uLmZpZWxkKVwiXG4gICAgICAgIChtb3VzZWVudGVyKT1cImV4dGVuZFNlbGVjdGlvbihub2RlLnJvd0lkLCBjb2x1bW4uZmllbGQpXCJcbiAgICAgICAgKG1vdXNldXApPVwiZW5kU2VsZWN0aW9uKClcIj5cblxuICAgICAgICA8IS0tIE9uZSBHcmlkIENlbGwgT3B0aW9uIC0tPlxuICAgICAgICBAaWYgKG5vZGUuY2VsbE9wdGlvbnNbY29sdW1uLmZpZWxkXSkge1xuICAgICAgICAgICAgPG9uZS1ncmlkLWNlbGwtb3B0aW9uLW1lbnVcbiAgICAgICAgICAgICAgICAjY29udGV4dE9wdGlvbk1lbnVSZWZcbiAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbHVtblwiXG4gICAgICAgICAgICAgICAgW29wdGlvbnNdPVwiY29sdW1uLmNlbGxPcHRpb25NZW51XCJcbiAgICAgICAgICAgICAgICAoY2VsbE9wdGlvbk1lbnVTZWxlY3QpPVwiY2VsbE9wdGlvbk1lbnVTZWxlY3RlZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoY2VsbE9wdGlvbk1lbnVDbG9zZSk9XCJjZWxsT3B0aW9uTWVudUNsb3NlZCgpXCIvPlxuICAgICAgICB9XG5cbiAgICAgICAgPCEtLSBHcmlkIENlbGwgVGVtcGxhdGUgLS0+XG4gICAgICAgIEBpZihjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudCkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgIG9uZUNlbGxSZW5kZXJlckNvbXBvbmVudFxuICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyZXJDb21wb25lbnRdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJDb21wb25lbnRcIlxuICAgICAgICAgICAgICAgIFtwYXJhbXNdPVwicmVuZGVyZXJQYXJhbXMobm9kZSwgY29sdW1uKVwiPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYgKG5vZGUuZWRpdGluZ1tjb2x1bW4uZmllbGRdKSB7XG4gICAgICAgICAgICBAaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5pbnB1dFR5cGUgPT09ICdzZWxlY3QnKSB7XG4gICAgICAgICAgICAgICAgPCEtLSBDZWxsIEVkaXRpbmcgU2VsZWN0LiBDb21taXRzIG9uIGNoYW5nZSDigJQgcGlja2luZyBhbiBvcHRpb25cbiAgICAgICAgICAgICAgICAgICAgIGlzIHRoZSB3aG9sZSBlZGl0IOKAlCB3aXRoIGJsdXIgYXMgdGhlIGtleWJvYXJkIGZhbGxiYWNrLiAtLT5cbiAgICAgICAgICAgICAgICA8c2VsZWN0IGNsYXNzPVwib25lLWNlbGwtaW5wdXRcIlxuICAgICAgICAgICAgICAgICAgICBuYW1lPVwie3sgbm9kZS5yb3dJZCArICcnICsgY29sdW1uLmZpZWxkIH19XCJcbiAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzdG9wRWRpdFNlbGVjdChub2RlLCBjb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoYmx1cik9XCJzdG9wRWRpdFNlbGVjdChub2RlLCBjb2x1bW4sICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lc2MpPVwiY2FuY2VsRWRpdChub2RlLCBjb2x1bW4pXCI+XG4gICAgICAgICAgICAgICAgICAgIEBmb3IgKG9wdGlvbiBvZiBjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8uc2VsZWN0T3B0aW9ucyA/PyBbXTsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFtzZWxlY3RlZF09XCJvcHRpb24udmFsdWUgPT09IG5vZGUuZGF0YVtjb2x1bW4uZmllbGRdXCI+e3sgb3B0aW9uLmxhYmVsIH19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgRWRpdGluZyBJbnB1dCAtLT5cbiAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJvbmUtY2VsbC1pbnB1dFwiXG4gICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ7eyBub2RlLnJvd0lkICsgJycgKyBjb2x1bW4uZmllbGQgfX1cIlxuICAgICAgICAgICAgICAgICAgICBvbmVDZWxsSW5wdXRWYWxpZGF0b3JcbiAgICAgICAgICAgICAgICAgICAgW3ZhbGlkYXRpb25UeXBlXT1cImNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zPy5pbnB1dFR5cGUgPT09ICdudW1iZXInID8gJ251bWJlcicgOiAnbm9uZSdcIlxuICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LnBsYWNlaG9sZGVyXCJcbiAgICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiY29sdW1uPy5jZWxsUmVuZGVyZXJQYXJhbXM/LmlucHV0VHlwZSA9PT0gJ251bWJlcicgPyAndGV4dCcgOiBjb2x1bW4/LmNlbGxSZW5kZXJlclBhcmFtcz8uaW5wdXRUeXBlXCJcbiAgICAgICAgICAgICAgICAgICAgW3ZhbHVlXT1cIm5vZGU/LmRhdGFbY29sdW1uPy5maWVsZF1cIlxuICAgICAgICAgICAgICAgICAgICBbbWF4TGVuZ3RoXT1cIjI1MFwiXG4gICAgICAgICAgICAgICAgICAgIChibHVyKT1cInN0b3BFZGl0KG5vZGUsIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInN0b3BFZGl0KG5vZGUsIGNvbHVtbiwgJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIChrZXlkb3duLmVzYyk9XCJjYW5jZWxFZGl0KG5vZGUsIGNvbHVtbilcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgQGVsc2UgaWYgKGNvbHVtbj8uY2VsbFJlbmRlcmVyKSB7XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyB3aWR0aDogY29sdW1uLndpZHRoICsgJ3B4JyAsIHBvc2l0aW9uOiAncmVsYXRpdmUnIH1cIlxuICAgICAgICAgICAgICAgIFtpbm5lckhUTUxdPVwibm9kZS5jZWxsU3RhdGVzIHwgY2VsbFN0YXRlUmVuZGVyZXI6Y29sdW1uLmZpZWxkXCJcbiAgICAgICAgICAgICAgICBbY2xhc3MuZWRpdGFibGUtYWN0aXZlXT1cIm5vZGUuY2VsbFN0YXRlcyB8IGNlbGxFZGl0YWJsZTpjb2x1bW46bm9kZTpjZWxsU2VydmljZS5lZGl0YWJsZUZuOmNlbGxTZXJ2aWNlLnVwZGF0YWJsZUZuOmFsbG93ZWRFZGl0XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgICAgICBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwib25lLWNlbGxcIlxuICAgICAgICAgICAgICAgIFtjbGFzcy5hbGlnbi1jb250ZW50LWxlZnRdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdsZWZ0J1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtY2VudGVyXT1cImNvbHVtbj8uYWxpZ25Db250ZW50ID09PSAnY2VudGVyJ1wiXG4gICAgICAgICAgICAgICAgW2NsYXNzLmFsaWduLWNvbnRlbnQtcmlnaHRdPVwiY29sdW1uPy5hbGlnbkNvbnRlbnQgPT09ICdyaWdodCdcIlxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cImNvbFNlcnZpY2UucmVzb2x2ZUNlbGxDbGFzcyhjb2x1bW4sIGNlbGxQYXJhbXMobm9kZSwgY29sdW1uKSlcIlxuICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImNvbFNlcnZpY2UucmVzb2x2ZUNlbGxTdHlsZShjb2x1bW4sIGNlbGxQYXJhbXMobm9kZSwgY29sdW1uKSlcIlxuICAgICAgICAgICAgICAgIFtzdHlsZS5wYWRkaW5nLWxlZnQucHhdPVwiY29sdW1uLmF1dG9Hcm91cEZpZWxkICYmIG5vZGUubGV2ZWwgfCBjZWxsTGV2ZWxQYWRkaW5nOjI0XCJcbiAgICAgICAgICAgICAgICBbY2xhc3Mub25lLWNlbGwtYWxsb3dlZC1lZGl0LWFjdGl2ZV09XCJub2RlLmNlbGxTdGF0ZXMgfCBjZWxsRWRpdGFibGU6Y29sdW1uOm5vZGU6Y2VsbFNlcnZpY2UuZWRpdGFibGVGbjpjZWxsU2VydmljZS51cGRhdGFibGVGbjphbGxvd2VkRWRpdFwiPlxuXG4gICAgICAgICAgICAgICAgPCEtLSBSb3cgRHJhZyBIYW5kbGUgLS0+XG4gICAgICAgICAgICAgICAgQGlmIChjZWxsU2VydmljZS5yb3dEcmFnRm4oY29sdW1uLCBub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtcm93LWRyYWctaGFuZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdXBwcmVzc2VkUmVhc29uXT1cInJvd0RyYWdTdXBwcmVzc2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkcmFnRW5kKT1cIm9uUm93RHJhZ0VuZCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8IS0tIENlbGwgQ2hlY2tib3ggU2VsZWN0aW9uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uPy5jaGVja2JveFNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICA8b25lLWdyaWQtY2hlY2tib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtub2RlXT1cIm5vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2FsbG93ZWRFZGl0XT1cImFsbG93ZWRFZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthcGldPVwiYXBpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd1NlbGVjdGlvbik9XCJpbnZva2VSb3dBY3Rpb25TZWxlY3Rpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSBFeHBhbmQgJiBDb2xsYXBzZSBJY29uIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoKChub2RlPy5ncm91cCB8fCBkZXRhaWxSZW5kZXJlckNvbXBvbmVudCkgJiYgY29sdW1uPy5hdXRvR3JvdXBGaWVsZCkgfHwgKG1hc3RlckRldGFpbCAmJiBub2RlPy5leHBhbmRhYmxlICYmIGdyaWRUeXBlID09PSAnbWFzdGVyJyAmJiBjb2x1bW4/Lm1hc3Rlckdyb3VwRmllbGQpKSB7XG4gICAgICAgICAgICAgICAgICAgIDxvbmUtZ3JpZC1jZWxsLWdyb3VwLXJlbmRlcmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbm9kZV09XCJub2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttYXN0ZXJEZXRhaWxdPVwibWFzdGVyRGV0YWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxDZWxsUmVuZGVyZXJQYXJhbXNdPVwiZGV0YWlsQ2VsbFJlbmRlcmVyUGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkZXRhaWxSZW5kZXJlckNvbXBvbmVudF09XCJkZXRhaWxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZXhwYW5zaW9uQ2hhbmdlZCk9XCJpbnZva2VFeHBhbnNpb25DaGFuZ2VkQ2xpY2soJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgQGlmKGNvbHVtbj8uY2VsbFJlbmRlcmVyQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uZUNlbGxSZW5kZXJlckNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJlckNvbXBvbmVudF09XCJjb2x1bW4/LmNlbGxSZW5kZXJlckNvbXBvbmVudFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGFyYW1zXT1cInJlbmRlcmVyUGFyYW1zKG5vZGUsIGNvbHVtbilcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIEBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgPCEtLSBDZWxsIFZhbHVlIE9SIFBsYWNlaG9sZGVyIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IG9uZUNlbGxUZXh0RXhwYW5kIGNsYXNzPVwib25lLWNlbGwtdGV4dFwiIFtjbGFzcy5vbmUtY2VsbC1wbGFjZWhvbGRlcl09XCJub2RlLmNlbGxTdGF0ZXNbY29sdW1uLmZpZWxkXT8udHlwZSA9PT0gJ3BsYWNlaG9sZGVyJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgKG5vZGUuY2VsbFN0YXRlcyB8IGNlbGxTdGF0ZVJlbmRlcmVyOmNvbHVtbi5maWVsZCkgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPCEtLSBDZWxsIEFjdGlvbiBCdXR0b25zIC0tPlxuICAgICAgICAgICAgICAgIEBpZiAoY29sdW1uLmNlbGxSZW5kZXJlclBhcmFtcyB8IGNlbGxBY3Rpb25CdXR0b25FbmFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgPG9uZS1ncmlkLXJvdy1hY3Rpb25cbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsgbWFyZ2luTGVmdDogJ2F1dG8nIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb2x1bW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25vZGVdPVwibm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYWxsb3dlZEVkaXRdPVwiYWxsb3dlZEVkaXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW21hc3Rlck5vZGVdPVwibWFzdGVyTm9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbbWFzdGVyRGV0YWlsXT1cIm1hc3RlckRldGFpbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZ3JpZFR5cGVdPVwiZ3JpZFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NvbnRleHRdPVwiY29udGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2VsbFJlbmRlcmVyUGFyYW1zXT1cImNvbHVtbj8uY2VsbFJlbmRlcmVyUGFyYW1zXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0dvdG9EZXRhaWwpPVwiaW52b2tlUm93QWN0aW9uR290b0RldGFpbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0FkZE5ldyk9XCJpbnZva2VSb3dBY3Rpb25BZGROZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dWaWV3KT1cImludm9rZVJvd0FjdGlvblZpZXcoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dMb2NhdGlvbik9XCJpbnZva2VSb3dBY3Rpb25Mb2NhdGlvbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0RvY3VtZW50KT1cImludm9rZVJvd0FjdGlvbkRvY3VtZW50KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93Q29weSk9XCJpbnZva2VSb3dBY3Rpb25Db3B5KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93RGVsZXRlKT1cImludm9rZVJvd0FjdGlvbkRlbGV0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvblJvd0dvdG9MaXN0KT1cImludm9rZVJvd0FjdGlvbkdvdG9MaXN0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93RWRpdCk9XCJpbnZva2VSb3dBY3Rpb25FZGl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93UHJpbnQpPVwiaW52b2tlUm93QWN0aW9uUHJpbnQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dIaXN0b3J5KT1cImludm9rZVJvd0FjdGlvbkhpc3RvcnkoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dPcHRpb24pPVwiaW52b2tlUm93QWN0aW9uT3B0aW9uKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG9uUm93TGFuZ3VhZ2UpPVwiaW52b2tlUm93QWN0aW9uTGFuZ3VhZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAob25Sb3dDZWxsT3B0aW9uKT1cImludm9rZVJvd0FjdGlvbkNlbGxPcHRpb24oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|