@esfaenza/es-table 14.2.0 → 14.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. package/esm2020/lib/components/es-table/es_table.component.loc.mjs +4 -4
  2. package/esm2020/lib/components/es-table/es_table.component.mjs +313 -116
  3. package/esm2020/lib/components/es-table-template/es_table_template.component.mjs +4 -4
  4. package/esm2020/lib/components/es-td/es_td.component.mjs +12 -56
  5. package/esm2020/lib/components/es-th/es_th.component.mjs +5 -5
  6. package/esm2020/lib/components/pager/table_pager.component.loc.mjs +4 -4
  7. package/esm2020/lib/components/pager/table_pager.component.mjs +4 -4
  8. package/esm2020/lib/components/pipes/est-format.pipe.mjs +44 -0
  9. package/esm2020/lib/components/pipes/est-lookup.pipe.mjs +19 -0
  10. package/esm2020/lib/components/pipes/est-renderer.pipe.mjs +36 -0
  11. package/esm2020/lib/components/pipes/est-routerlink.pipe.mjs +41 -0
  12. package/esm2020/lib/components/pipes/est_editor.pipe.mjs +36 -0
  13. package/esm2020/lib/core/CopyPasteDetector.mjs +8 -5
  14. package/esm2020/lib/core/Logger.mjs +26 -0
  15. package/esm2020/lib/core/handlers/ColumnMetadataHandler.mjs +46 -25
  16. package/esm2020/lib/core/handlers/DynamicModeHandler.mjs +80 -37
  17. package/esm2020/lib/core/handlers/ExportHandler.mjs +53 -23
  18. package/esm2020/lib/core/handlers/ReportModeHandler.mjs +6 -2
  19. package/esm2020/lib/core/handlers/SelectionHandler.mjs +54 -50
  20. package/esm2020/lib/core/handlers/UtilitiesHandler.mjs +5 -8
  21. package/esm2020/lib/directives/es_td.directive.mjs +18 -4
  22. package/esm2020/lib/directives/es_td_editor.directive.mjs +4 -4
  23. package/esm2020/lib/directives/es_th.directive.mjs +24 -4
  24. package/esm2020/lib/domain/configuration/EsTableDefaultable.mjs +1 -1
  25. package/esm2020/lib/domain/externals/EsTableColumnsDefinition.mjs +9 -4
  26. package/esm2020/lib/domain/externals/ItemPropEditableReference.mjs +1 -1
  27. package/esm2020/lib/domain/externals/appsearch/AppSearch.mjs +2 -1
  28. package/esm2020/lib/domain/externals/report/ReportColumn.mjs +1 -1
  29. package/esm2020/lib/domain/externals/report/ReportRow.mjs +1 -1
  30. package/esm2020/lib/domain/internals/EsTableColumn.mjs +2 -2
  31. package/esm2020/lib/domain/internals/PagerInfos.mjs +15 -0
  32. package/esm2020/lib/domain/internals/TdElement.mjs +1 -1
  33. package/esm2020/lib/domain/internals/ThElement.mjs +1 -1
  34. package/esm2020/lib/domain/internals/ThGroup.mjs +2 -0
  35. package/esm2020/lib/es-table.module.mjs +74 -39
  36. package/fesm2015/esfaenza-es-table.mjs +903 -382
  37. package/fesm2015/esfaenza-es-table.mjs.map +1 -1
  38. package/fesm2020/esfaenza-es-table.mjs +892 -376
  39. package/fesm2020/esfaenza-es-table.mjs.map +1 -1
  40. package/lib/components/es-table/es_table.component.d.ts +91 -71
  41. package/lib/components/es-td/es_td.component.d.ts +7 -35
  42. package/lib/components/pipes/est-format.pipe.d.ts +10 -0
  43. package/lib/components/pipes/est-lookup.pipe.d.ts +13 -0
  44. package/lib/components/pipes/est-renderer.pipe.d.ts +15 -0
  45. package/lib/components/pipes/est-routerlink.pipe.d.ts +20 -0
  46. package/lib/components/pipes/est_editor.pipe.d.ts +15 -0
  47. package/lib/core/CopyPasteDetector.d.ts +2 -0
  48. package/lib/core/Logger.d.ts +10 -0
  49. package/lib/core/handlers/ColumnMetadataHandler.d.ts +1 -0
  50. package/lib/core/handlers/DynamicModeHandler.d.ts +13 -23
  51. package/lib/core/handlers/ExportHandler.d.ts +4 -0
  52. package/lib/core/handlers/SelectionHandler.d.ts +16 -3
  53. package/lib/core/handlers/UtilitiesHandler.d.ts +4 -1
  54. package/lib/directives/es_td.directive.d.ts +15 -1
  55. package/lib/directives/es_th.directive.d.ts +32 -1
  56. package/lib/domain/configuration/EsTableDefaultable.d.ts +1 -0
  57. package/lib/domain/externals/EsTableColumnsDefinition.d.ts +11 -8
  58. package/lib/domain/externals/ItemPropEditableReference.d.ts +4 -0
  59. package/lib/domain/externals/report/ReportColumn.d.ts +4 -0
  60. package/lib/domain/externals/report/ReportRow.d.ts +4 -0
  61. package/lib/domain/internals/EsTableColumn.d.ts +3 -1
  62. package/lib/domain/internals/PagerInfos.d.ts +13 -0
  63. package/lib/domain/internals/TdElement.d.ts +8 -0
  64. package/lib/domain/internals/ThElement.d.ts +1 -0
  65. package/lib/domain/internals/ThGroup.d.ts +10 -0
  66. package/lib/es-table.module.d.ts +26 -22
  67. package/package.json +12 -14
@@ -98,6 +98,10 @@ export class SelectionHandler {
98
98
  let mydate = this.est.dateExts.getDateConvertion(value);
99
99
  valToApply = `${mydate.hour()}:${mydate.minute()}:${mydate.second()}`;
100
100
  break;
101
+ // Per evitare di sbiancare senza senso
102
+ default:
103
+ valToApply = value;
104
+ break;
101
105
  }
102
106
  item.properties[th.PropertyName] = valToApply;
103
107
  iper.value = valToApply;
@@ -143,6 +147,10 @@ export class SelectionHandler {
143
147
  let mydate = this.est.dateExts.getDateConvertion(value);
144
148
  valToApply = `${mydate.hour()}:${mydate.minute()}:${mydate.second()}`;
145
149
  break;
150
+ // Per evitare di sbiancare senza senso
151
+ default:
152
+ valToApply = value;
153
+ break;
146
154
  }
147
155
  item[th.thProperty] = valToApply;
148
156
  iper.value = valToApply;
