@rivet-health/design-system 40.27.2 → 40.28.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/esm2020/lib/table/simple-table/simple-table.component.mjs +3 -2
  2. package/esm2020/lib/table/table/state-helpers/column-helpers.mjs +255 -0
  3. package/esm2020/lib/table/table/state-helpers/display-helpers.mjs +48 -0
  4. package/esm2020/lib/table/table/state-helpers/order-helpers.mjs +143 -0
  5. package/esm2020/lib/table/table/state-helpers/pagination-helpers.mjs +174 -0
  6. package/esm2020/lib/table/table/state-helpers/result-helpers.mjs +77 -0
  7. package/esm2020/lib/table/table/state-helpers/search-helpers.mjs +28 -0
  8. package/esm2020/lib/table/table/state-helpers/selection-helpers.mjs +180 -0
  9. package/esm2020/lib/table/table/state.mjs +73 -631
  10. package/esm2020/lib/table/table/table-header-resize-handle/table-header-resize-handle.component.mjs +4 -4
  11. package/fesm2015/rivet-health-design-system.mjs +821 -513
  12. package/fesm2015/rivet-health-design-system.mjs.map +1 -1
  13. package/fesm2020/rivet-health-design-system.mjs +962 -633
  14. package/fesm2020/rivet-health-design-system.mjs.map +1 -1
  15. package/lib/table/table/state-helpers/column-helpers.d.ts +14 -0
  16. package/lib/table/table/state-helpers/display-helpers.d.ts +5 -0
  17. package/lib/table/table/state-helpers/order-helpers.d.ts +12 -0
  18. package/lib/table/table/state-helpers/pagination-helpers.d.ts +13 -0
  19. package/lib/table/table/state-helpers/result-helpers.d.ts +11 -0
  20. package/lib/table/table/state-helpers/search-helpers.d.ts +5 -0
  21. package/lib/table/table/state-helpers/selection-helpers.d.ts +13 -0
  22. package/lib/table/table/state.d.ts +48 -1
  23. package/package.json +1 -1
@@ -1,7 +1,14 @@
1
1
  import Fuse from 'fuse.js';
2
- import { defaultsDeep, difference, isEqual, orderBy, range, toInteger, union, } from 'lodash';
2
+ import { defaultsDeep, isEqual } from 'lodash';
3
3
  import { connectable, filter, from, map, mergeScan, ReplaySubject, scan, share, Subject, } from 'rxjs';
4
4
  import { toSentenceCase } from '../../format/pipes/sentence-case.pipe';
5
+ import { TableColumnHelpers } from './state-helpers/column-helpers';
6
+ import { TableDisplayHelpers } from './state-helpers/display-helpers';
7
+ import { TableOrderHelpers } from './state-helpers/order-helpers';
8
+ import { TablePaginationHelpers } from './state-helpers/pagination-helpers';
9
+ import { TableResultHelpers } from './state-helpers/result-helpers';
10
+ import { TableSearchHelpers } from './state-helpers/search-helpers';
11
+ import { TableSelectionHelpers } from './state-helpers/selection-helpers';
5
12
  export var RivTable;
6
13
  (function (RivTable) {
7
14
  RivTable.pageSizes = [25, 50, 100, 250];
@@ -73,8 +80,8 @@ export var RivTable;
73
80
  const csvExportAllowed = !(options?.getRowSpanForCell || options?.customSummaryRow);
74
81
  // Augment state with derived state, and subscribe.
75
82
  const state = connectable(coreState.pipe(map(({ state: s }) => {
76
- const resolvedColumns = resolveColumns(s, columns, columnNameMap, !!options?.allowSelection);
77
- if (isGroupResult(s.result)) {
83
+ const resolvedColumns = TableColumnHelpers.resolveColumns(s, columns, columnNameMap, !!options?.allowSelection);
84
+ if (TableResultHelpers.isGroupResult(s.result)) {
78
85
  if (options?.getRowSpanForCell) {
79
86
  // eslint-disable-next-line no-console
80
87
  console.warn('Heads up! Custom row spans are not supported for grouped tables.');
@@ -89,9 +96,9 @@ export var RivTable;
89
96
  rowLink: options?.rowLink
90
97
  ? options.rowLink(row, group.groupData)
91
98
  : null,
92
- selected: isRowSelected(s, row.id),
99
+ selected: TableSelectionHelpers.isRowSelected(s, row.id),
93
100
  })),
94
- selected: isGroupSelected(s, group),
101
+ selected: TableSelectionHelpers.isGroupSelected(s, group),
95
102
  totalMatchingRowCount: group.totalMatchingRowCount,
96
103
  groupData: group.groupData,
97
104
  }));
@@ -108,9 +115,9 @@ export var RivTable;
108
115
  pageSize: s.result.totalMatchingRowCount,
109
116
  },
110
117
  }, { type: 'load' });
111
- if (!isGroupResult(dataSet))
118
+ if (!TableResultHelpers.isGroupResult(dataSet))
112
119
  throw new Error('Returned non-grouped CSV data for grouped table');
113
- const fullColumns = resolveColumns(s, columns, columnNameMap, !!options.allowSelection);
120
+ const fullColumns = TableColumnHelpers.resolveColumns(s, columns, columnNameMap, !!options.allowSelection);
114
121
  const data = [];
115
122
  data.push(fullColumns.map(({ key }) => columnNameMap.get(key) ?? key));
116
123
  if (groupCellFormatter) {
@@ -121,7 +128,8 @@ export var RivTable;
121
128
  group: groups.groupData,
122
129
  })))) {
123
130
  const record = rowItem.row;
124
- if (mode === 'selection' && !isRowSelected(s, record.id))
131
+ if (mode === 'selection' &&
132
+ !TableSelectionHelpers.isRowSelected(s, record.id))
125
133
  continue;
126
134
  const row = [];
127
135
  for (const column of fullColumns) {
@@ -140,23 +148,23 @@ export var RivTable;
140
148
  ...s.query,
141
149
  pagination: {
142
150
  ...s.query.pagination,
143
- previous: getPreviousPage(s),
144
- pages: getPages(s),
145
- next: getNextPage(s),
146
- pageCount: getPageCount(s),
147
- showControls: getShowPaginationControls(s),
148
- pageRowStart: getPageRowStart(s),
149
- pageRowEnd: getPageRowEnd(s),
151
+ previous: TablePaginationHelpers.getPreviousPage(s),
152
+ pages: TablePaginationHelpers.getPages(s),
153
+ next: TablePaginationHelpers.getNextPage(s),
154
+ pageCount: TablePaginationHelpers.getPageCount(s),
155
+ showControls: TablePaginationHelpers.getShowPaginationControls(s),
156
+ pageRowStart: TablePaginationHelpers.getPageRowStart(s),
157
+ pageRowEnd: TablePaginationHelpers.getPageRowEnd(s),
150
158
  },
151
- noSearchColumnsSelected: getSearchColumnsSelectedState(s, 'none'),
159
+ noSearchColumnsSelected: TableSearchHelpers.getSearchColumnsSelectedState(s, 'none'),
152
160
  },
153
161
  display: {
154
162
  ...s.display,
155
163
  columns: resolvedColumns,
156
- allColumns: getAllColumns(s, columns, columnNameMap),
164
+ allColumns: TableColumnHelpers.getAllColumns(s, columns, columnNameMap),
157
165
  columnNameMap: columnNameMap,
158
166
  searchableColumnMap: searchableColumnMap,
159
- zeroStateMessage: getZeroStateMessage(s, pluralEntityName),
167
+ zeroStateMessage: TableDisplayHelpers.getZeroStateMessage(s, pluralEntityName),
160
168
  columnsAreFreezable: !!options?.columnsAreFreezable,
161
169
  columnsAreHideable: !!options?.columnsAreHideable,
162
170
  columnsAreReorderable: options?.columnsAreReorderable ?? true,
@@ -171,9 +179,9 @@ export var RivTable;
171
179
  selection: {
172
180
  ...s.selection,
173
181
  allowSelection: options?.allowSelection ?? false,
174
- isAllSelected: isAllSelected(s),
175
- isCurrentPageSelected: isCurrentPageSelected(s),
176
- selectedCount: selectedCount(s),
182
+ isAllSelected: TableSelectionHelpers.isAllSelected(s),
183
+ isCurrentPageSelected: TableSelectionHelpers.isCurrentPageSelected(s),
184
+ selectedCount: TableSelectionHelpers.selectedCount(s),
177
185
  },
178
186
  result: {
179
187
  ...s.result,
@@ -181,7 +189,7 @@ export var RivTable;
181
189
  rowGroups,
182
190
  rows: rowGroups.flatMap(group => group.rows),
183
191
  csvData,
184
- csvFilename: getCsvFilename(pluralEntityName, options),
192
+ csvFilename: TableResultHelpers.getCsvFilename(pluralEntityName, options),
185
193
  },
186
194
  };
187
195
  }
@@ -189,9 +197,9 @@ export var RivTable;
189
197
  const rows = s.result.currentPageData.map(row => ({
190
198
  ...row,
191
199
  rowLink: options?.rowLink ? options.rowLink(row) : null,
192
- selected: isRowSelected(s, row.id),
200
+ selected: TableSelectionHelpers.isRowSelected(s, row.id),
193
201
  }));
194
- const cellRowSpanCache = memoizedCellRowSpan(s, resolvedColumns, options);
202
+ const cellRowSpanCache = TableDisplayHelpers.memoizedCellRowSpan(s, resolvedColumns, options);
195
203
  const cellRowSpan = (rowIndex, column) => cellRowSpanCache?.get(column)?.[rowIndex] ?? 1;
196
204
  const hasAnyRowSpans = cellRowSpanCache
197
205
  ? [...cellRowSpanCache.values()].some(spans => spans.some(span => span > 1))
@@ -212,13 +220,14 @@ export var RivTable;
212
220
  pageSize: s.result.totalMatchingRowCount,
213
221
  },
214
222
  }, { type: 'load' });
215
- if (isGroupResult(dataSet))
223
+ if (TableResultHelpers.isGroupResult(dataSet))
216
224
  throw new Error('Returned grouped CSV data for non-grouped table');
217
- const fullColumns = resolveColumns(s, columns, columnNameMap, !!options.allowSelection);
225
+ const fullColumns = TableColumnHelpers.resolveColumns(s, columns, columnNameMap, !!options.allowSelection);
218
226
  const data = [];
219
227
  data.push(fullColumns.map(({ key }) => columnNameMap.get(key) ?? key));
220
228
  for (const record of dataSet.currentPageData) {
221
- if (mode === 'selection' && !isRowSelected(s, record.id))
229
+ if (mode === 'selection' &&
230
+ !TableSelectionHelpers.isRowSelected(s, record.id))
222
231
  continue;
223
232
  const row = [];
224
233
  for (const column of fullColumns) {
@@ -235,23 +244,23 @@ export var RivTable;
235
244
  order: hasAnyRowSpans ? null : s.query.order,
236
245
  pagination: {
237
246
  ...s.query.pagination,
238
- previous: getPreviousPage(s),
239
- pages: getPages(s),
240
- next: getNextPage(s),
241
- pageCount: getPageCount(s),
242
- showControls: getShowPaginationControls(s),
243
- pageRowStart: getPageRowStart(s),
244
- pageRowEnd: getPageRowEnd(s),
247
+ previous: TablePaginationHelpers.getPreviousPage(s),
248
+ pages: TablePaginationHelpers.getPages(s),
249
+ next: TablePaginationHelpers.getNextPage(s),
250
+ pageCount: TablePaginationHelpers.getPageCount(s),
251
+ showControls: TablePaginationHelpers.getShowPaginationControls(s),
252
+ pageRowStart: TablePaginationHelpers.getPageRowStart(s),
253
+ pageRowEnd: TablePaginationHelpers.getPageRowEnd(s),
245
254
  },
246
- noSearchColumnsSelected: getSearchColumnsSelectedState(s, 'none'),
255
+ noSearchColumnsSelected: TableSearchHelpers.getSearchColumnsSelectedState(s, 'none'),
247
256
  },
248
257
  display: {
249
258
  ...s.display,
250
259
  columns: resolvedColumns.map(column => hasAnyRowSpans ? { ...column, orderable: false } : column),
251
- allColumns: getAllColumns(s, columns, columnNameMap),
260
+ allColumns: TableColumnHelpers.getAllColumns(s, columns, columnNameMap),
252
261
  columnNameMap: columnNameMap,
253
262
  searchableColumnMap: searchableColumnMap,
254
- zeroStateMessage: getZeroStateMessage(s, pluralEntityName),
263
+ zeroStateMessage: TableDisplayHelpers.getZeroStateMessage(s, pluralEntityName),
255
264
  columnsAreFreezable: !!options?.columnsAreFreezable,
256
265
  columnsAreHideable: !!options?.columnsAreHideable,
257
266
  columnsAreReorderable: options?.columnsAreReorderable ?? true,
@@ -273,9 +282,9 @@ export var RivTable;
273
282
  selection: {
274
283
  ...s.selection,
275
284
  allowSelection: options?.allowSelection ?? false,
276
- isAllSelected: isAllSelected(s),
277
- isCurrentPageSelected: isCurrentPageSelected(s),
278
- selectedCount: selectedCount(s),
285
+ isAllSelected: TableSelectionHelpers.isAllSelected(s),
286
+ isCurrentPageSelected: TableSelectionHelpers.isCurrentPageSelected(s),
287
+ selectedCount: TableSelectionHelpers.selectedCount(s),
279
288
  },
280
289
  result: {
281
290
  ...s.result,
@@ -287,7 +296,7 @@ export var RivTable;
287
296
  totalMatchingRowCount: rows.length,
288
297
  groupData: { key: '' },
289
298
  },
290
- csvFilename: getCsvFilename(pluralEntityName, options),
299
+ csvFilename: TableResultHelpers.getCsvFilename(pluralEntityName, options),
291
300
  csvData,
292
301
  },
293
302
  };
@@ -307,9 +316,6 @@ export var RivTable;
307
316
  return { actions, state, effects };
308
317
  }
309
318
  RivTable.createManager = createManager;
310
- function orderEmptyLast(rows, key, direction) {
311
- return orderBy(rows, [row => row[key] == null, key], ['asc', direction]);
312
- }
313
319
  function createInMemoryManager(fetchDataset, columns, pluralEntityName, options) {
314
320
  let data;
315
321
  let fuse;
@@ -369,14 +375,14 @@ export var RivTable;
369
375
  const matches = fuse.search(query.search).map(result => result.item);
370
376
  ordered =
371
377
  hasExplicitSort && query.order
372
- ? orderEmptyLast(matches, orderColumn, query.order.direction)
378
+ ? TableOrderHelpers.orderEmptyLast(matches, orderColumn, query.order.direction)
373
379
  : matches;
374
380
  }
375
381
  else if (hasExplicitSort && query.order) {
376
- ordered = orderEmptyLast(data, orderColumn, query.order.direction);
382
+ ordered = TableOrderHelpers.orderEmptyLast(data, orderColumn, query.order.direction);
377
383
  }
378
384
  else if (query.order == null && defaultSortSpec) {
379
- ordered = orderEmptyLast(data, defaultSortSpec.key, defaultSortSpec.direction);
385
+ ordered = TableOrderHelpers.orderEmptyLast(data, defaultSortSpec.key, defaultSortSpec.direction);
380
386
  }
381
387
  else {
382
388
  ordered = data;
@@ -426,26 +432,6 @@ export var RivTable;
426
432
  return createManager(source, columnMetadata, pluralEntityName, options);
427
433
  }
428
434
  RivTable.createInMemoryManager = createInMemoryManager;
429
- ///////////////
430
- // Utilities //
431
- ///////////////
432
- function getColumnAlignment(dataType, isFirst) {
433
- if (isFirst)
434
- return 'left';
435
- switch (dataType) {
436
- case 'date':
437
- case 'longText':
438
- return 'left';
439
- case 'advanced':
440
- case 'icon':
441
- case 'shortText':
442
- return 'center';
443
- case 'currency':
444
- case 'number':
445
- return 'right';
446
- }
447
- }
448
- RivTable.getColumnAlignment = getColumnAlignment;
449
435
  })(RivTable || (RivTable = {}));