@@ -639,65 +647,61 @@ export class SelectionHandler {
639
647
  * @param {{ row: number, column: number }} firstSelectionOverride Permette di overridare il primo elemento selezionato
640
648
  */
641
649
  singleCellSelection(event, row, column, firstSelectionOverride) {
650
+ // Recupero la selezione precedente se presente come punto di partenza
642
651
  var first = firstSelectionOverride || this.lastSingleSelection;
652
+ //Il punto di arrivo, che diventerà il prossimo punto di partenza, è la selezione corrente
653
+ this.lastSingleSelection = { row, column };
643
654
  this.clearTextSelection(event);
644
- // Nella selezione a range chissene frega se c'è o meno lo shift, si ragiona sempre a range
645
- if (event.shiftKey && first) {
646
- this.clearSelectionStatus({ row, column });
647
- let rowAddition = row < first.row ? -1 : +1;
648
- let columnAddition = column < first.column ? -1 : +1;
649
- for (let ir = first.row; ir != row + rowAddition; ir += rowAddition) {
650
- let firstRow = ir == first.row;
651
- let lastRow = ir == row;
652
- for (let ic = first.column; ic != column + columnAddition; ic += columnAddition) {
653
- let firstCol = ic == first.column;
654
- let lastCol = ic == column;
655
- this.est.selectionStatus[ir][ic].selected = true;
656
- this.est.selectionStatus[ir][ic].lborder = columnAddition > 0 ? firstCol : lastCol;
657
- if (ic > 0)
658
- this.est.selectionStatus[ir][ic - 1].roverlaps = this.est.selectionStatus[ir][ic].lborder;
659
- this.est.selectionStatus[ir][ic].tborder = rowAddition > 0 ? firstRow : lastRow;
660
- this.est.selectionStatus[ir][ic].rborder = columnAddition > 0 ? lastCol : firstCol;
661
- if (this.est.selectionStatus[ir][ic + 1])
662
- this.est.selectionStatus[ir][ic + 1].loverlaps = this.est.selectionStatus[ir][ic].rborder;
663
- this.est.selectionStatus[ir][ic].bborder = rowAddition > 0 ? lastRow : firstRow;
664
- }
665
- }
666
- this.lastSingleSelection = { row, column };
667
- }
668
- else {
669
- // Ripulisco escludendo l'oggetto attuale che eventualmente ci penso io a deseezionare
670
- this.clearSelectionStatus({ row, column });
671
- let item = this.est.selectionStatus[row][column];
672
- item.selected = !item.selected;
673
- item.lborder = item.selected;
674
- if (column > 0)
675
- this.est.selectionStatus[row][column - 1].roverlaps = item.lborder;
676
- item.tborder = item.selected;
677
- item.rborder = item.selected;
678
- if (this.est.selectionStatus[row][column + 1])
679
- this.est.selectionStatus[row][column + 1].loverlaps = item.rborder;
680
- item.bborder = item.selected;
681
- this.lastSingleSelection = { row, column };
682
- }
655
+ this.clearSelectionStatusExcluding(this.lastSingleSelection);
656
+ this.setSelectionStatusBorders(event.range && first ? first : this.lastSingleSelection, this.lastSingleSelection);
683
657
  // Ora che non è attaccato direttamente all'html devo fare un markforcheck finite le operazioni sui grouping
684
658
  this.est.cdr.markForCheck();
685
659
  }
660
+ setSelectionStatusBorders(from, to) {
661
+ let rowAddition = to.row < from.row ? -1 : +1;
662
+ let columnAddition = to.column < from.column ? -1 : +1;
663
+ let singleItem = from == to;
664
+ for (let ir = from.row; ir != to.row + rowAddition; ir += rowAddition) {
665
+ let firstRow = ir == from.row;
666
+ let lastRow = ir == to.row;
667
+ for (let ic = from.column; ic != to.column + columnAddition; ic += columnAddition) {
668
+ let firstCol = ic == from.column;
669
+ let lastCol = ic == to.column;
670
+ let current = this.est.selectionStatus[ir][ic];
671
+ let prevColumn = ic > 0 ? this.est.selectionStatus[ir][ic - 1] : null;
672
+ let nextcolumn = this.est.selectionStatus[ir][ic + 1];
673
+ let prevRow = ir > 0 ? this.est.selectionStatus[ir - 1][ic] : null;
674
+ let nextRow = this.est.selectionStatus[ir + 1] ? this.est.selectionStatus[ir + 1][ic] : null;
675
+ current.selected = singleItem ? !current.selected : true;
676
+ current.lborder = !current.selected ? false : columnAddition > 0 ? firstCol : lastCol;
677
+ current.tborder = !current.selected ? false : rowAddition > 0 ? firstRow : lastRow;
678
+ current.rborder = !current.selected ? false : columnAddition > 0 ? lastCol : firstCol;
679
+ current.bborder = !current.selected ? false : rowAddition > 0 ? lastRow : firstRow;
680
+ if (prevRow)
681
+ prevRow.boverlaps = current.tborder;
682
+ if (nextRow)
683
+ nextRow.toverlaps = current.bborder;
684
+ if (prevColumn)
685
+ prevColumn.roverlaps = current.lborder;
686
+ if (nextcolumn)
687
+ nextcolumn.loverlaps = current.rborder;
688
+ }
689
+ }
690
+ }
686
691
  /**
687
692
  * Helper per ripulire lo stato di selezione delle singole celle della tabella, ad esclusione di una singola coordinata
688
693
  *
689
694
  * @param {{row: number, column: number}} exclusion Coordinata da escludere nella pulizia
690
695
  */
691
- clearSelectionStatus(exclusion) {
696
+ clearSelectionStatusExcluding(exclusion) {
692
697
  for (let row in this.est.selectionStatus) {
693
698
  for (let column in this.est.selectionStatus[row]) {
694
- if (!exclusion || (exclusion && (row != exclusion.row.toString() || column != exclusion.column.toString()))) {
695
- this.est.selectionStatus[row][column].selected = false;
696
- this.est.selectionStatus[row][column].lborder = false;
697
- this.est.selectionStatus[row][column].tborder = false;
698
- this.est.selectionStatus[row][column].rborder = false;
699
- this.est.selectionStatus[row][column].bborder = false;
700
- }
699
+ // Se è l'elemento che ho escluso dal cleanup, skippo
700
+ if (exclusion && row == exclusion.row.toString() && column == exclusion.column.toString())
701
+ continue;
702
+ // Altrimenti pulisco
703
+ let curr = this.est.selectionStatus[row][column];
704
+ curr.selected = curr.lborder = curr.rborder = curr.tborder = curr.bborder = curr.loverlaps = curr.roverlaps = curr.toverlaps = curr.boverlaps = false;
701
705
  }
702
706
  }
703
707
  }
@@ -727,10 +731,10 @@ export class SelectionHandler {
727
731
  */
728
732
  clearTextSelection(event) {
729
733
  // Seleziono del testo ma non ho shift premuto -> ignoro la selezione
730
- if ((event.view.getSelection().type == 'Range' || event.view.getSelection().toString().length > 0) && !event.shiftKey)
734
+ if ((event.view.getSelection().type == 'Range' || event.view.getSelection().toString().length > 0) && !event.range)
731
735
  return false;
732
736
  // Seleziono del testo e ho shift premuto -> annullo la selezione del testo
733
- if ((event.view.getSelection().type == 'Range' || event.view.getSelection().toString().length > 0) && event.shiftKey)
737
+ if ((event.view.getSelection().type == 'Range' || event.view.getSelection().toString().length > 0) && event.range)
734
738
  this.est.utiExts.clearTextSelection();
735
739
  }
736
740
  /**
@@ -783,4 +787,4 @@ export class SelectionHandler {
783
787
  }
784
788
  }
785
789
  }
786
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0aW9uSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLXRhYmxlL3NyYy9saWIvY29yZS9oYW5kbGVycy9TZWxlY3Rpb25IYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQW9CbkUscURBQXFEO0FBQ3JELE1BQU0sT0FBTyxnQkFBZ0I7SUF1QnpCLDBCQUEwQjtJQUMxQixZQUFvQixHQUFxQixFQUFVLFNBQTZCO1FBQTVELFFBQUcsR0FBSCxHQUFHLENBQWtCO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBb0I7UUF0QmhGLCtIQUErSDtRQUN2SCxlQUFVLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakQsaUlBQWlJO1FBQ3pILGdCQUFXLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbEQscUlBQXFJO1FBQzdILG9CQUFlLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEQsMklBQTJJO1FBQ25JLDBCQUFxQixHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTVELGlJQUFpSTtRQUN6SCxpQkFBWSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RELG1JQUFtSTtRQUMzSCxrQkFBYSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZELHVJQUF1STtRQUMvSCxzQkFBaUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMzRCw2SUFBNkk7UUFDckksNEJBQXVCLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNbUIsQ0FBQztJQUVyRixzQ0FBc0M7SUFDL0Isb0JBQW9CO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUVuQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDM0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUN6QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxpQkFBaUIsQ0FBQyxLQUFZLEVBQUUsYUFBa0M7UUFDckUsSUFBSSxDQUFDLGFBQWE7WUFDZCxPQUFPO1FBRVgsSUFBSSxDQUFDLHlCQUF5QixDQUFDLEtBQUssRUFBRSxhQUFhLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSwyQkFBMkIsQ0FBQyxLQUFZLEVBQUUsR0FBb0IsRUFBRSxHQUErQjtRQUNsRyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxrSkFBa0o7WUFDbEosSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUNqRCxJQUFJLEdBQUcsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLENBQUM7Z0JBQ3JCLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7O2dCQUV4RCxJQUFJLENBQUMsMEJBQTBCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBRXREO0lBQ0wsQ0FBQztJQUVELGNBQWM7SUFDTixtQ0FBbUMsQ0FBQyxJQUFTLEVBQUUsR0FBK0I7UUFDbEYsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLElBQUksSUFBSSxHQUE4QixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsRUFBRSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUM7WUFDbk8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQztZQUVsRCxzSEFBc0g7WUFDdEgsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLEtBQWEsRUFBTyxFQUFFO2dCQUNyQyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksRUFBRTtvQkFDbEIsSUFBSSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxLQUFLLENBQUM7b0JBQzlCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO29CQUNuQixPQUFPLEtBQUssQ0FBQztpQkFDaEI7Z0JBRUQsSUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUNwQixRQUFRLEVBQUUsQ0FBQyxZQUFZLEVBQUU7b0JBQ3JCLEtBQUssUUFBUTt3QkFDVCxJQUFJLEtBQUssQ0FBQyxVQUFVLElBQUksS0FBSyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDOzRCQUNsRixVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzs7NEJBRWxELFVBQVUsR0FBRyxLQUFLLENBQUM7d0JBQ3ZCLE1BQU07b0JBRVYsS0FBSyxRQUFRLENBQUM7b0JBQ2QsS0FBSyxLQUFLLENBQUM7b0JBQ1gsS0FBSyxTQUFTLENBQUM7b0JBQ2YsS0FBSyxNQUFNLENBQUM7b0JBQ1osS0FBSyxjQUFjLENBQUM7b0JBQ3BCLEtBQUssT0FBTyxDQUFDO29CQUNiLEtBQUssVUFBVTt3QkFDWCxVQUFVLEdBQUcsS0FBSyxDQUFDO3dCQUNuQixNQUFNO29CQUVWLEtBQUssTUFBTSxDQUFDO29CQUNaLEtBQUssVUFBVTt3QkFDWCxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3hELE1BQU07b0JBQ1YsS0FBSyxNQUFNO3dCQUNQLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN4RCxVQUFVLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFBO3dCQUNyRSxNQUFNO2lCQUNiO2dCQUNELElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLFVBQVUsQ0FBQztnQkFDOUMsSUFBSSxDQUFDLEtBQUssR0FBRyxVQUFVLENBQUM7Z0JBQ3hCLE9BQU8sVUFBVSxDQUFDO1lBQ3RCLENBQUMsQ0FBQTtTQUNKO0lBQ0wsQ0FBQztJQUVELGNBQWM7SUFDTiwwQkFBMEIsQ0FBQyxJQUFTLEVBQUUsR0FBb0I7UUFDOUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDakMsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hCLElBQUksSUFBSSxHQUE4QixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLG9CQUFvQixFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFLENBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQztZQUNsTSxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO1lBRWxELHNIQUFzSDtZQUN0SCxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsS0FBYSxFQUFPLEVBQUU7Z0JBQ3JDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxFQUFFO29CQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEtBQUssQ0FBQztvQkFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7b0JBQ25CLE9BQU8sS0FBSyxDQUFDO2lCQUNoQjtnQkFFRCxJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ3BCLFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRTtvQkFDZixLQUFLLFFBQVE7d0JBQ1QsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDOzRCQUM1QyxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQzs7NEJBRWxELFVBQVUsR0FBRyxLQUFLLENBQUM7d0JBQ3ZCLE1BQU07b0JBRVYsS0FBSyxRQUFRLENBQUM7b0JBQ2QsS0FBSyxLQUFLLENBQUM7b0JBQ1gsS0FBSyxTQUFTLENBQUM7b0JBQ2YsS0FBSyxNQUFNLENBQUM7b0JBQ1osS0FBSyxjQUFjLENBQUM7b0JBQ3BCLEtBQUssT0FBTyxDQUFDO29CQUNiLEtBQUssVUFBVTt3QkFDWCxVQUFVLEdBQUcsS0FBSyxDQUFDO3dCQUNuQixNQUFNO29CQUVWLEtBQUssTUFBTSxDQUFDO29CQUNaLEtBQUssVUFBVTt3QkFDWCxVQUFVLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3hELE1BQU07b0JBQ1YsS0FBSyxNQUFNO3dCQUNQLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUN4RCxVQUFVLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFBO3dCQUNyRSxNQUFNO2lCQUNiO2dCQUNELElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsVUFBVSxDQUFDO2dCQUNqQyxJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQztnQkFDeEIsT0FBTyxVQUFVLENBQUM7WUFDdEIsQ0FBQyxDQUFBO1NBQ0o7SUFDTCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSyx5QkFBeUIsQ0FBQyxLQUFZLEVBQUUsYUFBa0M7UUFDOUUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25CLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7WUFDckIsSUFBSSxTQUFTLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzNELHdHQUF3RztZQUN4RyxzRkFBc0Y7WUFDdEYsSUFBSSxDQUFDLGNBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUV6QixJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUU7Z0JBQ1gsSUFBSSxhQUFhLENBQUMsR0FBRztvQkFDakIsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQzs7b0JBRWpMLEdBQUcsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDek87aUJBQ0ksSUFBSSxHQUFHLENBQUMsTUFBTSxFQUFFO2dCQUNqQixJQUFJLGFBQWEsQ0FBQyxHQUFHO29CQUNqQixHQUFHLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDOztvQkFFbEcsR0FBRyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7YUFDekk7U0FDSjtRQUVELHFHQUFxRztRQUNyRyxvSEFBb0g7UUFDcEgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEksSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztRQUVuRyx3SEFBd0g7UUFDeEgsb0RBQW9EO1FBQ3BELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUU7WUFDcEIsSUFBSSxZQUFZLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDNUMsSUFBSSxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ2xELElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLElBQUksWUFBWTtnQkFDeEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7U0FDdkQ7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLGNBQWMsQ0FBQyxJQUFTO1FBQzVCLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckIsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRW5DLElBQUksSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDbkMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFOUMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUM7WUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRXBDLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQzdCLElBQUksQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ssZ0JBQWdCLENBQUMsR0FBUTtRQUM3QixJQUFJLENBQUMsR0FBRztZQUNKLE9BQU8sTUFBTSxDQUFDO1FBRWxCLElBQUksV0FBVyxHQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFcEUsSUFBSSxDQUFDLFdBQVc7WUFDWixPQUFPLE1BQU0sQ0FBQztRQUVsQixJQUFJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQztZQUNqRCxPQUFPLFVBQVUsQ0FBQztRQUV0QixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUM7WUFDdkMsT0FBTyxVQUFVLENBQUM7UUFFdEIsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUdEOzs7Ozs7Ozs7O09BVUc7SUFDSSxvQkFBb0IsQ0FBQyxLQUFZLEVBQUUsWUFBcUIsSUFBSSxFQUFFLGNBQXVCLElBQUk7UUFDNUYsSUFBSSxFQUFFLEdBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUF1QixFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDO1FBRXJGLDRIQUE0SDtRQUM1SCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFO1lBQ3RFLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksU0FBUyxJQUFJLElBQUk7Z0JBQ3JDLE1BQU0sd0ZBQXdGLENBQUM7WUFFbkcsSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO2dCQUN4QyxFQUFFLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztnQkFDekYsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7YUFDN0I7U0FDSjtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ25DLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwQixJQUFJLFFBQVEsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBRXRJLDRHQUE0RztZQUM1RyxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO2dCQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUM7WUFFMUUsb0tBQW9LO1lBQ3BLLElBQUksQ0FBQyxRQUFRLElBQUksV0FBVyxJQUFJLElBQUk7Z0JBQ2hDLFNBQVM7WUFFYixJQUFJLFlBQVksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDO1lBQzFCLElBQUksT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7WUFDMUIsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUNqQyxJQUFJLFNBQVMsR0FBRyxJQUFJLEVBQUUsUUFBUSxHQUFHLElBQUksRUFBRSxhQUFhLEdBQUcsSUFBSSxFQUFFLGVBQWUsR0FBRyxJQUFJLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxjQUFjLEdBQUcsSUFBSSxFQUFFLGdCQUFnQixHQUFHLElBQUksRUFBRSxtQkFBbUIsR0FBRyxJQUFJLEVBQUUscUJBQXFCLEdBQUcsSUFBSSxDQUFDO1lBRWhOLElBQUksT0FBTyxFQUFFO2dCQUNULElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsbUJBQW1CLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQztnQkFDeEMscUJBQXFCLEdBQUcsR0FBRyxJQUFJLFVBQVUsQ0FBQztnQkFDMUMsUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ3BELGFBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFDekUsZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUM3RSxTQUFTLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO2dCQUMzRCxjQUFjLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQztnQkFDakYsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQzthQUN4RjtpQkFDSTtnQkFDRCxTQUFTLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDcEMsbUJBQW1CLEdBQUcsU0FBUyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO2dCQUNyRSxxQkFBcUIsR0FBRyxTQUFTLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQzthQUMzRTtZQUVELElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWE7Z0JBQ3ZCLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLGFBQWEsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUscUJBQXFCLENBQUMsQ0FBQzs7Z0JBRWpOLElBQUksQ0FBQyxnQ0FBZ0MsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1NBQzdJO1FBRUQsb0ZBQW9GO1FBQ3BGLGtGQUFrRjtRQUNsRixJQUFJLFdBQVcsSUFBSSxJQUFJO1lBQ25CLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBGLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUV2QyxPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssZ0NBQWdDLENBQUMsSUFBeUIsRUFBRSxJQUFTLEVBQUUsS0FBYyxFQUFFLEdBQVksRUFBRSxTQUFjLEVBQUUsT0FBYyxFQUFFLFNBQWdCLEVBQUUsUUFBZSxFQUFFLFFBQWU7UUFDM0wsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFaEQsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLEdBQUcsRUFBRTtnQkFDTCxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsSUFBSSxTQUFTO29CQUNULFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFBLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdkY7aUJBQ0k7Z0JBQ0QsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xELElBQUksT0FBTztvQkFDUCxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3pGO1NBQ0o7YUFDSTtZQUNELElBQUksR0FBRyxFQUFFO2dCQUNMLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDO2dCQUNoQyxJQUFJLFNBQVMsSUFBSSxRQUFRLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7b0JBQ3pELElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7YUFDbkM7aUJBQ0k7Z0JBQ0QsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7Z0JBQ25DLElBQUksU0FBUztvQkFDVCxTQUFTLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQzthQUNuQztTQUNKO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDSyxXQUFXLENBQUMsS0FBVTtRQUMxQixLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLElBQUksTUFBTSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1lBQ3BGLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssMEJBQTBCLENBQUMsSUFBeUIsRUFBRSxJQUFTLEVBQUUsR0FBWSxFQUFFLEtBQWMsRUFBRSxHQUFZLEVBQUUsT0FBYyxFQUFFLE9BQWMsRUFBRSxTQUFnQixFQUFFLFNBQWdCLEVBQUUsUUFBZSxFQUFFLFFBQWUsRUFBRSxXQUFvQixFQUFFLFdBQW9CO1FBQ2pRLElBQUksWUFBWSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2xELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hELElBQUksV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JELElBQUksY0FBYyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFOUQsSUFBSSxLQUFLLEVBQUU7WUFDUCxJQUFJLEdBQUcsRUFBRTtnQkFDTCxJQUFJLEdBQUcsSUFBSSxXQUFXO29CQUNsQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsQ0FBQzs7b0JBRXRDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO2dCQUVyQyxJQUFJLE9BQU87b0JBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3JFLElBQUksT0FBTztvQkFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDdEUsSUFBSSxRQUFRO29CQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pHLElBQUksUUFBUTtvQkFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3ZHO2lCQUNJO2dCQUNELElBQUksR0FBRyxJQUFJLFdBQVc7b0JBQ2xCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLGNBQWMsQ0FBQyxDQUFDOztvQkFFbkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7Z0JBRXhDLElBQUksU0FBUztvQkFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDekUsSUFBSSxTQUFTO29CQUFFLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO2dCQUN6RSxJQUFJLFFBQVE7b0JBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEcsSUFBSSxRQUFRO29CQUFFLFFBQVEsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDdEc7U0FDSjthQUNJO1lBQ0QsSUFBSSxHQUFHLEVBQUU7Z0JBQ0wsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLElBQUksV0FBVztvQkFDM0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7O29CQUVuQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQzthQUN2QztpQkFDSTtnQkFDRCxJQUFJLFdBQVcsSUFBSSxDQUFDLENBQUMsR0FBRyxJQUFJLFdBQVcsSUFBSSxJQUFJLENBQUM7b0JBQzVDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDOztvQkFFbkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLENBQUM7YUFDdkM7U0FDSjtJQUNMLENBQUM7SUFFRCw4RkFBOEY7SUFDdEYsVUFBVSxDQUFDLElBQVMsRUFBRSxPQUFzQjtRQUNoRCxJQUFJLEtBQUssR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ2pDLE9BQU8sQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUN2QyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQztTQUMvQjtRQUVELE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNuQixDQUFDO0lBRUQsK0ZBQStGO0lBQ3ZGLE9BQU8sQ0FBQyxJQUFTLEVBQUUsT0FBc0I7UUFDN0MsSUFBSSxPQUFPLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQzdDLElBQUksQ0FBQyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNyQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3BDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdkMsT0FBTyxJQUFJLENBQUM7U0FDZjtRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssVUFBVSxDQUFDLE9BQTJELEVBQUUsSUFBeUI7UUFDckcsUUFBUSxPQUFPLEVBQUU7WUFDYixLQUFLLE9BQU87Z0JBQ1IsT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQy9FLEtBQUssTUFBTTtnQkFDUCxPQUFPLElBQUksWUFBWSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDNUUsS0FBSyxpQkFBaUI7Z0JBQ2xCLE9BQU8sSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLHFCQUFxQixFQUFFLElBQUksQ0FBQyx1QkFBdUIsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUM3RyxLQUFLLFdBQVc7Z0JBQ1osT0FBTyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDOUY7SUFDTCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLFlBQVksQ0FBQyxJQUFTO1FBQzFCLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7UUFDM0QsSUFBSSxNQUFNO1lBQ04sT0FBTyxNQUFNLENBQUM7UUFFbEIsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ssYUFBYSxDQUFDLEdBQXdCLEVBQUUsS0FBVSxFQUFFLE1BQWtDLEVBQUUsWUFBcUIsS0FBSyxFQUFFLFVBQWlCLElBQUk7UUFDN0ksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBRWYsSUFBSSxPQUFPO1lBQ1AsS0FBSyxHQUFHLE9BQU8sQ0FBQzthQUNmO1lBQ0QsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsK0VBQStFO2dCQUMvRSxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRTtvQkFDN0MsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7d0JBQzlCLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQzthQUM5RDs7Z0JBRUcsS0FBSyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDOUQ7UUFFRCxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxNQUFNLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksTUFBTSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFeEgsaUdBQWlHO1FBQ2pHLHlIQUF5SDtRQUN6SCxJQUFJLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUztZQUMvQyxPQUFPLEtBQUssQ0FBQztRQUVqQixJQUFJLE1BQU0sSUFBSSxZQUFZO1lBQ3RCLEtBQUssR0FBRyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJO2dCQUN4QyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDNUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN6RCxJQUFJLE1BQU0sSUFBSSxVQUFVO1lBQ3pCLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJO2dCQUNuQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQztnQkFDNUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU5RCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ssY0FBYyxDQUFDLEtBQVU7UUFDN0IsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMzRCxJQUFJLE1BQU07WUFDTixPQUFPLE1BQU0sQ0FBQztRQUVsQixPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSyxtQkFBbUIsQ0FBQyxHQUF3QixFQUFFLEtBQVUsRUFBRSxNQUFrQyxFQUFFLFlBQXFCLEtBQUssRUFBRSxVQUFpQixJQUFJO1FBQ25KLElBQUksU0FBUyxHQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDckUsSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBRWYsSUFBSSxPQUFPO1lBQ1AsS0FBSyxHQUFHLE9BQU8sQ0FBQzthQUNmO1lBQ0QsSUFBSSxTQUFTLEVBQUU7Z0JBQ1gsK0VBQStFO2dCQUMvRSxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFO29CQUNwRCxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQzt3QkFDOUIsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDckU7O2dCQUVHLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDckU7UUFFRCxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQyxDQUFDLFNBQVMsSUFBSSxNQUFNLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksTUFBTSxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFFeEgsK0ZBQStGO1FBQy9GLElBQUksS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ3pCLE9BQU8sS0FBSyxDQUFDO1FBRWpCLElBQUksTUFBTSxJQUFJLFlBQVk7WUFDdEIsS0FBSyxHQUFHLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FDekQsQ0FBQyxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSxTQUFTLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNqSCxDQUFDLFNBQVMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O1lBRTNELEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUMvQyxDQUFDLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ2pILENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUUvRCxPQUFPLEtBQUssQ0FBQztJQUNqQixDQUFDO0lBRUQsNkVBQTZFO0lBQ3JFLDZCQUE2QixDQUFDLGFBQWtDO1FBQ3BFLDZGQUE2RjtRQUM3RixJQUFJLE1BQU0sR0FBRyxFQUFFLEVBQUUsUUFBUSxHQUFHLEVBQUUsRUFBRSxPQUFPLEdBQUcsRUFBRSxFQUFFLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDOUQsSUFBSSxVQUFVLEdBQUcsS0FBSyxFQUFFLFlBQVksR0FBRyxLQUFLLEVBQUUsV0FBVyxHQUFHLEtBQUssRUFBRSxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBRTFGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDL0MsSUFBSSxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUk7Z0JBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUNyRSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRTdCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxhQUFhLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUU7WUFDcEQsSUFBSSxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUk7Z0JBQUUsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O2dCQUM5RSxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBRTVCLHNIQUFzSDtRQUN0SCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUU7WUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRTtnQkFDaEQsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUk7b0JBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUNyRSxVQUFVLEdBQUcsSUFBSSxDQUFDO1NBQzlCO1FBRUQsSUFBSSxhQUFhLENBQUMsZ0JBQWdCLEVBQUU7WUFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFO2dCQUMxRCxJQUFJLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJO29CQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7O29CQUM3RixjQUFjLEdBQUcsSUFBSSxDQUFDO1NBQ2xDO1FBRUQsYUFBYSxDQUFDLEtBQUssR0FBRyxRQUFRLENBQUM7UUFDL0IsYUFBYSxDQUFDLGdCQUFnQixHQUFHLFVBQVUsQ0FBQztRQUM1QyxhQUFhLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztRQUNuQyxhQUFhLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUU5Qix3REFBd0Q7UUFDeEQsSUFBSSxVQUFVO1lBQ1YsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNsRSxJQUFJLFlBQVk7WUFDWixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ2hFLElBQUksV0FBVztZQUNYLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzFFLElBQUksY0FBYztZQUNkLElBQUksQ0FBQyx1QkFBdUIsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1FBRXRGLHlDQUF5QztRQUN6QyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBRTlDLG1JQUFtSTtRQUNuSSxJQUFJLGFBQWEsQ0FBQyxLQUFLLElBQUksQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDLENBQUM7WUFDdkQsYUFBYSxDQUFDLEdBQUcsR0FBRyxLQUFLLENBQUM7WUFDMUIsYUFBYSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDOUIsYUFBYSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7WUFDekIsYUFBYSxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDMUIsYUFBYSxDQUFDLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztZQUVwQyx1RUFBdUU7WUFDdkUsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7U0FDL0I7UUFFRCxtSEFBbUg7UUFDbkgsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQztJQUN2RyxDQUFDO0lBRUQsbUNBQW1DO0lBQzNCLGVBQWUsQ0FBQyxHQUF3QjtRQUM1QyxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDZCxJQUFJLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3BCLEtBQUssSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLElBQUksRUFBRTtZQUN0QixHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBRTFCLE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUdEOzs7O09BSUc7SUFDSyxnQkFBZ0I7UUFDcEIsSUFBSSxFQUFFLEdBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUF1QixFQUFFLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDO1FBRXJGLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRixJQUFJLFVBQVUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXhFLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxHQUFHLFVBQVUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQztRQUNqSSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDO0lBQ3BDLENBQUM7SUFFRCxpSEFBaUg7SUFDMUcseUJBQXlCO1FBQzVCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDO1FBQzNFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLGFBQWEsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDO1FBQ3ZDLGFBQWEsQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO1FBQzlCLGFBQWEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQzFCLGFBQWEsQ0FBQyxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDcEMsYUFBYSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFFekIsa0VBQWtFO1FBQ2xFLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztZQUM5QixJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7U0FDaEM7UUFFRCxJQUFJLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFbEQsSUFBSSxDQUFDLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFaEQsMEhBQTBIO1FBQzFILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBR0Q7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxtQkFBbUIsQ0FBQyxLQUFVLEVBQUUsR0FBVyxFQUFFLE1BQWMsRUFBRSxzQkFBd0Q7UUFFeEgsSUFBSSxLQUFLLEdBQUcsc0JBQXNCLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDO1FBQy9ELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQiwyRkFBMkY7UUFDM0YsSUFBSSxLQUFLLENBQUMsUUFBUSxJQUFJLEtBQUssRUFBRTtZQUN6QixJQUFJLENBQUMsb0JBQW9CLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztZQUMzQyxJQUFJLFdBQVcsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLElBQUksY0FBYyxHQUFHLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFckQsS0FBSyxJQUFJLEVBQUUsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxHQUFHLEdBQUcsV0FBVyxFQUFFLEVBQUUsSUFBSSxXQUFXLEVBQ25FO2dCQUNJLElBQUksUUFBUSxHQUFHLEVBQUUsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDO2dCQUMvQixJQUFJLE9BQU8sR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDO2dCQUN4QixLQUFLLElBQUksRUFBRSxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLE1BQU0sR0FBRyxjQUFjLEVBQUUsRUFBRSxJQUFJLGNBQWMsRUFDL0U7b0JBQ0ksSUFBSSxRQUFRLEdBQUcsRUFBRSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUM7b0JBQ2xDLElBQUksT0FBTyxHQUFHLEVBQUUsSUFBSSxNQUFNLENBQUM7b0JBRTNCLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7b0JBQ2pELElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxjQUFjLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFDbkYsSUFBRyxFQUFFLEdBQUcsQ0FBQzt3QkFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztvQkFDOUYsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO29CQUNoRixJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLEdBQUcsY0FBYyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7b0JBQ25GLElBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQzt3QkFDbkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUM7b0JBQzlGLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztpQkFDbkY7YUFDSjtZQUNELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQztTQUM5QzthQUFNO1lBQ0gsc0ZBQXNGO1lBQ3RGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQzNDLElBQUksSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2pELElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QixJQUFJLE1BQU0sR0FBRyxDQUFDO2dCQUNWLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztZQUN2RSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDN0IsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQzdCLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDekMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUM3QixJQUFJLENBQUMsbUJBQW1CLEdBQUcsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7U0FDOUM7UUFFRCw0R0FBNEc7UUFDNUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxvQkFBb0IsQ0FBQyxTQUEyQztRQUNuRSxLQUFLLElBQUksR0FBRyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFO1lBQ3RDLEtBQUssSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlDLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxTQUFTLElBQUksQ0FBQyxHQUFHLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxNQUFNLElBQUksU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUU7b0JBQ3pHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7b0JBRXZELElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3RELElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3RELElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7b0JBQ3RELElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7aUJBQ3pEO2FBQ0o7U0FDSjtJQUNMLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksMkJBQTJCO1FBQzlCLElBQUksU0FBUyxHQUFrQyxFQUFFLENBQUE7UUFDakQsS0FBSyxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLGVBQWUsRUFBRTtZQUN0QyxJQUFJLFNBQVMsR0FBZ0MsRUFBRSxDQUFDO1lBQ2hELEtBQUssSUFBSSxNQUFNLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQzlDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNuRCxJQUFJLE1BQU0sQ0FBQyxRQUFRO29CQUNmLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDOUI7WUFDRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQztnQkFDcEIsU0FBUyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztTQUNqQztRQUNELE9BQU8sU0FBUyxDQUFDO0lBQ3JCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksa0JBQWtCLENBQUMsS0FBVTtRQUNoQyxxRUFBcUU7UUFDckUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRO1lBQ2pILE9BQU8sS0FBSyxDQUFDO1FBRWpCLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxRQUFRO1lBQ2hILElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCw0QkFBNEIsQ0FBQyxHQUFvRDtRQUM3RSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNqQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsSUFBSSxDQUFDLEdBQUcsQ0FBQztnQkFBRSxHQUFHLElBQUksSUFBSSxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNqQyxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pCLEdBQUcsSUFBSSxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQ3RFO1NBQ0o7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxjQUFjLENBQUMsT0FBb0Q7UUFDL0QsUUFBUSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2xCLEtBQUssUUFBUTtnQkFDVCxPQUFPLEdBQUcsR0FBRyxPQUFPLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztZQUNyQyxLQUFLLFFBQVEsQ0FBQztZQUNkLEtBQUssS0FBSyxDQUFDO1lBQ1gsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssY0FBYztnQkFDZixPQUFPLE9BQU8sQ0FBQyxLQUFLLENBQUM7WUFDekIsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLFVBQVU7Z0JBQ1gsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JFLEtBQUssTUFBTTtnQkFDUCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7WUFDdkYsS0FBSyxVQUFVO2dCQUNYLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztZQUN0RixLQUFLLE1BQU07Z0JBQ1AsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUN0RDtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQXBwU2VhcmNoIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0FwcFNlYXJjaFwiO1xyXG5pbXBvcnQgeyBJdGVtc1NlbGVjdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9JdGVtc1NlbGVjdGlvblwiO1xyXG5pbXBvcnQgeyBDYWNoZVRyaXB0aWMgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9DYWNoZVRyaXB0aWNcIjtcclxuaW1wb3J0IHsgSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZSB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0l0ZW1Qcm9wRWRpdGFibGVSZWZlcmVuY2VcIjtcclxuaW1wb3J0IHsgRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uXCI7XHJcbmltcG9ydCB7IElucHV0VHlwZSB9IGZyb20gJy4uLy4uL2RvbWFpbi90eXBlcyc7XHJcblxyXG4vLyBDb21wb25lbnRpXHJcbmltcG9ydCB7IEVzVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9lcy10YWJsZS9lc190YWJsZS5jb21wb25lbnRcIlxyXG5cclxuLy8gRGlyZXR0aXZlIFxyXG5pbXBvcnQgeyBFc1RoRGlyZWN0aXZlIH0gZnJvbSBcIi4uLy4uL2RpcmVjdGl2ZXMvZXNfdGguZGlyZWN0aXZlXCI7XHJcblxyXG4vLyBIYW5kbGVyc1xyXG5pbXBvcnQgeyBSb3dHcm91cGluZ0hhbmRsZXIgfSBmcm9tIFwiLi9Sb3dHcm91cGluZ0hhbmRsZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuIGRlY2xhcmUgdmFyIGRheWpzOiBhbnk7XHJcblxyXG4vKiogQ2xhc3NlIGNoZSBnZXN0aXNjZSBsZSBzZWxlemlvbmkgZGVnbGkgb2dnZXR0aSAqL1xyXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uSGFuZGxlciB7XHJcblxyXG4gICAgLyoqIENhY2hlIGRpIHNlbGV6aW9uZSBIYXNoIC0gT2dnZXR0byBwZXIgbGEgdmFyaWFiaWxlICoqaXRlbXMqKiBkZWxsJ2l0ZW1TZWxlY3Rvci4gRmFjaWxpdGEgbGUgb3BlcmF6aW9uaSBkaSBsb29rdXAgdmlhIGhhc2gqL1xyXG4gICAgcHJpdmF0ZSBpdGVtc0NhY2hlOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xyXG4gICAgLyoqIENhY2hlIGRpIHNlbGV6aW9uZSBIYXNoIC0gT2dnZXR0byBwZXIgbGEgdmFyaWFiaWxlICoqZ3JvdXBzKiogZGVsbCdpdGVtU2VsZWN0b3IuIEZhY2lsaXRhIGxlIG9wZXJhemlvbmkgZGkgbG9va3VwIHZpYSBoYXNoICovXHJcbiAgICBwcml2YXRlIGdyb3Vwc0NhY2hlOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xyXG4gICAgLyoqIENhY2hlIGRpIHNlbGV6aW9uZSBIYXNoIC0gT2dnZXR0byBwZXIgbGEgdmFyaWFiaWxlICoqZXhjbHVzaW9ucyoqIGRlbGwnaXRlbVNlbGVjdG9yLiBGYWNpbGl0YSBsZSBvcGVyYXppb25pIGRpIGxvb2t1cCB2aWEgaGFzaCAqL1xyXG4gICAgcHJpdmF0ZSBleGNsdXNpb25zQ2FjaGU6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XHJcbiAgICAvKiogQ2FjaGUgZGkgc2VsZXppb25lIEhhc2ggLSBPZ2dldHRvIHBlciBsYSB2YXJpYWJpbGUgKipncm91cF9leGNsdXNpb25zKiogZGVsbCdpdGVtU2VsZWN0b3IuIEZhY2lsaXRhIGxlIG9wZXJhemlvbmkgZGkgbG9va3VwIHZpYSBoYXNoICovXHJcbiAgICBwcml2YXRlIGdyb3VwX2V4Y2x1c2lvbnNDYWNoZTogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICAvKiogQ2FjaGUgZGkgc2VsZXppb25lIEhhc2ggLSBPZ2dldHRvIHBlciBsYSB2YXJpYWJpbGUgKippdGVtcyoqIGRlbGwnaXRlbVNlbGVjdG9yLiBGYWNpbGl0YSBsZSBvcGVyYXppb25pIGRpIGxvb2t1cCB2aWEgaW5kaWNlKi9cclxuICAgIHByaXZhdGUgaV9pdGVtc0NhY2hlOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xyXG4gICAgLyoqIENhY2hlIGRpIHNlbGV6aW9uZSBIYXNoIC0gT2dnZXR0byBwZXIgbGEgdmFyaWFiaWxlICoqZ3JvdXBzKiogZGVsbCdpdGVtU2VsZWN0b3IuIEZhY2lsaXRhIGxlIG9wZXJhemlvbmkgZGkgbG9va3VwIHZpYSBpbmRpY2UgKi9cclxuICAgIHByaXZhdGUgaV9ncm91cHNDYWNoZTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICAgIC8qKiBDYWNoZSBkaSBzZWxlemlvbmUgSGFzaCAtIE9nZ2V0dG8gcGVyIGxhIHZhcmlhYmlsZSAqKmV4Y2x1c2lvbnMqKiBkZWxsJ2l0ZW1TZWxlY3Rvci4gRmFjaWxpdGEgbGUgb3BlcmF6aW9uaSBkaSBsb29rdXAgdmlhIGluZGljZSAqL1xyXG4gICAgcHJpdmF0ZSBpX2V4Y2x1c2lvbnNDYWNoZTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICAgIC8qKiBDYWNoZSBkaSBzZWxlemlvbmUgSGFzaCAtIE9nZ2V0dG8gcGVyIGxhIHZhcmlhYmlsZSAqKmdyb3VwX2V4Y2x1c2lvbnMqKiBkZWxsJ2l0ZW1TZWxlY3Rvci4gRmFjaWxpdGEgbGUgb3BlcmF6aW9uaSBkaSBsb29rdXAgdmlhIGluZGljZSAqL1xyXG4gICAgcHJpdmF0ZSBpX2dyb3VwX2V4Y2x1c2lvbnNDYWNoZTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICAvKiogVWx0aW1hIGNlbGxhIHNlbGV6aW9uYXRhIHNpbmdvbGFybWVudGUgKi9cclxuICAgIHByaXZhdGUgbGFzdFNpbmdsZVNlbGVjdGlvbjogeyByb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXIgfTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSBDb3N0cnV0dG9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlc3Q6IEVzVGFibGVDb21wb25lbnQsIHByaXZhdGUgcmdIYW5kbGVyOiBSb3dHcm91cGluZ0hhbmRsZXIpIHsgfVxyXG5cclxuICAgIC8qKiBSaXB1bGlzY2UgbGUgY2FjaGUgZGkgc2VsZXppb25lICovXHJcbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb25DYWNoZXMoKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtc0NhY2hlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5ncm91cHNDYWNoZS5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuZXhjbHVzaW9uc0NhY2hlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5ncm91cF9leGNsdXNpb25zQ2FjaGUuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pX2l0ZW1zQ2FjaGUuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLmlfZ3JvdXBzQ2FjaGUuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLmlfZXhjbHVzaW9uc0NhY2hlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5pX2dyb3VwX2V4Y2x1c2lvbnNDYWNoZS5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsdXRhIHF1YWxpIGVsZW1lbnRpIGRldm9ubyBlc3NlcmUgbWFyY2F0aSBjb21lIHNlbGV6aW9uYXRpIG5lbGxhIHZpc3RhIGF0dHVhbGUuIFNpIGJhc2Egc3VsbCdvZ2dldHRvICoqc2VsZWN0aW9uKiogaW50ZXJubyBhbGwnQXBwU2VhcmNoXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkaSBjdWkgdmFsdXRhcmUgbGEgc2VsZXppb25lXHJcbiAgICAgKiBAcGFyYW0ge0l0ZW1zU2VsZWN0aW9uPGFueT59IHNlbGVjdGlvbkl0ZW0gT2dnZXR0aSBkaSBzZWxlemlvbmUgZGVyaXZhbnRlIGRhbGxhIHZpZXcgbyBkYWxsJ29nZ2V0dG8gcGVyIEFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBldmFsdWF0ZVNlbGVjdGlvbihpdGVtczogYW55W10sIHNlbGVjdGlvbkl0ZW06IEl0ZW1zU2VsZWN0aW9uPGFueT4pIHtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbkl0ZW0pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25FdmFsdWF0aW9uKGl0ZW1zLCBzZWxlY3Rpb25JdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZWNvbXBpbGEgbGUgaW5mb3JtYXppb25pIHN1bGxvIHN0YXRvIGRpIHNlbGV6aW9uZSB0dXR0byBhIGZhbHNlIHBlciBsZSBjZWxsZSBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55W119IGl0ZW1zIE9nZ2V0dGkgYXR0dWFsbWVudGUgYmluZGF0aSBzdWxsYSB0YWJlbGxhXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmVbXX0gdGhzIENvbG9ubmUgc3UgY3VpIGdsaSBvZ2dldHRpIHNvbm8gYmluZGF0aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXZhbHVhdGVTaW5nbGVDZWxsU2VsZWN0aW9uKGl0ZW1zOiBhbnlbXSwgdGhzOiBFc1RoRGlyZWN0aXZlW10sIGR5bjogRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uW10pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIGl0ZW1zW2ldLl9vcmRpbmFsIGRvdnJlYmJlIGVzc2VyZSB1Z3VhbGUgYSBcImlcIiBtYSBkYXRvIGNoZSBsYXRvIEhUTUwgaWwgY2ljbG8gw6ggZXN0ZXJubyBlIG5vbiBobyBsJ2luZGljZSBwZXIgY29udmVuemlvbmUgbWkgYmFzbyBzdWxsJ19vcmRpbmFsXHJcbiAgICAgICAgICAgIHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tpdGVtc1tpXS5fb3JkaW5hbF0gPSB7fTtcclxuICAgICAgICAgICAgaWYgKGR5biAmJiBkeW4ubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsbFNlbGVjdGlvblN0YXR1c0J5RHluYW1pY0NvbHVtbnMoaXRlbXNbaV0sIGR5bik7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsbFNlbGVjdGlvblN0YXR1c0J5RXNUaHMoaXRlbXNbaV0sIHRocyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgZmlsbFNlbGVjdGlvblN0YXR1c0J5RHluYW1pY0NvbHVtbnMoaXRlbTogYW55LCBkeW46IEVzVGFibGVDb2x1bW5zRGVmaW5pdGlvbltdKXtcclxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGR5bi5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSBkeW5ba107XHJcbiAgICAgICAgICAgIGxldCBpcGVyOiBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlID0geyBzZWxlY3RlZDogZmFsc2UsIHZhbHVlOiB0aC5Qcm9wZXJ0eU5hbWUgPyBpdGVtLnByb3BlcnRpZXNbdGguUHJvcGVydHlOYW1lXSA6IFwiVW5kZWZpbmVkIFByb3BlcnR5XCIsIHR5cGU6IHRoLlByb3BlcnR5VHlwZSwgcHJvcGVydHk6IHRoLlByb3BlcnR5TmFtZSwgaGVhZGVyOiB0aC5Qcm9wZXJ0eU5hbWUsIGl0ZW06IGl0ZW0gfTtcclxuICAgICAgICAgICAgdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2tdID0gaXBlcjtcclxuXHJcbiAgICAgICAgICAgIC8vIEZ1bnppb25lIGFzc2VnbmF0YSBkb3BvIGluIG1vZG8gZGEgcG90ZXJsZSBmYXJlIGFuY2hlIGFnZ2lvcm5hcmUgaWwgdmFsb3JlIGRlbCByaWZlcmltZW50byBhbGwnb2dnZXR0byBkaSBzZWxlemlvbmVcclxuICAgICAgICAgICAgaXBlci52YWxfc2V0dGVyID0gKHZhbHVlOiBzdHJpbmcpOiBhbnkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aC5Qcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtW3RoLlByb3BlcnR5TmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpcGVyLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCB2YWxUb0FwcGx5ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGguUHJvcGVydHlUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCAmJiB2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG9BcHBseSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG9BcHBseSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnRcIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImF1dG9jb21wbGV0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmbG9hdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjdXJyZW5jeVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gdGhpcy5lc3QuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXlkYXRlID0gdGhpcy5lc3QuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gYCR7bXlkYXRlLmhvdXIoKX06JHtteWRhdGUubWludXRlKCl9OiR7bXlkYXRlLnNlY29uZCgpfWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpdGVtLnByb3BlcnRpZXNbdGguUHJvcGVydHlOYW1lXSA9IHZhbFRvQXBwbHk7XHJcbiAgICAgICAgICAgICAgICBpcGVyLnZhbHVlID0gdmFsVG9BcHBseTtcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWxUb0FwcGx5O1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBAaWdub3JlICovXHJcbiAgICBwcml2YXRlIGZpbGxTZWxlY3Rpb25TdGF0dXNCeUVzVGhzKGl0ZW06IGFueSwgdGhzOiBFc1RoRGlyZWN0aXZlW10pIHtcclxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHRocy5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSB0aHNba107XHJcbiAgICAgICAgICAgIGxldCBpcGVyOiBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlID0geyBzZWxlY3RlZDogZmFsc2UsIHZhbHVlOiB0aC50aFByb3BlcnR5ID8gaXRlbVt0aC50aFByb3BlcnR5XSA6IFwiVW5kZWZpbmVkIFByb3BlcnR5XCIsIHR5cGU6IHRoLnRoVHlwZSwgcHJvcGVydHk6IHRoLnRoUHJvcGVydHksIGhlYWRlcjogdGgudGgsIGl0ZW06IGl0ZW0gfTtcclxuICAgICAgICAgICAgdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2tdID0gaXBlcjtcclxuXHJcbiAgICAgICAgICAgIC8vIEZ1bnppb25lIGFzc2VnbmF0YSBkb3BvIGluIG1vZG8gZGEgcG90ZXJsZSBmYXJlIGFuY2hlIGFnZ2lvcm5hcmUgaWwgdmFsb3JlIGRlbCByaWZlcmltZW50byBhbGwnb2dnZXR0byBkaSBzZWxlemlvbmVcclxuICAgICAgICAgICAgaXBlci52YWxfc2V0dGVyID0gKHZhbHVlOiBzdHJpbmcpOiBhbnkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aC50aFByb3BlcnR5KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaXRlbVt0aC50aFByb3BlcnR5XSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIGlwZXIudmFsdWUgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgbGV0IHZhbFRvQXBwbHkgPSBcIlwiO1xyXG4gICAgICAgICAgICAgICAgc3dpdGNoICh0aC50aFR5cGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG9BcHBseSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG9BcHBseSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnRcIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImF1dG9jb21wbGV0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmbG9hdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjdXJyZW5jeVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gdGhpcy5lc3QuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXlkYXRlID0gdGhpcy5lc3QuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gYCR7bXlkYXRlLmhvdXIoKX06JHtteWRhdGUubWludXRlKCl9OiR7bXlkYXRlLnNlY29uZCgpfWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBpdGVtW3RoLnRoUHJvcGVydHldID0gdmFsVG9BcHBseTtcclxuICAgICAgICAgICAgICAgIGlwZXIudmFsdWUgPSB2YWxUb0FwcGx5O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbFRvQXBwbHk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBJbXBsZW1lbnRhemlvbmUgYWdub3N0aWNhIGRlbGxhIHZhbHV0YXppb25lIGRlbGxlIHNlbGV6aW9uaSBkZWdsaSBvZ2dldHRpLiBSaWNoaWVkZSBnbGkgb2dnZXR0aSBkZWxsYSB2aXN0YSBhdHR1YWxlIGUgbCdpdGVtU2VsZWN0b3JcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBpdGVtcyBPZ2dldHRpIGRpIGN1aSBhZ2dpb3JuYXJlIGxvIHN0YXRvIGRpIHNlbGV6aW9uZVxyXG4gICAgICogQHBhcmFtIHtJdGVtc1NlbGVjdGlvbjxhbnk+fSBzZWxlY3Rpb25JdGVtIE9nZ2V0dG8gY29udGVuZW50ZSBsbyBzdGF0byBhdHR1YWxlIGRpIHNlbGV6aW9uZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGhhbmRsZVNlbGVjdGlvbkV2YWx1YXRpb24oaXRlbXM6IGFueVtdLCBzZWxlY3Rpb25JdGVtOiBJdGVtc1NlbGVjdGlvbjxhbnk+KSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaXRtID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgIGxldCBoYXNoID0gaXRtLl9oYXNoO1xyXG4gICAgICAgICAgICBsZXQgaXRlbUdyb3VwID0gaXRtLl9ncm91cCA/IG51bGwgOiB0aGlzLmdldEl0ZW1Hcm91cChpdG0pO1xyXG4gICAgICAgICAgICAvLyBSZWlkcmF0byBsYSBjYWNoZSBkaSBzZWxlemlvbmUgY29pIG51b3ZpIG9nZ2V0dGkgYWx0cmltZW50aSBub24gcml1c2NpcmVpIGEgYmVjY2FyZSBnbGkgaW5kaWNpIGdpdXN0aVxyXG4gICAgICAgICAgICAvLyBEb3BvZGljaMOpIGxhIHVzbyBwZXIgY2FsY29sYXJlIGlzdGFudGFuZWFtZW50ZSBzZSBnbGkgb2dnZXR0aSBzb25vIHNlbGV6aW9uYXRpIG8gbm9cclxuICAgICAgICAgICAgdGhpcy5yZWhpZHJhdGVDYWNoZShpdG0pO1xyXG5cclxuICAgICAgICAgICAgaWYgKGl0bS5faXRlbSkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW0uYWxsKVxyXG4gICAgICAgICAgICAgICAgICAgIGl0bS5fc2VsZWN0ZWQgPSAhdGhpcy5leGNsdXNpb25zQ2FjaGUuaGFzKGhhc2gpICYmICgoIXRoaXMuZ3JvdXBzQ2FjaGUuaGFzKGl0ZW1Hcm91cD8uX2hhc2gpICYmIHRoaXMuaXRlbXNDYWNoZS5oYXMoaGFzaCkpIHx8ICF0aGlzLmdyb3VwX2V4Y2x1c2lvbnNDYWNoZS5oYXMoaXRlbUdyb3VwPy5faGFzaCkpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGl0bS5fc2VsZWN0ZWQgPSAhdGhpcy5leGNsdXNpb25zQ2FjaGUuaGFzKGhhc2gpICYmICh0aGlzLmdyb3Vwc0NhY2hlLmhhcyhpdGVtR3JvdXA/Ll9oYXNoKSB8fCB0aGlzLml0ZW1zQ2FjaGUuaGFzKGhhc2gpIHx8ICh0aGlzLnBhcmVudFRyZWVTdGF0dXMoaXRlbUdyb3VwKSA9PSAnaW5jbHVkZWQnICYmICF0aGlzLmdyb3VwX2V4Y2x1c2lvbnNDYWNoZS5oYXMoaXRlbUdyb3VwPy5faGFzaCkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIGlmIChpdG0uX2dyb3VwKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSXRlbS5hbGwpXHJcbiAgICAgICAgICAgICAgICAgICAgaXRtLl9zZWxlY3RlZCA9ICF0aGlzLmdyb3VwX2V4Y2x1c2lvbnNDYWNoZS5oYXMoaGFzaCkgJiYgdGhpcy5wYXJlbnRUcmVlU3RhdHVzKGl0bSkgIT0gJ2V4Y2x1ZGVkJztcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICBpdG0uX3NlbGVjdGVkID0gdGhpcy5ncm91cHNDYWNoZS5oYXMoaGFzaCkgfHwgKHRoaXMucGFyZW50VHJlZVN0YXR1cyhpdG0pID09ICdpbmNsdWRlZCcgJiYgIXRoaXMuZ3JvdXBfZXhjbHVzaW9uc0NhY2hlLmhhcyhoYXNoKSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNlIHR1dHRpIGdsaSBvZ2dldHRpIGRpIHF1ZXN0YSBwYWdpbmEgc29ubyBzb2xlemlvbmF0aSBhbGxvcmEgcG9zc28gbWV0dGVyZSBpbCBnbG9iYWwgY2hlY2sgYSB0cnVlXHJcbiAgICAgICAgLy8gU2Ugc29ubyBpbiBzaXR1YXppb25lIGRpIGFsbC1zZWxlY3QgYW5jaGUgbWV0dG8gbGEgZ2xvYmFsIGNoZWNrYm94LCBub25vc3RhbnRlIGNpIHBvc3Nhbm8gZXNzZXJlIGRlbGxlIGVzY2x1c2lvbmlcclxuICAgICAgICB0aGlzLmVzdC5nbG9iYWxDaGVjayA9IHRoaXMuZXN0LmJvdW5kU291cmNlLmxlbmd0aCA+IDAgJiYgdGhpcy5lc3QuYm91bmRTb3VyY2UuZmlsdGVyKHQgPT4gdC5fZ3JvdXAgfHwgdC5faXRlbSkuZXZlcnkodCA9PiB0Ll9zZWxlY3RlZCk7XHJcbiAgICAgICAgdGhpcy5lc3QuY2FuU2VsZWN0QWxsID0gc2VsZWN0aW9uSXRlbS5jb3VudCA+IDAgJiYgdGhpcy5lc3QuU2VsZWN0QWxsICYmICF0aGlzLmVzdC5TaW5nbGVTZWxlY3Rpb247XHJcblxyXG4gICAgICAgIC8vIFBvdHJlYmJlIGNhbWJpYXJlIHF1YWxvcmEgcXVhbGN1bm8gaW5zZXJpc3NlIGRhdGkgYSBtYW5henphIGluIG1vZGFsaXTDoCBBcnJheSBlIGRlc3NlIGlsIHJlZnJlc2ggbWFudWFsZSBhbGxhIHRhYmVsbGFcclxuICAgICAgICAvLyBDb211bnF1ZSBjb3N0YSAwIHF1aW5kaSBtaSBwZXJtZXR0byBkaSByZWZyZXNoYXJlXHJcbiAgICAgICAgaWYgKHRoaXMuZXN0LmFycmF5TW9kZSkge1xyXG4gICAgICAgICAgICBsZXQgcHJldlNlbGVjdGVkID0gdGhpcy5lc3Quc2VsZWN0ZWRPYmplY3RzO1xyXG4gICAgICAgICAgICB0aGlzLmZpbmFsaXplU2VsZWN0aW9uSW5mb3JtYXRpb25zKHNlbGVjdGlvbkl0ZW0pO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lc3Quc2VsZWN0ZWRPYmplY3RzICE9IHByZXZTZWxlY3RlZClcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0Lm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHNlbGVjdGlvbkl0ZW0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdG8gdW4gb2dnZXR0byB0cm92YSBsYSBjZWxsYSBkaSBjYWNoZSBpbiBjdWkgw6ggcmVnaXN0cmF0byBlIGFnZ2lvcm5hIGlsIGNvbnRlbnV0b1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gaXRlbSBPZ2dldHRvIGRhIGFnZ2lvcm5hcmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWhpZHJhdGVDYWNoZShpdGVtOiBhbnkpIHtcclxuICAgICAgICBsZXQgY3R4ID0gaXRlbS5faGFzaDtcclxuICAgICAgICBpZiAodGhpcy5pdGVtc0NhY2hlLmhhcyhjdHgpKVxyXG4gICAgICAgICAgICB0aGlzLml0ZW1zQ2FjaGUuc2V0KGN0eCwgaXRlbSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdyb3VwX2V4Y2x1c2lvbnNDYWNoZS5oYXMoY3R4KSlcclxuICAgICAgICAgICAgdGhpcy5ncm91cF9leGNsdXNpb25zQ2FjaGUuc2V0KGN0eCwgaXRlbSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdyb3Vwc0NhY2hlLmhhcyhjdHgpKVxyXG4gICAgICAgICAgICB0aGlzLmdyb3Vwc0NhY2hlLnNldChjdHgsIGl0ZW0pO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5leGNsdXNpb25zQ2FjaGUuaGFzKGN0eCkpXHJcbiAgICAgICAgICAgIHRoaXMuZXhjbHVzaW9uc0NhY2hlLnNldChjdHgsIGl0ZW0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0byB1biBncnVwcG8gY29udHJvbGxhIHJpY29yc2l2YW1lbnRlIGwnYWxiZXJvIGRpIGN1aSBmYSBwYXJ0ZSBzZSBjJ8OoIHN0YXRhIHVuYSBpbmNsdXNpb25lIG8gZXNjbHVzaW9uZSBkaXJldHRhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBncnAgR3J1cHBvIGRhIGNvbnRyb2xsYXJlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHsnbm9uZScgfCAnZXhjbHVkZWQnIHwgJ2luY2x1ZGVkJ30gXHJcbiAgICAgKiAnbm9uZScgc2Ugbm9uIGNpIHNvbm8gaW5mb3JtYXppb25pIHN1IGluY2x1c2lvbmkgbyBlc2NsdXNpb25pIFxyXG4gICAgICogJ2luY2x1ZGVkJyBzZSBpbCBncnVwcG8gY29udHJvbGxhdG8gw6ggc3RhdG8gaW5jbHVzbyBpbiBtYW5pZXJhIGVzcGxpY2l0YSBkYWxsJ2FsYmVybyBkZWkgZ3J1cHBpIHBhZHJpXHJcbiAgICAgKiAnZXhjbHVkZWQnIHNlIGlsIGdydXBwbyBjb250cm9sbGF0byDDqCBzdGF0byBlc2NsdXNvIGluIG1hbmllcmEgZXNwbGljaXRhIGRhbGwnYWxiZXJvIGRlaSBncnVwcGkgcGFkcmlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwYXJlbnRUcmVlU3RhdHVzKGdycDogYW55KTogJ25vbmUnIHwgJ2V4Y2x1ZGVkJyB8ICdpbmNsdWRlZCcge1xyXG4gICAgICAgIGlmICghZ3JwKVxyXG4gICAgICAgICAgICByZXR1cm4gJ25vbmUnO1xyXG5cclxuICAgICAgICBsZXQgcGFyZW50R3JvdXA6IGFueSA9IHRoaXMucmdIYW5kbGVyLnJnR3JvdXBDYWNoZS5nZXQoZ3JwLl9wYXJlbnQpO1xyXG5cclxuICAgICAgICBpZiAoIXBhcmVudEdyb3VwKVxyXG4gICAgICAgICAgICByZXR1cm4gJ25vbmUnO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5ncm91cF9leGNsdXNpb25zQ2FjaGUuaGFzKHBhcmVudEdyb3VwLl9oYXNoKSlcclxuICAgICAgICAgICAgcmV0dXJuICdleGNsdWRlZCc7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdyb3Vwc0NhY2hlLmhhcyhwYXJlbnRHcm91cC5faGFzaCkpXHJcbiAgICAgICAgICAgIHJldHVybiAnaW5jbHVkZWQnO1xyXG5cclxuICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnRUcmVlU3RhdHVzKHBhcmVudEdyb3VwKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgcGVyIGdlc3RpcmUgbGEgc2VsZXppb25lIGRpIE4gZWxlbWVudGkgdXRpbGl6emFuZG8gbGEgQ2FjaGUgZGkgc2VsZXppb25lIGVkIGV2ZW50dWFsbWVudGUgYWdnaW9ybmFuZG8gaWwgY29uY2V0dG8gZGkgXCJhbGwgc2VsZWN0aW9uXCJcclxuICAgICAqXHJcbiAgICAgKiBWdW56aW9uYSBzaWEgaW4gbW9kYWxpdMOgIEFycmF5IGNoZSBpbiBtb2RhbGl0w6AgVmlldyBTZW1wbGljZSBvIFZpZXcgQXZhbnphdGEgKGNvbiBsZSBDdXN0b20gQ2VsbHMpXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkYSBzZWxlemlvbmFyZSBvIGRlc2VsZXppb25hcmVcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yY2VkVmFsIFZhbG9yZSBmb3J6YXRvIGRpIGNoZWNrIGRhIGFzc2VnbmFyZSBhZ2xpIG9nZ2V0dGlcclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZ2xvYmFsQ2hlY2sgVmFsb3JlIGRlbCBjaGVjayBnbG9iYWxlXHJcbiAgICAgKlxyXG4gICAgICogQHJldHVybnMge0l0ZW1zU2VsZWN0aW9uPGFueT59IE9nZ2V0dG8gZGkgc2VsZXppb25lIGFnZ2lvcm5hdG8gY29uIGxlIGluZm9ybWF6aW9uaSBzdWxsJ3VsdGltYSBvcGVyYXppb25lIGVmZmV0dHVhdGFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGhhbmRsZUl0ZW1zU2VsZWN0aW9uKGl0ZW1zOiBhbnlbXSwgZm9yY2VkVmFsOiBib29sZWFuID0gbnVsbCwgZ2xvYmFsQ2hlY2s6IGJvb2xlYW4gPSBudWxsKTogSXRlbXNTZWxlY3Rpb248YW55PiB7XHJcbiAgICAgICAgbGV0IHNpID0gKHRoaXMuZXN0LlZpZXcgYXMgQXBwU2VhcmNoPGFueT4pPy5zZWxlY3Rpb24gfHwgdGhpcy5lc3QuYXJyYXltb2RlU2VsZWN0aW9uO1xyXG5cclxuICAgICAgICAvLyBTZSBzb25vIGluIG1vZGFsaXTDoCBkaSBzZWxlemlvbmUgc2luZ29sYSBlIGRldm8gc2VsZXppb25hcmUgdW4nb2dnZXR0bywgcGVyIHByaW1hIGNvc2EgZGV2byBkZXNlbGV6aW9uYXJlIHR1dHRpIGdsaSBhbHRyaVxyXG4gICAgICAgIGlmICh0aGlzLmVzdC5TaW5nbGVTZWxlY3Rpb24gJiYgaXRlbXNbMF0/Ll9zZWxlY3RlZCAmJiAhaXRlbXNbMF0/Ll9ncm91cCkge1xyXG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMSAmJiBmb3JjZWRWYWwgPT0gbnVsbClcclxuICAgICAgICAgICAgICAgIHRocm93IFwiVGVudGF0aXZvIGRpIHNlbGV6aW9uYXJlIG8gZGVzZWxlemlvbmFyZSBwacO5IGRpIHVuIGVsZW1lbnRvIGNvbiBTaW5nbGVTZWxlY3Rpb24gYXR0aXZvXCI7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID09IDEgJiYgZm9yY2VkVmFsID09IG51bGwpIHtcclxuICAgICAgICAgICAgICAgIHNpID0gdGhpcy5oYW5kbGVJdGVtc1NlbGVjdGlvbih0aGlzLmVzdC5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PiAhdC5fZ3JvdXApLCBmYWxzZSwgbnVsbCk7XHJcbiAgICAgICAgICAgICAgICBpdGVtc1swXS5fc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpdGVtID0gaXRlbXNbaV07XHJcbiAgICAgICAgICAgIGxldCB0b0NoYW5nZSA9IGZvcmNlZFZhbCAhPSBudWxsID8gaXRlbS5fc2VsZWN0ZWQgIT0gZm9yY2VkVmFsIDogZ2xvYmFsQ2hlY2sgIT0gbnVsbCA/IGl0ZW0uX3NlbGVjdGVkICE9IHRoaXMuZXN0Lmdsb2JhbENoZWNrIDogZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBkZXYnZXNzZXJlIG92ZXJyaWRhdG8gaWwgdmFsb3JlIGRpIGNoZWNrIGVmZmV0dHVvIGwnb3ZlcnJpZGUgbyBjb2wgdmFsb3JlIGZvcnphdG8gbyBjb2wgdmFsb3JlIGdsb2JhbGVcclxuICAgICAgICAgICAgaWYgKHRvQ2hhbmdlICYmICFpdGVtLmxvY2tlZClcclxuICAgICAgICAgICAgICAgIGl0ZW0uX3NlbGVjdGVkID0gZm9yY2VkVmFsICE9IG51bGwgPyBmb3JjZWRWYWwgOiB0aGlzLmVzdC5nbG9iYWxDaGVjaztcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIGlsIHZhbG9yZSBub24gZGV2J2Vzc2VyZSB2YXJpYXRvIGUgdmVuZ28gZGEgdW5hIHNlbGV6aW9uZSBnbG9iYWxlIHNlbXBsaWNlbWVudGUgZXZpdG8gZGkgZWZmZXR0dWFyZSBvcGVyYWl6b25pIGludXRpbGkuIEwnaXRlbS9ncnVwcG8gw6ggZ2nDoCBuZWxsbyBzdGF0byBnaXVzdG9cclxuICAgICAgICAgICAgaWYgKCF0b0NoYW5nZSAmJiBnbG9iYWxDaGVjayAhPSBudWxsKVxyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICBsZXQgYWxsU2VsZWN0aW9uID0gc2kuYWxsO1xyXG4gICAgICAgICAgICBsZXQgaXNHcm91cCA9IGl0ZW0uX2dyb3VwO1xyXG4gICAgICAgICAgICBsZXQgaXNTZWxlY3Rpb24gPSBpdGVtLl9zZWxlY3RlZDtcclxuICAgICAgICAgICAgbGV0IGl0ZW1Hcm91cCA9IG51bGwsIGFsbEl0ZW1zID0gbnVsbCwgc2VsZWN0ZWRJdGVtcyA9IG51bGwsIHVuc2VsZWN0ZWRJdGVtcyA9IG51bGwsIGFsbEdyb3VwcyA9IG51bGwsIHNlbGVjdGVkR3JvdXBzID0gbnVsbCwgdW5zZWxlY3RlZEdyb3VwcyA9IG51bGwsIHBhcmVudEdyb3VwU2VsZWN0ZWQgPSBudWxsLCBwYXJlbnRHcm91cFVuc2VsZWN0ZWQgPSBudWxsO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzR3JvdXApIHtcclxuICAgICAgICAgICAgICAgIGxldCBwdHMgPSB0aGlzLnBhcmVudFRyZWVTdGF0dXMoaXRlbSk7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRHcm91cFNlbGVjdGVkID0gcHRzID09ICdpbmNsdWRlZCc7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRHcm91cFVuc2VsZWN0ZWQgPSBwdHMgPT0gJ2V4Y2x1ZGVkJztcclxuICAgICAgICAgICAgICAgIGFsbEl0ZW1zID0gdGhpcy5nZXRHcm91cEl0ZW1zKHNpLCBpdGVtLCBudWxsLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSXRlbXMgPSB0aGlzLmdldEdyb3VwSXRlbXMoc2ksIGl0ZW0sICdzZWxlY3RlZCcsIHRydWUsIGFsbEl0ZW1zKTtcclxuICAgICAgICAgICAgICAgIHVuc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZ2V0R3JvdXBJdGVtcyhzaSwgaXRlbSwgJ3Vuc2VsZWN0ZWQnLCB0cnVlLCBhbGxJdGVtcyk7XHJcbiAgICAgICAgICAgICAgICBhbGxHcm91cHMgPSB0aGlzLmdldEdyb3VwQ2hpbGRHcm91cHMoc2ksIGl0ZW0sIG51bGwsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRHcm91cHMgPSB0aGlzLmdldEdyb3VwQ2hpbGRHcm91cHMoc2ksIGl0ZW0sICdzZWxlY3RlZCcsIHRydWUsIGFsbEdyb3Vwcyk7XHJcbiAgICAgICAgICAgICAgICB1bnNlbGVjdGVkR3JvdXBzID0gdGhpcy5nZXRHcm91cENoaWxkR3JvdXBzKHNpLCBpdGVtLCAndW5zZWxlY3RlZCcsIHRydWUsIGFsbEdyb3Vwcyk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpdGVtR3JvdXAgPSB0aGlzLmdldEl0ZW1Hcm91cChpdGVtKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudEdyb3VwU2VsZWN0ZWQgPSBpdGVtR3JvdXAgPT0gbnVsbCA/IG51bGwgOiBpdGVtR3JvdXAuX3NlbGVjdGVkO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50R3JvdXBVbnNlbGVjdGVkID0gaXRlbUdyb3VwID09IG51bGwgPyBudWxsIDogIWl0ZW1Hcm91cC5fc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIGlmICghdGhpcy5lc3QuQXJyYXlHcm91cGluZylcclxuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybVNlbGVjdGlvbk9wZXJhdGlvbnMoc2ksIGl0ZW0sIGFsbFNlbGVjdGlvbiwgaXNHcm91cCwgaXNTZWxlY3Rpb24sIHNlbGVjdGVkSXRlbXMsIHNlbGVjdGVkR3JvdXBzLCB1bnNlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRHcm91cHMsIGFsbEl0ZW1zLCBhbGxHcm91cHMsIHBhcmVudEdyb3VwU2VsZWN0ZWQsIHBhcmVudEdyb3VwVW5zZWxlY3RlZCk7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybVNpbXBsZVNlbGVjdGlvbk9wZXJhdGlvbnMoc2ksIGl0ZW0sIGlzR3JvdXAsIGlzU2VsZWN0aW9uLCBpdGVtR3JvdXAsIHNlbGVjdGVkSXRlbXMsIHVuc2VsZWN0ZWRJdGVtcywgYWxsSXRlbXMsIGFsbEdyb3Vwcyk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBJbXBvc3RvIGlsIGNoZWNrIGdsb2JhbGUgaW4gYmFzZSBhIHNlIHR1dHRpIGdsaSBlbGVtZW50aSBzb25vIHNlbGV6aW9uYXRpIG8gbWVuby5cclxuICAgICAgICAvLyBFdml0byBkaSBmYXJlIHF1ZXN0ZSBvcGVyYXppb25pIHNlIGxhIHNlbGV6aW9uZSBkZXJpdmEgcHJvcHJpbyBkYWwgZ2xvYmFsIENoZWNrXHJcbiAgICAgICAgaWYgKGdsb2JhbENoZWNrID09IG51bGwpXHJcbiAgICAgICAgICAgIHRoaXMuZXN0Lmdsb2JhbENoZWNrID0gIXRoaXMuZXN0LmJvdW5kU291cmNlLnNvbWUodCA9PiAhdC5fc2VsZWN0ZWQgJiYgIXQuX3NlcCk7XHJcblxyXG4gICAgICAgIHRoaXMuZmluYWxpemVTZWxlY3Rpb25JbmZvcm1hdGlvbnMoc2kpO1xyXG5cclxuICAgICAgICByZXR1cm4gc2k7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRvIEwnb2dnZXR0byBkaSBzZWxlemlvbmUsIGwnb2dnZXR0byBkYSBzZWxlemlvbmFyZS9kZXNlbGV6aW9uYXJlIGUgdHV0dGkgaSBwYXJhbWV0cmkgZGVsIGNhc28gZWZmZXR0dWEgbGUgb3BlcmF6aW9uaSBjaGUgc2Vydm9uby5cclxuICAgICAqIFxyXG4gICAgICogTG9naWNhIHNlbXBsaWZpY2F0YSByaXNwZXR0byBhbGwnb3JpZ2luYWxlICoqcGVyZm9ybVNlbGVjdGlvbk9wZXJhdGlvbnMqKiBwZXIgbGF2b3JhcmUgaW4gdW5hIG1vZGFsaXTDoCBpbiBjdWkgdHV0dGkgZ2xpIGVsZW1lbnRpIHNvbm8gY2FyaWNhdGkgKCoqQXJyYXlHcm91cGluZyoqID0gdHJ1ZSlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwZXJmb3JtU2ltcGxlU2VsZWN0aW9uT3BlcmF0aW9ucyhiYXNlOiBJdGVtc1NlbGVjdGlvbjxhbnk+LCBpdGVtOiBhbnksIGdyb3VwOiBib29sZWFuLCBzZWw6IGJvb2xlYW4sIGl0bV9ncm91cDogYW55LCBzZWxfaXRtOiBhbnlbXSwgZGVzZWxfaXRtOiBhbnlbXSwgYWxsX2l0bXM6IGFueVtdLCBhbGxfZ3JwczogYW55W10pIHtcclxuICAgICAgICBsZXQgdHJpcHRpY0l0ZW0gPSB0aGlzLmdldFRyaXB0aWMoJ2l0ZW0nLCBiYXNlKTtcclxuXHJcbiAgICAgICAgaWYgKGdyb3VwKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICAgICAgIGFsbF9ncnBzLmZvckVhY2goZ3IgPT4geyBnci5fc2VsZWN0ZWQgPSB0cnVlOyB9KTtcclxuICAgICAgICAgICAgICAgIGlmIChkZXNlbF9pdG0pXHJcbiAgICAgICAgICAgICAgICAgICAgZGVzZWxfaXRtLmZvckVhY2goZWwgPT4geyBlbC5fc2VsZWN0ZWQgPSB0cnVlOyB0aGlzLmFkZEl0ZW0oZWwsIHRyaXB0aWNJdGVtKSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGFsbF9ncnBzLmZvckVhY2goZ3IgPT4geyBnci5fc2VsZWN0ZWQgPSBmYWxzZTsgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsX2l0bSlcclxuICAgICAgICAgICAgICAgICAgICBzZWxfaXRtLmZvckVhY2goZWwgPT4geyBlbC5fc2VsZWN0ZWQgPSBmYWxzZTsgdGhpcy5yZW1vdmVJdGVtKGVsLCB0cmlwdGljSXRlbSkgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbShpdGVtLCB0cmlwdGljSXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRtX2dyb3VwICYmIGFsbF9pdG1zICYmIGFsbF9pdG1zLmV2ZXJ5KHQgPT4gdC5fc2VsZWN0ZWQpKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0R3JvdXAoaXRtX2dyb3VwKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtLCB0cmlwdGljSXRlbSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoaXRtX2dyb3VwKVxyXG4gICAgICAgICAgICAgICAgICAgIGl0bV9ncm91cC5fc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBwZXIgc2VsZXppb25hcmUgdW4gZ3J1cHBvIGUsIHJpY29yc2l2YW1lbnRlLCBzZSB0dXR0aSBpIGdydXBwaSBzb3R0b3N0YW50aSBhbCBwYXJlbnQgc29ubyBzZWxlemlvbmF0aSwgc2VsZXppb25hcmUgaSBncnVwcGkgcGFkcmlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGdyb3VwIEdydXBwbyBkYSBzZWxlemlvbmFyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHNlbGVjdEdyb3VwKGdyb3VwOiBhbnkpIHtcclxuICAgICAgICBncm91cC5fc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmdldEdyb3VwUGFyZW50KGdyb3VwKTtcclxuICAgICAgICBpZiAocGFyZW50ICYmIHRoaXMuZ2V0R3JvdXBDaGlsZEdyb3VwcyhudWxsLCBwYXJlbnQsIG51bGwsIHRydWUpLmV2ZXJ5KHQgPT4gdC5fc2VsZWN0ZWQpKVxyXG4gICAgICAgICAgICB0aGlzLnNlbGVjdEdyb3VwKHBhcmVudCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRvIEwnb2dnZXR0byBkaSBzZWxlemlvbmUsIGwnb2dnZXR0byBkYSBzZWxlemlvbmFyZS9kZXNlbGV6aW9uYXJlIGUgdHV0dGkgaSBwYXJhbWV0cmkgZGVsIGNhc28gZWZmZXR0dWEgbGUgb3BlcmF6aW9uaSBjaGUgc2Vydm9uby5cclxuICAgICAqIFxyXG4gICAgICogTGEgbG9naWNhIGRpIHF1ZXN0YSBmdW56aW9uZSDDqCBuYXRhIGVzc2VuemlhbG1lbnRlIGRhIHNwYW0gZGkgdHJpYWwgJiBlcnJvciBlZCDDqCBzdGF0YSB0ZXN0YXRhIHNvbG8gZmlubyBhIGR1ZSBsaXZlbGxpIGRpIHJhZ2dydXBwYW1lbnRvLFxyXG4gICAgICogcXVhbHNpYXNpIGNvc2EgdmFkYSBvbHRyZSBub24gw6ggMTAwJSBkZXR0byBjaGUgZnVuemlvbmkuLi5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBwZXJmb3JtU2VsZWN0aW9uT3BlcmF0aW9ucyhiYXNlOiBJdGVtc1NlbGVjdGlvbjxhbnk+LCBpdGVtOiBhbnksIGFsbDogYm9vbGVhbiwgZ3JvdXA6IGJvb2xlYW4sIHNlbDogYm9vbGVhbiwgc2VsX2l0bTogYW55W10sIHNlbF9ncnA6IGFueVtdLCBkZXNlbF9pdG06IGFueVtdLCBkZXNlbF9ncnA6IGFueVtdLCBhbGxfaXRtczogYW55W10sIGFsbF9ncnBzOiBhbnlbXSwgcGFyZW50X2luY2w6IGJvb2xlYW4sIHBhcmVudF9leGNsOiBib29sZWFuKSB7XHJcbiAgICAgICAgbGV0IHRyaXB0aWNHcm91cCA9IHRoaXMuZ2V0VHJpcHRpYygnZ3JvdXAnLCBiYXNlKTtcclxuICAgICAgICBsZXQgdHJpcHRpY0l0ZW0gPSB0aGlzLmdldFRyaXB0aWMoJ2l0ZW0nLCBiYXNlKTtcclxuICAgICAgICBsZXQgdHJpcHRpY0V4Y2wgPSB0aGlzLmdldFRyaXB0aWMoJ2V4Y2x1c2lvbicsIGJhc2UpO1xyXG4gICAgICAgIGxldCB0cmlwdGljZ3JwRXhjbCA9IHRoaXMuZ2V0VHJpcHRpYygnZ3JvdXBfZXhjbHVzaW9uJywgYmFzZSk7XHJcblxyXG4gICAgICAgIGlmIChncm91cCkge1xyXG4gICAgICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxsIHx8IHBhcmVudF9pbmNsKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtLCB0cmlwdGljZ3JwRXhjbCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtKGl0ZW0sIHRyaXB0aWNHcm91cCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbF9pdG0pIHNlbF9pdG0uZm9yRWFjaChlbCA9PiB0aGlzLnJlbW92ZUl0ZW0oZWwsIHRyaXB0aWNJdGVtKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsX2dycCkgc2VsX2dycC5mb3JFYWNoKGdyID0+IHRoaXMucmVtb3ZlSXRlbShnciwgdHJpcHRpY0dyb3VwKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxsX2l0bXMpIGFsbF9pdG1zLmZvckVhY2goZWwgPT4geyBlbC5fc2VsZWN0ZWQgPSB0cnVlOyB0aGlzLnJlbW92ZUl0ZW0oZWwsIHRyaXB0aWNFeGNsKTsgfSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxsX2dycHMpIGFsbF9ncnBzLmZvckVhY2goZ3IgPT4geyBnci5fc2VsZWN0ZWQgPSB0cnVlOyB0aGlzLnJlbW92ZUl0ZW0oZ3IsIHRyaXB0aWNncnBFeGNsKTsgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxsIHx8IHBhcmVudF9pbmNsKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbShpdGVtLCB0cmlwdGljZ3JwRXhjbCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGl0ZW0sIHRyaXB0aWNHcm91cCk7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKGRlc2VsX2l0bSkgZGVzZWxfaXRtLmZvckVhY2goZWwgPT4gdGhpcy5yZW1vdmVJdGVtKGVsLCB0cmlwdGljRXhjbCkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlc2VsX2dycCkgZGVzZWxfZ3JwLmZvckVhY2goZ3IgPT4gdGhpcy5yZW1vdmVJdGVtKGdyLCB0cmlwdGljRXhjbCkpO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFsbF9pdG1zKSBhbGxfaXRtcy5mb3JFYWNoKGVsID0+IHsgZWwuX3NlbGVjdGVkID0gZmFsc2U7IHRoaXMucmVtb3ZlSXRlbShlbCwgdHJpcHRpY0l0ZW0pOyB9KTtcclxuICAgICAgICAgICAgICAgIGlmIChhbGxfZ3JwcykgYWxsX2dycHMuZm9yRWFjaChnciA9PiB7IGdyLl9zZWxlY3RlZCA9IGZhbHNlOyB0aGlzLnJlbW92ZUl0ZW0oZ3IsIHRyaXB0aWNHcm91cCk7IH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoc2VsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoKHBhcmVudF9leGNsID09IG51bGwgJiYgYWxsKSB8fCBwYXJlbnRfaW5jbClcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSwgdHJpcHRpY0V4Y2wpO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbShpdGVtLCB0cmlwdGljSXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocGFyZW50X2V4Y2wgfHwgKCFhbGwgJiYgcGFyZW50X2V4Y2wgPT0gbnVsbCkpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGl0ZW0sIHRyaXB0aWNJdGVtKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW0oaXRlbSwgdHJpcHRpY0V4Y2wpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIZWxwZXIgcGVyIGV2aXRhcmUgZGkgcmlzY3JpdmVyZSBvZ25pIHNhbnRhIHZvbHRhIGFycmF5LnNwbGljZShhcnJheS5pbmRleG9mKGl0ZW0pLCAxKTsgKi9cclxuICAgIHByaXZhdGUgcmVtb3ZlSXRlbShpdGVtOiBhbnksIHRyaXB0aWM/OiBDYWNoZVRyaXB0aWMpIHtcclxuICAgICAgICBsZXQgaW5kZXggPSB0cmlwdGljLmluZGV4X2NhY2hlLmdldChpdGVtLl9oYXNoKTtcclxuICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0cmlwdGljLmNhY2hlLmRlbGV0ZShpdGVtLl9oYXNoKTtcclxuICAgICAgICAgICAgdHJpcHRpYy5pbmRleF9jYWNoZS5kZWxldGUoaXRlbS5faGFzaCk7XHJcbiAgICAgICAgICAgIHRyaXB0aWMuYXJyYXlbaW5kZXhdID0gbnVsbDtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiAhIWluZGV4O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIZWxwZXIgcGVyIGV2aXRhcmUgZGkgcmlzY3JpdmVyZSBvZ25pIHNhbnRhIHZvbHRhIGFycmF5LnB1c2goaXRlbSk7IGUgbGEgZ2VzdGlvbmUgZGVsbGEgICovXHJcbiAgICBwcml2YXRlIGFkZEl0ZW0oaXRlbTogYW55LCB0cmlwdGljPzogQ2FjaGVUcmlwdGljKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKHRyaXB0aWMuaW5kZXhfY2FjaGUuZ2V0KGl0ZW0uX2hhc2gpID09IG51bGwpIHtcclxuICAgICAgICAgICAgbGV0IGkgPSB0cmlwdGljLmFycmF5LnB1c2goaXRlbSkgLSAxO1xyXG4gICAgICAgICAgICB0cmlwdGljLmNhY2hlLnNldChpdGVtLl9oYXNoLCBpdGVtKTtcclxuICAgICAgICAgICAgdHJpcHRpYy5pbmRleF9jYWNoZS5zZXQoaXRlbS5faGFzaCwgaSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBpbCB0cml0dGljbyBkaSBzZWxlemlvbmUsIGNpb8OoIGwnYXJyYXkgZGVnbGkgb2dnZXR0aSBjaGUgc2kgdnVvbGUgbWFuaXBvbGFyZSBlIGxlIGR1ZSBjYWNoZSBjb2xsZWdhdGUgYWQgZXNzb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0geydncm91cCcgfCAnaXRlbScgfCAnZ3JvdXBfZXhjbHVzaW9uJyB8ICdleGNsdXNpb24nfSBzdWJqZWN0IE9nZ2V0dG8gbG9naWNvIGRlc2lkZXJhdG8gc3UgY3VpIGVmZmV0dHVhcmUgbGUgb3BlcmF6aW9uaSBzdWNjZXNzaXZlXHJcbiAgICAgKiBAcGFyYW0ge0l0ZW1zU2VsZWN0aW9uPGFueT59IGJhc2UgU2VsZXR0b3JlIGRpIGJhc2VcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge0NhY2hlVHJpcHRpY30gVHJpdHRpY28gZGkgc2VsZXppb25lXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0VHJpcHRpYyhzdWJqZWN0OiAnZ3JvdXAnIHwgJ2l0ZW0nIHwgJ2dyb3VwX2V4Y2x1c2lvbicgfCAnZXhjbHVzaW9uJywgYmFzZTogSXRlbXNTZWxlY3Rpb248YW55Pik6IENhY2hlVHJpcHRpYyB7XHJcbiAgICAgICAgc3dpdGNoIChzdWJqZWN0KSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ2dyb3VwJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FjaGVUcmlwdGljKHRoaXMuZ3JvdXBzQ2FjaGUsIHRoaXMuaV9ncm91cHNDYWNoZSwgYmFzZS5ncm91cHMpO1xyXG4gICAgICAgICAgICBjYXNlICdpdGVtJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FjaGVUcmlwdGljKHRoaXMuaXRlbXNDYWNoZSwgdGhpcy5pX2l0ZW1zQ2FjaGUsIGJhc2UuaXRlbXMpO1xyXG4gICAgICAgICAgICBjYXNlICdncm91cF9leGNsdXNpb24nOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWNoZVRyaXB0aWModGhpcy5ncm91cF9leGNsdXNpb25zQ2FjaGUsIHRoaXMuaV9ncm91cF9leGNsdXNpb25zQ2FjaGUsIGJhc2UuZ3JvdXBfZXhjbHVzaW9ucyk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2V4Y2x1c2lvbic6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENhY2hlVHJpcHRpYyh0aGlzLmV4Y2x1c2lvbnNDYWNoZSwgdGhpcy5pX2V4Y2x1c2lvbnNDYWNoZSwgYmFzZS5leGNsdXNpb25zKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRvIHVuIG9nZ2V0dG8gcmVzdGl0dWlzY2UgaWwgZ3J1cHBvIGRpIGN1aSBmYSBwYXJ0ZSwgc2UgZXNpc3RlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gZGkgY3VpIHRyb3ZhcmUgaWwgZ3J1cHBvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0SXRlbUdyb3VwKGl0ZW06IGFueSk6IGFueSB7XHJcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMucmdIYW5kbGVyLnJnR3JvdXBDYWNoZS5nZXQoaXRlbS5fdGhpc0tleSlcclxuICAgICAgICBpZiAocGFyZW50KVxyXG4gICAgICAgICAgICByZXR1cm4gcGFyZW50O1xyXG5cclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgbGEgY2hpYXZlIGRpIHVuIGdydXBwbyByZXN0aXR1aXNjZSB0dXR0aSBnbGkgb2dnZXR0aSBjb24gcXVlbGxhIGNoaWF2ZVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gZ3JvdXAgQ2hpYXZlIGRhIGNlcmNhcmVcclxuICAgICAqIEBwYXJhbSB7J3NlbGVjdGVkJyB8ICd1bnNlbGVjdGVkJ30gc3RhdHVzIFN0YXRvIGRlZ2xpIGVsZW1lbnRpLCBzZWxlemlvbmF0aSBvIG5vXHJcbiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHJlY3Vyc2l2ZSBJbmRpY2Egc2UgY2VyY2FyZSBzb2xvIGdsaSBlbGVtZW50aSBkaXJldHRhbWVudGUgY29sbGVnYXRpIG8gc2UgcHJlbmRlcmUgYW5jaGUgcXVlbGxpIGRlaSBncnVwcGkgZmlnbGlcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2FueVtdfSBPZ2dldHRpIGRpIHRpcG8gKipfaXRlbSoqIGZhY2VudGkgY2FwbyBhbGxhIGNoaWF2ZSAqKmdyb3VwS2V5KipcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRHcm91cEl0ZW1zKHNlbDogSXRlbXNTZWxlY3Rpb248YW55PiwgZ3JvdXA6IGFueSwgc3RhdHVzPzogJ3NlbGVjdGVkJyB8ICd1bnNlbGVjdGVkJywgcmVjdXJzaXZlOiBib29sZWFuID0gZmFsc2UsIGFsbGJhc2U6IGFueVtdID0gbnVsbCk6IGFueVtdIHtcclxuICAgICAgICBsZXQgaXRlbXMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKGFsbGJhc2UpXHJcbiAgICAgICAgICAgIGl0ZW1zID0gYWxsYmFzZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSW4gbW9kYWxpdMOgIHJpY29yc2l2YSBwcmVuZG8gZ2xpIG9nZ2V0dGkgZGkgdHV0dGUgbGUgY2hpYXZpIHNpbWlsaSBjaGUgdHJvdm9cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiB0aGlzLnJnSGFuZGxlci5yZ0l0ZW1DYWNoZS5rZXlzKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleS5zdGFydHNXaXRoKGdyb3VwLl90aGlzS2V5KSlcclxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXMucHVzaCguLi50aGlzLnJnSGFuZGxlci5yZ0l0ZW1DYWNoZS5nZXQoa2V5KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgaXRlbXMgPSB0aGlzLnJnSGFuZGxlci5yZ0l0ZW1DYWNoZS5nZXQoZ3JvdXAuX3RoaXNLZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIodCA9PiAhc3RhdHVzIHx8ICh0Ll9zZWxlY3RlZCAmJiBzdGF0dXMgPT0gJ3NlbGVjdGVkJykgfHwgKCF0Ll9zZWxlY3RlZCAmJiBzdGF0dXMgPT0gJ3Vuc2VsZWN0ZWQnKSk7XHJcblxyXG4gICAgICAgIC8vIE5vbiB0cm92byBuZXNzdW4gb2dnZXR0bywgcGVyw7IgbWFnYXJpIGRpIG9nZ2V0dGkgbmUgaG8gYWxsJ2ludGVybm8gZGVsbCdvZ2dldHRvIGRpIHNlbGV6aW9uZS4gXHJcbiAgICAgICAgLy8gUXVlc3RvIHB1w7IgZXNzZXJlIHZlcm8gc29sbyBzZSBOT04gc29ubyBpbiBtb2RhbGl0w6AgYXJyYXksIGluIGNhc28gY29udHJhcmlvIGdsaSBvZ2dldHRpIGxpIGRldm8gcGVyIGZvcnphIGF2ZXJlIHR1dHRpXHJcbiAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCAhPSAwIHx8ICFzZWwgfHwgdGhpcy5lc3QuYXJyYXlNb2RlKVxyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XHJcblxyXG4gICAgICAgIGlmIChzdGF0dXMgPT0gJ3Vuc2VsZWN0ZWQnKVxyXG4gICAgICAgICAgICBpdGVtcyA9IHNlbC5leGNsdXNpb25zLmZpbHRlcih0ID0+IHQgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAgICAgKCFyZWN1cnNpdmUgJiYgdC5fdGhpc0tleSA9PSBncm91cC5fdGhpc0tleSkgfHxcclxuICAgICAgICAgICAgICAgIChyZWN1cnNpdmUgJiYgdC5fdGhpc0tleS5zdGFydHNXaXRoKGdyb3VwLl90aGlzS2V5KSkpO1xyXG4gICAgICAgIGVsc2UgaWYgKHN0YXR1cyA9PSAnc2VsZWN0ZWQnKVxyXG4gICAgICAgICAgICBpdGVtcyA9IHNlbC5pdGVtcy5maWx0ZXIodCA9PiB0ICE9IG51bGwgJiZcclxuICAgICAgICAgICAgICAgICghcmVjdXJzaXZlICYmIHQuX3RoaXNLZXkgPT0gZ3JvdXAuX3RoaXNLZXkpIHx8XHJcbiAgICAgICAgICAgICAgICAocmVjdXJzaXZlICYmIHQuX3RoaXNLZXkuc3RhcnRzV2l0aChncm91cC5fdGhpc0tleSkpKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0YSBsYSBjaGlhdmUgZGkgdW4gZ3J1cHBvIHJlc3RpdHVpc2NlIHR1dHRpIGdsaSBvZ2dldHRpIGNvbiBxdWVsbGEgY2hpYXZlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBncm91cCBHcnVwcG8gZGkgY3VpIGNlcmNhcmUgaWwgcGFyZW50XHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHthbnl9IE9nZ2V0dG8gZGkgdGlwbyAqKl9ncm91cCoqIHJhcHByZXNlbnRhbnRlIGlsIHBhcmVudCBkZWwgKipncm91cCoqIGF0dHVhbGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRHcm91cFBhcmVudChncm91cDogYW55KTogYW55IHtcclxuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5yZ0hhbmRsZXIucmdHcm91cENhY2hlLmdldChncm91cC5fcGFyZW50KVxyXG4gICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0YSBsYSBjaGlhdmUgZGkgdW4gZ3J1cHBvIHJlc3RpdHVpc2NlIHR1dHRpIGkgZ3J1cHBpIGZpZ2xpXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBncm91cCBHcnVwcG8gY2hlIHJhcHByZXNlbnRhIGlsIHBhZHJlIGRpIGN1aSBjZXJjYXJlIGkgZmlnbGlcclxuICAgICAqIEBwYXJhbSB7J3NlbGVjdGVkJyB8ICd1bnNlbGVjdGVkJ30gc3RhdHVzIFN0YXRvIGRlaSBncnVwcGksIHNlbGV6aW9uYXRpIG8gbm9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVjdXJzaXZlIEluZGljYSBzZSBjZXJjYXJlIHNvbG8gaSBncnVwcGkgZGlyZXR0YW1lbnRlIGNvbGxlZ2F0aSBvIHNlIHByZW5kZXJlIGFuY2hlIHF1ZWxsaSBkZWkgZ3J1cHBpIGZpZ2xpXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHthbnlbXX0gT2dnZXR0aSBkaSB0aXBvICoqX2dyb3VwKiogZmFjZW50aSBjYXBvIGFsbGEgY2hpYXZlICoqZ3JvdXBLZXkqKlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEdyb3VwQ2hpbGRHcm91cHMoc2VsOiBJdGVtc1NlbGVjdGlvbjxhbnk+LCBncm91cDogYW55LCBzdGF0dXM/OiAnc2VsZWN0ZWQnIHwgJ3Vuc2VsZWN0ZWQnLCByZWN1cnNpdmU6IGJvb2xlYW4gPSBmYWxzZSwgYWxsYmFzZTogYW55W10gPSBudWxsKSB7XHJcbiAgICAgICAgbGV0IHRoaXNHcm91cDogYW55ID0gdGhpcy5yZ0hhbmRsZXIucmdHcm91cENhY2hlLmdldChncm91cC5fdGhpc0tleSk7XHJcbiAgICAgICAgbGV0IGl0ZW1zID0gW107XHJcblxyXG4gICAgICAgIGlmIChhbGxiYXNlKVxyXG4gICAgICAgICAgICBpdGVtcyA9IGFsbGJhc2U7XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChyZWN1cnNpdmUpIHtcclxuICAgICAgICAgICAgICAgIC8vIEluIG1vZGFsaXTDoCByaWNvcnNpdmEgcHJlbmRvIGdsaSBvZ2dldHRpIGRpIHR1dHRlIGxlIGNoaWF2aSBzaW1pbGkgY2hlIHRyb3ZvXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgb2YgdGhpcy5yZ0hhbmRsZXIucmdDaGlsZEdyb3Vwc0NhY2hlLmtleXMoKSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoZ3JvdXAuX3RoaXNLZXkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKC4uLnRoaXMucmdIYW5kbGVyLnJnQ2hpbGRHcm91cHNDYWNoZS5nZXQoa2V5KSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgaXRlbXMgPSB0aGlzLnJnSGFuZGxlci5yZ0NoaWxkR3JvdXBzQ2FjaGUuZ2V0KGdyb3VwLl90aGlzS2V5KTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGl0ZW1zID0gaXRlbXMuZmlsdGVyKHQgPT4gIXN0YXR1cyB8fCAodC5fc2VsZWN0ZWQgJiYgc3RhdHVzID09ICdzZWxlY3RlZCcpIHx8ICghdC5fc2VsZWN0ZWQgJiYgc3RhdHVzID09ICd1bnNlbGVjdGVkJykpO1xyXG5cclxuICAgICAgICAvLyBOb24gdHJvdm8gbmVzc3VuIG9nZ2V0dG8sIHBlcsOyIG1hZ2FyaSBkaSBvZ2dldHRpIG5lIGhvIGFsbCdpbnRlcm5vIGRlbGwnb2dnZXR0byBkaSBzZWxlemlvbmVcclxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoICE9IDAgfHwgIXNlbClcclxuICAgICAgICAgICAgcmV0dXJuIGl0ZW1zO1xyXG5cclxuICAgICAgICBpZiAoc3RhdHVzID09ICd1bnNlbGVjdGVkJylcclxuICAgICAgICAgICAgaXRlbXMgPSBzZWwuZ3JvdXBfZXhjbHVzaW9ucy5maWx0ZXIoKHQ6IGFueSkgPT4gdCAhPSBudWxsICYmIChcclxuICAgICAgICAgICAgICAgICghcmVjdXJzaXZlICYmIHQuX3RoaXNSb3V0ZS5sZW5ndGggPT0gdGhpc0dyb3VwLl90aGlzUm91dGUubGVuZ3RoICsgMSAmJiB0Ll90aGlzUm91dGUuc3RhcnRzV2l0aChncm91cC5fdGhpc0tleSkpIHx8XHJcbiAgICAgICAgICAgICAgICAocmVjdXJzaXZlICYmIHQuX3RoaXNLZXkuc3RhcnRzV2l0aChncm91cC5fdGhpc0tleSkpKSk7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICBpdGVtcyA9IHNlbC5ncm91cHMuZmlsdGVyKCh0OiBhbnkpID0+IHQgIT0gbnVsbCAmJiAoXHJcbiAgICAgICAgICAgICAgICAoIXJlY3Vyc2l2ZSAmJiB0Ll90aGlzUm91dGUubGVuZ3RoID09IHRoaXNHcm91cC5fdGhpc1JvdXRlLmxlbmd0aCArIDEgJiYgdC5fdGhpc1JvdXRlLnN0YXJ0c1dpdGgoZ3JvdXAuX3RoaXNLZXkpKSB8fFxyXG4gICAgICAgICAgICAgICAgKHJlY3Vyc2l2ZSAmJiB0Ll90aGlzS2V5LnN0YXJ0c1dpdGgoZ3JvdXAuX3RoaXNLZXkpKSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEZpbmFsaXp6YSBsZSBpbmZvcm1hemlvbmkgZGkgc2VsZXppb25lIGRlbCAqKkl0ZW1zU2VsZWN0aW9uKiogY29ycmVudGUgKi9cclxuICAgIHByaXZhdGUgZmluYWxpemVTZWxlY3Rpb25JbmZvcm1hdGlvbnMoc2VsZWN0aW9uSXRlbTogSXRlbXNTZWxlY3Rpb248YW55Pikge1xyXG4gICAgICAgIC8vIERhdG8gY2hlIGxlIGRlbGV0ZSBzb25vIGxvZ2ljaGUgZGF0byBjaGUgdGVuZ28gbGEgY2FjaGUgZGVnbGkgaW5kaWNpIGRldm8gcmVuZGVybGUgZmlzaWNoZVxyXG4gICAgICAgIGxldCB0bXBHcnAgPSBbXSwgdG1wSXRlbXMgPSBbXSwgdG1wRXhjbCA9IFtdLCB0bXBHcnBFeGNsID0gW107XHJcbiAgICAgICAgbGV0IGdycFJlbW92ZWQgPSBmYWxzZSwgaXRlbXNSZW1vdmVkID0gZmFsc2UsIGV4Y2xSZW1vdmVkID0gZmFsc2UsIGdycEV4Y2xSZW1vdmVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uSXRlbS5pdGVtcy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW0uaXRlbXNbaV0gIT0gbnVsbCkgdG1wSXRlbXMucHVzaChzZWxlY3Rpb25JdGVtLml0ZW1zW2ldKTtcclxuICAgICAgICAgICAgZWxzZSBpdGVtc1JlbW92ZWQgPSB0cnVlO1xyXG5cclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbkl0ZW0uZXhjbHVzaW9ucy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW0uZXhjbHVzaW9uc1tpXSAhPSBudWxsKSB0bXBFeGNsLnB1c2goc2VsZWN0aW9uSXRlbS5leGNsdXNpb25zW2ldKTtcclxuICAgICAgICAgICAgZWxzZSBleGNsUmVtb3ZlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIC8vIEluIHZlY2NoaWUgdmVyc2lvbmkgZGVsbCdBcHBTZWFyY2ggcGVyIGN1aSBub24gdmVuZ29ubyBkZXNlcmlhbGl6emF0ZSBxdWVzdGUgaW5mb3JtYWl6b25pIHBvdHJlYmJlcm8gZXNzZXJjaSBjYXNpbmlcclxuICAgICAgICBpZiAoc2VsZWN0aW9uSXRlbS5ncm91cHMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb25JdGVtLmdyb3Vwcy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JdGVtLmdyb3Vwc1tpXSAhPSBudWxsKSB0bXBHcnAucHVzaChzZWxlY3Rpb25JdGVtLmdyb3Vwc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGdycFJlbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW0uZ3JvdXBfZXhjbHVzaW9ucykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbkl0ZW0uZ3JvdXBfZXhjbHVzaW9ucy5sZW5ndGg7IGkrKylcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JdGVtLmdyb3VwX2V4Y2x1c2lvbnNbaV0gIT0gbnVsbCkgdG1wR3JwRXhjbC5wdXNoKHNlbGVjdGlvbkl0ZW0uZ3JvdXBfZXhjbHVzaW9uc1tpXSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlIGdycEV4Y2xSZW1vdmVkID0gdHJ1ZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHNlbGVjdGlvbkl0ZW0uaXRlbXMgPSB0bXBJdGVtcztcclxuICAgICAgICBzZWxlY3Rpb25JdGVtLmdyb3VwX2V4Y2x1c2lvbnMgPSB0bXBHcnBFeGNsO1xyXG4gICAgICAgIHNlbGVjdGlvbkl0ZW0uZXhjbHVzaW9ucyA9IHRtcEV4Y2w7XHJcbiAgICAgICAgc2VsZWN0aW9uSXRlbS5ncm91cHMgPSB0bXBHcnA7XHJcblxyXG4gICAgICAgIC8vIExlIGNhY2hlIGRlZ2xpIGluZGljaSBwb3RyZWJiZXJvIGF2ZXJlIGJ1Y2hpLCByaXNvbHZvXHJcbiAgICAgICAgaWYgKGdycFJlbW92ZWQpXHJcbiAgICAgICAgICAgIHRoaXMuaV9ncm91cHNDYWNoZSA9IHRoaXMuY29tcGFjdEluZGV4TWFwKHRoaXMuaV9ncm91cHNDYWNoZSk7XHJcbiAgICAgICAgaWYgKGl0ZW1zUmVtb3ZlZClcclxuICAgICAgICAgICAgdGhpcy5pX2l0ZW1zQ2FjaGUgPSB0aGlzLmNvbXBhY3RJbmRleE1hcCh0aGlzLmlfaXRlbXNDYWNoZSk7XHJcbiAgICAgICAgaWYgKGV4Y2xSZW1vdmVkKVxyXG4gICAgICAgICAgICB0aGlzLmlfZXhjbHVzaW9uc0NhY2hlID0gdGhpcy5jb21wYWN0SW5kZXhNYXAodGhpcy5pX2V4Y2x1c2lvbnNDYWNoZSk7XHJcbiAgICAgICAgaWYgKGdycEV4Y2xSZW1vdmVkKVxyXG4gICAgICAgICAgICB0aGlzLmlfZ3JvdXBfZXhjbHVzaW9uc0NhY2hlID0gdGhpcy5jb21wYWN0SW5kZXhNYXAodGhpcy5pX2dyb3VwX2V4Y2x1c2lvbnNDYWNoZSk7XHJcblxyXG4gICAgICAgIC8vIFBvaSByaXByZW5kbyBhIGZhcmUgdHV0dG8gaW4gbm9ybWFsaXTDoFxyXG4gICAgICAgIHNlbGVjdGlvbkl0ZW0uY291bnQgPSB0aGlzLmV2YWx1YXRlU2VsZWN0ZWQoKTtcclxuXHJcbiAgICAgICAgLy8gU2UgaG8gZmF0dG8gc2VsZXppb25lIFwiYWxsXCIgbWEgcG9pIG1pIHNvbm8gbWVzc28gYSB0b2dsaWVyZSB0dXR0aSBnbGkgZWxlbWVudGkgZmlubyBhIHJpbWFuZXJuZSAwIHJlc2V0dG8gbCdvZ2dldHRvIGRpIHNlbGV6aW9uZVxyXG4gICAgICAgIGlmIChzZWxlY3Rpb25JdGVtLmNvdW50ID09IDApIHtcclxuICAgICAgICAgICAgdGhpcy5lc3QuYm91bmRTb3VyY2UuZm9yRWFjaCh0ID0+IHQuX3NlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb25JdGVtLmFsbCA9IGZhbHNlO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb25JdGVtLmV4Y2x1c2lvbnMgPSBbXTtcclxuICAgICAgICAgICAgc2VsZWN0aW9uSXRlbS5pdGVtcyA9IFtdO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb25JdGVtLmdyb3VwcyA9IFtdO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb25JdGVtLmdyb3VwX2V4Y2x1c2lvbnMgPSBbXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFJpcHVsaXNjbyBsYSBjYWNoZSBhbHRyaW1lbnRpIG1pIHJpbWFuZSBwaWVuYSBkaSB0dXR0ZSBsZSBlc2NsdXNpb25pXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25DYWNoZXMoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIFNlIGxhIHBvc3NpYmlsaXTDoCBkaSBmYXJlIFwiU2VsZXppb25hIHR1dHRvXCIgw6ggYWJpbGl0YXRhIGFsbG9yYSBsYSBjb25zaWRlcm8gYXBwZW5hIG1pIHZpZW5lIHNlbGV6aW9uYXRvIHF1YWxjb3NhXHJcbiAgICAgICAgdGhpcy5lc3QuY2FuU2VsZWN0QWxsID0gc2VsZWN0aW9uSXRlbS5jb3VudCA+IDAgJiYgdGhpcy5lc3QuU2VsZWN0QWxsICYmICF0aGlzLmVzdC5TaW5nbGVTZWxlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIENvbXBhdHRhIHVuYSBjYWNoZSBkaSBpbmRpY2kgKi9cclxuICAgIHByaXZhdGUgY29tcGFjdEluZGV4TWFwKG1hcDogTWFwPHN0cmluZywgbnVtYmVyPik6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xyXG4gICAgICAgIGxldCBpbmRleCA9IDA7XHJcbiAgICAgICAgbGV0IHJldCA9IG5ldyBNYXAoKTtcclxuICAgICAgICBmb3IgKGxldCBrZXkgb2YgbWFwLmtleXMoKSlcclxuICAgICAgICAgICAgcmV0LnNldChrZXksIGluZGV4KyspO1xyXG5cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIFZhbHV0YSBsYSBxdWFudGl0w6AgZGkgb2dnZXR0aSBjaGUgc29ubyBzdGF0aSBzZWxlemlvbmF0aSBhbCB0ZXJtaW5lIGRpIHVuIGV2ZW50byBkaSBzZWxlemlvbmVcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOdW1lcm8gZGkgb2dnZXR0aSBzZWxlemlvbmF0aVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGV2YWx1YXRlU2VsZWN0ZWQoKTogbnVtYmVyIHtcclxuICAgICAgICBsZXQgc2kgPSAodGhpcy5lc3QuVmlldyBhcyBBcHBTZWFyY2g8YW55Pik/LnNlbGVjdGlvbiB8fCB0aGlzLmVzdC5hcnJheW1vZGVTZWxlY3Rpb247XHJcblxyXG4gICAgICAgIGxldCBleGNCeUdyb3VwID0gc2kuZ3JvdXBfZXhjbHVzaW9ucy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLmNvdW50LCAwKTtcclxuICAgICAgICBsZXQgaW5jQnlHcm91cCA9IHNpLmdyb3Vwcy5yZWR1Y2UoKHByZXYsIGN1cnIpID0+IHByZXYgKyBjdXJyLmNvdW50LCAwKTtcclxuXHJcbiAgICAgICAgdGhpcy5lc3Quc2VsZWN0ZWRPYmplY3RzID0gKHNpLmFsbCA/IHRoaXMuZXN0LkJhc2VJdGVtc0NvdW50IDogaW5jQnlHcm91cCkgLSBleGNCeUdyb3VwICsgc2kuaXRlbXMubGVuZ3RoIC0gc2kuZXhjbHVzaW9ucy5sZW5ndGg7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuZXN0LnNlbGVjdGVkT2JqZWN0cztcclxuICAgIH1cclxuXHJcbiAgICAvKiogR2VzdGlzY2UgaWwgY29tYW5kbyBkaSBcIlNlbGV6aW9uYSB0dXR0byBpbiB0dXR0ZSBsZSBwYWdpbmVcIiBvIGlsIHN1byBjb250cmFyaW8sIGNpb8OoIFwiUmVpbXBvc3RhIHNlbGV6aW9uZVwiICovXHJcbiAgICBwdWJsaWMgc2VsZWN0QWxsT3JSZXNldFNlbGVjdGlvbigpIHtcclxuICAgICAgICBsZXQgc2VsZWN0aW9uSXRlbSA9IHRoaXMuZXN0LlZpZXcuc2VsZWN0aW9uIHx8IHRoaXMuZXN0LmFycmF5bW9kZVNlbGVjdGlvbjtcclxuICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uQ2FjaGVzKCk7XHJcbiAgICAgICAgc2VsZWN0aW9uSXRlbS5hbGwgPSAhc2VsZWN0aW9uSXRlbS5hbGw7XHJcbiAgICAgICAgc2VsZWN0aW9uSXRlbS5leGNsdXNpb25zID0gW107XHJcbiAgICAgICAgc2VsZWN0aW9uSXRlbS5ncm91cHMgPSBbXTtcclxuICAgICAgICBzZWxlY3Rpb25JdGVtLmdyb3VwX2V4Y2x1c2lvbnMgPSBbXTtcclxuICAgICAgICBzZWxlY3Rpb25JdGVtLml0ZW1zID0gW107XHJcblxyXG4gICAgICAgIC8vIFJpcHVsaXNjbyBnbGkgc3RhdGkgVUkgZGkgc2VsZXppb25lIGdsb2JhbGUgc2UgbCdobyBkaXNhdHRpdmF0YVxyXG4gICAgICAgIGlmICghc2VsZWN0aW9uSXRlbS5hbGwpIHtcclxuICAgICAgICAgICAgdGhpcy5lc3QuY2FuU2VsZWN0QWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuZXN0Lmdsb2JhbENoZWNrID0gZmFsc2U7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICB0aGlzLmZpbmFsaXplU2VsZWN0aW9uSW5mb3JtYXRpb25zKHNlbGVjdGlvbkl0ZW0pO1xyXG5cclxuICAgICAgICB0aGlzLmVzdC5vblNlbGVjdGlvbkNoYW5nZWQuZW1pdChzZWxlY3Rpb25JdGVtKTtcclxuXHJcbiAgICAgICAgLy8gRG9wbyBhdmVyIHJlc2V0dGF0byBkaXJldHRhbWVudGUgaWwgc29sbyBvZ2dldHRvIHRoaXMuVmlldy5zZWxlY3Rpb24gZGV2byBhbmNoZSByaWFsbGluZWFyZSBhIHR1dHRpIGdsaSBvZ2dldHRpIGJpbmRhdGlcclxuICAgICAgICB0aGlzLmV2YWx1YXRlU2VsZWN0aW9uKHRoaXMuZXN0LmJvdW5kU291cmNlLCBzZWxlY3Rpb25JdGVtKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAVE9ETyBTcG9zdGFyZSBpbiBTZWxlY3Rpb25IYW5kbGVyXHJcbiAgICAgKiBcclxuICAgICAqIFJlZ2lzdHJhIGxhIHNlbGV6aW9uZSBzaW5nb2xhIHN1IHVuYSBjZWxsYSBzdWxsYSBjb21ibyBkaSBjb21hbmRpIFwiQ1RSTCArIENsaWNrXCIuXHJcbiAgICAgKiBTZSB2aWVuZSBwcmVtdXRvIGFuY2hlIGlsIHRhc3RvIFNoaWZ0IHZpZW5lIGNyZWF0byB1biByYW5nZSBkaSBzZWxlemlvbmUgaWwgY3VpIHN0YXR1cyBkaSBcInNlbGV6aW9uYXRvXCIgdmllbmUgc2FsdmF0byBuZWxsYVxyXG4gICAgICogbWF0cmljZSB2aXJ0dWFsZSAqKnNlbGVjdGlvblN0YXR1cyoqXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBldmVudCBFdmVudG8gSmF2YXNjcmlwdCBkaSBDbGlja1xyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHJvdyBJbmRpY2UgZGVsbGEgcmlnYS4gTm9uIMOoIGwnaW5kaWNlIHZlcm8gZSBwcm9wcmlvIG1hIMOoIGwnb3JkaW5hbGUgKC5vcmRpbmFsKSBkZWxsJ29nZ2V0dG8gYmluZGF0byBzdSBxdWVsbGEgcmlnYVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbiBJbmRpY2UgZGVsbGEgY29sb25uYSBwcmVzbyBiYW5hbG1lbnRlIGRhbGwnbmdJZiBzdWkgdGhFbGVtZW50XHJcbiAgICAgKiBAcGFyYW0ge3sgcm93OiBudW1iZXIsIGNvbHVtbjogbnVtYmVyIH19IGZpcnN0U2VsZWN0aW9uT3ZlcnJpZGUgUGVybWV0dGUgZGkgb3ZlcnJpZGFyZSBpbCBwcmltbyBlbGVtZW50byBzZWxlemlvbmF0b1xyXG4gICAgICovXHJcbiAgICBwdWJsaWMgc2luZ2xlQ2VsbFNlbGVjdGlvbihldmVudDogYW55LCByb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXIsIGZpcnN0U2VsZWN0aW9uT3ZlcnJpZGU/OiB7IHJvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlciB9KSB7XHJcblxyXG4gICAgICAgIHZhciBmaXJzdCA9IGZpcnN0U2VsZWN0aW9uT3ZlcnJpZGUgfHwgdGhpcy5sYXN0U2luZ2xlU2VsZWN0aW9uO1xyXG4gICAgICAgIHRoaXMuY2xlYXJUZXh0U2VsZWN0aW9uKGV2ZW50KTtcclxuICAgICAgICAvLyBOZWxsYSBzZWxlemlvbmUgYSByYW5nZSBjaGlzc2VuZSBmcmVnYSBzZSBjJ8OoIG8gbWVubyBsbyBzaGlmdCwgc2kgcmFnaW9uYSBzZW1wcmUgYSByYW5nZVxyXG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSAmJiBmaXJzdCkge1xyXG4gICAgICAgICAgICB0aGlzLmNsZWFyU2VsZWN0aW9uU3RhdHVzKHsgcm93LCBjb2x1bW4gfSk7XHJcbiAgICAgICAgICAgIGxldCByb3dBZGRpdGlvbiA9IHJvdyA8IGZpcnN0LnJvdyA/IC0xIDogKzE7XHJcbiAgICAgICAgICAgIGxldCBjb2x1bW5BZGRpdGlvbiA9IGNvbHVtbiA8IGZpcnN0LmNvbHVtbiA/IC0xIDogKzE7XHJcblxyXG4gICAgICAgICAgICBmb3IgKGxldCBpciA9IGZpcnN0LnJvdzsgaXIgIT0gcm93ICsgcm93QWRkaXRpb247IGlyICs9IHJvd0FkZGl0aW9uKVxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3RSb3cgPSBpciA9PSBmaXJzdC5yb3c7XHJcbiAgICAgICAgICAgICAgICBsZXQgbGFzdFJvdyA9IGlyID09IHJvdztcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGljID0gZmlyc3QuY29sdW1uOyBpYyAhPSBjb2x1bW4gKyBjb2x1bW5BZGRpdGlvbjsgaWMgKz0gY29sdW1uQWRkaXRpb24pXHJcbiAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0Q29sID0gaWMgPT0gZmlyc3QuY29sdW1uO1xyXG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXN0Q29sID0gaWMgPT0gY29sdW1uO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbaXJdW2ljXS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW2lyXVtpY10ubGJvcmRlciA9IGNvbHVtbkFkZGl0aW9uID4gMCA/IGZpcnN0Q29sIDogbGFzdENvbDtcclxuICAgICAgICAgICAgICAgICAgICBpZihpYyA+IDApXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tpcl1baWMgLSAxXS5yb3ZlcmxhcHMgPSB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbaXJdW2ljXS5sYm9yZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tpcl1baWNdLnRib3JkZXIgPSByb3dBZGRpdGlvbiA+IDAgPyBmaXJzdFJvdyA6IGxhc3RSb3c7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW2lyXVtpY10ucmJvcmRlciA9IGNvbHVtbkFkZGl0aW9uID4gMCA/IGxhc3RDb2wgOiBmaXJzdENvbDtcclxuICAgICAgICAgICAgICAgICAgICBpZih0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbaXJdW2ljICsgMV0pXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tpcl1baWMgKyAxXS5sb3ZlcmxhcHMgPSB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbaXJdW2ljXS5yYm9yZGVyO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tpcl1baWNdLmJib3JkZXIgPSByb3dBZGRpdGlvbiA+IDAgPyBsYXN0Um93IDogZmlyc3RSb3c7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5sYXN0U2luZ2xlU2VsZWN0aW9uID0geyByb3csIGNvbHVtbiB9O1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIC8vIFJpcHVsaXNjbyBlc2NsdWRlbmRvIGwnb2dnZXR0byBhdHR1YWxlIGNoZSBldmVudHVhbG1lbnRlIGNpIHBlbnNvIGlvIGEgZGVzZWV6aW9uYXJlXHJcbiAgICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25TdGF0dXMoeyByb3csIGNvbHVtbiB9KTtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbcm93XVtjb2x1bW5dO1xyXG4gICAgICAgICAgICBpdGVtLnNlbGVjdGVkID0gIWl0ZW0uc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgIGl0ZW0ubGJvcmRlciA9IGl0ZW0uc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgIGlmIChjb2x1bW4gPiAwKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW3Jvd11bY29sdW1uIC0gMV0ucm92ZXJsYXBzID0gaXRlbS5sYm9yZGVyO1xyXG4gICAgICAgICAgICBpdGVtLnRib3JkZXIgPSBpdGVtLnNlbGVjdGVkO1xyXG4gICAgICAgICAgICBpdGVtLnJib3JkZXIgPSBpdGVtLnNlbGVjdGVkO1xyXG4gICAgICAgICAgICBpZiAodGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW3Jvd11bY29sdW1uICsgMV0pXHJcbiAgICAgICAgICAgICAgICB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbcm93XVtjb2x1bW4gKyAxXS5sb3ZlcmxhcHMgPSBpdGVtLnJib3JkZXI7XHJcbiAgICAgICAgICAgIGl0ZW0uYmJvcmRlciA9IGl0ZW0uc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgIHRoaXMubGFzdFNpbmdsZVNlbGVjdGlvbiA9IHsgcm93LCBjb2x1bW4gfTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIE9yYSBjaGUgbm9uIMOoIGF0dGFjY2F0byBkaXJldHRhbWVudGUgYWxsJ2h0bWwgZGV2byBmYXJlIHVuIG1hcmtmb3JjaGVjayBmaW5pdGUgbGUgb3BlcmF6aW9uaSBzdWkgZ3JvdXBpbmdcclxuICAgICAgICB0aGlzLmVzdC5jZHIubWFya0ZvckNoZWNrKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgcGVyIHJpcHVsaXJlIGxvIHN0YXRvIGRpIHNlbGV6aW9uZSBkZWxsZSBzaW5nb2xlIGNlbGxlIGRlbGxhIHRhYmVsbGEsIGFkIGVzY2x1c2lvbmUgZGkgdW5hIHNpbmdvbGEgY29vcmRpbmF0YVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3tyb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXJ9fSBleGNsdXNpb24gQ29vcmRpbmF0YSBkYSBlc2NsdWRlcmUgbmVsbGEgcHVsaXppYVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb25TdGF0dXMoZXhjbHVzaW9uPzogeyByb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXIgfSkge1xyXG4gICAgICAgIGZvciAobGV0IHJvdyBpbiB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXMpIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgY29sdW1uIGluIHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tyb3ddKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIWV4Y2x1c2lvbiB8fCAoZXhjbHVzaW9uICYmIChyb3cgIT0gZXhjbHVzaW9uLnJvdy50b1N0cmluZygpIHx8IGNvbHVtbiAhPSBleGNsdXNpb24uY29sdW1uLnRvU3RyaW5nKCkpKSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tyb3ddW2NvbHVtbl0uc2VsZWN0ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW3Jvd11bY29sdW1uXS5sYm9yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW3Jvd11bY29sdW1uXS50Ym9yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW3Jvd11bY29sdW1uXS5yYm9yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW3Jvd11bY29sdW1uXS5iYm9yZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgY2hlIGVzYW1pbmEgbGEgbWF0cmljZSAqKnNlbGVjdGlvblN0YXR1cyoqIGUgbmUgZXN0cmFwcG9sYSBnbGkgZWxlbWVudGkgc2VsZXppb25hdGkgaW4gdW5hIGNvbW9kYSBtYXRyaWNlXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHt7IHZhbHVlOiBzdHJpbmcsIHR5cGU6IElucHV0VHlwZSwgdmFsX3NldHRlcjogRnVuY3Rpb24gfVtdW119IE1hdHJpY2UgZGkgZWxlbWVudGkgc2VsZXppb25hdGkgY29uIGxhIGxvcm8gaW5mb3JtYXppb25lIHN1bCB0aXBvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRTZWxlY3Rpb25TdGF0dXNTZWxlY3Rpb24oKTogSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZVtdW10ge1xyXG4gICAgICAgIGxldCBzZWxlY3Rpb246IEl0ZW1Qcm9wRWRpdGFibGVSZWZlcmVuY2VbXVtdID0gW11cclxuICAgICAgICBmb3IgKGxldCByb3cgaW4gdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGxldCByb3dWYWx1ZXM6IEl0ZW1Qcm9wRWRpdGFibGVSZWZlcmVuY2VbXSA9IFtdO1xyXG4gICAgICAgICAgICBmb3IgKGxldCBjb2x1bW4gaW4gdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW3Jvd10pIHtcclxuICAgICAgICAgICAgICAgIGxldCBzc0l0ZW0gPSB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbcm93XVtjb2x1bW5dO1xyXG4gICAgICAgICAgICAgICAgaWYgKHNzSXRlbS5zZWxlY3RlZClcclxuICAgICAgICAgICAgICAgICAgICByb3dWYWx1ZXMucHVzaChzc0l0ZW0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmIChyb3dWYWx1ZXMubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5wdXNoKHJvd1ZhbHVlcyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBzZWxlY3Rpb247XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgcGVyIHJpcHVsaXJlIGxhIHNlbGV6aW9uZSBsYXRvIEhUTUxcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGV2ZW50IEV2ZW50byBuYXRpdm8gSmF2YXNjcmlwdFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2xlYXJUZXh0U2VsZWN0aW9uKGV2ZW50OiBhbnkpIHtcclxuICAgICAgICAvLyBTZWxlemlvbm8gZGVsIHRlc3RvIG1hIG5vbiBobyBzaGlmdCBwcmVtdXRvIC0+IGlnbm9ybyBsYSBzZWxlemlvbmVcclxuICAgICAgICBpZiAoKGV2ZW50LnZpZXcuZ2V0U2VsZWN0aW9uKCkudHlwZSA9PSAnUmFuZ2UnIHx8IGV2ZW50LnZpZXcuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKS5sZW5ndGggPiAwKSAmJiAhZXZlbnQuc2hpZnRLZXkpXHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuXHJcbiAgICAgICAgLy8gU2VsZXppb25vIGRlbCB0ZXN0byBlIGhvIHNoaWZ0IHByZW11dG8gLT4gYW5udWxsbyBsYSBzZWxlemlvbmUgZGVsIHRlc3RvXHJcbiAgICAgICAgaWYgKChldmVudC52aWV3LmdldFNlbGVjdGlvbigpLnR5cGUgPT0gJ1JhbmdlJyB8fCBldmVudC52aWV3LmdldFNlbGVjdGlvbigpLnRvU3RyaW5nKCkubGVuZ3RoID4gMCkgJiYgZXZlbnQuc2hpZnRLZXkpXHJcbiAgICAgICAgICAgIHRoaXMuZXN0LnV0aUV4dHMuY2xlYXJUZXh0U2VsZWN0aW9uKCk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIGxhIG1hdHJpY2UgZGkgc2VsZXppb25lIGdlbmVyYXRhIGRhbCBtZXRvZG8gKipnZXRTZWxlY3Rpb25TdGF0dXNTZWxlY3Rpb24qKiBnZW5lcmEgbGEgc3RyaWduYSB2ZXJhIGUgcHJvcHJpYSBkYSBjb3BpYXJlIG5lbGxhIENsaXBib2FyZFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3sgdmFsdWU6IHN0cmluZywgdHlwZTogSW5wdXRUeXBlIH1bXVtdfSBzZWwgTWF0cmljZSBkaSBzZWxlemlvbmUgY29uIHZhbG9yaSBlIHRpcGkgZGVpIGRhdGkgc2VsZXppb25hdGlcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gU3RyaW5nYSBkYSBjb3BpYXJlIG5lbGxhIGNsaXBib2FyZCwgbGUgc3RyaW5naGUgdmVuZ29ubyB3cmFwcGF0ZSBmcmEgZG9wcGkgYXBpY2kgZSBmcmEgdW4gdmFsb3JlIGUgbCdhbHRybyB2aWVuZSBtZXNzbyB1biB0YWJcclxuICAgICAqIGluIG1vZG8gY2hlIHNpYW5vIGNvbXBhdGliaWxpIGFuY2hlIGNvbiBsYSBjb3BpYSBzdSBFeGNlbFxyXG4gICAgICovXHJcbiAgICBnZXRDbGlwYmFyZFRleHRGcm9tU2VsZWN0aW9uKHNlbDogeyB2YWx1ZTogc3RyaW5nLCB0eXBlOiBJbnB1dFR5cGUgfCBzdHJpbmcgfVtdW10pOiBzdHJpbmcge1xyXG4gICAgICAgIHZhciByZXQgPSBcIlwiO1xyXG4gICAgICAgIGZvciAobGV0IHIgPSAwOyByIDwgc2VsLmxlbmd0aDsgcisrKSB7XHJcbiAgICAgICAgICAgIGxldCByb3cgPSBzZWxbcl07XHJcbiAgICAgICAgICAgIGlmIChyID4gMCkgcmV0ICs9IFwiXFxuXCI7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgcm93Lmxlbmd0aDsgYysrKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgY29sID0gcm93W2NdO1xyXG4gICAgICAgICAgICAgICAgcmV0ICs9IHRoaXMuZ2V0VmFsdWVCeVR5cGUoY29sKSArIChjIDwgcm93Lmxlbmd0aCAtIDEgPyBcIlxcdFwiIDogXCJcIik7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIE90dGllbmUgbGEgcmFwcHJlc2VudGF6aW9uZSBzdHJpbmdhIGRpIHVuIHZhbG9yZSBkYXRvIHVuIHRpcG9cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHt7IHZhbHVlOiBzdHJpbmcsIHR5cGU6IElucHV0VHlwZSB9fSB2YWxUeXBlIE9nZ2V0dG8gVmFsb3JlIC0gVGlwbyBkYSBjdWkgZXN0cmFwb2xhcmUgbGEgcmFwcHJlc2VudGF6aW9uZSBkZWwgZGF0byBpbiBzdHJpbmdhXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFZhbG9yZSBjb252ZXJ0aXRvIGluIHN0cmluZ2EgaW4gYmFzZSBhbCB0aXBvXHJcbiAgICAgKi9cclxuICAgIGdldFZhbHVlQnlUeXBlKHZhbFR5cGU6IHsgdmFsdWU6IHN0cmluZywgdHlwZTogSW5wdXRUeXBlIHwgc3RyaW5nIH0pOiBzdHJpbmcge1xyXG4gICAgICAgIHN3aXRjaCAodmFsVHlwZS50eXBlKSB7XHJcbiAgICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gJ1wiJyArIHZhbFR5cGUudmFsdWUgKyAnXCInO1xyXG4gICAgICAgICAgICBjYXNlICdudW1iZXInOlxyXG4gICAgICAgICAgICBjYXNlICdpbnQnOlxyXG4gICAgICAgICAgICBjYXNlICdib29sZWFuJzpcclxuICAgICAgICAgICAgY2FzZSAnZW51bSc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2F1dG9jb21wbGV0ZSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsVHlwZS52YWx1ZTtcclxuICAgICAgICAgICAgY2FzZSAnZmxvYXQnOlxyXG4gICAgICAgICAgICBjYXNlICdjdXJyZW5jeSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdCh2YWxUeXBlLnZhbHVlKS50b0xvY2FsZVN0cmluZyh0aGlzLmVzdC5sb2NhbGUpO1xyXG4gICAgICAgICAgICBjYXNlICdkYXRlJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBkYXlqcyh2YWxUeXBlLnZhbHVlKS5mb3JtYXQodGhpcy5lc3QubGMudG9rZW4oXCJnZXRTbWFsbERhdGVEaXNwbGF5Rm9ybWF0XCIpKTtcclxuICAgICAgICAgICAgY2FzZSAnZGF0ZXRpbWUnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRheWpzKHZhbFR5cGUudmFsdWUpLmZvcm1hdCh0aGlzLmVzdC5sYy50b2tlbihcImdldEZ1bGxEYXRlRGlzcGxheUZvcm1hdFwiKSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ3RpbWUnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRheWpzKHZhbFR5cGUudmFsdWUpLmZvcm1hdChcIkhIOm1tOnNzXCIpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSJdfQ==
790
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0aW9uSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLXRhYmxlL3NyYy9saWIvY29yZS9oYW5kbGVycy9TZWxlY3Rpb25IYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQW9CbkUscURBQXFEO0FBQ3JELE1BQU0sT0FBTyxnQkFBZ0I7SUF1QnpCLDBCQUEwQjtJQUMxQixZQUFvQixHQUFxQixFQUFVLFNBQTZCO1FBQTVELFFBQUcsR0FBSCxHQUFHLENBQWtCO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBb0I7UUF0QmhGLCtIQUErSDtRQUN2SCxlQUFVLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDakQsaUlBQWlJO1FBQ3pILGdCQUFXLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDbEQscUlBQXFJO1FBQzdILG9CQUFlLEdBQXFCLElBQUksR0FBRyxFQUFFLENBQUM7UUFDdEQsMklBQTJJO1FBQ25JLDBCQUFxQixHQUFxQixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRTVELGlJQUFpSTtRQUN6SCxpQkFBWSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3RELG1JQUFtSTtRQUMzSCxrQkFBYSxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBQ3ZELHVJQUF1STtRQUMvSCxzQkFBaUIsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUMzRCw2SUFBNkk7UUFDckksNEJBQXVCLEdBQXdCLElBQUksR0FBRyxFQUFFLENBQUM7SUFNbUIsQ0FBQztJQUVyRixzQ0FBc0M7SUFDL0Isb0JBQW9CO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsZUFBZSxD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ekIsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLFVBQVU7Z0JBQ1gsT0FBTyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JFLEtBQUssTUFBTTtnQkFDUCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLENBQUM7WUFDdkYsS0FBSyxVQUFVO2dCQUNYLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztZQUN0RixLQUFLLE1BQU07Z0JBQ1AsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUN0RDtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbIi8vIE1vZGVsbGlcclxuaW1wb3J0IHsgQXBwU2VhcmNoIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvYXBwc2VhcmNoL0FwcFNlYXJjaFwiO1xyXG5pbXBvcnQgeyBJdGVtc1NlbGVjdGlvbiB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL2FwcHNlYXJjaC9JdGVtc1NlbGVjdGlvblwiO1xyXG5pbXBvcnQgeyBDYWNoZVRyaXB0aWMgfSBmcm9tIFwiLi4vLi4vZG9tYWluL2ludGVybmFscy9DYWNoZVRyaXB0aWNcIjtcclxuaW1wb3J0IHsgSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZSB9IGZyb20gXCIuLi8uLi9kb21haW4vZXh0ZXJuYWxzL0l0ZW1Qcm9wRWRpdGFibGVSZWZlcmVuY2VcIjtcclxuaW1wb3J0IHsgRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uIH0gZnJvbSBcIi4uLy4uL2RvbWFpbi9leHRlcm5hbHMvRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uXCI7XHJcbmltcG9ydCB7IElucHV0VHlwZSB9IGZyb20gJy4uLy4uL2RvbWFpbi90eXBlcyc7XHJcblxyXG4vLyBDb21wb25lbnRpXHJcbmltcG9ydCB7IEVzVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9lcy10YWJsZS9lc190YWJsZS5jb21wb25lbnRcIlxyXG5cclxuLy8gRGlyZXR0aXZlIFxyXG5pbXBvcnQgeyBFc1RoRGlyZWN0aXZlIH0gZnJvbSBcIi4uLy4uL2RpcmVjdGl2ZXMvZXNfdGguZGlyZWN0aXZlXCI7XHJcblxyXG4vLyBIYW5kbGVyc1xyXG5pbXBvcnQgeyBSb3dHcm91cGluZ0hhbmRsZXIgfSBmcm9tIFwiLi9Sb3dHcm91cGluZ0hhbmRsZXJcIjtcclxuXHJcbi8qKlxyXG4gKiBEaWNoaWFyYXppb25lIGRlbGxhIHZhcmlhYmlsZSBnbG9iYWxlIGRheWpzLiBMJ29uZXJlIGRpIFwiY3JlYXJsYVwiIMOoIGFmZmlkYXRvIGFsbCdhcHBsaWNhemlvbmUgY2hlIHV0aWxpenphIHF1ZXN0YSBsaWJyZXJpYSwgXHJcbiAqIGNoZSBkb3Zyw6AgaW1wb3J0YXJlIGxvIHNjcmlwdCBnbG9iYWxlIGRpIGRheWpzIG5lbGxhIENMSVxyXG4gKi9cclxuIGRlY2xhcmUgdmFyIGRheWpzOiBhbnk7XHJcblxyXG4vKiogQ2xhc3NlIGNoZSBnZXN0aXNjZSBsZSBzZWxlemlvbmkgZGVnbGkgb2dnZXR0aSAqL1xyXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uSGFuZGxlciB7XHJcblxyXG4gICAgLyoqIENhY2hlIGRpIHNlbGV6aW9uZSBIYXNoIC0gT2dnZXR0byBwZXIgbGEgdmFyaWFiaWxlICoqaXRlbXMqKiBkZWxsJ2l0ZW1TZWxlY3Rvci4gRmFjaWxpdGEgbGUgb3BlcmF6aW9uaSBkaSBsb29rdXAgdmlhIGhhc2gqL1xyXG4gICAgcHJpdmF0ZSBpdGVtc0NhY2hlOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xyXG4gICAgLyoqIENhY2hlIGRpIHNlbGV6aW9uZSBIYXNoIC0gT2dnZXR0byBwZXIgbGEgdmFyaWFiaWxlICoqZ3JvdXBzKiogZGVsbCdpdGVtU2VsZWN0b3IuIEZhY2lsaXRhIGxlIG9wZXJhemlvbmkgZGkgbG9va3VwIHZpYSBoYXNoICovXHJcbiAgICBwcml2YXRlIGdyb3Vwc0NhY2hlOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xyXG4gICAgLyoqIENhY2hlIGRpIHNlbGV6aW9uZSBIYXNoIC0gT2dnZXR0byBwZXIgbGEgdmFyaWFiaWxlICoqZXhjbHVzaW9ucyoqIGRlbGwnaXRlbVNlbGVjdG9yLiBGYWNpbGl0YSBsZSBvcGVyYXppb25pIGRpIGxvb2t1cCB2aWEgaGFzaCAqL1xyXG4gICAgcHJpdmF0ZSBleGNsdXNpb25zQ2FjaGU6IE1hcDxzdHJpbmcsIGFueT4gPSBuZXcgTWFwKCk7XHJcbiAgICAvKiogQ2FjaGUgZGkgc2VsZXppb25lIEhhc2ggLSBPZ2dldHRvIHBlciBsYSB2YXJpYWJpbGUgKipncm91cF9leGNsdXNpb25zKiogZGVsbCdpdGVtU2VsZWN0b3IuIEZhY2lsaXRhIGxlIG9wZXJhemlvbmkgZGkgbG9va3VwIHZpYSBoYXNoICovXHJcbiAgICBwcml2YXRlIGdyb3VwX2V4Y2x1c2lvbnNDYWNoZTogTWFwPHN0cmluZywgYW55PiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICAvKiogQ2FjaGUgZGkgc2VsZXppb25lIEhhc2ggLSBPZ2dldHRvIHBlciBsYSB2YXJpYWJpbGUgKippdGVtcyoqIGRlbGwnaXRlbVNlbGVjdG9yLiBGYWNpbGl0YSBsZSBvcGVyYXppb25pIGRpIGxvb2t1cCB2aWEgaW5kaWNlKi9cclxuICAgIHByaXZhdGUgaV9pdGVtc0NhY2hlOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcCgpO1xyXG4gICAgLyoqIENhY2hlIGRpIHNlbGV6aW9uZSBIYXNoIC0gT2dnZXR0byBwZXIgbGEgdmFyaWFiaWxlICoqZ3JvdXBzKiogZGVsbCdpdGVtU2VsZWN0b3IuIEZhY2lsaXRhIGxlIG9wZXJhemlvbmkgZGkgbG9va3VwIHZpYSBpbmRpY2UgKi9cclxuICAgIHByaXZhdGUgaV9ncm91cHNDYWNoZTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICAgIC8qKiBDYWNoZSBkaSBzZWxlemlvbmUgSGFzaCAtIE9nZ2V0dG8gcGVyIGxhIHZhcmlhYmlsZSAqKmV4Y2x1c2lvbnMqKiBkZWxsJ2l0ZW1TZWxlY3Rvci4gRmFjaWxpdGEgbGUgb3BlcmF6aW9uaSBkaSBsb29rdXAgdmlhIGluZGljZSAqL1xyXG4gICAgcHJpdmF0ZSBpX2V4Y2x1c2lvbnNDYWNoZTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuICAgIC8qKiBDYWNoZSBkaSBzZWxlemlvbmUgSGFzaCAtIE9nZ2V0dG8gcGVyIGxhIHZhcmlhYmlsZSAqKmdyb3VwX2V4Y2x1c2lvbnMqKiBkZWxsJ2l0ZW1TZWxlY3Rvci4gRmFjaWxpdGEgbGUgb3BlcmF6aW9uaSBkaSBsb29rdXAgdmlhIGluZGljZSAqL1xyXG4gICAgcHJpdmF0ZSBpX2dyb3VwX2V4Y2x1c2lvbnNDYWNoZTogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgICAvKiogVWx0aW1hIGNlbGxhIHNlbGV6aW9uYXRhIHNpbmdvbGFybWVudGUgKi9cclxuICAgIHByaXZhdGUgbGFzdFNpbmdsZVNlbGVjdGlvbjogeyByb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXIgfTtcclxuXHJcbiAgICAvKiogQGlnbm9yZSBDb3N0cnV0dG9yZSAqL1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlc3Q6IEVzVGFibGVDb21wb25lbnQsIHByaXZhdGUgcmdIYW5kbGVyOiBSb3dHcm91cGluZ0hhbmRsZXIpIHsgfVxyXG5cclxuICAgIC8qKiBSaXB1bGlzY2UgbGUgY2FjaGUgZGkgc2VsZXppb25lICovXHJcbiAgICBwdWJsaWMgY2xlYXJTZWxlY3Rpb25DYWNoZXMoKSB7XHJcbiAgICAgICAgdGhpcy5pdGVtc0NhY2hlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5ncm91cHNDYWNoZS5jbGVhcigpO1xyXG4gICAgICAgIHRoaXMuZXhjbHVzaW9uc0NhY2hlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5ncm91cF9leGNsdXNpb25zQ2FjaGUuY2xlYXIoKTtcclxuXHJcbiAgICAgICAgdGhpcy5pX2l0ZW1zQ2FjaGUuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLmlfZ3JvdXBzQ2FjaGUuY2xlYXIoKTtcclxuICAgICAgICB0aGlzLmlfZXhjbHVzaW9uc0NhY2hlLmNsZWFyKCk7XHJcbiAgICAgICAgdGhpcy5pX2dyb3VwX2V4Y2x1c2lvbnNDYWNoZS5jbGVhcigpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsdXRhIHF1YWxpIGVsZW1lbnRpIGRldm9ubyBlc3NlcmUgbWFyY2F0aSBjb21lIHNlbGV6aW9uYXRpIG5lbGxhIHZpc3RhIGF0dHVhbGUuIFNpIGJhc2Egc3VsbCdvZ2dldHRvICoqc2VsZWN0aW9uKiogaW50ZXJubyBhbGwnQXBwU2VhcmNoXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gaXRlbXMgT2dnZXR0aSBkaSBjdWkgdmFsdXRhcmUgbGEgc2VsZXppb25lXHJcbiAgICAgKiBAcGFyYW0ge0l0ZW1zU2VsZWN0aW9uPGFueT59IHNlbGVjdGlvbkl0ZW0gT2dnZXR0aSBkaSBzZWxlemlvbmUgZGVyaXZhbnRlIGRhbGxhIHZpZXcgbyBkYWxsJ29nZ2V0dG8gcGVyIEFycmF5XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBldmFsdWF0ZVNlbGVjdGlvbihpdGVtczogYW55W10sIHNlbGVjdGlvbkl0ZW06IEl0ZW1zU2VsZWN0aW9uPGFueT4pIHtcclxuICAgICAgICBpZiAoIXNlbGVjdGlvbkl0ZW0pXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgdGhpcy5oYW5kbGVTZWxlY3Rpb25FdmFsdWF0aW9uKGl0ZW1zLCBzZWxlY3Rpb25JdGVtKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByZWNvbXBpbGEgbGUgaW5mb3JtYXppb25pIHN1bGxvIHN0YXRvIGRpIHNlbGV6aW9uZSB0dXR0byBhIGZhbHNlIHBlciBsZSBjZWxsZSBkZWxsYSB0YWJlbGxhXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55W119IGl0ZW1zIE9nZ2V0dGkgYXR0dWFsbWVudGUgYmluZGF0aSBzdWxsYSB0YWJlbGxhXHJcbiAgICAgKiBAcGFyYW0ge0VzVGhEaXJlY3RpdmVbXX0gdGhzIENvbG9ubmUgc3UgY3VpIGdsaSBvZ2dldHRpIHNvbm8gYmluZGF0aVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXZhbHVhdGVTaW5nbGVDZWxsU2VsZWN0aW9uKGl0ZW1zOiBhbnlbXSwgdGhzOiBFc1RoRGlyZWN0aXZlW10sIGR5bjogRXNUYWJsZUNvbHVtbnNEZWZpbml0aW9uW10pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIC8vIGl0ZW1zW2ldLl9vcmRpbmFsIGRvdnJlYmJlIGVzc2VyZSB1Z3VhbGUgYSBcImlcIiBtYSBkYXRvIGNoZSBsYXRvIEhUTUwgaWwgY2ljbG8gw6ggZXN0ZXJubyBlIG5vbiBobyBsJ2luZGljZSBwZXIgY29udmVuemlvbmUgbWkgYmFzbyBzdWxsJ19vcmRpbmFsXHJcbiAgICAgICAgICAgIHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tpdGVtc1tpXS5fb3JkaW5hbF0gPSB7fTtcclxuICAgICAgICAgICAgaWYgKGR5biAmJiBkeW4ubGVuZ3RoID4gMClcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsbFNlbGVjdGlvblN0YXR1c0J5RHluYW1pY0NvbHVtbnMoaXRlbXNbaV0sIGR5bik7XHJcbiAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgIHRoaXMuZmlsbFNlbGVjdGlvblN0YXR1c0J5RXNUaHMoaXRlbXNbaV0sIHRocyk7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgZmlsbFNlbGVjdGlvblN0YXR1c0J5RHluYW1pY0NvbHVtbnMoaXRlbTogYW55LCBkeW46IEVzVGFibGVDb2x1bW5zRGVmaW5pdGlvbltdKXtcclxuICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IGR5bi5sZW5ndGg7IGsrKykge1xyXG4gICAgICAgICAgICBsZXQgdGggPSBkeW5ba107XHJcbiAgICAgICAgICAgIGxldCBpcGVyOiBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlID0geyBzZWxlY3RlZDogZmFsc2UsIHZhbHVlOiB0aC5Qcm9wZXJ0eU5hbWUgPyBpdGVtLnByb3BlcnRpZXNbdGguUHJvcGVydHlOYW1lXSA6IFwiVW5kZWZpbmVkIFByb3BlcnR5XCIsIHR5cGU6IHRoLlByb3BlcnR5VHlwZSwgcHJvcGVydHk6IHRoLlByb3BlcnR5TmFtZSwgaGVhZGVyOiB0aC5Qcm9wZXJ0eU5hbWUsIGl0ZW06IGl0ZW0gfTtcclxuICAgICAgICAgICAgdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW2l0ZW0uX29yZGluYWxdW2tdID0gaXBlcjtcclxuXHJcbiAgICAgICAgICAgIC8vIEZ1bnppb25lIGFzc2VnbmF0YSBkb3BvIGluIG1vZG8gZGEgcG90ZXJsZSBmYXJlIGFuY2hlIGFnZ2lvcm5hcmUgaWwgdmFsb3JlIGRlbCByaWZlcmltZW50byBhbGwnb2dnZXR0byBkaSBzZWxlemlvbmVcclxuICAgICAgICAgICAgaXBlci52YWxfc2V0dGVyID0gKHZhbHVlOiBzdHJpbmcpOiBhbnkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKCF0aC5Qcm9wZXJ0eU5hbWUpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtW3RoLlByb3BlcnR5TmFtZV0gPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpcGVyLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIGxldCB2YWxUb0FwcGx5ID0gXCJcIjtcclxuICAgICAgICAgICAgICAgIHN3aXRjaCAodGguUHJvcGVydHlUeXBlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN0cmluZ1wiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aCAmJiB2YWx1ZS5zdGFydHNXaXRoKCdcIicpICYmIHZhbHVlLmVuZHNXaXRoICYmIHZhbHVlLmVuZHNXaXRoKCdcIicpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG9BcHBseSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGggLSAxKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG9BcHBseSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuXHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcIm51bWJlclwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJpbnRcIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYm9vbGVhblwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJlbnVtXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImF1dG9jb21wbGV0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJmbG9hdFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjdXJyZW5jeVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZGF0ZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRldGltZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gdGhpcy5lc3QuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwidGltZVwiOlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbXlkYXRlID0gdGhpcy5lc3QuZGF0ZUV4dHMuZ2V0RGF0ZUNvbnZlcnRpb24odmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gYCR7bXlkYXRlLmhvdXIoKX06JHtteWRhdGUubWludXRlKCl9OiR7bXlkYXRlLnNlY29uZCgpfWBcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUGVyIGV2aXRhcmUgZGkgc2JpYW5jYXJlIHNlbnphIHNlbnNvXHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG9BcHBseSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGl0ZW0ucHJvcGVydGllc1t0aC5Qcm9wZXJ0eU5hbWVdID0gdmFsVG9BcHBseTtcclxuICAgICAgICAgICAgICAgIGlwZXIudmFsdWUgPSB2YWxUb0FwcGx5O1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbFRvQXBwbHk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIHByaXZhdGUgZmlsbFNlbGVjdGlvblN0YXR1c0J5RXNUaHMoaXRlbTogYW55LCB0aHM6IEVzVGhEaXJlY3RpdmVbXSkge1xyXG4gICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgdGhzLmxlbmd0aDsgaysrKSB7XHJcbiAgICAgICAgICAgIGxldCB0aCA9IHRoc1trXTtcclxuICAgICAgICAgICAgbGV0IGlwZXI6IEl0ZW1Qcm9wRWRpdGFibGVSZWZlcmVuY2UgPSB7IHNlbGVjdGVkOiBmYWxzZSwgdmFsdWU6IHRoLnRoUHJvcGVydHkgPyBpdGVtW3RoLnRoUHJvcGVydHldIDogXCJVbmRlZmluZWQgUHJvcGVydHlcIiwgdHlwZTogdGgudGhUeXBlLCBwcm9wZXJ0eTogdGgudGhQcm9wZXJ0eSwgaGVhZGVyOiB0aC50aCwgaXRlbTogaXRlbSB9O1xyXG4gICAgICAgICAgICB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbaXRlbS5fb3JkaW5hbF1ba10gPSBpcGVyO1xyXG5cclxuICAgICAgICAgICAgLy8gRnVuemlvbmUgYXNzZWduYXRhIGRvcG8gaW4gbW9kbyBkYSBwb3RlcmxlIGZhcmUgYW5jaGUgYWdnaW9ybmFyZSBpbCB2YWxvcmUgZGVsIHJpZmVyaW1lbnRvIGFsbCdvZ2dldHRvIGRpIHNlbGV6aW9uZVxyXG4gICAgICAgICAgICBpcGVyLnZhbF9zZXR0ZXIgPSAodmFsdWU6IHN0cmluZyk6IGFueSA9PiB7XHJcbiAgICAgICAgICAgICAgICBpZiAoIXRoLnRoUHJvcGVydHkpIHtcclxuICAgICAgICAgICAgICAgICAgICBpdGVtW3RoLnRoUHJvcGVydHldID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgaXBlci52YWx1ZSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgICBsZXQgdmFsVG9BcHBseSA9IFwiXCI7XHJcbiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoLnRoVHlwZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcclxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoJ1wiJykgJiYgdmFsdWUuZW5kc1dpdGgoJ1wiJykpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gdmFsdWUuc3Vic3RyaW5nKDEsIHZhbHVlLmxlbmd0aCAtIDEpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxUb0FwcGx5ID0gdmFsdWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwibnVtYmVyXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImludFwiOlxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJib29sZWFuXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImVudW1cIjpcclxuICAgICAgICAgICAgICAgICAgICBjYXNlIFwiYXV0b2NvbXBsZXRlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImZsb2F0XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImN1cnJlbmN5XCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbFRvQXBwbHkgPSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkYXRlXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBcImRhdGV0aW1lXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbFRvQXBwbHkgPSB0aGlzLmVzdC5kYXRlRXh0cy5nZXREYXRlQ29udmVydGlvbih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ0aW1lXCI6XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBteWRhdGUgPSB0aGlzLmVzdC5kYXRlRXh0cy5nZXREYXRlQ29udmVydGlvbih2YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbFRvQXBwbHkgPSBgJHtteWRhdGUuaG91cigpfToke215ZGF0ZS5taW51dGUoKX06JHtteWRhdGUuc2Vjb25kKCl9YFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgICAgICAgICAgLy8gUGVyIGV2aXRhcmUgZGkgc2JpYW5jYXJlIHNlbnphIHNlbnNvXHJcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsVG9BcHBseSA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGl0ZW1bdGgudGhQcm9wZXJ0eV0gPSB2YWxUb0FwcGx5O1xyXG4gICAgICAgICAgICAgICAgaXBlci52YWx1ZSA9IHZhbFRvQXBwbHk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdmFsVG9BcHBseTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEltcGxlbWVudGF6aW9uZSBhZ25vc3RpY2EgZGVsbGEgdmFsdXRhemlvbmUgZGVsbGUgc2VsZXppb25pIGRlZ2xpIG9nZ2V0dGkuIFJpY2hpZWRlIGdsaSBvZ2dldHRpIGRlbGxhIHZpc3RhIGF0dHVhbGUgZSBsJ2l0ZW1TZWxlY3RvclxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55W119IGl0ZW1zIE9nZ2V0dGkgZGkgY3VpIGFnZ2lvcm5hcmUgbG8gc3RhdG8gZGkgc2VsZXppb25lXHJcbiAgICAgKiBAcGFyYW0ge0l0ZW1zU2VsZWN0aW9uPGFueT59IHNlbGVjdGlvbkl0ZW0gT2dnZXR0byBjb250ZW5lbnRlIGxvIHN0YXRvIGF0dHVhbGUgZGkgc2VsZXppb25lXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgaGFuZGxlU2VsZWN0aW9uRXZhbHVhdGlvbihpdGVtczogYW55W10sIHNlbGVjdGlvbkl0ZW06IEl0ZW1zU2VsZWN0aW9uPGFueT4pIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBpdG0gPSBpdGVtc1tpXTtcclxuICAgICAgICAgICAgbGV0IGhhc2ggPSBpdG0uX2hhc2g7XHJcbiAgICAgICAgICAgIGxldCBpdGVtR3JvdXAgPSBpdG0uX2dyb3VwID8gbnVsbCA6IHRoaXMuZ2V0SXRlbUdyb3VwKGl0bSk7XHJcbiAgICAgICAgICAgIC8vIFJlaWRyYXRvIGxhIGNhY2hlIGRpIHNlbGV6aW9uZSBjb2kgbnVvdmkgb2dnZXR0aSBhbHRyaW1lbnRpIG5vbiByaXVzY2lyZWkgYSBiZWNjYXJlIGdsaSBpbmRpY2kgZ2l1c3RpXHJcbiAgICAgICAgICAgIC8vIERvcG9kaWNow6kgbGEgdXNvIHBlciBjYWxjb2xhcmUgaXN0YW50YW5lYW1lbnRlIHNlIGdsaSBvZ2dldHRpIHNvbm8gc2VsZXppb25hdGkgbyBub1xyXG4gICAgICAgICAgICB0aGlzLnJlaGlkcmF0ZUNhY2hlKGl0bSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXRtLl9pdGVtKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uSXRlbS5hbGwpXHJcbiAgICAgICAgICAgICAgICAgICAgaXRtLl9zZWxlY3RlZCA9ICF0aGlzLmV4Y2x1c2lvbnNDYWNoZS5oYXMoaGFzaCkgJiYgKCghdGhpcy5ncm91cHNDYWNoZS5oYXMoaXRlbUdyb3VwPy5faGFzaCkgJiYgdGhpcy5pdGVtc0NhY2hlLmhhcyhoYXNoKSkgfHwgIXRoaXMuZ3JvdXBfZXhjbHVzaW9uc0NhY2hlLmhhcyhpdGVtR3JvdXA/Ll9oYXNoKSk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgaXRtLl9zZWxlY3RlZCA9ICF0aGlzLmV4Y2x1c2lvbnNDYWNoZS5oYXMoaGFzaCkgJiYgKHRoaXMuZ3JvdXBzQ2FjaGUuaGFzKGl0ZW1Hcm91cD8uX2hhc2gpIHx8IHRoaXMuaXRlbXNDYWNoZS5oYXMoaGFzaCkgfHwgKHRoaXMucGFyZW50VHJlZVN0YXR1cyhpdGVtR3JvdXApID09ICdpbmNsdWRlZCcgJiYgIXRoaXMuZ3JvdXBfZXhjbHVzaW9uc0NhY2hlLmhhcyhpdGVtR3JvdXA/Ll9oYXNoKSkpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2UgaWYgKGl0bS5fZ3JvdXApIHtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb25JdGVtLmFsbClcclxuICAgICAgICAgICAgICAgICAgICBpdG0uX3NlbGVjdGVkID0gIXRoaXMuZ3JvdXBfZXhjbHVzaW9uc0NhY2hlLmhhcyhoYXNoKSAmJiB0aGlzLnBhcmVudFRyZWVTdGF0dXMoaXRtKSAhPSAnZXhjbHVkZWQnO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIGl0bS5fc2VsZWN0ZWQgPSB0aGlzLmdyb3Vwc0NhY2hlLmhhcyhoYXNoKSB8fCAodGhpcy5wYXJlbnRUcmVlU3RhdHVzKGl0bSkgPT0gJ2luY2x1ZGVkJyAmJiAhdGhpcy5ncm91cF9leGNsdXNpb25zQ2FjaGUuaGFzKGhhc2gpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2UgdHV0dGkgZ2xpIG9nZ2V0dGkgZGkgcXVlc3RhIHBhZ2luYSBzb25vIHNvbGV6aW9uYXRpIGFsbG9yYSBwb3NzbyBtZXR0ZXJlIGlsIGdsb2JhbCBjaGVjayBhIHRydWVcclxuICAgICAgICAvLyBTZSBzb25vIGluIHNpdHVhemlvbmUgZGkgYWxsLXNlbGVjdCBhbmNoZSBtZXR0byBsYSBnbG9iYWwgY2hlY2tib3gsIG5vbm9zdGFudGUgY2kgcG9zc2FubyBlc3NlcmUgZGVsbGUgZXNjbHVzaW9uaVxyXG4gICAgICAgIHRoaXMuZXN0Lmdsb2JhbENoZWNrID0gdGhpcy5lc3QuYm91bmRTb3VyY2UubGVuZ3RoID4gMCAmJiB0aGlzLmVzdC5ib3VuZFNvdXJjZS5maWx0ZXIodCA9PiB0Ll9ncm91cCB8fCB0Ll9pdGVtKS5ldmVyeSh0ID0+IHQuX3NlbGVjdGVkKTtcclxuICAgICAgICB0aGlzLmVzdC5jYW5TZWxlY3RBbGwgPSBzZWxlY3Rpb25JdGVtLmNvdW50ID4gMCAmJiB0aGlzLmVzdC5TZWxlY3RBbGwgJiYgIXRoaXMuZXN0LlNpbmdsZVNlbGVjdGlvbjtcclxuXHJcbiAgICAgICAgLy8gUG90cmViYmUgY2FtYmlhcmUgcXVhbG9yYSBxdWFsY3VubyBpbnNlcmlzc2UgZGF0aSBhIG1hbmF6emEgaW4gbW9kYWxpdMOgIEFycmF5IGUgZGVzc2UgaWwgcmVmcmVzaCBtYW51YWxlIGFsbGEgdGFiZWxsYVxyXG4gICAgICAgIC8vIENvbXVucXVlIGNvc3RhIDAgcXVpbmRpIG1pIHBlcm1ldHRvIGRpIHJlZnJlc2hhcmVcclxuICAgICAgICBpZiAodGhpcy5lc3QuYXJyYXlNb2RlKSB7XHJcbiAgICAgICAgICAgIGxldCBwcmV2U2VsZWN0ZWQgPSB0aGlzLmVzdC5zZWxlY3RlZE9iamVjdHM7XHJcbiAgICAgICAgICAgIHRoaXMuZmluYWxpemVTZWxlY3Rpb25JbmZvcm1hdGlvbnMoc2VsZWN0aW9uSXRlbSk7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLmVzdC5zZWxlY3RlZE9iamVjdHMgIT0gcHJldlNlbGVjdGVkKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lc3Qub25TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoc2VsZWN0aW9uSXRlbSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0byB1biBvZ2dldHRvIHRyb3ZhIGxhIGNlbGxhIGRpIGNhY2hlIGluIGN1aSDDqCByZWdpc3RyYXRvIGUgYWdnaW9ybmEgaWwgY29udGVudXRvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBpdGVtIE9nZ2V0dG8gZGEgYWdnaW9ybmFyZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHJlaGlkcmF0ZUNhY2hlKGl0ZW06IGFueSkge1xyXG4gICAgICAgIGxldCBjdHggPSBpdGVtLl9oYXNoO1xyXG4gICAgICAgIGlmICh0aGlzLml0ZW1zQ2FjaGUuaGFzKGN0eCkpXHJcbiAgICAgICAgICAgIHRoaXMuaXRlbXNDYWNoZS5zZXQoY3R4LCBpdGVtKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBfZXhjbHVzaW9uc0NhY2hlLmhhcyhjdHgpKVxyXG4gICAgICAgICAgICB0aGlzLmdyb3VwX2V4Y2x1c2lvbnNDYWNoZS5zZXQoY3R4LCBpdGVtKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBzQ2FjaGUuaGFzKGN0eCkpXHJcbiAgICAgICAgICAgIHRoaXMuZ3JvdXBzQ2FjaGUuc2V0KGN0eCwgaXRlbSk7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmV4Y2x1c2lvbnNDYWNoZS5oYXMoY3R4KSlcclxuICAgICAgICAgICAgdGhpcy5leGNsdXNpb25zQ2FjaGUuc2V0KGN0eCwgaXRlbSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRvIHVuIGdydXBwbyBjb250cm9sbGEgcmljb3JzaXZhbWVudGUgbCdhbGJlcm8gZGkgY3VpIGZhIHBhcnRlIHNlIGMnw6ggc3RhdGEgdW5hIGluY2x1c2lvbmUgbyBlc2NsdXNpb25lIGRpcmV0dGFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGdycCBHcnVwcG8gZGEgY29udHJvbGxhcmVcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMgeydub25lJyB8ICdleGNsdWRlZCcgfCAnaW5jbHVkZWQnfSBcclxuICAgICAqICdub25lJyBzZSBub24gY2kgc29ubyBpbmZvcm1hemlvbmkgc3UgaW5jbHVzaW9uaSBvIGVzY2x1c2lvbmkgXHJcbiAgICAgKiAnaW5jbHVkZWQnIHNlIGlsIGdydXBwbyBjb250cm9sbGF0byDDqCBzdGF0byBpbmNsdXNvIGluIG1hbmllcmEgZXNwbGljaXRhIGRhbGwnYWxiZXJvIGRlaSBncnVwcGkgcGFkcmlcclxuICAgICAqICdleGNsdWRlZCcgc2UgaWwgZ3J1cHBvIGNvbnRyb2xsYXRvIMOoIHN0YXRvIGVzY2x1c28gaW4gbWFuaWVyYSBlc3BsaWNpdGEgZGFsbCdhbGJlcm8gZGVpIGdydXBwaSBwYWRyaVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBhcmVudFRyZWVTdGF0dXMoZ3JwOiBhbnkpOiAnbm9uZScgfCAnZXhjbHVkZWQnIHwgJ2luY2x1ZGVkJyB7XHJcbiAgICAgICAgaWYgKCFncnApXHJcbiAgICAgICAgICAgIHJldHVybiAnbm9uZSc7XHJcblxyXG4gICAgICAgIGxldCBwYXJlbnRHcm91cDogYW55ID0gdGhpcy5yZ0hhbmRsZXIucmdHcm91cENhY2hlLmdldChncnAuX3BhcmVudCk7XHJcblxyXG4gICAgICAgIGlmICghcGFyZW50R3JvdXApXHJcbiAgICAgICAgICAgIHJldHVybiAnbm9uZSc7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLmdyb3VwX2V4Y2x1c2lvbnNDYWNoZS5oYXMocGFyZW50R3JvdXAuX2hhc2gpKVxyXG4gICAgICAgICAgICByZXR1cm4gJ2V4Y2x1ZGVkJztcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuZ3JvdXBzQ2FjaGUuaGFzKHBhcmVudEdyb3VwLl9oYXNoKSlcclxuICAgICAgICAgICAgcmV0dXJuICdpbmNsdWRlZCc7XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnBhcmVudFRyZWVTdGF0dXMocGFyZW50R3JvdXApO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBwZXIgZ2VzdGlyZSBsYSBzZWxlemlvbmUgZGkgTiBlbGVtZW50aSB1dGlsaXp6YW5kbyBsYSBDYWNoZSBkaSBzZWxlemlvbmUgZWQgZXZlbnR1YWxtZW50ZSBhZ2dpb3JuYW5kbyBpbCBjb25jZXR0byBkaSBcImFsbCBzZWxlY3Rpb25cIlxyXG4gICAgICpcclxuICAgICAqIFZ1bnppb25hIHNpYSBpbiBtb2RhbGl0w6AgQXJyYXkgY2hlIGluIG1vZGFsaXTDoCBWaWV3IFNlbXBsaWNlIG8gVmlldyBBdmFuemF0YSAoY29uIGxlIEN1c3RvbSBDZWxscylcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBpdGVtcyBPZ2dldHRpIGRhIHNlbGV6aW9uYXJlIG8gZGVzZWxlemlvbmFyZVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBmb3JjZWRWYWwgVmFsb3JlIGZvcnphdG8gZGkgY2hlY2sgZGEgYXNzZWduYXJlIGFnbGkgb2dnZXR0aVxyXG4gICAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxDaGVjayBWYWxvcmUgZGVsIGNoZWNrIGdsb2JhbGVcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7SXRlbXNTZWxlY3Rpb248YW55Pn0gT2dnZXR0byBkaSBzZWxlemlvbmUgYWdnaW9ybmF0byBjb24gbGUgaW5mb3JtYXppb25pIHN1bGwndWx0aW1hIG9wZXJhemlvbmUgZWZmZXR0dWF0YVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgaGFuZGxlSXRlbXNTZWxlY3Rpb24oaXRlbXM6IGFueVtdLCBmb3JjZWRWYWw6IGJvb2xlYW4gPSBudWxsLCBnbG9iYWxDaGVjazogYm9vbGVhbiA9IG51bGwpOiBJdGVtc1NlbGVjdGlvbjxhbnk+IHtcclxuICAgICAgICBsZXQgc2kgPSAodGhpcy5lc3QuVmlldyBhcyBBcHBTZWFyY2g8YW55Pik/LnNlbGVjdGlvbiB8fCB0aGlzLmVzdC5hcnJheW1vZGVTZWxlY3Rpb247XHJcblxyXG4gICAgICAgIC8vIFNlIHNvbm8gaW4gbW9kYWxpdMOgIGRpIHNlbGV6aW9uZSBzaW5nb2xhIGUgZGV2byBzZWxlemlvbmFyZSB1bidvZ2dldHRvLCBwZXIgcHJpbWEgY29zYSBkZXZvIGRlc2VsZXppb25hcmUgdHV0dGkgZ2xpIGFsdHJpXHJcbiAgICAgICAgaWYgKHRoaXMuZXN0LlNpbmdsZVNlbGVjdGlvbiAmJiBpdGVtc1swXT8uX3NlbGVjdGVkICYmICFpdGVtc1swXT8uX2dyb3VwKSB7XHJcbiAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAxICYmIGZvcmNlZFZhbCA9PSBudWxsKVxyXG4gICAgICAgICAgICAgICAgdGhyb3cgXCJUZW50YXRpdm8gZGkgc2VsZXppb25hcmUgbyBkZXNlbGV6aW9uYXJlIHBpw7kgZGkgdW4gZWxlbWVudG8gY29uIFNpbmdsZVNlbGVjdGlvbiBhdHRpdm9cIjtcclxuXHJcbiAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPT0gMSAmJiBmb3JjZWRWYWwgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICAgICAgc2kgPSB0aGlzLmhhbmRsZUl0ZW1zU2VsZWN0aW9uKHRoaXMuZXN0LmJvdW5kU291cmNlLmZpbHRlcih0ID0+ICF0Ll9ncm91cCksIGZhbHNlLCBudWxsKTtcclxuICAgICAgICAgICAgICAgIGl0ZW1zWzBdLl9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGl0ZW0gPSBpdGVtc1tpXTtcclxuICAgICAgICAgICAgbGV0IHRvQ2hhbmdlID0gZm9yY2VkVmFsICE9IG51bGwgPyBpdGVtLl9zZWxlY3RlZCAhPSBmb3JjZWRWYWwgOiBnbG9iYWxDaGVjayAhPSBudWxsID8gaXRlbS5fc2VsZWN0ZWQgIT0gdGhpcy5lc3QuZ2xvYmFsQ2hlY2sgOiBmYWxzZTtcclxuXHJcbiAgICAgICAgICAgIC8vIFNlIGRldidlc3NlcmUgb3ZlcnJpZGF0byBpbCB2YWxvcmUgZGkgY2hlY2sgZWZmZXR0dW8gbCdvdmVycmlkZSBvIGNvbCB2YWxvcmUgZm9yemF0byBvIGNvbCB2YWxvcmUgZ2xvYmFsZVxyXG4gICAgICAgICAgICBpZiAodG9DaGFuZ2UgJiYgIWl0ZW0ubG9ja2VkKVxyXG4gICAgICAgICAgICAgICAgaXRlbS5fc2VsZWN0ZWQgPSBmb3JjZWRWYWwgIT0gbnVsbCA/IGZvcmNlZFZhbCA6IHRoaXMuZXN0Lmdsb2JhbENoZWNrO1xyXG5cclxuICAgICAgICAgICAgLy8gU2UgaWwgdmFsb3JlIG5vbiBkZXYnZXNzZXJlIHZhcmlhdG8gZSB2ZW5nbyBkYSB1bmEgc2VsZXppb25lIGdsb2JhbGUgc2VtcGxpY2VtZW50ZSBldml0byBkaSBlZmZldHR1YXJlIG9wZXJhaXpvbmkgaW51dGlsaS4gTCdpdGVtL2dydXBwbyDDqCBnacOgIG5lbGxvIHN0YXRvIGdpdXN0b1xyXG4gICAgICAgICAgICBpZiAoIXRvQ2hhbmdlICYmIGdsb2JhbENoZWNrICE9IG51bGwpXHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuXHJcbiAgICAgICAgICAgIGxldCBhbGxTZWxlY3Rpb24gPSBzaS5hbGw7XHJcbiAgICAgICAgICAgIGxldCBpc0dyb3VwID0gaXRlbS5fZ3JvdXA7XHJcbiAgICAgICAgICAgIGxldCBpc1NlbGVjdGlvbiA9IGl0ZW0uX3NlbGVjdGVkO1xyXG4gICAgICAgICAgICBsZXQgaXRlbUdyb3VwID0gbnVsbCwgYWxsSXRlbXMgPSBudWxsLCBzZWxlY3RlZEl0ZW1zID0gbnVsbCwgdW5zZWxlY3RlZEl0ZW1zID0gbnVsbCwgYWxsR3JvdXBzID0gbnVsbCwgc2VsZWN0ZWRHcm91cHMgPSBudWxsLCB1bnNlbGVjdGVkR3JvdXBzID0gbnVsbCwgcGFyZW50R3JvdXBTZWxlY3RlZCA9IG51bGwsIHBhcmVudEdyb3VwVW5zZWxlY3RlZCA9IG51bGw7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNHcm91cCkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHB0cyA9IHRoaXMucGFyZW50VHJlZVN0YXR1cyhpdGVtKTtcclxuICAgICAgICAgICAgICAgIHBhcmVudEdyb3VwU2VsZWN0ZWQgPSBwdHMgPT0gJ2luY2x1ZGVkJztcclxuICAgICAgICAgICAgICAgIHBhcmVudEdyb3VwVW5zZWxlY3RlZCA9IHB0cyA9PSAnZXhjbHVkZWQnO1xyXG4gICAgICAgICAgICAgICAgYWxsSXRlbXMgPSB0aGlzLmdldEdyb3VwSXRlbXMoc2ksIGl0ZW0sIG51bGwsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtcyA9IHRoaXMuZ2V0R3JvdXBJdGVtcyhzaSwgaXRlbSwgJ3NlbGVjdGVkJywgdHJ1ZSwgYWxsSXRlbXMpO1xyXG4gICAgICAgICAgICAgICAgdW5zZWxlY3RlZEl0ZW1zID0gdGhpcy5nZXRHcm91cEl0ZW1zKHNpLCBpdGVtLCAndW5zZWxlY3RlZCcsIHRydWUsIGFsbEl0ZW1zKTtcclxuICAgICAgICAgICAgICAgIGFsbEdyb3VwcyA9IHRoaXMuZ2V0R3JvdXBDaGlsZEdyb3VwcyhzaSwgaXRlbSwgbnVsbCwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEdyb3VwcyA9IHRoaXMuZ2V0R3JvdXBDaGlsZEdyb3VwcyhzaSwgaXRlbSwgJ3NlbGVjdGVkJywgdHJ1ZSwgYWxsR3JvdXBzKTtcclxuICAgICAgICAgICAgICAgIHVuc2VsZWN0ZWRHcm91cHMgPSB0aGlzLmdldEdyb3VwQ2hpbGRHcm91cHMoc2ksIGl0ZW0sICd1bnNlbGVjdGVkJywgdHJ1ZSwgYWxsR3JvdXBzKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGl0ZW1Hcm91cCA9IHRoaXMuZ2V0SXRlbUdyb3VwKGl0ZW0pO1xyXG4gICAgICAgICAgICAgICAgcGFyZW50R3JvdXBTZWxlY3RlZCA9IGl0ZW1Hcm91cCA9PSBudWxsID8gbnVsbCA6IGl0ZW1Hcm91cC5fc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgICAgICBwYXJlbnRHcm91cFVuc2VsZWN0ZWQgPSBpdGVtR3JvdXAgPT0gbnVsbCA/IG51bGwgOiAhaXRlbUdyb3VwLl9zZWxlY3RlZDtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgaWYgKCF0aGlzLmVzdC5BcnJheUdyb3VwaW5nKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtU2VsZWN0aW9uT3BlcmF0aW9ucyhzaSwgaXRlbSwgYWxsU2VsZWN0aW9uLCBpc0dyb3VwLCBpc1NlbGVjdGlvbiwgc2VsZWN0ZWRJdGVtcywgc2VsZWN0ZWRHcm91cHMsIHVuc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEdyb3VwcywgYWxsSXRlbXMsIGFsbEdyb3VwcywgcGFyZW50R3JvdXBTZWxlY3RlZCwgcGFyZW50R3JvdXBVbnNlbGVjdGVkKTtcclxuICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtU2ltcGxlU2VsZWN0aW9uT3BlcmF0aW9ucyhzaSwgaXRlbSwgaXNHcm91cCwgaXNTZWxlY3Rpb24sIGl0ZW1Hcm91cCwgc2VsZWN0ZWRJdGVtcywgdW5zZWxlY3RlZEl0ZW1zLCBhbGxJdGVtcywgYWxsR3JvdXBzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vIEltcG9zdG8gaWwgY2hlY2sgZ2xvYmFsZSBpbiBiYXNlIGEgc2UgdHV0dGkgZ2xpIGVsZW1lbnRpIHNvbm8gc2VsZXppb25hdGkgbyBtZW5vLlxyXG4gICAgICAgIC8vIEV2aXRvIGRpIGZhcmUgcXVlc3RlIG9wZXJhemlvbmkgc2UgbGEgc2VsZXppb25lIGRlcml2YSBwcm9wcmlvIGRhbCBnbG9iYWwgQ2hlY2tcclxuICAgICAgICBpZiAoZ2xvYmFsQ2hlY2sgPT0gbnVsbClcclxuICAgICAgICAgICAgdGhpcy5lc3QuZ2xvYmFsQ2hlY2sgPSAhdGhpcy5lc3QuYm91bmRTb3VyY2Uuc29tZSh0ID0+ICF0Ll9zZWxlY3RlZCAmJiAhdC5fc2VwKTtcclxuXHJcbiAgICAgICAgdGhpcy5maW5hbGl6ZVNlbGVjdGlvbkluZm9ybWF0aW9ucyhzaSk7XHJcblxyXG4gICAgICAgIHJldHVybiBzaTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdG8gTCdvZ2dldHRvIGRpIHNlbGV6aW9uZSwgbCdvZ2dldHRvIGRhIHNlbGV6aW9uYXJlL2Rlc2VsZXppb25hcmUgZSB0dXR0aSBpIHBhcmFtZXRyaSBkZWwgY2FzbyBlZmZldHR1YSBsZSBvcGVyYXppb25pIGNoZSBzZXJ2b25vLlxyXG4gICAgICogXHJcbiAgICAgKiBMb2dpY2Egc2VtcGxpZmljYXRhIHJpc3BldHRvIGFsbCdvcmlnaW5hbGUgKipwZXJmb3JtU2VsZWN0aW9uT3BlcmF0aW9ucyoqIHBlciBsYXZvcmFyZSBpbiB1bmEgbW9kYWxpdMOgIGluIGN1aSB0dXR0aSBnbGkgZWxlbWVudGkgc29ubyBjYXJpY2F0aSAoKipBcnJheUdyb3VwaW5nKiogPSB0cnVlKVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBlcmZvcm1TaW1wbGVTZWxlY3Rpb25PcGVyYXRpb25zKGJhc2U6IEl0ZW1zU2VsZWN0aW9uPGFueT4sIGl0ZW06IGFueSwgZ3JvdXA6IGJvb2xlYW4sIHNlbDogYm9vbGVhbiwgaXRtX2dyb3VwOiBhbnksIHNlbF9pdG06IGFueVtdLCBkZXNlbF9pdG06IGFueVtdLCBhbGxfaXRtczogYW55W10sIGFsbF9ncnBzOiBhbnlbXSkge1xyXG4gICAgICAgIGxldCB0cmlwdGljSXRlbSA9IHRoaXMuZ2V0VHJpcHRpYygnaXRlbScsIGJhc2UpO1xyXG5cclxuICAgICAgICBpZiAoZ3JvdXApIHtcclxuICAgICAgICAgICAgaWYgKHNlbCkge1xyXG4gICAgICAgICAgICAgICAgYWxsX2dycHMuZm9yRWFjaChnciA9PiB7IGdyLl9zZWxlY3RlZCA9IHRydWU7IH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGRlc2VsX2l0bSlcclxuICAgICAgICAgICAgICAgICAgICBkZXNlbF9pdG0uZm9yRWFjaChlbCA9PiB7IGVsLl9zZWxlY3RlZCA9IHRydWU7IHRoaXMuYWRkSXRlbShlbCwgdHJpcHRpY0l0ZW0pIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgYWxsX2dycHMuZm9yRWFjaChnciA9PiB7IGdyLl9zZWxlY3RlZCA9IGZhbHNlOyB9KTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxfaXRtKVxyXG4gICAgICAgICAgICAgICAgICAgIHNlbF9pdG0uZm9yRWFjaChlbCA9PiB7IGVsLl9zZWxlY3RlZCA9IGZhbHNlOyB0aGlzLnJlbW92ZUl0ZW0oZWwsIHRyaXB0aWNJdGVtKSB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHNlbCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtKGl0ZW0sIHRyaXB0aWNJdGVtKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdG1fZ3JvdXAgJiYgYWxsX2l0bXMgJiYgYWxsX2l0bXMuZXZlcnkodCA9PiB0Ll9zZWxlY3RlZCkpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RHcm91cChpdG1fZ3JvdXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGl0ZW0sIHRyaXB0aWNJdGVtKTtcclxuICAgICAgICAgICAgICAgIGlmIChpdG1fZ3JvdXApXHJcbiAgICAgICAgICAgICAgICAgICAgaXRtX2dyb3VwLl9zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHBlciBzZWxlemlvbmFyZSB1biBncnVwcG8gZSwgcmljb3JzaXZhbWVudGUsIHNlIHR1dHRpIGkgZ3J1cHBpIHNvdHRvc3RhbnRpIGFsIHBhcmVudCBzb25vIHNlbGV6aW9uYXRpLCBzZWxlemlvbmFyZSBpIGdydXBwaSBwYWRyaVxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gZ3JvdXAgR3J1cHBvIGRhIHNlbGV6aW9uYXJlXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgc2VsZWN0R3JvdXAoZ3JvdXA6IGFueSkge1xyXG4gICAgICAgIGdyb3VwLl9zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgbGV0IHBhcmVudCA9IHRoaXMuZ2V0R3JvdXBQYXJlbnQoZ3JvdXApO1xyXG4gICAgICAgIGlmIChwYXJlbnQgJiYgdGhpcy5nZXRHcm91cENoaWxkR3JvdXBzKG51bGwsIHBhcmVudCwgbnVsbCwgdHJ1ZSkuZXZlcnkodCA9PiB0Ll9zZWxlY3RlZCkpXHJcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0R3JvdXAocGFyZW50KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdG8gTCdvZ2dldHRvIGRpIHNlbGV6aW9uZSwgbCdvZ2dldHRvIGRhIHNlbGV6aW9uYXJlL2Rlc2VsZXppb25hcmUgZSB0dXR0aSBpIHBhcmFtZXRyaSBkZWwgY2FzbyBlZmZldHR1YSBsZSBvcGVyYXppb25pIGNoZSBzZXJ2b25vLlxyXG4gICAgICogXHJcbiAgICAgKiBMYSBsb2dpY2EgZGkgcXVlc3RhIGZ1bnppb25lIMOoIG5hdGEgZXNzZW56aWFsbWVudGUgZGEgc3BhbSBkaSB0cmlhbCAmIGVycm9yIGVkIMOoIHN0YXRhIHRlc3RhdGEgc29sbyBmaW5vIGEgZHVlIGxpdmVsbGkgZGkgcmFnZ3J1cHBhbWVudG8sXHJcbiAgICAgKiBxdWFsc2lhc2kgY29zYSB2YWRhIG9sdHJlIG5vbiDDqCAxMDAlIGRldHRvIGNoZSBmdW56aW9uaS4uLlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIHBlcmZvcm1TZWxlY3Rpb25PcGVyYXRpb25zKGJhc2U6IEl0ZW1zU2VsZWN0aW9uPGFueT4sIGl0ZW06IGFueSwgYWxsOiBib29sZWFuLCBncm91cDogYm9vbGVhbiwgc2VsOiBib29sZWFuLCBzZWxfaXRtOiBhbnlbXSwgc2VsX2dycDogYW55W10sIGRlc2VsX2l0bTogYW55W10sIGRlc2VsX2dycDogYW55W10sIGFsbF9pdG1zOiBhbnlbXSwgYWxsX2dycHM6IGFueVtdLCBwYXJlbnRfaW5jbDogYm9vbGVhbiwgcGFyZW50X2V4Y2w6IGJvb2xlYW4pIHtcclxuICAgICAgICBsZXQgdHJpcHRpY0dyb3VwID0gdGhpcy5nZXRUcmlwdGljKCdncm91cCcsIGJhc2UpO1xyXG4gICAgICAgIGxldCB0cmlwdGljSXRlbSA9IHRoaXMuZ2V0VHJpcHRpYygnaXRlbScsIGJhc2UpO1xyXG4gICAgICAgIGxldCB0cmlwdGljRXhjbCA9IHRoaXMuZ2V0VHJpcHRpYygnZXhjbHVzaW9uJywgYmFzZSk7XHJcbiAgICAgICAgbGV0IHRyaXB0aWNncnBFeGNsID0gdGhpcy5nZXRUcmlwdGljKCdncm91cF9leGNsdXNpb24nLCBiYXNlKTtcclxuXHJcbiAgICAgICAgaWYgKGdyb3VwKSB7XHJcbiAgICAgICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChhbGwgfHwgcGFyZW50X2luY2wpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVJdGVtKGl0ZW0sIHRyaXB0aWNncnBFeGNsKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW0oaXRlbSwgdHJpcHRpY0dyb3VwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoc2VsX2l0bSkgc2VsX2l0bS5mb3JFYWNoKGVsID0+IHRoaXMucmVtb3ZlSXRlbShlbCwgdHJpcHRpY0l0ZW0pKTtcclxuICAgICAgICAgICAgICAgIGlmIChzZWxfZ3JwKSBzZWxfZ3JwLmZvckVhY2goZ3IgPT4gdGhpcy5yZW1vdmVJdGVtKGdyLCB0cmlwdGljR3JvdXApKTtcclxuICAgICAgICAgICAgICAgIGlmIChhbGxfaXRtcykgYWxsX2l0bXMuZm9yRWFjaChlbCA9PiB7IGVsLl9zZWxlY3RlZCA9IHRydWU7IHRoaXMucmVtb3ZlSXRlbShlbCwgdHJpcHRpY0V4Y2wpOyB9KTtcclxuICAgICAgICAgICAgICAgIGlmIChhbGxfZ3JwcykgYWxsX2dycHMuZm9yRWFjaChnciA9PiB7IGdyLl9zZWxlY3RlZCA9IHRydWU7IHRoaXMucmVtb3ZlSXRlbShnciwgdHJpcHRpY2dycEV4Y2wpOyB9KTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChhbGwgfHwgcGFyZW50X2luY2wpXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtKGl0ZW0sIHRyaXB0aWNncnBFeGNsKTtcclxuICAgICAgICAgICAgICAgIGVsc2VcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSwgdHJpcHRpY0dyb3VwKTtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAoZGVzZWxfaXRtKSBkZXNlbF9pdG0uZm9yRWFjaChlbCA9PiB0aGlzLnJlbW92ZUl0ZW0oZWwsIHRyaXB0aWNFeGNsKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoZGVzZWxfZ3JwKSBkZXNlbF9ncnAuZm9yRWFjaChnciA9PiB0aGlzLnJlbW92ZUl0ZW0oZ3IsIHRyaXB0aWNFeGNsKSk7XHJcbiAgICAgICAgICAgICAgICBpZiAoYWxsX2l0bXMpIGFsbF9pdG1zLmZvckVhY2goZWwgPT4geyBlbC5fc2VsZWN0ZWQgPSBmYWxzZTsgdGhpcy5yZW1vdmVJdGVtKGVsLCB0cmlwdGljSXRlbSk7IH0pO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFsbF9ncnBzKSBhbGxfZ3Jwcy5mb3JFYWNoKGdyID0+IHsgZ3IuX3NlbGVjdGVkID0gZmFsc2U7IHRoaXMucmVtb3ZlSXRlbShnciwgdHJpcHRpY0dyb3VwKTsgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgIGlmIChzZWwpIHtcclxuICAgICAgICAgICAgICAgIGlmICgocGFyZW50X2V4Y2wgPT0gbnVsbCAmJiBhbGwpIHx8IHBhcmVudF9pbmNsKVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtLCB0cmlwdGljRXhjbCk7XHJcbiAgICAgICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRJdGVtKGl0ZW0sIHRyaXB0aWNJdGVtKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChwYXJlbnRfZXhjbCB8fCAoIWFsbCAmJiBwYXJlbnRfZXhjbCA9PSBudWxsKSlcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSwgdHJpcHRpY0l0ZW0pO1xyXG4gICAgICAgICAgICAgICAgZWxzZVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkSXRlbShpdGVtLCB0cmlwdGljRXhjbCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhlbHBlciBwZXIgZXZpdGFyZSBkaSByaXNjcml2ZXJlIG9nbmkgc2FudGEgdm9sdGEgYXJyYXkuc3BsaWNlKGFycmF5LmluZGV4b2YoaXRlbSksIDEpOyAqL1xyXG4gICAgcHJpdmF0ZSByZW1vdmVJdGVtKGl0ZW06IGFueSwgdHJpcHRpYz86IENhY2hlVHJpcHRpYykge1xyXG4gICAgICAgIGxldCBpbmRleCA9IHRyaXB0aWMuaW5kZXhfY2FjaGUuZ2V0KGl0ZW0uX2hhc2gpO1xyXG4gICAgICAgIGlmIChpbmRleCAhPSBudWxsKSB7XHJcbiAgICAgICAgICAgIHRyaXB0aWMuY2FjaGUuZGVsZXRlKGl0ZW0uX2hhc2gpO1xyXG4gICAgICAgICAgICB0cmlwdGljLmluZGV4X2NhY2hlLmRlbGV0ZShpdGVtLl9oYXNoKTtcclxuICAgICAgICAgICAgdHJpcHRpYy5hcnJheVtpbmRleF0gPSBudWxsO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuICEhaW5kZXg7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqIEhlbHBlciBwZXIgZXZpdGFyZSBkaSByaXNjcml2ZXJlIG9nbmkgc2FudGEgdm9sdGEgYXJyYXkucHVzaChpdGVtKTsgZSBsYSBnZXN0aW9uZSBkZWxsYSAgKi9cclxuICAgIHByaXZhdGUgYWRkSXRlbShpdGVtOiBhbnksIHRyaXB0aWM/OiBDYWNoZVRyaXB0aWMpOiBib29sZWFuIHtcclxuICAgICAgICBpZiAodHJpcHRpYy5pbmRleF9jYWNoZS5nZXQoaXRlbS5faGFzaCkgPT0gbnVsbCkge1xyXG4gICAgICAgICAgICBsZXQgaSA9IHRyaXB0aWMuYXJyYXkucHVzaChpdGVtKSAtIDE7XHJcbiAgICAgICAgICAgIHRyaXB0aWMuY2FjaGUuc2V0KGl0ZW0uX2hhc2gsIGl0ZW0pO1xyXG4gICAgICAgICAgICB0cmlwdGljLmluZGV4X2NhY2hlLnNldChpdGVtLl9oYXNoLCBpKTtcclxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBPdHRpZW5lIGlsIHRyaXR0aWNvIGRpIHNlbGV6aW9uZSwgY2lvw6ggbCdhcnJheSBkZWdsaSBvZ2dldHRpIGNoZSBzaSB2dW9sZSBtYW5pcG9sYXJlIGUgbGUgZHVlIGNhY2hlIGNvbGxlZ2F0ZSBhZCBlc3NvXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7J2dyb3VwJyB8ICdpdGVtJyB8ICdncm91cF9leGNsdXNpb24nIHwgJ2V4Y2x1c2lvbid9IHN1YmplY3QgT2dnZXR0byBsb2dpY28gZGVzaWRlcmF0byBzdSBjdWkgZWZmZXR0dWFyZSBsZSBvcGVyYXppb25pIHN1Y2Nlc3NpdmVcclxuICAgICAqIEBwYXJhbSB7SXRlbXNTZWxlY3Rpb248YW55Pn0gYmFzZSBTZWxldHRvcmUgZGkgYmFzZVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7Q2FjaGVUcmlwdGljfSBUcml0dGljbyBkaSBzZWxlemlvbmVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRUcmlwdGljKHN1YmplY3Q6ICdncm91cCcgfCAnaXRlbScgfCAnZ3JvdXBfZXhjbHVzaW9uJyB8ICdleGNsdXNpb24nLCBiYXNlOiBJdGVtc1NlbGVjdGlvbjxhbnk+KTogQ2FjaGVUcmlwdGljIHtcclxuICAgICAgICBzd2l0Y2ggKHN1YmplY3QpIHtcclxuICAgICAgICAgICAgY2FzZSAnZ3JvdXAnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWNoZVRyaXB0aWModGhpcy5ncm91cHNDYWNoZSwgdGhpcy5pX2dyb3Vwc0NhY2hlLCBiYXNlLmdyb3Vwcyk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2l0ZW0nOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDYWNoZVRyaXB0aWModGhpcy5pdGVtc0NhY2hlLCB0aGlzLmlfaXRlbXNDYWNoZSwgYmFzZS5pdGVtcyk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2dyb3VwX2V4Y2x1c2lvbic6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENhY2hlVHJpcHRpYyh0aGlzLmdyb3VwX2V4Y2x1c2lvbnNDYWNoZSwgdGhpcy5pX2dyb3VwX2V4Y2x1c2lvbnNDYWNoZSwgYmFzZS5ncm91cF9leGNsdXNpb25zKTtcclxuICAgICAgICAgICAgY2FzZSAnZXhjbHVzaW9uJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FjaGVUcmlwdGljKHRoaXMuZXhjbHVzaW9uc0NhY2hlLCB0aGlzLmlfZXhjbHVzaW9uc0NhY2hlLCBiYXNlLmV4Y2x1c2lvbnMpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdG8gdW4gb2dnZXR0byByZXN0aXR1aXNjZSBpbCBncnVwcG8gZGkgY3VpIGZhIHBhcnRlLCBzZSBlc2lzdGVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGl0ZW0gT2dnZXR0byBkaSBjdWkgdHJvdmFyZSBpbCBncnVwcG9cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBnZXRJdGVtR3JvdXAoaXRlbTogYW55KTogYW55IHtcclxuICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5yZ0hhbmRsZXIucmdHcm91cENhY2hlLmdldChpdGVtLl90aGlzS2V5KVxyXG4gICAgICAgIGlmIChwYXJlbnQpXHJcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7XHJcblxyXG4gICAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0YSBsYSBjaGlhdmUgZGkgdW4gZ3J1cHBvIHJlc3RpdHVpc2NlIHR1dHRpIGdsaSBvZ2dldHRpIGNvbiBxdWVsbGEgY2hpYXZlXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7YW55fSBncm91cCBDaGlhdmUgZGEgY2VyY2FyZVxyXG4gICAgICogQHBhcmFtIHsnc2VsZWN0ZWQnIHwgJ3Vuc2VsZWN0ZWQnfSBzdGF0dXMgU3RhdG8gZGVnbGkgZWxlbWVudGksIHNlbGV6aW9uYXRpIG8gbm9cclxuICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gcmVjdXJzaXZlIEluZGljYSBzZSBjZXJjYXJlIHNvbG8gZ2xpIGVsZW1lbnRpIGRpcmV0dGFtZW50ZSBjb2xsZWdhdGkgbyBzZSBwcmVuZGVyZSBhbmNoZSBxdWVsbGkgZGVpIGdydXBwaSBmaWdsaVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7YW55W119IE9nZ2V0dGkgZGkgdGlwbyAqKl9pdGVtKiogZmFjZW50aSBjYXBvIGFsbGEgY2hpYXZlICoqZ3JvdXBLZXkqKlxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEdyb3VwSXRlbXMoc2VsOiBJdGVtc1NlbGVjdGlvbjxhbnk+LCBncm91cDogYW55LCBzdGF0dXM/OiAnc2VsZWN0ZWQnIHwgJ3Vuc2VsZWN0ZWQnLCByZWN1cnNpdmU6IGJvb2xlYW4gPSBmYWxzZSwgYWxsYmFzZTogYW55W10gPSBudWxsKTogYW55W10ge1xyXG4gICAgICAgIGxldCBpdGVtcyA9IFtdO1xyXG5cclxuICAgICAgICBpZiAoYWxsYmFzZSlcclxuICAgICAgICAgICAgaXRlbXMgPSBhbGxiYXNlO1xyXG4gICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAocmVjdXJzaXZlKSB7XHJcbiAgICAgICAgICAgICAgICAvLyBJbiBtb2RhbGl0w6Agcmljb3JzaXZhIHByZW5kbyBnbGkgb2dnZXR0aSBkaSB0dXR0ZSBsZSBjaGlhdmkgc2ltaWxpIGNoZSB0cm92b1xyXG4gICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IG9mIHRoaXMucmdIYW5kbGVyLnJnSXRlbUNhY2hlLmtleXMoKSlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoZ3JvdXAuX3RoaXNLZXkpKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKC4uLnRoaXMucmdIYW5kbGVyLnJnSXRlbUNhY2hlLmdldChrZXkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBpdGVtcyA9IHRoaXMucmdIYW5kbGVyLnJnSXRlbUNhY2hlLmdldChncm91cC5fdGhpc0tleSk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpdGVtcyA9IGl0ZW1zLmZpbHRlcih0ID0+ICFzdGF0dXMgfHwgKHQuX3NlbGVjdGVkICYmIHN0YXR1cyA9PSAnc2VsZWN0ZWQnKSB8fCAoIXQuX3NlbGVjdGVkICYmIHN0YXR1cyA9PSAndW5zZWxlY3RlZCcpKTtcclxuXHJcbiAgICAgICAgLy8gTm9uIHRyb3ZvIG5lc3N1biBvZ2dldHRvLCBwZXLDsiBtYWdhcmkgZGkgb2dnZXR0aSBuZSBobyBhbGwnaW50ZXJubyBkZWxsJ29nZ2V0dG8gZGkgc2VsZXppb25lLiBcclxuICAgICAgICAvLyBRdWVzdG8gcHXDsiBlc3NlcmUgdmVybyBzb2xvIHNlIE5PTiBzb25vIGluIG1vZGFsaXTDoCBhcnJheSwgaW4gY2FzbyBjb250cmFyaW8gZ2xpIG9nZ2V0dGkgbGkgZGV2byBwZXIgZm9yemEgYXZlcmUgdHV0dGlcclxuICAgICAgICBpZiAoaXRlbXMubGVuZ3RoICE9IDAgfHwgIXNlbCB8fCB0aGlzLmVzdC5hcnJheU1vZGUpXHJcbiAgICAgICAgICAgIHJldHVybiBpdGVtcztcclxuXHJcbiAgICAgICAgaWYgKHN0YXR1cyA9PSAndW5zZWxlY3RlZCcpXHJcbiAgICAgICAgICAgIGl0ZW1zID0gc2VsLmV4Y2x1c2lvbnMuZmlsdGVyKHQgPT4gdCAhPSBudWxsICYmXHJcbiAgICAgICAgICAgICAgICAoIXJlY3Vyc2l2ZSAmJiB0Ll90aGlzS2V5ID09IGdyb3VwLl90aGlzS2V5KSB8fFxyXG4gICAgICAgICAgICAgICAgKHJlY3Vyc2l2ZSAmJiB0Ll90aGlzS2V5LnN0YXJ0c1dpdGgoZ3JvdXAuX3RoaXNLZXkpKSk7XHJcbiAgICAgICAgZWxzZSBpZiAoc3RhdHVzID09ICdzZWxlY3RlZCcpXHJcbiAgICAgICAgICAgIGl0ZW1zID0gc2VsLml0ZW1zLmZpbHRlcih0ID0+IHQgIT0gbnVsbCAmJlxyXG4gICAgICAgICAgICAgICAgKCFyZWN1cnNpdmUgJiYgdC5fdGhpc0tleSA9PSBncm91cC5fdGhpc0tleSkgfHxcclxuICAgICAgICAgICAgICAgIChyZWN1cnNpdmUgJiYgdC5fdGhpc0tleS5zdGFydHNXaXRoKGdyb3VwLl90aGlzS2V5KSkpO1xyXG5cclxuICAgICAgICByZXR1cm4gaXRlbXM7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIGxhIGNoaWF2ZSBkaSB1biBncnVwcG8gcmVzdGl0dWlzY2UgdHV0dGkgZ2xpIG9nZ2V0dGkgY29uIHF1ZWxsYSBjaGlhdmVcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGdyb3VwIEdydXBwbyBkaSBjdWkgY2VyY2FyZSBpbCBwYXJlbnRcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2FueX0gT2dnZXR0byBkaSB0aXBvICoqX2dyb3VwKiogcmFwcHJlc2VudGFudGUgaWwgcGFyZW50IGRlbCAqKmdyb3VwKiogYXR0dWFsZVxyXG4gICAgICovXHJcbiAgICBwcml2YXRlIGdldEdyb3VwUGFyZW50KGdyb3VwOiBhbnkpOiBhbnkge1xyXG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLnJnSGFuZGxlci5yZ0dyb3VwQ2FjaGUuZ2V0KGdyb3VwLl9wYXJlbnQpXHJcbiAgICAgICAgaWYgKHBhcmVudClcclxuICAgICAgICAgICAgcmV0dXJuIHBhcmVudDtcclxuXHJcbiAgICAgICAgcmV0dXJuIG51bGw7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBEYXRhIGxhIGNoaWF2ZSBkaSB1biBncnVwcG8gcmVzdGl0dWlzY2UgdHV0dGkgaSBncnVwcGkgZmlnbGlcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGdyb3VwIEdydXBwbyBjaGUgcmFwcHJlc2VudGEgaWwgcGFkcmUgZGkgY3VpIGNlcmNhcmUgaSBmaWdsaVxyXG4gICAgICogQHBhcmFtIHsnc2VsZWN0ZWQnIHwgJ3Vuc2VsZWN0ZWQnfSBzdGF0dXMgU3RhdG8gZGVpIGdydXBwaSwgc2VsZXppb25hdGkgbyBub1xyXG4gICAgICogQHBhcmFtIHtib29sZWFufSByZWN1cnNpdmUgSW5kaWNhIHNlIGNlcmNhcmUgc29sbyBpIGdydXBwaSBkaXJldHRhbWVudGUgY29sbGVnYXRpIG8gc2UgcHJlbmRlcmUgYW5jaGUgcXVlbGxpIGRlaSBncnVwcGkgZmlnbGlcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge2FueVtdfSBPZ2dldHRpIGRpIHRpcG8gKipfZ3JvdXAqKiBmYWNlbnRpIGNhcG8gYWxsYSBjaGlhdmUgKipncm91cEtleSoqXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZ2V0R3JvdXBDaGlsZEdyb3VwcyhzZWw6IEl0ZW1zU2VsZWN0aW9uPGFueT4sIGdyb3VwOiBhbnksIHN0YXR1cz86ICdzZWxlY3RlZCcgfCAndW5zZWxlY3RlZCcsIHJlY3Vyc2l2ZTogYm9vbGVhbiA9IGZhbHNlLCBhbGxiYXNlOiBhbnlbXSA9IG51bGwpIHtcclxuICAgICAgICBsZXQgdGhpc0dyb3VwOiBhbnkgPSB0aGlzLnJnSGFuZGxlci5yZ0dyb3VwQ2FjaGUuZ2V0KGdyb3VwLl90aGlzS2V5KTtcclxuICAgICAgICBsZXQgaXRlbXMgPSBbXTtcclxuXHJcbiAgICAgICAgaWYgKGFsbGJhc2UpXHJcbiAgICAgICAgICAgIGl0ZW1zID0gYWxsYmFzZTtcclxuICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZSkge1xyXG4gICAgICAgICAgICAgICAgLy8gSW4gbW9kYWxpdMOgIHJpY29yc2l2YSBwcmVuZG8gZ2xpIG9nZ2V0dGkgZGkgdHV0dGUgbGUgY2hpYXZpIHNpbWlsaSBjaGUgdHJvdm9cclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBvZiB0aGlzLnJnSGFuZGxlci5yZ0NoaWxkR3JvdXBzQ2FjaGUua2V5cygpKVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChncm91cC5fdGhpc0tleSkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2goLi4udGhpcy5yZ0hhbmRsZXIucmdDaGlsZEdyb3Vwc0NhY2hlLmdldChrZXkpKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgICAgICBpdGVtcyA9IHRoaXMucmdIYW5kbGVyLnJnQ2hpbGRHcm91cHNDYWNoZS5nZXQoZ3JvdXAuX3RoaXNLZXkpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaXRlbXMgPSBpdGVtcy5maWx0ZXIodCA9PiAhc3RhdHVzIHx8ICh0Ll9zZWxlY3RlZCAmJiBzdGF0dXMgPT0gJ3NlbGVjdGVkJykgfHwgKCF0Ll9zZWxlY3RlZCAmJiBzdGF0dXMgPT0gJ3Vuc2VsZWN0ZWQnKSk7XHJcblxyXG4gICAgICAgIC8vIE5vbiB0cm92byBuZXNzdW4gb2dnZXR0bywgcGVyw7IgbWFnYXJpIGRpIG9nZ2V0dGkgbmUgaG8gYWxsJ2ludGVybm8gZGVsbCdvZ2dldHRvIGRpIHNlbGV6aW9uZVxyXG4gICAgICAgIGlmIChpdGVtcy5sZW5ndGggIT0gMCB8fCAhc2VsKVxyXG4gICAgICAgICAgICByZXR1cm4gaXRlbXM7XHJcblxyXG4gICAgICAgIGlmIChzdGF0dXMgPT0gJ3Vuc2VsZWN0ZWQnKVxyXG4gICAgICAgICAgICBpdGVtcyA9IHNlbC5ncm91cF9leGNsdXNpb25zLmZpbHRlcigodDogYW55KSA9PiB0ICE9IG51bGwgJiYgKFxyXG4gICAgICAgICAgICAgICAgKCFyZWN1cnNpdmUgJiYgdC5fdGhpc1JvdXRlLmxlbmd0aCA9PSB0aGlzR3JvdXAuX3RoaXNSb3V0ZS5sZW5ndGggKyAxICYmIHQuX3RoaXNSb3V0ZS5zdGFydHNXaXRoKGdyb3VwLl90aGlzS2V5KSkgfHxcclxuICAgICAgICAgICAgICAgIChyZWN1cnNpdmUgJiYgdC5fdGhpc0tleS5zdGFydHNXaXRoKGdyb3VwLl90aGlzS2V5KSkpKTtcclxuICAgICAgICBlbHNlXHJcbiAgICAgICAgICAgIGl0ZW1zID0gc2VsLmdyb3Vwcy5maWx0ZXIoKHQ6IGFueSkgPT4gdCAhPSBudWxsICYmIChcclxuICAgICAgICAgICAgICAgICghcmVjdXJzaXZlICYmIHQuX3RoaXNSb3V0ZS5sZW5ndGggPT0gdGhpc0dyb3VwLl90aGlzUm91dGUubGVuZ3RoICsgMSAmJiB0Ll90aGlzUm91dGUuc3RhcnRzV2l0aChncm91cC5fdGhpc0tleSkpIHx8XHJcbiAgICAgICAgICAgICAgICAocmVjdXJzaXZlICYmIHQuX3RoaXNLZXkuc3RhcnRzV2l0aChncm91cC5fdGhpc0tleSkpKSk7XHJcblxyXG4gICAgICAgIHJldHVybiBpdGVtcztcclxuICAgIH1cclxuXHJcbiAgICAvKiogRmluYWxpenphIGxlIGluZm9ybWF6aW9uaSBkaSBzZWxlemlvbmUgZGVsICoqSXRlbXNTZWxlY3Rpb24qKiBjb3JyZW50ZSAqL1xyXG4gICAgcHJpdmF0ZSBmaW5hbGl6ZVNlbGVjdGlvbkluZm9ybWF0aW9ucyhzZWxlY3Rpb25JdGVtOiBJdGVtc1NlbGVjdGlvbjxhbnk+KSB7XHJcbiAgICAgICAgLy8gRGF0byBjaGUgbGUgZGVsZXRlIHNvbm8gbG9naWNoZSBkYXRvIGNoZSB0ZW5nbyBsYSBjYWNoZSBkZWdsaSBpbmRpY2kgZGV2byByZW5kZXJsZSBmaXNpY2hlXHJcbiAgICAgICAgbGV0IHRtcEdycCA9IFtdLCB0bXBJdGVtcyA9IFtdLCB0bXBFeGNsID0gW10sIHRtcEdycEV4Y2wgPSBbXTtcclxuICAgICAgICBsZXQgZ3JwUmVtb3ZlZCA9IGZhbHNlLCBpdGVtc1JlbW92ZWQgPSBmYWxzZSwgZXhjbFJlbW92ZWQgPSBmYWxzZSwgZ3JwRXhjbFJlbW92ZWQgPSBmYWxzZTtcclxuXHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb25JdGVtLml0ZW1zLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uSXRlbS5pdGVtc1tpXSAhPSBudWxsKSB0bXBJdGVtcy5wdXNoKHNlbGVjdGlvbkl0ZW0uaXRlbXNbaV0pO1xyXG4gICAgICAgICAgICBlbHNlIGl0ZW1zUmVtb3ZlZCA9IHRydWU7XHJcblxyXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uSXRlbS5leGNsdXNpb25zLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICBpZiAoc2VsZWN0aW9uSXRlbS5leGNsdXNpb25zW2ldICE9IG51bGwpIHRtcEV4Y2wucHVzaChzZWxlY3Rpb25JdGVtLmV4Y2x1c2lvbnNbaV0pO1xyXG4gICAgICAgICAgICBlbHNlIGV4Y2xSZW1vdmVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgLy8gSW4gdmVjY2hpZSB2ZXJzaW9uaSBkZWxsJ0FwcFNlYXJjaCBwZXIgY3VpIG5vbiB2ZW5nb25vIGRlc2VyaWFsaXp6YXRlIHF1ZXN0ZSBpbmZvcm1haXpvbmkgcG90cmViYmVybyBlc3NlcmNpIGNhc2luaVxyXG4gICAgICAgIGlmIChzZWxlY3Rpb25JdGVtLmdyb3Vwcykge1xyXG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdGlvbkl0ZW0uZ3JvdXBzLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW0uZ3JvdXBzW2ldICE9IG51bGwpIHRtcEdycC5wdXNoKHNlbGVjdGlvbkl0ZW0uZ3JvdXBzW2ldKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgZ3JwUmVtb3ZlZCA9IHRydWU7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBpZiAoc2VsZWN0aW9uSXRlbS5ncm91cF9leGNsdXNpb25zKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uSXRlbS5ncm91cF9leGNsdXNpb25zLmxlbmd0aDsgaSsrKVxyXG4gICAgICAgICAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW0uZ3JvdXBfZXhjbHVzaW9uc1tpXSAhPSBudWxsKSB0bXBHcnBFeGNsLnB1c2goc2VsZWN0aW9uSXRlbS5ncm91cF9leGNsdXNpb25zW2ldKTtcclxuICAgICAgICAgICAgICAgIGVsc2UgZ3JwRXhjbFJlbW92ZWQgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgc2VsZWN0aW9uSXRlbS5pdGVtcyA9IHRtcEl0ZW1zO1xyXG4gICAgICAgIHNlbGVjdGlvbkl0ZW0uZ3JvdXBfZXhjbHVzaW9ucyA9IHRtcEdycEV4Y2w7XHJcbiAgICAgICAgc2VsZWN0aW9uSXRlbS5leGNsdXNpb25zID0gdG1wRXhjbDtcclxuICAgICAgICBzZWxlY3Rpb25JdGVtLmdyb3VwcyA9IHRtcEdycDtcclxuXHJcbiAgICAgICAgLy8gTGUgY2FjaGUgZGVnbGkgaW5kaWNpIHBvdHJlYmJlcm8gYXZlcmUgYnVjaGksIHJpc29sdm9cclxuICAgICAgICBpZiAoZ3JwUmVtb3ZlZClcclxuICAgICAgICAgICAgdGhpcy5pX2dyb3Vwc0NhY2hlID0gdGhpcy5jb21wYWN0SW5kZXhNYXAodGhpcy5pX2dyb3Vwc0NhY2hlKTtcclxuICAgICAgICBpZiAoaXRlbXNSZW1vdmVkKVxyXG4gICAgICAgICAgICB0aGlzLmlfaXRlbXNDYWNoZSA9IHRoaXMuY29tcGFjdEluZGV4TWFwKHRoaXMuaV9pdGVtc0NhY2hlKTtcclxuICAgICAgICBpZiAoZXhjbFJlbW92ZWQpXHJcbiAgICAgICAgICAgIHRoaXMuaV9leGNsdXNpb25zQ2FjaGUgPSB0aGlzLmNvbXBhY3RJbmRleE1hcCh0aGlzLmlfZXhjbHVzaW9uc0NhY2hlKTtcclxuICAgICAgICBpZiAoZ3JwRXhjbFJlbW92ZWQpXHJcbiAgICAgICAgICAgIHRoaXMuaV9ncm91cF9leGNsdXNpb25zQ2FjaGUgPSB0aGlzLmNvbXBhY3RJbmRleE1hcCh0aGlzLmlfZ3JvdXBfZXhjbHVzaW9uc0NhY2hlKTtcclxuXHJcbiAgICAgICAgLy8gUG9pIHJpcHJlbmRvIGEgZmFyZSB0dXR0byBpbiBub3JtYWxpdMOgXHJcbiAgICAgICAgc2VsZWN0aW9uSXRlbS5jb3VudCA9IHRoaXMuZXZhbHVhdGVTZWxlY3RlZCgpO1xyXG5cclxuICAgICAgICAvLyBTZSBobyBmYXR0byBzZWxlemlvbmUgXCJhbGxcIiBtYSBwb2kgbWkgc29ubyBtZXNzbyBhIHRvZ2xpZXJlIHR1dHRpIGdsaSBlbGVtZW50aSBmaW5vIGEgcmltYW5lcm5lIDAgcmVzZXR0byBsJ29nZ2V0dG8gZGkgc2VsZXppb25lXHJcbiAgICAgICAgaWYgKHNlbGVjdGlvbkl0ZW0uY291bnQgPT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLmVzdC5ib3VuZFNvdXJjZS5mb3JFYWNoKHQgPT4gdC5fc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW0uYWxsID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW0uZXhjbHVzaW9ucyA9IFtdO1xyXG4gICAgICAgICAgICBzZWxlY3Rpb25JdGVtLml0ZW1zID0gW107XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW0uZ3JvdXBzID0gW107XHJcbiAgICAgICAgICAgIHNlbGVjdGlvbkl0ZW0uZ3JvdXBfZXhjbHVzaW9ucyA9IFtdO1xyXG5cclxuICAgICAgICAgICAgLy8gUmlwdWxpc2NvIGxhIGNhY2hlIGFsdHJpbWVudGkgbWkgcmltYW5lIHBpZW5hIGRpIHR1dHRlIGxlIGVzY2x1c2lvbmlcclxuICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbkNhY2hlcygpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gU2UgbGEgcG9zc2liaWxpdMOgIGRpIGZhcmUgXCJTZWxlemlvbmEgdHV0dG9cIiDDqCBhYmlsaXRhdGEgYWxsb3JhIGxhIGNvbnNpZGVybyBhcHBlbmEgbWkgdmllbmUgc2VsZXppb25hdG8gcXVhbGNvc2FcclxuICAgICAgICB0aGlzLmVzdC5jYW5TZWxlY3RBbGwgPSBzZWxlY3Rpb25JdGVtLmNvdW50ID4gMCAmJiB0aGlzLmVzdC5TZWxlY3RBbGwgJiYgIXRoaXMuZXN0LlNpbmdsZVNlbGVjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKiogQ29tcGF0dGEgdW5hIGNhY2hlIGRpIGluZGljaSAqL1xyXG4gICAgcHJpdmF0ZSBjb21wYWN0SW5kZXhNYXAobWFwOiBNYXA8c3RyaW5nLCBudW1iZXI+KTogTWFwPHN0cmluZywgbnVtYmVyPiB7XHJcbiAgICAgICAgbGV0IGluZGV4ID0gMDtcclxuICAgICAgICBsZXQgcmV0ID0gbmV3IE1hcCgpO1xyXG4gICAgICAgIGZvciAobGV0IGtleSBvZiBtYXAua2V5cygpKVxyXG4gICAgICAgICAgICByZXQuc2V0KGtleSwgaW5kZXgrKyk7XHJcblxyXG4gICAgICAgIHJldHVybiByZXQ7XHJcbiAgICB9XHJcblxyXG5cclxuICAgIC8qKlxyXG4gICAgICogVmFsdXRhIGxhIHF1YW50aXTDoCBkaSBvZ2dldHRpIGNoZSBzb25vIHN0YXRpIHNlbGV6aW9uYXRpIGFsIHRlcm1pbmUgZGkgdW4gZXZlbnRvIGRpIHNlbGV6aW9uZVxyXG4gICAgICpcclxuICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IE51bWVybyBkaSBvZ2dldHRpIHNlbGV6aW9uYXRpXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgZXZhbHVhdGVTZWxlY3RlZCgpOiBudW1iZXIge1xyXG4gICAgICAgIGxldCBzaSA9ICh0aGlzLmVzdC5WaWV3IGFzIEFwcFNlYXJjaDxhbnk+KT8uc2VsZWN0aW9uIHx8IHRoaXMuZXN0LmFycmF5bW9kZVNlbGVjdGlvbjtcclxuXHJcbiAgICAgICAgbGV0IGV4Y0J5R3JvdXAgPSBzaS5ncm91cF9leGNsdXNpb25zLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiArIGN1cnIuY291bnQsIDApO1xyXG4gICAgICAgIGxldCBpbmNCeUdyb3VwID0gc2kuZ3JvdXBzLnJlZHVjZSgocHJldiwgY3VycikgPT4gcHJldiArIGN1cnIuY291bnQsIDApO1xyXG5cclxuICAgICAgICB0aGlzLmVzdC5zZWxlY3RlZE9iamVjdHMgPSAoc2kuYWxsID8gdGhpcy5lc3QuQmFzZUl0ZW1zQ291bnQgOiBpbmNCeUdyb3VwKSAtIGV4Y0J5R3JvdXAgKyBzaS5pdGVtcy5sZW5ndGggLSBzaS5leGNsdXNpb25zLmxlbmd0aDtcclxuICAgICAgICByZXR1cm4gdGhpcy5lc3Quc2VsZWN0ZWRPYmplY3RzO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKiBHZXN0aXNjZSBpbCBjb21hbmRvIGRpIFwiU2VsZXppb25hIHR1dHRvIGluIHR1dHRlIGxlIHBhZ2luZVwiIG8gaWwgc3VvIGNvbnRyYXJpbywgY2lvw6ggXCJSZWltcG9zdGEgc2VsZXppb25lXCIgKi9cclxuICAgIHB1YmxpYyBzZWxlY3RBbGxPclJlc2V0U2VsZWN0aW9uKCkge1xyXG4gICAgICAgIGxldCBzZWxlY3Rpb25JdGVtID0gdGhpcy5lc3QuVmlldy5zZWxlY3Rpb24gfHwgdGhpcy5lc3QuYXJyYXltb2RlU2VsZWN0aW9uO1xyXG4gICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb25DYWNoZXMoKTtcclxuICAgICAgICBzZWxlY3Rpb25JdGVtLmFsbCA9ICFzZWxlY3Rpb25JdGVtLmFsbDtcclxuICAgICAgICBzZWxlY3Rpb25JdGVtLmV4Y2x1c2lvbnMgPSBbXTtcclxuICAgICAgICBzZWxlY3Rpb25JdGVtLmdyb3VwcyA9IFtdO1xyXG4gICAgICAgIHNlbGVjdGlvbkl0ZW0uZ3JvdXBfZXhjbHVzaW9ucyA9IFtdO1xyXG4gICAgICAgIHNlbGVjdGlvbkl0ZW0uaXRlbXMgPSBbXTtcclxuXHJcbiAgICAgICAgLy8gUmlwdWxpc2NvIGdsaSBzdGF0aSBVSSBkaSBzZWxlemlvbmUgZ2xvYmFsZSBzZSBsJ2hvIGRpc2F0dGl2YXRhXHJcbiAgICAgICAgaWYgKCFzZWxlY3Rpb25JdGVtLmFsbCkge1xyXG4gICAgICAgICAgICB0aGlzLmVzdC5jYW5TZWxlY3RBbGwgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5lc3QuZ2xvYmFsQ2hlY2sgPSBmYWxzZTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHRoaXMuZmluYWxpemVTZWxlY3Rpb25JbmZvcm1hdGlvbnMoc2VsZWN0aW9uSXRlbSk7XHJcblxyXG4gICAgICAgIHRoaXMuZXN0Lm9uU2VsZWN0aW9uQ2hhbmdlZC5lbWl0KHNlbGVjdGlvbkl0ZW0pO1xyXG5cclxuICAgICAgICAvLyBEb3BvIGF2ZXIgcmVzZXR0YXRvIGRpcmV0dGFtZW50ZSBpbCBzb2xvIG9nZ2V0dG8gdGhpcy5WaWV3LnNlbGVjdGlvbiBkZXZvIGFuY2hlIHJpYWxsaW5lYXJlIGEgdHV0dGkgZ2xpIG9nZ2V0dGkgYmluZGF0aVxyXG4gICAgICAgIHRoaXMuZXZhbHVhdGVTZWxlY3Rpb24odGhpcy5lc3QuYm91bmRTb3VyY2UsIHNlbGVjdGlvbkl0ZW0pO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICAvKipcclxuICAgICAqIEBUT0RPIFNwb3N0YXJlIGluIFNlbGVjdGlvbkhhbmRsZXJcclxuICAgICAqIFxyXG4gICAgICogUmVnaXN0cmEgbGEgc2VsZXppb25lIHNpbmdvbGEgc3UgdW5hIGNlbGxhIHN1bGxhIGNvbWJvIGRpIGNvbWFuZGkgXCJDVFJMICsgQ2xpY2tcIi5cclxuICAgICAqIFNlIHZpZW5lIHByZW11dG8gYW5jaGUgaWwgdGFzdG8gU2hpZnQgdmllbmUgY3JlYXRvIHVuIHJhbmdlIGRpIHNlbGV6aW9uZSBpbCBjdWkgc3RhdHVzIGRpIFwic2VsZXppb25hdG9cIiB2aWVuZSBzYWx2YXRvIG5lbGxhXHJcbiAgICAgKiBtYXRyaWNlIHZpcnR1YWxlICoqc2VsZWN0aW9uU3RhdHVzKipcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHthbnl9IGV2ZW50IEV2ZW50byBKYXZhc2NyaXB0IGRpIENsaWNrXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93IEluZGljZSBkZWxsYSByaWdhLiBOb24gw6ggbCdpbmRpY2UgdmVybyBlIHByb3ByaW8gbWEgw6ggbCdvcmRpbmFsZSAoLm9yZGluYWwpIGRlbGwnb2dnZXR0byBiaW5kYXRvIHN1IHF1ZWxsYSByaWdhXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gY29sdW1uIEluZGljZSBkZWxsYSBjb2xvbm5hIHByZXNvIGJhbmFsbWVudGUgZGFsbCduZ0lmIHN1aSB0aEVsZW1lbnRcclxuICAgICAqIEBwYXJhbSB7eyByb3c6IG51bWJlciwgY29sdW1uOiBudW1iZXIgfX0gZmlyc3RTZWxlY3Rpb25PdmVycmlkZSBQZXJtZXR0ZSBkaSBvdmVycmlkYXJlIGlsIHByaW1vIGVsZW1lbnRvIHNlbGV6aW9uYXRvXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBzaW5nbGVDZWxsU2VsZWN0aW9uKGV2ZW50OiB7dmlldzogYW55LCByYW5nZTogYm9vbGVhbn0sIHJvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlciwgZmlyc3RTZWxlY3Rpb25PdmVycmlkZT86IHsgcm93OiBudW1iZXIsIGNvbHVtbjogbnVtYmVyIH0pIHtcclxuXHJcbiAgICAgICAgLy8gUmVjdXBlcm8gbGEgc2VsZXppb25lIHByZWNlZGVudGUgc2UgcHJlc2VudGUgY29tZSBwdW50byBkaSBwYXJ0ZW56YVxyXG4gICAgICAgIHZhciBmaXJzdCA9IGZpcnN0U2VsZWN0aW9uT3ZlcnJpZGUgfHwgdGhpcy5sYXN0U2luZ2xlU2VsZWN0aW9uO1xyXG5cclxuICAgICAgICAvL0lsIHB1bnRvIGRpIGFycml2bywgY2hlIGRpdmVudGVyw6AgaWwgcHJvc3NpbW8gcHVudG8gZGkgcGFydGVuemEsIMOoIGxhIHNlbGV6aW9uZSBjb3JyZW50ZVxyXG4gICAgICAgIHRoaXMubGFzdFNpbmdsZVNlbGVjdGlvbiA9IHsgcm93LCBjb2x1bW4gfTtcclxuICAgICAgICBcclxuICAgICAgICB0aGlzLmNsZWFyVGV4dFNlbGVjdGlvbihldmVudCk7XHJcbiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvblN0YXR1c0V4Y2x1ZGluZyh0aGlzLmxhc3RTaW5nbGVTZWxlY3Rpb24pO1xyXG4gICAgICAgIHRoaXMuc2V0U2VsZWN0aW9uU3RhdHVzQm9yZGVycyhldmVudC5yYW5nZSAmJiBmaXJzdCA/IGZpcnN0IDogdGhpcy5sYXN0U2luZ2xlU2VsZWN0aW9uLCB0aGlzLmxhc3RTaW5nbGVTZWxlY3Rpb24pO1xyXG5cclxuICAgICAgICAvLyBPcmEgY2hlIG5vbiDDqCBhdHRhY2NhdG8gZGlyZXR0YW1lbnRlIGFsbCdodG1sIGRldm8gZmFyZSB1biBtYXJrZm9yY2hlY2sgZmluaXRlIGxlIG9wZXJhemlvbmkgc3VpIGdyb3VwaW5nXHJcbiAgICAgICAgdGhpcy5lc3QuY2RyLm1hcmtGb3JDaGVjaygpO1xyXG4gICAgfVxyXG5cclxuICAgIHNldFNlbGVjdGlvblN0YXR1c0JvcmRlcnMoZnJvbToge3JvdzogbnVtYmVyLCBjb2x1bW46IG51bWJlcn0sIHRvOiB7cm93OiBudW1iZXIsIGNvbHVtbjogbnVtYmVyfSl7XHJcbiAgICAgICAgbGV0IHJvd0FkZGl0aW9uID0gdG8ucm93IDwgZnJvbS5yb3cgPyAtMSA6ICsxO1xyXG4gICAgICAgIGxldCBjb2x1bW5BZGRpdGlvbiA9IHRvLmNvbHVtbiA8IGZyb20uY29sdW1uID8gLTEgOiArMTtcclxuICAgICAgICBsZXQgc2luZ2xlSXRlbSA9IGZyb20gPT0gdG87XHJcblxyXG4gICAgICAgIGZvciAobGV0IGlyID0gZnJvbS5yb3c7IGlyICE9IHRvLnJvdyArIHJvd0FkZGl0aW9uOyBpciArPSByb3dBZGRpdGlvbilcclxuICAgICAgICB7XHJcbiAgICAgICAgICAgIGxldCBmaXJzdFJvdyA9IGlyID09IGZyb20ucm93O1xyXG4gICAgICAgICAgICBsZXQgbGFzdFJvdyA9IGlyID09IHRvLnJvdztcclxuICAgICAgICAgICAgZm9yIChsZXQgaWMgPSBmcm9tLmNvbHVtbjsgaWMgIT0gdG8uY29sdW1uICsgY29sdW1uQWRkaXRpb247IGljICs9IGNvbHVtbkFkZGl0aW9uKSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3RDb2wgPSBpYyA9PSBmcm9tLmNvbHVtbjtcclxuICAgICAgICAgICAgICAgIGxldCBsYXN0Q29sID0gaWMgPT0gdG8uY29sdW1uO1xyXG5cclxuICAgICAgICAgICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW2lyXVtpY107XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJldkNvbHVtbiA9IGljID4gMCA/IHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tpcl1baWMgLSAxXSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmV4dGNvbHVtbiA9ICB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbaXJdW2ljICsgMV07XHJcbiAgICAgICAgICAgICAgICBsZXQgcHJldlJvdyA9IGlyID4gMCA/IHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tpciAtIDFdW2ljXSA6IG51bGw7XHJcbiAgICAgICAgICAgICAgICBsZXQgbmV4dFJvdyA9IHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tpciArIDFdID8gdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzW2lyICsgMV1baWNdIDogbnVsbDtcclxuXHJcbiAgICAgICAgICAgICAgICBjdXJyZW50LnNlbGVjdGVkID0gc2luZ2xlSXRlbSA/ICFjdXJyZW50LnNlbGVjdGVkIDogdHJ1ZTtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnQubGJvcmRlciA9ICFjdXJyZW50LnNlbGVjdGVkID8gZmFsc2UgOiBjb2x1bW5BZGRpdGlvbiA+IDAgPyBmaXJzdENvbCA6IGxhc3RDb2w7XHJcbiAgICAgICAgICAgICAgICBjdXJyZW50LnRib3JkZXIgPSAhY3VycmVudC5zZWxlY3RlZCA/IGZhbHNlIDogcm93QWRkaXRpb24gPiAwID8gZmlyc3RSb3cgOiBsYXN0Um93O1xyXG4gICAgICAgICAgICAgICAgY3VycmVudC5yYm9yZGVyID0gIWN1cnJlbnQuc2VsZWN0ZWQgPyBmYWxzZSA6IGNvbHVtbkFkZGl0aW9uID4gMCA/IGxhc3RDb2wgOiBmaXJzdENvbDtcclxuICAgICAgICAgICAgICAgIGN1cnJlbnQuYmJvcmRlciA9ICFjdXJyZW50LnNlbGVjdGVkID8gZmFsc2UgOiByb3dBZGRpdGlvbiA+IDAgPyBsYXN0Um93IDogZmlyc3RSb3c7XHJcblxyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZSb3cpXHJcbiAgICAgICAgICAgICAgICAgICAgcHJldlJvdy5ib3ZlcmxhcHMgPSBjdXJyZW50LnRib3JkZXI7XHJcbiAgICAgICAgICAgICAgICBpZiAobmV4dFJvdylcclxuICAgICAgICAgICAgICAgICAgICBuZXh0Um93LnRvdmVybGFwcyA9IGN1cnJlbnQuYmJvcmRlcjtcclxuXHJcbiAgICAgICAgICAgICAgICBpZiAocHJldkNvbHVtbilcclxuICAgICAgICAgICAgICAgICAgICBwcmV2Q29sdW1uLnJvdmVybGFwcyA9IGN1cnJlbnQubGJvcmRlcjtcclxuICAgICAgICAgICAgICAgIGlmIChuZXh0Y29sdW1uKVxyXG4gICAgICAgICAgICAgICAgICAgIG5leHRjb2x1bW4ubG92ZXJsYXBzID0gY3VycmVudC5yYm9yZGVyO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogSGVscGVyIHBlciByaXB1bGlyZSBsbyBzdGF0byBkaSBzZWxlemlvbmUgZGVsbGUgc2luZ29sZSBjZWxsZSBkZWxsYSB0YWJlbGxhLCBhZCBlc2NsdXNpb25lIGRpIHVuYSBzaW5nb2xhIGNvb3JkaW5hdGFcclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIHt7cm93OiBudW1iZXIsIGNvbHVtbjogbnVtYmVyfX0gZXhjbHVzaW9uIENvb3JkaW5hdGEgZGEgZXNjbHVkZXJlIG5lbGxhIHB1bGl6aWFcclxuICAgICAqL1xyXG4gICAgcHVibGljIGNsZWFyU2VsZWN0aW9uU3RhdHVzRXhjbHVkaW5nKGV4Y2x1c2lvbj86IHsgcm93OiBudW1iZXIsIGNvbHVtbjogbnVtYmVyIH0pIHtcclxuICAgICAgICBmb3IgKGxldCByb3cgaW4gdGhpcy5lc3Quc2VsZWN0aW9uU3RhdHVzKSB7XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbiBpbiB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbcm93XSkge1xyXG5cclxuICAgICAgICAgICAgICAgIC8vIFNlIMOoIGwnZWxlbWVudG8gY2hlIGhvIGVzY2x1c28gZGFsIGNsZWFudXAsIHNraXBwb1xyXG4gICAgICAgICAgICAgICAgaWYgKGV4Y2x1c2lvbiAmJiByb3cgPT0gZXhjbHVzaW9uLnJvdy50b1N0cmluZygpICYmIGNvbHVtbiA9PSBleGNsdXNpb24uY29sdW1uLnRvU3RyaW5nKCkpXHJcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQWx0cmltZW50aSBwdWxpc2NvXHJcbiAgICAgICAgICAgICAgICBsZXQgY3VyciA9IHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tyb3ddW2NvbHVtbl07XHJcbiAgICAgICAgICAgICAgICBjdXJyLnNlbGVjdGVkID0gY3Vyci5sYm9yZGVyID0gY3Vyci5yYm9yZGVyID0gY3Vyci50Ym9yZGVyID0gY3Vyci5iYm9yZGVyID0gY3Vyci5sb3ZlcmxhcHMgPSBjdXJyLnJvdmVybGFwcyA9IGN1cnIudG92ZXJsYXBzID0gY3Vyci5ib3ZlcmxhcHMgPSBmYWxzZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBjaGUgZXNhbWluYSBsYSBtYXRyaWNlICoqc2VsZWN0aW9uU3RhdHVzKiogZSBuZSBlc3RyYXBwb2xhIGdsaSBlbGVtZW50aSBzZWxlemlvbmF0aSBpbiB1bmEgY29tb2RhIG1hdHJpY2VcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3sgdmFsdWU6IHN0cmluZywgdHlwZTogSW5wdXRUeXBlLCB2YWxfc2V0dGVyOiBGdW5jdGlvbiB9W11bXX0gTWF0cmljZSBkaSBlbGVtZW50aSBzZWxlemlvbmF0aSBjb24gbGEgbG9ybyBpbmZvcm1hemlvbmUgc3VsIHRpcG9cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldFNlbGVjdGlvblN0YXR1c1NlbGVjdGlvbigpOiBJdGVtUHJvcEVkaXRhYmxlUmVmZXJlbmNlW11bXSB7XHJcbiAgICAgICAgbGV0IHNlbGVjdGlvbjogSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZVtdW10gPSBbXVxyXG4gICAgICAgIGZvciAobGV0IHJvdyBpbiB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXMpIHtcclxuICAgICAgICAgICAgbGV0IHJvd1ZhbHVlczogSXRlbVByb3BFZGl0YWJsZVJlZmVyZW5jZVtdID0gW107XHJcbiAgICAgICAgICAgIGZvciAobGV0IGNvbHVtbiBpbiB0aGlzLmVzdC5zZWxlY3Rpb25TdGF0dXNbcm93XSkge1xyXG4gICAgICAgICAgICAgICAgbGV0IHNzSXRlbSA9IHRoaXMuZXN0LnNlbGVjdGlvblN0YXR1c1tyb3ddW2NvbHVtbl07XHJcbiAgICAgICAgICAgICAgICBpZiAoc3NJdGVtLnNlbGVjdGVkKVxyXG4gICAgICAgICAgICAgICAgICAgIHJvd1ZhbHVlcy5wdXNoKHNzSXRlbSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHJvd1ZhbHVlcy5sZW5ndGggPiAwKVxyXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uLnB1c2gocm93VmFsdWVzKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbjtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEhlbHBlciBwZXIgcmlwdWxpcmUgbGEgc2VsZXppb25lIGxhdG8gSFRNTFxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge2FueX0gZXZlbnQgRXZlbnRvIG5hdGl2byBKYXZhc2NyaXB0XHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjbGVhclRleHRTZWxlY3Rpb24oZXZlbnQ6IHt2aWV3OiBhbnksIHJhbmdlOiBib29sZWFufSkge1xyXG4gICAgICAgIC8vIFNlbGV6aW9ubyBkZWwgdGVzdG8gbWEgbm9uIGhvIHNoaWZ0IHByZW11dG8gLT4gaWdub3JvIGxhIHNlbGV6aW9uZVxyXG4gICAgICAgIGlmICgoZXZlbnQudmlldy5nZXRTZWxlY3Rpb24oKS50eXBlID09ICdSYW5nZScgfHwgZXZlbnQudmlldy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpLmxlbmd0aCA+IDApICYmICFldmVudC5yYW5nZSlcclxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG5cclxuICAgICAgICAvLyBTZWxlemlvbm8gZGVsIHRlc3RvIGUgaG8gc2hpZnQgcHJlbXV0byAtPiBhbm51bGxvIGxhIHNlbGV6aW9uZSBkZWwgdGVzdG9cclxuICAgICAgICBpZiAoKGV2ZW50LnZpZXcuZ2V0U2VsZWN0aW9uKCkudHlwZSA9PSAnUmFuZ2UnIHx8IGV2ZW50LnZpZXcuZ2V0U2VsZWN0aW9uKCkudG9TdHJpbmcoKS5sZW5ndGggPiAwKSAmJiBldmVudC5yYW5nZSlcclxuICAgICAgICAgICAgdGhpcy5lc3QudXRpRXh0cy5jbGVhclRleHRTZWxlY3Rpb24oKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgbGEgbWF0cmljZSBkaSBzZWxlemlvbmUgZ2VuZXJhdGEgZGFsIG1ldG9kbyAqKmdldFNlbGVjdGlvblN0YXR1c1NlbGVjdGlvbioqIGdlbmVyYSBsYSBzdHJpZ25hIHZlcmEgZSBwcm9wcmlhIGRhIGNvcGlhcmUgbmVsbGEgQ2xpcGJvYXJkXHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSB7eyB2YWx1ZTogc3RyaW5nLCB0eXBlOiBJbnB1dFR5cGUgfVtdW119IHNlbCBNYXRyaWNlIGRpIHNlbGV6aW9uZSBjb24gdmFsb3JpIGUgdGlwaSBkZWkgZGF0aSBzZWxlemlvbmF0aVxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBTdHJpbmdhIGRhIGNvcGlhcmUgbmVsbGEgY2xpcGJvYXJkLCBsZSBzdHJpbmdoZSB2ZW5nb25vIHdyYXBwYXRlIGZyYSBkb3BwaSBhcGljaSBlIGZyYSB1biB2YWxvcmUgZSBsJ2FsdHJvIHZpZW5lIG1lc3NvIHVuIHRhYlxyXG4gICAgICogaW4gbW9kbyBjaGUgc2lhbm8gY29tcGF0aWJpbGkgYW5jaGUgY29uIGxhIGNvcGlhIHN1IEV4Y2VsXHJcbiAgICAgKi9cclxuICAgIGdldENsaXBiYXJkVGV4dEZyb21TZWxlY3Rpb24oc2VsOiB7IHZhbHVlOiBzdHJpbmcsIHR5cGU6IElucHV0VHlwZSB8IHN0cmluZyB9W11bXSk6IHN0cmluZyB7XHJcbiAgICAgICAgdmFyIHJldCA9IFwiXCI7XHJcbiAgICAgICAgZm9yIChsZXQgciA9IDA7IHIgPCBzZWwubGVuZ3RoOyByKyspIHtcclxuICAgICAgICAgICAgbGV0IHJvdyA9IHNlbFtyXTtcclxuICAgICAgICAgICAgaWYgKHIgPiAwKSByZXQgKz0gXCJcXG5cIjtcclxuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCByb3cubGVuZ3RoOyBjKyspIHtcclxuICAgICAgICAgICAgICAgIGxldCBjb2wgPSByb3dbY107XHJcbiAgICAgICAgICAgICAgICByZXQgKz0gdGhpcy5nZXRWYWx1ZUJ5VHlwZShjb2wpICsgKGMgPCByb3cubGVuZ3RoIC0gMSA/IFwiXFx0XCIgOiBcIlwiKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmV0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogT3R0aWVuZSBsYSByYXBwcmVzZW50YXppb25lIHN0cmluZ2EgZGkgdW4gdmFsb3JlIGRhdG8gdW4gdGlwb1xyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0ge3sgdmFsdWU6IHN0cmluZywgdHlwZTogSW5wdXRUeXBlIH19IHZhbFR5cGUgT2dnZXR0byBWYWxvcmUgLSBUaXBvIGRhIGN1aSBlc3RyYXBvbGFyZSBsYSByYXBwcmVzZW50YXppb25lIGRlbCBkYXRvIGluIHN0cmluZ2FcclxuICAgICAqIFxyXG4gICAgICogQHJldHVybnMge3N0cmluZ30gVmFsb3JlIGNvbnZlcnRpdG8gaW4gc3RyaW5nYSBpbiBiYXNlIGFsIHRpcG9cclxuICAgICAqL1xyXG4gICAgZ2V0VmFsdWVCeVR5cGUodmFsVHlwZTogeyB2YWx1ZTogc3RyaW5nLCB0eXBlOiBJbnB1dFR5cGUgfCBzdHJpbmcgfSk6IHN0cmluZyB7XHJcbiAgICAgICAgc3dpdGNoICh2YWxUeXBlLnR5cGUpIHtcclxuICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiAnXCInICsgdmFsVHlwZS52YWx1ZSArICdcIic7XHJcbiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XHJcbiAgICAgICAgICAgIGNhc2UgJ2ludCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxyXG4gICAgICAgICAgICBjYXNlICdlbnVtJzpcclxuICAgICAgICAgICAgY2FzZSAnYXV0b2NvbXBsZXRlJzpcclxuICAgICAgICAgICAgICAgIHJldHVybiB2YWxUeXBlLnZhbHVlO1xyXG4gICAgICAgICAgICBjYXNlICdmbG9hdCc6XHJcbiAgICAgICAgICAgIGNhc2UgJ2N1cnJlbmN5JzpcclxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUZsb2F0KHZhbFR5cGUudmFsdWUpLnRvTG9jYWxlU3RyaW5nKHRoaXMuZXN0LmxvY2FsZSk7XHJcbiAgICAgICAgICAgIGNhc2UgJ2RhdGUnOlxyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGRheWpzKHZhbFR5cGUudmFsdWUpLmZvcm1hdCh0aGlzLmVzdC5sYy50b2tlbihcImdldFNtYWxsRGF0ZURpc3BsYXlGb3JtYXRcIikpO1xyXG4gICAgICAgICAgICBjYXNlICdkYXRldGltZSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF5anModmFsVHlwZS52YWx1ZSkuZm9ybWF0KHRoaXMuZXN0LmxjLnRva2VuKFwiZ2V0RnVsbERhdGVEaXNwbGF5Rm9ybWF0XCIpKTtcclxuICAgICAgICAgICAgY2FzZSAndGltZSc6XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZGF5anModmFsVHlwZS52YWx1ZSkuZm9ybWF0KFwiSEg6bW06c3NcIik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG59Il19