450
436
  /**
451
437
  * This function keeps the state object references as stable as possible, which
@@ -483,384 +469,6 @@ function stableState(target, source) {
483
469
  }
484
470
  return target;
485
471
  }
486
- function getPageCount(state) {
487
- if (isGroupResult(state.result)) {
488
- return Math.max(Math.ceil(state.result.totalGroupCount / state.query.grouping.groupsPerPage), 1);
489
- }
490
- return Math.max(Math.ceil(state.result.totalMatchingRowCount / state.query.pagination.pageSize), 1);
491
- }
492
- function getPreviousPage(state) {
493
- return state.query.pagination.page === 0
494
- ? null
495
- : state.query.pagination.page - 1;
496
- }
497
- function getPages(state) {
498
- const padding = 4;
499
- const min = 0;
500
- const max = getPageCount(state) - 1;
501
- const desiredStart = state.query.pagination.page - padding;
502
- const clampedStart = Math.max(min, desiredStart);
503
- const desiredEnd = state.query.pagination.page + padding;
504
- const clampedEnd = Math.min(max, desiredEnd);
505
- const start = Math.max(min, clampedStart - (desiredEnd - clampedEnd));
506
- const end = Math.min(max, clampedEnd + (clampedStart - desiredStart));
507
- return range(start, end + 1);
508
- }
509
- function getNextPage(state) {
510
- const max = getPageCount(state) - 1;
511
- const next = state.query.pagination.page + 1;
512
- return next <= max ? next : null;
513
- }
514
- // We don't want to show the pagination controls when they are unnecessary.
515
- function getShowPaginationControls(state) {
516
- if (state.query.pagination.page > 0) {
517
- return true;
518
- }
519
- if (isGroupResult(state.result)) {
520
- return state.result.totalGroupCount > state.query.grouping.groupsPerPage;
521
- }
522
- return (state.result.totalMatchingRowCount > Math.min(...[...RivTable.pageSizes]));
523
- }
524
- function getPageRowStart(state) {
525
- return state.query.pagination.page * state.query.pagination.pageSize + 1;
526
- }
527
- function getPageRowEnd(state) {
528
- return Math.min((state.query.pagination.page + 1) * state.query.pagination.pageSize, state.result.totalMatchingRowCount);
529
- }
530
- function getCsvFilename(pluralEntityName, options) {
531
- return (options?.csvFileBasename?.slice(0, 200) ?? pluralEntityName) + '.csv';
532
- }
533
- function memoizedCellRowSpan(s, fullColumns, options) {
534
- const getRowSpanForCell = options?.getRowSpanForCell;
535
- const result = s.result;
536
- // If the dataset exceeds the current page size, skip span calculations.
537
- if (s.result.totalMatchingRowCount > s.query.pagination.pageSize)
538
- return null;
539
- // If the user hasn't provided the row span configuration, default to no spanning
540
- if (!getRowSpanForCell)
541
- return null;
542
- // Row spanning is not supported on grouped tables.
543
- if (isGroupResult(result))
544
- return null;
545
- // Memoize the user's configuration for the current page.
546
- return new Map(fullColumns.map(column => [
547
- column.key,
548
- result.currentPageData.map((_, i) => {
549
- const raw = getRowSpanForCell(i, column.key);
550
- if (raw === 0)
551
- return 0;
552
- else
553
- return Math.max(1, toInteger(raw));
554
- }),
555
- ]));
556
- }
557
- function getAllColumns(state, supportedColumns, columnNameMap) {
558
- // If the table offers more columns than the user has configuration settings
559
- // for (or if the user has no configuration settings yet), we'll append them
560
- // to the end (unless they should be pinned by default, in which case we'll
561
- // append them after the other pinned columns). This ensures that new columns
562
- // we add to existing tables over time (1) get displayed even though they
563
- // don't appear in the user's configuration settings yet, and (2) don't
564
- // interrupt their existing setup.
565
- const columnNamesWithoutUserSettings = difference([...supportedColumns.keys()], state.display.columnSettings.map(({ key }) => key));
566
- // Throw out settings for columns no longer offered by the table.
567
- const columnsWithUserSettings = state.display.columnSettings.filter(({ key }) => supportedColumns.has(key));
568
- const columnsWithoutUserSettings = [
569
- ...columnNamesWithoutUserSettings,
570
- ].map((key) => ({
571
- key,
572
- enabled: true,
573
- preferredWidth: 'auto',
574
- pinned: !!supportedColumns.get(key)?.defaultPinned,
575
- }));
576
- return orderIntentionally([...columnsWithUserSettings, ...columnsWithoutUserSettings], columnNameMap);
577
- }
578
- function orderIntentionally(columns, columnNameMap) {
579
- return [
580
- ...columns.filter(v => v.pinned),
581
- ...columns.filter(v => v.enabled && !v.pinned),
582
- ...columns
583
- .filter(v => !v.enabled && !v.pinned)
584
- .sort((a, b) => {
585
- const aName = columnNameMap.get(a.key) ?? a.key;
586
- const bName = columnNameMap.get(b.key) ?? b.key;
587
- return aName.localeCompare(bName);
588
- }),
589
- ];
590
- }
591
- function getAlignment(metadata, index, allowSelection) {
592
- return RivTable.getColumnAlignment(metadata.dataType, index === 0 && !allowSelection);
593
- }
594
- function resolveColumns(state, supportedColumns, columnNameMap, allowSelection) {
595
- const allColumns = getAllColumns(state, supportedColumns, columnNameMap);
596
- return allColumns
597
- .filter(({ enabled }) => enabled)
598
- .reduce((fullColumns, settings, i) => {
599
- const metadata = supportedColumns.get(settings.key);
600
- const resolvedWidth = settings.preferredWidth === 'auto'
601
- ? metadata.minWidth
602
- : Math.max(metadata.minWidth, settings.preferredWidth);
603
- const previousColumn = fullColumns[i - 1];
604
- return [
605
- ...fullColumns,
606
- {
607
- ...settings,
608
- ...metadata,
609
- width: resolvedWidth,
610
- left: settings.pinned
611
- ? previousColumn
612
- ? (previousColumn.left || 0) + previousColumn.width
613
- : !!allowSelection
614
- ? 40
615
- : 0
616
- : null,
617
- alignment: getAlignment(metadata, i, !!allowSelection),
618
- },
619
- ];
620
- }, []);
621
- }
622
- function getZeroStateMessage(state, entity) {
623
- if ((isGroupResult(state.result) && state.result.totalGroupCount > 0) ||
624
- (!isGroupResult(state.result) && state.result.totalMatchingRowCount > 0))
625
- return null;
626
- const allSearchColumnsSelected = getSearchColumnsSelectedState(state, 'all');
627
- if (state.query.search && allSearchColumnsSelected)
628
- return `No ${entity} match your current search keyword.`;
629
- if (state.query.search && !allSearchColumnsSelected)
630
- return `No ${entity} match your current search keyword in the selected search columns.`;
631
- if (state.query.filters)
632
- return `No ${entity} match your current filters.`;
633
- return `No ${entity}.`;
634
- }
635
- function changeColumnPin(state, columns, columnNameMap, column, pinned) {
636
- const allColumns = getAllColumns(state, columns, columnNameMap);
637
- if (pinned) {
638
- const target = allColumns.find(c => c.key === column);
639
- const wasEnabled = !!target?.enabled;
640
- if (!wasEnabled) {
641
- const enabledCount = allColumns.filter(col => col.enabled).length;
642
- if (enabledCount >= RivTable.ColumnsMaxShown) {
643
- return state; // refuse the pin since it would exceed the max
644
- }
645
- }
646
- }
647
- return {
648
- ...state,
649
- display: {
650
- ...state.display,
651
- columnSettings: orderIntentionally(allColumns.map(c => ({
652
- ...c,
653
- pinned: c.key === column ? pinned : c.pinned,
654
- // Check/enable if being pinned
655
- enabled: c.key === column && pinned ? true : c.enabled,
656
- })), columnNameMap),
657
- },
658
- };
659
- }
660
- function changeColumnsFreezeState(state, columns, columnNameMap, index, freeze) {
661
- const allColumns = getAllColumns(state, columns, columnNameMap);
662
- return {
663
- ...state,
664
- display: {
665
- ...state.display,
666
- columnSettings: allColumns.map((c, i) => {
667
- return { ...c, pinned: freeze && i <= index };
668
- }),
669
- },
670
- };
671
- }
672
- function moveColumnTo(state, columns, columnNameMap, column, position) {
673
- const allColumns = getAllColumns(state, columns, columnNameMap);
674
- const previousIndex = allColumns.findIndex(c => c.key === column);
675
- const lastIndex = position == 'end' ? allColumns.findIndex(c => !c.enabled) : 0;
676
- const newIndex = position == 'start'
677
- ? 0
678
- : lastIndex == -1
679
- ? allColumns.length - 1
680
- : lastIndex;
681
- if (!allColumns[previousIndex].enabled &&
682
- allColumns.filter(col => col.enabled).length >= RivTable.ColumnsMaxShown)
683
- return state;
684
- const movedState = changeColumnOrder(state, columns, columnNameMap, previousIndex, newIndex);
685
- //Make sure the column is enabled
686
- return changeColumnEnabled(movedState, columns, columnNameMap, column, true);
687
- }
688
- function changeColumnOrder(state, columns, columnNameMap, previousIndex, newIndex) {
689
- const allColumns = getAllColumns(state, columns, columnNameMap);
690
- // First, put the columns in the desired order.
691
- const item = allColumns[previousIndex];
692
- const withoutItem = allColumns.filter((_, i) => i !== previousIndex);
693
- const reordered = [
694
- ...withoutItem.slice(0, newIndex),
695
- item,
696
- ...withoutItem.slice(newIndex),
697
- ];
698
- // Then, we may need to fix the pins (all pinned columns appear at the
699
- // beginning of the columns array) since the user is allowed to drag
700
- // and drop columns to and from the pinned area. If the user drags a
701
- // column across that threshold, update its pinned status.
702
- const updated = reordered.map((settings, i, arr) => {
703
- if (newIndex === i) {
704
- return {
705
- ...settings,
706
- pinned: settings.pinned
707
- ? arr[i - 1]?.pinned ?? true
708
- : arr[i + 1]?.pinned ?? false,
709
- enabled: settings.enabled
710
- ? arr[i - 1]?.enabled ?? true
711
- : arr[i + 1]?.enabled ?? false,
712
- };
713
- }
714
- else
715
- return settings;
716
- });
717
- const wasDisabled = !item.enabled;
718
- const becameEnabled = updated[newIndex].enabled;
719
- if (wasDisabled && becameEnabled) {
720
- const enabledCount = allColumns.filter(c => c.enabled).length;
721
- if (enabledCount >= RivTable.ColumnsMaxShown) {
722
- // Refuse the move; keep state as-is
723
- return state;
724
- }
725
- }
726
- return {
727
- ...state,
728
- display: {
729
- ...state.display,
730
- columnSettings: orderIntentionally(updated, columnNameMap),
731
- },
732
- };
733
- }
734
- function changeColumnEnabled(state, columns, columnNameMap, column, enabled) {
735
- const allColumns = getAllColumns(state, columns, columnNameMap);
736
- if (enabled &&
737
- allColumns.filter(col => col.enabled).length >= RivTable.ColumnsMaxShown) {
738
- return state;
739
- }
740
- return {
741
- ...state,
742
- display: {
743
- ...state.display,
744
- columnSettings: orderIntentionally(allColumns.map(c => ({
745
- ...c,
746
- enabled: c.key === column ? enabled : c.enabled,
747
- // Unpin if being unchecked
748
- pinned: c.key === column && !enabled ? false : c.pinned,
749
- })), columnNameMap),
750
- },
751
- };
752
- }
753
- function enableAllColumns(state, columns, columnNameMap, enabled) {
754
- const allColumns = getAllColumns(state, columns, columnNameMap);
755
- if (enabled && allColumns.length > RivTable.ColumnsMaxShown)
756
- return state;
757
- return {
758
- ...state,
759
- display: {
760
- ...state.display,
761
- columnSettings: orderIntentionally(allColumns.map(c => ({
762
- ...c,
763
- enabled: enabled,
764
- // Unpin if being unchecked
765
- pinned: !enabled ? false : c.pinned,
766
- })), columnNameMap),
767
- },
768
- };
769
- }
770
- function changeColumnWidth(state, columns, columnNameMap, column, preferredWidth) {
771
- const allColumns = getAllColumns(state, columns, columnNameMap);
772
- return {
773
- ...state,
774
- display: {
775
- ...state.display,
776
- columnSettings: allColumns.map(c => ({
777
- ...c,
778
- preferredWidth: c.key === column ? preferredWidth : c.preferredWidth,
779
- })),
780
- },
781
- };
782
- }
783
- function resetToDefaultColumns(state, columns, columnNameMap, defaultColumnState) {
784
- return {
785
- ...state,
786
- display: {
787
- ...state.display,
788
- columnSettings: orderIntentionally(defaultColumnState, columnNameMap),
789
- },
790
- };
791
- }
792
- function isRowSelected(state, id) {
793
- switch (state.selection.mode) {
794
- case 'include':
795
- return state.selection.included.has(id);
796
- case 'exclude':
797
- return !state.selection.excluded.has(id);
798
- }
799
- }
800
- function isGroupSelected(state, group) {
801
- switch (state.selection.mode) {
802
- case 'include': {
803
- let allFound = true;
804
- let anyFound = false;
805
- for (const row of group.currentPageData) {
806
- if (!state.selection.included.has(row.id)) {
807
- allFound = false;
808
- }
809
- else {
810
- anyFound = true;
811
- }
812
- }
813
- return allFound ? true : anyFound ? 'indeterminate' : false;
814
- }
815
- case 'exclude': {
816
- let allFound = true;
817
- let anyFound = false;
818
- for (const row of group.currentPageData) {
819
- if (state.selection.excluded.has(row.id)) {
820
- allFound = false;
821
- }
822
- else {
823
- anyFound = true;
824
- }
825
- }
826
- return allFound ? true : anyFound ? 'indeterminate' : false;
827
- }
828
- }
829
- }
830
- function isAllSelected(state) {
831
- // If there are no rows, "all selected" should be false
832
- if (state.result.totalMatchingRowCount === 0) {
833
- return false;
834
- }
835
- if ((state.selection.mode === 'exclude' &&
836
- state.selection.excluded.size === 0) ||
837
- (state.selection.mode === 'include' &&
838
- state.selection.included.size === state.result.totalMatchingRowCount))
839
- return true;
840
- if ((state.selection.mode === 'exclude' &&
841
- state.selection.excluded.size === state.result.totalMatchingRowCount) ||
842
- (state.selection.mode === 'include' && state.selection.included.size === 0))
843
- return false;
844
- return 'indeterminate';
845
- }
846
- function isCurrentPageSelected(state) {
847
- const selectedStates = getAllRowsFromResult(state.result).map(({ id }) => isRowSelected(state, id));
848
- if (selectedStates.length > 0) {
849
- if (selectedStates.every(v => v))
850
- return true;
851
- if (selectedStates.some(v => v))
852
- return 'indeterminate';
853
- }
854
- return false;
855
- }
856
- function selectedCount(state) {
857
- switch (state.selection.mode) {
858
- case 'include':
859
- return state.selection.included.size;
860
- case 'exclude':
861
- return state.result.totalMatchingRowCount - state.selection.excluded.size;
862
- }
863
- }
864
472
  async function* refreshResultWith(state, source, mostRecentAction) {
865
473
  yield {
866
474
  state: {
@@ -874,7 +482,7 @@ async function* refreshResultWith(state, source, mostRecentAction) {
874
482
  };
875
483
  try {
876
484
  const result = await source(state.query, mostRecentAction);
877
- if (isPageOutOfBounds(state, result)) {
485
+ if (TablePaginationHelpers.isPageOutOfBounds(state, result)) {
878
486
  state.query.pagination.page = 0;
879
487
  }
880
488
  yield {
@@ -904,144 +512,6 @@ async function* refreshResultWith(state, source, mostRecentAction) {
904
512
  };
905
513
  }
906
514
  }
907
- function setRowSelected(state, id, selected, contiguous) {
908
- if (selected) {
909
- const newSelection = new Set([id]);
910
- if (contiguous && state.selection.mostRecentlySelected) {
911
- const startIdx = getAllRowsFromResult(state.result).findIndex(row => row.id === state.selection.mostRecentlySelected);
912
- const endIdx = getAllRowsFromResult(state.result).findIndex(row => row.id === id);
913
- if (typeof startIdx === 'number' && typeof endIdx === 'number') {
914
- for (let i = Math.min(startIdx, endIdx); i <= Math.max(startIdx, endIdx); i++) {
915
- newSelection.add(getAllRowsFromResult(state.result)[i].id);
916
- }
917
- }
918
- }
919
- return {
920
- ...state,
921
- selection: {
922
- mostRecentlySelected: id,
923
- ...(state.selection.mode === 'include'
924
- ? {
925
- mode: 'include',
926
- included: new Set(union([...state.selection.included], [...newSelection])),
927
- }
928
- : {
929
- mode: 'exclude',
930
- excluded: new Set(difference([...state.selection.excluded], [...newSelection])),
931
- }),
932
- },
933
- };
934
- }
935
- else {
936
- return {
937
- ...state,
938
- selection: {
939
- mostRecentlySelected: null,
940
- ...(state.selection.mode === 'include'
941
- ? {
942
- mode: 'include',
943
- included: new Set(difference([...state.selection.included], [id])),
944
- }
945
- : {
946
- mode: 'exclude',
947
- excluded: new Set(union([...state.selection.excluded], [id])),
948
- }),
949
- },
950
- };
951
- }
952
- }
953
- function toggleGroupSelected(state, group) {
954
- const isGroupFullySelected = isGroupSelected(state, { ...group, currentPageData: group.rows }) === true;
955
- return group.rows.reduce((accumulatedState, row) => {
956
- return setRowSelected(accumulatedState, row.id, !isGroupFullySelected, false);
957
- }, state);
958
- }
959
- function togglePageSelected(state) {
960
- const isPageFullySelected = getAllRowsFromResult(state.result).every(({ id }) => isRowSelected(state, id));
961
- return getAllRowsFromResult(state.result).reduce((accumulatedState, row) => {
962
- return setRowSelected(accumulatedState, row.id, !isPageFullySelected, false);
963
- }, state);
964
- }
965
- function toggleAllSelected(state) {
966
- if (isAllSelected(state) === true) {
967
- return {
968
- ...state,
969
- selection: {
970
- mostRecentlySelected: null,
971
- mode: 'include',
972
- included: new Set(),
973
- },
974
- };
975
- }
976
- else {
977
- return {
978
- ...state,
979
- selection: {
980
- mostRecentlySelected: null,
981
- mode: 'exclude',
982
- excluded: new Set(),
983
- },
984
- };
985
- }
986
- }
987
- function clearSelection(state) {
988
- return {
989
- ...state,
990
- selection: {
991
- mostRecentlySelected: null,
992
- mode: 'include',
993
- included: new Set(),
994
- },
995
- };
996
- }
997
- function toggleColumnOrder(state, column) {
998
- if (state.query.order?.column === column) {
999
- return {
1000
- ...state,
1001
- query: {
1002
- ...state.query,
1003
- order: state.query.order.direction === 'asc'
1004
- ? {
1005
- column,
1006
- direction: 'desc',
1007
- }
1008
- : null,
1009
- },
1010
- };
1011
- }
1012
- return {
1013
- ...state,
1014
- query: {
1015
- ...state.query,
1016
- order: {
1017
- column,
1018
- direction: 'asc',
1019
- },
1020
- },
1021
- };
1022
- }
1023
- function getSearchColumnsSelectedState(state, expectedValue) {
1024
- switch (expectedValue) {
1025
- case 'all':
1026
- return Array.from(state.query.searchColumns.values()).every(value => value);
1027
- case 'none':
1028
- return Array.from(state.query.searchColumns.values()).every(value => !value);
1029
- }
1030
- }
1031
- function toggleAllSearchColumns(state) {
1032
- const noneSelected = getSearchColumnsSelectedState(state, 'none');
1033
- const payload = new Map(Array.from(state.query.searchColumns.keys()).map(key => [
1034
- key,
1035
- noneSelected,
1036
- ]));
1037
- return {
1038
- ...state,
1039
- query: {
1040
- ...state.query,
1041
- searchColumns: payload,
1042
- },
1043
- };
1044
- }
1045
515
  async function* reduce(state, action, columns, source, columnNameMap, defaultColumnState) {
1046
516
  switch (action.type) {
1047
517
  case 'load':
@@ -1062,7 +532,7 @@ async function* reduce(state, action, columns, source, columnNameMap, defaultCol
1062
532
  }, source, action);
1063
533
  break;
1064
534
  case 'orderColumnToggle':
1065
- yield* refreshResultWith(toggleColumnOrder(state, action.column), source, action);
535
+ yield* refreshResultWith(TableOrderHelpers.toggleColumnOrder(state, action.column), source, action);
1066
536
  break;
1067
537
  case 'searchChange':
1068
538
  yield* refreshResultWith({
@@ -1128,7 +598,7 @@ async function* reduce(state, action, columns, source, columnNameMap, defaultCol
1128
598
  ...state.query,
1129
599
  pagination: {
1130
600
  ...state.query.pagination,
1131
- page: getPreviousPage(state) ?? 0,
601
+ page: TablePaginationHelpers.getPreviousPage(state) ?? 0,
1132
602
  },
1133
603
  },
1134
604
  }, source, action);
@@ -1140,7 +610,8 @@ async function* reduce(state, action, columns, source, columnNameMap, defaultCol
1140
610
  ...state.query,
1141
611
  pagination: {
1142
612
  ...state.query.pagination,
1143
- page: getNextPage(state) ?? getPageCount(state) - 1,
613
+ page: TablePaginationHelpers.getNextPage(state) ??
614
+ TablePaginationHelpers.getPageCount(state) - 1,
1144
615
  },
1145
616
  },
1146
617
  }, source, action);
@@ -1207,49 +678,49 @@ async function* reduce(state, action, columns, source, columnNameMap, defaultCol
1207
678
  break;
1208
679
  case 'columnPinChange':
1209
680
  yield {
1210
- state: changeColumnPin(state, columns, columnNameMap, action.column, action.pinned),
681
+ state: TableColumnHelpers.changeColumnPin(state, columns, columnNameMap, action.column, action.pinned),
1211
682
  effect: 'saveColumnPreferences',
1212
683
  };
1213
684
  break;
1214
685
  case 'columnsFreezeUpToChange':
1215
686
  yield {
1216
- state: changeColumnsFreezeState(state, columns, columnNameMap, action.index, action.freeze),
687
+ state: TableColumnHelpers.changeColumnsFreezeState(state, columns, columnNameMap, action.index, action.freeze),
1217
688
  effect: 'saveColumnPreferences',
1218
689
  };
1219
690
  break;
1220
691
  case 'columnOrderChange':
1221
692
  yield {
1222
- state: changeColumnOrder(state, columns, columnNameMap, action.previousIndex, action.newIndex),
693
+ state: TableColumnHelpers.changeColumnOrder(state, columns, columnNameMap, action.previousIndex, action.newIndex),
1223
694
  effect: 'saveColumnPreferences',
1224
695
  };
1225
696
  break;
1226
697
  case 'columnMoveToChange':
1227
698
  yield {
1228
- state: moveColumnTo(state, columns, columnNameMap, action.column, action.position),
699
+ state: TableColumnHelpers.moveColumnTo(state, columns, columnNameMap, action.column, action.position),
1229
700
  effect: 'saveColumnPreferences',
1230
701
  };
1231
702
  break;
1232
703
  case 'columnEnabledChange':
1233
704
  yield {
1234
- state: changeColumnEnabled(state, columns, columnNameMap, action.column, action.enabled),
705
+ state: TableColumnHelpers.changeColumnEnabled(state, columns, columnNameMap, action.column, action.enabled),
1235
706
  effect: 'saveColumnPreferences',
1236
707
  };
1237
708
  break;
1238
709
  case 'enableAllColumnsChange':
1239
710
  yield {
1240
- state: enableAllColumns(state, columns, columnNameMap, action.enabled),
711
+ state: TableColumnHelpers.enableAllColumns(state, columns, columnNameMap, action.enabled),
1241
712
  effect: 'saveColumnPreferences',
1242
713
  };
1243
714
  break;
1244
715
  case 'columnWidthChange':
1245
716
  yield {
1246
- state: changeColumnWidth(state, columns, columnNameMap, action.column, action.preferredWidth),
717
+ state: TableColumnHelpers.changeColumnWidth(state, columns, columnNameMap, action.column, action.preferredWidth),
1247
718
  effect: 'saveColumnPreferences',
1248
719
  };
1249
720
  break;
1250
721
  case 'resetToDefaultColumns':
1251
722
  yield {
1252
- state: resetToDefaultColumns(state, columns, columnNameMap, defaultColumnState),
723
+ state: TableColumnHelpers.resetToDefaultColumns(state, columns, columnNameMap, defaultColumnState),
1253
724
  effect: 'saveColumnPreferences',
1254
725
  };
1255
726
  break;
@@ -1264,31 +735,31 @@ async function* reduce(state, action, columns, source, columnNameMap, defaultCol
1264
735
  break;
1265
736
  case 'rowSelectedChange':
1266
737
  yield {
1267
- state: setRowSelected(state, action.id, action.selected, action.contiguous),
738
+ state: TableSelectionHelpers.setRowSelected(state, action.id, action.selected, action.contiguous),
1268
739
  effect: null,
1269
740
  };
1270
741
  break;
1271
742
  case 'pageSelectedChange':
1272
743
  yield {
1273
- state: togglePageSelected(state),
744
+ state: TableSelectionHelpers.togglePageSelected(state),
1274
745
  effect: null,
1275
746
  };
1276
747
  break;
1277
748
  case 'allSelectedChange':
1278
749
  yield {
1279
- state: toggleAllSelected(state),
750
+ state: TableSelectionHelpers.toggleAllSelected(state),
1280
751
  effect: null,
1281
752
  };
1282
753
  break;
1283
754
  case 'selectionClear':
1284
755
  yield {
1285
- state: clearSelection(state),
756
+ state: TableSelectionHelpers.clearSelection(state),
1286
757
  effect: null,
1287
758
  };
1288
759
  break;
1289
760
  case 'groupSelectionChange':
1290
761
  yield {
1291
- state: toggleGroupSelected(state, action.payload),
762
+ state: TableSelectionHelpers.toggleGroupSelected(state, action.payload),
1292
763
  effect: null,
1293
764
  };
1294
765
  break;
@@ -1329,37 +800,8 @@ async function* reduce(state, action, columns, source, columnNameMap, defaultCol
1329
800
  }, source, action);
1330
801
  break;
1331
802
  case 'toggleAllSearchColumns':
1332
- yield* refreshResultWith(toggleAllSearchColumns(state), source, action);
803
+ yield* refreshResultWith(TableSearchHelpers.toggleAllSearchColumns(state), source, action);
1333
804
  break;
1334
805
  }
1335
806
  }
1336
- function isGroupResult(result) {
1337
- if ('totalGroupCount' in result) {
1338
- return true;
1339
- }
1340
- return false;
1341
- }
1342
- function getAllRowsFromResult(result) {
1343
- if (isGroupResult(result)) {
1344
- return result.groupResults.flatMap(groups => groups.currentPageData);
1345
- }
1346
- else {
1347
- return result.currentPageData;
1348
- }
1349
- }
1350
- function isPageOutOfBounds(state, result) {
1351
- if (isGroupResult(result)) {
1352
- const minGroupValToShowOnCurrentPage = state.query.pagination.page * state.query.grouping.groupsPerPage + 1;
1353
- if (result.totalGroupCount < minGroupValToShowOnCurrentPage) {
1354
- return true;
1355
- }
1356
- }
1357
- else {
1358
- const minRowToShowOnCurrentPage = state.query.pagination.page * state.query.pagination.pageSize + 1;
1359
- if (result.totalMatchingRowCount < minRowToShowOnCurrentPage) {
1360
- return true;
1361
- }
1362
- }
1363
- return false;
1364
- }
1365
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi90YWJsZS90YWJsZS9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLElBQXNCLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFDTCxZQUFZLEVBQ1osVUFBVSxFQUNWLE9BQU8sRUFDUCxPQUFPLEVBQ1AsS0FBSyxFQUNMLFNBQVMsRUFDVCxLQUFLLEdBQ04sTUFBTSxRQUFRLENBQUM7QUFDaEIsT0FBTyxFQUVMLFdBQVcsRUFDWCxNQUFNLEVBQ04sSUFBSSxFQUNKLEdBQUcsRUFDSCxTQUFTLEVBRVQsYUFBYSxFQUNiLElBQUksRUFDSixLQUFLLEVBQ0wsT0FBTyxHQUNSLE1BQU0sTUFBTSxDQUFDO0FBRWQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBRXZFLE1BQU0sS0FBVyxRQUFRLENBb2xDeEI7QUFwbENELFdBQWlCLFFBQVE7SUEwQ1Ysa0JBQVMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBVSxDQUFDO0lBcVByRCxtREFBbUQ7SUFDdEMsd0JBQWUsR0FBVyxFQUFFLENBQUM7SUFDN0Isd0JBQWUsR0FBRztRQUM3QixVQUFVO1FBQ1YsVUFBVTtRQUNWLE1BQU07UUFDTixNQUFNO1FBQ04sVUFBVTtRQUNWLFFBQVE7UUFDUixXQUFXO0tBQ0gsQ0FBQztJQXNMWCxTQUFnQixhQUFhLENBTTNCLE1BQTBCLEVBQzFCLE9BQStCLEVBQy9CLGdCQUF3QixFQUN4QixPQUFvQztRQUVwQyxrQ0FBa0M7UUFFbEMsTUFBTSxtQkFBbUIsR0FBMkIsSUFBSSxHQUFHLENBQ3pELEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFD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QUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsYUFBYSxHQUFHLENBQUMsQ0FBQztRQUN2RSxJQUFJLE1BQU0sQ0FBQyxlQUFlLEdBQUcsOEJBQThCLEVBQUU7WUFDM0QsT0FBTyxJQUFJLENBQUM7U0FDYjtLQUNGO1NBQU07UUFDTCxNQUFNLHlCQUF5QixHQUM3QixLQUFLLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNwRSxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsR0FBRyx5QkFBeUIsRUFBRTtZQUM1RCxPQUFPLElBQUksQ0FBQztTQUNiO0tBQ0Y7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBhcmFtcywgUXVlcnlQYXJhbXNIYW5kbGluZyB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgRnVzZSwgeyBJRnVzZU9wdGlvbnMgfSBmcm9tICdmdXNlLmpzJztcbmltcG9ydCB7XG4gIGRlZmF1bHRzRGVlcCxcbiAgZGlmZmVyZW5jZSxcbiAgaXNFcXVhbCxcbiAgb3JkZXJCeSxcbiAgcmFuZ2UsXG4gIHRvSW50ZWdlcixcbiAgdW5pb24sXG59IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQge1xuICBDb25uZWN0YWJsZSxcbiAgY29ubmVjdGFibGUsXG4gIGZpbHRlcixcbiAgZnJvbSxcbiAgbWFwLFxuICBtZXJnZVNjYW4sXG4gIE9ic2VydmFibGUsXG4gIFJlcGxheVN1YmplY3QsXG4gIHNjYW4sXG4gIHNoYXJlLFxuICBTdWJqZWN0LFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERlZXBQYXJ0aWFsIH0gZnJvbSAndXRpbGl0eS10eXBlcyc7XG5pbXBvcnQgeyB0b1NlbnRlbmNlQ2FzZSB9IGZyb20gJy4uLy4uL2Zvcm1hdC9waXBlcy9zZW50ZW5jZS1jYXNlLnBpcGUnO1xuXG5leHBvcnQgbmFtZXNwYWNlIFJpdlRhYmxlIHtcbiAgZXhwb3J0IHR5cGUgUm93ID0geyBpZDogc3RyaW5nIHwgbnVtYmVyIH07XG4gIGV4cG9ydCB0eXBlIENvbHVtbiA9IHN0cmluZztcbiAgZXhwb3J0IHR5cGUgRmlsdGVycyA9IGFueTtcbiAgZXhwb3J0IHR5cGUgR3JvdXAgPSB7IGtleTogc3RyaW5nIHwgbnVtYmVyIH07XG5cbiAgLyoqXG4gICAqIFJpdlRhYmxlJ3Mgc3RhdGUgYW5kIHVzZXIgYWN0aW9ucyBhcmUgZGl2aWRlZCBpbnRvIHRoZSBmb2xsb3dpbmcgY2h1bmtzOlxuICAgKlxuICAgKiAtIFF1ZXJ5IChmb3IgdGhpbmdzIGxpa2UgZmlsdGVycywgcGFnaW5hdGlvbiwgc2VhcmNoLCBldGMuKVxuICAgKiAtIExvYWRpbmcgKGZvciB3aGV0aGVyIG9yIG5vdCB0aGUgdGFibGUgaXMgbG9hZGluZyByb3cgZGF0YSlcbiAgICogLSBSZXN1bHQgKGZvciB0aGUgcm93IGRhdGEgaXRzZWxmKVxuICAgKiAtIERpc3BsYXkgKGZvciB0aGluZ3MgbGlrZSBjb2x1bW4gY29uZmlndXJhdGlvbilcbiAgICogLSBTZWxlY3Rpb24gKGZvciB0cmFja2luZyB0aGUgdXNlcidzIHJvdyBzZWxlY3Rpb25zKVxuICAgKlxuICAgKiBOb3RlIHRoYXQgdGhlIGRhdGEgZmxvdyBpcyB1bmlkaXJlY3Rpb25hbDogdGhlIFVJIGlzc3VlcyBhY3Rpb25zLCB3aGljaFxuICAgKiBhZmZlY3QgdGhlIHN0YXRlLCBhbmQgdGhlIHN0YXRlIGdldHMgcGFzc2VkIGJhY2sgdG8gdGhlIFVJIGZvciBkaXNwbGF5LlxuICAgKlxuICAgKiDilIzilIDilIDilIDilIDilIDilIDilJBcbiAgICog4pSCICBVSSAg4peE4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSQXG4gICAqIOKUlOKUgOKUgOKUrOKUgOKUgOKUgOKUmCAgICAgICAg4pSCXG4gICAqICAgIOKUgiAgICAgICAgICAgIOKUglxuICAgKiDilIzilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilJAgICDilIJcbiAgICog4pSCICBBY3Rpb25zICDilIIgICDilIJcbiAgICog4pSU4pSA4pSA4pSs4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYICAg4pSCXG4gICAqICAgIOKUgiAgICAgICAgICAgIOKUglxuICAgKiDilIzilIDilIDilrzilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilLTilIDilJBcbiAgICog4pSCICBTdGF0ZSByZWR1Y2VyICDilIJcbiAgICog4pSU4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSYXG4gICAqXG4gICAqIEZyb20gdGhlIGNvcmUgc3RhdGUsIGNhbGN1bGF0ZWQgc3RhdGUgaXMgZGVyaXZlZCBhbmQgYWRkZWQgdG8gdGhlIGNvcmVcbiAgICogc3RhdGUgKGUuZy4sIGZyb20gdGhlIHJhdyBzZWxlY3Rpb24gc3RhdGUgd2UgY2FuIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdFxuICAgKiBhbGwgdGhlIHJvd3Mgb24gdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgcGFnZSBhcmUgc2VsZWN0ZWQsIGV0Yy4pLlxuICAgKi9cblxuICAvLy8vLy8vLy8vL1xuICAvLyBRdWVyeSAvL1xuICAvLy8vLy8vLy8vL1xuXG4gIC8vIFF1ZXJ5IHN0YXRlIC8vXG5cbiAgZXhwb3J0IHR5cGUgT3JkZXJEaXJlY3Rpb24gPSAnYXNjJyB8ICdkZXNjJztcbiAgZXhwb3J0IGNvbnN0IHBhZ2VTaXplcyA9IFsyNSwgNTAsIDEwMCwgMjUwXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgUXVlcnk8QyBleHRlbmRzIENvbHVtbiwgRiBleHRlbmRzIEZpbHRlcnM+ID0ge1xuICAgIG9yZGVyOiB7XG4gICAgICBkaXJlY3Rpb246IE9yZGVyRGlyZWN0aW9uO1xuICAgICAgY29sdW1uOiBDO1xuICAgIH0gfCBudWxsO1xuICAgIHNlYXJjaDogc3RyaW5nO1xuICAgIHNlYXJjaENvbHVtbnM6IE1hcDxDLCBib29sZWFuPjtcbiAgICBmaWx0ZXJzOiBGIHwgbnVsbDtcbiAgICBwYWdpbmF0aW9uOiB7XG4gICAgICBwYWdlOiBudW1iZXI7XG4gICAgICBwYWdlU2l6ZTogbnVtYmVyO1xuICAgIH07XG4gICAgZ3JvdXBpbmc6IHtcbiAgICAgIHZpZXdNb3JlS2V5OiBzdHJpbmcgfCBudWxsO1xuICAgICAgZ3JvdXBzUGVyUGFnZTogbnVtYmVyO1xuICAgICAgY291bnRQZXJHcm91cDogbnVtYmVyO1xuICAgIH07XG4gIH07XG5cbiAgLy8gUXVlcnkgYWN0aW9ucyAvL1xuXG4gIGV4cG9ydCB0eXBlIFF1ZXJ5QWN0aW9uPEMgZXh0ZW5kcyBDb2x1bW4sIEYgZXh0ZW5kcyBGaWx0ZXJzPiA9XG4gICAgfCB7IHR5cGU6ICdsb2FkJyB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdvcmRlckNoYW5nZSc7XG4gICAgICAgIHBheWxvYWQ6IFF1ZXJ5PEMsIEY+WydvcmRlciddO1xuICAgICAgICBzb3VyY2U/OiAnaGVhZGVyTWVudSc7XG4gICAgICB9XG4gICAgfCB7IHR5cGU6ICdvcmRlckNvbHVtblRvZ2dsZSc7IGNvbHVtbjogQyB9XG4gICAgfCB7IHR5cGU6ICdzZWFyY2hDaGFuZ2UnOyBwYXlsb2FkOiBRdWVyeTxDLCBGPlsnc2VhcmNoJ10gfVxuICAgIHwgeyB0eXBlOiAnc2VhcmNoQ29sdW1uc0NoYW5nZSc7IHBheWxvYWQ6IFF1ZXJ5PEMsIEY+WydzZWFyY2hDb2x1bW5zJ10gfVxuICAgIHwgeyB0eXBlOiAnZmlsdGVyc0NoYW5nZSc7IHBheWxvYWQ6IFF1ZXJ5PEMsIEY+WydmaWx0ZXJzJ10gfVxuICAgIHwgeyB0eXBlOiAnZmlsdGVyQWRkJzsgY29sdW1uS2V5OiBzdHJpbmcgfVxuICAgIHwgeyB0eXBlOiAncGFnaW5hdGlvbkNoYW5nZSc7IHBheWxvYWQ6IFF1ZXJ5PEMsIEY+WydwYWdpbmF0aW9uJ10gfVxuICAgIHwgeyB0eXBlOiAnZ3JvdXBpbmdDaGFuZ2UnOyBwYXlsb2FkOiBRdWVyeTxDLCBGPlsnZ3JvdXBpbmcnXSB9XG4gICAgfCB7IHR5cGU6ICduZXh0UGFnZU5hdmlnYXRlJyB9XG4gICAgfCB7IHR5cGU6ICdwcmV2aW91c1BhZ2VOYXZpZ2F0ZScgfVxuICAgIHwgeyB0eXBlOiAncGFnZUNoYW5nZSc7IHBhZ2U6IG51bWJlciB9XG4gICAgfCB7IHR5cGU6ICdwYWdlU2l6ZUNoYW5nZSc7IHNpemU6IG51bWJlciB9XG4gICAgfCB7IHR5cGU6ICdncm91cHNQZXJQYWdlQ2hhbmdlJzsgZ3JvdXBzUGVyUGFnZTogbnVtYmVyIH1cbiAgICB8IHsgdHlwZTogJ2NvdW50UGVyR3JvdXBDaGFuZ2UnOyBjb3VudFBlckdyb3VwOiBudW1iZXIgfVxuICAgIHwgeyB0eXBlOiAndmlld01vcmVLZXlDaGFuZ2UnOyB2aWV3TW9yZUtleTogc3RyaW5nIH1cbiAgICB8IHsgdHlwZTogJ3RvZ2dsZUFsbFNlYXJjaENvbHVtbnMnIH07XG5cbiAgLy8vLy8vLy8vL1xuICAvLyBMb2FkIC8vXG4gIC8vLy8vLy8vLy9cblxuICBleHBvcnQgdHlwZSBMb2FkID0ge1xuICAgIGxvYWRpbmc6IGJvb2xlYW47XG4gICAgZXJyb3I6IHVua25vd24gfCBudWxsO1xuICB9O1xuXG4gIC8vLy8vLy8vLy8vL1xuICAvLyBSZXN1bHQgLy9cbiAgLy8vLy8vLy8vLy8vXG5cbiAgZXhwb3J0IHR5cGUgUmVzdWx0PFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHJvdyBkYXRhIGZvciB0aGUgY3VycmVudCBwYWdlLCBhZnRlciBmaWx0ZXJzLCBzZWFyY2ggcXVlcnksIGFuZFxuICAgICAqIHJvdyBvcmRlcmluZyBhcmUgYXBwbGllZC5cbiAgICAgKi9cbiAgICBjdXJyZW50UGFnZURhdGE6IFJbXTtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgKHJlZ2FyZGxlc3Mgb2YgcGFnaW5hdGlvbikgdGhhdCBtYXRjaCB0aGVcbiAgICAgKiBmaWx0ZXJzIGFuZCBzZWFyY2ggcXVlcnkuXG4gICAgICovXG4gICAgdG90YWxNYXRjaGluZ1Jvd0NvdW50OiBudW1iZXI7XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgU3ViR3JvdXBSZXN1bHQ8UiBleHRlbmRzIFJvdywgRyBleHRlbmRzIEdyb3VwPiA9IFJlc3VsdDxSPiAmIHtcbiAgICAvKipcbiAgICAgKiBBbnkgb3RoZXIgcmVsZXZhbnQgZ3JvdXAgZGF0YSwgdXNlZCBmb3IgdGhlIHN1YmhlYWRlclxuICAgICAqL1xuICAgIGdyb3VwRGF0YTogRztcbiAgfTtcblxuICBleHBvcnQgdHlwZSBHcm91cFJlc3VsdDxSIGV4dGVuZHMgUm93LCBHIGV4dGVuZHMgR3JvdXA+ID0ge1xuICAgIC8qKlxuICAgICAqIFRoZSBmdWxsIHJvdyBkYXRhIGZvciB0aGUgY3VycmVudCBwYWdlLCBhZnRlciBmaWx0ZXJzLCBzZWFyY2ggcXVlcnksIGFuZFxuICAgICAqIHJvdyBvcmRlcmluZyBhcmUgYXBwbGllZCwgc3BsaXQgaW50byBncm91cHNcbiAgICAgKi9cbiAgICBncm91cFJlc3VsdHM6IFN1Ykdyb3VwUmVzdWx0PFIsIEc+W107XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiBncm91cHMgKHJlZ2FyZGxlc3Mgb2YgcGFnaW5hdGlvbikgdGhhdCBtYXRjaCB0aGVcbiAgICAgKiBmaWx0ZXJzIGFuZCBzZWFyY2ggcXVlcnkuXG4gICAgICovXG4gICAgdG90YWxHcm91cENvdW50OiBudW1iZXI7XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiByb3dzIChyZWdhcmRsZXNzIG9mIHBhZ2luYXRpb24pIHRoYXQgbWF0Y2ggdGhlXG4gICAgICogZmlsdGVycyBhbmQgc2VhcmNoIHF1ZXJ5LlxuICAgICAqL1xuICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogbnVtYmVyO1xuICB9O1xuICBleHBvcnQgdHlwZSBTb3VyY2U8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0gKFxuICAgIHF1ZXJ5OiBRdWVyeTxDLCBGPixcbiAgICBtb3N0UmVjZW50QWN0aW9uOiBBY3Rpb248UiwgQywgRiwgRz4sXG4gICkgPT4gUHJvbWlzZTxSZXN1bHQ8Uj4gfCBHcm91cFJlc3VsdDxSLCBHPj47XG5cbiAgLy8vLy8vLy8vLy8vL1xuICAvLyBEaXNwbGF5IC8vXG4gIC8vLy8vLy8vLy8vLy9cblxuICAvLyBEaXNwbGF5IHN0YXRlIC8vXG5cbiAgZXhwb3J0IHR5cGUgQ29sdW1uU2V0dGluZ3M8QyBleHRlbmRzIENvbHVtbj4gPSB7XG4gICAga2V5OiBDO1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgcHJlZmVycmVkV2lkdGg6IG51bWJlciB8ICdhdXRvJztcbiAgICBwaW5uZWQ6IGJvb2xlYW47XG4gIH07XG4gIGV4cG9ydCB0eXBlIERpc3BsYXk8QyBleHRlbmRzIENvbHVtbj4gPSB7XG4gICAgY29sdW1uU2V0dGluZ3M6IENvbHVtblNldHRpbmdzPEM+W107XG4gICAgY2VsbFJvd1NwYW46IChyb3dJbmRleDogbnVtYmVyLCBjb2x1bW46IEMpID0+IG51bWJlcjtcbiAgfTtcblxuICAvLyBEaXNwbGF5IGFjdGlvbnMgLy9cblxuICBleHBvcnQgdHlwZSBEaXNwbGF5QWN0aW9uPEMgZXh0ZW5kcyBDb2x1bW4+ID1cbiAgICB8IHsgdHlwZTogJ2NvbHVtblNldHRpbmdzQ2hhbmdlJzsgcGF5bG9hZDogRGlzcGxheTxDPlsnY29sdW1uU2V0dGluZ3MnXSB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdjb2x1bW5QaW5DaGFuZ2UnO1xuICAgICAgICBjb2x1bW46IEM7XG4gICAgICAgIHBpbm5lZDogYm9vbGVhbjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbnNGcmVlemVVcFRvQ2hhbmdlJztcbiAgICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgICAgZnJlZXplOiBib29sZWFuO1xuICAgICAgICBzb3VyY2U/OiAnaGVhZGVyTWVudScgfCAnb3B0aW9uc01lbnUnIHwgJ2ZyZWV6ZURpdmlkZXInO1xuICAgICAgICBjb2x1bW4/OiBDO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnY29sdW1uT3JkZXJDaGFuZ2UnO1xuICAgICAgICBwcmV2aW91c0luZGV4OiBudW1iZXI7XG4gICAgICAgIG5ld0luZGV4OiBudW1iZXI7XG4gICAgICAgIHNvdXJjZT86ICd0YWJsZURyYWcnIHwgJ21lbnVEcmFnJztcbiAgICAgICAgY29sdW1uPzogQztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbk1vdmVUb0NoYW5nZSc7XG4gICAgICAgIGNvbHVtbjogQztcbiAgICAgICAgcG9zaXRpb246ICdzdGFydCcgfCAnZW5kJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbkVuYWJsZWRDaGFuZ2UnO1xuICAgICAgICBjb2x1bW46IEM7XG4gICAgICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgICAgIHNvdXJjZT86ICdoZWFkZXJNZW51JyB8ICdvcHRpb25zTWVudScgfCAnZHJhZ0Ryb3AnIHwgJ2V5ZUljb24nO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnZW5hYmxlQWxsQ29sdW1uc0NoYW5nZSc7XG4gICAgICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdjb2x1bW5XaWR0aENoYW5nZSc7XG4gICAgICAgIGNvbHVtbjogQztcbiAgICAgICAgcHJlZmVycmVkV2lkdGg6IG51bWJlciB8ICdhdXRvJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3Jlc2V0VG9EZWZhdWx0Q29sdW1ucyc7XG4gICAgICB9O1xuXG4gIC8vLy8vLy8vLy8vLy8vL1xuICAvLyBTZWxlY3Rpb24gLy9cbiAgLy8vLy8vLy8vLy8vLy8vXG5cbiAgLy8gU2VsZWN0aW9uIHN0YXRlIC8vXG5cbiAgZXhwb3J0IHR5cGUgU2VsZWN0aW9uPFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBSWydpZCddIHwgbnVsbDtcbiAgfSAmIChcbiAgICB8IHtcbiAgICAgICAgbW9kZTogJ2luY2x1ZGUnO1xuICAgICAgICBpbmNsdWRlZDogU2V0PFJbJ2lkJ10+O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBtb2RlOiAnZXhjbHVkZSc7XG4gICAgICAgIGV4Y2x1ZGVkOiBTZXQ8UlsnaWQnXT47XG4gICAgICB9XG4gICk7XG5cbiAgLy8gU2VsZWN0aW9uIGFjdGlvbnMgLy9cblxuICBleHBvcnQgdHlwZSBTZWxlY3Rpb25BY3Rpb248UiBleHRlbmRzIFJvdywgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0+ID1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3NlbGVjdGlvbkNoYW5nZSc7XG4gICAgICAgIHBheWxvYWQ6IFNlbGVjdGlvbjxSPjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2dyb3VwU2VsZWN0aW9uQ2hhbmdlJztcbiAgICAgICAgcGF5bG9hZDogUm93R3JvdXA8UiwgRz47XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyb3dTZWxlY3RlZENoYW5nZSc7XG4gICAgICAgIGlkOiBSWydpZCddO1xuICAgICAgICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICAgICAgY29udGlndW91czogYm9vbGVhbjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3BhZ2VTZWxlY3RlZENoYW5nZSc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdhbGxTZWxlY3RlZENoYW5nZSc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZWxlY3Rpb25DbGVhcic7XG4gICAgICB9O1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIFB1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyIC8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgLy8gQ29tYmluZWQgc3RhdGUgLy9cblxuICBleHBvcnQgdHlwZSBDb3JlU3RhdGU8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0ge1xuICAgIHF1ZXJ5OiBRdWVyeTxDLCBGPjtcbiAgICBsb2FkOiBMb2FkO1xuICAgIHJlc3VsdDogUmVzdWx0PFI+IHwgR3JvdXBSZXN1bHQ8UiwgRz47XG4gICAgZGlzcGxheTogRGlzcGxheTxDPjtcbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbjxSPjtcbiAgfTtcblxuICAvLyBDb21iaW5lZCBhY3Rpb25zIC8vXG5cbiAgZXhwb3J0IHR5cGUgQWN0aW9uPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPiA9IFF1ZXJ5QWN0aW9uPEMsIEY+IHwgRGlzcGxheUFjdGlvbjxDPiB8IFNlbGVjdGlvbkFjdGlvbjxSLCBHPjtcblxuICBleHBvcnQgdHlwZSBFZmZlY3QgPSAnc2F2ZUNvbHVtblByZWZlcmVuY2VzJztcblxuICAvLyBGdWxsIHN0YXRlIChjb3JlIHN0YXRlIHBsdXMgcHVyZSBkZXJpdmF0aW9ucykgLy9cbiAgZXhwb3J0IGNvbnN0IENvbHVtbnNNYXhTaG93bjogbnVtYmVyID0gNTA7XG4gIGV4cG9ydCBjb25zdCBDb2x1bW5EYXRhVHlwZXMgPSBbXG4gICAgJ2FkdmFuY2VkJyxcbiAgICAnY3VycmVuY3knLFxuICAgICdkYXRlJyxcbiAgICAnaWNvbicsXG4gICAgJ2xvbmdUZXh0JyxcbiAgICAnbnVtYmVyJyxcbiAgICAnc2hvcnRUZXh0JyxcbiAgXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgQ29sdW1uRGF0YVR5cGUgPSAodHlwZW9mIENvbHVtbkRhdGFUeXBlcylbbnVtYmVyXTtcbiAgZXhwb3J0IHR5cGUgQ29sdW1uQWxpZ25tZW50ID0gJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnO1xuICBleHBvcnQgdHlwZSBDb2x1bW5NZXRhZGF0YSA9IHtcbiAgICBvcmRlcmFibGU6IGJvb2xlYW47XG4gICAgZmlsdGVyYWJsZT86IGJvb2xlYW47XG4gICAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gICAgbWluV2lkdGg6IG51bWJlcjtcbiAgICBkYXRhVHlwZTogQ29sdW1uRGF0YVR5cGU7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgZGVmYXVsdFBpbm5lZD86IGJvb2xlYW47XG4gICAgY2xpY2tQcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG4gICAgY2xpY2tTdG9wUHJvcGFnYXRpb24/OiBib29sZWFuO1xuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICB9O1xuICBleHBvcnQgdHlwZSBFeHRlcm5hbFJvd0xpbmsgPSB7XG4gICAgdHlwZTogJ2V4dGVybmFsJztcbiAgICBocmVmOiBzdHJpbmc7XG4gIH07XG4gIGV4cG9ydCB0eXBlIEludGVybmFsUm93TGluayA9IHtcbiAgICB0eXBlOiAnaW50ZXJuYWwnO1xuICAgIHJvdXRlckxpbms6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIHF1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc/OiBRdWVyeVBhcmFtc0hhbmRsaW5nO1xuICAgIGFjdGl2ZT86IGJvb2xlYW47XG4gIH07XG4gIGV4cG9ydCB0eXBlIFJvd0xpbmsgPSBFeHRlcm5hbFJvd0xpbmsgfCBJbnRlcm5hbFJvd0xpbms7XG4gIGV4cG9ydCB0eXBlIEZ1bGxSb3c8UiBleHRlbmRzIFJvdz4gPSBSICYge1xuICAgIHJvd0xpbms6IFJvd0xpbmsgfCBudWxsO1xuICAgIHNlbGVjdGVkOiBib29sZWFuO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFJvd0dyb3VwPFIgZXh0ZW5kcyBSb3csIEcgZXh0ZW5kcyBHcm91cD4gPSB7XG4gICAgcm93czogRnVsbFJvdzxSPltdO1xuICAgIHNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogbnVtYmVyO1xuICAgIGdyb3VwRGF0YTogRztcbiAgfTtcbiAgZXhwb3J0IHR5cGUgRnVsbENvbHVtbjxDIGV4dGVuZHMgQ29sdW1uPiA9IENvbHVtblNldHRpbmdzPEM+ICZcbiAgICBDb2x1bW5NZXRhZGF0YSAmIHtcbiAgICAgIHdpZHRoOiBudW1iZXI7XG4gICAgICBsZWZ0OiBudW1iZXIgfCBudWxsO1xuICAgICAgYWxpZ25tZW50OiBDb2x1bW5BbGlnbm1lbnQ7XG4gICAgfTtcbiAgZXhwb3J0IHR5cGUgTXVsdGlTZWxlY3Rpb25TdGF0ZSA9IGJvb2xlYW4gfCAnaW5kZXRlcm1pbmF0ZSc7XG4gIGV4cG9ydCB0eXBlIFNlbGVjdGlvbkNvbmZpZ3VyYXRpb24gPSBib29sZWFuIHwgJ2luZGl2aWR1YWwnO1xuXG4gIGV4cG9ydCB0eXBlIFJvd1NwYW5HZXR0ZXI8QyBleHRlbmRzIENvbHVtbj4gPSAoXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICBjb2x1bW46IEMsXG4gICkgPT4gbnVtYmVyIHwgbnVsbCB8IHVuZGVmaW5lZDtcblxuICBleHBvcnQgdHlwZSBWYWxpZFJvd1NwYW5HZXR0ZXI8QyBleHRlbmRzIENvbHVtbj4gPSAoXG4gICAgcm93SW5kZXg6IG51bWJlcixcbiAgICBjb2x1bW46IEMsXG4gICkgPT4gbnVtYmVyO1xuXG4gIGV4cG9ydCB0eXBlIENzdkNlbGxGb3JtYXR0ZXI8UiBleHRlbmRzIFJvdywgQyBleHRlbmRzIENvbHVtbj4gPSAoXG4gICAgcm93OiBSLFxuICAgIGNvbHVtbjogRnVsbENvbHVtbjxDPixcbiAgKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG4gIGV4cG9ydCB0eXBlIENzdkdyb3VwQ2VsbEZvcm1hdHRlcjxSIGV4dGVuZHMgUm93LCBHIGV4dGVuZHMgR3JvdXA+ID0gKFxuICAgIHJvdzogUixcbiAgICBncm91cDogRyxcbiAgKSA9PiBzdHJpbmcgfCBQcm9taXNlPHN0cmluZz47XG4gIGV4cG9ydCB0eXBlIENzdlJvdyA9IHN0cmluZ1tdO1xuICBleHBvcnQgdHlwZSBDc3YgPSBDc3ZSb3dbXTtcbiAgZXhwb3J0IHR5cGUgQ3N2TW9kZSA9ICdmdWxsJyB8ICdzZWxlY3Rpb24nO1xuICBleHBvcnQgdHlwZSBDc3ZPdXRwdXQgPVxuICAgIHwgeyBsb2FkaW5nOiB0cnVlOyBkYXRhOiBudWxsIH1cbiAgICB8IHsgbG9hZGluZzogZmFsc2U7IGRhdGE6IENzdiB9O1xuXG4gIGV4cG9ydCB0eXBlIENvbHVtbk5hbWVNYXA8QyBleHRlbmRzIENvbHVtbj4gPSBNYXA8QywgQyB8IHN0cmluZz47XG5cbiAgZXhwb3J0IHR5cGUgU2VhcmNoYWJsZUNvbHVtbk1hcDxDIGV4dGVuZHMgQ29sdW1uPiA9IE1hcDxDLCBib29sZWFuPjtcblxuICBleHBvcnQgdHlwZSBGdWxsU3RhdGU8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0gQ29yZVN0YXRlPFIsIEMsIEYsIEc+ICYge1xuICAgIHF1ZXJ5OiB7XG4gICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgIHByZXZpb3VzOiBudW1iZXIgfCBudWxsO1xuICAgICAgICBwYWdlczogbnVtYmVyW107XG4gICAgICAgIG5leHQ6IG51bWJlciB8IG51bGw7XG4gICAgICAgIHBhZ2VDb3VudDogbnVtYmVyO1xuICAgICAgICBzaG93Q29udHJvbHM6IGJvb2xlYW47XG4gICAgICAgIHBhZ2VSb3dTdGFydDogbnVtYmVyO1xuICAgICAgICBwYWdlUm93RW5kOiBudW1iZXI7XG4gICAgICB9O1xuICAgICAgbm9TZWFyY2hDb2x1bW5zU2VsZWN0ZWQ6IGJvb2xlYW47XG4gICAgfTtcbiAgICByZXN1bHQ6XG4gICAgICB8IHtcbiAgICAgICAgICByb3dzOiBGdWxsUm93PFI+W107XG4gICAgICAgICAgcm93c0FzR3JvdXA6IFJvd0dyb3VwPFIsIEc+O1xuICAgICAgICAgIGlzR3JvdXBlZDogZmFsc2U7XG4gICAgICAgICAgY3N2RGF0YTogKG1vZGU/OiBDc3ZNb2RlKSA9PiBBc3luY0dlbmVyYXRvcjxDc3ZPdXRwdXQ+O1xuICAgICAgICAgIGNzdkZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgIH1cbiAgICAgIHwge1xuICAgICAgICAgIHJvd3M6IEZ1bGxSb3c8Uj5bXTtcbiAgICAgICAgICByb3dHcm91cHM6IFJvd0dyb3VwPFIsIEc+W107XG4gICAgICAgICAgaXNHcm91cGVkOiB0cnVlO1xuICAgICAgICAgIGNzdkRhdGE6IChtb2RlPzogQ3N2TW9kZSkgPT4gQXN5bmNHZW5lcmF0b3I8Q3N2T3V0cHV0PjtcbiAgICAgICAgICBjc3ZGaWxlbmFtZTogc3RyaW5nO1xuICAgICAgICB9O1xuICAgIGRpc3BsYXk6IHtcbiAgICAgIGNvbHVtbnM6IEZ1bGxDb2x1bW48Qz5bXTtcbiAgICAgIGFsbENvbHVtbnM6IENvbHVtblNldHRpbmdzPEM+W107XG4gICAgICBzZWFyY2hhYmxlQ29sdW1uTWFwOiBTZWFyY2hhYmxlQ29sdW1uTWFwPEM+O1xuICAgICAgY29sdW1uTmFtZU1hcDogQ29sdW1uTmFtZU1hcDxDPjtcbiAgICAgIHplcm9TdGF0ZU1lc3NhZ2U6IHN0cmluZyB8IG51bGw7XG4gICAgICBjb2x1bW5zQXJlRnJlZXphYmxlOiBib29sZWFuO1xuICAgICAgY29sdW1uc0FyZUhpZGVhYmxlOiBib29sZWFuO1xuICAgICAgY29sdW1uc0FyZVJlb3JkZXJhYmxlOiBib29sZWFuO1xuICAgICAgcm93c0FyZUdyYXllZDogYm9vbGVhbjtcbiAgICAgIGN1c3RvbVN1bW1hcnlSb3c6IGJvb2xlYW47XG4gICAgICBjc3ZFeHBvcnRBbGxvd2VkOiBib29sZWFuO1xuICAgICAgZW5hYmxlZENvdW50OiBudW1iZXI7XG4gICAgICBoaWRlUGFnZVNpemVTZWxlY3RvcjogYm9vbGVhbjtcbiAgICAgIG5lZWRzUmlnaHRCb3JkZXI6IChyb3dJbmRleDogbnVtYmVyLCBjb2x1bW46IEMpID0+IGJvb2xlYW47XG4gICAgfTtcbiAgICBzZWxlY3Rpb246IHtcbiAgICAgIGFsbG93U2VsZWN0aW9uOiBTZWxlY3Rpb25Db25maWd1cmF0aW9uO1xuICAgICAgaXNBbGxTZWxlY3RlZDogTXVsdGlTZWxlY3Rpb25TdGF0ZTtcbiAgICAgIGlzQ3VycmVudFBhZ2VTZWxlY3RlZDogTXVsdGlTZWxlY3Rpb25TdGF0ZTtcbiAgICAgIHNlbGVjdGVkQ291bnQ6IG51bWJlcjtcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuYWdlciBpcyB3aGF0IHNldHMgdXAgdGhlIGluaXRpYWwgc3RhdGUgYW5kIHRyYW5zbGF0ZXMgdXNlciBhY3Rpb25zXG4gICAqIChsaWtlIHBhZ2luYXRpb24gb3IgZmlsdGVyIGNoYW5nZXMsIGV0Yy4pIGludG8gbmV3IHJvdyBkYXRhIGJ5IGNhbGxpbmcgdGhlXG4gICAqIHJlZHVjZXIgZnVuY3Rpb24uIEl0IGFsc28gYXVnbWVudHMgdGhlIGNvcmUgc3RhdGUgd2l0aCBhZGRpdGlvbmFsIGRlcml2ZWRcbiAgICogc3RhdGUuXG4gICAqL1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXI8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0ge1xuICAgIGFjdGlvbnM6IFN1YmplY3Q8QWN0aW9uPFIsIEMsIEYsIEc+PjtcbiAgICBzdGF0ZTogQ29ubmVjdGFibGU8RnVsbFN0YXRlPFIsIEMsIEYsIEc+PjtcbiAgICBlZmZlY3RzOiBDb25uZWN0YWJsZTxFZmZlY3Q+O1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIE1hbmFnZXJPcHRpb25zPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPiA9IHtcbiAgICBpbml0aWFsU3RhdGU/OiBEZWVwUGFydGlhbDxDb3JlU3RhdGU8UiwgQywgRiwgRz4+O1xuICAgIHJvd0xpbms/OiAocm93OiBSLCBncm91cD86IEcpID0+IFJvd0xpbms7XG4gICAgY3N2Q2VsbEZvcm1hdHRlcj86IENzdkNlbGxGb3JtYXR0ZXI8UiwgQz47XG4gICAgY3N2R3JvdXBDZWxsRm9ybWF0dGVyPzogQ3N2R3JvdXBDZWxsRm9ybWF0dGVyPFIsIEc+O1xuICAgIGNzdkZpbGVCYXNlbmFtZT86IHN0cmluZztcbiAgICBhbGxvd1NlbGVjdGlvbj86IFNlbGVjdGlvbkNvbmZpZ3VyYXRpb247XG4gICAgY29sdW1uc0FyZUZyZWV6YWJsZT86IGJvb2xlYW47XG4gICAgY29sdW1uc0FyZUhpZGVhYmxlPzogYm9vbGVhbjtcbiAgICBjb2x1bW5zQXJlUmVvcmRlcmFibGU/OiBib29sZWFuO1xuICAgIGRlZmF1bHRDb2x1bW5TdGF0ZT86IENvbHVtblNldHRpbmdzPEM+W107XG4gICAgcm93c0FyZUdyYXllZD86IGJvb2xlYW47XG4gICAgY3VzdG9tU3VtbWFyeVJvdz86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogV2hlbiB0cnVlLCB0aGUgXCJSZXN1bHRzIHBlciBwYWdlXCIgbGFiZWwgYW5kIHBhZ2Utc2l6ZSBkcm9wZG93biBhcmVcbiAgICAgKiBoaWRkZW4uIFBhZ2UgbmF2aWdhdGlvbiBhcnJvd3MgYW5kIHBhZ2UgbnVtYmVycyByZW1haW4gdmlzaWJsZS5cbiAgICAgKi9cbiAgICBoaWRlUGFnZVNpemVTZWxlY3Rvcj86IGJvb2xlYW47XG4gICAgLyoqXG4gICAgICogUGFyZW50LWNvbnRyb2xsZWQgcm93IHNwYW5uaW5nLlxuICAgICAqIFJldHVybiAwIHRvIHN1cHByZXNzIHRoZSBjZWxsLCA+PTEgZm9yIGEgcmVhbCByb3dzcGFuLlxuICAgICAqIElmIG9taXR0ZWQgb3IgaW52YWxpZCwgZGVmYXVsdHMgdG8gMS5cbiAgICAgKi9cbiAgICBnZXRSb3dTcGFuRm9yQ2VsbD86IFJvd1NwYW5HZXR0ZXI8Qz47XG4gIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZU1hbmFnZXI8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+KFxuICAgIHNvdXJjZTogU291cmNlPFIsIEMsIEYsIEc+LFxuICAgIGNvbHVtbnM6IE1hcDxDLCBDb2x1bW5NZXRhZGF0YT4sXG4gICAgcGx1cmFsRW50aXR5TmFtZTogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiBNYW5hZ2VyT3B0aW9uczxSLCBDLCBGLCBHPixcbiAgKTogTWFuYWdlcjxSLCBDLCBGLCBHPiB7XG4gICAgLy8gU2V0IHVwIHRoZSBpbml0aWFsIHRhYmxlIHN0YXRlLlxuXG4gICAgY29uc3Qgc2VhcmNoYWJsZUNvbHVtbk1hcDogU2VhcmNoYWJsZUNvbHVtbk1hcDxDPiA9IG5ldyBNYXA8QywgYm9vbGVhbj4oXG4gICAgICBBcnJheS5mcm9tKGNvbHVtbnMuZW50cmllcygpKS5tYXAoKFtrZXksIG1ldGFkYXRhXSkgPT4gW1xuICAgICAgICBrZXksXG4gICAgICAgIG1ldGFkYXRhLnNlYXJjaGFibGUgPz8gdHJ1ZSxcbiAgICAgIF0pLFxuICAgICk7XG4gICAgY29uc3QgZGVmYXVsdFN0YXRlOiBDb3JlU3RhdGU8UiwgQywgRiwgRz4gPSB7XG4gICAgICBxdWVyeToge1xuICAgICAgICBvcmRlcjogbnVsbCxcbiAgICAgICAgc2VhcmNoOiAnJyxcbiAgICAgICAgc2VhcmNoQ29sdW1uczogbmV3IE1hcChcbiAgICAgICAgICBBcnJheS5mcm9tKGNvbHVtbnMua2V5cygpKVxuICAgICAgICAgICAgLmZpbHRlcihrZXkgPT4gc2VhcmNoYWJsZUNvbHVtbk1hcC5nZXQoa2V5KSlcbiAgICAgICAgICAgIC5tYXAoa2V5ID0+IFtrZXksIHRydWVdKSxcbiAgICAgICAgKSxcbiAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgcGFnZVNpemU6IDI1LFxuICAgICAgICB9LFxuICAgICAgICBncm91cGluZzoge1xuICAgICAgICAgIHZpZXdNb3JlS2V5OiBudWxsLFxuICAgICAgICAgIGdyb3Vwc1BlclBhZ2U6IDUsXG4gICAgICAgICAgY291bnRQZXJHcm91cDogMTAsXG4gICAgICAgIH0sXG4gICAgICAgIGZpbHRlcnM6IG51bGwsXG4gICAgICB9LFxuICAgICAgbG9hZDogeyBsb2FkaW5nOiBmYWxzZSwgZXJyb3I6IG51bGwgfSxcbiAgICAgIHJlc3VsdDoge1xuICAgICAgICBjdXJyZW50UGFnZURhdGE6IFtdLFxuICAgICAgICB0b3RhbE1hdGNoaW5nUm93Q291bnQ6IDAsXG4gICAgICB9LFxuICAgICAgZGlzcGxheToge1xuICAgICAgICBjb2x1bW5TZXR0aW5nczogW10sXG4gICAgICAgIGNlbGxSb3dTcGFuOiAoX2k6IG51bWJlciwgX2NvbHVtbjogQykgPT4gMSxcbiAgICAgIH0sXG4gICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgbW9zdFJlY2VudGx5U2VsZWN0ZWQ6IG51bGwsXG4gICAgICAgIG1vZGU6ICdpbmNsdWRlJyxcbiAgICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBkZWZhdWx0ZWRJbml0aWFsU3RhdGU6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPiA9IGRlZmF1bHRzRGVlcChcbiAgICAgIHt9LFxuICAgICAgb3B0aW9ucz8uaW5pdGlhbFN0YXRlLFxuICAgICAgZGVmYXVsdFN0YXRlLFxuICAgICk7XG5cbiAgICBjb25zdCBjb2x1bW5OYW1lTWFwOiBDb2x1bW5OYW1lTWFwPEM+ID0gbmV3IE1hcDxDLCBDIHwgc3RyaW5nPihcbiAgICAgIEFycmF5LmZyb20oY29sdW1ucy5lbnRyaWVzKCkpLm1hcCgoW2tleSwgbWV0YWRhdGFdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgdG9TZW50ZW5jZUNhc2UobWV0YWRhdGEuZGlzcGxheU5hbWUgPz8ga2V5KSxcbiAgICAgIF0pLFxuICAgICk7XG5cbiAgICBjb25zdCBkZWZhdWx0Q29sdW1uU3RhdGUgPVxuICAgICAgb3B0aW9ucz8uZGVmYXVsdENvbHVtblN0YXRlID8/XG4gICAgICBkZWZhdWx0ZWRJbml0aWFsU3RhdGUuZGlzcGxheS5jb2x1bW5TZXR0aW5ncztcblxuICAgIC8vIFdpcmUgdXAgcmVkdWNlZCBzdGF0ZSBmcm9tIGFjdGlvbnMgYW5kIGluaXRpYWwgc3RhdGUuXG4gICAgY29uc3QgYWN0aW9uczogU3ViamVjdDxBY3Rpb248UiwgQywgRiwgRz4+ID0gbmV3IFN1YmplY3QoKTtcbiAgICBjb25zdCBjb3JlU3RhdGU6IE9ic2VydmFibGU8e1xuICAgICAgc3RhdGU6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgICAgIGVmZmVjdDogRWZmZWN0IHwgbnVsbDtcbiAgICB9PiA9IGFjdGlvbnMucGlwZShcbiAgICAgIG1lcmdlU2NhbjxcbiAgICAgICAgQWN0aW9uPFIsIEMsIEYsIEc+LFxuICAgICAgICB7XG4gICAgICAgICAgc3RhdGU6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgICAgICAgICBlZmZlY3Q6IEVmZmVjdCB8IG51bGw7XG4gICAgICAgIH1cbiAgICAgID4oXG4gICAgICAgICh7IHN0YXRlIH0sIGFjdGlvbikgPT5cbiAgICAgICAgICBmcm9tKFxuICAgICAgICAgICAgcmVkdWNlKFxuICAgICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICBzb3VyY2UsXG4gICAgICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgICAgIGRlZmF1bHRDb2x1bW5TdGF0ZSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKSxcbiAgICAgICAgeyBzdGF0ZTogZGVmYXVsdGVkSW5pdGlhbFN0YXRlLCBlZmZlY3Q6IG51bGwgfSxcbiAgICAgICAgMSxcbiAgICAgICksXG4gICAgICBzaGFyZSh7XG4gICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgIHJlc2V0T25FcnJvcjogZmFsc2UsXG4gICAgICAgIHJlc2V0T25Db21wbGV0ZTogZmFsc2UsXG4gICAgICAgIHJlc2V0T25SZWZDb3VudFplcm86IGZhbHNlLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnN0IGNzdkV4cG9ydEFsbG93ZWQgPSAhKFxuICAgICAgb3B0aW9ucz8uZ2V0Um93U3BhbkZvckNlbGwgfHwgb3B0aW9ucz8uY3VzdG9tU3VtbWFyeVJvd1xuICAgICk7XG5cbiAgICAvLyBBdWdtZW50IHN0YXRlIHdpdGggZGVyaXZlZCBzdGF0ZSwgYW5kIHN1YnNjcmliZS5cbiAgICBjb25zdCBzdGF0ZTogQ29ubmVjdGFibGU8RnVsbFN0YXRlPFIsIEMsIEYsIEc+PiA9IGNvbm5lY3RhYmxlKFxuICAgICAgY29yZVN0YXRlLnBpcGUoXG4gICAgICAgIG1hcCgoeyBzdGF0ZTogcyB9KTogRnVsbFN0YXRlPFIsIEMsIEYsIEc+ID0+IHtcbiAgICAgICAgICBjb25zdCByZXNvbHZlZENvbHVtbnMgPSByZXNvbHZlQ29sdW1ucyhcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICAgICEhb3B0aW9ucz8uYWxsb3dTZWxlY3Rpb24sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChpc0dyb3VwUmVzdWx0KHMucmVzdWx0KSkge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmdldFJvd1NwYW5Gb3JDZWxsKSB7XG4gICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgICAnSGVhZHMgdXAhIEN1c3RvbSByb3cgc3BhbnMgYXJlIG5vdCBzdXBwb3J0ZWQgZm9yIGdyb3VwZWQgdGFibGVzLicsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucz8uY3VzdG9tU3VtbWFyeVJvdykge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgJ0hlYWRzIHVwISBDdXN0b20gc3VtbWFyeSByb3dzIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBncm91cGVkIHRhYmxlcy4nLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCByb3dHcm91cHMgPSBzLnJlc3VsdC5ncm91cFJlc3VsdHMubWFwKGdyb3VwID0+ICh7XG4gICAgICAgICAgICAgIHJvd3M6IGdyb3VwLmN1cnJlbnRQYWdlRGF0YS5tYXAocm93ID0+ICh7XG4gICAgICAgICAgICAgICAgLi4ucm93LFxuICAgICAgICAgICAgICAgIHJvd0xpbms6IG9wdGlvbnM/LnJvd0xpbmtcbiAgICAgICAgICAgICAgICAgID8gb3B0aW9ucy5yb3dMaW5rKHJvdywgZ3JvdXAuZ3JvdXBEYXRhKVxuICAgICAgICAgICAgICAgICAgOiBudWxsLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBpc1Jvd1NlbGVjdGVkKHMsIHJvdy5pZCksXG4gICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGlzR3JvdXBTZWxlY3RlZChzLCBncm91cCksXG4gICAgICAgICAgICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogZ3JvdXAudG90YWxNYXRjaGluZ1Jvd0NvdW50LFxuICAgICAgICAgICAgICBncm91cERhdGE6IGdyb3VwLmdyb3VwRGF0YSxcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24qIGNzdkRhdGEoXG4gICAgICAgICAgICAgIG1vZGU6IENzdk1vZGUgPSAnZnVsbCcsXG4gICAgICAgICAgICApOiBBc3luY0dlbmVyYXRvcjxDc3ZPdXRwdXQ+IHtcbiAgICAgICAgICAgICAgY29uc3QgY2VsbEZvcm1hdHRlciA9IG9wdGlvbnM/LmNzdkNlbGxGb3JtYXR0ZXI7XG4gICAgICAgICAgICAgIGNvbnN0IGdyb3VwQ2VsbEZvcm1hdHRlciA9IG9wdGlvbnM/LmNzdkdyb3VwQ2VsbEZvcm1hdHRlcjtcbiAgICAgICAgICAgICAgaWYgKCFjZWxsRm9ybWF0dGVyKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICdvcHRpb25zLmNzdkNlbGxGb3JtYXR0ZXIgaXMgcmVxdWlyZWQgZm9yIENTViBleHBvcnQnLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHlpZWxkIHsgbG9hZGluZzogdHJ1ZSwgZGF0YTogbnVsbCB9O1xuICAgICAgICAgICAgICBjb25zdCBkYXRhU2V0ID0gYXdhaXQgc291cmNlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLnMucXVlcnksXG4gICAgICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiBzLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnbG9hZCcgfSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoIWlzR3JvdXBSZXN1bHQoZGF0YVNldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgJ1JldHVybmVkIG5vbi1ncm91cGVkIENTViBkYXRhIGZvciBncm91cGVkIHRhYmxlJyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGZ1bGxDb2x1bW5zID0gcmVzb2x2ZUNvbHVtbnMoXG4gICAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgICAgICAgISFvcHRpb25zLmFsbG93U2VsZWN0aW9uLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCBkYXRhOiBDc3YgPSBbXTtcbiAgICAgICAgICAgICAgZGF0YS5wdXNoKFxuICAgICAgICAgICAgICAgIGZ1bGxDb2x1bW5zLm1hcCgoeyBrZXkgfSkgPT4gY29sdW1uTmFtZU1hcC5nZXQoa2V5KSA/PyBrZXkpLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmIChncm91cENlbGxGb3JtYXR0ZXIpIHtcbiAgICAgICAgICAgICAgICBkYXRhWzBdLnB1c2goJycpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCByb3dJdGVtIG9mIGRhdGFTZXQuZ3JvdXBSZXN1bHRzLmZsYXRNYXAoZ3JvdXBzID0+XG4gICAgICAgICAgICAgICAgZ3JvdXBzLmN1cnJlbnRQYWdlRGF0YS5tYXAocm93ID0+ICh7XG4gICAgICAgICAgICAgICAgICByb3csXG4gICAgICAgICAgICAgICAgICBncm91cDogZ3JvdXBzLmdyb3VwRGF0YSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICkpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZWNvcmQgPSByb3dJdGVtLnJvdztcbiAgICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gJ3NlbGVjdGlvbicgJiYgIWlzUm93U2VsZWN0ZWQocywgcmVjb3JkLmlkKSlcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdzogQ3N2Um93ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZnVsbENvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIHJvdy5wdXNoKGF3YWl0IGNlbGxGb3JtYXR0ZXIocmVjb3JkLCBjb2x1bW4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwQ2VsbEZvcm1hdHRlciAmJiByb3dJdGVtLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICByb3cucHVzaChhd2FpdCBncm91cENlbGxGb3JtYXR0ZXIocmVjb3JkLCByb3dJdGVtLmdyb3VwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEucHVzaChyb3cpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHlpZWxkIHsgbG9hZGluZzogZmFsc2UsIGRhdGEgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucyxcbiAgICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgICAuLi5zLnF1ZXJ5LFxuICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgICAgIC4uLnMucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzOiBnZXRQcmV2aW91c1BhZ2UocyksXG4gICAgICAgICAgICAgICAgICBwYWdlczogZ2V0UGFnZXMocyksXG4gICAgICAgICAgICAgICAgICBuZXh0OiBnZXROZXh0UGFnZShzKSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VDb3VudDogZ2V0UGFnZUNvdW50KHMpLFxuICAgICAgICAgICAgICAgICAgc2hvd0NvbnRyb2xzOiBnZXRTaG93UGFnaW5hdGlvbkNvbnRyb2xzKHMpLFxuICAgICAgICAgICAgICAgICAgcGFnZVJvd1N0YXJ0OiBnZXRQYWdlUm93U3RhcnQocyksXG4gICAgICAgICAgICAgICAgICBwYWdlUm93RW5kOiBnZXRQYWdlUm93RW5kKHMpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbm9TZWFyY2hDb2x1bW5zU2VsZWN0ZWQ6IGdldFNlYXJjaENvbHVtbnNTZWxlY3RlZFN0YXRlKFxuICAgICAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgICAgICdub25lJyxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkaXNwbGF5OiB7XG4gICAgICAgICAgICAgICAgLi4ucy5kaXNwbGF5LFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHJlc29sdmVkQ29sdW1ucyxcbiAgICAgICAgICAgICAgICBhbGxDb2x1bW5zOiBnZXRBbGxDb2x1bW5zKHMsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVNYXA6IGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogc2VhcmNoYWJsZUNvbHVtbk1hcCxcbiAgICAgICAgICAgICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBnZXRaZXJvU3RhdGVNZXNzYWdlKHMsIHBsdXJhbEVudGl0eU5hbWUpLFxuICAgICAgICAgICAgICAgIGNvbHVtbnNBcmVGcmVlemFibGU6ICEhb3B0aW9ucz8uY29sdW1uc0FyZUZyZWV6YWJsZSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zQXJlSGlkZWFibGU6ICEhb3B0aW9ucz8uY29sdW1uc0FyZUhpZGVhYmxlLFxuICAgICAgICAgICAgICAgIGNvbHVtbnNBcmVSZW9yZGVyYWJsZTogb3B0aW9ucz8uY29sdW1uc0FyZVJlb3JkZXJhYmxlID8/IHRydWUsXG4gICAgICAgICAgICAgICAgcm93c0FyZUdyYXllZDogISFvcHRpb25zPy5yb3dzQXJlR3JheWVkLFxuICAgICAgICAgICAgICAgIGN1c3RvbVN1bW1hcnlSb3c6ICEhb3B0aW9ucz8uY3VzdG9tU3VtbWFyeVJvdyxcbiAgICAgICAgICAgICAgICBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgICAgICAgICAgIGVuYWJsZWRDb3VudDogcmVzb2x2ZWRDb2x1bW5zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBoaWRlUGFnZVNpemVTZWxlY3RvcjogISFvcHRpb25zPy5oaWRlUGFnZVNpemVTZWxlY3RvcixcbiAgICAgICAgICAgICAgICBjZWxsUm93U3BhbjogKF9pOiBudW1iZXIsIF9jb2x1bW46IEMpID0+IDEsXG4gICAgICAgICAgICAgICAgbmVlZHNSaWdodEJvcmRlcjogKCkgPT4gZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICAgICAgICAgIC4uLnMuc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIGFsbG93U2VsZWN0aW9uOiBvcHRpb25zPy5hbGxvd1NlbGVjdGlvbiA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0FsbFNlbGVjdGVkOiBpc0FsbFNlbGVjdGVkKHMpLFxuICAgICAgICAgICAgICAgIGlzQ3VycmVudFBhZ2VTZWxlY3RlZDogaXNDdXJyZW50UGFnZVNlbGVjdGVkKHMpLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ291bnQ6IHNlbGVjdGVkQ291bnQocyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgIC4uLnMucmVzdWx0LFxuICAgICAgICAgICAgICAgIGlzR3JvdXBlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICByb3dHcm91cHMsXG4gICAgICAgICAgICAgICAgcm93czogcm93R3JvdXBzLmZsYXRNYXAoZ3JvdXAgPT4gZ3JvdXAucm93cyksXG4gICAgICAgICAgICAgICAgY3N2RGF0YSxcbiAgICAgICAgICAgICAgICBjc3ZGaWxlbmFtZTogZ2V0Q3N2RmlsZW5hbWUocGx1cmFsRW50aXR5TmFtZSwgb3B0aW9ucyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gcy5yZXN1bHQuY3VycmVudFBhZ2VEYXRhLm1hcChyb3cgPT4gKHtcbiAgICAgICAgICAgICAgLi4ucm93LFxuICAgICAgICAgICAgICByb3dMaW5rOiBvcHRpb25zPy5yb3dMaW5rID8gb3B0aW9ucy5yb3dMaW5rKHJvdykgOiBudWxsLFxuICAgICAgICAgICAgICBzZWxlY3RlZDogaXNSb3dTZWxlY3RlZChzLCByb3cuaWQpLFxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBjb25zdCBjZWxsUm93U3BhbkNhY2hlID0gbWVtb2l6ZWRDZWxsUm93U3BhbihcbiAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxSb3dTcGFuOiBWYWxpZFJvd1NwYW5HZXR0ZXI8Qz4gPSAocm93SW5kZXgsIGNvbHVtbikgPT5cbiAgICAgICAgICAgICAgY2VsbFJvd1NwYW5DYWNoZT8uZ2V0KGNvbHVtbik/Lltyb3dJbmRleF0gPz8gMTtcbiAgICAgICAgICAgIGNvbnN0IGhhc0FueVJvd1NwYW5zID0gY2VsbFJvd1NwYW5DYWNoZVxuICAgICAgICAgICAgICA/IFsuLi5jZWxsUm93U3BhbkNhY2hlLnZhbHVlcygpXS5zb21lKHNwYW5zID0+XG4gICAgICAgICAgICAgICAgICBzcGFucy5zb21lKHNwYW4gPT4gc3BhbiA+IDEpLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRDb2x1bW5LZXlzID0gcmVzb2x2ZWRDb2x1bW5zLm1hcCgoeyBrZXkgfSkgPT4ga2V5KTtcblxuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24qIGNzdkRhdGEobW9kZSA9ICdmdWxsJyk6IEFzeW5jR2VuZXJhdG9yPENzdk91dHB1dD4ge1xuICAgICAgICAgICAgICBpZiAoIWNzdkV4cG9ydEFsbG93ZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAnQ1NWIGV4cG9ydCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gcm93IHNwYW5uaW5nIG9yIGEgY3VzdG9tIHN1bW1hcnkgcm93IGlzIGVuYWJsZWQuJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgY2VsbEZvcm1hdHRlciA9IG9wdGlvbnM/LmNzdkNlbGxGb3JtYXR0ZXI7XG4gICAgICAgICAgICAgIGlmICghY2VsbEZvcm1hdHRlcilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAnb3B0aW9ucy5jc3ZDZWxsRm9ybWF0dGVyIGlzIHJlcXVpcmVkIGZvciBDU1YgZXhwb3J0JyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB5aWVsZCB7IGxvYWRpbmc6IHRydWUsIGRhdGE6IG51bGwgfTtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YVNldCA9IGF3YWl0IHNvdXJjZShcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5zLnF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBwYWdlOiAwLFxuICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogcy5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2xvYWQnIH0sXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKGlzR3JvdXBSZXN1bHQoZGF0YVNldCkpXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgJ1JldHVybmVkIGdyb3VwZWQgQ1NWIGRhdGEgZm9yIG5vbi1ncm91cGVkIHRhYmxlJyxcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGNvbnN0IGZ1bGxDb2x1bW5zID0gcmVzb2x2ZUNvbHVtbnMoXG4gICAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgICAgICAgISFvcHRpb25zLmFsbG93U2VsZWN0aW9uLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBjb25zdCBkYXRhOiBDc3YgPSBbXTtcbiAgICAgICAgICAgICAgZGF0YS5wdXNoKFxuICAgICAgICAgICAgICAgIGZ1bGxDb2x1bW5zLm1hcCgoeyBrZXkgfSkgPT4gY29sdW1uTmFtZU1hcC5nZXQoa2V5KSA/PyBrZXkpLFxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGZvciAoY29uc3QgcmVjb3JkIG9mIGRhdGFTZXQuY3VycmVudFBhZ2VEYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09ICdzZWxlY3Rpb24nICYmICFpc1Jvd1NlbGVjdGVkKHMsIHJlY29yZC5pZCkpXG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCByb3c6IENzdlJvdyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGZ1bGxDb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICByb3cucHVzaChhd2FpdCBjZWxsRm9ybWF0dGVyKHJlY29yZCwgY29sdW1uKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEucHVzaChyb3cpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHlpZWxkIHsgbG9hZGluZzogZmFsc2UsIGRhdGEgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucyxcbiAgICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgICAuLi5zLnF1ZXJ5LFxuICAgICAgICAgICAgICAgIG9yZGVyOiBoYXNBbnlSb3dTcGFucyA/IG51bGwgOiBzLnF1ZXJ5Lm9yZGVyLFxuICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgICAgIC4uLnMucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzOiBnZXRQcmV2aW91c1BhZ2UocyksXG4gICAgICAgICAgICAgICAgICBwYWdlczogZ2V0UGFnZXMocyksXG4gICAgICAgICAgICAgICAgICBuZXh0OiBnZXROZXh0UGFnZShzKSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VDb3VudDogZ2V0UGFnZUNvdW50KHMpLFxuICAgICAgICAgICAgICAgICAgc2hvd0NvbnRyb2xzOiBnZXRTaG93UGFnaW5hdGlvbkNvbnRyb2xzKHMpLFxuICAgICAgICAgICAgICAgICAgcGFnZVJvd1N0YXJ0OiBnZXRQYWdlUm93U3RhcnQocyksXG4gICAgICAgICAgICAgICAgICBwYWdlUm93RW5kOiBnZXRQYWdlUm93RW5kKHMpLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbm9TZWFyY2hDb2x1bW5zU2VsZWN0ZWQ6IGdldFNlYXJjaENvbHVtbnNTZWxlY3RlZFN0YXRlKFxuICAgICAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgICAgICdub25lJyxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkaXNwbGF5OiB7XG4gICAgICAgICAgICAgICAgLi4ucy5kaXNwbGF5LFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHJlc29sdmVkQ29sdW1ucy5tYXAoY29sdW1uID0+XG4gICAgICAgICAgICAgICAgICBoYXNBbnlSb3dTcGFucyA/IHsgLi4uY29sdW1uLCBvcmRlcmFibGU6IGZhbHNlIH0gOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBhbGxDb2x1bW5zOiBnZXRBbGxDb2x1bW5zKHMsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVNYXA6IGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogc2VhcmNoYWJsZUNvbHVtbk1hcCxcbiAgICAgICAgICAgICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBnZXRaZXJvU3RhdGVNZXNzYWdlKHMsIHBsdXJhbEVudGl0eU5hbWUpLFxuICAgICAgICAgICAgICAgIGNvbHVtbnNBcmVGcmVlemFibGU6ICEhb3B0aW9ucz8uY29sdW1uc0FyZUZyZWV6YWJsZSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zQXJlSGlkZWFibGU6ICEhb3B0aW9ucz8uY29sdW1uc0FyZUhpZGVhYmxlLFxuICAgICAgICAgICAgICAgIGNvbHVtbnNBcmVSZW9yZGVyYWJsZTogb3B0aW9ucz8uY29sdW1uc0FyZVJlb3JkZXJhYmxlID8/IHRydWUsXG4gICAgICAgICAgICAgICAgcm93c0FyZUdyYXllZDogISFvcHRpb25zPy5yb3dzQXJlR3JheWVkLFxuICAgICAgICAgICAgICAgIGN1c3RvbVN1bW1hcnlSb3c6ICEhb3B0aW9ucz8uY3VzdG9tU3VtbWFyeVJvdyxcbiAgICAgICAgICAgICAgICBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgICAgICAgICAgIGVuYWJsZWRDb3VudDogcmVzb2x2ZWRDb2x1bW5zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBoaWRlUGFnZVNpemVTZWxlY3RvcjogISFvcHRpb25zPy5oaWRlUGFnZVNpemVTZWxlY3RvcixcbiAgICAgICAgICAgICAgICBjZWxsUm93U3BhbixcbiAgICAgICAgICAgICAgICBuZWVkc1JpZ2h0Qm9yZGVyOiAocm93SW5kZXg6IG51bWJlciwgY29sdW1uOiBDKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpID0gcmVzb2x2ZWRDb2x1bW5LZXlzLmZpbmRJbmRleChrZXkgPT4ga2V5ID09PSBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgaWYgKGkgPCAwIHx8IGkgPT09IHJlc29sdmVkQ29sdW1uS2V5cy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0Q29sS2V5ID0gcmVzb2x2ZWRDb2x1bW5LZXlzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYW5PblJpZ2h0ID0gY2VsbFJvd1NwYW4ocm93SW5kZXgsIHJpZ2h0Q29sS2V5KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzcGFuT25SaWdodCA+IDEgfHwgc3Bhbk9uUmlnaHQgPT09IDA7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgLi4ucy5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgYWxsb3dTZWxlY3Rpb246IG9wdGlvbnM/LmFsbG93U2VsZWN0aW9uID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzQWxsU2VsZWN0ZWQ6IGlzQWxsU2VsZWN0ZWQocyksXG4gICAgICAgICAgICAgICAgaXNDdXJyZW50UGFnZVNlbGVjdGVkOiBpc0N1cnJlbnRQYWdlU2VsZWN0ZWQocyksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDb3VudDogc2VsZWN0ZWRDb3VudChzKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcmVzdWx0OiB7XG4gICAgICAgICAgICAgICAgLi4ucy5yZXN1bHQsXG4gICAgICAgICAgICAgICAgaXNHcm91cGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICByb3dzLFxuICAgICAgICAgICAgICAgIHJvd3NBc0dyb3VwOiB7XG4gICAgICAgICAgICAgICAgICByb3dzLFxuICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgdG90YWxNYXRjaGluZ1Jvd0NvdW50OiByb3dzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgIGdyb3VwRGF0YTogeyBrZXk6ICcnIH0gYXMgRyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNzdkZpbGVuYW1lOiBnZXRDc3ZGaWxlbmFtZShwbHVyYWxFbnRpdHlOYW1lLCBvcHRpb25zKSxcbiAgICAgICAgICAgICAgICBjc3ZEYXRhLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBzY2FuKChzdGFibGUsIG5ld1N0YXRlKSA9PiBzdGFibGVTdGF0ZShzdGFibGUsIG5ld1N0YXRlKSksXG4gICAgICApLFxuICAgICAge1xuICAgICAgICBjb25uZWN0b3I6ICgpID0+IG5ldyBSZXBsYXlTdWJqZWN0KDEpLFxuICAgICAgICByZXNldE9uRGlzY29ubmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgICk7XG4gICAgc3RhdGUuY29ubmVjdCgpO1xuXG4gICAgY29uc3QgZWZmZWN0czogQ29ubmVjdGFibGU8RWZmZWN0PiA9IGNvbm5lY3RhYmxlKFxuICAgICAgY29yZVN0YXRlLnBpcGUoXG4gICAgICAgIGZpbHRlcigoeyBlZmZlY3QgfSkgPT4gZWZmZWN0ICE9PSBudWxsKSxcbiAgICAgICAgbWFwKCh7IGVmZmVjdCB9KSA9PiBlZmZlY3QgYXMgRWZmZWN0KSxcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgIHJlc2V0T25EaXNjb25uZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBlZmZlY3RzLmNvbm5lY3QoKTtcblxuICAgIC8vIExvYWQgaW5pdGlhbCB0YWJsZSByb3cgZGF0YS5cbiAgICBhY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZCcgfSk7XG5cbiAgICByZXR1cm4geyBhY3Rpb25zLCBzdGF0ZSwgZWZmZWN0cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3QgdGFibGVzIHVzZSByZW1vdGUgYmFja2VuZHMgdG8gZmV0Y2ggZGF0YSBhc3luY2hyb25vdXNseSwgYnV0IGFuXG4gICAqIGluLW1lbW9yeSBzb3VyY2UgaXMgdXNlZnVsIGZvciBzbWFsbCBkYXRhc2V0cywgd2hlbiBSaXZUYWJsZSBmZWF0dXJlcyBsaWtlXG4gICAqIG9yZGVyaW5nIGFuZCBwYWdpbmF0aW9uIGFyZSBkZXNpcmVkLlxuICAgKi9cblxuICBleHBvcnQgdHlwZSBJbk1lbW9yeUNvbHVtbk1ldGFkYXRhPFIgZXh0ZW5kcyBSb3c+ID0gT21pdDxcbiAgICBDb2x1bW5NZXRhZGF0YSxcbiAgICAnb3JkZXJhYmxlJ1xuICA+ICYgeyBvcmRlcktleT86IGtleW9mIFIgfTtcblxuICBleHBvcnQgdHlwZSBJbk1lbW9yeU1hbmFnZXJPcHRpb25zPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPiA9IE1hbmFnZXJPcHRpb25zPFIsIEMsIEYsIEc+ICYge1xuICAgIGZ1c2VPcHRpb25zPzogSUZ1c2VPcHRpb25zPFI+O1xuICAgIGZpbHRlcj86IChmaWx0ZXJzOiBGIHwgbnVsbCwgcm93OiBSKSA9PiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHF1ZXJ5Lm9yZGVyYCBpcyBudWxsIGFuZCB0aGVyZSBpcyBubyBhY3RpdmUgc2VhcmNoLCByb3dzIGFyZSBvcmRlcmVkXG4gICAgICogYnkgdGhpcyBjb2x1bW4uIElmIG9taXR0ZWQsIHRoZSBmaXJzdCBjb2x1bW4gd2l0aCBhbiBgb3JkZXJLZXlgIGlzIHVzZWRcbiAgICAgKiAoYXNjZW5kaW5nKS5cbiAgICAgKi9cbiAgICBkZWZhdWx0U29ydD86IHsgY29sdW1uOiBDOyBkaXJlY3Rpb246IE9yZGVyRGlyZWN0aW9uIH07XG4gIH07XG5cbiAgZnVuY3Rpb24gb3JkZXJFbXB0eUxhc3Q8Uj4oXG4gICAgcm93czogUltdLFxuICAgIGtleToga2V5b2YgUixcbiAgICBkaXJlY3Rpb246IE9yZGVyRGlyZWN0aW9uLFxuICApOiBSW10ge1xuICAgIHJldHVybiBvcmRlckJ5KHJvd3MsIFtyb3cgPT4gcm93W2tleV0gPT0gbnVsbCwga2V5XSwgWydhc2MnLCBkaXJlY3Rpb25dKTtcbiAgfVxuXG4gIGV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbk1lbW9yeU1hbmFnZXI8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICA+KFxuICAgIGZldGNoRGF0YXNldDogKCkgPT4gUHJvbWlzZTxSW10+IHwgUltdLFxuICAgIGNvbHVtbnM6IE1hcDxDLCBJbk1lbW9yeUNvbHVtbk1ldGFkYXRhPFI+PixcbiAgICBwbHVyYWxFbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IEluTWVtb3J5TWFuYWdlck9wdGlvbnM8UiwgQywgRj4sXG4gICk6IE1hbmFnZXI8UiwgQywgRj4ge1xuICAgIGxldCBkYXRhOiBSW107XG4gICAgbGV0IGZ1c2U6IEZ1c2U8Uj47XG5cbiAgICBjb25zdCBzb3VyY2U6IFNvdXJjZTxSLCBDLCBGPiA9IGFzeW5jIChxdWVyeSwgbW9zdFJlY2VudEFjdGlvbikgPT4ge1xuICAgICAgLy9Gb3IgaW5NZW1vcnlNYW5hZ2VycyB0aGF0IGRvIG5vdCB1dGlsaXplIHNlYXJjaENvbHVtbnMsXG4gICAgICAvL3dlIGRvIG5vdCB3YW50IHRvIG92ZXJ3cml0ZSB0aGVpciBmdXNlT3B0aW9uc1xuICAgICAgaWYgKG1vc3RSZWNlbnRBY3Rpb24udHlwZSA9PT0gJ2xvYWQnKSB7XG4gICAgICAgIC8vUHJldmVudCBzZWFyY2hpbmcgb24gY29sdW1ucyB0aGF0IGFyZSBpbiBmdXNlIG9wdGlvbnMgYnV0IG5vdCBzdXBwb3J0ZWQgYnkgc2VhcmNoLlxuICAgICAgICBjb25zdCBub25TZWFyY2hhYmxlQ29sdW1uc0tleXMgPSBvcHRpb25zPy5mdXNlT3B0aW9ucz8ua2V5c1xuICAgICAgICAgID8gQXJyYXkuZnJvbShjb2x1bW5zLmVudHJpZXMoKSlcbiAgICAgICAgICAgICAgLmZpbHRlcigoW2tleSwgY29sdW1uXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4uc2VhcmNoYWJsZSA9PSBmYWxzZTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLm1hcCgoW2tleSwgY29sdW1uXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4ub3JkZXJLZXk/LnRvU3RyaW5nKCkgfHwga2V5LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIGNvbnN0IGZ1c2VPcHRpb25zID1cbiAgICAgICAgICBvcHRpb25zPy5mdXNlT3B0aW9ucyAmJiBub25TZWFyY2hhYmxlQ29sdW1uc0tleXNcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIC4uLm9wdGlvbnM/LmZ1c2VPcHRpb25zLFxuICAgICAgICAgICAgICAgIGtleXM6IG9wdGlvbnM/LmZ1c2VPcHRpb25zPy5rZXlzPy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICBrID0+ICFub25TZWFyY2hhYmxlQ29sdW1uc0tleXMuaW5jbHVkZXMoay50b1N0cmluZygpKSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG9wdGlvbnM/LmZ1c2VPcHRpb25zO1xuICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hEYXRhc2V0KCk7XG4gICAgICAgIGZ1c2UgPSBuZXcgRnVzZShkYXRhLCBmdXNlT3B0aW9ucyk7XG4gICAgICB9XG4gICAgICBpZiAoXG4gICAgICAgIG1vc3RSZWNlbnRBY3Rpb24udHlwZSA9PT0gJ3NlYXJjaENvbHVtbnNDaGFuZ2UnIHx8XG4gICAgICAgIG1vc3RSZWNlbnRBY3Rpb24udHlwZSA9PT0gJ3RvZ2dsZUFsbFNlYXJjaENvbHVtbnMnXG4gICAgICApIHtcbiAgICAgICAgZGF0YSA9IGF3YWl0IGZldGNoRGF0YXNldCgpO1xuICAgICAgICBmdXNlID0gbmV3IEZ1c2UoZGF0YSwge1xuICAgICAgICAgIC4uLm9wdGlvbnM/LmZ1c2VPcHRpb25zLFxuICAgICAgICAgIGtleXM6IEFycmF5LmZyb20ocXVlcnkuc2VhcmNoQ29sdW1ucy5lbnRyaWVzKCkpXG4gICAgICAgICAgICAuZmlsdGVyKChbXywgdmFsdWVdKSA9PiAhIXZhbHVlKVxuICAgICAgICAgICAgLm1hcCgoW2tleSwgX10pID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgY29sdW1uS2V5ID0gY29sdW1ucy5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgcmV0dXJuIChjb2x1bW5LZXk/Lm9yZGVyS2V5IGFzIEMpIHx8IGtleTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9yZGVyQ29sdW1uOiBrZXlvZiBSIHwgdW5kZWZpbmVkID0gcXVlcnkub3JkZXJcbiAgICAgICAgPyBjb2x1bW5zLmdldChxdWVyeS5vcmRlci5jb2x1bW4pPy5vcmRlcktleVxuICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGhhc0V4cGxpY2l0U29ydCA9IHF1ZXJ5Lm9yZGVyICE9IG51bGwgJiYgb3JkZXJDb2x1bW4gIT09IHVuZGVmaW5lZDtcbiAgICAgIGNvbnN0IGRlZmF1bHRTb3J0U3BlYyA9ICgoKSA9PiB7XG4gICAgICAgIGlmIChvcHRpb25zPy5kZWZhdWx0U29ydCkge1xuICAgICAgICAgIGNvbnN0IGtleSA9IGNvbHVtbnMuZ2V0KG9wdGlvbnMuZGVmYXVsdFNvcnQuY29sdW1uKT8ub3JkZXJLZXk7XG4gICAgICAgICAgaWYgKGtleSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4geyBrZXksIGRpcmVjdGlvbjogb3B0aW9ucy5kZWZhdWx0U29ydC5kaXJlY3Rpb24gfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmlyc3RPcmRlcmFibGUgPSBbLi4uY29sdW1ucy5lbnRyaWVzKCldLmZpbmQoXG4gICAgICAgICAgKFssIG1ldGFdKSA9PiBtZXRhLm9yZGVyS2V5ICE9IG51bGwsXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGtleSA9IGZpcnN0T3JkZXJhYmxlPy5bMV0ub3JkZXJLZXk7XG4gICAgICAgIHJldHVybiBrZXkgIT09IHVuZGVmaW5lZCA/IHsga2V5LCBkaXJlY3Rpb246ICdhc2MnIGFzIGNvbnN0IH0gOiBudWxsO1xuICAgICAgfSkoKTtcblxuICAgICAgbGV0IG9yZGVyZWQ6IFJbXTtcbiAgICAgIGlmIChxdWVyeS5zZWFyY2gpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGZ1c2Uuc2VhcmNoKHF1ZXJ5LnNlYXJjaCkubWFwKHJlc3VsdCA9PiByZXN1bHQuaXRlbSk7XG4gICAgICAgIG9yZGVyZWQgPVxuICAgICAgICAgIGhhc0V4cGxpY2l0U29ydCAmJiBxdWVyeS5vcmRlclxuICAgICAgICAgICAgPyBvcmRlckVtcHR5TGFzdChtYXRjaGVzLCBvcmRlckNvbHVtbiwgcXVlcnkub3JkZXIuZGlyZWN0aW9uKVxuICAgICAgICAgICAgOiBtYXRjaGVzO1xuICAgICAgfSBlbHNlIGlmIChoYXNFeHBsaWNpdFNvcnQgJiYgcXVlcnkub3JkZXIpIHtcbiAgICAgICAgb3JkZXJlZCA9IG9yZGVyRW1wdHlMYXN0KGRhdGEsIG9yZGVyQ29sdW1uLCBxdWVyeS5vcmRlci5kaXJlY3Rpb24pO1xuICAgICAgfSBlbHNlIGlmIChxdWVyeS5vcmRlciA9PSBudWxsICYmIGRlZmF1bHRTb3J0U3BlYykge1xuICAgICAgICBvcmRlcmVkID0gb3JkZXJFbXB0eUxhc3QoXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBkZWZhdWx0U29ydFNwZWMua2V5LFxuICAgICAgICAgIGRlZmF1bHRTb3J0U3BlYy5kaXJlY3Rpb24sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvcmRlcmVkID0gZGF0YTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbHRlciA9IG9wdGlvbnM/LmZpbHRlcjtcbiAgICAgIGNvbnN0IGZpbHRlcmVkID0gZmlsdGVyXG4gICAgICAgID8gb3JkZXJlZC5maWx0ZXIocm93ID0+IGZpbHRlcihxdWVyeS5maWx0ZXJzLCByb3cpKVxuICAgICAgICA6IG9yZGVyZWQ7XG4gICAgICBjb25zdCBzdGFydElkeCA9IHF1ZXJ5LnBhZ2luYXRpb24ucGFnZVNpemUgKiBxdWVyeS5wYWdpbmF0aW9uLnBhZ2U7XG4gICAgICBjb25zdCBlbmRJZHggPSBzdGFydElkeCArIHF1ZXJ5LnBhZ2luYXRpb24ucGFnZVNpemU7XG4gICAgICBjb25zdCBwYWdpbmF0ZWQgPSBmaWx0ZXJlZC5zbGljZShzdGFydElkeCwgZW5kSWR4KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRQYWdlRGF0YTogcGFnaW5hdGVkLFxuICAgICAgICB0b3RhbE1hdGNoaW5nUm93Q291bnQ6IGZpbHRlcmVkLmxlbmd0aCxcbiAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBjb2x1bW5NZXRhZGF0YTogTWFwPEMsIENvbHVtbk1ldGFkYXRhPiA9IG5ldyBNYXAoXG4gICAgICBbLi4uY29sdW1ucy5lbnRyaWVzKCldLm1hcCgoW25hbWUsIG1ldGFkYXRhXSkgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgb3JkZXJhYmxlOiAhIW1ldGFkYXRhLm9yZGVyS2V5LFxuICAgICAgICAgIGZpbHRlcmFibGU6IG1ldGFkYXRhLmZpbHRlcmFibGUsXG4gICAgICAgICAgc2VhcmNoYWJsZTogbWV0YWRhdGEuc2VhcmNoYWJsZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogbWV0YWRhdGEuZGVzY3JpcHRpb24sXG4gICAgICAgICAgbWluV2lkdGg6IG1ldGFkYXRhLm1pbldpZHRoLFxuICAgICAgICAgIGRhdGFUeXBlOiBtZXRhZGF0YS5kYXRhVHlwZSxcbiAgICAgICAgICBkZWZhdWx0UGlubmVkOiBtZXRhZGF0YS5kZWZhdWx0UGlubmVkLFxuICAgICAgICAgIGNsaWNrUHJldmVudERlZmF1bHQ6IG1ldGFkYXRhLmNsaWNrUHJldmVudERlZmF1bHQsXG4gICAgICAgICAgY2xpY2tTdG9wUHJvcGFnYXRpb246IG1ldGFkYXRhLmNsaWNrU3RvcFByb3BhZ2F0aW9uLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiBtZXRhZGF0YS5kaXNwbGF5TmFtZSxcbiAgICAgICAgfSxcbiAgICAgIF0pLFxuICAgICk7XG4gICAgLy8gV2hlbiBhIGRlZmF1bHRTb3J0IGlzIHNwZWNpZmllZCwgc2VlZCB0aGUgaW5pdGlhbCBxdWVyeS5vcmRlciBzbyB0aGVcbiAgICAvLyB0YWJsZSBoZWFkZXIgc2hvd3MgdGhlIHNvcnQgaW5kaWNhdG9yIGZyb20gdGhlIHN0YXJ0LlxuICAgIGlmIChvcHRpb25zPy5kZWZhdWx0U29ydCAmJiAhb3B0aW9ucz8uaW5pdGlhbFN0YXRlPy5xdWVyeT8ub3JkZXIpIHtcbiAgICAgIGNvbnN0IG9yZGVyOiBRdWVyeTxDLCBGPlsnb3JkZXInXSA9IG9wdGlvbnMuZGVmYXVsdFNvcnQ7XG4gICAgICBvcHRpb25zID0ge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBpbml0aWFsU3RhdGU6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLmluaXRpYWxTdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4ub3B0aW9ucy5pbml0aWFsU3RhdGU/LnF1ZXJ5LFxuICAgICAgICAgICAgb3JkZXIsXG4gICAgICAgICAgfSBhcyBEZWVwUGFydGlhbDxRdWVyeTxDLCBGPj4sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gY3JlYXRlTWFuYWdlcihzb3VyY2UsIGNvbHVtbk1ldGFkYXRhLCBwbHVyYWxFbnRpdHlOYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vLy8vLy8vLy8vLy8vL1xuICAvLyBVdGlsaXRpZXMgLy9cbiAgLy8vLy8vLy8vLy8vLy8vXG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldENvbHVtbkFsaWdubWVudChcbiAgICBkYXRhVHlwZTogQ29sdW1uRGF0YVR5cGUsXG4gICAgaXNGaXJzdDogYm9vbGVhbixcbiAgKTogQ29sdW1uQWxpZ25tZW50IHtcbiAgICBpZiAoaXNGaXJzdCkgcmV0dXJuICdsZWZ0JztcbiAgICBzd2l0Y2ggKGRhdGFUeXBlKSB7XG4gICAgICBjYXNlICdkYXRlJzpcbiAgICAgIGNhc2UgJ2xvbmdUZXh0JzpcbiAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgIGNhc2UgJ2FkdmFuY2VkJzpcbiAgICAgIGNhc2UgJ2ljb24nOlxuICAgICAgY2FzZSAnc2hvcnRUZXh0JzpcbiAgICAgICAgcmV0dXJuICdjZW50ZXInO1xuICAgICAgY2FzZSAnY3VycmVuY3knOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgcmV0dXJuICdyaWdodCc7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBrZWVwcyB0aGUgc3RhdGUgb2JqZWN0IHJlZmVyZW5jZXMgYXMgc3RhYmxlIGFzIHBvc3NpYmxlLCB3aGljaFxuICogaGVscHMgQW5ndWxhciByZWR1Y2UgdW5uZWNlc3NhcnkgcmUtcmVuZGVycy4gRm9yIG5vdywgc2ltcGxlIGlzRXF1YWwoKVxuICogY2hlY2tzIGF0IHRoZSBzdGF0ZSdzIHRvcC1sZXZlbCBrZXlzIGFyZSBzdWZmaWNpZW50IHRvIGRyYW1hdGljYWxseSBzcGVlZCB1cFxuICogcmVuZGVyaW5nLCBidXQgaWYgb3RoZXIgcGVyZm9ybWFuY2UgaXNzdWVzIGFyaXNlLCB3ZSBjb3VsZCBpbXBsZW1lbnQgbW9yZVxuICogZ3JhbnVsYXIgY2hlY2tzL3N1cmdpY2FsIHVwZGF0ZXMgYXMgbmVlZGVkICh0aGUgc3RhdGUucmVzdWx0IGJlaW5nIHRoZSBtb3N0XG4gKiBsaWtlbHkgY2FuZGlkYXRlLCBzaW5jZSBtYW55IHR5cGVzIG9mIHN0YXRlIHVwZGF0ZXMgYWZmZWN0IHBhcnRzIG9mIHRoZVxuICogcmVzdWx0IHJvd3MpLlxuICovXG5mdW5jdGlvbiBzdGFibGVTdGF0ZTxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oXG4gIHRhcmdldDogUml2VGFibGUuRnVsbFN0YXRlPFIsIEMsIEYsIEc+LFxuICBzb3VyY2U6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPixcbik6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gIGlmICghaXNFcXVhbCh0YXJnZXQucXVlcnksIHNvdXJjZS5xdWVyeSkpIHtcbiAgICB0YXJnZXQucXVlcnkgPSBzb3VyY2UucXVlcnk7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHRhcmdldC5sb2FkLCBzb3VyY2UubG9hZCkpIHtcbiAgICB0YXJnZXQubG9hZCA9IHNvdXJjZS5sb2FkO1xuICB9XG5cbiAgaWYgKCFpc0VxdWFsKHRhcmdldC5yZXN1bHQuY3N2RGF0YSwgc291cmNlLnJlc3VsdC5jc3ZEYXRhKSkge1xuICAgIHRhcmdldC5yZXN1bHQuY3N2RGF0YSA9IHNvdXJjZS5yZXN1bHQuY3N2RGF0YTtcbiAgfVxuICBpZiAoIWlzRXF1YWwodGFyZ2V0LnJlc3VsdC5jc3ZGaWxlbmFtZSwgc291cmNlLnJlc3VsdC5jc3ZGaWxlbmFtZSkpIHtcbiAgICB0YXJnZXQucmVzdWx0LmNzdkZpbGVuYW1lID0gc291cmNlLnJlc3VsdC5jc3ZGaWxlbmFtZTtcbiAgfVxuICBpZiAoXG4gICAgIWlzRXF1YWwoXG4gICAgICB0YXJnZXQucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCxcbiAgICAgIHNvdXJjZS5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50LFxuICAgIClcbiAgKSB7XG4gICAgdGFyZ2V0LnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQgPSBzb3VyY2UucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudDtcbiAgfVxuICBpZiAoIWlzRXF1YWwodGFyZ2V0LnJlc3VsdCwgc291cmNlLnJlc3VsdCkpIHtcbiAgICB0YXJnZXQucmVzdWx0ID0gc291cmNlLnJlc3VsdDtcbiAgfVxuICBpZiAoIWlzRXF1YWwodGFyZ2V0LmRpc3BsYXksIHNvdXJjZS5kaXNwbGF5KSkge1xuICAgIHRhcmdldC5kaXNwbGF5ID0gc291cmNlLmRpc3BsYXk7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHRhcmdldC5zZWxlY3Rpb24sIHNvdXJjZS5zZWxlY3Rpb24pKSB7XG4gICAgdGFyZ2V0LnNlbGVjdGlvbiA9IHNvdXJjZS5zZWxlY3Rpb247XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFnZUNvdW50PFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+KTogbnVtYmVyIHtcbiAgaWYgKGlzR3JvdXBSZXN1bHQoc3RhdGUucmVzdWx0KSkge1xuICAgIHJldHVybiBNYXRoLm1heChcbiAgICAgIE1hdGguY2VpbChcbiAgICAgICAgc3RhdGUucmVzdWx0LnRvdGFsR3JvdXBDb3VudCAvIHN0YXRlLnF1ZXJ5Lmdyb3VwaW5nLmdyb3Vwc1BlclBhZ2UsXG4gICAgICApLFxuICAgICAgMSxcbiAgICApO1xuICB9XG4gIHJldHVybiBNYXRoLm1heChcbiAgICBNYXRoLmNlaWwoXG4gICAgICBzdGF0ZS5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50IC8gc3RhdGUucXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZSxcbiAgICApLFxuICAgIDEsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFByZXZpb3VzUGFnZTxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPik6IG51bWJlciB8IG51bGwge1xuICByZXR1cm4gc3RhdGUucXVlcnkucGFnaW5hdGlvbi5wYWdlID09PSAwXG4gICAgPyBudWxsXG4gICAgOiBzdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLnBhZ2UgLSAxO1xufVxuXG5mdW5jdGlvbiBnZXRQYWdlczxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPik6IG51bWJlcltdIHtcbiAgY29uc3QgcGFkZGluZyA9IDQ7XG4gIGNvbnN0IG1pbiA9IDA7XG4gIGNvbnN0IG1heCA9IGdldFBhZ2VDb3VudChzdGF0ZSkgLSAxO1xuICBjb25zdCBkZXNpcmVkU3RhcnQgPSBzdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLnBhZ2UgLSBwYWRkaW5nO1xuICBjb25zdCBjbGFtcGVkU3RhcnQgPSBNYXRoLm1heChtaW4sIGRlc2lyZWRTdGFydCk7XG4gIGNvbnN0IGRlc2lyZWRFbmQgPSBzdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLnBhZ2UgKyBwYWRkaW5nO1xuICBjb25zdCBjbGFtcGVkRW5kID0gTWF0aC5taW4obWF4LCBkZXNpcmVkRW5kKTtcbiAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heChtaW4sIGNsYW1wZWRTdGFydCAtIChkZXNpcmVkRW5kIC0gY2xhbXBlZEVuZCkpO1xuICBjb25zdCBlbmQgPSBNYXRoLm1pbihtYXgsIGNsYW1wZWRFbmQgKyAoY2xhbXBlZFN0YXJ0IC0gZGVzaXJlZFN0YXJ0KSk7XG4gIHJldHVybiByYW5nZShzdGFydCwgZW5kICsgMSk7XG59XG5cbmZ1bmN0aW9uIGdldE5leHRQYWdlPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+KTogbnVtYmVyIHwgbnVsbCB7XG4gIGNvbnN0IG1heCA9IGdldFBhZ2VDb3VudChzdGF0ZSkgLSAxO1xuICBjb25zdCBuZXh0ID0gc3RhdGUucXVlcnkucGFnaW5hdGlvbi5wYWdlICsgMTtcbiAgcmV0dXJuIG5leHQgPD0gbWF4ID8gbmV4dCA6IG51bGw7XG59XG5cbi8vIFdlIGRvbid0IHdhbnQgdG8gc2hvdyB0aGUgcGFnaW5hdGlvbiBjb250cm9scyB3aGVuIHRoZXkgYXJlIHVubmVjZXNzYXJ5LlxuZnVuY3Rpb24gZ2V0U2hvd1BhZ2luYXRpb25Db250cm9sczxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPik6IGJvb2xlYW4ge1xuICBpZiAoc3RhdGUucXVlcnkucGFnaW5hdGlvbi5wYWdlID4gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmIChpc0dyb3VwUmVzdWx0KHN0YXRlLnJlc3VsdCkpIHtcbiAgICByZXR1cm4gc3RhdGUucmVzdWx0LnRvdGFsR3JvdXBDb3VudCA+IHN0YXRlLnF1ZXJ5Lmdyb3VwaW5nLmdyb3Vwc1BlclBhZ2U7XG4gIH1cbiAgcmV0dXJuIChcbiAgICBzdGF0ZS5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50ID4gTWF0aC5taW4oLi4uWy4uLlJpdlRhYmxlLnBhZ2VTaXplc10pXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFBhZ2VSb3dTdGFydDxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPik6IG51bWJlciB7XG4gIHJldHVybiBzdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLnBhZ2UgKiBzdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VTaXplICsgMTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFnZVJvd0VuZDxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1pbihcbiAgICAoc3RhdGUucXVlcnkucGFnaW5hdGlvbi5wYWdlICsgMSkgKiBzdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLnBhZ2VTaXplLFxuICAgIHN0YXRlLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQsXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldENzdkZpbGVuYW1lPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgcGx1cmFsRW50aXR5TmFtZTogc3RyaW5nLFxuICBvcHRpb25zPzogUml2VGFibGUuTWFuYWdlck9wdGlvbnM8UiwgQywgRiwgRz4sXG4pOiBzdHJpbmcge1xuICByZXR1cm4gKG9wdGlvbnM/LmNzdkZpbGVCYXNlbmFtZT8uc2xpY2UoMCwgMjAwKSA/PyBwbHVyYWxFbnRpdHlOYW1lKSArICcuY3N2Jztcbn1cblxuZnVuY3Rpb24gbWVtb2l6ZWRDZWxsUm93U3BhbjxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oXG4gIHM6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgZnVsbENvbHVtbnM6IFJpdlRhYmxlLkZ1bGxDb2x1bW48Qz5bXSxcbiAgb3B0aW9ucz86IFJpdlRhYmxlLk1hbmFnZXJPcHRpb25zPFIsIEMsIEYsIEc+LFxuKTogTWFwPEMsIG51bWJlcltdPiB8IG51bGwge1xuICBjb25zdCBnZXRSb3dTcGFuRm9yQ2VsbCA9IG9wdGlvbnM/LmdldFJvd1NwYW5Gb3JDZWxsO1xuICBjb25zdCByZXN1bHQgPSBzLnJlc3VsdDtcblxuICAvLyBJZiB0aGUgZGF0YXNldCBleGNlZWRzIHRoZSBjdXJyZW50IHBhZ2Ugc2l6ZSwgc2tpcCBzcGFuIGNhbGN1bGF0aW9ucy5cbiAgaWYgKHMucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCA+IHMucXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZSkgcmV0dXJuIG51bGw7XG5cbiAgLy8gSWYgdGhlIHVzZXIgaGFzbid0IHByb3ZpZGVkIHRoZSByb3cgc3BhbiBjb25maWd1cmF0aW9uLCBkZWZhdWx0IHRvIG5vIHNwYW5uaW5nXG4gIGlmICghZ2V0Um93U3BhbkZvckNlbGwpIHJldHVybiBudWxsO1xuXG4gIC8vIFJvdyBzcGFubmluZyBpcyBub3Qgc3VwcG9ydGVkIG9uIGdyb3VwZWQgdGFibGVzLlxuICBpZiAoaXNHcm91cFJlc3VsdChyZXN1bHQpKSByZXR1cm4gbnVsbDtcblxuICAvLyBNZW1vaXplIHRoZSB1c2VyJ3MgY29uZmlndXJhdGlvbiBmb3IgdGhlIGN1cnJlbnQgcGFnZS5cbiAgcmV0dXJuIG5ldyBNYXAoXG4gICAgZnVsbENvbHVtbnMubWFwKGNvbHVtbiA9PiBbXG4gICAgICBjb2x1bW4ua2V5LFxuICAgICAgcmVzdWx0LmN1cnJlbnRQYWdlRGF0YS5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3QgcmF3ID0gZ2V0Um93U3BhbkZvckNlbGwoaSwgY29sdW1uLmtleSk7XG4gICAgICAgIGlmIChyYXcgPT09IDApIHJldHVybiAwO1xuICAgICAgICBlbHNlIHJldHVybiBNYXRoLm1heCgxLCB0b0ludGVnZXIocmF3KSk7XG4gICAgICB9KSxcbiAgICBdKSxcbiAgKTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxsQ29sdW1uczxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oXG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gIHN1cHBvcnRlZENvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4pOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPltdIHtcbiAgLy8gSWYgdGhlIHRhYmxlIG9mZmVycyBtb3JlIGNvbHVtbnMgdGhhbiB0aGUgdXNlciBoYXMgY29uZmlndXJhdGlvbiBzZXR0aW5nc1xuICAvLyBmb3IgKG9yIGlmIHRoZSB1c2VyIGhhcyBubyBjb25maWd1cmF0aW9uIHNldHRpbmdzIHlldCksIHdlJ2xsIGFwcGVuZCB0aGVtXG4gIC8vIHRvIHRoZSBlbmQgKHVubGVzcyB0aGV5IHNob3VsZCBiZSBwaW5uZWQgYnkgZGVmYXVsdCwgaW4gd2hpY2ggY2FzZSB3ZSdsbFxuICAvLyBhcHBlbmQgdGhlbSBhZnRlciB0aGUgb3RoZXIgcGlubmVkIGNvbHVtbnMpLiBUaGlzIGVuc3VyZXMgdGhhdCBuZXcgY29sdW1uc1xuICAvLyB3ZSBhZGQgdG8gZXhpc3RpbmcgdGFibGVzIG92ZXIgdGltZSAoMSkgZ2V0IGRpc3BsYXllZCBldmVuIHRob3VnaCB0aGV5XG4gIC8vIGRvbid0IGFwcGVhciBpbiB0aGUgdXNlcidzIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgeWV0LCBhbmQgKDIpIGRvbid0XG4gIC8vIGludGVycnVwdCB0aGVpciBleGlzdGluZyBzZXR1cC5cbiAgY29uc3QgY29sdW1uTmFtZXNXaXRob3V0VXNlclNldHRpbmdzID0gZGlmZmVyZW5jZShcbiAgICBbLi4uc3VwcG9ydGVkQ29sdW1ucy5rZXlzKCldLFxuICAgIHN0YXRlLmRpc3BsYXkuY29sdW1uU2V0dGluZ3MubWFwKCh7IGtleSB9KSA9PiBrZXkpLFxuICApO1xuXG4gIC8vIFRocm93IG91dCBzZXR0aW5ncyBmb3IgY29sdW1ucyBubyBsb25nZXIgb2ZmZXJlZCBieSB0aGUgdGFibGUuXG4gIGNvbnN0IGNvbHVtbnNXaXRoVXNlclNldHRpbmdzOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPltdID1cbiAgICBzdGF0ZS5kaXNwbGF5LmNvbHVtblNldHRpbmdzLmZpbHRlcigoeyBrZXkgfSkgPT4gc3VwcG9ydGVkQ29sdW1ucy5oYXMoa2V5KSk7XG5cbiAgY29uc3QgY29sdW1uc1dpdGhvdXRVc2VyU2V0dGluZ3M6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10gPSBbXG4gICAgLi4uY29sdW1uTmFtZXNXaXRob3V0VXNlclNldHRpbmdzLFxuICBdLm1hcCgoa2V5OiBDKSA9PiAoe1xuICAgIGtleSxcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIHByZWZlcnJlZFdpZHRoOiAnYXV0bycsXG4gICAgcGlubmVkOiAhIXN1cHBvcnRlZENvbHVtbnMuZ2V0KGtleSk/LmRlZmF1bHRQaW5uZWQsXG4gIH0pKTtcblxuICByZXR1cm4gb3JkZXJJbnRlbnRpb25hbGx5KFxuICAgIFsuLi5jb2x1bW5zV2l0aFVzZXJTZXR0aW5ncywgLi4uY29sdW1uc1dpdGhvdXRVc2VyU2V0dGluZ3NdLFxuICAgIGNvbHVtbk5hbWVNYXAsXG4gICk7XG59XG5cbmZ1bmN0aW9uIG9yZGVySW50ZW50aW9uYWxseTxDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uPihcbiAgY29sdW1uczogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bXSxcbiAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbik6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10ge1xuICByZXR1cm4gW1xuICAgIC4uLmNvbHVtbnMuZmlsdGVyKHYgPT4gdi5waW5uZWQpLFxuICAgIC4uLmNvbHVtbnMuZmlsdGVyKHYgPT4gdi5lbmFibGVkICYmICF2LnBpbm5lZCksXG4gICAgLi4uY29sdW1uc1xuICAgICAgLmZpbHRlcih2ID0+ICF2LmVuYWJsZWQgJiYgIXYucGlubmVkKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYU5hbWUgPSBjb2x1bW5OYW1lTWFwLmdldChhLmtleSkgPz8gYS5rZXk7XG4gICAgICAgIGNvbnN0IGJOYW1lID0gY29sdW1uTmFtZU1hcC5nZXQoYi5rZXkpID8/IGIua2V5O1xuICAgICAgICByZXR1cm4gYU5hbWUubG9jYWxlQ29tcGFyZShiTmFtZSk7XG4gICAgICB9KSxcbiAgXTtcbn1cblxuZnVuY3Rpb24gZ2V0QWxpZ25tZW50KFxuICBtZXRhZGF0YTogUml2VGFibGUuQ29sdW1uTWV0YWRhdGEsXG4gIGluZGV4OiBudW1iZXIsXG4gIGFsbG93U2VsZWN0aW9uPzogYm9vbGVhbixcbik6IFJpdlRhYmxlLkNvbHVtbkFsaWdubWVudCB7XG4gIHJldHVybiBSaXZUYWJsZS5nZXRDb2x1bW5BbGlnbm1lbnQoXG4gICAgbWV0YWRhdGEuZGF0YVR5cGUsXG4gICAgaW5kZXggPT09IDAgJiYgIWFsbG93U2VsZWN0aW9uLFxuICApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlQ29sdW1uczxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oXG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gIHN1cHBvcnRlZENvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gIGFsbG93U2VsZWN0aW9uOiBib29sZWFuIHwgdW5kZWZpbmVkLFxuKTogUml2VGFibGUuRnVsbENvbHVtbjxDPltdIHtcbiAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIHN1cHBvcnRlZENvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuICByZXR1cm4gYWxsQ29sdW1uc1xuICAgIC5maWx0ZXIoKHsgZW5hYmxlZCB9KSA9PiBlbmFibGVkKVxuICAgIC5yZWR1Y2UoXG4gICAgICAoXG4gICAgICAgIGZ1bGxDb2x1bW5zOiBSaXZUYWJsZS5GdWxsQ29sdW1uPEM+W10sXG4gICAgICAgIHNldHRpbmdzOiBSaXZUYWJsZS5Db2x1bW5TZXR0aW5nczxDPixcbiAgICAgICAgaTogbnVtYmVyLFxuICAgICAgKTogUml2VGFibGUuRnVsbENvbHVtbjxDPltdID0+IHtcbiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBzdXBwb3J0ZWRDb2x1bW5zLmdldChzZXR0aW5ncy5rZXkpITtcbiAgICAgICAgY29uc3QgcmVzb2x2ZWRXaWR0aCA9XG4gICAgICAgICAgc2V0dGluZ3MucHJlZmVycmVkV2lkdGggPT09ICdhdXRvJ1xuICAgICAgICAgICAgPyBtZXRhZGF0YS5taW5XaWR0aFxuICAgICAgICAgICAgOiBNYXRoLm1heChtZXRhZGF0YS5taW5XaWR0aCwgc2V0dGluZ3MucHJlZmVycmVkV2lkdGgpO1xuICAgICAgICBjb25zdCBwcmV2aW91c0NvbHVtbjogUml2VGFibGUuRnVsbENvbHVtbjxDPiB8IHVuZGVmaW5lZCA9XG4gICAgICAgICAgZnVsbENvbHVtbnNbaSAtIDFdO1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIC4uLmZ1bGxDb2x1bW5zLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLnNldHRpbmdzLFxuICAgICAgICAgICAgLi4ubWV0YWRhdGEsXG4gICAgICAgICAgICB3aWR0aDogcmVzb2x2ZWRXaWR0aCxcbiAgICAgICAgICAgIGxlZnQ6IHNldHRpbmdzLnBpbm5lZFxuICAgICAgICAgICAgICA/IHByZXZpb3VzQ29sdW1uXG4gICAgICAgICAgICAgICAgPyAocHJldmlvdXNDb2x1bW4ubGVmdCB8fCAwKSArIHByZXZpb3VzQ29sdW1uLndpZHRoXG4gICAgICAgICAgICAgICAgOiAhIWFsbG93U2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgPyA0MFxuICAgICAgICAgICAgICAgIDogMFxuICAgICAgICAgICAgICA6IG51bGwsXG4gICAgICAgICAgICBhbGlnbm1lbnQ6IGdldEFsaWdubWVudChtZXRhZGF0YSwgaSwgISFhbGxvd1NlbGVjdGlvbiksXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0sXG4gICAgICBbXSxcbiAgICApO1xufVxuXG5mdW5jdGlvbiBnZXRaZXJvU3RhdGVNZXNzYWdlPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LCBlbnRpdHk6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBpZiAoXG4gICAgKGlzR3JvdXBSZXN1bHQoc3RhdGUucmVzdWx0KSAmJiBzdGF0ZS5yZXN1bHQudG90YWxHcm91cENvdW50ID4gMCkgfHxcbiAgICAoIWlzR3JvdXBSZXN1bHQoc3RhdGUucmVzdWx0KSAmJiBzdGF0ZS5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50ID4gMClcbiAgKVxuICAgIHJldHVybiBudWxsO1xuICBjb25zdCBhbGxTZWFyY2hDb2x1bW5zU2VsZWN0ZWQgPSBnZXRTZWFyY2hDb2x1bW5zU2VsZWN0ZWRTdGF0ZShzdGF0ZSwgJ2FsbCcpO1xuICBpZiAoc3RhdGUucXVlcnkuc2VhcmNoICYmIGFsbFNlYXJjaENvbHVtbnNTZWxlY3RlZClcbiAgICByZXR1cm4gYE5vICR7ZW50aXR5fSBtYXRjaCB5b3VyIGN1cnJlbnQgc2VhcmNoIGtleXdvcmQuYDtcbiAgaWYgKHN0YXRlLnF1ZXJ5LnNlYXJjaCAmJiAhYWxsU2VhcmNoQ29sdW1uc1NlbGVjdGVkKVxuICAgIHJldHVybiBgTm8gJHtlbnRpdHl9IG1hdGNoIHlvdXIgY3VycmVudCBzZWFyY2gga2V5d29yZCBpbiB0aGUgc2VsZWN0ZWQgc2VhcmNoIGNvbHVtbnMuYDtcbiAgaWYgKHN0YXRlLnF1ZXJ5LmZpbHRlcnMpIHJldHVybiBgTm8gJHtlbnRpdHl9IG1hdGNoIHlvdXIgY3VycmVudCBmaWx0ZXJzLmA7XG4gIHJldHVybiBgTm8gJHtlbnRpdHl9LmA7XG59XG5cbmZ1bmN0aW9uIGNoYW5nZUNvbHVtblBpbjxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oXG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gIGNvbHVtbjogQyxcbiAgcGlubmVkOiBib29sZWFuLFxuKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuXG4gIGlmIChwaW5uZWQpIHtcbiAgICBjb25zdCB0YXJnZXQgPSBhbGxDb2x1bW5zLmZpbmQoYyA9PiBjLmtleSA9PT0gY29sdW1uKTtcbiAgICBjb25zdCB3YXNFbmFibGVkID0gISF0YXJnZXQ/LmVuYWJsZWQ7XG4gICAgaWYgKCF3YXNFbmFibGVkKSB7XG4gICAgICBjb25zdCBlbmFibGVkQ291bnQgPSBhbGxDb2x1bW5zLmZpbHRlcihjb2wgPT4gY29sLmVuYWJsZWQpLmxlbmd0aDtcbiAgICAgIGlmIChlbmFibGVkQ291bnQgPj0gUml2VGFibGUuQ29sdW1uc01heFNob3duKSB7XG4gICAgICAgIHJldHVybiBzdGF0ZTsgLy8gcmVmdXNlIHRoZSBwaW4gc2luY2UgaXQgd291bGQgZXhjZWVkIHRoZSBtYXhcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KFxuICAgICAgICBhbGxDb2x1bW5zLm1hcChjID0+ICh7XG4gICAgICAgICAgLi4uYyxcbiAgICAgICAgICBwaW5uZWQ6IGMua2V5ID09PSBjb2x1bW4gPyBwaW5uZWQgOiBjLnBpbm5lZCxcbiAgICAgICAgICAvLyBDaGVjay9lbmFibGUgaWYgYmVpbmcgcGlubmVkXG4gICAgICAgICAgZW5hYmxlZDogYy5rZXkgPT09IGNvbHVtbiAmJiBwaW5uZWQgPyB0cnVlIDogYy5lbmFibGVkLFxuICAgICAgICB9KSksXG4gICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICApLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoYW5nZUNvbHVtbnNGcmVlemVTdGF0ZTxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oXG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gIGNvbHVtbk5hbWVNYXA6IFJpdlRhYmxlLkNvbHVtbk5hbWVNYXA8Qz4sXG4gIGluZGV4OiBudW1iZXIsXG4gIGZyZWV6ZTogYm9vbGVhbixcbik6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICBjb2x1bW5TZXR0aW5nczogYWxsQ29sdW1ucy5tYXAoKGMsIGkpID0+IHtcbiAgICAgICAgcmV0dXJuIHsgLi4uYywgcGlubmVkOiBmcmVlemUgJiYgaSA8PSBpbmRleCB9O1xuICAgICAgfSksXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbW92ZUNvbHVtblRvPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgY29sdW1uOiBDLFxuICBwb3NpdGlvbjogJ3N0YXJ0JyB8ICdlbmQnLFxuKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuICBjb25zdCBwcmV2aW91c0luZGV4ID0gYWxsQ29sdW1ucy5maW5kSW5kZXgoYyA9PiBjLmtleSA9PT0gY29sdW1uKTtcbiAgY29uc3QgbGFzdEluZGV4ID1cbiAgICBwb3NpdGlvbiA9PSAnZW5kJyA/IGFsbENvbHVtbnMuZmluZEluZGV4KGMgPT4gIWMuZW5hYmxlZCkgOiAwO1xuICBjb25zdCBuZXdJbmRleCA9XG4gICAgcG9zaXRpb24gPT0gJ3N0YXJ0J1xuICAgICAgPyAwXG4gICAgICA6IGxhc3RJbmRleCA9PSAtMVxuICAgICAgPyBhbGxDb2x1bW5zLmxlbmd0aCAtIDFcbiAgICAgIDogbGFzdEluZGV4O1xuXG4gIGlmIChcbiAgICAhYWxsQ29sdW1uc1twcmV2aW91c0luZGV4XS5lbmFibGVkICYmXG4gICAgYWxsQ29sdW1ucy5maWx0ZXIoY29sID0+IGNvbC5lbmFibGVkKS5sZW5ndGggPj0gUml2VGFibGUuQ29sdW1uc01heFNob3duXG4gIClcbiAgICByZXR1cm4gc3RhdGU7XG5cbiAgY29uc3QgbW92ZWRTdGF0ZSA9IGNoYW5nZUNvbHVtbk9yZGVyKFxuICAgIHN0YXRlLFxuICAgIGNvbHVtbnMsXG4gICAgY29sdW1uTmFtZU1hcCxcbiAgICBwcmV2aW91c0luZGV4LFxuICAgIG5ld0luZGV4LFxuICApO1xuICAvL01ha2Ugc3VyZSB0aGUgY29sdW1uIGlzIGVuYWJsZWRcbiAgcmV0dXJuIGNoYW5nZUNvbHVtbkVuYWJsZWQobW92ZWRTdGF0ZSwgY29sdW1ucywgY29sdW1uTmFtZU1hcCwgY29sdW1uLCB0cnVlKTtcbn1cblxuZnVuY3Rpb24gY2hhbmdlQ29sdW1uT3JkZXI8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KFxuICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICBjb2x1bW5zOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICBwcmV2aW91c0luZGV4OiBudW1iZXIsXG4gIG5ld0luZGV4OiBudW1iZXIsXG4pOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICBjb25zdCBhbGxDb2x1bW5zID0gZ2V0QWxsQ29sdW1ucyhzdGF0ZSwgY29sdW1ucywgY29sdW1uTmFtZU1hcCk7XG5cbiAgLy8gRmlyc3QsIHB1dCB0aGUgY29sdW1ucyBpbiB0aGUgZGVzaXJlZCBvcmRlci5cbiAgY29uc3QgaXRlbSA9IGFsbENvbHVtbnNbcHJldmlvdXNJbmRleF07XG4gIGNvbnN0IHdpdGhvdXRJdGVtID0gYWxsQ29sdW1ucy5maWx0ZXIoKF8sIGkpID0+IGkgIT09IHByZXZpb3VzSW5kZXgpO1xuICBjb25zdCByZW9yZGVyZWQgPSBbXG4gICAgLi4ud2l0aG91dEl0ZW0uc2xpY2UoMCwgbmV3SW5kZXgpLFxuICAgIGl0ZW0sXG4gICAgLi4ud2l0aG91dEl0ZW0uc2xpY2UobmV3SW5kZXgpLFxuICBdO1xuXG4gIC8vIFRoZW4sIHdlIG1heSBuZWVkIHRvIGZpeCB0aGUgcGlucyAoYWxsIHBpbm5lZCBjb2x1bW5zIGFwcGVhciBhdCB0aGVcbiAgLy8gYmVnaW5uaW5nIG9mIHRoZSBjb2x1bW5zIGFycmF5KSBzaW5jZSB0aGUgdXNlciBpcyBhbGxvd2VkIHRvIGRyYWdcbiAgLy8gYW5kIGRyb3AgY29sdW1ucyB0byBhbmQgZnJvbSB0aGUgcGlubmVkIGFyZWEuIElmIHRoZSB1c2VyIGRyYWdzIGFcbiAgLy8gY29sdW1uIGFjcm9zcyB0aGF0IHRocmVzaG9sZCwgdXBkYXRlIGl0cyBwaW5uZWQgc3RhdHVzLlxuICBjb25zdCB1cGRhdGVkID0gcmVvcmRlcmVkLm1hcCgoc2V0dGluZ3MsIGksIGFycikgPT4ge1xuICAgIGlmIChuZXdJbmRleCA9PT0gaSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc2V0dGluZ3MsXG4gICAgICAgIHBpbm5lZDogc2V0dGluZ3MucGlubmVkXG4gICAgICAgICAgPyBhcnJbaSAtIDFdPy5waW5uZWQgPz8gdHJ1ZVxuICAgICAgICAgIDogYXJyW2kgKyAxXT8ucGlubmVkID8/IGZhbHNlLFxuICAgICAgICBlbmFibGVkOiBzZXR0aW5ncy5lbmFibGVkXG4gICAgICAgICAgPyBhcnJbaSAtIDFdPy5lbmFibGVkID8/IHRydWVcbiAgICAgICAgICA6IGFycltpICsgMV0/LmVuYWJsZWQgPz8gZmFsc2UsXG4gICAgICB9O1xuICAgIH0gZWxzZSByZXR1cm4gc2V0dGluZ3M7XG4gIH0pO1xuXG4gIGNvbnN0IHdhc0Rpc2FibGVkID0gIWl0ZW0uZW5hYmxlZDtcbiAgY29uc3QgYmVjYW1lRW5hYmxlZCA9IHVwZGF0ZWRbbmV3SW5kZXhdLmVuYWJsZWQ7XG4gIGlmICh3YXNEaXNhYmxlZCAmJiBiZWNhbWVFbmFibGVkKSB7XG4gICAgY29uc3QgZW5hYmxlZENvdW50ID0gYWxsQ29sdW1ucy5maWx0ZXIoYyA9PiBjLmVuYWJsZWQpLmxlbmd0aDtcbiAgICBpZiAoZW5hYmxlZENvdW50ID49IFJpdlRhYmxlLkNvbHVtbnNNYXhTaG93bikge1xuICAgICAgLy8gUmVmdXNlIHRoZSBtb3ZlOyBrZWVwIHN0YXRlIGFzLWlzXG4gICAgICByZXR1cm4gc3RhdGU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBkaXNwbGF5OiB7XG4gICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgY29sdW1uU2V0dGluZ3M6IG9yZGVySW50ZW50aW9uYWxseSh1cGRhdGVkLCBjb2x1bW5OYW1lTWFwKSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjaGFuZ2VDb2x1bW5FbmFibGVkPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgY29sdW1uOiBDLFxuICBlbmFibGVkOiBib29sZWFuLFxuKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgY29uc3QgYWxsQ29sdW1ucyA9IGdldEFsbENvbHVtbnMoc3RhdGUsIGNvbHVtbnMsIGNvbHVtbk5hbWVNYXApO1xuICBpZiAoXG4gICAgZW5hYmxlZCAmJlxuICAgIGFsbENvbHVtbnMuZmlsdGVyKGNvbCA9PiBjb2wuZW5hYmxlZCkubGVuZ3RoID49IFJpdlRhYmxlLkNvbHVtbnNNYXhTaG93blxuICApIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KFxuICAgICAgICBhbGxDb2x1bW5zLm1hcChjID0+ICh7XG4gICAgICAgICAgLi4uYyxcbiAgICAgICAgICBlbmFibGVkOiBjLmtleSA9PT0gY29sdW1uID8gZW5hYmxlZCA6IGMuZW5hYmxlZCxcbiAgICAgICAgICAvLyBVbnBpbiBpZiBiZWluZyB1bmNoZWNrZWRcbiAgICAgICAgICBwaW5uZWQ6IGMua2V5ID09PSBjb2x1bW4gJiYgIWVuYWJsZWQgPyBmYWxzZSA6IGMucGlubmVkLFxuICAgICAgICB9KSksXG4gICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICApLFxuICAgIH0sXG4gIH07XG59XG5mdW5jdGlvbiBlbmFibGVBbGxDb2x1bW5zPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgZW5hYmxlZDogYm9vbGVhbixcbik6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gIGNvbnN0IGFsbENvbHVtbnMgPSBnZXRBbGxDb2x1bW5zKHN0YXRlLCBjb2x1bW5zLCBjb2x1bW5OYW1lTWFwKTtcbiAgaWYgKGVuYWJsZWQgJiYgYWxsQ29sdW1ucy5sZW5ndGggPiBSaXZUYWJsZS5Db2x1bW5zTWF4U2hvd24pIHJldHVybiBzdGF0ZTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KFxuICAgICAgICBhbGxDb2x1bW5zLm1hcChjID0+ICh7XG4gICAgICAgICAgLi4uYyxcbiAgICAgICAgICBlbmFibGVkOiBlbmFibGVkLFxuICAgICAgICAgIC8vIFVucGluIGlmIGJlaW5nIHVuY2hlY2tlZFxuICAgICAgICAgIHBpbm5lZDogIWVuYWJsZWQgPyBmYWxzZSA6IGMucGlubmVkLFxuICAgICAgICB9KSksXG4gICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICApLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNoYW5nZUNvbHVtbldpZHRoPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgY29sdW1uczogTWFwPEMsIFJpdlRhYmxlLkNvbHVtbk1ldGFkYXRhPixcbiAgY29sdW1uTmFtZU1hcDogUml2VGFibGUuQ29sdW1uTmFtZU1hcDxDPixcbiAgY29sdW1uOiBDLFxuICBwcmVmZXJyZWRXaWR0aDogUml2VGFibGUuQ29sdW1uU2V0dGluZ3M8Qz5bJ3ByZWZlcnJlZFdpZHRoJ10sXG4pOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICBjb25zdCBhbGxDb2x1bW5zID0gZ2V0QWxsQ29sdW1ucyhzdGF0ZSwgY29sdW1ucywgY29sdW1uTmFtZU1hcCk7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZGlzcGxheToge1xuICAgICAgLi4uc3RhdGUuZGlzcGxheSxcbiAgICAgIGNvbHVtblNldHRpbmdzOiBhbGxDb2x1bW5zLm1hcChjID0+ICh7XG4gICAgICAgIC4uLmMsXG4gICAgICAgIHByZWZlcnJlZFdpZHRoOiBjLmtleSA9PT0gY29sdW1uID8gcHJlZmVycmVkV2lkdGggOiBjLnByZWZlcnJlZFdpZHRoLFxuICAgICAgfSkpLFxuICAgIH0sXG4gIH07XG59XG5mdW5jdGlvbiByZXNldFRvRGVmYXVsdENvbHVtbnM8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KFxuICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICBjb2x1bW5zOiBNYXA8QywgUml2VGFibGUuQ29sdW1uTWV0YWRhdGE+LFxuICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICBkZWZhdWx0Q29sdW1uU3RhdGU6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10sXG4pOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGRpc3BsYXk6IHtcbiAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICBjb2x1bW5TZXR0aW5nczogb3JkZXJJbnRlbnRpb25hbGx5KGRlZmF1bHRDb2x1bW5TdGF0ZSwgY29sdW1uTmFtZU1hcCksXG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNSb3dTZWxlY3RlZDxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiwgaWQ6IFJbJ2lkJ10pOiBib29sZWFuIHtcbiAgc3dpdGNoIChzdGF0ZS5zZWxlY3Rpb24ubW9kZSkge1xuICAgIGNhc2UgJ2luY2x1ZGUnOlxuICAgICAgcmV0dXJuIHN0YXRlLnNlbGVjdGlvbi5pbmNsdWRlZC5oYXMoaWQpO1xuICAgIGNhc2UgJ2V4Y2x1ZGUnOlxuICAgICAgcmV0dXJuICFzdGF0ZS5zZWxlY3Rpb24uZXhjbHVkZWQuaGFzKGlkKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBpc0dyb3VwU2VsZWN0ZWQ8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KFxuICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICBncm91cDogUml2VGFibGUuU3ViR3JvdXBSZXN1bHQ8UiwgRz4sXG4pOiBSaXZUYWJsZS5NdWx0aVNlbGVjdGlvblN0YXRlIHtcbiAgc3dpdGNoIChzdGF0ZS5zZWxlY3Rpb24ubW9kZSkge1xuICAgIGNhc2UgJ2luY2x1ZGUnOiB7XG4gICAgICBsZXQgYWxsRm91bmQgPSB0cnVlO1xuICAgICAgbGV0IGFueUZvdW5kID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBncm91cC5jdXJyZW50UGFnZURhdGEpIHtcbiAgICAgICAgaWYgKCFzdGF0ZS5zZWxlY3Rpb24uaW5jbHVkZWQuaGFzKHJvdy5pZCkpIHtcbiAgICAgICAgICBhbGxGb3VuZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFueUZvdW5kID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGFsbEZvdW5kID8gdHJ1ZSA6IGFueUZvdW5kID8gJ2luZGV0ZXJtaW5hdGUnIDogZmFsc2U7XG4gICAgfVxuICAgIGNhc2UgJ2V4Y2x1ZGUnOiB7XG4gICAgICBsZXQgYWxsRm91bmQgPSB0cnVlO1xuICAgICAgbGV0IGFueUZvdW5kID0gZmFsc2U7XG4gICAgICBmb3IgKGNvbnN0IHJvdyBvZiBncm91cC5jdXJyZW50UGFnZURhdGEpIHtcbiAgICAgICAgaWYgKHN0YXRlLnNlbGVjdGlvbi5leGNsdWRlZC5oYXMocm93LmlkKSkge1xuICAgICAgICAgIGFsbEZvdW5kID0gZmFsc2U7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYW55Rm91bmQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWxsRm91bmQgPyB0cnVlIDogYW55Rm91bmQgPyAnaW5kZXRlcm1pbmF0ZScgOiBmYWxzZTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBbGxTZWxlY3RlZDxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPik6IFJpdlRhYmxlLk11bHRpU2VsZWN0aW9uU3RhdGUge1xuICAvLyBJZiB0aGVyZSBhcmUgbm8gcm93cywgXCJhbGwgc2VsZWN0ZWRcIiBzaG91bGQgYmUgZmFsc2VcbiAgaWYgKHN0YXRlLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQgPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgKHN0YXRlLnNlbGVjdGlvbi5tb2RlID09PSAnZXhjbHVkZScgJiZcbiAgICAgIHN0YXRlLnNlbGVjdGlvbi5leGNsdWRlZC5zaXplID09PSAwKSB8fFxuICAgIChzdGF0ZS5zZWxlY3Rpb24ubW9kZSA9PT0gJ2luY2x1ZGUnICYmXG4gICAgICBzdGF0ZS5zZWxlY3Rpb24uaW5jbHVkZWQuc2l6ZSA9PT0gc3RhdGUucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudClcbiAgKVxuICAgIHJldHVybiB0cnVlO1xuICBpZiAoXG4gICAgKHN0YXRlLnNlbGVjdGlvbi5tb2RlID09PSAnZXhjbHVkZScgJiZcbiAgICAgIHN0YXRlLnNlbGVjdGlvbi5leGNsdWRlZC5zaXplID09PSBzdGF0ZS5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50KSB8fFxuICAgIChzdGF0ZS5zZWxlY3Rpb24ubW9kZSA9PT0gJ2luY2x1ZGUnICYmIHN0YXRlLnNlbGVjdGlvbi5pbmNsdWRlZC5zaXplID09PSAwKVxuICApXG4gICAgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gJ2luZGV0ZXJtaW5hdGUnO1xufVxuXG5mdW5jdGlvbiBpc0N1cnJlbnRQYWdlU2VsZWN0ZWQ8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4pOiBSaXZUYWJsZS5NdWx0aVNlbGVjdGlvblN0YXRlIHtcbiAgY29uc3Qgc2VsZWN0ZWRTdGF0ZXMgPSBnZXRBbGxSb3dzRnJvbVJlc3VsdChzdGF0ZS5yZXN1bHQpLm1hcCgoeyBpZCB9KSA9PlxuICAgIGlzUm93U2VsZWN0ZWQoc3RhdGUsIGlkKSxcbiAgKTtcbiAgaWYgKHNlbGVjdGVkU3RhdGVzLmxlbmd0aCA+IDApIHtcbiAgICBpZiAoc2VsZWN0ZWRTdGF0ZXMuZXZlcnkodiA9PiB2KSkgcmV0dXJuIHRydWU7XG4gICAgaWYgKHNlbGVjdGVkU3RhdGVzLnNvbWUodiA9PiB2KSkgcmV0dXJuICdpbmRldGVybWluYXRlJztcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHNlbGVjdGVkQ291bnQ8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4pOiBudW1iZXIge1xuICBzd2l0Y2ggKHN0YXRlLnNlbGVjdGlvbi5tb2RlKSB7XG4gICAgY2FzZSAnaW5jbHVkZSc6XG4gICAgICByZXR1cm4gc3RhdGUuc2VsZWN0aW9uLmluY2x1ZGVkLnNpemU7XG4gICAgY2FzZSAnZXhjbHVkZSc6XG4gICAgICByZXR1cm4gc3RhdGUucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCAtIHN0YXRlLnNlbGVjdGlvbi5leGNsdWRlZC5zaXplO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uKiByZWZyZXNoUmVzdWx0V2l0aDxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oXG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gIHNvdXJjZTogUml2VGFibGUuU291cmNlPFIsIEMsIEYsIEc+LFxuICBtb3N0UmVjZW50QWN0aW9uOiBSaXZUYWJsZS5BY3Rpb248UiwgQywgRiwgRz4sXG4pOiBBc3luY0dlbmVyYXRvcjx7XG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz47XG4gIGVmZmVjdDogUml2VGFibGUuRWZmZWN0IHwgbnVsbDtcbn0+IHtcbiAgeWllbGQge1xuICAgIHN0YXRlOiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGxvYWQ6IHtcbiAgICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgZXJyb3I6IG51bGwsXG4gICAgICB9LFxuICAgIH0sXG4gICAgZWZmZWN0OiBudWxsLFxuICB9O1xuICB0cnkge1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHNvdXJjZShzdGF0ZS5xdWVyeSwgbW9zdFJlY2VudEFjdGlvbik7XG4gICAgaWYgKGlzUGFnZU91dE9mQm91bmRzKHN0YXRlLCByZXN1bHQpKSB7XG4gICAgICBzdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLnBhZ2UgPSAwO1xuICAgIH1cbiAgICB5aWVsZCB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbG9hZDoge1xuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGVycm9yOiBudWxsLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHQsXG4gICAgICB9LFxuICAgICAgZWZmZWN0OiBudWxsLFxuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB5aWVsZCB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgbG9hZDoge1xuICAgICAgICAgIGxvYWRpbmc6IGZhbHNlLFxuICAgICAgICAgIGVycm9yLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGVmZmVjdDogbnVsbCxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHNldFJvd1NlbGVjdGVkPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgaWQ6IFJbJ2lkJ10sXG4gIHNlbGVjdGVkOiBib29sZWFuLFxuICBjb250aWd1b3VzOiBib29sZWFuLFxuKTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgaWYgKHNlbGVjdGVkKSB7XG4gICAgY29uc3QgbmV3U2VsZWN0aW9uID0gbmV3IFNldDxSWydpZCddPihbaWRdKTtcbiAgICBpZiAoY29udGlndW91cyAmJiBzdGF0ZS5zZWxlY3Rpb24ubW9zdFJlY2VudGx5U2VsZWN0ZWQpIHtcbiAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gZ2V0QWxsUm93c0Zyb21SZXN1bHQoc3RhdGUucmVzdWx0KS5maW5kSW5kZXgoXG4gICAgICAgIHJvdyA9PiByb3cuaWQgPT09IHN0YXRlLnNlbGVjdGlvbi5tb3N0UmVjZW50bHlTZWxlY3RlZCxcbiAgICAgICk7XG4gICAgICBjb25zdCBlbmRJZHggPSBnZXRBbGxSb3dzRnJvbVJlc3VsdChzdGF0ZS5yZXN1bHQpLmZpbmRJbmRleChcbiAgICAgICAgcm93ID0+IHJvdy5pZCA9PT0gaWQsXG4gICAgICApO1xuICAgICAgaWYgKHR5cGVvZiBzdGFydElkeCA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGVuZElkeCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgZm9yIChcbiAgICAgICAgICBsZXQgaSA9IE1hdGgubWluKHN0YXJ0SWR4LCBlbmRJZHgpO1xuICAgICAgICAgIGkgPD0gTWF0aC5tYXgoc3RhcnRJZHgsIGVuZElkeCk7XG4gICAgICAgICAgaSsrXG4gICAgICAgICkge1xuICAgICAgICAgIG5ld1NlbGVjdGlvbi5hZGQoZ2V0QWxsUm93c0Zyb21SZXN1bHQoc3RhdGUucmVzdWx0KVtpXS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBpZCxcbiAgICAgICAgLi4uKHN0YXRlLnNlbGVjdGlvbi5tb2RlID09PSAnaW5jbHVkZSdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgICBpbmNsdWRlZDogbmV3IFNldChcbiAgICAgICAgICAgICAgICB1bmlvbihbLi4uc3RhdGUuc2VsZWN0aW9uLmluY2x1ZGVkXSwgWy4uLm5ld1NlbGVjdGlvbl0pLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge1xuICAgICAgICAgICAgICBtb2RlOiAnZXhjbHVkZScsXG4gICAgICAgICAgICAgIGV4Y2x1ZGVkOiBuZXcgU2V0KFxuICAgICAgICAgICAgICAgIGRpZmZlcmVuY2UoWy4uLnN0YXRlLnNlbGVjdGlvbi5leGNsdWRlZF0sIFsuLi5uZXdTZWxlY3Rpb25dKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogbnVsbCxcbiAgICAgICAgLi4uKHN0YXRlLnNlbGVjdGlvbi5tb2RlID09PSAnaW5jbHVkZSdcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgICBpbmNsdWRlZDogbmV3IFNldChcbiAgICAgICAgICAgICAgICBkaWZmZXJlbmNlKFsuLi5zdGF0ZS5zZWxlY3Rpb24uaW5jbHVkZWRdLCBbaWRdKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgbW9kZTogJ2V4Y2x1ZGUnLFxuICAgICAgICAgICAgICBleGNsdWRlZDogbmV3IFNldCh1bmlvbihbLi4uc3RhdGUuc2VsZWN0aW9uLmV4Y2x1ZGVkXSwgW2lkXSkpLFxuICAgICAgICAgICAgfSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gdG9nZ2xlR3JvdXBTZWxlY3RlZDxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oXG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gIGdyb3VwOiBSaXZUYWJsZS5Sb3dHcm91cDxSLCBHPixcbik6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gIGNvbnN0IGlzR3JvdXBGdWxseVNlbGVjdGVkID1cbiAgICBpc0dyb3VwU2VsZWN0ZWQoc3RhdGUsIHsgLi4uZ3JvdXAsIGN1cnJlbnRQYWdlRGF0YTogZ3JvdXAucm93cyB9KSA9PT0gdHJ1ZTtcbiAgcmV0dXJuIGdyb3VwLnJvd3MucmVkdWNlKChhY2N1bXVsYXRlZFN0YXRlLCByb3cpID0+IHtcbiAgICByZXR1cm4gc2V0Um93U2VsZWN0ZWQoXG4gICAgICBhY2N1bXVsYXRlZFN0YXRlLFxuICAgICAgcm93LmlkLFxuICAgICAgIWlzR3JvdXBGdWxseVNlbGVjdGVkLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfSwgc3RhdGUpO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVQYWdlU2VsZWN0ZWQ8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4pOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICBjb25zdCBpc1BhZ2VGdWxseVNlbGVjdGVkID0gZ2V0QWxsUm93c0Zyb21SZXN1bHQoc3RhdGUucmVzdWx0KS5ldmVyeShcbiAgICAoeyBpZCB9KSA9PiBpc1Jvd1NlbGVjdGVkKHN0YXRlLCBpZCksXG4gICk7XG4gIHJldHVybiBnZXRBbGxSb3dzRnJvbVJlc3VsdChzdGF0ZS5yZXN1bHQpLnJlZHVjZSgoYWNjdW11bGF0ZWRTdGF0ZSwgcm93KSA9PiB7XG4gICAgcmV0dXJuIHNldFJvd1NlbGVjdGVkKFxuICAgICAgYWNjdW11bGF0ZWRTdGF0ZSxcbiAgICAgIHJvdy5pZCxcbiAgICAgICFpc1BhZ2VGdWxseVNlbGVjdGVkLFxuICAgICAgZmFsc2UsXG4gICAgKTtcbiAgfSwgc3RhdGUpO1xufVxuXG5mdW5jdGlvbiB0b2dnbGVBbGxTZWxlY3RlZDxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPik6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gIGlmIChpc0FsbFNlbGVjdGVkKHN0YXRlKSA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogbnVsbCxcbiAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICBpbmNsdWRlZDogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogbnVsbCxcbiAgICAgICAgbW9kZTogJ2V4Y2x1ZGUnLFxuICAgICAgICBleGNsdWRlZDogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+KTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzZWxlY3Rpb246IHtcbiAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiB0b2dnbGVDb2x1bW5PcmRlcjxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oXG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4sXG4gIGNvbHVtbjogQyxcbik6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gIGlmIChzdGF0ZS5xdWVyeS5vcmRlcj8uY29sdW1uID09PSBjb2x1bW4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBxdWVyeToge1xuICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgb3JkZXI6XG4gICAgICAgICAgc3RhdGUucXVlcnkub3JkZXIuZGlyZWN0aW9uID09PSAnYXNjJ1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgY29sdW1uLFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogJ2Rlc2MnLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IG51bGwsXG4gICAgICB9LFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBxdWVyeToge1xuICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICBvcmRlcjoge1xuICAgICAgICBjb2x1bW4sXG4gICAgICAgIGRpcmVjdGlvbjogJ2FzYycsXG4gICAgICB9LFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFNlYXJjaENvbHVtbnNTZWxlY3RlZFN0YXRlPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgZXhwZWN0ZWRWYWx1ZTogJ2FsbCcgfCAnbm9uZScsXG4pOiBib29sZWFuIHtcbiAgc3dpdGNoIChleHBlY3RlZFZhbHVlKSB7XG4gICAgY2FzZSAnYWxsJzpcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHN0YXRlLnF1ZXJ5LnNlYXJjaENvbHVtbnMudmFsdWVzKCkpLmV2ZXJ5KFxuICAgICAgICB2YWx1ZSA9PiB2YWx1ZSxcbiAgICAgICk7XG5cbiAgICBjYXNlICdub25lJzpcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKHN0YXRlLnF1ZXJ5LnNlYXJjaENvbHVtbnMudmFsdWVzKCkpLmV2ZXJ5KFxuICAgICAgICB2YWx1ZSA9PiAhdmFsdWUsXG4gICAgICApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRvZ2dsZUFsbFNlYXJjaENvbHVtbnM8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4pOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz4ge1xuICBjb25zdCBub25lU2VsZWN0ZWQgPSBnZXRTZWFyY2hDb2x1bW5zU2VsZWN0ZWRTdGF0ZShzdGF0ZSwgJ25vbmUnKTtcbiAgY29uc3QgcGF5bG9hZCA9IG5ldyBNYXAoXG4gICAgQXJyYXkuZnJvbShzdGF0ZS5xdWVyeS5zZWFyY2hDb2x1bW5zLmtleXMoKSkubWFwKGtleSA9PiBbXG4gICAgICBrZXksXG4gICAgICBub25lU2VsZWN0ZWQsXG4gICAgXSksXG4gICk7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgcXVlcnk6IHtcbiAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgc2VhcmNoQ29sdW1uczogcGF5bG9hZCxcbiAgICB9LFxuICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiogcmVkdWNlPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgYWN0aW9uOiBSaXZUYWJsZS5BY3Rpb248UiwgQywgRiwgRz4sXG4gIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gIHNvdXJjZTogUml2VGFibGUuU291cmNlPFIsIEMsIEYsIEc+LFxuICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICBkZWZhdWx0Q29sdW1uU3RhdGU6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10sXG4pOiBBc3luY0dlbmVyYXRvcjx7XG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz47XG4gIGVmZmVjdDogUml2VGFibGUuRWZmZWN0IHwgbnVsbDtcbn0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ2xvYWQnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKHN0YXRlLCBzb3VyY2UsIGFjdGlvbik7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcmRlckNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBvcmRlcjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcmRlckNvbHVtblRvZ2dsZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHRvZ2dsZUNvbHVtbk9yZGVyKHN0YXRlLCBhY3Rpb24uY29sdW1uKSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VhcmNoQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHNlYXJjaDogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogbnVsbCxcbiAgICAgICAgICAgIG1vZGU6ICdpbmNsdWRlJyxcbiAgICAgICAgICAgIGluY2x1ZGVkOiBuZXcgU2V0KCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VhcmNoQ29sdW1uc0NoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBzZWFyY2hDb2x1bW5zOiBuZXcgTWFwKFtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkuc2VhcmNoQ29sdW1ucyxcbiAgICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwYWdpbmF0aW9uQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dyb3VwaW5nQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIGdyb3VwaW5nOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwcmV2aW91c1BhZ2VOYXZpZ2F0ZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IGdldFByZXZpb3VzUGFnZShzdGF0ZSkgPz8gMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnbmV4dFBhZ2VOYXZpZ2F0ZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IGdldE5leHRQYWdlKHN0YXRlKSA/PyBnZXRQYWdlQ291bnQoc3RhdGUpIC0gMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncGFnZUNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IGFjdGlvbi5wYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwYWdlU2l6ZUNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2VTaXplOiBhY3Rpb24uc2l6ZSxcbiAgICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmlsdGVyc0NoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBmaWx0ZXJzOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdmaWx0ZXJBZGQnOlxuICAgICAgLy8gUGFyZW50IGNvbXBvbmVudCBpcyByZXNwb25zaWJsZSBmb3Igc3Vic2NyaWJpbmcgYW5kIGFkZGluZyB0aGUgZmlsdGVyXG4gICAgICB5aWVsZCB7IHN0YXRlOiB7IC4uLnN0YXRlIH0sIGVmZmVjdDogbnVsbCB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY29sdW1uU2V0dGluZ3NDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIGRpc3BsYXk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLmRpc3BsYXksXG4gICAgICAgICAgICBjb2x1bW5TZXR0aW5nczogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gZG8gbm90IG91dHB1dCBjaGFuZ2VzIHdoZW4gdHJpZ2dlcmVkIGZyb20gdGhlIG91dHNpZGUgd29ybGRcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtblBpbkNoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBjaGFuZ2VDb2x1bW5QaW4oXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGFjdGlvbi5jb2x1bW4sXG4gICAgICAgICAgYWN0aW9uLnBpbm5lZCxcbiAgICAgICAgKSxcbiAgICAgICAgZWZmZWN0OiAnc2F2ZUNvbHVtblByZWZlcmVuY2VzJyxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb2x1bW5zRnJlZXplVXBUb0NoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBjaGFuZ2VDb2x1bW5zRnJlZXplU3RhdGUoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGFjdGlvbi5pbmRleCxcbiAgICAgICAgICBhY3Rpb24uZnJlZXplLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbk9yZGVyQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IGNoYW5nZUNvbHVtbk9yZGVyKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBhY3Rpb24ucHJldmlvdXNJbmRleCxcbiAgICAgICAgICBhY3Rpb24ubmV3SW5kZXgsXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdDogJ3NhdmVDb2x1bW5QcmVmZXJlbmNlcycsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY29sdW1uTW92ZVRvQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IG1vdmVDb2x1bW5UbyhcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgYWN0aW9uLmNvbHVtbixcbiAgICAgICAgICBhY3Rpb24ucG9zaXRpb24sXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdDogJ3NhdmVDb2x1bW5QcmVmZXJlbmNlcycsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnY29sdW1uRW5hYmxlZENoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBjaGFuZ2VDb2x1bW5FbmFibGVkKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBhY3Rpb24uY29sdW1uLFxuICAgICAgICAgIGFjdGlvbi5lbmFibGVkLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuYWJsZUFsbENvbHVtbnNDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogZW5hYmxlQWxsQ29sdW1ucyhzdGF0ZSwgY29sdW1ucywgY29sdW1uTmFtZU1hcCwgYWN0aW9uLmVuYWJsZWQpLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbldpZHRoQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IGNoYW5nZUNvbHVtbldpZHRoKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBhY3Rpb24uY29sdW1uLFxuICAgICAgICAgIGFjdGlvbi5wcmVmZXJyZWRXaWR0aCxcbiAgICAgICAgKSxcbiAgICAgICAgZWZmZWN0OiAnc2F2ZUNvbHVtblByZWZlcmVuY2VzJyxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyZXNldFRvRGVmYXVsdENvbHVtbnMnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogcmVzZXRUb0RlZmF1bHRDb2x1bW5zKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBkZWZhdWx0Q29sdW1uU3RhdGUsXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdDogJ3NhdmVDb2x1bW5QcmVmZXJlbmNlcycsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsZWN0aW9uQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBzZWxlY3Rpb246IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICB9LFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncm93U2VsZWN0ZWRDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogc2V0Um93U2VsZWN0ZWQoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgYWN0aW9uLmlkLFxuICAgICAgICAgIGFjdGlvbi5zZWxlY3RlZCxcbiAgICAgICAgICBhY3Rpb24uY29udGlndW91cyxcbiAgICAgICAgKSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3BhZ2VTZWxlY3RlZENoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiB0b2dnbGVQYWdlU2VsZWN0ZWQoc3RhdGUpLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYWxsU2VsZWN0ZWRDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogdG9nZ2xlQWxsU2VsZWN0ZWQoc3RhdGUpLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VsZWN0aW9uQ2xlYXInOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogY2xlYXJTZWxlY3Rpb24oc3RhdGUpLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ3JvdXBTZWxlY3Rpb25DaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogdG9nZ2xlR3JvdXBTZWxlY3RlZChzdGF0ZSwgYWN0aW9uLnBheWxvYWQpLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ3JvdXBzUGVyUGFnZUNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBncm91cGluZzoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5ncm91cGluZyxcbiAgICAgICAgICAgICAgZ3JvdXBzUGVyUGFnZTogYWN0aW9uLmdyb3Vwc1BlclBhZ2UsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvdW50UGVyR3JvdXBDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgZ3JvdXBpbmc6IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkuZ3JvdXBpbmcsXG4gICAgICAgICAgICAgIGNvdW50UGVyR3JvdXA6IGFjdGlvbi5jb3VudFBlckdyb3VwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd2aWV3TW9yZUtleUNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBncm91cGluZzoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5ncm91cGluZyxcbiAgICAgICAgICAgICAgdmlld01vcmVLZXk6IGFjdGlvbi52aWV3TW9yZUtleSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndG9nZ2xlQWxsU2VhcmNoQ29sdW1ucyc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgodG9nZ2xlQWxsU2VhcmNoQ29sdW1ucyhzdGF0ZSksIHNvdXJjZSwgYWN0aW9uKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzR3JvdXBSZXN1bHQ8UiBleHRlbmRzIFJpdlRhYmxlLlJvdywgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwPihcbiAgcmVzdWx0OiBSaXZUYWJsZS5SZXN1bHQ8Uj4gfCBSaXZUYWJsZS5Hcm91cFJlc3VsdDxSLCBHPixcbik6IHJlc3VsdCBpcyBSaXZUYWJsZS5Hcm91cFJlc3VsdDxSLCBHPiB7XG4gIGlmICgndG90YWxHcm91cENvdW50JyBpbiByZXN1bHQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGdldEFsbFJvd3NGcm9tUmVzdWx0PFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cD4oXG4gIHJlc3VsdDogUml2VGFibGUuUmVzdWx0PFI+IHwgUml2VGFibGUuR3JvdXBSZXN1bHQ8UiwgRz4sXG4pOiBSW10ge1xuICBpZiAoaXNHcm91cFJlc3VsdChyZXN1bHQpKSB7XG4gICAgcmV0dXJuIHJlc3VsdC5ncm91cFJlc3VsdHMuZmxhdE1hcChncm91cHMgPT4gZ3JvdXBzLmN1cnJlbnRQYWdlRGF0YSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHJlc3VsdC5jdXJyZW50UGFnZURhdGE7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNQYWdlT3V0T2ZCb3VuZHM8XG4gIFIgZXh0ZW5kcyBSaXZUYWJsZS5Sb3csXG4gIEMgZXh0ZW5kcyBSaXZUYWJsZS5Db2x1bW4sXG4gIEYgZXh0ZW5kcyBSaXZUYWJsZS5GaWx0ZXJzLFxuICBHIGV4dGVuZHMgUml2VGFibGUuR3JvdXAsXG4+KFxuICBzdGF0ZTogUml2VGFibGUuQ29yZVN0YXRlPFIsIEMsIEYsIEc+LFxuICByZXN1bHQ6IFJpdlRhYmxlLlJlc3VsdDxSPiB8IFJpdlRhYmxlLkdyb3VwUmVzdWx0PFIsIEc+LFxuKTogYm9vbGVhbiB7XG4gIGlmIChpc0dyb3VwUmVzdWx0KHJlc3VsdCkpIHtcbiAgICBjb25zdCBtaW5Hcm91cFZhbFRvU2hvd09uQ3VycmVudFBhZ2UgPVxuICAgICAgc3RhdGUucXVlcnkucGFnaW5hdGlvbi5wYWdlICogc3RhdGUucXVlcnkuZ3JvdXBpbmcuZ3JvdXBzUGVyUGFnZSArIDE7XG4gICAgaWYgKHJlc3VsdC50b3RhbEdyb3VwQ291bnQgPCBtaW5Hcm91cFZhbFRvU2hvd09uQ3VycmVudFBhZ2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBtaW5Sb3dUb1Nob3dPbkN1cnJlbnRQYWdlID1cbiAgICAgIHN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZSAqIHN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24ucGFnZVNpemUgKyAxO1xuICAgIGlmIChyZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50IDwgbWluUm93VG9TaG93T25DdXJyZW50UGFnZSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cbiJdfQ==
807
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yaXYvc3JjL2xpYi90YWJsZS90YWJsZS9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLElBQXNCLE1BQU0sU0FBUyxDQUFDO0FBQzdDLE9BQU8sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQy9DLE9BQU8sRUFFTCxXQUFXLEVBQ1gsTUFBTSxFQUNOLElBQUksRUFDSixHQUFHLEVBQ0gsU0FBUyxFQUVULGFBQWEsRUFDYixJQUFJLEVBQ0osS0FBSyxFQUNMLE9BQU8sR0FDUixNQUFNLE1BQU0sQ0FBQztBQUVkLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUN2RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN0RSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUNsRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUxRSxNQUFNLEtBQVcsUUFBUSxDQXFxQ3hCO0FBcnFDRCxXQUFpQixRQUFRO0lBMENWLGtCQUFTLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQVUsQ0FBQztJQW9UckQsbURBQW1EO0lBQ3RDLHdCQUFlLEdBQVcsRUFBRSxDQUFDO0lBQzdCLHdCQUFlLEdBQUc7UUFDN0IsVUFBVTtRQUNWLFVBQVU7UUFD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QUFDLFFBQVE7d0JBQ3ZCLGFBQWEsRUFBRSxNQUFNLENBQUMsYUFBYTtxQkFDcEM7aUJBQ0Y7YUFDRixFQUNELE1BQU0sRUFDTixNQUFNLENBQ1AsQ0FBQztZQUNGLE1BQU07UUFDUixLQUFLLG1CQUFtQjtZQUN0QixLQUFLLENBQUMsQ0FBQyxpQkFBaUIsQ0FDdEI7Z0JBQ0UsR0FBRyxLQUFLO2dCQUNSLEtBQUssRUFBRTtvQkFDTCxHQUFHLEtBQUssQ0FBQyxLQUFLO29CQUNkLFFBQVEsRUFBRTt3QkFDUixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsUUFBUTt3QkFDdkIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxXQUFXO3FCQUNoQztpQkFDRjthQUNGLEVBQ0QsTUFBTSxFQUNOLE1BQU0sQ0FDUCxDQUFDO1lBQ0YsTUFBTTtRQUNSLEtBQUssd0JBQXdCO1lBQzNCLEtBQUssQ0FBQyxDQUFDLGlCQUFpQixDQUN0QixrQkFBa0IsQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsRUFDaEQsTUFBTSxFQUNOLE1BQU0sQ0FDUCxDQUFDO1lBQ0YsTUFBTTtLQUNUO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUGFyYW1zLCBRdWVyeVBhcmFtc0hhbmRsaW5nIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCBGdXNlLCB7IElGdXNlT3B0aW9ucyB9IGZyb20gJ2Z1c2UuanMnO1xuaW1wb3J0IHsgZGVmYXVsdHNEZWVwLCBpc0VxdWFsIH0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7XG4gIENvbm5lY3RhYmxlLFxuICBjb25uZWN0YWJsZSxcbiAgZmlsdGVyLFxuICBmcm9tLFxuICBtYXAsXG4gIG1lcmdlU2NhbixcbiAgT2JzZXJ2YWJsZSxcbiAgUmVwbGF5U3ViamVjdCxcbiAgc2NhbixcbiAgc2hhcmUsXG4gIFN1YmplY3QsXG59IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgRGVlcFBhcnRpYWwgfSBmcm9tICd1dGlsaXR5LXR5cGVzJztcbmltcG9ydCB7IHRvU2VudGVuY2VDYXNlIH0gZnJvbSAnLi4vLi4vZm9ybWF0L3BpcGVzL3NlbnRlbmNlLWNhc2UucGlwZSc7XG5pbXBvcnQgeyBUYWJsZUNvbHVtbkhlbHBlcnMgfSBmcm9tICcuL3N0YXRlLWhlbHBlcnMvY29sdW1uLWhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVEaXNwbGF5SGVscGVycyB9IGZyb20gJy4vc3RhdGUtaGVscGVycy9kaXNwbGF5LWhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVPcmRlckhlbHBlcnMgfSBmcm9tICcuL3N0YXRlLWhlbHBlcnMvb3JkZXItaGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZVBhZ2luYXRpb25IZWxwZXJzIH0gZnJvbSAnLi9zdGF0ZS1oZWxwZXJzL3BhZ2luYXRpb24taGVscGVycyc7XG5pbXBvcnQgeyBUYWJsZVJlc3VsdEhlbHBlcnMgfSBmcm9tICcuL3N0YXRlLWhlbHBlcnMvcmVzdWx0LWhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVTZWFyY2hIZWxwZXJzIH0gZnJvbSAnLi9zdGF0ZS1oZWxwZXJzL3NlYXJjaC1oZWxwZXJzJztcbmltcG9ydCB7IFRhYmxlU2VsZWN0aW9uSGVscGVycyB9IGZyb20gJy4vc3RhdGUtaGVscGVycy9zZWxlY3Rpb24taGVscGVycyc7XG5cbmV4cG9ydCBuYW1lc3BhY2UgUml2VGFibGUge1xuICBleHBvcnQgdHlwZSBSb3cgPSB7IGlkOiBzdHJpbmcgfCBudW1iZXIgfTtcbiAgZXhwb3J0IHR5cGUgQ29sdW1uID0gc3RyaW5nO1xuICBleHBvcnQgdHlwZSBGaWx0ZXJzID0gYW55O1xuICBleHBvcnQgdHlwZSBHcm91cCA9IHsga2V5OiBzdHJpbmcgfCBudW1iZXIgfTtcblxuICAvKipcbiAgICogUml2VGFibGUncyBzdGF0ZSBhbmQgdXNlciBhY3Rpb25zIGFyZSBkaXZpZGVkIGludG8gdGhlIGZvbGxvd2luZyBjaHVua3M6XG4gICAqXG4gICAqIC0gUXVlcnkgKGZvciB0aGluZ3MgbGlrZSBmaWx0ZXJzLCBwYWdpbmF0aW9uLCBzZWFyY2gsIGV0Yy4pXG4gICAqIC0gTG9hZGluZyAoZm9yIHdoZXRoZXIgb3Igbm90IHRoZSB0YWJsZSBpcyBsb2FkaW5nIHJvdyBkYXRhKVxuICAgKiAtIFJlc3VsdCAoZm9yIHRoZSByb3cgZGF0YSBpdHNlbGYpXG4gICAqIC0gRGlzcGxheSAoZm9yIHRoaW5ncyBsaWtlIGNvbHVtbiBjb25maWd1cmF0aW9uKVxuICAgKiAtIFNlbGVjdGlvbiAoZm9yIHRyYWNraW5nIHRoZSB1c2VyJ3Mgcm93IHNlbGVjdGlvbnMpXG4gICAqXG4gICAqIE5vdGUgdGhhdCB0aGUgZGF0YSBmbG93IGlzIHVuaWRpcmVjdGlvbmFsOiB0aGUgVUkgaXNzdWVzIGFjdGlvbnMsIHdoaWNoXG4gICAqIGFmZmVjdCB0aGUgc3RhdGUsIGFuZCB0aGUgc3RhdGUgZ2V0cyBwYXNzZWQgYmFjayB0byB0aGUgVUkgZm9yIGRpc3BsYXkuXG4gICAqXG4gICAqIOKUjOKUgOKUgOKUgOKUgOKUgOKUgOKUkFxuICAgKiDilIIgIFVJICDil4TilIDilIDilIDilIDilIDilIDilIDilIDilJBcbiAgICog4pSU4pSA4pSA4pSs4pSA4pSA4pSA4pSYICAgICAgICDilIJcbiAgICogICAg4pSCICAgICAgICAgICAg4pSCXG4gICAqIOKUjOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUkCAgIOKUglxuICAgKiDilIIgIEFjdGlvbnMgIOKUgiAgIOKUglxuICAgKiDilJTilIDilIDilKzilIDilIDilIDilIDilIDilIDilIDilIDilJggICDilIJcbiAgICogICAg4pSCICAgICAgICAgICAg4pSCXG4gICAqIOKUjOKUgOKUgOKWvOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUtOKUgOKUkFxuICAgKiDilIIgIFN0YXRlIHJlZHVjZXIgIOKUglxuICAgKiDilJTilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilJhcbiAgICpcbiAgICogRnJvbSB0aGUgY29yZSBzdGF0ZSwgY2FsY3VsYXRlZCBzdGF0ZSBpcyBkZXJpdmVkIGFuZCBhZGRlZCB0byB0aGUgY29yZVxuICAgKiBzdGF0ZSAoZS5nLiwgZnJvbSB0aGUgcmF3IHNlbGVjdGlvbiBzdGF0ZSB3ZSBjYW4gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90XG4gICAqIGFsbCB0aGUgcm93cyBvbiB0aGUgY3VycmVudGx5IGRpc3BsYXllZCBwYWdlIGFyZSBzZWxlY3RlZCwgZXRjLikuXG4gICAqL1xuXG4gIC8vLy8vLy8vLy8vXG4gIC8vIFF1ZXJ5IC8vXG4gIC8vLy8vLy8vLy8vXG5cbiAgLy8gUXVlcnkgc3RhdGUgLy9cblxuICBleHBvcnQgdHlwZSBPcmRlckRpcmVjdGlvbiA9ICdhc2MnIHwgJ2Rlc2MnO1xuICBleHBvcnQgY29uc3QgcGFnZVNpemVzID0gWzI1LCA1MCwgMTAwLCAyNTBdIGFzIGNvbnN0O1xuICBleHBvcnQgdHlwZSBRdWVyeTxDIGV4dGVuZHMgQ29sdW1uLCBGIGV4dGVuZHMgRmlsdGVycz4gPSB7XG4gICAgb3JkZXI6IHtcbiAgICAgIGRpcmVjdGlvbjogT3JkZXJEaXJlY3Rpb247XG4gICAgICBjb2x1bW46IEM7XG4gICAgfSB8IG51bGw7XG4gICAgc2VhcmNoOiBzdHJpbmc7XG4gICAgc2VhcmNoQ29sdW1uczogTWFwPEMsIGJvb2xlYW4+O1xuICAgIGZpbHRlcnM6IEYgfCBudWxsO1xuICAgIHBhZ2luYXRpb246IHtcbiAgICAgIHBhZ2U6IG51bWJlcjtcbiAgICAgIHBhZ2VTaXplOiBudW1iZXI7XG4gICAgfTtcbiAgICBncm91cGluZzoge1xuICAgICAgdmlld01vcmVLZXk6IHN0cmluZyB8IG51bGw7XG4gICAgICBncm91cHNQZXJQYWdlOiBudW1iZXI7XG4gICAgICBjb3VudFBlckdyb3VwOiBudW1iZXI7XG4gICAgfTtcbiAgfTtcblxuICAvLyBRdWVyeSBhY3Rpb25zIC8vXG5cbiAgZXhwb3J0IHR5cGUgUXVlcnlBY3Rpb248QyBleHRlbmRzIENvbHVtbiwgRiBleHRlbmRzIEZpbHRlcnM+ID1cbiAgICB8IHsgdHlwZTogJ2xvYWQnIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ29yZGVyQ2hhbmdlJztcbiAgICAgICAgcGF5bG9hZDogUXVlcnk8QywgRj5bJ29yZGVyJ107XG4gICAgICAgIHNvdXJjZT86ICdoZWFkZXJNZW51JztcbiAgICAgIH1cbiAgICB8IHsgdHlwZTogJ29yZGVyQ29sdW1uVG9nZ2xlJzsgY29sdW1uOiBDIH1cbiAgICB8IHsgdHlwZTogJ3NlYXJjaENoYW5nZSc7IHBheWxvYWQ6IFF1ZXJ5PEMsIEY+WydzZWFyY2gnXSB9XG4gICAgfCB7IHR5cGU6ICdzZWFyY2hDb2x1bW5zQ2hhbmdlJzsgcGF5bG9hZDogUXVlcnk8QywgRj5bJ3NlYXJjaENvbHVtbnMnXSB9XG4gICAgfCB7IHR5cGU6ICdmaWx0ZXJzQ2hhbmdlJzsgcGF5bG9hZDogUXVlcnk8QywgRj5bJ2ZpbHRlcnMnXSB9XG4gICAgfCB7IHR5cGU6ICdmaWx0ZXJBZGQnOyBjb2x1bW5LZXk6IHN0cmluZyB9XG4gICAgfCB7IHR5cGU6ICdwYWdpbmF0aW9uQ2hhbmdlJzsgcGF5bG9hZDogUXVlcnk8QywgRj5bJ3BhZ2luYXRpb24nXSB9XG4gICAgfCB7IHR5cGU6ICdncm91cGluZ0NoYW5nZSc7IHBheWxvYWQ6IFF1ZXJ5PEMsIEY+Wydncm91cGluZyddIH1cbiAgICB8IHsgdHlwZTogJ25leHRQYWdlTmF2aWdhdGUnIH1cbiAgICB8IHsgdHlwZTogJ3ByZXZpb3VzUGFnZU5hdmlnYXRlJyB9XG4gICAgfCB7IHR5cGU6ICdwYWdlQ2hhbmdlJzsgcGFnZTogbnVtYmVyIH1cbiAgICB8IHsgdHlwZTogJ3BhZ2VTaXplQ2hhbmdlJzsgc2l6ZTogbnVtYmVyIH1cbiAgICB8IHsgdHlwZTogJ2dyb3Vwc1BlclBhZ2VDaGFuZ2UnOyBncm91cHNQZXJQYWdlOiBudW1iZXIgfVxuICAgIHwgeyB0eXBlOiAnY291bnRQZXJHcm91cENoYW5nZSc7IGNvdW50UGVyR3JvdXA6IG51bWJlciB9XG4gICAgfCB7IHR5cGU6ICd2aWV3TW9yZUtleUNoYW5nZSc7IHZpZXdNb3JlS2V5OiBzdHJpbmcgfVxuICAgIHwgeyB0eXBlOiAndG9nZ2xlQWxsU2VhcmNoQ29sdW1ucycgfTtcblxuICAvLy8vLy8vLy8vXG4gIC8vIExvYWQgLy9cbiAgLy8vLy8vLy8vL1xuXG4gIGV4cG9ydCB0eXBlIExvYWQgPSB7XG4gICAgbG9hZGluZzogYm9vbGVhbjtcbiAgICBlcnJvcjogdW5rbm93biB8IG51bGw7XG4gIH07XG5cbiAgLy8vLy8vLy8vLy8vXG4gIC8vIFJlc3VsdCAvL1xuICAvLy8vLy8vLy8vLy9cblxuICBleHBvcnQgdHlwZSBSZXN1bHQ8UiBleHRlbmRzIFJvdz4gPSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgcm93IGRhdGEgZm9yIHRoZSBjdXJyZW50IHBhZ2UsIGFmdGVyIGZpbHRlcnMsIHNlYXJjaCBxdWVyeSwgYW5kXG4gICAgICogcm93IG9yZGVyaW5nIGFyZSBhcHBsaWVkLlxuICAgICAqL1xuICAgIGN1cnJlbnRQYWdlRGF0YTogUltdO1xuICAgIC8qKlxuICAgICAqIFRoZSB0b3RhbCBudW1iZXIgb2Ygcm93cyAocmVnYXJkbGVzcyBvZiBwYWdpbmF0aW9uKSB0aGF0IG1hdGNoIHRoZVxuICAgICAqIGZpbHRlcnMgYW5kIHNlYXJjaCBxdWVyeS5cbiAgICAgKi9cbiAgICB0b3RhbE1hdGNoaW5nUm93Q291bnQ6IG51bWJlcjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTdWJHcm91cFJlc3VsdDxSIGV4dGVuZHMgUm93LCBHIGV4dGVuZHMgR3JvdXA+ID0gUmVzdWx0PFI+ICYge1xuICAgIC8qKlxuICAgICAqIEFueSBvdGhlciByZWxldmFudCBncm91cCBkYXRhLCB1c2VkIGZvciB0aGUgc3ViaGVhZGVyXG4gICAgICovXG4gICAgZ3JvdXBEYXRhOiBHO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEdyb3VwUmVzdWx0PFIgZXh0ZW5kcyBSb3csIEcgZXh0ZW5kcyBHcm91cD4gPSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgcm93IGRhdGEgZm9yIHRoZSBjdXJyZW50IHBhZ2UsIGFmdGVyIGZpbHRlcnMsIHNlYXJjaCBxdWVyeSwgYW5kXG4gICAgICogcm93IG9yZGVyaW5nIGFyZSBhcHBsaWVkLCBzcGxpdCBpbnRvIGdyb3Vwc1xuICAgICAqL1xuICAgIGdyb3VwUmVzdWx0czogU3ViR3JvdXBSZXN1bHQ8UiwgRz5bXTtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGdyb3VwcyAocmVnYXJkbGVzcyBvZiBwYWdpbmF0aW9uKSB0aGF0IG1hdGNoIHRoZVxuICAgICAqIGZpbHRlcnMgYW5kIHNlYXJjaCBxdWVyeS5cbiAgICAgKi9cbiAgICB0b3RhbEdyb3VwQ291bnQ6IG51bWJlcjtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgKHJlZ2FyZGxlc3Mgb2YgcGFnaW5hdGlvbikgdGhhdCBtYXRjaCB0aGVcbiAgICAgKiBmaWx0ZXJzIGFuZCBzZWFyY2ggcXVlcnkuXG4gICAgICovXG4gICAgdG90YWxNYXRjaGluZ1Jvd0NvdW50OiBudW1iZXI7XG4gIH07XG5cbiAgLypcbiAgICBOZXN0ZWRSZXN1bHRcbiAgICAgIE5lc3RlZFJvdyAtIHdpdGggc3Vicm93c1xuICAgICAgICBOZXN0ZWRSb3cgLSB3aXRoIG5vIHN1YnJvd3NcbiAgKi9cbiAgZXhwb3J0IHR5cGUgTmVzdGVkUm93PFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIC8vIFRoZSByb3dzIHRoYXQgc2hvdWxkIGJlIGhpZGRlbiB3aGVuIHRoZSB0b2dnbGUgb24gdGhpcyByb3cgaXMgdG9nZ2xlZC5cbiAgICBzdWJSb3dzPzogTmVzdGVkUm93PFI+W107XG5cbiAgICAvLyBUaGUgcmVsZXZhbnQgZGF0YSB1c2VkIHRvIGRpc3BsYXkgdGhpcyByb3cuXG4gICAgZGF0YTogUjtcbiAgfTtcbiAgLypcbiAgICBOZXN0ZWQgcmVzdWx0cyBhcmUgZm9yIHRvZ2dsZWFibGUgcm93cyBjb250YWluaW5nIHN1YnJvd3MuXG4gICAgTmVzdGVkIHJlc3VsdHMgb25seSBzdXBwb3J0IGdvaW5nIG9uZSBsZXZlbCBkZWVwIGF0IHRoZSBtb21lbnQuXG4gICovXG4gIGV4cG9ydCB0eXBlIE5lc3RlZFJlc3VsdDxSIGV4dGVuZHMgUm93PiA9IHtcbiAgICAvKipcbiAgICAgKiBUaGUgZnVsbCByb3cgZGF0YSBmb3IgdGhlIGN1cnJlbnQgcGFnZSwgYWZ0ZXIgZmlsdGVycywgc2VhcmNoIHF1ZXJ5LCBhbmRcbiAgICAgKiByb3cgb3JkZXJpbmcgYXJlIGFwcGxpZWQsIG5lc3RlZCBpbnRvIFwicm93cyB3aXRoIHN1YnJvd3NcIlxuICAgICAqL1xuICAgIGN1cnJlbnRQYWdlTmVzdGVkUm93czogTmVzdGVkUm93PFI+W107XG4gICAgLyoqXG4gICAgICogVGhlIHRvdGFsIG51bWJlciBvZiByb3dzIChyZWdhcmRsZXNzIG9mIHBhZ2luYXRpb24pIHRoYXQgbWF0Y2ggdGhlXG4gICAgICogZmlsdGVycyBhbmQgc2VhcmNoIHF1ZXJ5LlxuICAgICAqXG4gICAgICogT25seSBjb3VudHMgcm93cyBhdCB0aGUgYm90dG9tIGxldmVsIG9mIG5lc3RpbmcuXG4gICAgICovXG4gICAgdG90YWxNYXRjaGluZ1Jvd0NvdW50OiBudW1iZXI7XG4gIH07XG5cbiAgLypcbiAgICBOZXN0ZWRXaXRoSGVhZGVyUmVzdWx0XG4gICAgICBOZXN0ZWRIZWFkZXJSb3dcbiAgICAgICAgTmVzdGVkUm93IC0gd2l0aCBzdWJyb3dzXG4gICAgICAgICAgTmVzdGVkUm93IC0gd2l0aCBubyBzdWJyb3dzXG4gICovXG4gIGV4cG9ydCB0eXBlIE5lc3RlZEhlYWRlclJvdzxSIGV4dGVuZHMgUm93PiA9IHtcbiAgICAvLyBUaGUgcm93cyB0aGF0IHNob3VsZCBiZSBoaWRkZW4gd2hlbiB0aGUgdG9nZ2xlIG9uIHRoaXMgaGVhZGVyIGlzIHRvZ2dsZWQuXG4gICAgc3ViUm93czogTmVzdGVkUm93PFI+W107XG5cbiAgICAvLyBUaGUgdGV4dCB0byBzaG93IG5leHQgdG8gdGhlIHRvZ2dsZWFibGUgY2hldnJvblxuICAgIGhlYWRlclRleHQ6IHN0cmluZztcbiAgfTtcbiAgLypcbiAgICBOZXN0ZWQgaGVhZGVyIHJvd3MgYXJlIHRvZ2dsZWFibGUgaGVhZGVycyBmb3IgZ3JvdXBzIG9mIHJvd3MuXG4gICovXG4gIGV4cG9ydCB0eXBlIE5lc3RlZFdpdGhIZWFkZXJSZXN1bHQ8UiBleHRlbmRzIFJvdz4gPSB7XG4gICAgLyoqXG4gICAgICogVGhlIGZ1bGwgcm93IGRhdGEgZm9yIHRoZSBjdXJyZW50IHBhZ2UsIGFmdGVyIGZpbHRlcnMsIHNlYXJjaCBxdWVyeSwgYW5kXG4gICAgICogcm93IG9yZGVyaW5nIGFyZSBhcHBsaWVkLCBuZXN0ZWQgaW50byBcImhlYWRlcnMgd2l0aCBzdWJyb3dzXCIuXG4gICAgICovXG4gICAgY3VycmVudFBhZ2VOZXN0ZWRIZWFkZXJzOiBOZXN0ZWRIZWFkZXJSb3c8Uj5bXTtcbiAgICAvKipcbiAgICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIHJvd3MgKHJlZ2FyZGxlc3Mgb2YgcGFnaW5hdGlvbikgdGhhdCBtYXRjaCB0aGVcbiAgICAgKiBmaWx0ZXJzIGFuZCBzZWFyY2ggcXVlcnkuXG4gICAgICpcbiAgICAgKiBPbmx5IGNvdW50cyByb3dzIGF0IHRoZSBib3R0b20gbGV2ZWwgb2YgbmVzdGluZy5cbiAgICAgKi9cbiAgICB0b3RhbE1hdGNoaW5nUm93Q291bnQ6IG51bWJlcjtcbiAgfTtcblxuICBleHBvcnQgdHlwZSBTb3VyY2U8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0gKFxuICAgIHF1ZXJ5OiBRdWVyeTxDLCBGPixcbiAgICBtb3N0UmVjZW50QWN0aW9uOiBBY3Rpb248UiwgQywgRiwgRz4sXG4gICkgPT4gUHJvbWlzZTxSZXN1bHQ8Uj4gfCBHcm91cFJlc3VsdDxSLCBHPj47XG5cbiAgLy8vLy8vLy8vLy8vL1xuICAvLyBEaXNwbGF5IC8vXG4gIC8vLy8vLy8vLy8vLy9cblxuICAvLyBEaXNwbGF5IHN0YXRlIC8vXG5cbiAgZXhwb3J0IHR5cGUgQ29sdW1uU2V0dGluZ3M8QyBleHRlbmRzIENvbHVtbj4gPSB7XG4gICAga2V5OiBDO1xuICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgcHJlZmVycmVkV2lkdGg6IG51bWJlciB8ICdhdXRvJztcbiAgICBwaW5uZWQ6IGJvb2xlYW47XG4gIH07XG4gIGV4cG9ydCB0eXBlIERpc3BsYXk8QyBleHRlbmRzIENvbHVtbj4gPSB7XG4gICAgY29sdW1uU2V0dGluZ3M6IENvbHVtblNldHRpbmdzPEM+W107XG4gICAgY2VsbFJvd1NwYW46IChyb3dJbmRleDogbnVtYmVyLCBjb2x1bW46IEMpID0+IG51bWJlcjtcbiAgfTtcblxuICAvLyBEaXNwbGF5IGFjdGlvbnMgLy9cblxuICBleHBvcnQgdHlwZSBEaXNwbGF5QWN0aW9uPEMgZXh0ZW5kcyBDb2x1bW4+ID1cbiAgICB8IHsgdHlwZTogJ2NvbHVtblNldHRpbmdzQ2hhbmdlJzsgcGF5bG9hZDogRGlzcGxheTxDPlsnY29sdW1uU2V0dGluZ3MnXSB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdjb2x1bW5QaW5DaGFuZ2UnO1xuICAgICAgICBjb2x1bW46IEM7XG4gICAgICAgIHBpbm5lZDogYm9vbGVhbjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbnNGcmVlemVVcFRvQ2hhbmdlJztcbiAgICAgICAgaW5kZXg6IG51bWJlcjtcbiAgICAgICAgZnJlZXplOiBib29sZWFuO1xuICAgICAgICBzb3VyY2U/OiAnaGVhZGVyTWVudScgfCAnb3B0aW9uc01lbnUnIHwgJ2ZyZWV6ZURpdmlkZXInO1xuICAgICAgICBjb2x1bW4/OiBDO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnY29sdW1uT3JkZXJDaGFuZ2UnO1xuICAgICAgICBwcmV2aW91c0luZGV4OiBudW1iZXI7XG4gICAgICAgIG5ld0luZGV4OiBudW1iZXI7XG4gICAgICAgIHNvdXJjZT86ICd0YWJsZURyYWcnIHwgJ21lbnVEcmFnJztcbiAgICAgICAgY29sdW1uPzogQztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbk1vdmVUb0NoYW5nZSc7XG4gICAgICAgIGNvbHVtbjogQztcbiAgICAgICAgcG9zaXRpb246ICdzdGFydCcgfCAnZW5kJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2NvbHVtbkVuYWJsZWRDaGFuZ2UnO1xuICAgICAgICBjb2x1bW46IEM7XG4gICAgICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgICAgIHNvdXJjZT86ICdoZWFkZXJNZW51JyB8ICdvcHRpb25zTWVudScgfCAnZHJhZ0Ryb3AnIHwgJ2V5ZUljb24nO1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICB0eXBlOiAnZW5hYmxlQWxsQ29sdW1uc0NoYW5nZSc7XG4gICAgICAgIGVuYWJsZWQ6IGJvb2xlYW47XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdjb2x1bW5XaWR0aENoYW5nZSc7XG4gICAgICAgIGNvbHVtbjogQztcbiAgICAgICAgcHJlZmVycmVkV2lkdGg6IG51bWJlciB8ICdhdXRvJztcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3Jlc2V0VG9EZWZhdWx0Q29sdW1ucyc7XG4gICAgICB9O1xuXG4gIC8vLy8vLy8vLy8vLy8vL1xuICAvLyBTZWxlY3Rpb24gLy9cbiAgLy8vLy8vLy8vLy8vLy8vXG5cbiAgLy8gU2VsZWN0aW9uIHN0YXRlIC8vXG5cbiAgZXhwb3J0IHR5cGUgU2VsZWN0aW9uPFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBSWydpZCddIHwgbnVsbDtcbiAgfSAmIChcbiAgICB8IHtcbiAgICAgICAgbW9kZTogJ2luY2x1ZGUnO1xuICAgICAgICBpbmNsdWRlZDogU2V0PFJbJ2lkJ10+O1xuICAgICAgfVxuICAgIHwge1xuICAgICAgICBtb2RlOiAnZXhjbHVkZSc7XG4gICAgICAgIGV4Y2x1ZGVkOiBTZXQ8UlsnaWQnXT47XG4gICAgICB9XG4gICk7XG5cbiAgLy8gU2VsZWN0aW9uIGFjdGlvbnMgLy9cblxuICBleHBvcnQgdHlwZSBTZWxlY3Rpb25BY3Rpb248UiBleHRlbmRzIFJvdywgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0+ID1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3NlbGVjdGlvbkNoYW5nZSc7XG4gICAgICAgIHBheWxvYWQ6IFNlbGVjdGlvbjxSPjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ2dyb3VwU2VsZWN0aW9uQ2hhbmdlJztcbiAgICAgICAgcGF5bG9hZDogUm93R3JvdXA8UiwgRz47XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdyb3dTZWxlY3RlZENoYW5nZSc7XG4gICAgICAgIGlkOiBSWydpZCddO1xuICAgICAgICBzZWxlY3RlZDogYm9vbGVhbjtcbiAgICAgICAgY29udGlndW91czogYm9vbGVhbjtcbiAgICAgIH1cbiAgICB8IHtcbiAgICAgICAgdHlwZTogJ3BhZ2VTZWxlY3RlZENoYW5nZSc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdhbGxTZWxlY3RlZENoYW5nZSc7XG4gICAgICB9XG4gICAgfCB7XG4gICAgICAgIHR5cGU6ICdzZWxlY3Rpb25DbGVhcic7XG4gICAgICB9O1xuXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG4gIC8vIFB1dHRpbmcgaXQgYWxsIHRvZ2V0aGVyIC8vXG4gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vXG5cbiAgLy8gQ29tYmluZWQgc3RhdGUgLy9cblxuICBleHBvcnQgdHlwZSBDb3JlU3RhdGU8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0ge1xuICAgIHF1ZXJ5OiBRdWVyeTxDLCBGPjtcbiAgICBsb2FkOiBMb2FkO1xuICAgIHJlc3VsdDogUmVzdWx0PFI+IHwgR3JvdXBSZXN1bHQ8UiwgRz47XG4gICAgZGlzcGxheTogRGlzcGxheTxDPjtcbiAgICBzZWxlY3Rpb246IFNlbGVjdGlvbjxSPjtcbiAgfTtcblxuICAvLyBDb21iaW5lZCBhY3Rpb25zIC8vXG5cbiAgZXhwb3J0IHR5cGUgQWN0aW9uPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPiA9IFF1ZXJ5QWN0aW9uPEMsIEY+IHwgRGlzcGxheUFjdGlvbjxDPiB8IFNlbGVjdGlvbkFjdGlvbjxSLCBHPjtcblxuICBleHBvcnQgdHlwZSBFZmZlY3QgPSAnc2F2ZUNvbHVtblByZWZlcmVuY2VzJztcblxuICAvLyBGdWxsIHN0YXRlIChjb3JlIHN0YXRlIHBsdXMgcHVyZSBkZXJpdmF0aW9ucykgLy9cbiAgZXhwb3J0IGNvbnN0IENvbHVtbnNNYXhTaG93bjogbnVtYmVyID0gNTA7XG4gIGV4cG9ydCBjb25zdCBDb2x1bW5EYXRhVHlwZXMgPSBbXG4gICAgJ2FkdmFuY2VkJyxcbiAgICAnY3VycmVuY3knLFxuICAgICdkYXRlJyxcbiAgICAnaWNvbicsXG4gICAgJ2xvbmdUZXh0JyxcbiAgICAnbnVtYmVyJyxcbiAgICAnc2hvcnRUZXh0JyxcbiAgXSBhcyBjb25zdDtcbiAgZXhwb3J0IHR5cGUgQ29sdW1uRGF0YVR5cGUgPSAodHlwZW9mIENvbHVtbkRhdGFUeXBlcylbbnVtYmVyXTtcbiAgZXhwb3J0IHR5cGUgQ29sdW1uQWxpZ25tZW50ID0gJ2xlZnQnIHwgJ2NlbnRlcicgfCAncmlnaHQnO1xuICBleHBvcnQgdHlwZSBDb2x1bW5NZXRhZGF0YSA9IHtcbiAgICBvcmRlcmFibGU6IGJvb2xlYW47XG4gICAgZmlsdGVyYWJsZT86IGJvb2xlYW47XG4gICAgc2VhcmNoYWJsZT86IGJvb2xlYW47XG4gICAgbWluV2lkdGg6IG51bWJlcjtcbiAgICBkYXRhVHlwZTogQ29sdW1uRGF0YVR5cGU7XG4gICAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gICAgZGVmYXVsdFBpbm5lZD86IGJvb2xlYW47XG4gICAgY2xpY2tQcmV2ZW50RGVmYXVsdD86IGJvb2xlYW47XG4gICAgY2xpY2tTdG9wUHJvcGFnYXRpb24/OiBib29sZWFuO1xuICAgIGRpc3BsYXlOYW1lPzogc3RyaW5nO1xuICB9O1xuICBleHBvcnQgdHlwZSBFeHRlcm5hbFJvd0xpbmsgPSB7XG4gICAgdHlwZTogJ2V4dGVybmFsJztcbiAgICBocmVmOiBzdHJpbmc7XG4gIH07XG4gIGV4cG9ydCB0eXBlIEludGVybmFsUm93TGluayA9IHtcbiAgICB0eXBlOiAnaW50ZXJuYWwnO1xuICAgIHJvdXRlckxpbms6IHN0cmluZyB8IHN0cmluZ1tdO1xuICAgIHF1ZXJ5UGFyYW1zPzogUGFyYW1zO1xuICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc/OiBRdWVyeVBhcmFtc0hhbmRsaW5nO1xuICAgIGFjdGl2ZT86IGJvb2xlYW47XG4gIH07XG4gIGV4cG9ydCB0eXBlIFJvd0xpbmsgPSBFeHRlcm5hbFJvd0xpbmsgfCBJbnRlcm5hbFJvd0xpbms7XG4gIGV4cG9ydCB0eXBlIEZ1bGxSb3c8UiBleHRlbmRzIFJvdz4gPSBSICYge1xuICAgIHJvd0xpbms6IFJvd0xpbmsgfCBudWxsO1xuICAgIHNlbGVjdGVkOiBib29sZWFuO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIFJvd0dyb3VwPFIgZXh0ZW5kcyBSb3csIEcgZXh0ZW5kcyBHcm91cD4gPSB7XG4gICAgcm93czogRnVsbFJvdzxSPltdO1xuICAgIHNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogbnVtYmVyO1xuICAgIGdyb3VwRGF0YTogRztcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsTmVzdGVkUm93PFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgc3ViUm93cz86IEZ1bGxOZXN0ZWRSb3c8Uj5bXTtcbiAgICBkYXRhOiBSO1xuICAgIHJvd0xpbms6IFJvd0xpbmsgfCBudWxsO1xuICAgIHNlbGVjdGVkOiBib29sZWFuO1xuICB9O1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxOZXN0ZWRXaXRoSGVhZGVyUm93PFIgZXh0ZW5kcyBSb3c+ID0ge1xuICAgIGlkOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgc3ViUm93czogRnVsbE5lc3RlZFJvdzxSPltdO1xuICAgIGhlYWRlclRleHQ6IHN0cmluZztcbiAgfTtcblxuICBleHBvcnQgdHlwZSBGdWxsQ29sdW1uPEMgZXh0ZW5kcyBDb2x1bW4+ID0gQ29sdW1uU2V0dGluZ3M8Qz4gJlxuICAgIENvbHVtbk1ldGFkYXRhICYge1xuICAgICAgd2lkdGg6IG51bWJlcjtcbiAgICAgIGxlZnQ6IG51bWJlciB8IG51bGw7XG4gICAgICBhbGlnbm1lbnQ6IENvbHVtbkFsaWdubWVudDtcbiAgICB9O1xuICBleHBvcnQgdHlwZSBNdWx0aVNlbGVjdGlvblN0YXRlID0gYm9vbGVhbiB8ICdpbmRldGVybWluYXRlJztcbiAgZXhwb3J0IHR5cGUgU2VsZWN0aW9uQ29uZmlndXJhdGlvbiA9IGJvb2xlYW4gfCAnaW5kaXZpZHVhbCc7XG5cbiAgZXhwb3J0IHR5cGUgUm93U3BhbkdldHRlcjxDIGV4dGVuZHMgQ29sdW1uPiA9IChcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIGNvbHVtbjogQyxcbiAgKSA9PiBudW1iZXIgfCBudWxsIHwgdW5kZWZpbmVkO1xuXG4gIGV4cG9ydCB0eXBlIFZhbGlkUm93U3BhbkdldHRlcjxDIGV4dGVuZHMgQ29sdW1uPiA9IChcbiAgICByb3dJbmRleDogbnVtYmVyLFxuICAgIGNvbHVtbjogQyxcbiAgKSA9PiBudW1iZXI7XG5cbiAgZXhwb3J0IHR5cGUgQ3N2Q2VsbEZvcm1hdHRlcjxSIGV4dGVuZHMgUm93LCBDIGV4dGVuZHMgQ29sdW1uPiA9IChcbiAgICByb3c6IFIsXG4gICAgY29sdW1uOiBGdWxsQ29sdW1uPEM+LFxuICApID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbiAgZXhwb3J0IHR5cGUgQ3N2R3JvdXBDZWxsRm9ybWF0dGVyPFIgZXh0ZW5kcyBSb3csIEcgZXh0ZW5kcyBHcm91cD4gPSAoXG4gICAgcm93OiBSLFxuICAgIGdyb3VwOiBHLFxuICApID0+IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbiAgZXhwb3J0IHR5cGUgQ3N2Um93ID0gc3RyaW5nW107XG4gIGV4cG9ydCB0eXBlIENzdiA9IENzdlJvd1tdO1xuICBleHBvcnQgdHlwZSBDc3ZNb2RlID0gJ2Z1bGwnIHwgJ3NlbGVjdGlvbic7XG4gIGV4cG9ydCB0eXBlIENzdk91dHB1dCA9XG4gICAgfCB7IGxvYWRpbmc6IHRydWU7IGRhdGE6IG51bGwgfVxuICAgIHwgeyBsb2FkaW5nOiBmYWxzZTsgZGF0YTogQ3N2IH07XG5cbiAgZXhwb3J0IHR5cGUgQ29sdW1uTmFtZU1hcDxDIGV4dGVuZHMgQ29sdW1uPiA9IE1hcDxDLCBDIHwgc3RyaW5nPjtcblxuICBleHBvcnQgdHlwZSBTZWFyY2hhYmxlQ29sdW1uTWFwPEMgZXh0ZW5kcyBDb2x1bW4+ID0gTWFwPEMsIGJvb2xlYW4+O1xuXG4gIGV4cG9ydCB0eXBlIEZ1bGxTdGF0ZTxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4gPSBDb3JlU3RhdGU8UiwgQywgRiwgRz4gJiB7XG4gICAgcXVlcnk6IHtcbiAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgcHJldmlvdXM6IG51bWJlciB8IG51bGw7XG4gICAgICAgIHBhZ2VzOiBudW1iZXJbXTtcbiAgICAgICAgbmV4dDogbnVtYmVyIHwgbnVsbDtcbiAgICAgICAgcGFnZUNvdW50OiBudW1iZXI7XG4gICAgICAgIHNob3dDb250cm9sczogYm9vbGVhbjtcbiAgICAgICAgcGFnZVJvd1N0YXJ0OiBudW1iZXI7XG4gICAgICAgIHBhZ2VSb3dFbmQ6IG51bWJlcjtcbiAgICAgIH07XG4gICAgICBub1NlYXJjaENvbHVtbnNTZWxlY3RlZDogYm9vbGVhbjtcbiAgICB9O1xuICAgIHJlc3VsdDpcbiAgICAgIHwge1xuICAgICAgICAgIHJvd3M6IEZ1bGxSb3c8Uj5bXTtcbiAgICAgICAgICByb3dzQXNHcm91cDogUm93R3JvdXA8UiwgRz47XG4gICAgICAgICAgaXNHcm91cGVkOiBmYWxzZTtcbiAgICAgICAgICBjc3ZEYXRhOiAobW9kZT86IENzdk1vZGUpID0+IEFzeW5jR2VuZXJhdG9yPENzdk91dHB1dD47XG4gICAgICAgICAgY3N2RmlsZW5hbWU6IHN0cmluZztcbiAgICAgICAgfVxuICAgICAgfCB7XG4gICAgICAgICAgcm93czogRnVsbFJvdzxSPltdO1xuICAgICAgICAgIHJvd0dyb3VwczogUm93R3JvdXA8UiwgRz5bXTtcbiAgICAgICAgICBpc0dyb3VwZWQ6IHRydWU7XG4gICAgICAgICAgY3N2RGF0YTogKG1vZGU/OiBDc3ZNb2RlKSA9PiBBc3luY0dlbmVyYXRvcjxDc3ZPdXRwdXQ+O1xuICAgICAgICAgIGNzdkZpbGVuYW1lOiBzdHJpbmc7XG4gICAgICAgIH07XG4gICAgZGlzcGxheToge1xuICAgICAgY29sdW1uczogRnVsbENvbHVtbjxDPltdO1xuICAgICAgYWxsQ29sdW1uczogQ29sdW1uU2V0dGluZ3M8Qz5bXTtcbiAgICAgIHNlYXJjaGFibGVDb2x1bW5NYXA6IFNlYXJjaGFibGVDb2x1bW5NYXA8Qz47XG4gICAgICBjb2x1bW5OYW1lTWFwOiBDb2x1bW5OYW1lTWFwPEM+O1xuICAgICAgemVyb1N0YXRlTWVzc2FnZTogc3RyaW5nIHwgbnVsbDtcbiAgICAgIGNvbHVtbnNBcmVGcmVlemFibGU6IGJvb2xlYW47XG4gICAgICBjb2x1bW5zQXJlSGlkZWFibGU6IGJvb2xlYW47XG4gICAgICBjb2x1bW5zQXJlUmVvcmRlcmFibGU6IGJvb2xlYW47XG4gICAgICByb3dzQXJlR3JheWVkOiBib29sZWFuO1xuICAgICAgY3VzdG9tU3VtbWFyeVJvdzogYm9vbGVhbjtcbiAgICAgIGNzdkV4cG9ydEFsbG93ZWQ6IGJvb2xlYW47XG4gICAgICBlbmFibGVkQ291bnQ6IG51bWJlcjtcbiAgICAgIGhpZGVQYWdlU2l6ZVNlbGVjdG9yOiBib29sZWFuO1xuICAgICAgbmVlZHNSaWdodEJvcmRlcjogKHJvd0luZGV4OiBudW1iZXIsIGNvbHVtbjogQykgPT4gYm9vbGVhbjtcbiAgICB9O1xuICAgIHNlbGVjdGlvbjoge1xuICAgICAgYWxsb3dTZWxlY3Rpb246IFNlbGVjdGlvbkNvbmZpZ3VyYXRpb247XG4gICAgICBpc0FsbFNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgICAgaXNDdXJyZW50UGFnZVNlbGVjdGVkOiBNdWx0aVNlbGVjdGlvblN0YXRlO1xuICAgICAgc2VsZWN0ZWRDb3VudDogbnVtYmVyO1xuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIFRoZSBtYW5hZ2VyIGlzIHdoYXQgc2V0cyB1cCB0aGUgaW5pdGlhbCBzdGF0ZSBhbmQgdHJhbnNsYXRlcyB1c2VyIGFjdGlvbnNcbiAgICogKGxpa2UgcGFnaW5hdGlvbiBvciBmaWx0ZXIgY2hhbmdlcywgZXRjLikgaW50byBuZXcgcm93IGRhdGEgYnkgY2FsbGluZyB0aGVcbiAgICogcmVkdWNlciBmdW5jdGlvbi4gSXQgYWxzbyBhdWdtZW50cyB0aGUgY29yZSBzdGF0ZSB3aXRoIGFkZGl0aW9uYWwgZGVyaXZlZFxuICAgKiBzdGF0ZS5cbiAgICovXG5cbiAgZXhwb3J0IHR5cGUgTWFuYWdlcjxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4gPSB7XG4gICAgYWN0aW9uczogU3ViamVjdDxBY3Rpb248UiwgQywgRiwgRz4+O1xuICAgIHN0YXRlOiBDb25uZWN0YWJsZTxGdWxsU3RhdGU8UiwgQywgRiwgRz4+O1xuICAgIGVmZmVjdHM6IENvbm5lY3RhYmxlPEVmZmVjdD47XG4gIH07XG5cbiAgZXhwb3J0IHR5cGUgTWFuYWdlck9wdGlvbnM8XG4gICAgUiBleHRlbmRzIFJvdyxcbiAgICBDIGV4dGVuZHMgQ29sdW1uLFxuICAgIEYgZXh0ZW5kcyBGaWx0ZXJzLFxuICAgIEcgZXh0ZW5kcyBHcm91cCA9IHsga2V5OiAnJyB9LFxuICA+ID0ge1xuICAgIGluaXRpYWxTdGF0ZT86IERlZXBQYXJ0aWFsPENvcmVTdGF0ZTxSLCBDLCBGLCBHPj47XG4gICAgcm93TGluaz86IChyb3c6IFIsIGdyb3VwPzogRykgPT4gUm93TGluaztcbiAgICBjc3ZDZWxsRm9ybWF0dGVyPzogQ3N2Q2VsbEZvcm1hdHRlcjxSLCBDPjtcbiAgICBjc3ZHcm91cENlbGxGb3JtYXR0ZXI/OiBDc3ZHcm91cENlbGxGb3JtYXR0ZXI8UiwgRz47XG4gICAgY3N2RmlsZUJhc2VuYW1lPzogc3RyaW5nO1xuICAgIGFsbG93U2VsZWN0aW9uPzogU2VsZWN0aW9uQ29uZmlndXJhdGlvbjtcbiAgICBjb2x1bW5zQXJlRnJlZXphYmxlPzogYm9vbGVhbjtcbiAgICBjb2x1bW5zQXJlSGlkZWFibGU/OiBib29sZWFuO1xuICAgIGNvbHVtbnNBcmVSZW9yZGVyYWJsZT86IGJvb2xlYW47XG4gICAgZGVmYXVsdENvbHVtblN0YXRlPzogQ29sdW1uU2V0dGluZ3M8Qz5bXTtcbiAgICByb3dzQXJlR3JheWVkPzogYm9vbGVhbjtcbiAgICBjdXN0b21TdW1tYXJ5Um93PzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBXaGVuIHRydWUsIHRoZSBcIlJlc3VsdHMgcGVyIHBhZ2VcIiBsYWJlbCBhbmQgcGFnZS1zaXplIGRyb3Bkb3duIGFyZVxuICAgICAqIGhpZGRlbi4gUGFnZSBuYXZpZ2F0aW9uIGFycm93cyBhbmQgcGFnZSBudW1iZXJzIHJlbWFpbiB2aXNpYmxlLlxuICAgICAqL1xuICAgIGhpZGVQYWdlU2l6ZVNlbGVjdG9yPzogYm9vbGVhbjtcbiAgICAvKipcbiAgICAgKiBQYXJlbnQtY29udHJvbGxlZCByb3cgc3Bhbm5pbmcuXG4gICAgICogUmV0dXJuIDAgdG8gc3VwcHJlc3MgdGhlIGNlbGwsID49MSBmb3IgYSByZWFsIHJvd3NwYW4uXG4gICAgICogSWYgb21pdHRlZCBvciBpbnZhbGlkLCBkZWZhdWx0cyB0byAxLlxuICAgICAqL1xuICAgIGdldFJvd1NwYW5Gb3JDZWxsPzogUm93U3BhbkdldHRlcjxDPjtcbiAgfTtcblxuICBleHBvcnQgZnVuY3Rpb24gY3JlYXRlTWFuYWdlcjxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gICAgRyBleHRlbmRzIEdyb3VwID0geyBrZXk6ICcnIH0sXG4gID4oXG4gICAgc291cmNlOiBTb3VyY2U8UiwgQywgRiwgRz4sXG4gICAgY29sdW1uczogTWFwPEMsIENvbHVtbk1ldGFkYXRhPixcbiAgICBwbHVyYWxFbnRpdHlOYW1lOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IE1hbmFnZXJPcHRpb25zPFIsIEMsIEYsIEc+LFxuICApOiBNYW5hZ2VyPFIsIEMsIEYsIEc+IHtcbiAgICAvLyBTZXQgdXAgdGhlIGluaXRpYWwgdGFibGUgc3RhdGUuXG5cbiAgICBjb25zdCBzZWFyY2hhYmxlQ29sdW1uTWFwOiBTZWFyY2hhYmxlQ29sdW1uTWFwPEM+ID0gbmV3IE1hcDxDLCBib29sZWFuPihcbiAgICAgIEFycmF5LmZyb20oY29sdW1ucy5lbnRyaWVzKCkpLm1hcCgoW2tleSwgbWV0YWRhdGFdKSA9PiBbXG4gICAgICAgIGtleSxcbiAgICAgICAgbWV0YWRhdGEuc2VhcmNoYWJsZSA/PyB0cnVlLFxuICAgICAgXSksXG4gICAgKTtcbiAgICBjb25zdCBkZWZhdWx0U3RhdGU6IENvcmVTdGF0ZTxSLCBDLCBGLCBHPiA9IHtcbiAgICAgIHF1ZXJ5OiB7XG4gICAgICAgIG9yZGVyOiBudWxsLFxuICAgICAgICBzZWFyY2g6ICcnLFxuICAgICAgICBzZWFyY2hDb2x1bW5zOiBuZXcgTWFwKFxuICAgICAgICAgIEFycmF5LmZyb20oY29sdW1ucy5rZXlzKCkpXG4gICAgICAgICAgICAuZmlsdGVyKGtleSA9PiBzZWFyY2hhYmxlQ29sdW1uTWFwLmdldChrZXkpKVxuICAgICAgICAgICAgLm1hcChrZXkgPT4gW2tleSwgdHJ1ZV0pLFxuICAgICAgICApLFxuICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICBwYWdlU2l6ZTogMjUsXG4gICAgICAgIH0sXG4gICAgICAgIGdyb3VwaW5nOiB7XG4gICAgICAgICAgdmlld01vcmVLZXk6IG51bGwsXG4gICAgICAgICAgZ3JvdXBzUGVyUGFnZTogNSxcbiAgICAgICAgICBjb3VudFBlckdyb3VwOiAxMCxcbiAgICAgICAgfSxcbiAgICAgICAgZmlsdGVyczogbnVsbCxcbiAgICAgIH0sXG4gICAgICBsb2FkOiB7IGxvYWRpbmc6IGZhbHNlLCBlcnJvcjogbnVsbCB9LFxuICAgICAgcmVzdWx0OiB7XG4gICAgICAgIGN1cnJlbnRQYWdlRGF0YTogW10sXG4gICAgICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogMCxcbiAgICAgIH0sXG4gICAgICBkaXNwbGF5OiB7XG4gICAgICAgIGNvbHVtblNldHRpbmdzOiBbXSxcbiAgICAgICAgY2VsbFJvd1NwYW46IChfaTogbnVtYmVyLCBfY29sdW1uOiBDKSA9PiAxLFxuICAgICAgfSxcbiAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogbnVsbCxcbiAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICBpbmNsdWRlZDogbmV3IFNldCgpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIGNvbnN0IGRlZmF1bHRlZEluaXRpYWxTdGF0ZTogQ29yZVN0YXRlPFIsIEMsIEYsIEc+ID0gZGVmYXVsdHNEZWVwKFxuICAgICAge30sXG4gICAgICBvcHRpb25zPy5pbml0aWFsU3RhdGUsXG4gICAgICBkZWZhdWx0U3RhdGUsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbHVtbk5hbWVNYXA6IENvbHVtbk5hbWVNYXA8Qz4gPSBuZXcgTWFwPEMsIEMgfCBzdHJpbmc+KFxuICAgICAgQXJyYXkuZnJvbShjb2x1bW5zLmVudHJpZXMoKSkubWFwKChba2V5LCBtZXRhZGF0YV0pID0+IFtcbiAgICAgICAga2V5LFxuICAgICAgICB0b1NlbnRlbmNlQ2FzZShtZXRhZGF0YS5kaXNwbGF5TmFtZSA/PyBrZXkpLFxuICAgICAgXSksXG4gICAgKTtcblxuICAgIGNvbnN0IGRlZmF1bHRDb2x1bW5TdGF0ZSA9XG4gICAgICBvcHRpb25zPy5kZWZhdWx0Q29sdW1uU3RhdGUgPz9cbiAgICAgIGRlZmF1bHRlZEluaXRpYWxTdGF0ZS5kaXNwbGF5LmNvbHVtblNldHRpbmdzO1xuXG4gICAgLy8gV2lyZSB1cCByZWR1Y2VkIHN0YXRlIGZyb20gYWN0aW9ucyBhbmQgaW5pdGlhbCBzdGF0ZS5cbiAgICBjb25zdCBhY3Rpb25zOiBTdWJqZWN0PEFjdGlvbjxSLCBDLCBGLCBHPj4gPSBuZXcgU3ViamVjdCgpO1xuICAgIGNvbnN0IGNvcmVTdGF0ZTogT2JzZXJ2YWJsZTx7XG4gICAgICBzdGF0ZTogQ29yZVN0YXRlPFIsIEMsIEYsIEc+O1xuICAgICAgZWZmZWN0OiBFZmZlY3QgfCBudWxsO1xuICAgIH0+ID0gYWN0aW9ucy5waXBlKFxuICAgICAgbWVyZ2VTY2FuPFxuICAgICAgICBBY3Rpb248UiwgQywgRiwgRz4sXG4gICAgICAgIHtcbiAgICAgICAgICBzdGF0ZTogQ29yZVN0YXRlPFIsIEMsIEYsIEc+O1xuICAgICAgICAgIGVmZmVjdDogRWZmZWN0IHwgbnVsbDtcbiAgICAgICAgfVxuICAgICAgPihcbiAgICAgICAgKHsgc3RhdGUgfSwgYWN0aW9uKSA9PlxuICAgICAgICAgIGZyb20oXG4gICAgICAgICAgICByZWR1Y2UoXG4gICAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgICBhY3Rpb24sXG4gICAgICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgICAgIHNvdXJjZSxcbiAgICAgICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICAgICAgZGVmYXVsdENvbHVtblN0YXRlLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICApLFxuICAgICAgICB7IHN0YXRlOiBkZWZhdWx0ZWRJbml0aWFsU3RhdGUsIGVmZmVjdDogbnVsbCB9LFxuICAgICAgICAxLFxuICAgICAgKSxcbiAgICAgIHNoYXJlKHtcbiAgICAgICAgY29ubmVjdG9yOiAoKSA9PiBuZXcgUmVwbGF5U3ViamVjdCgxKSxcbiAgICAgICAgcmVzZXRPbkVycm9yOiBmYWxzZSxcbiAgICAgICAgcmVzZXRPbkNvbXBsZXRlOiBmYWxzZSxcbiAgICAgICAgcmVzZXRPblJlZkNvdW50WmVybzogZmFsc2UsXG4gICAgICB9KSxcbiAgICApO1xuXG4gICAgY29uc3QgY3N2RXhwb3J0QWxsb3dlZCA9ICEoXG4gICAgICBvcHRpb25zPy5nZXRSb3dTcGFuRm9yQ2VsbCB8fCBvcHRpb25zPy5jdXN0b21TdW1tYXJ5Um93XG4gICAgKTtcblxuICAgIC8vIEF1Z21lbnQgc3RhdGUgd2l0aCBkZXJpdmVkIHN0YXRlLCBhbmQgc3Vic2NyaWJlLlxuICAgIGNvbnN0IHN0YXRlOiBDb25uZWN0YWJsZTxGdWxsU3RhdGU8UiwgQywgRiwgRz4+ID0gY29ubmVjdGFibGUoXG4gICAgICBjb3JlU3RhdGUucGlwZShcbiAgICAgICAgbWFwKCh7IHN0YXRlOiBzIH0pOiBGdWxsU3RhdGU8UiwgQywgRiwgRz4gPT4ge1xuICAgICAgICAgIGNvbnN0IHJlc29sdmVkQ29sdW1ucyA9IFRhYmxlQ29sdW1uSGVscGVycy5yZXNvbHZlQ29sdW1ucyhcbiAgICAgICAgICAgIHMsXG4gICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICAgICEhb3B0aW9ucz8uYWxsb3dTZWxlY3Rpb24sXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChUYWJsZVJlc3VsdEhlbHBlcnMuaXNHcm91cFJlc3VsdChzLnJlc3VsdCkpIHtcbiAgICAgICAgICAgIGlmIChvcHRpb25zPy5nZXRSb3dTcGFuRm9yQ2VsbCkge1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICAgJ0hlYWRzIHVwISBDdXN0b20gcm93IHNwYW5zIGFyZSBub3Qgc3VwcG9ydGVkIGZvciBncm91cGVkIHRhYmxlcy4nLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnM/LmN1c3RvbVN1bW1hcnlSb3cpIHtcbiAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICdIZWFkcyB1cCEgQ3VzdG9tIHN1bW1hcnkgcm93cyBhcmUgbm90IHN1cHBvcnRlZCBmb3IgZ3JvdXBlZCB0YWJsZXMuJyxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3Qgcm93R3JvdXBzID0gcy5yZXN1bHQuZ3JvdXBSZXN1bHRzLm1hcChncm91cCA9PiAoe1xuICAgICAgICAgICAgICByb3dzOiBncm91cC5jdXJyZW50UGFnZURhdGEubWFwKHJvdyA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLnJvdyxcbiAgICAgICAgICAgICAgICByb3dMaW5rOiBvcHRpb25zPy5yb3dMaW5rXG4gICAgICAgICAgICAgICAgICA/IG9wdGlvbnMucm93TGluayhyb3csIGdyb3VwLmdyb3VwRGF0YSlcbiAgICAgICAgICAgICAgICAgIDogbnVsbCxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZDogVGFibGVTZWxlY3Rpb25IZWxwZXJzLmlzUm93U2VsZWN0ZWQocywgcm93LmlkKSxcbiAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICBzZWxlY3RlZDogVGFibGVTZWxlY3Rpb25IZWxwZXJzLmlzR3JvdXBTZWxlY3RlZChzLCBncm91cCksXG4gICAgICAgICAgICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogZ3JvdXAudG90YWxNYXRjaGluZ1Jvd0NvdW50LFxuICAgICAgICAgICAgICBncm91cERhdGE6IGdyb3VwLmdyb3VwRGF0YSxcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24qIGNzdkRhdGEoXG4gICAgICAgICAgICAgIG1vZGU6IENzdk1vZGUgPSAnZnVsbCcsXG4gICAgICAgICAgICApOiBBc3luY0dlbmVyYXRvcjxDc3ZPdXRwdXQ+IHtcbiAgICAgICAgICAgICAgY29uc3QgY2VsbEZvcm1hdHRlciA9IG9wdGlvbnM/LmNzdkNlbGxGb3JtYXR0ZXI7XG4gICAgICAgICAgICAgIGNvbnN0IGdyb3VwQ2VsbEZvcm1hdHRlciA9IG9wdGlvbnM/LmNzdkdyb3VwQ2VsbEZvcm1hdHRlcjtcbiAgICAgICAgICAgICAgaWYgKCFjZWxsRm9ybWF0dGVyKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICdvcHRpb25zLmNzdkNlbGxGb3JtYXR0ZXIgaXMgcmVxdWlyZWQgZm9yIENTViBleHBvcnQnLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHlpZWxkIHsgbG9hZGluZzogdHJ1ZSwgZGF0YTogbnVsbCB9O1xuICAgICAgICAgICAgICBjb25zdCBkYXRhU2V0ID0gYXdhaXQgc291cmNlKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIC4uLnMucXVlcnksXG4gICAgICAgICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiBzLnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQsXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgeyB0eXBlOiAnbG9hZCcgfSxcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoIVRhYmxlUmVzdWx0SGVscGVycy5pc0dyb3VwUmVzdWx0KGRhdGFTZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICdSZXR1cm5lZCBub24tZ3JvdXBlZCBDU1YgZGF0YSBmb3IgZ3JvdXBlZCB0YWJsZScsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjb25zdCBmdWxsQ29sdW1ucyA9IFRhYmxlQ29sdW1uSGVscGVycy5yZXNvbHZlQ29sdW1ucyhcbiAgICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICAgICAgICAhIW9wdGlvbnMuYWxsb3dTZWxlY3Rpb24sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGE6IENzdiA9IFtdO1xuICAgICAgICAgICAgICBkYXRhLnB1c2goXG4gICAgICAgICAgICAgICAgZnVsbENvbHVtbnMubWFwKCh7IGtleSB9KSA9PiBjb2x1bW5OYW1lTWFwLmdldChrZXkpID8/IGtleSksXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKGdyb3VwQ2VsbEZvcm1hdHRlcikge1xuICAgICAgICAgICAgICAgIGRhdGFbMF0ucHVzaCgnJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJvd0l0ZW0gb2YgZGF0YVNldC5ncm91cFJlc3VsdHMuZmxhdE1hcChncm91cHMgPT5cbiAgICAgICAgICAgICAgICBncm91cHMuY3VycmVudFBhZ2VEYXRhLm1hcChyb3cgPT4gKHtcbiAgICAgICAgICAgICAgICAgIHJvdyxcbiAgICAgICAgICAgICAgICAgIGdyb3VwOiBncm91cHMuZ3JvdXBEYXRhLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgKSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9IHJvd0l0ZW0ucm93O1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgIG1vZGUgPT09ICdzZWxlY3Rpb24nICYmXG4gICAgICAgICAgICAgICAgICAhVGFibGVTZWxlY3Rpb25IZWxwZXJzLmlzUm93U2VsZWN0ZWQocywgcmVjb3JkLmlkKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdzogQ3N2Um93ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBjb2x1bW4gb2YgZnVsbENvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIHJvdy5wdXNoKGF3YWl0IGNlbGxGb3JtYXR0ZXIocmVjb3JkLCBjb2x1bW4pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGdyb3VwQ2VsbEZvcm1hdHRlciAmJiByb3dJdGVtLmdyb3VwKSB7XG4gICAgICAgICAgICAgICAgICByb3cucHVzaChhd2FpdCBncm91cENlbGxGb3JtYXR0ZXIocmVjb3JkLCByb3dJdGVtLmdyb3VwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEucHVzaChyb3cpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHlpZWxkIHsgbG9hZGluZzogZmFsc2UsIGRhdGEgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucyxcbiAgICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgICAuLi5zLnF1ZXJ5LFxuICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgICAgIC4uLnMucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzOiBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldFByZXZpb3VzUGFnZShzKSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VzOiBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldFBhZ2VzKHMpLFxuICAgICAgICAgICAgICAgICAgbmV4dDogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXROZXh0UGFnZShzKSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VDb3VudDogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXRQYWdlQ291bnQocyksXG4gICAgICAgICAgICAgICAgICBzaG93Q29udHJvbHM6XG4gICAgICAgICAgICAgICAgICAgIFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0U2hvd1BhZ2luYXRpb25Db250cm9scyhzKSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VSb3dTdGFydDogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXRQYWdlUm93U3RhcnQocyksXG4gICAgICAgICAgICAgICAgICBwYWdlUm93RW5kOiBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldFBhZ2VSb3dFbmQocyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBub1NlYXJjaENvbHVtbnNTZWxlY3RlZDpcbiAgICAgICAgICAgICAgICAgIFRhYmxlU2VhcmNoSGVscGVycy5nZXRTZWFyY2hDb2x1bW5zU2VsZWN0ZWRTdGF0ZShzLCAnbm9uZScpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkaXNwbGF5OiB7XG4gICAgICAgICAgICAgICAgLi4ucy5kaXNwbGF5LFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHJlc29sdmVkQ29sdW1ucyxcbiAgICAgICAgICAgICAgICBhbGxDb2x1bW5zOiBUYWJsZUNvbHVtbkhlbHBlcnMuZ2V0QWxsQ29sdW1ucyhcbiAgICAgICAgICAgICAgICAgIHMsXG4gICAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVNYXA6IGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogc2VhcmNoYWJsZUNvbHVtbk1hcCxcbiAgICAgICAgICAgICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBUYWJsZURpc3BsYXlIZWxwZXJzLmdldFplcm9TdGF0ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNvbHVtbnNBcmVGcmVlemFibGU6ICEhb3B0aW9ucz8uY29sdW1uc0FyZUZyZWV6YWJsZSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zQXJlSGlkZWFibGU6ICEhb3B0aW9ucz8uY29sdW1uc0FyZUhpZGVhYmxlLFxuICAgICAgICAgICAgICAgIGNvbHVtbnNBcmVSZW9yZGVyYWJsZTogb3B0aW9ucz8uY29sdW1uc0FyZVJlb3JkZXJhYmxlID8/IHRydWUsXG4gICAgICAgICAgICAgICAgcm93c0FyZUdyYXllZDogISFvcHRpb25zPy5yb3dzQXJlR3JheWVkLFxuICAgICAgICAgICAgICAgIGN1c3RvbVN1bW1hcnlSb3c6ICEhb3B0aW9ucz8uY3VzdG9tU3VtbWFyeVJvdyxcbiAgICAgICAgICAgICAgICBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgICAgICAgICAgIGVuYWJsZWRDb3VudDogcmVzb2x2ZWRDb2x1bW5zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBoaWRlUGFnZVNpemVTZWxlY3RvcjogISFvcHRpb25zPy5oaWRlUGFnZVNpemVTZWxlY3RvcixcbiAgICAgICAgICAgICAgICBjZWxsUm93U3BhbjogKF9pOiBudW1iZXIsIF9jb2x1bW46IEMpID0+IDEsXG4gICAgICAgICAgICAgICAgbmVlZHNSaWdodEJvcmRlcjogKCkgPT4gZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHNlbGVjdGlvbjoge1xuICAgICAgICAgICAgICAgIC4uLnMuc2VsZWN0aW9uLFxuICAgICAgICAgICAgICAgIGFsbG93U2VsZWN0aW9uOiBvcHRpb25zPy5hbGxvd1NlbGVjdGlvbiA/PyBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0FsbFNlbGVjdGVkOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuaXNBbGxTZWxlY3RlZChzKSxcbiAgICAgICAgICAgICAgICBpc0N1cnJlbnRQYWdlU2VsZWN0ZWQ6XG4gICAgICAgICAgICAgICAgICBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuaXNDdXJyZW50UGFnZVNlbGVjdGVkKHMpLFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkQ291bnQ6IFRhYmxlU2VsZWN0aW9uSGVscGVycy5zZWxlY3RlZENvdW50KHMpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgICAgICAuLi5zLnJlc3VsdCxcbiAgICAgICAgICAgICAgICBpc0dyb3VwZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgcm93R3JvdXBzLFxuICAgICAgICAgICAgICAgIHJvd3M6IHJvd0dyb3Vwcy5mbGF0TWFwKGdyb3VwID0+IGdyb3VwLnJvd3MpLFxuICAgICAgICAgICAgICAgIGNzdkRhdGEsXG4gICAgICAgICAgICAgICAgY3N2RmlsZW5hbWU6IFRhYmxlUmVzdWx0SGVscGVycy5nZXRDc3ZGaWxlbmFtZShcbiAgICAgICAgICAgICAgICAgIHBsdXJhbEVudGl0eU5hbWUsXG4gICAgICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCByb3dzID0gcy5yZXN1bHQuY3VycmVudFBhZ2VEYXRhLm1hcChyb3cgPT4gKHtcbiAgICAgICAgICAgICAgLi4ucm93LFxuICAgICAgICAgICAgICByb3dMaW5rOiBvcHRpb25zPy5yb3dMaW5rID8gb3B0aW9ucy5yb3dMaW5rKHJvdykgOiBudWxsLFxuICAgICAgICAgICAgICBzZWxlY3RlZDogVGFibGVTZWxlY3Rpb25IZWxwZXJzLmlzUm93U2VsZWN0ZWQocywgcm93LmlkKSxcbiAgICAgICAgICAgIH0pKTtcblxuICAgICAgICAgICAgY29uc3QgY2VsbFJvd1NwYW5DYWNoZSA9IFRhYmxlRGlzcGxheUhlbHBlcnMubWVtb2l6ZWRDZWxsUm93U3BhbihcbiAgICAgICAgICAgICAgcyxcbiAgICAgICAgICAgICAgcmVzb2x2ZWRDb2x1bW5zLFxuICAgICAgICAgICAgICBvcHRpb25zLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGNlbGxSb3dTcGFuOiBWYWxpZFJvd1NwYW5HZXR0ZXI8Qz4gPSAocm93SW5kZXgsIGNvbHVtbikgPT5cbiAgICAgICAgICAgICAgY2VsbFJvd1NwYW5DYWNoZT8uZ2V0KGNvbHVtbik/Lltyb3dJbmRleF0gPz8gMTtcbiAgICAgICAgICAgIGNvbnN0IGhhc0FueVJvd1NwYW5zID0gY2VsbFJvd1NwYW5DYWNoZVxuICAgICAgICAgICAgICA/IFsuLi5jZWxsUm93U3BhbkNhY2hlLnZhbHVlcygpXS5zb21lKHNwYW5zID0+XG4gICAgICAgICAgICAgICAgICBzcGFucy5zb21lKHNwYW4gPT4gc3BhbiA+IDEpLFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBmYWxzZTtcblxuICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRDb2x1bW5LZXlzID0gcmVzb2x2ZWRDb2x1bW5zLm1hcCgoeyBrZXkgfSkgPT4ga2V5KTtcblxuICAgICAgICAgICAgYXN5bmMgZnVuY3Rpb24qIGNzdkRhdGEobW9kZSA9ICdmdWxsJyk6IEFzeW5jR2VuZXJhdG9yPENzdk91dHB1dD4ge1xuICAgICAgICAgICAgICBpZiAoIWNzdkV4cG9ydEFsbG93ZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAnQ1NWIGV4cG9ydCBpcyBub3Qgc3VwcG9ydGVkIHdoZW4gcm93IHNwYW5uaW5nIG9yIGEgY3VzdG9tIHN1bW1hcnkgcm93IGlzIGVuYWJsZWQuJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgY2VsbEZvcm1hdHRlciA9IG9wdGlvbnM/LmNzdkNlbGxGb3JtYXR0ZXI7XG4gICAgICAgICAgICAgIGlmICghY2VsbEZvcm1hdHRlcilcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAnb3B0aW9ucy5jc3ZDZWxsRm9ybWF0dGVyIGlzIHJlcXVpcmVkIGZvciBDU1YgZXhwb3J0JyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB5aWVsZCB7IGxvYWRpbmc6IHRydWUsIGRhdGE6IG51bGwgfTtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YVNldCA9IGF3YWl0IHNvdXJjZShcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAuLi5zLnF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBwYWdlOiAwLFxuICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogcy5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50LFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHsgdHlwZTogJ2xvYWQnIH0sXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKFRhYmxlUmVzdWx0SGVscGVycy5pc0dyb3VwUmVzdWx0KGRhdGFTZXQpKVxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICdSZXR1cm5lZCBncm91cGVkIENTViBkYXRhIGZvciBub24tZ3JvdXBlZCB0YWJsZScsXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBjb25zdCBmdWxsQ29sdW1ucyA9IFRhYmxlQ29sdW1uSGVscGVycy5yZXNvbHZlQ29sdW1ucyhcbiAgICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICAgICAgICAhIW9wdGlvbnMuYWxsb3dTZWxlY3Rpb24sXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGE6IENzdiA9IFtdO1xuICAgICAgICAgICAgICBkYXRhLnB1c2goXG4gICAgICAgICAgICAgICAgZnVsbENvbHVtbnMubWFwKCh7IGtleSB9KSA9PiBjb2x1bW5OYW1lTWFwLmdldChrZXkpID8/IGtleSksXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgZm9yIChjb25zdCByZWNvcmQgb2YgZGF0YVNldC5jdXJyZW50UGFnZURhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICBtb2RlID09PSAnc2VsZWN0aW9uJyAmJlxuICAgICAgICAgICAgICAgICAgIVRhYmxlU2VsZWN0aW9uSGVscGVycy5pc1Jvd1NlbGVjdGVkKHMsIHJlY29yZC5pZClcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICBjb25zdCByb3c6IENzdlJvdyA9IFtdO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGZ1bGxDb2x1bW5zKSB7XG4gICAgICAgICAgICAgICAgICByb3cucHVzaChhd2FpdCBjZWxsRm9ybWF0dGVyKHJlY29yZCwgY29sdW1uKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRhdGEucHVzaChyb3cpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHlpZWxkIHsgbG9hZGluZzogZmFsc2UsIGRhdGEgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgLi4ucyxcbiAgICAgICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgICAgICAuLi5zLnF1ZXJ5LFxuICAgICAgICAgICAgICAgIG9yZGVyOiBoYXNBbnlSb3dTcGFucyA/IG51bGwgOiBzLnF1ZXJ5Lm9yZGVyLFxuICAgICAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgICAgIC4uLnMucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgICAgIHByZXZpb3VzOiBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldFByZXZpb3VzUGFnZShzKSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VzOiBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldFBhZ2VzKHMpLFxuICAgICAgICAgICAgICAgICAgbmV4dDogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXROZXh0UGFnZShzKSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VDb3VudDogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXRQYWdlQ291bnQocyksXG4gICAgICAgICAgICAgICAgICBzaG93Q29udHJvbHM6XG4gICAgICAgICAgICAgICAgICAgIFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0U2hvd1BhZ2luYXRpb25Db250cm9scyhzKSxcbiAgICAgICAgICAgICAgICAgIHBhZ2VSb3dTdGFydDogVGFibGVQYWdpbmF0aW9uSGVscGVycy5nZXRQYWdlUm93U3RhcnQocyksXG4gICAgICAgICAgICAgICAgICBwYWdlUm93RW5kOiBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldFBhZ2VSb3dFbmQocyksXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBub1NlYXJjaENvbHVtbnNTZWxlY3RlZDpcbiAgICAgICAgICAgICAgICAgIFRhYmxlU2VhcmNoSGVscGVycy5nZXRTZWFyY2hDb2x1bW5zU2VsZWN0ZWRTdGF0ZShzLCAnbm9uZScpLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBkaXNwbGF5OiB7XG4gICAgICAgICAgICAgICAgLi4ucy5kaXNwbGF5LFxuICAgICAgICAgICAgICAgIGNvbHVtbnM6IHJlc29sdmVkQ29sdW1ucy5tYXAoY29sdW1uID0+XG4gICAgICAgICAgICAgICAgICBoYXNBbnlSb3dTcGFucyA/IHsgLi4uY29sdW1uLCBvcmRlcmFibGU6IGZhbHNlIH0gOiBjb2x1bW4sXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBhbGxDb2x1bW5zOiBUYWJsZUNvbHVtbkhlbHBlcnMuZ2V0QWxsQ29sdW1ucyhcbiAgICAgICAgICAgICAgICAgIHMsXG4gICAgICAgICAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVNYXA6IGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgICAgICAgc2VhcmNoYWJsZUNvbHVtbk1hcDogc2VhcmNoYWJsZUNvbHVtbk1hcCxcbiAgICAgICAgICAgICAgICB6ZXJvU3RhdGVNZXNzYWdlOiBUYWJsZURpc3BsYXlIZWxwZXJzLmdldFplcm9TdGF0ZU1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICBzLFxuICAgICAgICAgICAgICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIGNvbHVtbnNBcmVGcmVlemFibGU6ICEhb3B0aW9ucz8uY29sdW1uc0FyZUZyZWV6YWJsZSxcbiAgICAgICAgICAgICAgICBjb2x1bW5zQXJlSGlkZWFibGU6ICEhb3B0aW9ucz8uY29sdW1uc0FyZUhpZGVhYmxlLFxuICAgICAgICAgICAgICAgIGNvbHVtbnNBcmVSZW9yZGVyYWJsZTogb3B0aW9ucz8uY29sdW1uc0FyZVJlb3JkZXJhYmxlID8/IHRydWUsXG4gICAgICAgICAgICAgICAgcm93c0FyZUdyYXllZDogISFvcHRpb25zPy5yb3dzQXJlR3JheWVkLFxuICAgICAgICAgICAgICAgIGN1c3RvbVN1bW1hcnlSb3c6ICEhb3B0aW9ucz8uY3VzdG9tU3VtbWFyeVJvdyxcbiAgICAgICAgICAgICAgICBjc3ZFeHBvcnRBbGxvd2VkLFxuICAgICAgICAgICAgICAgIGVuYWJsZWRDb3VudDogcmVzb2x2ZWRDb2x1bW5zLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBoaWRlUGFnZVNpemVTZWxlY3RvcjogISFvcHRpb25zPy5oaWRlUGFnZVNpemVTZWxlY3RvcixcbiAgICAgICAgICAgICAgICBjZWxsUm93U3BhbixcbiAgICAgICAgICAgICAgICBuZWVkc1JpZ2h0Qm9yZGVyOiAocm93SW5kZXg6IG51bWJlciwgY29sdW1uOiBDKTogYm9vbGVhbiA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBpID0gcmVzb2x2ZWRDb2x1bW5LZXlzLmZpbmRJbmRleChrZXkgPT4ga2V5ID09PSBjb2x1bW4pO1xuICAgICAgICAgICAgICAgICAgaWYgKGkgPCAwIHx8IGkgPT09IHJlc29sdmVkQ29sdW1uS2V5cy5sZW5ndGggLSAxKVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgIGNvbnN0IHJpZ2h0Q29sS2V5ID0gcmVzb2x2ZWRDb2x1bW5LZXlzW2kgKyAxXTtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYW5PblJpZ2h0ID0gY2VsbFJvd1NwYW4ocm93SW5kZXgsIHJpZ2h0Q29sS2V5KTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBzcGFuT25SaWdodCA+IDEgfHwgc3Bhbk9uUmlnaHQgPT09IDA7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgLi4ucy5zZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgYWxsb3dTZWxlY3Rpb246IG9wdGlvbnM/LmFsbG93U2VsZWN0aW9uID8/IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzQWxsU2VsZWN0ZWQ6IFRhYmxlU2VsZWN0aW9uSGVscGVycy5pc0FsbFNlbGVjdGVkKHMpLFxuICAgICAgICAgICAgICAgIGlzQ3VycmVudFBhZ2VTZWxlY3RlZDpcbiAgICAgICAgICAgICAgICAgIFRhYmxlU2VsZWN0aW9uSGVscGVycy5pc0N1cnJlbnRQYWdlU2VsZWN0ZWQocyksXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRDb3VudDogVGFibGVTZWxlY3Rpb25IZWxwZXJzLnNlbGVjdGVkQ291bnQocyksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHJlc3VsdDoge1xuICAgICAgICAgICAgICAgIC4uLnMucmVzdWx0LFxuICAgICAgICAgICAgICAgIGlzR3JvdXBlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgcm93cyxcbiAgICAgICAgICAgICAgICByb3dzQXNHcm91cDoge1xuICAgICAgICAgICAgICAgICAgcm93cyxcbiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogcm93cy5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICBncm91cERhdGE6IHsga2V5OiAnJyB9IGFzIEcsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjc3ZGaWxlbmFtZTogVGFibGVSZXN1bHRIZWxwZXJzLmdldENzdkZpbGVuYW1lKFxuICAgICAgICAgICAgICAgICAgcGx1cmFsRW50aXR5TmFtZSxcbiAgICAgICAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICBjc3ZEYXRhLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgICBzY2FuKChzdGFibGUsIG5ld1N0YXRlKSA9PiBzdGFibGVTdGF0ZShzdGFibGUsIG5ld1N0YXRlKSksXG4gICAgICApLFxuICAgICAge1xuICAgICAgICBjb25uZWN0b3I6ICgpID0+IG5ldyBSZXBsYXlTdWJqZWN0KDEpLFxuICAgICAgICByZXNldE9uRGlzY29ubmVjdDogZmFsc2UsXG4gICAgICB9LFxuICAgICk7XG4gICAgc3RhdGUuY29ubmVjdCgpO1xuXG4gICAgY29uc3QgZWZmZWN0czogQ29ubmVjdGFibGU8RWZmZWN0PiA9IGNvbm5lY3RhYmxlKFxuICAgICAgY29yZVN0YXRlLnBpcGUoXG4gICAgICAgIGZpbHRlcigoeyBlZmZlY3QgfSkgPT4gZWZmZWN0ICE9PSBudWxsKSxcbiAgICAgICAgbWFwKCh7IGVmZmVjdCB9KSA9PiBlZmZlY3QgYXMgRWZmZWN0KSxcbiAgICAgICksXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3RvcjogKCkgPT4gbmV3IFJlcGxheVN1YmplY3QoMSksXG4gICAgICAgIHJlc2V0T25EaXNjb25uZWN0OiBmYWxzZSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBlZmZlY3RzLmNvbm5lY3QoKTtcblxuICAgIC8vIExvYWQgaW5pdGlhbCB0YWJsZSByb3cgZGF0YS5cbiAgICBhY3Rpb25zLm5leHQoeyB0eXBlOiAnbG9hZCcgfSk7XG5cbiAgICByZXR1cm4geyBhY3Rpb25zLCBzdGF0ZSwgZWZmZWN0cyB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE1vc3QgdGFibGVzIHVzZSByZW1vdGUgYmFja2VuZHMgdG8gZmV0Y2ggZGF0YSBhc3luY2hyb25vdXNseSwgYnV0IGFuXG4gICAqIGluLW1lbW9yeSBzb3VyY2UgaXMgdXNlZnVsIGZvciBzbWFsbCBkYXRhc2V0cywgd2hlbiBSaXZUYWJsZSBmZWF0dXJlcyBsaWtlXG4gICAqIG9yZGVyaW5nIGFuZCBwYWdpbmF0aW9uIGFyZSBkZXNpcmVkLlxuICAgKi9cblxuICBleHBvcnQgdHlwZSBJbk1lbW9yeUNvbHVtbk1ldGFkYXRhPFIgZXh0ZW5kcyBSb3c+ID0gT21pdDxcbiAgICBDb2x1bW5NZXRhZGF0YSxcbiAgICAnb3JkZXJhYmxlJ1xuICA+ICYgeyBvcmRlcktleT86IGtleW9mIFIgfTtcblxuICBleHBvcnQgdHlwZSBJbk1lbW9yeU1hbmFnZXJPcHRpb25zPFxuICAgIFIgZXh0ZW5kcyBSb3csXG4gICAgQyBleHRlbmRzIENvbHVtbixcbiAgICBGIGV4dGVuZHMgRmlsdGVycyxcbiAgICBHIGV4dGVuZHMgR3JvdXAgPSB7IGtleTogJycgfSxcbiAgPiA9IE1hbmFnZXJPcHRpb25zPFIsIEMsIEYsIEc+ICYge1xuICAgIGZ1c2VPcHRpb25zPzogSUZ1c2VPcHRpb25zPFI+O1xuICAgIGZpbHRlcj86IChmaWx0ZXJzOiBGIHwgbnVsbCwgcm93OiBSKSA9PiBib29sZWFuO1xuICAgIC8qKlxuICAgICAqIFdoZW4gYHF1ZXJ5Lm9yZGVyYCBpcyBudWxsIGFuZCB0aGVyZSBpcyBubyBhY3RpdmUgc2VhcmNoLCByb3dzIGFyZSBvcmRlcmVkXG4gICAgICogYnkgdGhpcyBjb2x1bW4uIElmIG9taXR0ZWQsIHRoZSBmaXJzdCBjb2x1bW4gd2l0aCBhbiBgb3JkZXJLZXlgIGlzIHVzZWRcbiAgICAgKiAoYXNjZW5kaW5nKS5cbiAgICAgKi9cbiAgICBkZWZhdWx0U29ydD86IHsgY29sdW1uOiBDOyBkaXJlY3Rpb246IE9yZGVyRGlyZWN0aW9uIH07XG4gIH07XG5cbiAgZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUluTWVtb3J5TWFuYWdlcjxcbiAgICBSIGV4dGVuZHMgUm93LFxuICAgIEMgZXh0ZW5kcyBDb2x1bW4sXG4gICAgRiBleHRlbmRzIEZpbHRlcnMsXG4gID4oXG4gICAgZmV0Y2hEYXRhc2V0OiAoKSA9PiBQcm9taXNlPFJbXT4gfCBSW10sXG4gICAgY29sdW1uczogTWFwPEMsIEluTWVtb3J5Q29sdW1uTWV0YWRhdGE8Uj4+LFxuICAgIHBsdXJhbEVudGl0eU5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zPzogSW5NZW1vcnlNYW5hZ2VyT3B0aW9uczxSLCBDLCBGPixcbiAgKTogTWFuYWdlcjxSLCBDLCBGPiB7XG4gICAgbGV0IGRhdGE6IFJbXTtcbiAgICBsZXQgZnVzZTogRnVzZTxSPjtcblxuICAgIGNvbnN0IHNvdXJjZTogU291cmNlPFIsIEMsIEY+ID0gYXN5bmMgKHF1ZXJ5LCBtb3N0UmVjZW50QWN0aW9uKSA9PiB7XG4gICAgICAvL0ZvciBpbk1lbW9yeU1hbmFnZXJzIHRoYXQgZG8gbm90IHV0aWxpemUgc2VhcmNoQ29sdW1ucyxcbiAgICAgIC8vd2UgZG8gbm90IHdhbnQgdG8gb3ZlcndyaXRlIHRoZWlyIGZ1c2VPcHRpb25zXG4gICAgICBpZiAobW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnbG9hZCcpIHtcbiAgICAgICAgLy9QcmV2ZW50IHNlYXJjaGluZyBvbiBjb2x1bW5zIHRoYXQgYXJlIGluIGZ1c2Ugb3B0aW9ucyBidXQgbm90IHN1cHBvcnRlZCBieSBzZWFyY2guXG4gICAgICAgIGNvbnN0IG5vblNlYXJjaGFibGVDb2x1bW5zS2V5cyA9IG9wdGlvbnM/LmZ1c2VPcHRpb25zPy5rZXlzXG4gICAgICAgICAgPyBBcnJheS5mcm9tKGNvbHVtbnMuZW50cmllcygpKVxuICAgICAgICAgICAgICAuZmlsdGVyKChba2V5LCBjb2x1bW5dKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5zZWFyY2hhYmxlID09IGZhbHNlO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAubWFwKChba2V5LCBjb2x1bW5dKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5vcmRlcktleT8udG9TdHJpbmcoKSB8fCBrZXkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgY29uc3QgZnVzZU9wdGlvbnMgPVxuICAgICAgICAgIG9wdGlvbnM/LmZ1c2VPcHRpb25zICYmIG5vblNlYXJjaGFibGVDb2x1bW5zS2V5c1xuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgLi4ub3B0aW9ucz8uZnVzZU9wdGlvbnMsXG4gICAgICAgICAgICAgICAga2V5czogb3B0aW9ucz8uZnVzZU9wdGlvbnM/LmtleXM/LmZpbHRlcihcbiAgICAgICAgICAgICAgICAgIGsgPT4gIW5vblNlYXJjaGFibGVDb2x1bW5zS2V5cy5pbmNsdWRlcyhrLnRvU3RyaW5nKCkpLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDogb3B0aW9ucz8uZnVzZU9wdGlvbnM7XG4gICAgICAgIGRhdGEgPSBhd2FpdCBmZXRjaERhdGFzZXQoKTtcbiAgICAgICAgZnVzZSA9IG5ldyBGdXNlKGRhdGEsIGZ1c2VPcHRpb25zKTtcbiAgICAgIH1cbiAgICAgIGlmIChcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAnc2VhcmNoQ29sdW1uc0NoYW5nZScgfHxcbiAgICAgICAgbW9zdFJlY2VudEFjdGlvbi50eXBlID09PSAndG9nZ2xlQWxsU2VhcmNoQ29sdW1ucydcbiAgICAgICkge1xuICAgICAgICBkYXRhID0gYXdhaXQgZmV0Y2hEYXRhc2V0KCk7XG4gICAgICAgIGZ1c2UgPSBuZXcgRnVzZShkYXRhLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucz8uZnVzZU9wdGlvbnMsXG4gICAgICAgICAga2V5czogQXJyYXkuZnJvbShxdWVyeS5zZWFyY2hDb2x1bW5zLmVudHJpZXMoKSlcbiAgICAgICAgICAgIC5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+ICEhdmFsdWUpXG4gICAgICAgICAgICAubWFwKChba2V5LCBfXSkgPT4ge1xuICAgICAgICAgICAgICBjb25zdCBjb2x1bW5LZXkgPSBjb2x1bW5zLmdldChrZXkpO1xuICAgICAgICAgICAgICByZXR1cm4gKGNvbHVtbktleT8ub3JkZXJLZXkgYXMgQykgfHwga2V5O1xuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3JkZXJDb2x1bW46IGtleW9mIFIgfCB1bmRlZmluZWQgPSBxdWVyeS5vcmRlclxuICAgICAgICA/IGNvbHVtbnMuZ2V0KHF1ZXJ5Lm9yZGVyLmNvbHVtbik/Lm9yZGVyS2V5XG4gICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgY29uc3QgaGFzRXhwbGljaXRTb3J0ID0gcXVlcnkub3JkZXIgIT0gbnVsbCAmJiBvcmRlckNvbHVtbiAhPT0gdW5kZWZpbmVkO1xuICAgICAgY29uc3QgZGVmYXVsdFNvcnRTcGVjID0gKCgpID0+IHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LmRlZmF1bHRTb3J0KSB7XG4gICAgICAgICAgY29uc3Qga2V5ID0gY29sdW1ucy5nZXQob3B0aW9ucy5kZWZhdWx0U29ydC5jb2x1bW4pPy5vcmRlcktleTtcbiAgICAgICAgICBpZiAoa2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiB7IGtleSwgZGlyZWN0aW9uOiBvcHRpb25zLmRlZmF1bHRTb3J0LmRpcmVjdGlvbiB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmaXJzdE9yZGVyYWJsZSA9IFsuLi5jb2x1bW5zLmVudHJpZXMoKV0uZmluZChcbiAgICAgICAgICAoWywgbWV0YV0pID0+IG1ldGEub3JkZXJLZXkgIT0gbnVsbCxcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3Qga2V5ID0gZmlyc3RPcmRlcmFibGU/LlsxXS5vcmRlcktleTtcbiAgICAgICAgcmV0dXJuIGtleSAhPT0gdW5kZWZpbmVkID8geyBrZXksIGRpcmVjdGlvbjogJ2FzYycgYXMgY29uc3QgfSA6IG51bGw7XG4gICAgICB9KSgpO1xuXG4gICAgICBsZXQgb3JkZXJlZDogUltdO1xuICAgICAgaWYgKHF1ZXJ5LnNlYXJjaCkge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gZnVzZS5zZWFyY2gocXVlcnkuc2VhcmNoKS5tYXAocmVzdWx0ID0+IHJlc3VsdC5pdGVtKTtcbiAgICAgICAgb3JkZXJlZCA9XG4gICAgICAgICAgaGFzRXhwbGljaXRTb3J0ICYmIHF1ZXJ5Lm9yZGVyXG4gICAgICAgICAgICA/IFRhYmxlT3JkZXJIZWxwZXJzLm9yZGVyRW1wdHlMYXN0KFxuICAgICAgICAgICAgICAgIG1hdGNoZXMsXG4gICAgICAgICAgICAgICAgb3JkZXJDb2x1bW4sXG4gICAgICAgICAgICAgICAgcXVlcnkub3JkZXIuZGlyZWN0aW9uLFxuICAgICAgICAgICAgICApXG4gICAgICAgICAgICA6IG1hdGNoZXM7XG4gICAgICB9IGVsc2UgaWYgKGhhc0V4cGxpY2l0U29ydCAmJiBxdWVyeS5vcmRlcikge1xuICAgICAgICBvcmRlcmVkID0gVGFibGVPcmRlckhlbHBlcnMub3JkZXJFbXB0eUxhc3QoXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICBvcmRlckNvbHVtbixcbiAgICAgICAgICBxdWVyeS5vcmRlci5kaXJlY3Rpb24sXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKHF1ZXJ5Lm9yZGVyID09IG51bGwgJiYgZGVmYXVsdFNvcnRTcGVjKSB7XG4gICAgICAgIG9yZGVyZWQgPSBUYWJsZU9yZGVySGVscGVycy5vcmRlckVtcHR5TGFzdChcbiAgICAgICAgICBkYXRhLFxuICAgICAgICAgIGRlZmF1bHRTb3J0U3BlYy5rZXksXG4gICAgICAgICAgZGVmYXVsdFNvcnRTcGVjLmRpcmVjdGlvbixcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9yZGVyZWQgPSBkYXRhO1xuICAgICAgfVxuICAgICAgY29uc3QgZmlsdGVyID0gb3B0aW9ucz8uZmlsdGVyO1xuICAgICAgY29uc3QgZmlsdGVyZWQgPSBmaWx0ZXJcbiAgICAgICAgPyBvcmRlcmVkLmZpbHRlcihyb3cgPT4gZmlsdGVyKHF1ZXJ5LmZpbHRlcnMsIHJvdykpXG4gICAgICAgIDogb3JkZXJlZDtcbiAgICAgIGNvbnN0IHN0YXJ0SWR4ID0gcXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZSAqIHF1ZXJ5LnBhZ2luYXRpb24ucGFnZTtcbiAgICAgIGNvbnN0IGVuZElkeCA9IHN0YXJ0SWR4ICsgcXVlcnkucGFnaW5hdGlvbi5wYWdlU2l6ZTtcbiAgICAgIGNvbnN0IHBhZ2luYXRlZCA9IGZpbHRlcmVkLnNsaWNlKHN0YXJ0SWR4LCBlbmRJZHgpO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY3VycmVudFBhZ2VEYXRhOiBwYWdpbmF0ZWQsXG4gICAgICAgIHRvdGFsTWF0Y2hpbmdSb3dDb3VudDogZmlsdGVyZWQubGVuZ3RoLFxuICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IGNvbHVtbk1ldGFkYXRhOiBNYXA8QywgQ29sdW1uTWV0YWRhdGE+ID0gbmV3IE1hcChcbiAgICAgIFsuLi5jb2x1bW5zLmVudHJpZXMoKV0ubWFwKChbbmFtZSwgbWV0YWRhdGFdKSA9PiBbXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHtcbiAgICAgICAgICBvcmRlcmFibGU6ICEhbWV0YWRhdGEub3JkZXJLZXksXG4gICAgICAgICAgZmlsdGVyYWJsZTogbWV0YWRhdGEuZmlsdGVyYWJsZSxcbiAgICAgICAgICBzZWFyY2hhYmxlOiBtZXRhZGF0YS5zZWFyY2hhYmxlLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBtZXRhZGF0YS5kZXNjcmlwdGlvbixcbiAgICAgICAgICBtaW5XaWR0aDogbWV0YWRhdGEubWluV2lkdGgsXG4gICAgICAgICAgZGF0YVR5cGU6IG1ldGFkYXRhLmRhdGFUeXBlLFxuICAgICAgICAgIGRlZmF1bHRQaW5uZWQ6IG1ldGFkYXRhLmRlZmF1bHRQaW5uZWQsXG4gICAgICAgICAgY2xpY2tQcmV2ZW50RGVmYXVsdDogbWV0YWRhdGEuY2xpY2tQcmV2ZW50RGVmYXVsdCxcbiAgICAgICAgICBjbGlja1N0b3BQcm9wYWdhdGlvbjogbWV0YWRhdGEuY2xpY2tTdG9wUHJvcGFnYXRpb24sXG4gICAgICAgICAgZGlzcGxheU5hbWU6IG1ldGFkYXRhLmRpc3BsYXlOYW1lLFxuICAgICAgICB9LFxuICAgICAgXSksXG4gICAgKTtcbiAgICAvLyBXaGVuIGEgZGVmYXVsdFNvcnQgaXMgc3BlY2lmaWVkLCBzZWVkIHRoZSBpbml0aWFsIHF1ZXJ5Lm9yZGVyIHNvIHRoZVxuICAgIC8vIHRhYmxlIGhlYWRlciBzaG93cyB0aGUgc29ydCBpbmRpY2F0b3IgZnJvbSB0aGUgc3RhcnQuXG4gICAgaWYgKG9wdGlvbnM/LmRlZmF1bHRTb3J0ICYmICFvcHRpb25zPy5pbml0aWFsU3RhdGU/LnF1ZXJ5Py5vcmRlcikge1xuICAgICAgY29uc3Qgb3JkZXI6IFF1ZXJ5PEMsIEY+WydvcmRlciddID0gb3B0aW9ucy5kZWZhdWx0U29ydDtcbiAgICAgIG9wdGlvbnMgPSB7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIGluaXRpYWxTdGF0ZToge1xuICAgICAgICAgIC4uLm9wdGlvbnMuaW5pdGlhbFN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5vcHRpb25zLmluaXRpYWxTdGF0ZT8ucXVlcnksXG4gICAgICAgICAgICBvcmRlcixcbiAgICAgICAgICB9IGFzIERlZXBQYXJ0aWFsPFF1ZXJ5PEMsIEY+PixcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBjcmVhdGVNYW5hZ2VyKHNvdXJjZSwgY29sdW1uTWV0YWRhdGEsIHBsdXJhbEVudGl0eU5hbWUsIG9wdGlvbnMpO1xuICB9XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBrZWVwcyB0aGUgc3RhdGUgb2JqZWN0IHJlZmVyZW5jZXMgYXMgc3RhYmxlIGFzIHBvc3NpYmxlLCB3aGljaFxuICogaGVscHMgQW5ndWxhciByZWR1Y2UgdW5uZWNlc3NhcnkgcmUtcmVuZGVycy4gRm9yIG5vdywgc2ltcGxlIGlzRXF1YWwoKVxuICogY2hlY2tzIGF0IHRoZSBzdGF0ZSdzIHRvcC1sZXZlbCBrZXlzIGFyZSBzdWZmaWNpZW50IHRvIGRyYW1hdGljYWxseSBzcGVlZCB1cFxuICogcmVuZGVyaW5nLCBidXQgaWYgb3RoZXIgcGVyZm9ybWFuY2UgaXNzdWVzIGFyaXNlLCB3ZSBjb3VsZCBpbXBsZW1lbnQgbW9yZVxuICogZ3JhbnVsYXIgY2hlY2tzL3N1cmdpY2FsIHVwZGF0ZXMgYXMgbmVlZGVkICh0aGUgc3RhdGUucmVzdWx0IGJlaW5nIHRoZSBtb3N0XG4gKiBsaWtlbHkgY2FuZGlkYXRlLCBzaW5jZSBtYW55IHR5cGVzIG9mIHN0YXRlIHVwZGF0ZXMgYWZmZWN0IHBhcnRzIG9mIHRoZVxuICogcmVzdWx0IHJvd3MpLlxuICovXG5mdW5jdGlvbiBzdGFibGVTdGF0ZTxcbiAgUiBleHRlbmRzIFJpdlRhYmxlLlJvdyxcbiAgQyBleHRlbmRzIFJpdlRhYmxlLkNvbHVtbixcbiAgRiBleHRlbmRzIFJpdlRhYmxlLkZpbHRlcnMsXG4gIEcgZXh0ZW5kcyBSaXZUYWJsZS5Hcm91cCxcbj4oXG4gIHRhcmdldDogUml2VGFibGUuRnVsbFN0YXRlPFIsIEMsIEYsIEc+LFxuICBzb3VyY2U6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPixcbik6IFJpdlRhYmxlLkZ1bGxTdGF0ZTxSLCBDLCBGLCBHPiB7XG4gIGlmICghaXNFcXVhbCh0YXJnZXQucXVlcnksIHNvdXJjZS5xdWVyeSkpIHtcbiAgICB0YXJnZXQucXVlcnkgPSBzb3VyY2UucXVlcnk7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHRhcmdldC5sb2FkLCBzb3VyY2UubG9hZCkpIHtcbiAgICB0YXJnZXQubG9hZCA9IHNvdXJjZS5sb2FkO1xuICB9XG5cbiAgaWYgKCFpc0VxdWFsKHRhcmdldC5yZXN1bHQuY3N2RGF0YSwgc291cmNlLnJlc3VsdC5jc3ZEYXRhKSkge1xuICAgIHRhcmdldC5yZXN1bHQuY3N2RGF0YSA9IHNvdXJjZS5yZXN1bHQuY3N2RGF0YTtcbiAgfVxuICBpZiAoIWlzRXF1YWwodGFyZ2V0LnJlc3VsdC5jc3ZGaWxlbmFtZSwgc291cmNlLnJlc3VsdC5jc3ZGaWxlbmFtZSkpIHtcbiAgICB0YXJnZXQucmVzdWx0LmNzdkZpbGVuYW1lID0gc291cmNlLnJlc3VsdC5jc3ZGaWxlbmFtZTtcbiAgfVxuICBpZiAoXG4gICAgIWlzRXF1YWwoXG4gICAgICB0YXJnZXQucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudCxcbiAgICAgIHNvdXJjZS5yZXN1bHQudG90YWxNYXRjaGluZ1Jvd0NvdW50LFxuICAgIClcbiAgKSB7XG4gICAgdGFyZ2V0LnJlc3VsdC50b3RhbE1hdGNoaW5nUm93Q291bnQgPSBzb3VyY2UucmVzdWx0LnRvdGFsTWF0Y2hpbmdSb3dDb3VudDtcbiAgfVxuICBpZiAoIWlzRXF1YWwodGFyZ2V0LnJlc3VsdCwgc291cmNlLnJlc3VsdCkpIHtcbiAgICB0YXJnZXQucmVzdWx0ID0gc291cmNlLnJlc3VsdDtcbiAgfVxuICBpZiAoIWlzRXF1YWwodGFyZ2V0LmRpc3BsYXksIHNvdXJjZS5kaXNwbGF5KSkge1xuICAgIHRhcmdldC5kaXNwbGF5ID0gc291cmNlLmRpc3BsYXk7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHRhcmdldC5zZWxlY3Rpb24sIHNvdXJjZS5zZWxlY3Rpb24pKSB7XG4gICAgdGFyZ2V0LnNlbGVjdGlvbiA9IHNvdXJjZS5zZWxlY3Rpb247XG4gIH1cbiAgcmV0dXJuIHRhcmdldDtcbn1cblxuYXN5bmMgZnVuY3Rpb24qIHJlZnJlc2hSZXN1bHRXaXRoPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgc291cmNlOiBSaXZUYWJsZS5Tb3VyY2U8UiwgQywgRiwgRz4sXG4gIG1vc3RSZWNlbnRBY3Rpb246IFJpdlRhYmxlLkFjdGlvbjxSLCBDLCBGLCBHPixcbik6IEFzeW5jR2VuZXJhdG9yPHtcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPjtcbiAgZWZmZWN0OiBSaXZUYWJsZS5FZmZlY3QgfCBudWxsO1xufT4ge1xuICB5aWVsZCB7XG4gICAgc3RhdGU6IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbG9hZDoge1xuICAgICAgICBsb2FkaW5nOiB0cnVlLFxuICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBlZmZlY3Q6IG51bGwsXG4gIH07XG4gIHRyeSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgc291cmNlKHN0YXRlLnF1ZXJ5LCBtb3N0UmVjZW50QWN0aW9uKTtcbiAgICBpZiAoVGFibGVQYWdpbmF0aW9uSGVscGVycy5pc1BhZ2VPdXRPZkJvdW5kcyhzdGF0ZSwgcmVzdWx0KSkge1xuICAgICAgc3RhdGUucXVlcnkucGFnaW5hdGlvbi5wYWdlID0gMDtcbiAgICB9XG4gICAgeWllbGQge1xuICAgICAgc3RhdGU6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcjogbnVsbCxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdWx0LFxuICAgICAgfSxcbiAgICAgIGVmZmVjdDogbnVsbCxcbiAgICB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgeWllbGQge1xuICAgICAgc3RhdGU6IHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGxvYWQ6IHtcbiAgICAgICAgICBsb2FkaW5nOiBmYWxzZSxcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBlZmZlY3Q6IG51bGwsXG4gICAgfTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiogcmVkdWNlPFxuICBSIGV4dGVuZHMgUml2VGFibGUuUm93LFxuICBDIGV4dGVuZHMgUml2VGFibGUuQ29sdW1uLFxuICBGIGV4dGVuZHMgUml2VGFibGUuRmlsdGVycyxcbiAgRyBleHRlbmRzIFJpdlRhYmxlLkdyb3VwLFxuPihcbiAgc3RhdGU6IFJpdlRhYmxlLkNvcmVTdGF0ZTxSLCBDLCBGLCBHPixcbiAgYWN0aW9uOiBSaXZUYWJsZS5BY3Rpb248UiwgQywgRiwgRz4sXG4gIGNvbHVtbnM6IE1hcDxDLCBSaXZUYWJsZS5Db2x1bW5NZXRhZGF0YT4sXG4gIHNvdXJjZTogUml2VGFibGUuU291cmNlPFIsIEMsIEYsIEc+LFxuICBjb2x1bW5OYW1lTWFwOiBSaXZUYWJsZS5Db2x1bW5OYW1lTWFwPEM+LFxuICBkZWZhdWx0Q29sdW1uU3RhdGU6IFJpdlRhYmxlLkNvbHVtblNldHRpbmdzPEM+W10sXG4pOiBBc3luY0dlbmVyYXRvcjx7XG4gIHN0YXRlOiBSaXZUYWJsZS5Db3JlU3RhdGU8UiwgQywgRiwgRz47XG4gIGVmZmVjdDogUml2VGFibGUuRWZmZWN0IHwgbnVsbDtcbn0+IHtcbiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICAgIGNhc2UgJ2xvYWQnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKHN0YXRlLCBzb3VyY2UsIGFjdGlvbik7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcmRlckNoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBvcmRlcjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdvcmRlckNvbHVtblRvZ2dsZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIFRhYmxlT3JkZXJIZWxwZXJzLnRvZ2dsZUNvbHVtbk9yZGVyKHN0YXRlLCBhY3Rpb24uY29sdW1uKSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VhcmNoQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHNlYXJjaDogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogbnVsbCxcbiAgICAgICAgICAgIG1vZGU6ICdpbmNsdWRlJyxcbiAgICAgICAgICAgIGluY2x1ZGVkOiBuZXcgU2V0KCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnc2VhcmNoQ29sdW1uc0NoYW5nZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBzZWFyY2hDb2x1bW5zOiBuZXcgTWFwKFtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkuc2VhcmNoQ29sdW1ucyxcbiAgICAgICAgICAgICAgLi4uYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgcGFnZTogMCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzZWxlY3Rpb246IHtcbiAgICAgICAgICAgIG1vc3RSZWNlbnRseVNlbGVjdGVkOiBudWxsLFxuICAgICAgICAgICAgbW9kZTogJ2luY2x1ZGUnLFxuICAgICAgICAgICAgaW5jbHVkZWQ6IG5ldyBTZXQoKSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwYWdpbmF0aW9uQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dyb3VwaW5nQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIGdyb3VwaW5nOiBhY3Rpb24ucGF5bG9hZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdwcmV2aW91c1BhZ2VOYXZpZ2F0ZSc6XG4gICAgICB5aWVsZCogcmVmcmVzaFJlc3VsdFdpdGgoXG4gICAgICAgIHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBxdWVyeToge1xuICAgICAgICAgICAgLi4uc3RhdGUucXVlcnksXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0UHJldmlvdXNQYWdlKHN0YXRlKSA/PyAwLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICduZXh0UGFnZU5hdmlnYXRlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIHBhZ2luYXRpb246IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkucGFnaW5hdGlvbixcbiAgICAgICAgICAgICAgcGFnZTpcbiAgICAgICAgICAgICAgICBUYWJsZVBhZ2luYXRpb25IZWxwZXJzLmdldE5leHRQYWdlKHN0YXRlKSA/P1xuICAgICAgICAgICAgICAgIFRhYmxlUGFnaW5hdGlvbkhlbHBlcnMuZ2V0UGFnZUNvdW50KHN0YXRlKSAtIDEsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3BhZ2VDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLFxuICAgICAgICAgICAgICBwYWdlOiBhY3Rpb24ucGFnZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncGFnZVNpemVDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgcGFnaW5hdGlvbjoge1xuICAgICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeS5wYWdpbmF0aW9uLFxuICAgICAgICAgICAgICBwYWdlU2l6ZTogYWN0aW9uLnNpemUsXG4gICAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2ZpbHRlcnNDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgZmlsdGVyczogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgICAgICBwYWdpbmF0aW9uOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LnBhZ2luYXRpb24sXG4gICAgICAgICAgICAgIHBhZ2U6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgc2VsZWN0aW9uOiB7XG4gICAgICAgICAgICBtb3N0UmVjZW50bHlTZWxlY3RlZDogbnVsbCxcbiAgICAgICAgICAgIG1vZGU6ICdpbmNsdWRlJyxcbiAgICAgICAgICAgIGluY2x1ZGVkOiBuZXcgU2V0KCksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZmlsdGVyQWRkJzpcbiAgICAgIC8vIFBhcmVudCBjb21wb25lbnQgaXMgcmVzcG9uc2libGUgZm9yIHN1YnNjcmliaW5nIGFuZCBhZGRpbmcgdGhlIGZpbHRlclxuICAgICAgeWllbGQgeyBzdGF0ZTogeyAuLi5zdGF0ZSB9LCBlZmZlY3Q6IG51bGwgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtblNldHRpbmdzQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBkaXNwbGF5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5kaXNwbGF5LFxuICAgICAgICAgICAgY29sdW1uU2V0dGluZ3M6IGFjdGlvbi5wYXlsb2FkLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8vIGRvIG5vdCBvdXRwdXQgY2hhbmdlcyB3aGVuIHRyaWdnZXJlZCBmcm9tIHRoZSBvdXRzaWRlIHdvcmxkXG4gICAgICAgIGVmZmVjdDogbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb2x1bW5QaW5DaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2x1bW5IZWxwZXJzLmNoYW5nZUNvbHVtblBpbihcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgYWN0aW9uLmNvbHVtbixcbiAgICAgICAgICBhY3Rpb24ucGlubmVkLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbnNGcmVlemVVcFRvQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5jaGFuZ2VDb2x1bW5zRnJlZXplU3RhdGUoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGFjdGlvbi5pbmRleCxcbiAgICAgICAgICBhY3Rpb24uZnJlZXplLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbk9yZGVyQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5jaGFuZ2VDb2x1bW5PcmRlcihcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgYWN0aW9uLnByZXZpb3VzSW5kZXgsXG4gICAgICAgICAgYWN0aW9uLm5ld0luZGV4LFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbk1vdmVUb0NoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZUNvbHVtbkhlbHBlcnMubW92ZUNvbHVtblRvKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBhY3Rpb24uY29sdW1uLFxuICAgICAgICAgIGFjdGlvbi5wb3NpdGlvbixcbiAgICAgICAgKSxcbiAgICAgICAgZWZmZWN0OiAnc2F2ZUNvbHVtblByZWZlcmVuY2VzJyxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb2x1bW5FbmFibGVkQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5jaGFuZ2VDb2x1bW5FbmFibGVkKFxuICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgIGNvbHVtbnMsXG4gICAgICAgICAgY29sdW1uTmFtZU1hcCxcbiAgICAgICAgICBhY3Rpb24uY29sdW1uLFxuICAgICAgICAgIGFjdGlvbi5lbmFibGVkLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2VuYWJsZUFsbENvbHVtbnNDaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVDb2x1bW5IZWxwZXJzLmVuYWJsZUFsbENvbHVtbnMoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGFjdGlvbi5lbmFibGVkLFxuICAgICAgICApLFxuICAgICAgICBlZmZlY3Q6ICdzYXZlQ29sdW1uUHJlZmVyZW5jZXMnLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2NvbHVtbldpZHRoQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5jaGFuZ2VDb2x1bW5XaWR0aChcbiAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICBjb2x1bW5zLFxuICAgICAgICAgIGNvbHVtbk5hbWVNYXAsXG4gICAgICAgICAgYWN0aW9uLmNvbHVtbixcbiAgICAgICAgICBhY3Rpb24ucHJlZmVycmVkV2lkdGgsXG4gICAgICAgICksXG4gICAgICAgIGVmZmVjdDogJ3NhdmVDb2x1bW5QcmVmZXJlbmNlcycsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAncmVzZXRUb0RlZmF1bHRDb2x1bW5zJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlQ29sdW1uSGVscGVycy5yZXNldFRvRGVmYXVsdENvbHVtbnMoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgY29sdW1ucyxcbiAgICAgICAgICBjb2x1bW5OYW1lTWFwLFxuICAgICAgICAgIGRlZmF1bHRDb2x1bW5TdGF0ZSxcbiAgICAgICAgKSxcbiAgICAgICAgZWZmZWN0OiAnc2F2ZUNvbHVtblByZWZlcmVuY2VzJyxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3Rpb25DaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZToge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHNlbGVjdGlvbjogYWN0aW9uLnBheWxvYWQsXG4gICAgICAgIH0sXG4gICAgICAgIGVmZmVjdDogbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdyb3dTZWxlY3RlZENoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuc2V0Um93U2VsZWN0ZWQoXG4gICAgICAgICAgc3RhdGUsXG4gICAgICAgICAgYWN0aW9uLmlkLFxuICAgICAgICAgIGFjdGlvbi5zZWxlY3RlZCxcbiAgICAgICAgICBhY3Rpb24uY29udGlndW91cyxcbiAgICAgICAgKSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3BhZ2VTZWxlY3RlZENoYW5nZSc6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMudG9nZ2xlUGFnZVNlbGVjdGVkKHN0YXRlKSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2FsbFNlbGVjdGVkQ2hhbmdlJzpcbiAgICAgIHlpZWxkIHtcbiAgICAgICAgc3RhdGU6IFRhYmxlU2VsZWN0aW9uSGVscGVycy50b2dnbGVBbGxTZWxlY3RlZChzdGF0ZSksXG4gICAgICAgIGVmZmVjdDogbnVsbCxcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICBjYXNlICdzZWxlY3Rpb25DbGVhcic6XG4gICAgICB5aWVsZCB7XG4gICAgICAgIHN0YXRlOiBUYWJsZVNlbGVjdGlvbkhlbHBlcnMuY2xlYXJTZWxlY3Rpb24oc3RhdGUpLFxuICAgICAgICBlZmZlY3Q6IG51bGwsXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnZ3JvdXBTZWxlY3Rpb25DaGFuZ2UnOlxuICAgICAgeWllbGQge1xuICAgICAgICBzdGF0ZTogVGFibGVTZWxlY3Rpb25IZWxwZXJzLnRvZ2dsZUdyb3VwU2VsZWN0ZWQoc3RhdGUsIGFjdGlvbi5wYXlsb2FkKSxcbiAgICAgICAgZWZmZWN0OiBudWxsLFxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ2dyb3Vwc1BlclBhZ2VDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgZ3JvdXBpbmc6IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkuZ3JvdXBpbmcsXG4gICAgICAgICAgICAgIGdyb3Vwc1BlclBhZ2U6IGFjdGlvbi5ncm91cHNQZXJQYWdlLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBzb3VyY2UsXG4gICAgICAgIGFjdGlvbixcbiAgICAgICk7XG4gICAgICBicmVhaztcbiAgICBjYXNlICdjb3VudFBlckdyb3VwQ2hhbmdlJzpcbiAgICAgIHlpZWxkKiByZWZyZXNoUmVzdWx0V2l0aChcbiAgICAgICAge1xuICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgIHF1ZXJ5OiB7XG4gICAgICAgICAgICAuLi5zdGF0ZS5xdWVyeSxcbiAgICAgICAgICAgIGdyb3VwaW5nOiB7XG4gICAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5Lmdyb3VwaW5nLFxuICAgICAgICAgICAgICBjb3VudFBlckdyb3VwOiBhY3Rpb24uY291bnRQZXJHcm91cCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlLFxuICAgICAgICBhY3Rpb24sXG4gICAgICApO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAndmlld01vcmVLZXlDaGFuZ2UnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgcXVlcnk6IHtcbiAgICAgICAgICAgIC4uLnN0YXRlLnF1ZXJ5LFxuICAgICAgICAgICAgZ3JvdXBpbmc6IHtcbiAgICAgICAgICAgICAgLi4uc3RhdGUucXVlcnkuZ3JvdXBpbmcsXG4gICAgICAgICAgICAgIHZpZXdNb3JlS2V5OiBhY3Rpb24udmlld01vcmVLZXksXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgJ3RvZ2dsZUFsbFNlYXJjaENvbHVtbnMnOlxuICAgICAgeWllbGQqIHJlZnJlc2hSZXN1bHRXaXRoKFxuICAgICAgICBUYWJsZVNlYXJjaEhlbHBlcnMudG9nZ2xlQWxsU2VhcmNoQ29sdW1ucyhzdGF0ZSksXG4gICAgICAgIHNvdXJjZSxcbiAgICAgICAgYWN0aW9uLFxuICAgICAgKTtcbiAgICAgIGJyZWFrO1xuICB9XG59XG4iXX0=