@universis/ngx-tables 0.7.30 → 0.8.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.
@@ -7,15 +7,17 @@ import { AdvancedColumnFormatter } from './advanced-table.formatters';
7
7
  import { ClientDataQueryable } from '@themost/client';
8
8
  import { AdvancedFilterValueProvider } from './advanced-filter-value-provider.service';
9
9
  import { BehaviorSubject } from 'rxjs';
10
- import { TemplatePipe, LoadingService } from '@universis/common';
10
+ import { TemplatePipe, LoadingService, ConfigurationService, ModalService, DIALOG_BUTTONS, ErrorService, ExportSpreadsheetService } from '@universis/common';
11
11
  // important note: use this import to avoid Cannot call a namespace ('jquery') error
12
12
  import * as jQuery_ from 'jquery';
13
13
  import 'datatables.net';
14
14
  import { template } from 'lodash';
15
15
  import 'datatables.net-scroller';
16
16
  import 'datatables.net-colreorder';
17
+ import 'datatables.net-buttons';
17
18
  import { HttpClient } from '@angular/common/http';
18
19
  import { ColumnSelectorService } from '../column-selector/column-selector.service';
20
+ import { MAX_EXPORT_ITEMS } from '../../directives/btnexp.directive';
19
21
  // restore jquery import to avoid Cannot call a namespace ('jquery') error
20
22
  var jQuery = jQuery_;
21
23
  var DataTablesApi = jQuery.fn.dataTable.Api;
@@ -24,6 +26,12 @@ DataTablesApi.register('processing()', function (show) {
24
26
  ctx.oApi._fnProcessingDisplay(ctx, show);
25
27
  });
26
28
  });
29
+ var ɵ0 = [];
30
+ var EMPTY_DATASET = {
31
+ recordsTotal: 0,
32
+ recordsFiltered: 0,
33
+ data: ɵ0,
34
+ };
27
35
  var TableTranslationChangeDetector = /** @class */ (function (_super) {
28
36
  tslib_1.__extends(TableTranslationChangeDetector, _super);
29
37
  function TableTranslationChangeDetector() {
@@ -42,6 +50,16 @@ var TableTranslationChangeDetector = /** @class */ (function (_super) {
42
50
  return TableTranslationChangeDetector;
43
51
  }(ChangeDetectorRef));
44
52
  export var COLUMN_FORMATTERS = new InjectionToken('column.formatters');
53
+ var ExportLimitExceededError = /** @class */ (function (_super) {
54
+ tslib_1.__extends(ExportLimitExceededError, _super);
55
+ function ExportLimitExceededError(message) {
56
+ var _this = _super.call(this, message) || this;
57
+ _this.name = 'ExportLimitExceededError';
58
+ return _this;
59
+ }
60
+ return ExportLimitExceededError;
61
+ }(RangeError));
62
+ export { ExportLimitExceededError };
45
63
  var ColumnFormatter = /** @class */ (function (_super) {
46
64
  tslib_1.__extends(ColumnFormatter, _super);
47
65
  function ColumnFormatter(injector) {
@@ -73,7 +91,7 @@ function getRandomIdentifier() {
73
91
  return (Number(String(Math.random()).slice(2))).toString(36);
74
92
  }
75
93
  var AdvancedTableComponent = /** @class */ (function () {
76
- function AdvancedTableComponent(_context, _columnFormatters, _activatedRoute, _translateService, _injector, _advancedFilterValueProvider, _element, _template, _loading, _http, _columnSelector) {
94
+ function AdvancedTableComponent(_context, _columnFormatters, _activatedRoute, _translateService, _injector, _advancedFilterValueProvider, _element, _template, _loading, _http, _columnSelector, _configuration, _exportSpreadsheet, _modalService, _errorService) {
77
95
  var _this = this;
78
96
  this._context = _context;
79
97
  this._columnFormatters = _columnFormatters;
@@ -86,6 +104,10 @@ var AdvancedTableComponent = /** @class */ (function () {
86
104
  this._loading = _loading;
87
105
  this._http = _http;
88
106
  this._columnSelector = _columnSelector;
107
+ this._configuration = _configuration;
108
+ this._exportSpreadsheet = _exportSpreadsheet;
109
+ this._modalService = _modalService;
110
+ this._errorService = _errorService;
89
111
  this._firstLoad = true;
90
112
  this._showFooter = false;
91
113
  this._showHeader = true;
@@ -129,6 +151,7 @@ var AdvancedTableComponent = /** @class */ (function () {
129
151
  this.customSelect = false;
130
152
  this.selected = [];
131
153
  this.unselected = [];
154
+ this._lastQueryTotalItems = 0;
132
155
  // initialize translate pipe
133
156
  this.translator = new TranslatePipe(this._translateService, new TableTranslationChangeDetector());
134
157
  jQuery.fn.dataTable.ext.classes.sPageButton = 'btn';
@@ -152,6 +175,13 @@ var AdvancedTableComponent = /** @class */ (function () {
152
175
  enumerable: true,
153
176
  configurable: true
154
177
  });
178
+ Object.defineProperty(AdvancedTableComponent.prototype, "lastQueryTotalItems", {
179
+ get: function () {
180
+ return this._lastQueryTotalItems;
181
+ },
182
+ enumerable: true,
183
+ configurable: true
184
+ });
155
185
  Object.defineProperty(AdvancedTableComponent.prototype, "showFooter", {
156
186
  get: function () {
157
187
  return this._showFooter;
@@ -779,12 +809,15 @@ var AdvancedTableComponent = /** @class */ (function () {
779
809
  recordsFiltered: 0,
780
810
  data: [],
781
811
  };
812
+ self._lastQueryTotalItems = 0;
782
813
  // emit empty data
783
814
  self.load.emit(emptyDataSet);
784
815
  // return empty data
785
816
  return fnCallback(emptyDataSet);
786
817
  }
787
818
  }
819
+ // reset error
820
+ self.toggleError();
788
821
  // get activated route params
789
822
  var queryParams = self._activatedRoute.snapshot.queryParams;
790
823
  // get columns
@@ -865,12 +898,13 @@ var AdvancedTableComponent = /** @class */ (function () {
865
898
  q.filter(expressions.join(' and '));
866
899
  }
867
900
  self.lastQueryParams = q.getParams();
868
- q.getList().then(function (items) {
901
+ return q.getList().then(function (items) {
869
902
  var dataSet = {
870
903
  recordsTotal: items.total,
871
904
  recordsFiltered: items.total,
872
905
  data: items.value,
873
906
  };
907
+ self._lastQueryTotalItems = items.total;
874
908
  if (items.total === 0) {
875
909
  self.resetEmptyTable();
876
910
  }
@@ -880,7 +914,14 @@ var AdvancedTableComponent = /** @class */ (function () {
880
914
  return fnCallback(dataSet);
881
915
  });
882
916
  }).catch(function (err) {
917
+ // log error to console
883
918
  console.error('TABLES', err);
919
+ // show error
920
+ self.toggleError(err);
921
+ self._lastQueryTotalItems = 0;
922
+ // by returning empty dataset
923
+ self.load.emit(EMPTY_DATASET);
924
+ return fnCallback(EMPTY_DATASET);
884
925
  });
885
926
  }
886
927
  self.lastQueryParams = q.getParams();
@@ -890,6 +931,7 @@ var AdvancedTableComponent = /** @class */ (function () {
890
931
  recordsFiltered: items.total,
891
932
  data: items.value,
892
933
  };
934
+ self._lastQueryTotalItems = items.total;
893
935
  if (items.total === 0) {
894
936
  self.resetEmptyTable();
895
937
  }
@@ -898,7 +940,13 @@ var AdvancedTableComponent = /** @class */ (function () {
898
940
  // return data
899
941
  return fnCallback(dataSet);
900
942
  }).catch(function (err) {
943
+ // log error to console
901
944
  console.error('TABLES', err);
945
+ // show error
946
+ self.toggleError(err);
947
+ // by returning empty dataset
948
+ self.load.emit(EMPTY_DATASET);
949
+ return fnCallback(EMPTY_DATASET);
902
950
  });
903
951
  },
904
952
  language: Object.assign({}, self.translator.transform('Tables.DataTable'), { emptyTable: ' ' }),
@@ -1132,9 +1180,28 @@ var AdvancedTableComponent = /** @class */ (function () {
1132
1180
  this.dataTable.context[0].oLanguage.sZeroRecords = this.emptyTable.nativeElement.innerHTML;
1133
1181
  }
1134
1182
  };
1183
+ AdvancedTableComponent.prototype.toggleError = function (err) {
1184
+ if (this.dataTable && this.dataTable.context[0]) {
1185
+ var innerMessage = this.errorTemplate.nativeElement.getElementsByTagName('small').item(0);
1186
+ if (err) {
1187
+ this.lastError = err;
1188
+ if (innerMessage) {
1189
+ innerMessage.innerHTML = err.error && err.error.message ? err.error.message : err.message;
1190
+ }
1191
+ this.dataTable.context[0].oLanguage.sEmptyTable =
1192
+ this.dataTable.context[0].oLanguage.sZeroRecords = this.errorTemplate.nativeElement.innerHTML;
1193
+ }
1194
+ else {
1195
+ if (innerMessage) {
1196
+ innerMessage.innerHTML = '';
1197
+ }
1198
+ this.dataTable.context[0].oLanguage.sEmptyTable = this.dataTable.context[0].oLanguage.sZeroRecords = '';
1199
+ }
1200
+ }
1201
+ };
1135
1202
  AdvancedTableComponent.prototype.clearEmptyTable = function () {
1136
1203
  if (this.dataTable && this.dataTable.context[0]) {
1137
- this.dataTable.context[0].oLanguage.sEmptyTable = '';
1204
+ this.dataTable.context[0].oLanguage.sEmptyTable = this.dataTable.context[0].oLanguage.sZeroRecords = '';
1138
1205
  }
1139
1206
  };
1140
1207
  AdvancedTableComponent.prototype.export = function () {
@@ -1249,13 +1316,132 @@ var AdvancedTableComponent = /** @class */ (function () {
1249
1316
  }
1250
1317
  });
1251
1318
  };
1319
+ /**
1320
+ *
1321
+ * @param options to pass an errorHandler callback, if desired
1322
+ * @returns void
1323
+ */
1324
+ AdvancedTableComponent.prototype.exportView = function (options) {
1325
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
1326
+ var exportSettings, exportLimit, totalDisplayedItems, _a, body, header, previousDataState, targetDataState, _b, body, header, err_1;
1327
+ return tslib_1.__generator(this, function (_c) {
1328
+ switch (_c.label) {
1329
+ case 0:
1330
+ _c.trys.push([0, 4, 5, 6]);
1331
+ this._loading.showLoading();
1332
+ // validate query items and config
1333
+ if (!(this._lastQueryTotalItems && this.config)) {
1334
+ // do nothing
1335
+ return [2 /*return*/];
1336
+ }
1337
+ exportSettings = this._configuration.settings;
1338
+ exportLimit = (exportSettings && exportSettings.tables && exportSettings.tables.exportLimit > 0)
1339
+ ? exportSettings.tables.exportLimit : MAX_EXPORT_ITEMS;
1340
+ // and validate it
1341
+ if (this._lastQueryTotalItems > exportLimit) {
1342
+ // call error handler
1343
+ // provide a recognizible error type
1344
+ if (options && options.errorHandler) {
1345
+ options.errorHandler(new ExportLimitExceededError('Export limit exceeded'));
1346
+ return [2 /*return*/];
1347
+ }
1348
+ // or show warning modal and exit
1349
+ this._modalService.showWarningDialog(this._translateService.instant('Tables.ExportList'), this._translateService.instant('Tables.ExportLimitExceeded', { dataLength: this._lastQueryTotalItems, exportLimit: exportLimit }), DIALOG_BUTTONS.Ok);
1350
+ return [2 /*return*/];
1351
+ }
1352
+ totalDisplayedItems = Array.from(this.dataTable.context[0].aiDisplay).length;
1353
+ if (!(totalDisplayedItems === this._lastQueryTotalItems)) return [3 /*break*/, 1];
1354
+ _a = this.getExportableData(), body = _a.body, header = _a.header;
1355
+ // and export them to excel
1356
+ this._exportSpreadsheet.export(body, this._translateService.instant(this.config.title || 'Tables.ExportResults') + ".xlsx", {
1357
+ header: header,
1358
+ skipHeader: false
1359
+ });
1360
+ return [3 /*break*/, 3];
1361
+ case 1:
1362
+ previousDataState = this.dataTable.rows().data().toArray();
1363
+ return [4 /*yield*/, this.lastQuery.take(exportLimit).getItems()];
1364
+ case 2:
1365
+ targetDataState = _c.sent();
1366
+ // change table data on the fly, but do not redraw
1367
+ this.dataTable.clear().rows.add(targetDataState);
1368
+ _b = this.getExportableData(), body = _b.body, header = _b.header;
1369
+ // reset table data
1370
+ this.dataTable.clear().rows.add(previousDataState);
1371
+ // and export target data to excel
1372
+ this._exportSpreadsheet.export(body, this._translateService.instant(this.config.title || 'Tables.ExportResults') + ".xlsx", {
1373
+ header: header,
1374
+ skipHeader: false
1375
+ });
1376
+ _c.label = 3;
1377
+ case 3:
1378
+ // exit
1379
+ return [2 /*return*/];
1380
+ case 4:
1381
+ err_1 = _c.sent();
1382
+ // log error
1383
+ console.error(err_1);
1384
+ // call error handler, if defined
1385
+ if (options && options.errorHandler) {
1386
+ options.errorHandler(err_1);
1387
+ }
1388
+ else {
1389
+ // use default error service
1390
+ this._errorService.showError(err_1, {
1391
+ continueLink: '.'
1392
+ });
1393
+ }
1394
+ return [3 /*break*/, 6];
1395
+ case 5:
1396
+ this._loading.hideLoading();
1397
+ return [7 /*endfinally*/];
1398
+ case 6: return [2 /*return*/];
1399
+ }
1400
+ });
1401
+ });
1402
+ };
1403
+ AdvancedTableComponent.prototype.getExportableData = function () {
1404
+ var _this = this;
1405
+ if (!(this.dataTable && this.dataTable.buttons
1406
+ && typeof this.dataTable.buttons.exportData === 'function' && this.config)) {
1407
+ return { body: [], header: [] };
1408
+ }
1409
+ // fetch exportable excel data
1410
+ var _a = this.dataTable.buttons.exportData(), body = _a.body, header = _a.header;
1411
+ var cleanupIndexes = [];
1412
+ // clean up headers
1413
+ header = header.filter(function (headerItem, index) {
1414
+ // exclude empty headers
1415
+ if (headerItem.trim().length === 0) {
1416
+ cleanupIndexes.push(index);
1417
+ return false;
1418
+ }
1419
+ // find item by title
1420
+ var findItem = _this.config.columns.find(function (column) {
1421
+ return column.title && column.title.length && _this._translateService.instant(column.title) === headerItem;
1422
+ });
1423
+ // exclude hidden columns
1424
+ if (findItem && findItem.hidden === true) {
1425
+ cleanupIndexes.push(index);
1426
+ return false;
1427
+ }
1428
+ return true;
1429
+ });
1430
+ // clean up body
1431
+ body = body.map(function (row) {
1432
+ return row.filter(function (_, rowIndex) {
1433
+ return cleanupIndexes.indexOf(rowIndex) === -1;
1434
+ });
1435
+ });
1436
+ return { body: body, header: header };
1437
+ };
1252
1438
  AdvancedTableComponent.decorators = [
1253
1439
  { type: Component, args: [{
1254
1440
  // tslint:disable-next-line: component-selector
1255
1441
  selector: 'app-advanced-table',
1256
- template: "\n <table #table class=\"dataTable\">\n </table>\n <div #emptyTable class=\"d-none\">\n <div>\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-gray-300 border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-dark\" [translate]=\"'Tables.EmptyTableTitle'\"></h4>\n <p class=\"font-lg text-dark\" [translate]=\"'Tables.EmptyTableMessage'\"></p>\n </div>\n </div>\n </div>\n ",
1442
+ template: "\n <table #table class=\"dataTable\">\n </table>\n <div #emptyTable class=\"d-none\">\n <div>\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-gray-300 border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-dark\" [translate]=\"'Tables.EmptyTableTitle'\"></h4>\n <p class=\"font-lg text-dark\" [translate]=\"'Tables.EmptyTableMessage'\"></p>\n </div>\n </div>\n </div>\n <div #errorTemplate class=\"d-none error-message\">\n <div class=\"text-center\">\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-danger border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-secondary\" [translate]=\"'Tables.DataError.Title'\"></h4>\n <p class=\"font-lg text-secondary mb-1\" [translate]=\"'Tables.DataError.Message'\"></p>\n <p class=\"font-lg text-secondary error-inner-message\">\n <small></small>\n </p>\n </div>\n </div>\n </div>\n ",
1257
1443
  encapsulation: ViewEncapsulation.None,
1258
- styles: ["table.dataTable thead .sorting{background-image:none}table.dataTable thead .sorting_asc{background-position:95% 60%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAAsSAAALEgHS3X78AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAEtJREFUKJFjYBgywAOKMQALFjE/BgaGTCibjYGBYRM+kz0ZGBh2MTAw8DAwMHAxMDBsY2BgCCBGMQzg1IRNMV5NuVAJXIALqmYwAgBBkAlPRCLcLwAAAABJRU5ErkJggg==)}table.dataTable thead .sorting_desc{background-position:95% 60%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAArzAAAK8wHvFRX1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAFNJREFUKJHVzTEKgDAQRNGHZfBg2sSTeDMLKwXPYuVJbBKQQEyrH6bZ+cPyWWaElz4kR5cOJ1b0FXnBVRYjjmIUsGGqvX6OmnImYk+JLTkzpPyBGwrtCvfBe56nAAAAAElFTkSuQmCC)}table.dataTable thead th{color:#73818e;font-size:.75rem;font-weight:600;padding-top:16px;padding-bottom:4px;border-bottom:none;padding-left:8px}table.dataTable tbody tr:first-child td:first-child{border-radius:6px 0}table.dataTable tbody tr:first-child td:last-child{border-radius:0 6px}table.dataTable tbody tr{border-radius:6px}table.dataTable tbody tr td:first-child{border-left:1px solid #c2cfd6}table.dataTable tbody tr td:last-child{border-right:1px solid #c2cfd6}table.dataTable tbody tr td{padding-top:8px;padding-bottom:8px;border-top:1px solid #c2cfd6}table.dataTable tbody tr:last-child td:first-child{border-radius:0 0 0 6px}table.dataTable tbody tr:last-child td:last-child{border-radius:0 0 6px}table.dataTable tbody tr:last-child td{border-bottom:1px solid #c2cfd6}table.dataTable td.dataTables_empty{border:none!important}table.dataTable.no-footer{border-bottom:none}.dataTables_paginate .btn.previous{margin-right:8px}.dataTables_paginate .btn.next{margin-left:8px}.dataTables_info,.dataTables_paginate{margin-top:1rem}.dataTables_paginate span .btn{border-radius:1.5rem}.dataTables_filter{display:none}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:0;overflow:auto}.dataTables_paginate{display:none}.dataTable.processing{opacity:15%}.dataTables_wrapper .dataTables_processing{background:0 0;position:absolute;display:inline-block;top:25%;z-index:5;color:#73818e}.text-decoration-line-through{text-decoration:line-through!important}tr.removed .checkbox+label{visibility:hidden}"]
1444
+ styles: ["table.dataTable thead .sorting{background-image:none}table.dataTable thead .sorting_asc{background-position:95% 60%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAAsSAAALEgHS3X78AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAEtJREFUKJFjYBgywAOKMQALFjE/BgaGTCibjYGBYRM+kz0ZGBh2MTAw8DAwMHAxMDBsY2BgCCBGMQzg1IRNMV5NuVAJXIALqmYwAgBBkAlPRCLcLwAAAABJRU5ErkJggg==)}table.dataTable thead .sorting_desc{background-position:95% 60%;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAArzAAAK8wHvFRX1AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAFNJREFUKJHVzTEKgDAQRNGHZfBg2sSTeDMLKwXPYuVJbBKQQEyrH6bZ+cPyWWaElz4kR5cOJ1b0FXnBVRYjjmIUsGGqvX6OmnImYk+JLTkzpPyBGwrtCvfBe56nAAAAAElFTkSuQmCC)}table.dataTable thead th{color:#73818e;font-size:.75rem;font-weight:600;padding-top:16px;padding-bottom:4px;border-bottom:none;padding-left:8px}table.dataTable tbody tr:first-child td:first-child{border-radius:6px 0}table.dataTable tbody tr:first-child td:last-child{border-radius:0 6px}table.dataTable tbody tr{border-radius:6px}table.dataTable tbody tr td:first-child{border-left:1px solid #c2cfd6}table.dataTable tbody tr td:last-child{border-right:1px solid #c2cfd6}table.dataTable tbody tr td{padding-top:8px;padding-bottom:8px;border-top:1px solid #c2cfd6}table.dataTable tbody tr:last-child td:first-child{border-radius:0 0 0 6px}table.dataTable tbody tr:last-child td:last-child{border-radius:0 0 6px}table.dataTable tbody tr:last-child td{border-bottom:1px solid #c2cfd6}table.dataTable td.dataTables_empty{border:none!important}table.dataTable .error-inner-message>small{overflow-wrap:break-word}table.dataTable.no-footer{border-bottom:none}.dataTables_paginate .btn.previous{margin-right:8px}.dataTables_paginate .btn.next{margin-left:8px}.dataTables_info,.dataTables_paginate{margin-top:1rem}.dataTables_paginate span .btn{border-radius:1.5rem}.dataTables_filter{display:none}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:0;overflow:auto}.dataTables_paginate{display:none}.dataTable.processing{opacity:15%}.dataTables_wrapper .dataTables_processing{background:0 0;position:absolute;display:inline-block;top:25%;z-index:5;color:#73818e}.text-decoration-line-through{text-decoration:line-through!important}tr.removed .checkbox+label{visibility:hidden}"]
1259
1445
  }] }
1260
1446
  ];
1261
1447
  /** @nocollapse */
@@ -1270,11 +1456,16 @@ var AdvancedTableComponent = /** @class */ (function () {
1270
1456
  { type: TemplatePipe },
1271
1457
  { type: LoadingService },
1272
1458
  { type: HttpClient },
1273
- { type: ColumnSelectorService }
1459
+ { type: ColumnSelectorService },
1460
+ { type: ConfigurationService },
1461
+ { type: ExportSpreadsheetService },
1462
+ { type: ModalService },
1463
+ { type: ErrorService }
1274
1464
  ]; };
1275
1465
  AdvancedTableComponent.propDecorators = {
1276
1466
  table: [{ type: ViewChild, args: ['table',] }],
1277
1467
  emptyTable: [{ type: ViewChild, args: ['emptyTable',] }],
1468
+ errorTemplate: [{ type: ViewChild, args: ['errorTemplate',] }],
1278
1469
  loadingTable: [{ type: ViewChild, args: ['loadingTable',] }],
1279
1470
  height: [{ type: Input }],
1280
1471
  showActions: [{ type: Input }],
@@ -1314,5 +1505,6 @@ var AdvancedTableComponent = /** @class */ (function () {
1314
1505
  return AdvancedTableComponent;
1315
1506
  }());
1316
1507
  export { AdvancedTableComponent };
1508
+ export { ɵ0 };
1317
1509
 
1318
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVuaXZlcnNpcy9uZ3gtdGFibGVzLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQUUsWUFBWSxFQUN4QixNQUFNLEVBQ04sY0FBYyxFQUNkLFFBQVEsRUFDUixLQUFLLEVBQ0csTUFBTSxFQUNkLFNBQVMsRUFDVCxpQkFBaUIsRUFHbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUcvQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQWUsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBQyxZQUFZLEVBQUUsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFL0Qsb0ZBQW9GO0FBQ3BGLE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUNoQyxPQUFPLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNC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QUMsWUFBWTs2QkE4Qm5CLEtBQUssU0FBQyxZQUFZO3dCQXlCbEIsS0FBSyxTQUFDLE9BQU87O0lBNGdDaEIsNkJBQUM7Q0FBQSxBQWxzQ0QsSUFrc0NDO1NBN3FDWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgQ29tcG9uZW50LFxuICBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsXG4gIEluamVjdCxcbiAgSW5qZWN0aW9uVG9rZW4sXG4gIEluamVjdG9yLFxuICBJbnB1dCwgT25EZXN0cm95LFxuICBPbkluaXQsIE91dHB1dCxcbiAgVmlld0NoaWxkLFxuICBWaWV3RW5jYXBzdWxhdGlvbixcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtBbmd1bGFyRGF0YUNvbnRleHR9IGZyb20gJ0B0aGVtb3N0L2FuZ3VsYXInO1xuaW1wb3J0IHtUcmFuc2xhdGVQaXBlLCBUcmFuc2xhdGVTZXJ2aWNlfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7QWN0aXZhdGVkUm91dGV9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQge1RhYmxlQ29sdW1uQ29uZmlndXJhdGlvbiwgVGFibGVDb25maWd1cmF0aW9ufSBmcm9tICcuL2FkdmFuY2VkLXRhYmxlLmludGVyZmFjZXMnO1xuaW1wb3J0IHtEYXRhU2VydmljZVF1ZXJ5UGFyYW1zfSBmcm9tICdAdGhlbW9zdC9jbGllbnQnO1xuaW1wb3J0IHtBZHZhbmNlZENvbHVtbkZvcm1hdHRlcn0gZnJvbSAnLi9hZHZhbmNlZC10YWJsZS5mb3JtYXR0ZXJzJztcbmltcG9ydCB7Q2xpZW50RGF0YVF1ZXJ5YWJsZX0gZnJvbSAnQHRoZW1vc3QvY2xpZW50JztcbmltcG9ydCB7QWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyfSBmcm9tICcuL2FkdmFuY2VkLWZpbHRlci12YWx1ZS1wcm92aWRlci5zZXJ2aWNlJztcbmltcG9ydCB7U3Vic2NyaXB0aW9uLCBCZWhhdmlvclN1YmplY3R9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtUZW1wbGF0ZVBpcGUsIExvYWRpbmdTZXJ2aWNlfSBmcm9tICdAdW5pdmVyc2lzL2NvbW1vbic7XG5pbXBvcnQge0lBZHZhbmNlZFRhYmxlRm9ybWF0dGVyc30gZnJvbSAnLi9hZHZhbmNlZC10YWJsZS5mb3JtYXR0ZXJzLmludGVyZmFjZSc7XG4vLyBpbXBvcnRhbnQgbm90ZTogdXNlIHRoaXMgaW1wb3J0IHRvIGF2b2lkIENhbm5vdCBjYWxsIGEgbmFtZXNwYWNlICgnanF1ZXJ5JykgZXJyb3JcbmltcG9ydCAqIGFzIGpRdWVyeV8gZnJvbSAnanF1ZXJ5JztcbmltcG9ydCAnZGF0YXRhYmxlcy5uZXQnO1xuaW1wb3J0IHt0ZW1wbGF0ZX0gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAnZGF0YXRhYmxlcy5uZXQtc2Nyb2xsZXInO1xuaW1wb3J0ICdkYXRhdGFibGVzLm5ldC1jb2xyZW9yZGVyJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDb2x1bW5TZWxlY3RvclNlcnZpY2UgfSBmcm9tICcuLi9jb2x1bW4tc2VsZWN0b3IvY29sdW1uLXNlbGVjdG9yLnNlcnZpY2UnO1xuLy8gcmVzdG9yZSBqcXVlcnkgaW1wb3J0IHRvIGF2b2lkIENhbm5vdCBjYWxsIGEgbmFtZXNwYWNlICgnanF1ZXJ5JykgZXJyb3JcbmNvbnN0IGpRdWVyeSA9IGpRdWVyeV87XG5leHBvcnQgaW50ZXJmYWNlIEFkdmFuY2VkVGFibGVEYXRhUmVzdWx0IHtcbiAgcmVjb3Jkc1RvdGFsOiBudW1iZXI7XG4gIHJlY29yZHNGaWx0ZXJlZDogbnVtYmVyO1xuICBkYXRhOiBBcnJheTxhbnk+O1xufVxuXG5jb25zdCBEYXRhVGFibGVzQXBpOiBhbnkgPSBqUXVlcnkuZm4uZGF0YVRhYmxlLkFwaTtcbkRhdGFUYWJsZXNBcGkucmVnaXN0ZXIoICdwcm9jZXNzaW5nKCknLCBmdW5jdGlvbiggc2hvdzogYW55ICkge1xuICAgIHJldHVybiB0aGlzLml0ZXJhdG9yKCd0YWJsZScsICggY3R4OiBhbnkgKSA9PiB7XG4gICAgICAgIGN0eC5vQXBpLl9mblByb2Nlc3NpbmdEaXNwbGF5KCBjdHgsIHNob3cgKTtcbiAgICB9ICk7XG59KTtcblxuY2xhc3MgVGFibGVUcmFuc2xhdGlvbkNoYW5nZURldGVjdG9yIGV4dGVuZHMgQ2hhbmdlRGV0ZWN0b3JSZWYge1xuICBwdWJsaWMgY2hlY2tOb0NoYW5nZXMoKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgZGV0YWNoKCk6IHZvaWQge1xuICB9XG5cbiAgcHVibGljIGRldGVjdENoYW5nZXMoKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgbWFya0ZvckNoZWNrKCk6IHZvaWQge1xuICB9XG5cbiAgcHVibGljIHJlYXR0YWNoKCk6IHZvaWQge1xuICB9XG5cbn1cblxuZXhwb3J0IGxldCBDT0xVTU5fRk9STUFUVEVSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignY29sdW1uLmZvcm1hdHRlcnMnKTtcblxuY2xhc3MgQ29sdW1uRm9ybWF0dGVyIGV4dGVuZHMgQWR2YW5jZWRDb2x1bW5Gb3JtYXR0ZXIge1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGFzczogc3RyaW5nO1xuICBwdWJsaWMgY2xhc3NOYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBkZWZhdWx0Q29udGVudDogc3RyaW5nO1xuICBwdWJsaWMgZm9ybWF0U3RyaW5nOiBzdHJpbmc7XG4gIHB1YmxpYyBmb3JtYXR0ZXI6IHN0cmluZztcbiAgcHVibGljIGhpZGRlbjogYm9vbGVhbjtcbiAgcHVibGljIG5hbWU6IHN0cmluZztcbiAgcHVibGljIG9yZGVyOiBzdHJpbmc7XG4gIHB1YmxpYyBwcm9wZXJ0eTogc3RyaW5nO1xuICBwdWJsaWMgc29ydGFibGU6IGJvb2xlYW47XG4gIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuXG4gIHB1YmxpYyByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBhbnksIHJvdzogYW55LCBtZXRhOiBhbnkpIHtcbiAgICAvL1xuICB9XG59XG5cbmZ1bmN0aW9uIGZvcmNlQ2FzdDxUPihpbnB1dDogYW55KTogVCB7XG4gIHJldHVybiBpbnB1dDtcbn1cblxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkVGFibGVDb25maWd1cmF0aW9uIHtcbiAgcHVibGljIHN0YXRpYyBjYXN0KGlucHV0OiBhbnksIGNsb25lPzogYm9vbGVhbik6IFRhYmxlQ29uZmlndXJhdGlvbiB7XG4gICAgaWYgKGNsb25lKSB7XG4gICAgICByZXR1cm4gZm9yY2VDYXN0PFRhYmxlQ29uZmlndXJhdGlvbj4oSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShpbnB1dCkpKTtcbiAgICB9XG4gICAgcmV0dXJuIGZvcmNlQ2FzdDxUYWJsZUNvbmZpZ3VyYXRpb24+KGlucHV0KTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSYW5kb21JZGVudGlmaWVyKCkge1xuICByZXR1cm4gKFxuICAgIE51bWJlcihTdHJpbmcoTWF0aC5yYW5kb20oKSkuc2xpY2UoMikpXG4gICkudG9TdHJpbmcoMzYpO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdhcHAtYWR2YW5jZWQtdGFibGUnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDx0YWJsZSAjdGFibGUgY2xhc3M9XCJkYXRhVGFibGVcIj5cbiAgICA8L3RhYmxlPlxuICAgIDxkaXYgI2VtcHR5VGFibGUgY2xhc3M9XCJkLW5vbmVcIj5cbiAgICAgIDxkaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY2lyY2xlIGJnLWdyYXktMzAwIGJvcmRlci1ncmF5LTEwMFwiPjwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICA8aDQgY2xhc3M9XCJmb250LTN4bCB0ZXh0LWRhcmtcIiBbdHJhbnNsYXRlXT1cIidUYWJsZXMuRW1wdHlUYWJsZVRpdGxlJ1wiPjwvaDQ+XG4gICAgICAgICAgPHAgY2xhc3M9XCJmb250LWxnIHRleHQtZGFya1wiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5FbXB0eVRhYmxlTWVzc2FnZSdcIj48L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0eWxlVXJsczogWycuL2FkdmFuY2VkLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICBwcml2YXRlIF9xdWVyeTogQ2xpZW50RGF0YVF1ZXJ5YWJsZTtcbiAgcHJpdmF0ZSBfY29uZmlnOiBUYWJsZUNvbmZpZ3VyYXRpb247XG4gIHByaXZhdGUgX2ZpcnN0TG9hZCA9IHRydWU7XG4gIHByaXZhdGUgX3Nob3dGb290ZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2hvd0hlYWRlciA9IHRydWU7XG4gIHByaXZhdGUgX3Nob3dQYWdpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaWQgPSBnZXRSYW5kb21JZGVudGlmaWVyKCk7XG4gIHB1YmxpYyBzbWFydFNlbGVjdCA9IGZhbHNlO1xuICBwdWJsaWMgY29uZmlnQ2hhbmdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcblxuICBAVmlld0NoaWxkKCd0YWJsZScpIHB1YmxpYyB0YWJsZTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZW1wdHlUYWJsZScpIHB1YmxpYyBlbXB0eVRhYmxlOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdsb2FkaW5nVGFibGUnKSBwdWJsaWMgbG9hZGluZ1RhYmxlOiBFbGVtZW50UmVmO1xuICBASW5wdXQoKSBwdWJsaWMgaGVpZ2h0ID0gODAwO1xuICBASW5wdXQoKSBwdWJsaWMgc2hvd0FjdGlvbnMgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgYXV0b0xvYWQgPSB0cnVlO1xuICBAT3V0cHV0KCdsb2FkJykgcHVibGljIGxvYWQ6IEV2ZW50RW1pdHRlcjxBZHZhbmNlZFRhYmxlRGF0YVJlc3VsdD4gPSBuZXcgRXZlbnRFbWl0dGVyPEFkdmFuY2VkVGFibGVEYXRhUmVzdWx0PigpO1xuICBAT3V0cHV0KCdpbml0JykgcHVibGljIGluaXQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBJbnB1dCgncmVsb2FkJykgcHVibGljIHJlbG9hZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnc2VsZWN0JykgcHVibGljIHNlbGVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnZHJhdycpIHB1YmxpYyBkcmF3OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdwYWdlJykgcHVibGljIHBhZ2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ29yZGVyJykgcHVibGljIG9yZGVyOiBFdmVudEVtaXR0ZXI8YW55W11bXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdW10+KCk7XG4gIEBPdXRwdXQoJ3Njcm9sbCcpIHB1YmxpYyBzY3JvbGw6IEV2ZW50RW1pdHRlcjx7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlciB9PigpO1xuICBAT3V0cHV0KCdzZWxlY3RlZEl0ZW1zJykgcHVibGljIHNlbGVjdGVkSXRlbXM6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ2xvYWRpbmcnKSBwdWJsaWMgbG9hZGluZzogRXZlbnRFbWl0dGVyPHtcbiAgICB0YXJnZXQ6IEFkdmFuY2VkVGFibGVDb21wb25lbnRcbiAgfT4gPSBuZXcgRXZlbnRFbWl0dGVyPHtcbiAgICB0YXJnZXQ6IEFkdmFuY2VkVGFibGVDb21wb25lbnRcbiAgfT4oKTtcblxuICBASW5wdXQoKSBwdWJsaWMgc2Nyb2xsYWJsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXJ2ZXJTaWRlID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGxlbmd0aE1lbnUgPSBbNTAsIDEwMCwgMjAwLCA1MDBdO1xuICBASW5wdXQoKSBwdWJsaWMgcGFnaW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIHBhZ2VMZW5ndGggPSAyNTtcbiAgQElucHV0KCkgcHVibGljIGNvbHVtbk9yZGVyaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBzdGF0ZVNhdmUgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHN0YXRlTG9hZENhbGxiYWNrOiAoc2V0dGluZ3M6IGFueSwgY2FsbGJhY2s6IChzdGF0ZTogYW55KSA9PiB2b2lkKSA9PiB2b2lkO1xuICBASW5wdXQoKSBwdWJsaWMgc3RhdGVTYXZlQ2FsbGJhY2s6IChzZXR0aW5nczogYW55LCBzdGF0ZTogYW55KSA9PiB2b2lkO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBzY3JvbGxZID0gODAwO1xuICBASW5wdXQoKSBwdWJsaWMgc2Nyb2xsWCA9IHRydWU7XG4gIC8qKlxuICAgKiBFbmFibGVzIHJvdyBzZWxlY3Rpb24uIFRoZSBkZWZhdWxyIHZhbHVlIGlzIGZhbHNlXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAvKipcbiAgICogRW5hYmxlcyBvciBkaXNhYmxlIG11bHRpcGxlIHNlbGVjdGlvbi4gVGhlIGRlZmF1bHQgdmFsdWVzIGlzIHRydWUuXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgbXVsdGlwbGVTZWxlY3QgPSB0cnVlO1xuICAvKipcbiAgICogRW5hYmxlcyBjdXN0b20gc2VsZWN0aW9uIGFuZCBoaWRlcyBzZWxlY3QgY29sdW1uLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjdXN0b21TZWxlY3QgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHNlbGVjdGVkID0gW107XG4gIHB1YmxpYyB1bnNlbGVjdGVkID0gW107XG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYSBVUkwgdG8gbG9hZCB0YWJsZSBjb25maWd1cmF0aW9uIGZyb21cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBjb25maWdTcmM6IHN0cmluZztcblxuICAvKipcbiAgICogR2V0cyBvciBzZXRzIHRhYmxlIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIEBJbnB1dCgnY29uZmlnJylcbiAgcHVibGljIHNldCBjb25maWcodmFsdWU6IFRhYmxlQ29uZmlndXJhdGlvbikge1xuICAgIHRoaXMuX2NvbmZpZyA9IHZhbHVlO1xuICAgIC8vIHJhaXNlIHN1YnNjcmlwdGlvblxuICAgIHRoaXMuY29uZmlnQ2hhbmdlcy5uZXh0KHRoaXMuX2NvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYmxlIGZvb3RlciB3aWxsIGJlIHZpc2libGUgb3Igbm90XG4gICAqL1xuICBASW5wdXQoJ3Nob3dGb290ZXInKVxuICBwdWJsaWMgc2V0IHNob3dGb290ZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93Rm9vdGVyID0gdmFsdWU7XG4gICAgLy8gc2hvdyBvciBoaWRlIGZvb3RlclxuICAgIGlmICh0aGlzLl9lbGVtZW50ICYmIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZXNfaW5mbycpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzaG93Rm9vdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93Rm9vdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYmxlIGZvb3RlciB3aWxsIGJlIHZpc2libGUgb3Igbm90XG4gICAqL1xuICAgQElucHV0KCdzaG93SGVhZGVyJylcbiAgIHB1YmxpYyBzZXQgc2hvd0hlYWRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgICB0aGlzLl9zaG93SGVhZGVyID0gdmFsdWU7XG4gICAgIC8vIHNob3cgb3IgaGlkZSBmb290ZXJcbiAgICAgaWYgKHRoaXMuX2VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgY29uc3QgZWxlbWVudCA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGU+dGhlYWQnKTtcbiAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICAgfVxuICAgICAgIGNvbnN0IGRhdGFUYWJsZSA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KS5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlJyk7XG4gICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xuICAgICAgICAgLy8gYWRkIHRvcCBtYXJnaW5cbiAgICAgICAgIGRhdGFUYWJsZS5jbGFzc0xpc3QucmVtb3ZlKCdtdC0yJyk7XG4gICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgICAvLyByZW1vdmUgdG9wIG1hcmdpblxuICAgICAgICAgZGF0YVRhYmxlLmNsYXNzTGlzdC5hZGQoJ210LTInKTtcbiAgICAgICB9XG4gICAgIH1cbiAgIH1cblxuICAgcHVibGljIGdldCBzaG93SGVhZGVyKCkge1xuICAgICByZXR1cm4gdGhpcy5fc2hvd0hlYWRlcjtcbiAgIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgcGFnaW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgdmlzaWJsZSBvciBub3RcbiAgICovXG4gIEBJbnB1dCgnc2hvd1BhZ2luZycpXG4gIHB1YmxpYyBzZXQgc2hvd1BhZ2luZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dQYWdpbmcgPSB2YWx1ZTtcbiAgICAvLyBzaG93IG9yIGhpZGUgZm9vdGVyXG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gKCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlc19wYWdpbmF0ZScpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgalF1ZXJ5KGVsZW1lbnQpLnNob3coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpRdWVyeShlbGVtZW50KS5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzaG93UGFnaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93UGFnaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhbiBhY3RpdmUgcXVlcnkgZm9yIHRoaXMgdGFibGVcbiAgICovXG4gIEBJbnB1dCgncXVlcnknKVxuICBwdWJsaWMgc2V0IHF1ZXJ5KHZhbHVlOiBDbGllbnREYXRhUXVlcnlhYmxlKSB7XG4gICAgdGhpcy5fcXVlcnkgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5O1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IHRyYW5zbGF0b3I6IFRyYW5zbGF0ZVBpcGU7XG4gIHB1YmxpYyBkYXRhVGFibGU6IGFueTtcbiAgcHVibGljIGR0T3B0aW9uczogYW55O1xuICBwcml2YXRlIGxhc3RRdWVyeVBhcmFtczogRGF0YVNlcnZpY2VRdWVyeVBhcmFtcztcbiAgcHJpdmF0ZSByZWxvYWRTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb250ZXh0OiBBbmd1bGFyRGF0YUNvbnRleHQsXG4gICAgICAgICAgICAgIEBJbmplY3QoQ09MVU1OX0ZPUk1BVFRFUlMpIHByaXZhdGUgX2NvbHVtbkZvcm1hdHRlcnM6IElBZHZhbmNlZFRhYmxlRm9ybWF0dGVycyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfYWN0aXZhdGVkUm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgICAgICAgICAgICBwcml2YXRlIF90cmFuc2xhdGVTZXJ2aWNlOiBUcmFuc2xhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9pbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2FkdmFuY2VkRmlsdGVyVmFsdWVQcm92aWRlcjogQWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9lbGVtZW50OiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICBwcml2YXRlIF90ZW1wbGF0ZTogVGVtcGxhdGVQaXBlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9sb2FkaW5nOiBMb2FkaW5nU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfaHR0cDogSHR0cENsaWVudCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY29sdW1uU2VsZWN0b3I6IENvbHVtblNlbGVjdG9yU2VydmljZSkge1xuICAgIC8vIGluaXRpYWxpemUgdHJhbnNsYXRlIHBpcGVcbiAgICB0aGlzLnRyYW5zbGF0b3IgPSBuZXcgVHJhbnNsYXRlUGlwZSh0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLCBuZXcgVGFibGVUcmFuc2xhdGlvbkNoYW5nZURldGVjdG9yKCkpO1xuICAgIGpRdWVyeS5mbi5kYXRhVGFibGUuZXh0LmNsYXNzZXMuc1BhZ2VCdXR0b24gPSAnYnRuJztcbiAgICBqUXVlcnkuZm4uZGF0YVRhYmxlLmV4dC5jbGFzc2VzLnNQYWdlQnV0dG9uQWN0aXZlID0gJ2J0biBidG4tbGlnaHQnO1xuICAgIHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5yZWxvYWQuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmZldGNoKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBzaW1wbGUgc2VhcmNoXG4gIHB1YmxpYyBzZWFyY2goc2VhcmNoVGV4dCkge1xuICAgIHRoaXMucXVlcnkgPSB0aGlzLnF1ZXJ5IHx8IHRoaXMuX2NvbnRleHQubW9kZWwodGhpcy5jb25maWcubW9kZWwpLmFzUXVlcnlhYmxlKCk7XG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZSkge1xuICAgICAgaWYgKHNlYXJjaFRleHQgJiYgdGhpcy5jb25maWcuc2VhcmNoRXhwcmVzc2lvbikge1xuICAgICAgICAvLyB2YWxpZGF0ZSBzZWFyY2ggdGV4dCBpbiBkb3VibGUgcXVvdGVzXG4gICAgICAgIGlmICgvXlwiKC4qPylcIiQvLnRlc3Qoc2VhcmNoVGV4dCkpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5LnNldFBhcmFtKCckZmlsdGVyJyxcbiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlLnRyYW5zZm9ybSh0aGlzLmNvbmZpZy5zZWFyY2hFeHByZXNzaW9uLCB7XG4gICAgICAgICAgICAgIHRleHQ6IHNlYXJjaFRleHQucmVwbGFjZSgvXlwifFwiJC9nLCAnJyksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdHJ5IHRvIHNwbGl0IHdvcmRzXG4gICAgICAgICAgY29uc3Qgd29yZHMgPSBzZWFyY2hUZXh0LnNwbGl0KCcgJyk7XG4gICAgICAgICAgLy8gam9pbiB3b3JkcyB0byBhIHNpbmdsZSBmaWx0ZXJcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB3b3Jkcy5tYXAoKHdvcmQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZS50cmFuc2Zvcm0odGhpcy5jb25maWcuc2VhcmNoRXhwcmVzc2lvbiwge1xuICAgICAgICAgICAgICB0ZXh0OiB3b3JkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkuam9pbignIGFuZCAnKTtcbiAgICAgICAgICAvLyBzZXQgZmlsdGVyXG4gICAgICAgICAgdGhpcy5xdWVyeS5zZXRQYXJhbSgnJGZpbHRlcicsIGZpbHRlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNsZWFyIGZpbHRlclxuICAgICAgICB0aGlzLnF1ZXJ5LnNldFBhcmFtKCckZmlsdGVyJywgbnVsbCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9maXJzdExvYWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmRyYXcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZW5zdXJlIGVtcHR5IHRhYmxlIGxheW91dFxuICAgICAgdGhpcy5yZXNldEVtcHR5VGFibGUoKTtcbiAgICAgIC8vIHNlYXJjaCBsb2NhbGx5XG4gICAgICB0aGlzLmRhdGFUYWJsZS5zZWFyY2goc2VhcmNoVGV4dC50cmltKCkpLmRyYXcoKTtcbiAgICAgIC8vIGdldCBpbmRleGVzIG9mIGZpbHRlcmVkIHJvd3NcbiAgICAgIGNvbnN0IGluZGV4ZXMgPSBBcnJheS5mcm9tKHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0uYWlEaXNwbGF5KTtcbiAgICAgIC8vIHNldCByZWNvcmRzRmlsdGVyZWRcbiAgICAgIGNvbnN0IHJlY29yZHNGaWx0ZXJlZCA9IGluZGV4ZXMubGVuZ3RoO1xuICAgICAgLy8gc2V0IHJlY29yZHNUb3RhbFxuICAgICAgY29uc3QgcmVjb3Jkc1RvdGFsID0gaW5kZXhlcy5sZW5ndGg7XG4gICAgICAvLyByZXRyaWV2ZSBkYXRhIGZyb20gaW5kZXhlc1xuICAgICAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20odGhpcy5kYXRhVGFibGUucm93cygpLmRhdGEoKSk7XG4gICAgICBjb25zdCBkYXRhID0gaW5kZXhlcy5tYXAoaW5kZXggPT4gcm93c1s8bnVtYmVyPmluZGV4XSk7XG4gICAgICAvLyBlbWl0IHJlc3VsdHMgdG8gbG9hZCBvdXRwdXRcbiAgICAgIHRoaXMubG9hZC5lbWl0KHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiByZWNvcmRzRmlsdGVyZWQsXG4gICAgICAgIHJlY29yZHNUb3RhbDogcmVjb3Jkc1RvdGFsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmV0Y2goY2xlYXJTZWxlY3RlZD86IGJvb2xlYW4pIHtcbiAgICAvLyBpZiBkYXRhIHRhYmxlIGlzIG51bGxcbiAgICBpZiAodGhpcy5kYXRhVGFibGUgPT0gbnVsbCkge1xuICAgICAgLy8gaW5pdGlhbGl6ZSBkYXRhIHRhYmxlXG4gICAgICByZXR1cm4gdGhpcy5uZ09uSW5pdCgpO1xuICAgIH1cbiAgICAvLyBjbGVhciBzZWxlY3Rpb24gaWYgcGFyYW1ldGVyIGlzIG5vdCBkZWNsYXJlZCBvciBpdCdzIHRydWVcbiAgICBpZiAoY2xlYXJTZWxlY3RlZCA9PSBudWxsIHx8IGNsZWFyU2VsZWN0ZWQgPT09IHRydWUpIHtcbiAgICAgIC8vIHNldCBzbWFydCBzZWxlY3QgdG8gZmFsc2VcbiAgICAgIHRoaXMuc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgICAgIC8vIGNsZWFyIHNlbGVjdGVkIGl0ZW1zXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgLy8gY2xlYXIgdW5zZWxlY3RlZCBpdGVtc1xuICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3RoZXJ3aXNlIGxvYWQgZGF0YSBvbmx5XG4gICAgdGhpcy5kYXRhVGFibGUuZHJhdygpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9maXJzdExvYWQgPSB0cnVlO1xuICAgICAgalF1ZXJ5KHRoaXMudGFibGUubmF0aXZlRWxlbWVudCkuZW1wdHkoKTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gbnVsbDtcbiAgICAgIC8vIGNsZWFyIHNlbGVjdGVkIGl0ZW1zXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgLy8gY2xlYXIgdW5zZWxlY3RlZCBpdGVtc1xuICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIC8vIHNldCBzbWFydCBzZWxlY3QgdG8gZmFsc2VcbiAgICAgIHRoaXMuc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIGRhdGEgcm93XG4gICAqL1xuICBwdWJsaWMgc2VsZWN0Um93KHJvdzogYW55LCBzaWxlbnQ/OiBib29sZWFuKSB7XG4gICAgaWYgKHJvdykge1xuICAgICAgLy8gZ2V0IHJvd1xuICAgICAgY29uc3Qgcm93Tm9kZSA9IHJvdy5ub2RlKCk7XG4gICAgICAvLyBpZiBtdWx0aXBsZSBzZWxlY3QgaXMgZmFsc2VcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlU2VsZWN0ID09PSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgLy8gZW51bWVyYXRlIHJvd1xuICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5ub2RlcygpLmVhY2goKG5vZGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUgIT09IHJvd05vZGUpIHtcbiAgICAgICAgICAgICAgalF1ZXJ5KG5vZGUpLmZpbmQoJzpjaGVja2JveCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kYXRhVGFibGUucm93cygnLnNlbGVjdGVkJykubm9kZXMoKS5lYWNoKChub2RlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlICE9PSByb3dOb2RlKSB7XG4gICAgICAgICAgICAgIGpRdWVyeShub2RlKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjbGVhciBzZWxlY3RlZFxuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnNlbGVjdGVkLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICAvLyBpZiBjdXN0b20gc2VsZWN0IG1vZGUgaXMgb2ZmXG4gICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGpRdWVyeShyb3dOb2RlKS5maW5kKCc6Y2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UgYWRkIGNsYXNzXG4gICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGdldCByb3cgZGF0YVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLm5hbWU7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIC8vIHNlYXJjaCBzZWxlY3RlZCBpdGVtc1xuICAgICAgbGV0IGZpbmRJbmRleCA9IHRoaXMuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGRhdGFba2V5XTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbmRJbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IHNlbGVjdGVkIHJvd1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZShmaW5kSW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZC5wdXNoKGRhdGEpO1xuICAgICAgLy8gdmFsaWRhdGUgdW5zZWxlY3RlZCBkYXRhXG4gICAgICBmaW5kSW5kZXggPSB0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGRhdGFba2V5XTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbmRJbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IHNlbGVjdGVkIHJvd1xuICAgICAgICB0aGlzLnVuc2VsZWN0ZWQuc3BsaWNlKGZpbmRJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnNlbGVjdHMgdGhlIHNwZWNpZmllZCBkYXRhIHJvdyBpZiBpdCdzIHNlbGVjdGVkXG4gICAqL1xuICBwdWJsaWMgdW5TZWxlY3RSb3cocm93OiBhbnksIHNpbGVudD86IGJvb2xlYW4pIHtcbiAgICBpZiAocm93KSB7XG4gICAgICAvLyBpZiBjdXN0b20gc2VsZWN0IG1vZGUgaXMgb2ZmXG4gICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5maW5kKCc6Y2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGFkZCBjbGFzc1xuICAgICAgICBqUXVlcnkocm93Lm5vZGUoKSkucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgICAvLyBnZXQgZmlyc3QgY29sdW1uIGtleVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLm5hbWU7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIGNvbnN0IGlkID0gZGF0YVtrZXldO1xuICAgICAgbGV0IGZpbmRJbmRleCA9IHRoaXMuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGlkO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmluZEluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoZmluZEluZGV4LCAxKTtcbiAgICAgICAgaWYgKHRoaXMuc21hcnRTZWxlY3QpIHtcbiAgICAgICAgICAvLyBhZGQgdGhpcyByb3cgdG8gdW5zZWxlY3RlZCByb3dzXG4gICAgICAgICAgZmluZEluZGV4ID0gdGhpcy51bnNlbGVjdGVkLmZpbmRJbmRleCgoeCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHhba2V5XSA9PT0gaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZpbmRJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3RlZC5wdXNoKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RBbnkoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgLy8gc2V0IHNtYXJ0IHNlbGVjdCBmbGFnXG4gICAgICB0aGlzLnNtYXJ0U2VsZWN0ID0gdHJ1ZTtcbiAgICAgIC8vIHNlbGVjdCBhbnkgcm93XG4gICAgICB0aGlzLmRhdGFUYWJsZS5yb3dzKCkuZXZlcnkoKGluZGV4OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhVGFibGUucm93KCBpbmRleCApO1xuICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3csIHRydWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBlbWl0IHNlbGVjdGlvbiBldmVudFxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdE5vbmUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgLy8gc2V0IHNtYXJ0IHNlbGVjdCBmbGFnXG4gICAgICB0aGlzLnNtYXJ0U2VsZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnVuc2VsZWN0ZWQuc3BsaWNlKDAsIHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgLy8gc2VsZWN0IGFueSByb3dcbiAgICAgIHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5ldmVyeSgoaW5kZXg6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3coIGluZGV4ICk7XG4gICAgICAgIHRoaXMudW5TZWxlY3RSb3cocm93LCB0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgLy8gZW1pdCBzZWxlY3Rpb24gZXZlbnRcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RSb3cocm93OiBhbnkpIHtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIC8vIGdldCBmaXJzdCBjb2x1bW4ga2V5XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ubmFtZTtcbiAgICAgIC8vIGdldCBpZFxuICAgICAgY29uc3QgaWQgPSBkYXRhW2tleV07XG4gICAgICAvLyBmaW5kIGlmIHJvdyBpcyBzZWxlY3RlZFxuICAgICAgY29uc3QgZmluZEluZGV4ID0gdGhpcy5zZWxlY3RlZC5maW5kKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGlkO1xuICAgICAgfSk7XG4gICAgICAvLyBpZiByb3cgaXMgc2VsZWN0ZWRcbiAgICAgIGlmIChmaW5kSW5kZXggPj0gMCkge1xuICAgICAgICAvLyB1bnNlbGVjdFxuICAgICAgICB0aGlzLnVuU2VsZWN0Um93KHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3cpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vaW5zcGVjdGlvbiBKU01ldGhvZENhbkJlU3RhdGljXG4gIC8qKlxuICAgKiBEYXRhdGFibGVzIGNvbHVtbiByZW5kZXJlciBmb3Igc2VsZWN0IGNoZWNrYm94XG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHBhcmFtIG1ldGFcbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX3JlbmRlclNlbGVjdChkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmICh0eXBlb2YgY29sdW1uLnNlbGVjdFRlbXBsYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbHVtbiwge1xuICAgICAgICBzZWxlY3RUZW1wbGF0ZTogdGVtcGxhdGUoYDxpbnB1dCBjbGFzcz1cImNoZWNrYm94IGNoZWNrYm94LXRoZW1lIHMtcm93XCIgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgaWQ9XCJzLSR7dGhpcy5faWR9LVxcJHttZXRhLnJvd31cIiBkYXRhLWlkPVwiXFwke2RhdGF9XCIgLz48bGFiZWwgZm9yPVwicy0ke3RoaXMuX2lkfS1cXCR7bWV0YS5yb3d9XCI+Jm5ic3A7PC9sYWJlbD5cbiAgICAgICAgYCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gcmVuZGVyIHRlbXBsYXRlXG4gICAgcmV0dXJuIGNvbHVtbi5zZWxlY3RUZW1wbGF0ZSh7XG4gICAgICBtZXRhLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMubG9hZGluZy5lbWl0KHtcbiAgICAgICAgdGFyZ2V0OiB0aGlzXG4gICAgICB9KTtcbiAgICAgIC8vIHBhcnNlIHByb3BlcnRpZXNcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsICdzZWxlY3RhYmxlJykpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlID0gdGhpcy5jb25maWcuc2VsZWN0YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsICdtdWx0aXBsZVNlbGVjdCcpKSB7XG4gICAgICAgIHRoaXMubXVsdGlwbGVTZWxlY3QgPSB0aGlzLmNvbmZpZy5tdWx0aXBsZVNlbGVjdDtcbiAgICAgIH1cbiAgICAgIC8vIHByZXBhcmUgY29uZmlndXJhdGlvbiBmb3IgY29sdW1uc1xuICAgICAgY29uc3QgdGFibGVDb2x1bW5zID0gdGhpcy5jb25maWcuY29sdW1uc1xuICAgICAgICAvLyBmaWx0ZXIgYWN0aW9uIGxpbmsgY29sdW1uXG4gICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4uZm9ybWF0dGVyICYmIGNvbHVtbi5mb3JtYXR0ZXIgPT09ICdBY3Rpb25MaW5rRm9ybWF0dGVyJyAmJiB0aGlzLnNob3dBY3Rpb25zID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSkubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAvLyBjb252ZXJ0IGNvbHVtbiB0byBhZHZhbmNlIHRhYmxlIGNvbHVtblxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBDb2x1bW5Gb3JtYXR0ZXIodGhpcy5faW5qZWN0b3IpLCBjb2x1bW4pO1xuICAgICAgICB9KS5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICAgICAgICBkYXRhOiBjb2x1bW4ucHJvcGVydHkgfHwgY29sdW1uLm5hbWUsXG4gICAgICAgICAgICBkZWZhdWx0Q29udGVudDogY29sdW1uLmhhc093blByb3BlcnR5KCdkZWZhdWx0Q29udGVudCcpID8gY29sdW1uLmRlZmF1bHRDb250ZW50IDogJycsXG4gICAgICAgICAgICB0aXRsZTogdGhpcy50cmFuc2xhdG9yLnRyYW5zZm9ybShjb2x1bW4udGl0bGUpLFxuICAgICAgICAgICAgc29ydGFibGU6IGNvbHVtbi5oYXNPd25Qcm9wZXJ0eSgnc29ydGFibGUnKSA/IGNvbHVtbi5zb3J0YWJsZSA6IHRydWUsXG4gICAgICAgICAgICB2aXNpYmxlOiBjb2x1bW4uaGFzT3duUHJvcGVydHkoJ2hpZGRlbicpID8gIWNvbHVtbi5oaWRkZW4gOiB0cnVlLFxuICAgICAgICAgICAgbmFtZTogY29sdW1uLm5hbWUsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGlmIChjb2x1bW4uY2xhc3NOYW1lKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjb2x1bW4uY2xhc3NOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6ICcnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXR0ZXJzKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogc3RyaW5nLCByb3c6IGFueSwgbWV0YTogYW55KSB7XG4gICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdHRlcnMuZm9yRWFjaCgoY29sdW1uRm9ybWF0dGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBzZWxmLl9jb2x1bW5Gb3JtYXR0ZXJzW2NvbHVtbkZvcm1hdHRlci5mb3JtYXR0ZXJdO1xuICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0U3RyaW5nID0gY29sdW1uRm9ybWF0dGVyLmZvcm1hdFN0cmluZztcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdE9wdGlvbnMgPSBjb2x1bW5Gb3JtYXR0ZXIuZm9ybWF0T3B0aW9ucztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZvcm1hdHRlci5yZW5kZXIuYmluZChjb2x1bW4pKHJlc3VsdCwgdHlwZSwgcm93LCBtZXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZvcm1hdFN0cmluZztcbiAgICAgICAgICAgICAgICBkZWxldGUgY29sdW1uLmZvcm1hdE9wdGlvbnM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gY2hlY2sgaWYgY29sdW1uIGZvcm1hdHRlcnMgZXhwb3J0IGNyZWF0ZWRDZWxsIGV2ZW50XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IGNvbHVtbi5mb3JtYXR0ZXJzLmZpbHRlcigoY29sdW1uRm9ybWF0dGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBjb2x1bW5Gb3JtYXR0ZXIuYWZ0ZXJSZW5kZXIgPT09ICdmdW5jdGlvbic7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgIGNyZWF0ZWRDZWxsKGNlbGw6IGFueSwgY2VsbERhdGE6IGFueSwgcm93RGF0YTogYW55LCByb3dJbmRleDogbnVtYmVyLCBjb2xJbmRleDogbnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKChjb2x1bW5Gb3JtYXR0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gc2VsZi5fY29sdW1uRm9ybWF0dGVyc1tjb2x1bW5Gb3JtYXR0ZXIuZm9ybWF0dGVyXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLmFmdGVyUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyLmFmdGVyUmVuZGVyLmJpbmQoY29sdW1uKShjZWxsLCBjZWxsRGF0YSwgcm93RGF0YSwgcm93SW5kZXgsIGNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChjb2x1bW4uZm9ybWF0dGVyKSB7XG4gICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBzZWxmLl9jb2x1bW5Gb3JtYXR0ZXJzW2NvbHVtbi5mb3JtYXR0ZXJdO1xuICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLnJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZvcm1hdHRlci5yZW5kZXIuYmluZChjb2x1bW4pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChmb3JtYXR0ZXIgJiYgdHlwZW9mIGZvcm1hdHRlci5hZnRlclJlbmRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICByZW5kZXI6IGZvcm1hdHRlci5yZW5kZXIuYmluZChjb2x1bW4pLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgICAgY3JlYXRlZENlbGw6IGZvcm1hdHRlci5hZnRlclJlbmRlci5iaW5kKGNvbHVtbiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29sdW1uRGVmaW5pdGlvbjtcbiAgICAgICAgfSk7XG4gICAgICAvLyBnZXQgdGFibGUgZWxlbWVudFxuICAgICAgY29uc3QgdGFibGVFbGVtZW50ID0galF1ZXJ5KHRoaXMudGFibGUubmF0aXZlRWxlbWVudCk7XG4gICAgICBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgKCkgPT4ge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbHVtbnMuYWRqdXN0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9LCAxKTtcbiAgICAgIH0pO1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1zaGFkb3dlZC12YXJpYWJsZVxuICAgICAgdGFibGVFbGVtZW50Lm9uKCdwcm9jZXNzaW5nLmR0JywgKGV2ZW50LCBzZXR0aW5ncywgcHJvY2Vzc2luZykgPT4ge1xuICAgICAgICBpZiAocHJvY2Vzc2luZykge1xuICAgICAgICAgIC8vIGNsZWFyIGVtcHR5IHRhYmxlIGVsZW1lbnRcbiAgICAgICAgICB0YWJsZUVsZW1lbnQuZmluZCgnLmRhdGFUYWJsZXNfZW1wdHknKS5odG1sKCcnKTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRhYmxlRWxlbWVudC5hZGRDbGFzcygncHJvY2Vzc2luZycpO1xuICAgICAgICAgIH0sIDApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGFibGVFbGVtZW50LnJlbW92ZUNsYXNzKCdwcm9jZXNzaW5nJyk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgbGV0IGRyYXdJbmRleCA9IDE7XG4gICAgICB0YWJsZUVsZW1lbnQub24oJ29yZGVyLmR0JywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICAgICAgY29uc3Qgb3JkZXIgPSB0aGlzLmRhdGFUYWJsZS5vcmRlcigpO1xuICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSB0YWJsZUNvbHVtbnM7XG4gICAgICAgICAgaWYgKG9yZGVyICYmIG9yZGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5vcmRlci5lbWl0KG9yZGVyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pLm9uKCdkcmF3LmR0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIHRoaXMuZHJhdy5lbWl0KCk7XG4gICAgICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgICAgIGNvbnN0IGluZm86IHsgcGFnZTogbnVtYmVyOyBwYWdlczogbnVtYmVyIH0gPSB0aGlzLmRhdGFUYWJsZS5wYWdlLmluZm8oKTtcbiAgICAgICAgICB0aGlzLnBhZ2UuZW1pdChpbmZvKTtcbiAgICAgICAgICBpZihkcmF3SW5kZXggPiAxKVxuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGRyYXdJbmRleCsrO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7dGhpcy5kYXRhVGFibGUuY29sdW1ucy5hZGp1c3QoKTt9LCAxKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0VSUk9SJywgJ0FuIGVycm9yIG9jY3VycmVkIHdoaWxlIGFkanVzdGluZyB0YWJsZSBjb2x1bW5zJyk7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gYWxsb3cgc2VsZWN0aW9uXG4gICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgIC8vIGdldCBmaXJzdCBjb2x1bW4gKGFzIHJvdyBwcmltYXJ5IGtleSlcbiAgICAgICAgLy8gdG9kbzo6YWxsb3cgcm93IHByaW1hcnkga2V5IGNvbmZpZ3VyYXRpb25cbiAgICAgICAgY29uc3QgZmlyc3RDb2x1bW4gPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdO1xuICAgICAgICAvLyBhZGQgc2VsZWN0IGNvbHVtblxuICAgICAgICBjb25zdCBzZWxlY3RDb2x1bW5EZWZpbml0aW9uID0ge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ3RleHQtY2VudGVyIHBsLTQgcHItMCcsXG4gICAgICAgICAgZGF0YTogZmlyc3RDb2x1bW4ucHJvcGVydHkgfHwgZmlyc3RDb2x1bW4ubmFtZSxcbiAgICAgICAgICBkZWZhdWx0Q29udGVudDogJycsXG4gICAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICAgIHNvcnRhYmxlOiBmYWxzZSxcbiAgICAgICAgICB2aXNpYmxlOiAhdGhpcy5jdXN0b21TZWxlY3QsXG4gICAgICAgICAgbmFtZTogZmlyc3RDb2x1bW4ubmFtZSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gYXNzaWduIHJlbmRlcmVyXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2VsZWN0Q29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgIHJlbmRlcjogdGhpcy5fcmVuZGVyU2VsZWN0LmJpbmQodGhpcyksXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhbmQgZmluYWxseSBhZGQgY29sdW1uXG4gICAgICAgIHRhYmxlQ29sdW1ucy51bnNoaWZ0KHNlbGVjdENvbHVtbkRlZmluaXRpb24pO1xuICAgICAgICAvLyB1c2VyIGludGVyZmFjZSBhZGRpdGlvbnNcbiAgICAgICAgLy8gaGFuZGxlIHBhZ2UgY2hhbmdlIGV2ZW50IChhIHRyaWNrIGZvciBmaXJpbmcgZHJhdy5kdCBldmVudHMpXG4gICAgICAgIHRhYmxlRWxlbWVudFxuICAgICAgICAgIC8vIGhhbmRsZSBkcmF3IGV2ZW50c1xuICAgICAgICAgIC5vbignZHJhdy5kdCcsICgpID0+IHtcblxuICAgICAgICAgICAgaWYgKHRoaXMuY3VzdG9tU2VsZWN0KSB7XG4gICAgICAgICAgICAgIC8vIGVuYWJsZSByb3cgc2VsZWN0aW9uIGV2ZW50XG4gICAgICAgICAgICAgIHRhYmxlRWxlbWVudC5maW5kKCd0Ym9keScpLm9uKCdjbGljaycsICd0cicsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vIHNlbGVjdCByb3dcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSBzZWxmLmRhdGFUYWJsZS5yb3codGhpcyk7XG4gICAgICAgICAgICAgICAgLy8gYWRkIHJvd1xuICAgICAgICAgICAgICAgIHNlbGYuc2VsZWN0LmVtaXQocm93KTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRhYmxlRWxlbWVudC5maW5kKCdpbnB1dC5zLXJvdycpO1xuICAgICAgICAgICAgZWxlbWVudHMub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAvLyBtYWtlIHNlbGVjdGlvbiBvbiBjdXJyZW50IHBhZ2VcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ucHJvcGVydHk7XG4gICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgIC8vIGVudW1lcmF0ZSBzZWxlY3RlZCBpdGVtc1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBmaW5kIHJvdyBpZGVudGlmaWVyXG4gICAgICAgICAgICAgICAgY29uc3QgaWQgPSBpdGVtW2tleV07XG4gICAgICAgICAgICAgICAgLy8gaWYgaWRlbnRpZmllciBpcyBkZWZpbmVkXG4gICAgICAgICAgICAgICAgaWYgKGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBmaW5kIGNoZWNrIGVsZW1lbnQgd2l0aCB0aGlzIGlkZW50aWZpZXIgaW4gYXR0cmlidXRlIGRhdGEtaWRcbiAgICAgICAgICAgICAgICAgIHRhYmxlRWxlbWVudC5maW5kKGBpbnB1dFtkYXRhLWlkPScke2lkfSddYCkucHJvcCgnY2hlY2tlZCcsIHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5zbWFydFNlbGVjdCkge1xuICAgICAgICAgICAgICAvLyBzZWxlY3Qgcm93cyB0aGF0IGFyZSBub3Qgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgLy8gYW5kIGRvIG5vdCBpbmNsdWRlZCBpbiB1bnNlbGVjdGVkIGNvbGxlY3Rpb25cbiAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoJ2lucHV0W2RhdGEtaWRdJykuZWFjaCgoaW5kZXgsIGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgZGF0YSBpZFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHhba2V5XSA9PSBqUXVlcnkoZWxlbWVudCkuYXR0cignZGF0YS1pZCcpO1xuICAgICAgICAgICAgICAgIH0pIDwgMCkge1xuICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RSb3codGhpcy5kYXRhVGFibGUucm93KGluZGV4KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoJ2lucHV0W2RhdGEtaWRdJykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZVxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgIC8vIHNldCBsZW5ndGggbWVudVxuICAgICAgICBsZW5ndGhNZW51OiBbNSwgMTAsIDUwLCAxMDAsIDIwMCwgNTAwXSxcbiAgICAgICAgLy8gaGlkZSBsZW5ndGggbWVudVxuICAgICAgICBsZW5ndGhDaGFuZ2U6IGZhbHNlLFxuICAgICAgICAvLyBlbmFibGUgc2VhcmNoIGJ1dCBoaWRlIHNlYXJjaCBib3ggKGNzcylcbiAgICAgICAgc2VhcmNoaW5nOiB0cnVlLFxuICAgICAgICAvLyBlbmFibGUgZGF0YSBwcm9jZXNzaW5nXG4gICAgICAgIHByb2Nlc3Npbmc6IHRydWUsXG4gICAgICAgIC8vIGVuYWJsZSBnZXR0aW5nIHNlcnZlciBzaWRlIGRhdGFcbiAgICAgICAgc2VydmVyU2lkZTogdGhpcy5zZXJ2ZXJTaWRlLFxuICAgICAgICAvLyBlbnVtZXJhdGUgdGFibGUgY29sdW1uc1xuICAgICAgICBjb2x1bW5zOiB0YWJsZUNvbHVtbnMsXG4gICAgICAgIGNvbFJlb3JkZXI6ICB0aGlzLmNvbHVtbk9yZGVyaW5nLFxuICAgICAgICBvcmRlcjogW10sXG4gICAgICAgIC8vIHNldCBzY3JvbGwgeFxuICAgICAgICBzY3JvbGxYOiB0aGlzLnNjcm9sbFgsXG4gICAgICAgIGRvbTogJ0JmcnRpcCcsXG4gICAgICAgIGF1dG9XaWR0aDogZmFsc2UsXG4gICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleHRlbmQ6ICdleGNlbCcsXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5jb25maWcudGl0bGUsXG4gICAgICAgICAgICBjbGFzc05hbWU6ICdkLW5vbmUnLFxuICAgICAgICAgICAgZXhwb3J0T3B0aW9uczoge1xuICAgICAgICAgICAgICBjb2x1bW5zOiAndGg6bm90KDpmaXJzdC1jaGlsZCknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAvLyBkZWZpbmUgc2VydmVyIGRhdGEgY2FsbGJhY2tcbiAgICAgICAgZm5TZXJ2ZXJEYXRhKHNTb3VyY2U6IGFueSwgYW9EYXRhOiBhbnksIGZuQ2FsbGJhY2s6IGFueSwgb1NldHRpbmdzOiBhbnkpIHtcbiAgICAgICAgICAvLyBpZiBtZXRob2QgaXMgaW52b2tlZCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICBpZiAoc2VsZi5fZmlyc3RMb2FkKSB7XG4gICAgICAgICAgICAvLyBkaXNhYmxlZCBmaXJzdCBsb2FkIGZsYWdcbiAgICAgICAgICAgIHNlbGYuX2ZpcnN0TG9hZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gaWYgYXV0byBsb2FkIGlzIGRpc2FibGVkXG4gICAgICAgICAgICBpZiAoc2VsZi5hdXRvTG9hZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW1wdHlEYXRhU2V0ID0ge1xuICAgICAgICAgICAgICAgIHJlY29yZHNUb3RhbDogMCxcbiAgICAgICAgICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IDAsXG4gICAgICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIC8vIGVtaXQgZW1wdHkgZGF0YVxuICAgICAgICAgICAgICBzZWxmLmxvYWQuZW1pdChlbXB0eURhdGFTZXQpO1xuICAgICAgICAgICAgICAvLyByZXR1cm4gZW1wdHkgZGF0YVxuICAgICAgICAgICAgICByZXR1cm4gZm5DYWxsYmFjayhlbXB0eURhdGFTZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBnZXQgYWN0aXZhdGVkIHJvdXRlIHBhcmFtc1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gc2VsZi5fYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XG4gICAgICAgICAgLy8gZ2V0IGNvbHVtbnNcbiAgICAgICAgICBjb25zdCBjb2x1bW5zID0gYW9EYXRhWzFdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBvcmRlciBleHByZXNzaW9uXG4gICAgICAgICAgY29uc3Qgb3JkZXIgPSBhb0RhdGFbMl0udmFsdWU7XG4gICAgICAgICAgLy8gZ2V0IHNraXAgcmVjb3JkcyBwYXJhbVxuICAgICAgICAgIGxldCBza2lwID0gYW9EYXRhWzNdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBwYWdlIHNpemUgcGFyYW1cbiAgICAgICAgICBsZXQgdG9wID0gYW9EYXRhWzRdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBzZWFyY2ggdmFsdWVcbiAgICAgICAgICBjb25zdCBzZWFyY2ggPSBhb0RhdGFbNV0udmFsdWU7XG4gICAgICAgICAgLy8gZ2V0IGRhdGEgcXVlcnlhYmxlXG4gICAgICAgICAgY29uc3QgcSA9IHNlbGYuX3F1ZXJ5IGluc3RhbmNlb2YgQ2xpZW50RGF0YVF1ZXJ5YWJsZSA/IHNlbGYuX3F1ZXJ5IDogc2VsZi5fY29udGV4dC5tb2RlbChzZWxmLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICAgICAgICAvLyBhcHBseSBwYWdpbmcgcGFyYW1zXG4gICAgICAgICAgaWYgKHRvcCkge1xuICAgICAgICAgICAgcS50YWtlKHRvcCkuc2tpcChza2lwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYXBwbHkgb3JkZXIgcGFyYW1zXG4gICAgICAgICAgaWYgKG9yZGVyICYmIG9yZGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gZ2V0IG9yZGVyIHF1ZXJ5IGV4cHJlc3Npb25cbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQnlTdHIgPSBvcmRlci5tYXAoKGV4cHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGFibGVDb2x1bW5zW2V4cHIuY29sdW1uXS5uYW1lICsgJyAnICsgZXhwci5kaXIgfHwgJ2FzYyc7XG4gICAgICAgICAgICB9KS5qb2luKCcsJyk7XG4gICAgICAgICAgICAvLyBzZXQgb3JkZXJcbiAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRvcmRlcmJ5Jywgb3JkZXJCeVN0cik7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbmZpZ3VyZSAkc2VsZWN0IHBhcmFtZXRlclxuICAgICAgICAgIGNvbnN0IHNlbGVjdCA9IHNlbGYuY29uZmlnLmNvbHVtbnMuZmlsdGVyKCAoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIGNvbHVtbi52aXJ0dWFsID09PSB0cnVlICkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9KS5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5wcm9wZXJ0eSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLm5hbWUgKyAnIGFzICcgKyBjb2x1bW4ucHJvcGVydHk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcS5zZWxlY3QuYXBwbHkocSwgc2VsZWN0KTtcbiAgICAgICAgICAvLyBjb25maWd1cmUgJGZpbHRlclxuICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy4kZmlsdGVyICYmIHF1ZXJ5UGFyYW1zLiRmaWx0ZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBzZXQgcm91dGUgZmlsdGVyXG4gICAgICAgICAgICBjb25zdCBxUGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRmaWx0ZXInLCBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gWyBxdWVyeVBhcmFtcy4kZmlsdGVyIF07XG4gICAgICAgICAgICBpZiAocVBhcmFtcy4kZmlsdGVyKSB7IGV4cHJlc3Npb25zLnB1c2goJygnICsgcVBhcmFtcy4kZmlsdGVyICsgJyknICk7IH1cbiAgICAgICAgICAgIHEuZmlsdGVyKGV4cHJlc3Npb25zLmpvaW4oJyBhbmQgJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBjaGVjayBpZiBxdWVyeSBwYXJhbWV0ZXJzIGNvbnRhaW4gZmlsdGVyXG4gICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLiRleHBhbmQgJiYgcXVlcnlQYXJhbXMuJGV4cGFuZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIHNldCByb3V0ZSAkZXhwYW5kXG4gICAgICAgICAgICBxLnNldFBhcmFtKCckZXhwYW5kJywgcXVlcnlQYXJhbXMuJGV4cGFuZCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzZWxmLmNvbmZpZyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cy5leHBhbmQpIHtcbiAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRleHBhbmQnLCBzZWxmLmNvbmZpZy5kZWZhdWx0cy5leHBhbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXEuZ2V0UGFyYW1zKClbJyRvcmRlcmJ5J10gJiYgc2VsZi5jb25maWcgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMub3JkZXJCeSkge1xuICAgICAgICAgICAgcS5zZXRQYXJhbSgnJG9yZGVyYnknLCBzZWxmLmNvbmZpZy5kZWZhdWx0cy5vcmRlckJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlbGYuY29uZmlnICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzLmdyb3VwQnkpIHtcbiAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRncm91cGJ5Jywgc2VsZi5jb25maWcuZGVmYXVsdHMuZ3JvdXBCeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGFwcGVuZCBkZWZhdWx0IGZpbHRlclxuICAgICAgICAgIGlmIChzZWxmLmNvbmZpZyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXIuYXN5bmNCdWlsZEZpbHRlcihzZWxmLmNvbmZpZy5kZWZhdWx0cy5maWx0ZXIpLnRoZW4oKGRlZmF1bHRGaWx0ZXJTdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXJTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxUGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICBxLnNldFBhcmFtKCckZmlsdGVyJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnMgPSBbIGRlZmF1bHRGaWx0ZXJTdHJpbmcgXTtcbiAgICAgICAgICAgICAgICBpZiAocVBhcmFtcy4kZmlsdGVyKSB7IGV4cHJlc3Npb25zLnB1c2goJygnICsgcVBhcmFtcy4kZmlsdGVyICsgJyknICk7IH1cbiAgICAgICAgICAgICAgICBxLmZpbHRlcihleHByZXNzaW9ucy5qb2luKCcgYW5kICcpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZWxmLmxhc3RRdWVyeVBhcmFtcyA9IHEuZ2V0UGFyYW1zKCk7XG4gICAgICAgICAgICAgIHEuZ2V0TGlzdCgpLnRoZW4oKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkYXRhU2V0ID0ge1xuICAgICAgICAgICAgICAgICAgICByZWNvcmRzVG90YWw6IGl0ZW1zLnRvdGFsLFxuICAgICAgICAgICAgICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IGl0ZW1zLnRvdGFsLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBpdGVtcy52YWx1ZSxcbiAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICBpZiAoaXRlbXMudG90YWwgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5yZXNldEVtcHR5VGFibGUoKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIC8vIGVtaXQgbG9hZCBldmVudFxuICAgICAgICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoZGF0YVNldCk7XG4gICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZGF0YVxuICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuQ2FsbGJhY2soZGF0YVNldCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUQUJMRVMnLCBlcnIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYubGFzdFF1ZXJ5UGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICBxLmdldExpc3QoKS50aGVuKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGF0YVNldCA9IHtcbiAgICAgICAgICAgICAgcmVjb3Jkc1RvdGFsOiBpdGVtcy50b3RhbCxcbiAgICAgICAgICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiBpdGVtcy50b3RhbCxcbiAgICAgICAgICAgICAgZGF0YTogaXRlbXMudmFsdWUsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKGl0ZW1zLnRvdGFsID09PSAwKSB7XG4gICAgICAgICAgICAgIHNlbGYucmVzZXRFbXB0eVRhYmxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBlbWl0IGxvYWQgZXZlbnRcbiAgICAgICAgICAgIHNlbGYubG9hZC5lbWl0KGRhdGFTZXQpO1xuICAgICAgICAgICAgLy8gcmV0dXJuIGRhdGFcbiAgICAgICAgICAgIHJldHVybiBmbkNhbGxiYWNrKGRhdGFTZXQpO1xuICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RBQkxFUycsIGVycik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGxhbmd1YWdlOiBPYmplY3QuYXNzaWduKHsgfSwgc2VsZi50cmFuc2xhdG9yLnRyYW5zZm9ybSgnVGFibGVzLkRhdGFUYWJsZScpLFxuICAgICAgICAgIHtlbXB0eVRhYmxlOiAnICcgfSksXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBzdGF0ZVNldHRpbmdzID0ge1xuICAgICAgICBzdGF0ZVNhdmU6IHRoaXMuc3RhdGVTYXZlXG4gICAgICB9O1xuICAgICAgaWYgKHRoaXMuc3RhdGVMb2FkQ2FsbGJhY2spIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZVNldHRpbmdzLCB7XG4gICAgICAgICAgc3RhdGVMb2FkQ2FsbGJhY2s6IHRoaXMuc3RhdGVMb2FkQ2FsbGJhY2tcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zdGF0ZVNhdmVDYWxsYmFjaykge1xuICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlU2V0dGluZ3MsIHtcbiAgICAgICAgICBzdGF0ZVNhdmVDYWxsYmFjazogdGhpcy5zdGF0ZVNhdmVDYWxsYmFja1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3MsIHN0YXRlU2V0dGluZ3MpO1xuXG4gICAgICBpZiAodGhpcy5zY3JvbGxhYmxlKSB7XG4gICAgICAgIC8vIHNldCBjb250aW51b3VzIHNjcm9sbGluZ1xuICAgICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzLCB7XG4gICAgICAgICAgc2Nyb2xsWTogdGhpcy5zY3JvbGxZLFxuICAgICAgICAgIHNjcm9sbENvbGxhcHNlOiBmYWxzZSxcbiAgICAgICAgICBzY3JvbGxlcjoge1xuICAgICAgICAgICAgbG9hZGluZ0luZGljYXRvcjogZmFsc2UsXG4gICAgICAgICAgICBkaXNwbGF5QnVmZmVyOiAxMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3MsIHtcbiAgICAgICAgICBzY3JvbGxZOiB0aGlzLnNjcm9sbFksXG4gICAgICAgICAgcGFnaW5nOiB0aGlzLnBhZ2luZyxcbiAgICAgICAgICBwYWdlTGVuZ3RoOiB0aGlzLnBhZ2VMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0YWJsZSkge1xuXG4gICAgICB9XG4gICAgICAvLyBoYW5kbGUgaW5pdC5kdCBldmVudCBhbmQgZW1pdCBsb2NhbCBldmVudFxuICAgICAgdGhpcy5kYXRhVGFibGUgPSB0YWJsZUVsZW1lbnQub24oJ2luaXQuZHQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSBqUXVlcnkoZXZlbnQudGFyZ2V0KS5wYXJlbnQoKTtcbiAgICAgICAgLy8gaGFuZGxlIHNjcm9sbGluZ1xuICAgICAgICBzY3JvbGxlci5vbignc2Nyb2xsJywgKHNjcm9sbEV2ZW50KSA9PiB7XG4gICAgICAgICAgY29uc3QgdGFyZ2V0ID0galF1ZXJ5KHNjcm9sbEV2ZW50LnRhcmdldCk7XG4gICAgICAgICAgY29uc3QgdG9wID0gdGFyZ2V0LnNjcm9sbFRvcCgpO1xuICAgICAgICAgIGNvbnN0IGxlZnQgPSB0YXJnZXQuc2Nyb2xsTGVmdCgpO1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGwuZW1pdCh7XG4gICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgbGVmdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pLkRhdGFUYWJsZShzZXR0aW5ncyk7XG4gICAgICB0aGlzLmluaXQuZW1pdCgpO1xuICAgICAgLy8gc2hvdyBvciBoaWRlIGhlYWRlclxuICAgICAgaWYgKCF0aGlzLnNob3dIZWFkZXIpIHtcbiAgICAgICAgKCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGU+dGhlYWQnKS5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcbiAgICAgICAgKCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGUnKS5jbGFzc0xpc3QuYWRkKCdtdC0yJyk7XG4gICAgICB9XG5cbiAgICAgIC8vIHNob3cgb3IgaGlkZSBmb290ZXJcbiAgICAgIGlmICghdGhpcy5zaG93Rm9vdGVyKSB7XG4gICAgICAgICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlc19pbmZvJykuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICB9XG4gICAgICAvLyBzaG93IG9yIGhpZGUgcGFnZXJcbiAgICAgIGlmICh0aGlzLnNob3dQYWdpbmcpIHtcbiAgICAgICAgdGhpcy5zaG93UGFnaW5nID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzY3JvbGxUb3AodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgdGhpcy5kYXRhVGFibGUucGFyZW50KCkuc2Nyb2xsVG9wKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBzY3JvbGxMZWZ0KHZhbHVlOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLnBhcmVudCgpLnNjcm9sbExlZnQodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBsYXN0UXVlcnkoKTogQ2xpZW50RGF0YVF1ZXJ5YWJsZSB7XG4gICAgaWYgKHRoaXMuY29uZmlnID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0UXVlcnlQYXJhbXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IHEgPSB0aGlzLl9jb250ZXh0Lm1vZGVsKHRoaXMuY29uZmlnLm1vZGVsKS5hc1F1ZXJ5YWJsZSgpO1xuICAgIE9iamVjdC5rZXlzKHRoaXMubGFzdFF1ZXJ5UGFyYW1zKS5mb3JFYWNoKCAoa2V5KSA9PiB7XG4gICAgICBxLnNldFBhcmFtKGtleSwgdGhpcy5sYXN0UXVlcnlQYXJhbXNba2V5XSk7XG4gICAgfSk7XG4gICAgLy8gcmV0dXJuIHF1ZXJ5XG4gICAgcmV0dXJuIHE7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBhbmQgdXBkYXRlcyBhIHNpbmdsZSByb3dcbiAgICogQHBhcmFtIGZpbmQgLSBBbnkgb2JqZWN0IHdoaWNoIGlzIGJlaW5nIGNvbnZlcnRlZCB0byBhIHF1ZXJ5XG4gICAqL1xuICBwdWJsaWMgZmV0Y2hPbmUoZmluZDogYW55KSB7XG4gICAgaWYgKGZpbmQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5kYXRhVGFibGUgPT0gbnVsbCkge1xuICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmxhc3RRdWVyeVBhcmFtcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGdldCByb3dzXG4gICAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20odGhpcy5kYXRhVGFibGUucm93cygpLmRhdGEoKSk7XG4gICAgaWYgKHJvd3MgJiYgcm93cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZpbmQgcmVzdWx0XG4gICAgICBjb25zdCBmaW5kS2V5cyA9IE9iamVjdC5rZXlzKGZpbmQpO1xuICAgICAgaWYgKGZpbmRLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGZpbmQgcm93IGluZGV4IGJ5IHNlYXJjaGluZyBlYWNoIHByb3BlcnR5XG4gICAgICBjb25zdCByb3dJbmRleCA9IHJvd3MuZmluZEluZGV4KChyb3c6IGFueSkgPT4ge1xuICAgICAgICByZXR1cm4gZmluZEtleXMubWFwKCAoa2V5KSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJvd1trZXldID09PSBmaW5kW2tleV07XG4gICAgICAgIH0pLmZpbHRlciggKHJlcykgPT4ge1xuICAgICAgICAgIHJldHVybiByZXMgPT09IGZhbHNlO1xuICAgICAgICB9KS5sZW5ndGggPT09IDA7XG4gICAgICB9KTtcbiAgICAgIC8vIGlmIHJvdyBoYXMgYmVlbiBmb3VuZFxuICAgICAgaWYgKHJvd0luZGV4ID49IDApIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLl9jb250ZXh0Lm1vZGVsKHRoaXMuY29uZmlnLm1vZGVsKS5hc1F1ZXJ5YWJsZSgpO1xuICAgICAgICAvLyBzZWxlY3QgYXR0cmlidXRlc1xuICAgICAgICBxdWVyeS5zZXRQYXJhbSgnJHNlbGVjdCcsIHRoaXMubGFzdFF1ZXJ5UGFyYW1zLiRzZWxlY3QpO1xuICAgICAgICBpZiAodGhpcy5sYXN0UXVlcnlQYXJhbXMuJGV4cGFuZCkge1xuICAgICAgICAgIC8vIGFwcGx5IGV4cGFuZCBhdHRyaWJ1dGVzXG4gICAgICAgICAgcXVlcnkuc2V0UGFyYW0oJyRleHBhbmQnLCB0aGlzLmxhc3RRdWVyeVBhcmFtcy4kZXhwYW5kKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBhcHBseSBmaWx0ZXIgZm9yIHJvd1xuICAgICAgICBmaW5kS2V5cy5mb3JFYWNoKCAoa2V5KSA9PiB7XG4gICAgICAgICAgY29uc3QgY29sdW1uID0gdGhpcy5jb25maWcuY29sdW1ucy5maW5kKCAoY29sKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gY29sLnByb3BlcnR5ID09PSBrZXkgfHwgY29sLm5hbWUgPT09IGtleTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoY29sdW1uKSB7XG4gICAgICAgICAgICAvLyBnZXQgcHJvcGVydHkgb3IgbmFtZVxuICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBjb2x1bW4ucHJvcGVydHkgfHwgY29sdW1uLm5hbWU7XG4gICAgICAgICAgICBxdWVyeS5hbmQocHJvcGVydHkpLmVxdWFsKGZpbmRba2V5XSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1ZXJ5LmFuZChrZXkpLmVxdWFsKGZpbmRba2V5XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8gYW5kIGZpbmFsbHkgZ2V0IGl0ZW1cbiAgICAgICAgcmV0dXJuIHF1ZXJ5LmdldEl0ZW0oKS50aGVuKCAoaXRlbSkgPT4ge1xuICAgICAgICAgIC8vIGlmIGl0ZW0gZXhpc3RzXG4gICAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhVGFibGUucm93KHJvd0luZGV4KTtcbiAgICAgICAgICBjb25zdCBjaGVja2VkID0galF1ZXJ5KHJvdy5ub2RlKCkpLmZpbmQoJzpjaGVja2JveCcpLnByb3AoJ2NoZWNrZWQnKTtcbiAgICAgICAgICBpZiAoaXRlbSkge1xuICAgICAgICAgICAgLy8gcmVkcmF3IHJvd1xuICAgICAgICAgICAgcm93LmRhdGEoaXRlbSk7XG4gICAgICAgICAgICBqUXVlcnkocm93Lm5vZGUoKSkuZmluZCgnOmNoZWNrYm94Jykub2ZmKCdjbGljaycpLm9uKCdjbGljaycsIHRoaXMub25TZWxlY3Rpb25DaGFuZ2UuYmluZCh0aGlzKSk7XG4gICAgICAgICAgICAvLyBpZiByb3cgaXMgYWxyZWFkeSBzZWxlY3RlZFxuICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RSb3cocm93LCB0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICB9XG5cbiAgcHVibGljIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnJlbG9hZFN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yZWxvYWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHNlbGVjdGlvbiBjaGFuZ2VcbiAgICogQHBhcmFtICRldmVudFxuICAgKi9cbiAgcHVibGljIG9uU2VsZWN0aW9uQ2hhbmdlKCRldmVudCkge1xuICAgIGNvbnN0IGlucHV0ID0gICRldmVudC50YXJnZXQgYXMgSFRNTElucHV0RWxlbWVudDtcbiAgICAvLyBnZXQgcm93IGZyb20gaWRcbiAgICBjb25zdCByb3dJbmRleCA9IHBhcnNlSW50KC8tKFxcZCspJC9nLmV4ZWMoaW5wdXQuaWQpWzFdLCAxMCk7XG4gICAgLy8gZ2V0IHJvd1xuICAgIGNvbnN0IHJvdyA9IHRoaXMuZGF0YVRhYmxlLnJvdyhyb3dJbmRleCkuZGF0YSgpO1xuICAgIC8vIGdldCByb3cgaWRlbnRpZmllclxuICAgIGlmIChyb3cpIHtcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ucHJvcGVydHk7XG4gICAgICBjb25zdCBpZCA9IHJvd1trZXldO1xuICAgICAgbGV0IGZpbmRJdGVtSW5kZXggPSB0aGlzLnNlbGVjdGVkLmZpbmRJbmRleCgoaXRlbSkgPT4ge1xuICAgICAgICByZXR1cm4gaXRlbVtrZXldID09PSBpZDtcbiAgICAgIH0pO1xuICAgICAgaWYgKGlucHV0LmNoZWNrZWQpIHtcbiAgICAgICAgaWYgKGZpbmRJdGVtSW5kZXggPCAwKSB7XG4gICAgICAgICAgLy8gYWRkIHJvdyB0byBzZWxlY3RlZCByb3dzXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZC5wdXNoKHJvdyk7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmaW5kSXRlbUluZGV4ID49IDApIHtcbiAgICAgICAgICAvLyByZW1vdmUgc2VsZWN0ZWQgaXRlbVxuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuc3BsaWNlKGZpbmRJdGVtSW5kZXgsIDEpO1xuICAgICAgICAgIGlmICh0aGlzLnNtYXJ0U2VsZWN0KSB7XG4gICAgICAgICAgICAvLyBhZGQgcm93IHRvIHVuc2VsZWN0ZWQgcm93c1xuICAgICAgICAgICAgZmluZEl0ZW1JbmRleCA9IHRoaXMudW5zZWxlY3RlZC5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1ba2V5XSA9PT0gaWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmIChmaW5kSXRlbUluZGV4IDwgMCkge1xuICAgICAgICAgICAgICB0aGlzLnVuc2VsZWN0ZWQucHVzaChyb3cpO1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZW1pdCh0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlc2V0RW1wdHlUYWJsZSgpIHtcbiAgICAvLyB0aGlzIG9wZXJhdGlvbiBpcyBpbXBvcnRhbnRcbiAgICAvLyBkdWUgdG8gbmcgZGF0YSBiaW5kaW5nXG4gICAgLy8gZW1wdHkgdGFibGUgdGVtcGxhdGUgaGFzIG5vIHRyYW5zbGF0ZWQgdGV4dCBkdXJpbmcgbmdPbkluaXQoKVxuICAgIGlmICh0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLm9MYW5ndWFnZS5zRW1wdHlUYWJsZSA9XG4gICAgICB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLm9MYW5ndWFnZS5zWmVyb1JlY29yZHMgPSB0aGlzLmVtcHR5VGFibGUubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckVtcHR5VGFibGUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0pIHtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNFbXB0eVRhYmxlID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGV4cG9ydCgpIHtcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kdC1idXR0b25zIC5idXR0b25zLWV4Y2VsJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWxlbWVudC5jbGljaygpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUNvbHVtbnMoY29sdW1uc1RvU2hvdykge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5kYXRhVGFibGU7XG4gICAgdGhpcy5jb25maWcuY29sdW1ucy5zbGljZSgxKS5mb3JFYWNoKChjb2x1bW4sIGkpID0+IHtcbiAgICAgIGlmICghY29sdW1uLmhpZGRlbikge1xuICAgICAgICBpZiAoY29sdW1uc1RvU2hvdy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICAvLyBub2luc3BlY3Rpb24gVHlwZVNjcmlwdFZhbGlkYXRlSlNUeXBlc1xuICAgICAgICAgIHRhYmxlLmNvbHVtbihjb2x1bW4ubmFtZSArICc6bmFtZScpLnZpc2libGUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIFR5cGVTY3JpcHRWYWxpZGF0ZUpTVHlwZXNcbiAgICAgICAgICB0YWJsZS5jb2x1bW4oY29sdW1uLm5hbWUgKyAnOm5hbWUnKS52aXNpYmxlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2hhbmdlcywgJ2NvbmZpZ1NyYycpKSB7XG4gICAgICBpZiAoY2hhbmdlcy5jb25maWdTcmMgIT0gbnVsbCkge1xuICAgICAgICAvLyBsb2FkIHRhYmxlIGNvbmZpZ3VyYXRpb24gb24gY2hhbmdlXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdHJpcGxlLWVxdWFsc1xuICAgICAgICBpZiAoY2hhbmdlcy5jb25maWdTcmMuY3VycmVudFZhbHVlICYmIChjaGFuZ2VzLmNvbmZpZ1NyYy5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy5jb25maWdTcmMucHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLl9odHRwLmdldChjaGFuZ2VzLmNvbmZpZ1NyYy5jdXJyZW50VmFsdWUpLnRvUHJvbWlzZSgpLnRoZW4oKGNvbmZpZzogVGFibGVDb25maWd1cmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBzZXQgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIC8vIGZldGNoIGFuZCByZWRyYXdcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goKTtcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUQUJMRVMnLCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0YWJsZSBjb25maWd1cmF0aW9uLicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0KGxvYWQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeSA9IG51bGw7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5hdXRvTG9hZCA9ICEhbG9hZDtcbiAgICB0aGlzLm5nT25Jbml0KCk7XG4gIH1cblxuICBzZWxlY3RDb2x1bW5zKCkge1xuICAgIC8vIGdldCBjb2x1bW4gb3JkZXIgZS5nLiBbMCwgNCwgMSwgMiwgM11cbiAgICBjb25zdCBjb2x1bW5PcmRlcjogbnVtYmVyW10gPSB0aGlzLmRhdGFUYWJsZS5jb2xSZW9yZGVyLm9yZGVyKCk7XG4gICAgLy8gZ2V0IGNvbHVtbiBkZWZpbml0aW9uc1xuICAgIGNvbnN0IGNvbHVtbkRlZnMgPSB0aGlzLmRhdGFUYWJsZS5zZXR0aW5ncygpLmluaXQoKS5jb2x1bW5zO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBjb2x1bW5EZWZzLm1hcCgoXG4gICAgICBjb2x1bW5EZWY6IHsga2V5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4sIHNvcnRhYmxlOiBib29sZWFuLCBpbmRleDogbnVtYmVyIH0sIGk6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IGtleSA9IGBjb2x1bW4tJHtpfWA7XG4gICAgICBsZXQgdGl0bGUgPSBjb2x1bW5EZWYudGl0bGU7XG4gICAgICAvLyBnZXQgY29sdW1uIGluZGV4XG4gICAgICBjb25zdCBpbmRleCA9ICBjb2x1bW5PcmRlci5pbmRleE9mKGkpO1xuICAgICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZGF0YVRhYmxlLmNvbHVtbihpbmRleCkudmlzaWJsZSgpO1xuICAgICAgLy8gc2V0IHRpdGxlIGZvciBzZWxlY3QgY29sdW1uXG4gICAgICBpZiAoaSA9PSAwICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgICB0aXRsZSA9ICc8JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLlNlbGVjdENvbHVtbicpICsgJz4nO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IGNvbHVtbiB0aXRsZVxuICAgICAgaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRpdGxlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRyeSB0byBmaW5kIGNvbHVtbiBwbGFjZWhvbGRlclxuICAgICAgICBsZXQgcGxhY2Vob2xkZXIgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IHRoaXMuY29uZmlnLmNvbHVtbnNbaSAtIDFdLnBsYWNlaG9sZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwbGFjZWhvbGRlciA9IHRoaXMuY29uZmlnLmNvbHVtbnNbaV0ucGxhY2Vob2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyICE9IG51bGwpIHtcbiAgICAgICAgICB0aXRsZSA9ICc8JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChwbGFjZWhvbGRlcikgKyAnPic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB7XG4gICAgICAgIHRpdGxlID0gJzwnICsgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuVW5rbm93bkNvbHVtbicpICsgJz4nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgdmlzaWJsZSxcbiAgICAgICAgaW5kZXhcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9jb2x1bW5TZWxlY3Rvci5zZWxlY3RDb2x1bW5zKGNvbHVtbnMpLnRoZW4oKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQucmVzdWx0ID09PSAnb2snKSB7XG4gICAgICAgIC8vIGdldCBjb2x1bW4gb3JkZXIgZS5nLiBbMywgMSwgMiwgMCwgNF1cbiAgICAgICAgbGV0IGluZGV4ZXMgPSBldmVudC5jb2x1bW5zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLmluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmVzZXQgY29sdW1uIHZpc2liaWx0eVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXZlbnQuY29sdW1ucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQuY29sdW1uc1tpbmRleF07XG4gICAgICAgICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW5PcmRlci5pbmRleE9mKGluZGV4KTtcbiAgICAgICAgICAvLyBzZXQgdmlzaWJpbHR5IHdpdGggcmVkcmF3ICg9dHJ1ZSlcbiAgICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb2x1bW4oY29sSW5kZXgpLnZpc2libGUoZWxlbWVudC52aXNpYmxlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5hbGx5IGFwcGx5IGNvbHVtbiBvcmRlclxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb2xSZW9yZGVyLm9yZGVyKGluZGV4ZXMsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbn1cbiJdfQ==
1510
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVuaXZlcnNpcy9uZ3gtdGFibGVzLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQUUsWUFBWSxFQUN4QixNQUFNLEVBQ04sY0FBYyxFQUNkLFFBQVEsRUFDUixLQUFLLEVBQ0csTUFBTSxFQUNkLFNBQVMsRUFDVCxpQkFBaUIsRUFHbEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFDLGFBQWEsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUcvQyxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQWUsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUN4RCxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSx3QkFBd0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpHLG9GQUFvRjtBQUNwRixPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyx5QkFBeUIsQ0FBQztB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QU07dUJBQ2IsTUFBTSxTQUFDLE1BQU07d0JBQ2IsTUFBTSxTQUFDLE9BQU87eUJBQ2QsTUFBTSxTQUFDLFFBQVE7Z0NBQ2YsTUFBTSxTQUFDLGVBQWU7MEJBQ3RCLE1BQU0sU0FBQyxTQUFTOzZCQU1oQixLQUFLOzZCQUNMLEtBQUs7NkJBQ0wsS0FBSzt5QkFDTCxLQUFLOzZCQUNMLEtBQUs7aUNBQ0wsS0FBSzs0QkFDTCxLQUFLO29DQUNMLEtBQUs7b0NBQ0wsS0FBSzswQkFFTCxLQUFLOzBCQUNMLEtBQUs7NkJBSUwsS0FBSztpQ0FJTCxLQUFLOytCQUlMLEtBQUs7MkJBQ0wsS0FBSzs0QkFLTCxLQUFLO3lCQU1MLEtBQUssU0FBQyxRQUFROzZCQWtCZCxLQUFLLFNBQUMsWUFBWTs2QkF5QmpCLEtBQUssU0FBQyxZQUFZOzZCQThCbkIsS0FBSyxTQUFDLFlBQVk7d0JBeUJsQixLQUFLLFNBQUMsT0FBTzs7SUEycUNoQiw2QkFBQztDQUFBLEFBcjNDRCxJQXEzQ0M7U0FsMUNZLHNCQUFzQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlcixcbiAgSW5qZWN0LFxuICBJbmplY3Rpb25Ub2tlbixcbiAgSW5qZWN0b3IsXG4gIElucHV0LCBPbkRlc3Ryb3ksXG4gIE9uSW5pdCwgT3V0cHV0LFxuICBWaWV3Q2hpbGQsXG4gIFZpZXdFbmNhcHN1bGF0aW9uLFxuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZXNcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FuZ3VsYXJEYXRhQ29udGV4dH0gZnJvbSAnQHRoZW1vc3QvYW5ndWxhcic7XG5pbXBvcnQge1RyYW5zbGF0ZVBpcGUsIFRyYW5zbGF0ZVNlcnZpY2V9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHtBY3RpdmF0ZWRSb3V0ZX0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7VGFibGVDb2x1bW5Db25maWd1cmF0aW9uLCBUYWJsZUNvbmZpZ3VyYXRpb259IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0RhdGFTZXJ2aWNlUXVlcnlQYXJhbXN9IGZyb20gJ0B0aGVtb3N0L2NsaWVudCc7XG5pbXBvcnQge0FkdmFuY2VkQ29sdW1uRm9ybWF0dGVyfSBmcm9tICcuL2FkdmFuY2VkLXRhYmxlLmZvcm1hdHRlcnMnO1xuaW1wb3J0IHtDbGllbnREYXRhUXVlcnlhYmxlfSBmcm9tICdAdGhlbW9zdC9jbGllbnQnO1xuaW1wb3J0IHtBZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXJ9IGZyb20gJy4vYWR2YW5jZWQtZmlsdGVyLXZhbHVlLXByb3ZpZGVyLnNlcnZpY2UnO1xuaW1wb3J0IHtTdWJzY3JpcHRpb24sIEJlaGF2aW9yU3ViamVjdH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1RlbXBsYXRlUGlwZSwgTG9hZGluZ1NlcnZpY2UsIENvbmZpZ3VyYXRpb25TZXJ2aWNlLFxuICBNb2RhbFNlcnZpY2UsIERJQUxPR19CVVRUT05TLCBFcnJvclNlcnZpY2UsIEV4cG9ydFNwcmVhZHNoZWV0U2VydmljZX0gZnJvbSAnQHVuaXZlcnNpcy9jb21tb24nO1xuaW1wb3J0IHtJQWR2YW5jZWRUYWJsZUZvcm1hdHRlcnN9IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuZm9ybWF0dGVycy5pbnRlcmZhY2UnO1xuLy8gaW1wb3J0YW50IG5vdGU6IHVzZSB0aGlzIGltcG9ydCB0byBhdm9pZCBDYW5ub3QgY2FsbCBhIG5hbWVzcGFjZSAoJ2pxdWVyeScpIGVycm9yXG5pbXBvcnQgKiBhcyBqUXVlcnlfIGZyb20gJ2pxdWVyeSc7XG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0JztcbmltcG9ydCB7dGVtcGxhdGV9IGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LXNjcm9sbGVyJztcbmltcG9ydCAnZGF0YXRhYmxlcy5uZXQtY29scmVvcmRlcic7XG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LWJ1dHRvbnMnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvbHVtblNlbGVjdG9yU2VydmljZSB9IGZyb20gJy4uL2NvbHVtbi1zZWxlY3Rvci9jb2x1bW4tc2VsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBFeHBvcnRMaW1pdENvbmZpZ3VyYXRpb24sIE1BWF9FWFBPUlRfSVRFTVMgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2J0bmV4cC5kaXJlY3RpdmUnO1xuXG4vLyByZXN0b3JlIGpxdWVyeSBpbXBvcnQgdG8gYXZvaWQgQ2Fubm90IGNhbGwgYSBuYW1lc3BhY2UgKCdqcXVlcnknKSBlcnJvclxuY29uc3QgalF1ZXJ5ID0galF1ZXJ5XztcbmV4cG9ydCBpbnRlcmZhY2UgQWR2YW5jZWRUYWJsZURhdGFSZXN1bHQge1xuICByZWNvcmRzVG90YWw6IG51bWJlcjtcbiAgcmVjb3Jkc0ZpbHRlcmVkOiBudW1iZXI7XG4gIGRhdGE6IEFycmF5PGFueT47XG59XG5cbmNvbnN0IERhdGFUYWJsZXNBcGk6IGFueSA9IGpRdWVyeS5mbi5kYXRhVGFibGUuQXBpO1xuRGF0YVRhYmxlc0FwaS5yZWdpc3RlciggJ3Byb2Nlc3NpbmcoKScsIGZ1bmN0aW9uKCBzaG93OiBhbnkgKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlcmF0b3IoJ3RhYmxlJywgKCBjdHg6IGFueSApID0+IHtcbiAgICAgICAgY3R4Lm9BcGkuX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkoIGN0eCwgc2hvdyApO1xuICAgIH0gKTtcbn0pO1xuXG5jb25zdCBFTVBUWV9EQVRBU0VUID0ge1xuICByZWNvcmRzVG90YWw6IDAsXG4gIHJlY29yZHNGaWx0ZXJlZDogMCxcbiAgZGF0YTogW10sXG59O1xuXG5jbGFzcyBUYWJsZVRyYW5zbGF0aW9uQ2hhbmdlRGV0ZWN0b3IgZXh0ZW5kcyBDaGFuZ2VEZXRlY3RvclJlZiB7XG4gIHB1YmxpYyBjaGVja05vQ2hhbmdlcygpOiB2b2lkIHtcbiAgfVxuXG4gIHB1YmxpYyBkZXRhY2goKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgfVxuXG4gIHB1YmxpYyBtYXJrRm9yQ2hlY2soKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgcmVhdHRhY2goKTogdm9pZCB7XG4gIH1cblxufVxuXG5leHBvcnQgbGV0IENPTFVNTl9GT1JNQVRURVJTID0gbmV3IEluamVjdGlvblRva2VuKCdjb2x1bW4uZm9ybWF0dGVycycpO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0TGltaXRFeGNlZWRlZEVycm9yIGV4dGVuZHMgUmFuZ2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdFeHBvcnRMaW1pdEV4Y2VlZGVkRXJyb3InO1xuICB9XG59XG5cbmNsYXNzIENvbHVtbkZvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgY2xhc3M6IHN0cmluZztcbiAgcHVibGljIGNsYXNzTmFtZTogc3RyaW5nO1xuICBwdWJsaWMgZGVmYXVsdENvbnRlbnQ6IHN0cmluZztcbiAgcHVibGljIGZvcm1hdFN0cmluZzogc3RyaW5nO1xuICBwdWJsaWMgZm9ybWF0dGVyOiBzdHJpbmc7XG4gIHB1YmxpYyBoaWRkZW46IGJvb2xlYW47XG4gIHB1YmxpYyBuYW1lOiBzdHJpbmc7XG4gIHB1YmxpYyBvcmRlcjogc3RyaW5nO1xuICBwdWJsaWMgcHJvcGVydHk6IHN0cmluZztcbiAgcHVibGljIHNvcnRhYmxlOiBib29sZWFuO1xuICBwdWJsaWMgdGl0bGU6IHN0cmluZztcblxuICBwdWJsaWMgcmVuZGVyKGRhdGE6IGFueSwgdHlwZTogYW55LCByb3c6IGFueSwgbWV0YTogYW55KSB7XG4gICAgLy9cbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JjZUNhc3Q8VD4oaW5wdXQ6IGFueSk6IFQge1xuICByZXR1cm4gaW5wdXQ7XG59XG5cbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFRhYmxlQ29uZmlndXJhdGlvbiB7XG4gIHB1YmxpYyBzdGF0aWMgY2FzdChpbnB1dDogYW55LCBjbG9uZT86IGJvb2xlYW4pOiBUYWJsZUNvbmZpZ3VyYXRpb24ge1xuICAgIGlmIChjbG9uZSkge1xuICAgICAgcmV0dXJuIGZvcmNlQ2FzdDxUYWJsZUNvbmZpZ3VyYXRpb24+KEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5wdXQpKSk7XG4gICAgfVxuICAgIHJldHVybiBmb3JjZUNhc3Q8VGFibGVDb25maWd1cmF0aW9uPihpbnB1dCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0UmFuZG9tSWRlbnRpZmllcigpIHtcbiAgcmV0dXJuIChcbiAgICBOdW1iZXIoU3RyaW5nKE1hdGgucmFuZG9tKCkpLnNsaWNlKDIpKVxuICApLnRvU3RyaW5nKDM2KTtcbn1cblxuQENvbXBvbmVudCh7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnYXBwLWFkdmFuY2VkLXRhYmxlJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8dGFibGUgI3RhYmxlIGNsYXNzPVwiZGF0YVRhYmxlXCI+XG4gICAgPC90YWJsZT5cbiAgICA8ZGl2ICNlbXB0eVRhYmxlIGNsYXNzPVwiZC1ub25lXCI+XG4gICAgICA8ZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNpcmNsZSBiZy1ncmF5LTMwMCBib3JkZXItZ3JheS0xMDBcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgPGg0IGNsYXNzPVwiZm9udC0zeGwgdGV4dC1kYXJrXCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkVtcHR5VGFibGVUaXRsZSdcIj48L2g0PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1sZyB0ZXh0LWRhcmtcIiBbdHJhbnNsYXRlXT1cIidUYWJsZXMuRW1wdHlUYWJsZU1lc3NhZ2UnXCI+PC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgI2Vycm9yVGVtcGxhdGUgY2xhc3M9XCJkLW5vbmUgZXJyb3ItbWVzc2FnZVwiPlxuICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tY2lyY2xlIGJnLWRhbmdlciBib3JkZXItZ3JheS0xMDBcIj48L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgPGg0IGNsYXNzPVwiZm9udC0zeGwgdGV4dC1zZWNvbmRhcnlcIiBbdHJhbnNsYXRlXT1cIidUYWJsZXMuRGF0YUVycm9yLlRpdGxlJ1wiPjwvaDQ+XG4gICAgICAgICAgPHAgY2xhc3M9XCJmb250LWxnIHRleHQtc2Vjb25kYXJ5IG1iLTFcIiBbdHJhbnNsYXRlXT1cIidUYWJsZXMuRGF0YUVycm9yLk1lc3NhZ2UnXCI+PC9wPlxuICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1sZyB0ZXh0LXNlY29uZGFyeSBlcnJvci1pbm5lci1tZXNzYWdlXCI+XG4gICAgICAgICAgICA8c21hbGw+PC9zbWFsbD5cbiAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gIHN0eWxlVXJsczogWycuL2FkdmFuY2VkLXRhYmxlLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEFkdmFuY2VkVGFibGVDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcblxuICBwcml2YXRlIF9xdWVyeTogQ2xpZW50RGF0YVF1ZXJ5YWJsZTtcbiAgcHJpdmF0ZSBfY29uZmlnOiBUYWJsZUNvbmZpZ3VyYXRpb247XG4gIHByaXZhdGUgX2ZpcnN0TG9hZCA9IHRydWU7XG4gIHByaXZhdGUgX3Nob3dGb290ZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2hvd0hlYWRlciA9IHRydWU7XG4gIHByaXZhdGUgX3Nob3dQYWdpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaWQgPSBnZXRSYW5kb21JZGVudGlmaWVyKCk7XG4gIHB1YmxpYyBzbWFydFNlbGVjdCA9IGZhbHNlO1xuICBwdWJsaWMgY29uZmlnQ2hhbmdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcblxuICBAVmlld0NoaWxkKCd0YWJsZScpIHB1YmxpYyB0YWJsZTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgnZW1wdHlUYWJsZScpIHB1YmxpYyBlbXB0eVRhYmxlOiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdlcnJvclRlbXBsYXRlJykgcHVibGljIGVycm9yVGVtcGxhdGU6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2xvYWRpbmdUYWJsZScpIHB1YmxpYyBsb2FkaW5nVGFibGU6IEVsZW1lbnRSZWY7XG4gIEBJbnB1dCgpIHB1YmxpYyBoZWlnaHQgPSA4MDA7XG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93QWN0aW9ucyA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBhdXRvTG9hZCA9IHRydWU7XG4gIEBPdXRwdXQoJ2xvYWQnKSBwdWJsaWMgbG9hZDogRXZlbnRFbWl0dGVyPEFkdmFuY2VkVGFibGVEYXRhUmVzdWx0PiA9IG5ldyBFdmVudEVtaXR0ZXI8QWR2YW5jZWRUYWJsZURhdGFSZXN1bHQ+KCk7XG4gIEBPdXRwdXQoJ2luaXQnKSBwdWJsaWMgaW5pdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQElucHV0KCdyZWxvYWQnKSBwdWJsaWMgcmVsb2FkOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdzZWxlY3QnKSBwdWJsaWMgc2VsZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdkcmF3JykgcHVibGljIGRyYXc6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ3BhZ2UnKSBwdWJsaWMgcGFnZTogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnb3JkZXInKSBwdWJsaWMgb3JkZXI6IEV2ZW50RW1pdHRlcjxhbnlbXVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W11bXT4oKTtcbiAgQE91dHB1dCgnc2Nyb2xsJykgcHVibGljIHNjcm9sbDogRXZlbnRFbWl0dGVyPHsgdG9wOiBudW1iZXI7IGxlZnQ6IG51bWJlciB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8eyB0b3A6IG51bWJlcjsgbGVmdDogbnVtYmVyIH0+KCk7XG4gIEBPdXRwdXQoJ3NlbGVjdGVkSXRlbXMnKSBwdWJsaWMgc2VsZWN0ZWRJdGVtczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnbG9hZGluZycpIHB1YmxpYyBsb2FkaW5nOiBFdmVudEVtaXR0ZXI8e1xuICAgIHRhcmdldDogQWR2YW5jZWRUYWJsZUNvbXBvbmVudFxuICB9PiA9IG5ldyBFdmVudEVtaXR0ZXI8e1xuICAgIHRhcmdldDogQWR2YW5jZWRUYWJsZUNvbXBvbmVudFxuICB9PigpO1xuXG4gIEBJbnB1dCgpIHB1YmxpYyBzY3JvbGxhYmxlID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIHNlcnZlclNpZGUgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgbGVuZ3RoTWVudSA9IFs1MCwgMTAwLCAyMDAsIDUwMF07XG4gIEBJbnB1dCgpIHB1YmxpYyBwYWdpbmcgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgcGFnZUxlbmd0aCA9IDI1O1xuICBASW5wdXQoKSBwdWJsaWMgY29sdW1uT3JkZXJpbmcgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHN0YXRlU2F2ZSA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgc3RhdGVMb2FkQ2FsbGJhY2s6IChzZXR0aW5nczogYW55LCBjYWxsYmFjazogKHN0YXRlOiBhbnkpID0+IHZvaWQpID0+IHZvaWQ7XG4gIEBJbnB1dCgpIHB1YmxpYyBzdGF0ZVNhdmVDYWxsYmFjazogKHNldHRpbmdzOiBhbnksIHN0YXRlOiBhbnkpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgcHVibGljIHNjcm9sbFkgPSA4MDA7XG4gIEBJbnB1dCgpIHB1YmxpYyBzY3JvbGxYID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcm93IHNlbGVjdGlvbi4gVGhlIGRlZmF1bHIgdmFsdWUgaXMgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RhYmxlID0gZmFsc2U7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGUgbXVsdGlwbGUgc2VsZWN0aW9uLiBUaGUgZGVmYXVsdCB2YWx1ZXMgaXMgdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBtdWx0aXBsZVNlbGVjdCA9IHRydWU7XG4gIC8qKlxuICAgKiBFbmFibGVzIGN1c3RvbSBzZWxlY3Rpb24gYW5kIGhpZGVzIHNlbGVjdCBjb2x1bW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGN1c3RvbVNlbGVjdCA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWQgPSBbXTtcbiAgcHVibGljIHVuc2VsZWN0ZWQgPSBbXTtcbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhIFVSTCB0byBsb2FkIHRhYmxlIGNvbmZpZ3VyYXRpb24gZnJvbVxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGNvbmZpZ1NyYzogc3RyaW5nO1xuICBwdWJsaWMgbGFzdEVycm9yOiBhbnk7XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyB0YWJsZSBjb25maWd1cmF0aW9uXG4gICAqL1xuICBASW5wdXQoJ2NvbmZpZycpXG4gIHB1YmxpYyBzZXQgY29uZmlnKHZhbHVlOiBUYWJsZUNvbmZpZ3VyYXRpb24pIHtcbiAgICB0aGlzLl9jb25maWcgPSB2YWx1ZTtcbiAgICAvLyByYWlzZSBzdWJzY3JpcHRpb25cbiAgICB0aGlzLmNvbmZpZ0NoYW5nZXMubmV4dCh0aGlzLl9jb25maWcpO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25maWcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGFzdFF1ZXJ5VG90YWxJdGVtcygpIHtcbiAgICByZXR1cm4gdGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0YWJsZSBmb290ZXIgd2lsbCBiZSB2aXNpYmxlIG9yIG5vdFxuICAgKi9cbiAgQElucHV0KCdzaG93Rm9vdGVyJylcbiAgcHVibGljIHNldCBzaG93Rm9vdGVyKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5fc2hvd0Zvb3RlciA9IHZhbHVlO1xuICAgIC8vIHNob3cgb3IgaGlkZSBmb290ZXJcbiAgICBpZiAodGhpcy5fZWxlbWVudCAmJiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSAoIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudClcbiAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGVzX2luZm8nKTtcbiAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnZC1ub25lJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hvd0Zvb3RlcigpIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd0Zvb3RlcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0YWJsZSBmb290ZXIgd2lsbCBiZSB2aXNpYmxlIG9yIG5vdFxuICAgKi9cbiAgIEBJbnB1dCgnc2hvd0hlYWRlcicpXG4gICBwdWJsaWMgc2V0IHNob3dIZWFkZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgdGhpcy5fc2hvd0hlYWRlciA9IHZhbHVlO1xuICAgICAvLyBzaG93IG9yIGhpZGUgZm9vdGVyXG4gICAgIGlmICh0aGlzLl9lbGVtZW50ICYmIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgIGNvbnN0IGVsZW1lbnQgPSAoIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudClcbiAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlPnRoZWFkJyk7XG4gICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICAgcmV0dXJuO1xuICAgICAgIH1cbiAgICAgICBjb25zdCBkYXRhVGFibGUgPSAoIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudCkucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZScpO1xuICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcbiAgICAgICAgIC8vIGFkZCB0b3AgbWFyZ2luXG4gICAgICAgICBkYXRhVGFibGUuY2xhc3NMaXN0LnJlbW92ZSgnbXQtMicpO1xuICAgICAgIH0gZWxzZSB7XG4gICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICAgLy8gcmVtb3ZlIHRvcCBtYXJnaW5cbiAgICAgICAgIGRhdGFUYWJsZS5jbGFzc0xpc3QuYWRkKCdtdC0yJyk7XG4gICAgICAgfVxuICAgICB9XG4gICB9XG5cbiAgIHB1YmxpYyBnZXQgc2hvd0hlYWRlcigpIHtcbiAgICAgcmV0dXJuIHRoaXMuX3Nob3dIZWFkZXI7XG4gICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHBhZ2luZyBpbmZvcm1hdGlvbiB3aWxsIGJlIHZpc2libGUgb3Igbm90XG4gICAqL1xuICBASW5wdXQoJ3Nob3dQYWdpbmcnKVxuICBwdWJsaWMgc2V0IHNob3dQYWdpbmcodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93UGFnaW5nID0gdmFsdWU7XG4gICAgLy8gc2hvdyBvciBoaWRlIGZvb3RlclxuICAgIGlmICh0aGlzLl9lbGVtZW50ICYmIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZXNfcGFnaW5hdGUnKTtcbiAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgIGpRdWVyeShlbGVtZW50KS5zaG93KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBqUXVlcnkoZWxlbWVudCkuaGlkZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hvd1BhZ2luZygpIHtcbiAgICByZXR1cm4gdGhpcy5fc2hvd1BhZ2luZztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgYW4gYWN0aXZlIHF1ZXJ5IGZvciB0aGlzIHRhYmxlXG4gICAqL1xuICBASW5wdXQoJ3F1ZXJ5JylcbiAgcHVibGljIHNldCBxdWVyeSh2YWx1ZTogQ2xpZW50RGF0YVF1ZXJ5YWJsZSkge1xuICAgIHRoaXMuX3F1ZXJ5ID0gdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHF1ZXJ5KCkge1xuICAgIHJldHVybiB0aGlzLl9xdWVyeTtcbiAgfVxuXG4gIHB1YmxpYyByZWFkb25seSB0cmFuc2xhdG9yOiBUcmFuc2xhdGVQaXBlO1xuICBwdWJsaWMgZGF0YVRhYmxlOiBhbnk7XG4gIHB1YmxpYyBkdE9wdGlvbnM6IGFueTtcbiAgcHJpdmF0ZSBsYXN0UXVlcnlQYXJhbXM6IERhdGFTZXJ2aWNlUXVlcnlQYXJhbXM7XG4gIHByaXZhdGUgX2xhc3RRdWVyeVRvdGFsSXRlbXMgPSAwO1xuICBwcml2YXRlIHJlbG9hZFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2NvbnRleHQ6IEFuZ3VsYXJEYXRhQ29udGV4dCxcbiAgICAgICAgICAgICAgQEluamVjdChDT0xVTU5fRk9STUFUVEVSUykgcHJpdmF0ZSBfY29sdW1uRm9ybWF0dGVyczogSUFkdmFuY2VkVGFibGVGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICBwcml2YXRlIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyOiBBZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RlbXBsYXRlOiBUZW1wbGF0ZVBpcGUsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2xvYWRpbmc6IExvYWRpbmdTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9odHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIF9jb2x1bW5TZWxlY3RvcjogQ29sdW1uU2VsZWN0b3JTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9jb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZXhwb3J0U3ByZWFkc2hlZXQ6IEV4cG9ydFNwcmVhZHNoZWV0U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2Vycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlKSB7XG4gICAgLy8gaW5pdGlhbGl6ZSB0cmFuc2xhdGUgcGlwZVxuICAgIHRoaXMudHJhbnNsYXRvciA9IG5ldyBUcmFuc2xhdGVQaXBlKHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UsIG5ldyBUYWJsZVRyYW5zbGF0aW9uQ2hhbmdlRGV0ZWN0b3IoKSk7XG4gICAgalF1ZXJ5LmZuLmRhdGFUYWJsZS5leHQuY2xhc3Nlcy5zUGFnZUJ1dHRvbiA9ICdidG4nO1xuICAgIGpRdWVyeS5mbi5kYXRhVGFibGUuZXh0LmNsYXNzZXMuc1BhZ2VCdXR0b25BY3RpdmUgPSAnYnRuIGJ0bi1saWdodCc7XG4gICAgdGhpcy5yZWxvYWRTdWJzY3JpcHRpb24gPSB0aGlzLnJlbG9hZC5zdWJzY3JpYmUoKGRhdGEpID0+IHtcbiAgICAgIHRoaXMuZmV0Y2goKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIHNpbXBsZSBzZWFyY2hcbiAgcHVibGljIHNlYXJjaChzZWFyY2hUZXh0KSB7XG4gICAgdGhpcy5xdWVyeSA9IHRoaXMucXVlcnkgfHwgdGhpcy5fY29udGV4dC5tb2RlbCh0aGlzLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICBpZiAodGhpcy5zZXJ2ZXJTaWRlKSB7XG4gICAgICBpZiAoc2VhcmNoVGV4dCAmJiB0aGlzLmNvbmZpZy5zZWFyY2hFeHByZXNzaW9uKSB7XG4gICAgICAgIC8vIHZhbGlkYXRlIHNlYXJjaCB0ZXh0IGluIGRvdWJsZSBxdW90ZXNcbiAgICAgICAgaWYgKC9eXCIoLio/KVwiJC8udGVzdChzZWFyY2hUZXh0KSkge1xuICAgICAgICAgIHRoaXMucXVlcnkuc2V0UGFyYW0oJyRmaWx0ZXInLFxuICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGUudHJhbnNmb3JtKHRoaXMuY29uZmlnLnNlYXJjaEV4cHJlc3Npb24sIHtcbiAgICAgICAgICAgICAgdGV4dDogc2VhcmNoVGV4dC5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB0cnkgdG8gc3BsaXQgd29yZHNcbiAgICAgICAgICBjb25zdCB3b3JkcyA9IHNlYXJjaFRleHQuc3BsaXQoJyAnKTtcbiAgICAgICAgICAvLyBqb2luIHdvcmRzIHRvIGEgc2luZ2xlIGZpbHRlclxuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IHdvcmRzLm1hcCgod29yZCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlLnRyYW5zZm9ybSh0aGlzLmNvbmZpZy5zZWFyY2hFeHByZXNzaW9uLCB7XG4gICAgICAgICAgICAgIHRleHQ6IHdvcmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9KS5qb2luKCcgYW5kICcpO1xuICAgICAgICAgIC8vIHNldCBmaWx0ZXJcbiAgICAgICAgICB0aGlzLnF1ZXJ5LnNldFBhcmFtKCckZmlsdGVyJywgZmlsdGVyKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gY2xlYXIgZmlsdGVyXG4gICAgICAgIHRoaXMucXVlcnkuc2V0UGFyYW0oJyRmaWx0ZXInLCBudWxsKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2ZpcnN0TG9hZCA9IGZhbHNlO1xuICAgICAgdGhpcy5kYXRhVGFibGUuZHJhdygpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBlbnN1cmUgZW1wdHkgdGFibGUgbGF5b3V0XG4gICAgICB0aGlzLnJlc2V0RW1wdHlUYWJsZSgpO1xuICAgICAgLy8gc2VhcmNoIGxvY2FsbHlcbiAgICAgIHRoaXMuZGF0YVRhYmxlLnNlYXJjaChzZWFyY2hUZXh0LnRyaW0oKSkuZHJhdygpO1xuICAgICAgLy8gZ2V0IGluZGV4ZXMgb2YgZmlsdGVyZWQgcm93c1xuICAgICAgY29uc3QgaW5kZXhlcyA9IEFycmF5LmZyb20odGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5haURpc3BsYXkpO1xuICAgICAgLy8gc2V0IHJlY29yZHNGaWx0ZXJlZFxuICAgICAgY29uc3QgcmVjb3Jkc0ZpbHRlcmVkID0gaW5kZXhlcy5sZW5ndGg7XG4gICAgICAvLyBzZXQgcmVjb3Jkc1RvdGFsXG4gICAgICBjb25zdCByZWNvcmRzVG90YWwgPSBpbmRleGVzLmxlbmd0aDtcbiAgICAgIC8vIHJldHJpZXZlIGRhdGEgZnJvbSBpbmRleGVzXG4gICAgICBjb25zdCByb3dzID0gQXJyYXkuZnJvbSh0aGlzLmRhdGFUYWJsZS5yb3dzKCkuZGF0YSgpKTtcbiAgICAgIGNvbnN0IGRhdGEgPSBpbmRleGVzLm1hcChpbmRleCA9PiByb3dzWzxudW1iZXI+aW5kZXhdKTtcbiAgICAgIC8vIGVtaXQgcmVzdWx0cyB0byBsb2FkIG91dHB1dFxuICAgICAgdGhpcy5sb2FkLmVtaXQoe1xuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IHJlY29yZHNGaWx0ZXJlZCxcbiAgICAgICAgcmVjb3Jkc1RvdGFsOiByZWNvcmRzVG90YWxcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmZXRjaChjbGVhclNlbGVjdGVkPzogYm9vbGVhbikge1xuICAgIC8vIGlmIGRhdGEgdGFibGUgaXMgbnVsbFxuICAgIGlmICh0aGlzLmRhdGFUYWJsZSA9PSBudWxsKSB7XG4gICAgICAvLyBpbml0aWFsaXplIGRhdGEgdGFibGVcbiAgICAgIHJldHVybiB0aGlzLm5nT25Jbml0KCk7XG4gICAgfVxuICAgIC8vIGNsZWFyIHNlbGVjdGlvbiBpZiBwYXJhbWV0ZXIgaXMgbm90IGRlY2xhcmVkIG9yIGl0J3MgdHJ1ZVxuICAgIGlmIChjbGVhclNlbGVjdGVkID09IG51bGwgfHwgY2xlYXJTZWxlY3RlZCA9PT0gdHJ1ZSkge1xuICAgICAgLy8gc2V0IHNtYXJ0IHNlbGVjdCB0byBmYWxzZVxuICAgICAgdGhpcy5zbWFydFNlbGVjdCA9IGZhbHNlO1xuICAgICAgLy8gY2xlYXIgc2VsZWN0ZWQgaXRlbXNcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnNlbGVjdGVkLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICAvLyBjbGVhciB1bnNlbGVjdGVkIGl0ZW1zXG4gICAgICBpZiAodGhpcy51bnNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnVuc2VsZWN0ZWQuc3BsaWNlKDAsIHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBvdGhlcndpc2UgbG9hZCBkYXRhIG9ubHlcbiAgICB0aGlzLmRhdGFUYWJsZS5kcmF3KCk7XG4gIH1cblxuICBwdWJsaWMgZGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMuX2ZpcnN0TG9hZCA9IHRydWU7XG4gICAgICBqUXVlcnkodGhpcy50YWJsZS5uYXRpdmVFbGVtZW50KS5lbXB0eSgpO1xuICAgICAgdGhpcy5kYXRhVGFibGUgPSBudWxsO1xuICAgICAgLy8gY2xlYXIgc2VsZWN0ZWQgaXRlbXNcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnNlbGVjdGVkLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICAvLyBjbGVhciB1bnNlbGVjdGVkIGl0ZW1zXG4gICAgICBpZiAodGhpcy51bnNlbGVjdGVkLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnVuc2VsZWN0ZWQuc3BsaWNlKDAsIHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgLy8gc2V0IHNtYXJ0IHNlbGVjdCB0byBmYWxzZVxuICAgICAgdGhpcy5zbWFydFNlbGVjdCA9IGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgZGF0YSByb3dcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RSb3cocm93OiBhbnksIHNpbGVudD86IGJvb2xlYW4pIHtcbiAgICBpZiAocm93KSB7XG4gICAgICAvLyBnZXQgcm93XG4gICAgICBjb25zdCByb3dOb2RlID0gcm93Lm5vZGUoKTtcbiAgICAgIC8vIGlmIG11bHRpcGxlIHNlbGVjdCBpcyBmYWxzZVxuICAgICAgaWYgKHRoaXMubXVsdGlwbGVTZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGlmICh0aGlzLmN1c3RvbVNlbGVjdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAvLyBlbnVtZXJhdGUgcm93XG4gICAgICAgICAgdGhpcy5kYXRhVGFibGUucm93cygpLm5vZGVzKCkuZWFjaCgobm9kZTogYW55KSA9PiB7XG4gICAgICAgICAgICBpZiAobm9kZSAhPT0gcm93Tm9kZSkge1xuICAgICAgICAgICAgICBqUXVlcnkobm9kZSkuZmluZCgnOmNoZWNrYm94JykucHJvcCgnY2hlY2tlZCcsIGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmRhdGFUYWJsZS5yb3dzKCcuc2VsZWN0ZWQnKS5ub2RlcygpLmVhY2goKG5vZGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUgIT09IHJvd05vZGUpIHtcbiAgICAgICAgICAgICAgalF1ZXJ5KG5vZGUpLnJlbW92ZUNsYXNzKCdzZWxlY3RlZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIGNsZWFyIHNlbGVjdGVkXG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuc3BsaWNlKDAsIHRoaXMuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIC8vIGlmIGN1c3RvbSBzZWxlY3QgbW9kZSBpcyBvZmZcbiAgICAgIGlmICh0aGlzLmN1c3RvbVNlbGVjdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgalF1ZXJ5KHJvd05vZGUpLmZpbmQoJzpjaGVja2JveCcpLnByb3AoJ2NoZWNrZWQnLCB0cnVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSBhZGQgY2xhc3NcbiAgICAgICAgalF1ZXJ5KHJvdy5ub2RlKCkpLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IHJvdyBkYXRhXG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ubmFtZTtcbiAgICAgIGNvbnN0IGRhdGEgPSByb3cuZGF0YSgpO1xuICAgICAgLy8gc2VhcmNoIHNlbGVjdGVkIGl0ZW1zXG4gICAgICBsZXQgZmluZEluZGV4ID0gdGhpcy5zZWxlY3RlZC5maW5kSW5kZXgoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHhba2V5XSA9PT0gZGF0YVtrZXldO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmluZEluZGV4ID49IDApIHtcbiAgICAgICAgLy8gcmVtb3ZlIHByZXZpb3VzbHkgc2VsZWN0ZWQgcm93XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuc3BsaWNlKGZpbmRJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICB0aGlzLnNlbGVjdGVkLnB1c2goZGF0YSk7XG4gICAgICAvLyB2YWxpZGF0ZSB1bnNlbGVjdGVkIGRhdGFcbiAgICAgIGZpbmRJbmRleCA9IHRoaXMudW5zZWxlY3RlZC5maW5kSW5kZXgoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHhba2V5XSA9PT0gZGF0YVtrZXldO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmluZEluZGV4ID49IDApIHtcbiAgICAgICAgLy8gcmVtb3ZlIHByZXZpb3VzbHkgc2VsZWN0ZWQgcm93XG4gICAgICAgIHRoaXMudW5zZWxlY3RlZC5zcGxpY2UoZmluZEluZGV4LCAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVuc2VsZWN0cyB0aGUgc3BlY2lmaWVkIGRhdGEgcm93IGlmIGl0J3Mgc2VsZWN0ZWRcbiAgICovXG4gIHB1YmxpYyB1blNlbGVjdFJvdyhyb3c6IGFueSwgc2lsZW50PzogYm9vbGVhbikge1xuICAgIGlmIChyb3cpIHtcbiAgICAgIC8vIGlmIGN1c3RvbSBzZWxlY3QgbW9kZSBpcyBvZmZcbiAgICAgIGlmICh0aGlzLmN1c3RvbVNlbGVjdCA9PT0gZmFsc2UpIHtcbiAgICAgICAgalF1ZXJ5KHJvdy5ub2RlKCkpLmZpbmQoJzpjaGVja2JveCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UgYWRkIGNsYXNzXG4gICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGdldCBmaXJzdCBjb2x1bW4ga2V5XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ubmFtZTtcbiAgICAgIGNvbnN0IGRhdGEgPSByb3cuZGF0YSgpO1xuICAgICAgY29uc3QgaWQgPSBkYXRhW2tleV07XG4gICAgICBsZXQgZmluZEluZGV4ID0gdGhpcy5zZWxlY3RlZC5maW5kSW5kZXgoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHhba2V5XSA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChmaW5kSW5kZXggPj0gMCkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZShmaW5kSW5kZXgsIDEpO1xuICAgICAgICBpZiAodGhpcy5zbWFydFNlbGVjdCkge1xuICAgICAgICAgIC8vIGFkZCB0aGlzIHJvdyB0byB1bnNlbGVjdGVkIHJvd3NcbiAgICAgICAgICBmaW5kSW5kZXggPSB0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geFtrZXldID09PSBpZDtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoZmluZEluZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhpcy51bnNlbGVjdGVkLnB1c2goZGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzaWxlbnQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdEFueSgpIHtcbiAgICBpZiAodGhpcy5kYXRhVGFibGUgJiYgdGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAvLyBzZXQgc21hcnQgc2VsZWN0IGZsYWdcbiAgICAgIHRoaXMuc21hcnRTZWxlY3QgPSB0cnVlO1xuICAgICAgLy8gc2VsZWN0IGFueSByb3dcbiAgICAgIHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5ldmVyeSgoaW5kZXg6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3coIGluZGV4ICk7XG4gICAgICAgIHRoaXMuc2VsZWN0Um93KHJvdywgdHJ1ZSk7XG4gICAgICB9KTtcbiAgICAgIC8vIGVtaXQgc2VsZWN0aW9uIGV2ZW50XG4gICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZW1pdCh0aGlzLnNlbGVjdGVkKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0Tm9uZSgpIHtcbiAgICBpZiAodGhpcy5kYXRhVGFibGUgJiYgdGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAvLyBzZXQgc21hcnQgc2VsZWN0IGZsYWdcbiAgICAgIHRoaXMuc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgICAgIHRoaXMudW5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy51bnNlbGVjdGVkLmxlbmd0aCk7XG4gICAgICAvLyBzZWxlY3QgYW55IHJvd1xuICAgICAgdGhpcy5kYXRhVGFibGUucm93cygpLmV2ZXJ5KChpbmRleDogYW55KSA9PiB7XG4gICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuZGF0YVRhYmxlLnJvdyggaW5kZXggKTtcbiAgICAgICAgdGhpcy51blNlbGVjdFJvdyhyb3csIHRydWUpO1xuICAgICAgfSk7XG4gICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnNlbGVjdGVkLmxlbmd0aCk7XG4gICAgICAvLyBlbWl0IHNlbGVjdGlvbiBldmVudFxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHRvZ2dsZVNlbGVjdFJvdyhyb3c6IGFueSkge1xuICAgIGlmIChyb3cpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSByb3cuZGF0YSgpO1xuICAgICAgLy8gZ2V0IGZpcnN0IGNvbHVtbiBrZXlcbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ucHJvcGVydHkgfHwgdGhpcy5jb25maWcuY29sdW1uc1swXS5uYW1lO1xuICAgICAgLy8gZ2V0IGlkXG4gICAgICBjb25zdCBpZCA9IGRhdGFba2V5XTtcbiAgICAgIC8vIGZpbmQgaWYgcm93IGlzIHNlbGVjdGVkXG4gICAgICBjb25zdCBmaW5kSW5kZXggPSB0aGlzLnNlbGVjdGVkLmZpbmQoKHgpID0+IHtcbiAgICAgICAgcmV0dXJuIHhba2V5XSA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIC8vIGlmIHJvdyBpcyBzZWxlY3RlZFxuICAgICAgaWYgKGZpbmRJbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIHVuc2VsZWN0XG4gICAgICAgIHRoaXMudW5TZWxlY3RSb3cocm93KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuc2VsZWN0Um93KHJvdyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gbm9pbnNwZWN0aW9uIEpTTWV0aG9kQ2FuQmVTdGF0aWNcbiAgLyoqXG4gICAqIERhdGF0YWJsZXMgY29sdW1uIHJlbmRlcmVyIGZvciBzZWxlY3QgY2hlY2tib3hcbiAgICogQHBhcmFtIGRhdGFcbiAgICogQHBhcmFtIHR5cGVcbiAgICogQHBhcmFtIHJvd1xuICAgKiBAcGFyYW0gbWV0YVxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfcmVuZGVyU2VsZWN0KGRhdGEsIHR5cGUsIHJvdywgbWV0YSkge1xuICAgIC8vIGdldCBjb2x1bW5cbiAgICBjb25zdCBjb2x1bW4gPSBtZXRhLnNldHRpbmdzLmFvQ29sdW1uc1ttZXRhLmNvbF07XG4gICAgaWYgKHR5cGVvZiBjb2x1bW4uc2VsZWN0VGVtcGxhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uLCB7XG4gICAgICAgIHNlbGVjdFRlbXBsYXRlOiB0ZW1wbGF0ZShgPGlucHV0IGNsYXNzPVwiY2hlY2tib3ggY2hlY2tib3gtdGhlbWUgcy1yb3dcIiB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICBpZD1cInMtJHt0aGlzLl9pZH0tXFwke21ldGEucm93fVwiIGRhdGEtaWQ9XCJcXCR7ZGF0YX1cIiAvPjxsYWJlbCBmb3I9XCJzLSR7dGhpcy5faWR9LVxcJHttZXRhLnJvd31cIj4mbmJzcDs8L2xhYmVsPlxuICAgICAgICBgKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvLyByZW5kZXIgdGVtcGxhdGVcbiAgICByZXR1cm4gY29sdW1uLnNlbGVjdFRlbXBsYXRlKHtcbiAgICAgIG1ldGEsXG4gICAgICBkYXRhLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG5nT25Jbml0KCkge1xuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgdGhpcy5sb2FkaW5nLmVtaXQoe1xuICAgICAgICB0YXJnZXQ6IHRoaXNcbiAgICAgIH0pO1xuICAgICAgLy8gcGFyc2UgcHJvcGVydGllc1xuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNvbmZpZywgJ3NlbGVjdGFibGUnKSkge1xuICAgICAgICB0aGlzLnNlbGVjdGFibGUgPSB0aGlzLmNvbmZpZy5zZWxlY3RhYmxlO1xuICAgICAgfVxuICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmNvbmZpZywgJ211bHRpcGxlU2VsZWN0JykpIHtcbiAgICAgICAgdGhpcy5tdWx0aXBsZVNlbGVjdCA9IHRoaXMuY29uZmlnLm11bHRpcGxlU2VsZWN0O1xuICAgICAgfVxuICAgICAgLy8gcHJlcGFyZSBjb25maWd1cmF0aW9uIGZvciBjb2x1bW5zXG4gICAgICBjb25zdCB0YWJsZUNvbHVtbnMgPSB0aGlzLmNvbmZpZy5jb2x1bW5zXG4gICAgICAgIC8vIGZpbHRlciBhY3Rpb24gbGluayBjb2x1bW5cbiAgICAgICAgLmZpbHRlcigoY29sdW1uKSA9PiB7XG4gICAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXR0ZXIgJiYgY29sdW1uLmZvcm1hdHRlciA9PT0gJ0FjdGlvbkxpbmtGb3JtYXR0ZXInICYmIHRoaXMuc2hvd0FjdGlvbnMgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9KS5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgIC8vIGNvbnZlcnQgY29sdW1uIHRvIGFkdmFuY2UgdGFibGUgY29sdW1uXG4gICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IENvbHVtbkZvcm1hdHRlcih0aGlzLl9pbmplY3RvciksIGNvbHVtbik7XG4gICAgICAgIH0pLm1hcCgoY29sdW1uKSA9PiB7XG4gICAgICAgICAgY29uc3QgY29sdW1uRGVmaW5pdGlvbiA9IHtcbiAgICAgICAgICAgIGRhdGE6IGNvbHVtbi5wcm9wZXJ0eSB8fCBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgIGRlZmF1bHRDb250ZW50OiBjb2x1bW4uaGFzT3duUHJvcGVydHkoJ2RlZmF1bHRDb250ZW50JykgPyBjb2x1bW4uZGVmYXVsdENvbnRlbnQgOiAnJyxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0b3IudHJhbnNmb3JtKGNvbHVtbi50aXRsZSksXG4gICAgICAgICAgICBzb3J0YWJsZTogY29sdW1uLmhhc093blByb3BlcnR5KCdzb3J0YWJsZScpID8gY29sdW1uLnNvcnRhYmxlIDogdHJ1ZSxcbiAgICAgICAgICAgIHZpc2libGU6IGNvbHVtbi5oYXNPd25Qcm9wZXJ0eSgnaGlkZGVuJykgPyAhY29sdW1uLmhpZGRlbiA6IHRydWUsXG4gICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGNvbHVtbi5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6IGNvbHVtbi5jbGFzc05hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29sdW1uLmZvcm1hdHRlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gZGF0YTtcbiAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0dGVycy5mb3JFYWNoKChjb2x1bW5Gb3JtYXR0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHNlbGYuX2NvbHVtbkZvcm1hdHRlcnNbY29sdW1uRm9ybWF0dGVyLmZvcm1hdHRlcl07XG4gICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0dGVyICYmIHR5cGVvZiBmb3JtYXR0ZXIucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXRTdHJpbmcgPSBjb2x1bW5Gb3JtYXR0ZXIuZm9ybWF0U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICBjb2x1bW4uZm9ybWF0T3B0aW9ucyA9IGNvbHVtbkZvcm1hdHRlci5mb3JtYXRPcHRpb25zO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZm9ybWF0dGVyLnJlbmRlci5iaW5kKGNvbHVtbikocmVzdWx0LCB0eXBlLCByb3csIG1ldGEpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW4uZm9ybWF0U3RyaW5nO1xuICAgICAgICAgICAgICAgIGRlbGV0ZSBjb2x1bW4uZm9ybWF0T3B0aW9ucztcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAvLyBjaGVjayBpZiBjb2x1bW4gZm9ybWF0dGVycyBleHBvcnQgY3JlYXRlZENlbGwgZXZlbnRcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gY29sdW1uLmZvcm1hdHRlcnMuZmlsdGVyKChjb2x1bW5Gb3JtYXR0ZXIpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZW9mIGNvbHVtbkZvcm1hdHRlci5hZnRlclJlbmRlciA9PT0gJ2Z1bmN0aW9uJztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgICAgY3JlYXRlZENlbGwoY2VsbDogYW55LCBjZWxsRGF0YTogYW55LCByb3dEYXRhOiBhbnksIHJvd0luZGV4OiBudW1iZXIsIGNvbEluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goKGNvbHVtbkZvcm1hdHRlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZXIgPSBzZWxmLl9jb2x1bW5Gb3JtYXR0ZXJzW2NvbHVtbkZvcm1hdHRlci5mb3JtYXR0ZXJdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0dGVyICYmIHR5cGVvZiBmb3JtYXR0ZXIuYWZ0ZXJSZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZXIuYWZ0ZXJSZW5kZXIuYmluZChjb2x1bW4pKGNlbGwsIGNlbGxEYXRhLCByb3dEYXRhLCByb3dJbmRleCwgY29sSW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXR0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHNlbGYuX2NvbHVtbkZvcm1hdHRlcnNbY29sdW1uLmZvcm1hdHRlcl07XG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVyICYmIHR5cGVvZiBmb3JtYXR0ZXIucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgIHJlbmRlcjogZm9ybWF0dGVyLnJlbmRlci5iaW5kKGNvbHVtbiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLmFmdGVyUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgIHJlbmRlcjogZm9ybWF0dGVyLnJlbmRlci5iaW5kKGNvbHVtbiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVkQ2VsbDogZm9ybWF0dGVyLmFmdGVyUmVuZGVyLmJpbmQoY29sdW1uKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBjb2x1bW5EZWZpbml0aW9uO1xuICAgICAgICB9KTtcbiAgICAgIC8vIGdldCB0YWJsZSBlbGVtZW50XG4gICAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSBqUXVlcnkodGhpcy50YWJsZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCAoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGUuY29sdW1ucy5hZGp1c3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEpO1xuICAgICAgfSk7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXNoYWRvd2VkLXZhcmlhYmxlXG4gICAgICB0YWJsZUVsZW1lbnQub24oJ3Byb2Nlc3NpbmcuZHQnLCAoZXZlbnQsIHNldHRpbmdzLCBwcm9jZXNzaW5nKSA9PiB7XG4gICAgICAgIGlmIChwcm9jZXNzaW5nKSB7XG4gICAgICAgICAgLy8gY2xlYXIgZW1wdHkgdGFibGUgZWxlbWVudFxuICAgICAgICAgIHRhYmxlRWxlbWVudC5maW5kKCcuZGF0YVRhYmxlc19lbXB0eScpLmh0bWwoJycpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGFibGVFbGVtZW50LmFkZENsYXNzKCdwcm9jZXNzaW5nJyk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0YWJsZUVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3Byb2Nlc3NpbmcnKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgZHJhd0luZGV4ID0gMTtcbiAgICAgIHRhYmxlRWxlbWVudC5vbignb3JkZXIuZHQnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgICAgICBjb25zdCBvcmRlciA9IHRoaXMuZGF0YVRhYmxlLm9yZGVyKCk7XG4gICAgICAgICAgY29uc3QgY29sdW1ucyA9IHRhYmxlQ29sdW1ucztcbiAgICAgICAgICBpZiAob3JkZXIgJiYgb3JkZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm9yZGVyLmVtaXQob3JkZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkub24oJ2RyYXcuZHQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5kcmF3LmVtaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICAgICAgY29uc3QgaW5mbzogeyBwYWdlOiBudW1iZXI7IHBhZ2VzOiBudW1iZXIgfSA9IHRoaXMuZGF0YVRhYmxlLnBhZ2UuaW5mbygpO1xuICAgICAgICAgIHRoaXMucGFnZS5lbWl0KGluZm8pO1xuICAgICAgICAgIGlmKGRyYXdJbmRleCA+IDEpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgZHJhd0luZGV4Kys7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHt0aGlzLmRhdGFUYWJsZS5jb2x1bW5zLmFkanVzdCgpO30sIDEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRVJST1InLCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWRqdXN0aW5nIHRhYmxlIGNvbHVtbnMnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBhbGxvdyBzZWxlY3Rpb25cbiAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgICAgLy8gZ2V0IGZpcnN0IGNvbHVtbiAoYXMgcm93IHByaW1hcnkga2V5KVxuICAgICAgICAvLyB0b2RvOjphbGxvdyByb3cgcHJpbWFyeSBrZXkgY29uZmlndXJhdGlvblxuICAgICAgICBjb25zdCBmaXJzdENvbHVtbiA9IHRoaXMuY29uZmlnLmNvbHVtbnNbMF07XG4gICAgICAgIC8vIGFkZCBzZWxlY3QgY29sdW1uXG4gICAgICAgIGNvbnN0IHNlbGVjdENvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAndGV4dC1jZW50ZXIgcGwtNCBwci0wJyxcbiAgICAgICAgICBkYXRhOiBmaXJzdENvbHVtbi5wcm9wZXJ0eSB8fCBmaXJzdENvbHVtbi5uYW1lLFxuICAgICAgICAgIGRlZmF1bHRDb250ZW50OiAnJyxcbiAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZpc2libGU6ICF0aGlzLmN1c3RvbVNlbGVjdCxcbiAgICAgICAgICBuYW1lOiBmaXJzdENvbHVtbi5uYW1lLFxuICAgICAgICB9O1xuICAgICAgICAvLyBhc3NpZ24gcmVuZGVyZXJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxlY3RDb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgcmVuZGVyOiB0aGlzLl9yZW5kZXJTZWxlY3QuYmluZCh0aGlzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFuZCBmaW5hbGx5IGFkZCBjb2x1bW5cbiAgICAgICAgdGFibGVDb2x1bW5zLnVuc2hpZnQoc2VsZWN0Q29sdW1uRGVmaW5pdGlvbik7XG4gICAgICAgIC8vIHVzZXIgaW50ZXJmYWNlIGFkZGl0aW9uc1xuICAgICAgICAvLyBoYW5kbGUgcGFnZSBjaGFuZ2UgZXZlbnQgKGEgdHJpY2sgZm9yIGZpcmluZyBkcmF3LmR0IGV2ZW50cylcbiAgICAgICAgdGFibGVFbGVtZW50XG4gICAgICAgICAgLy8gaGFuZGxlIGRyYXcgZXZlbnRzXG4gICAgICAgICAgLm9uKCdkcmF3LmR0JywgKCkgPT4ge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QpIHtcbiAgICAgICAgICAgICAgLy8gZW5hYmxlIHJvdyBzZWxlY3Rpb24gZXZlbnRcbiAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoJ3Rib2R5Jykub24oJ2NsaWNrJywgJ3RyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0IHJvd1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHNlbGYuZGF0YVRhYmxlLnJvdyh0aGlzKTtcbiAgICAgICAgICAgICAgICAvLyBhZGQgcm93XG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3QuZW1pdChyb3cpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFibGVFbGVtZW50LmZpbmQoJ2lucHV0LnMtcm93Jyk7XG4gICAgICAgICAgICBlbGVtZW50cy5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIC8vIG1ha2Ugc2VsZWN0aW9uIG9uIGN1cnJlbnQgcGFnZVxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gZW51bWVyYXRlIHNlbGVjdGVkIGl0ZW1zXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGZpbmQgcm93IGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1ba2V5XTtcbiAgICAgICAgICAgICAgICAvLyBpZiBpZGVudGlmaWVyIGlzIGRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgY2hlY2sgZWxlbWVudCB3aXRoIHRoaXMgaWRlbnRpZmllciBpbiBhdHRyaWJ1dGUgZGF0YS1pZFxuICAgICAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoYGlucHV0W2RhdGEtaWQ9JyR7aWR9J11gKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNtYXJ0U2VsZWN0KSB7XG4gICAgICAgICAgICAgIC8vIHNlbGVjdCByb3dzIHRoYXQgYXJlIG5vdCBzZWxlY3RlZFxuICAgICAgICAgICAgICAvLyBhbmQgZG8gbm90IGluY2x1ZGVkIGluIHVuc2VsZWN0ZWQgY29sbGVjdGlvblxuICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQuZmluZCgnaW5wdXRbZGF0YS1pZF0nKS5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGdldCBkYXRhIGlkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5maW5kSW5kZXgoKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG4gICAgICAgICAgICAgICAgICByZXR1cm4geFtrZXldID09IGpRdWVyeShlbGVtZW50KS5hdHRyKCdkYXRhLWlkJyk7XG4gICAgICAgICAgICAgICAgfSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyh0aGlzLmRhdGFUYWJsZS5yb3coaW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQuZmluZCgnaW5wdXRbZGF0YS1pZF0nKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gaW5pdGlhbGl6ZSBkYXRhIHRhYmxlXG4gICAgICBjb25zdCBzZXR0aW5ncyA9IHtcbiAgICAgICAgLy8gc2V0IGxlbmd0aCBtZW51XG4gICAgICAgIGxlbmd0aE1lbnU6IFs1LCAxMCwgNTAsIDEwMCwgMjAwLCA1MDBdLFxuICAgICAgICAvLyBoaWRlIGxlbmd0aCBtZW51XG4gICAgICAgIGxlbmd0aENoYW5nZTogZmFsc2UsXG4gICAgICAgIC8vIGVuYWJsZSBzZWFyY2ggYnV0IGhpZGUgc2VhcmNoIGJveCAoY3NzKVxuICAgICAgICBzZWFyY2hpbmc6IHRydWUsXG4gICAgICAgIC8vIGVuYWJsZSBkYXRhIHByb2Nlc3NpbmdcbiAgICAgICAgcHJvY2Vzc2luZzogdHJ1ZSxcbiAgICAgICAgLy8gZW5hYmxlIGdldHRpbmcgc2VydmVyIHNpZGUgZGF0YVxuICAgICAgICBzZXJ2ZXJTaWRlOiB0aGlzLnNlcnZlclNpZGUsXG4gICAgICAgIC8vIGVudW1lcmF0ZSB0YWJsZSBjb2x1bW5zXG4gICAgICAgIGNvbHVtbnM6IHRhYmxlQ29sdW1ucyxcbiAgICAgICAgY29sUmVvcmRlcjogIHRoaXMuY29sdW1uT3JkZXJpbmcsXG4gICAgICAgIG9yZGVyOiBbXSxcbiAgICAgICAgLy8gc2V0IHNjcm9sbCB4XG4gICAgICAgIHNjcm9sbFg6IHRoaXMuc2Nyb2xsWCxcbiAgICAgICAgZG9tOiAnQmZydGlwJyxcbiAgICAgICAgYXV0b1dpZHRoOiBmYWxzZSxcbiAgICAgICAgYnV0dG9uczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGV4dGVuZDogJ2V4Y2VsJyxcbiAgICAgICAgICAgIGZpbGVuYW1lOiB0aGlzLmNvbmZpZy50aXRsZSxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogJ2Qtbm9uZScsXG4gICAgICAgICAgICBleHBvcnRPcHRpb25zOiB7XG4gICAgICAgICAgICAgIGNvbHVtbnM6ICd0aDpub3QoOmZpcnN0LWNoaWxkKScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICAgIC8vIGRlZmluZSBzZXJ2ZXIgZGF0YSBjYWxsYmFja1xuICAgICAgICBmblNlcnZlckRhdGEoc1NvdXJjZTogYW55LCBhb0RhdGE6IGFueSwgZm5DYWxsYmFjazogYW55LCBvU2V0dGluZ3M6IGFueSkge1xuICAgICAgICAgIC8vIGlmIG1ldGhvZCBpcyBpbnZva2VkIGZvciB0aGUgZmlyc3QgdGltZVxuICAgICAgICAgIGlmIChzZWxmLl9maXJzdExvYWQpIHtcbiAgICAgICAgICAgIC8vIGRpc2FibGVkIGZpcnN0IGxvYWQgZmxhZ1xuICAgICAgICAgICAgc2VsZi5fZmlyc3RMb2FkID0gZmFsc2U7XG4gICAgICAgICAgICAvLyBpZiBhdXRvIGxvYWQgaXMgZGlzYWJsZWRcbiAgICAgICAgICAgIGlmIChzZWxmLmF1dG9Mb2FkID09PSBmYWxzZSkge1xuICAgICAgICAgICAgICBjb25zdCBlbXB0eURhdGFTZXQgPSB7XG4gICAgICAgICAgICAgICAgcmVjb3Jkc1RvdGFsOiAwLFxuICAgICAgICAgICAgICAgIHJlY29yZHNGaWx0ZXJlZDogMCxcbiAgICAgICAgICAgICAgICBkYXRhOiBbXSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgc2VsZi5fbGFzdFF1ZXJ5VG90YWxJdGVtcyA9IDA7XG4gICAgICAgICAgICAgIC8vIGVtaXQgZW1wdHkgZGF0YVxuICAgICAgICAgICAgICBzZWxmLmxvYWQuZW1pdChlbXB0eURhdGFTZXQpO1xuICAgICAgICAgICAgICAvLyByZXR1cm4gZW1wdHkgZGF0YVxuICAgICAgICAgICAgICByZXR1cm4gZm5DYWxsYmFjayhlbXB0eURhdGFTZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyByZXNldCBlcnJvclxuICAgICAgICAgIHNlbGYudG9nZ2xlRXJyb3IoKTtcbiAgICAgICAgICAvLyBnZXQgYWN0aXZhdGVkIHJvdXRlIHBhcmFtc1xuICAgICAgICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gc2VsZi5fYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXM7XG4gICAgICAgICAgLy8gZ2V0IGNvbHVtbnNcbiAgICAgICAgICBjb25zdCBjb2x1bW5zID0gYW9EYXRhWzFdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBvcmRlciBleHByZXNzaW9uXG4gICAgICAgICAgY29uc3Qgb3JkZXIgPSBhb0RhdGFbMl0udmFsdWU7XG4gICAgICAgICAgLy8gZ2V0IHNraXAgcmVjb3JkcyBwYXJhbVxuICAgICAgICAgIGxldCBza2lwID0gYW9EYXRhWzNdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBwYWdlIHNpemUgcGFyYW1cbiAgICAgICAgICBsZXQgdG9wID0gYW9EYXRhWzRdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBzZWFyY2ggdmFsdWVcbiAgICAgICAgICBjb25zdCBzZWFyY2ggPSBhb0RhdGFbNV0udmFsdWU7XG4gICAgICAgICAgLy8gZ2V0IGRhdGEgcXVlcnlhYmxlXG4gICAgICAgICAgY29uc3QgcSA9IHNlbGYuX3F1ZXJ5IGluc3RhbmNlb2YgQ2xpZW50RGF0YVF1ZXJ5YWJsZSA/IHNlbGYuX3F1ZXJ5IDogc2VsZi5fY29udGV4dC5tb2RlbChzZWxmLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICAgICAgICAvLyBhcHBseSBwYWdpbmcgcGFyYW1zXG4gICAgICAgICAgaWYgKHRvcCkge1xuICAgICAgICAgICAgcS50YWtlKHRvcCkuc2tpcChza2lwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gYXBwbHkgb3JkZXIgcGFyYW1zXG4gICAgICAgICAgaWYgKG9yZGVyICYmIG9yZGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gZ2V0IG9yZGVyIHF1ZXJ5IGV4cHJlc3Npb25cbiAgICAgICAgICAgIGNvbnN0IG9yZGVyQnlTdHIgPSBvcmRlci5tYXAoKGV4cHI6IGFueSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gdGFibGVDb2x1bW5zW2V4cHIuY29sdW1uXS5uYW1lICsgJyAnICsgZXhwci5kaXIgfHwgJ2FzYyc7XG4gICAgICAgICAgICB9KS5qb2luKCcsJyk7XG4gICAgICAgICAgICAvLyBzZXQgb3JkZXJcbiAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRvcmRlcmJ5Jywgb3JkZXJCeVN0cik7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGNvbmZpZ3VyZSAkc2VsZWN0IHBhcmFtZXRlclxuICAgICAgICAgIGNvbnN0IHNlbGVjdCA9IHNlbGYuY29uZmlnLmNvbHVtbnMuZmlsdGVyKCAoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIGNvbHVtbi52aXJ0dWFsID09PSB0cnVlICkge1xuICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9KS5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvbHVtbi5wcm9wZXJ0eSkge1xuICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLm5hbWUgKyAnIGFzICcgKyBjb2x1bW4ucHJvcGVydHk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gY29sdW1uLm5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcS5zZWxlY3QuYXBwbHkocSwgc2VsZWN0KTtcbiAgICAgICAgICAvLyBjb25maWd1cmUgJGZpbHRlclxuICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy4kZmlsdGVyICYmIHF1ZXJ5UGFyYW1zLiRmaWx0ZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBzZXQgcm91dGUgZmlsdGVyXG4gICAgICAgICAgICBjb25zdCBxUGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRmaWx0ZXInLCBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gWyBxdWVyeVBhcmFtcy4kZmlsdGVyIF07XG4gICAgICAgICAgICBpZiAocVBhcmFtcy4kZmlsdGVyKSB7IGV4cHJlc3Npb25zLnB1c2goJygnICsgcVBhcmFtcy4kZmlsdGVyICsgJyknICk7IH1cbiAgICAgICAgICAgIHEuZmlsdGVyKGV4cHJlc3Npb25zLmpvaW4oJyBhbmQgJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBjaGVjayBpZiBxdWVyeSBwYXJhbWV0ZXJzIGNvbnRhaW4gZmlsdGVyXG4gICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLiRleHBhbmQgJiYgcXVlcnlQYXJhbXMuJGV4cGFuZC5sZW5ndGgpIHtcbiAgICAgICAgICAgIC8vIHNldCByb3V0ZSAkZXhwYW5kXG4gICAgICAgICAgICBxLnNldFBhcmFtKCckZXhwYW5kJywgcXVlcnlQYXJhbXMuJGV4cGFuZCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChzZWxmLmNvbmZpZyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cy5leHBhbmQpIHtcbiAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRleHBhbmQnLCBzZWxmLmNvbmZpZy5kZWZhdWx0cy5leHBhbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIXEuZ2V0UGFyYW1zKClbJyRvcmRlcmJ5J10gJiYgc2VsZi5jb25maWcgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMub3JkZXJCeSkge1xuICAgICAgICAgICAgcS5zZXRQYXJhbSgnJG9yZGVyYnknLCBzZWxmLmNvbmZpZy5kZWZhdWx0cy5vcmRlckJ5KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlbGYuY29uZmlnICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzLmdyb3VwQnkpIHtcbiAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRncm91cGJ5Jywgc2VsZi5jb25maWcuZGVmYXVsdHMuZ3JvdXBCeSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIGFwcGVuZCBkZWZhdWx0IGZpbHRlclxuICAgICAgICAgIGlmIChzZWxmLmNvbmZpZyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cy5maWx0ZXIpIHtcbiAgICAgICAgICAgIHJldHVybiBzZWxmLl9hZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXIuYXN5bmNCdWlsZEZpbHRlcihzZWxmLmNvbmZpZy5kZWZhdWx0cy5maWx0ZXIpLnRoZW4oKGRlZmF1bHRGaWx0ZXJTdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXJTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBxUGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICBxLnNldFBhcmFtKCckZmlsdGVyJywgbnVsbCk7XG4gICAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnMgPSBbIGRlZmF1bHRGaWx0ZXJTdHJpbmcgXTtcbiAgICAgICAgICAgICAgICBpZiAocVBhcmFtcy4kZmlsdGVyKSB7IGV4cHJlc3Npb25zLnB1c2goJygnICsgcVBhcmFtcy4kZmlsdGVyICsgJyknICk7IH1cbiAgICAgICAgICAgICAgICBxLmZpbHRlcihleHByZXNzaW9ucy5qb2luKCcgYW5kICcpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBzZWxmLmxhc3RRdWVyeVBhcmFtcyA9IHEuZ2V0UGFyYW1zKCk7XG4gICAgICAgICAgICAgIHJldHVybiBxLmdldExpc3QoKS50aGVuKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVNldCA9IHtcbiAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc1RvdGFsOiBpdGVtcy50b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiBpdGVtcy50b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogaXRlbXMudmFsdWUsXG4gICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgc2VsZi5fbGFzdFF1ZXJ5VG90YWxJdGVtcyA9IGl0ZW1zLnRvdGFsO1xuICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1zLnRvdGFsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucmVzZXRFbXB0eVRhYmxlKCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAvLyBlbWl0IGxvYWQgZXZlbnRcbiAgICAgICAgICAgICAgICAgIHNlbGYubG9hZC5lbWl0KGRhdGFTZXQpO1xuICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIGRhdGFcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmbkNhbGxiYWNrKGRhdGFTZXQpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pLmNhdGNoKChlcnIpID0+IHtcbiAgICAgICAgICAgICAgLy8gbG9nIGVycm9yIHRvIGNvbnNvbGVcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVEFCTEVTJywgZXJyKTtcbiAgICAgICAgICAgICAgLy8gc2hvdyBlcnJvclxuICAgICAgICAgICAgICBzZWxmLnRvZ2dsZUVycm9yKGVycik7XG4gICAgICAgICAgICAgIHNlbGYuX2xhc3RRdWVyeVRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgICAgICAvLyBieSByZXR1cm5pbmcgZW1wdHkgZGF0YXNldFxuICAgICAgICAgICAgICBzZWxmLmxvYWQuZW1pdChFTVBUWV9EQVRBU0VUKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGZuQ2FsbGJhY2soRU1QVFlfREFUQVNFVCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2VsZi5sYXN0UXVlcnlQYXJhbXMgPSBxLmdldFBhcmFtcygpO1xuICAgICAgICAgIHEuZ2V0TGlzdCgpLnRoZW4oKGl0ZW1zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkYXRhU2V0ID0ge1xuICAgICAgICAgICAgICByZWNvcmRzVG90YWw6IGl0ZW1zLnRvdGFsLFxuICAgICAgICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IGl0ZW1zLnRvdGFsLFxuICAgICAgICAgICAgICBkYXRhOiBpdGVtcy52YWx1ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBzZWxmLl9sYXN0UXVlcnlUb3RhbEl0ZW1zID0gaXRlbXMudG90YWw7XG4gICAgICAgICAgICBpZiAoaXRlbXMudG90YWwgPT09IDApIHtcbiAgICAgICAgICAgICAgc2VsZi5yZXNldEVtcHR5VGFibGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGVtaXQgbG9hZCBldmVudFxuICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoZGF0YVNldCk7XG4gICAgICAgICAgICAvLyByZXR1cm4gZGF0YVxuICAgICAgICAgICAgcmV0dXJuIGZuQ2FsbGJhY2soZGF0YVNldCk7XG4gICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgLy8gbG9nIGVycm9yIHRvIGNvbnNvbGVcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1RBQkxFUycsIGVycik7XG4gICAgICAgICAgICAvLyBzaG93IGVycm9yXG4gICAgICAgICAgICBzZWxmLnRvZ2dsZUVycm9yKGVycik7XG4gICAgICAgICAgICAvLyBieSByZXR1cm5pbmcgZW1wdHkgZGF0YXNldFxuICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoRU1QVFlfREFUQVNFVCk7XG4gICAgICAgICAgICByZXR1cm4gZm5DYWxsYmFjayhFTVBUWV9EQVRBU0VUKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgbGFuZ3VhZ2U6IE9iamVjdC5hc3NpZ24oeyB9LCBzZWxmLnRyYW5zbGF0b3IudHJhbnNmb3JtKCdUYWJsZXMuRGF0YVRhYmxlJyksXG4gICAgICAgICAge2VtcHR5VGFibGU6ICcgJyB9KSxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHN0YXRlU2V0dGluZ3MgPSB7XG4gICAgICAgIHN0YXRlU2F2ZTogdGhpcy5zdGF0ZVNhdmVcbiAgICAgIH07XG4gICAgICBpZiAodGhpcy5zdGF0ZUxvYWRDYWxsYmFjaykge1xuICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRlU2V0dGluZ3MsIHtcbiAgICAgICAgICBzdGF0ZUxvYWRDYWxsYmFjazogdGhpcy5zdGF0ZUxvYWRDYWxsYmFja1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLnN0YXRlU2F2ZUNhbGxiYWNrKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGVTZXR0aW5ncywge1xuICAgICAgICAgIHN0YXRlU2F2ZUNhbGxiYWNrOiB0aGlzLnN0YXRlU2F2ZUNhbGxiYWNrXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5ncywgc3RhdGVTZXR0aW5ncyk7XG5cbiAgICAgIGlmICh0aGlzLnNjcm9sbGFibGUpIHtcbiAgICAgICAgLy8gc2V0IGNvbnRpbnVvdXMgc2Nyb2xsaW5nXG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3MsIHtcbiAgICAgICAgICBzY3JvbGxZOiB0aGlzLnNjcm9sbFksXG4gICAgICAgICAgc2Nyb2xsQ29sbGFwc2U6IGZhbHNlLFxuICAgICAgICAgIHNjcm9sbGVyOiB7XG4gICAgICAgICAgICBsb2FkaW5nSW5kaWNhdG9yOiBmYWxzZSxcbiAgICAgICAgICAgIGRpc3BsYXlCdWZmZXI6IDEwLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5ncywge1xuICAgICAgICAgIHNjcm9sbFk6IHRoaXMuc2Nyb2xsWSxcbiAgICAgICAgICBwYWdpbmc6IHRoaXMucGFnaW5nLFxuICAgICAgICAgIHBhZ2VMZW5ndGg6IHRoaXMucGFnZUxlbmd0aCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG5cbiAgICAgIH1cbiAgICAgIC8vIGhhbmRsZSBpbml0LmR0IGV2ZW50IGFuZCBlbWl0IGxvY2FsIGV2ZW50XG4gICAgICB0aGlzLmRhdGFUYWJsZSA9IHRhYmxlRWxlbWVudC5vbignaW5pdC5kdCcsIChldmVudCkgPT4ge1xuICAgICAgICBjb25zdCBzY3JvbGxlciA9IGpRdWVyeShldmVudC50YXJnZXQpLnBhcmVudCgpO1xuICAgICAgICAvLyBoYW5kbGUgc2Nyb2xsaW5nXG4gICAgICAgIHNjcm9sbGVyLm9uKCdzY3JvbGwnLCAoc2Nyb2xsRXZlbnQpID0+IHtcbiAgICAgICAgICBjb25zdCB0YXJnZXQgPSBqUXVlcnkoc2Nyb2xsRXZlbnQudGFyZ2V0KTtcbiAgICAgICAgICBjb25zdCB0b3AgPSB0YXJnZXQuc2Nyb2xsVG9wKCk7XG4gICAgICAgICAgY29uc3QgbGVmdCA9IHRhcmdldC5zY3JvbGxMZWZ0KCk7XG4gICAgICAgICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICAgICAgICB0aGlzLnNjcm9sbC5lbWl0KHtcbiAgICAgICAgICAgICAgdG9wLFxuICAgICAgICAgICAgICBsZWZ0XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSkuRGF0YVRhYmxlKHNldHRpbmdzKTtcbiAgICAgIHRoaXMuaW5pdC5lbWl0KCk7XG4gICAgICAvLyBzaG93IG9yIGhpZGUgaGVhZGVyXG4gICAgICBpZiAoIXRoaXMuc2hvd0hlYWRlcikge1xuICAgICAgICAoIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudClcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZT50aGVhZCcpLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICAoIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudClcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZScpLmNsYXNzTGlzdC5hZGQoJ210LTInKTtcbiAgICAgIH1cblxuICAgICAgLy8gc2hvdyBvciBoaWRlIGZvb3RlclxuICAgICAgaWYgKCF0aGlzLnNob3dGb290ZXIpIHtcbiAgICAgICAgKCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGVzX2luZm8nKS5jbGFzc0xpc3QuYWRkKCdkLW5vbmUnKTtcbiAgICAgIH1cbiAgICAgIC8vIHNob3cgb3IgaGlkZSBwYWdlclxuICAgICAgaWYgKHRoaXMuc2hvd1BhZ2luZykge1xuICAgICAgICB0aGlzLnNob3dQYWdpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNjcm9sbFRvcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5wYXJlbnQoKS5zY3JvbGxUb3AodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbExlZnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgdGhpcy5kYXRhVGFibGUucGFyZW50KCkuc2Nyb2xsTGVmdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxhc3RRdWVyeSgpOiBDbGllbnREYXRhUXVlcnlhYmxlIHtcbiAgICBpZiAodGhpcy5jb25maWcgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmxhc3RRdWVyeVBhcmFtcyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgcSA9IHRoaXMuX2NvbnRleHQubW9kZWwodGhpcy5jb25maWcubW9kZWwpLmFzUXVlcnlhYmxlKCk7XG4gICAgT2JqZWN0LmtleXModGhpcy5sYXN0UXVlcnlQYXJhbXMpLmZvckVhY2goIChrZXkpID0+IHtcbiAgICAgIHEuc2V0UGFyYW0oa2V5LCB0aGlzLmxhc3RRdWVyeVBhcmFtc1trZXldKTtcbiAgICB9KTtcbiAgICAvLyByZXR1cm4gcXVlcnlcbiAgICByZXR1cm4gcTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGFuZCB1cGRhdGVzIGEgc2luZ2xlIHJvd1xuICAgKiBAcGFyYW0gZmluZCAtIEFueSBvYmplY3Qgd2hpY2ggaXMgYmVpbmcgY29udmVydGVkIHRvIGEgcXVlcnlcbiAgICovXG4gIHB1YmxpYyBmZXRjaE9uZShmaW5kOiBhbnkpIHtcbiAgICBpZiAoZmluZCA9PSBudWxsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmICh0aGlzLmRhdGFUYWJsZSA9PSBudWxsKSB7XG4gICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMubGFzdFF1ZXJ5UGFyYW1zID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gZ2V0IHJvd3NcbiAgICBjb25zdCByb3dzID0gQXJyYXkuZnJvbSh0aGlzLmRhdGFUYWJsZS5yb3dzKCkuZGF0YSgpKTtcbiAgICBpZiAocm93cyAmJiByb3dzLmxlbmd0aCkge1xuICAgICAgLy8gZmluZCByZXN1bHRcbiAgICAgIGNvbnN0IGZpbmRLZXlzID0gT2JqZWN0LmtleXMoZmluZCk7XG4gICAgICBpZiAoZmluZEtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gZmluZCByb3cgaW5kZXggYnkgc2VhcmNoaW5nIGVhY2ggcHJvcGVydHlcbiAgICAgIGNvbnN0IHJvd0luZGV4ID0gcm93cy5maW5kSW5kZXgoKHJvdzogYW55KSA9PiB7XG4gICAgICAgIHJldHVybiBmaW5kS2V5cy5tYXAoIChrZXkpID0+IHtcbiAgICAgICAgICByZXR1cm4gcm93W2tleV0gPT09IGZpbmRba2V5XTtcbiAgICAgICAgfSkuZmlsdGVyKCAocmVzKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHJlcyA9PT0gZmFsc2U7XG4gICAgICAgIH0pLmxlbmd0aCA9PT0gMDtcbiAgICAgIH0pO1xuICAgICAgLy8gaWYgcm93IGhhcyBiZWVuIGZvdW5kXG4gICAgICBpZiAocm93SW5kZXggPj0gMCkge1xuICAgICAgICBjb25zdCBxdWVyeSA9IHRoaXMuX2NvbnRleHQubW9kZWwodGhpcy5jb25maWcubW9kZWwpLmFzUXVlcnlhYmxlKCk7XG4gICAgICAgIC8vIHNlbGVjdCBhdHRyaWJ1dGVzXG4gICAgICAgIHF1ZXJ5LnNldFBhcmFtKCckc2VsZWN0JywgdGhpcy5sYXN0UXVlcnlQYXJhbXMuJHNlbGVjdCk7XG4gICAgICAgIGlmICh0aGlzLmxhc3RRdWVyeVBhcmFtcy4kZXhwYW5kKSB7XG4gICAgICAgICAgLy8gYXBwbHkgZXhwYW5kIGF0dHJpYnV0ZXNcbiAgICAgICAgICBxdWVyeS5zZXRQYXJhbSgnJGV4cGFuZCcsIHRoaXMubGFzdFF1ZXJ5UGFyYW1zLiRleHBhbmQpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGFwcGx5IGZpbHRlciBmb3Igcm93XG4gICAgICAgIGZpbmRLZXlzLmZvckVhY2goIChrZXkpID0+IHtcbiAgICAgICAgICBjb25zdCBjb2x1bW4gPSB0aGlzLmNvbmZpZy5jb2x1bW5zLmZpbmQoIChjb2wpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBjb2wucHJvcGVydHkgPT09IGtleSB8fCBjb2wubmFtZSA9PT0ga2V5O1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChjb2x1bW4pIHtcbiAgICAgICAgICAgIC8vIGdldCBwcm9wZXJ0eSBvciBuYW1lXG4gICAgICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IGNvbHVtbi5wcm9wZXJ0eSB8fCBjb2x1bW4ubmFtZTtcbiAgICAgICAgICAgIHF1ZXJ5LmFuZChwcm9wZXJ0eSkuZXF1YWwoZmluZFtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkuYW5kKGtleSkuZXF1YWwoZmluZFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhbmQgZmluYWxseSBnZXQgaXRlbVxuICAgICAgICByZXR1cm4gcXVlcnkuZ2V0SXRlbSgpLnRoZW4oIChpdGVtKSA9PiB7XG4gICAgICAgICAgLy8gaWYgaXRlbSBleGlzdHNcbiAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3cocm93SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSBqUXVlcnkocm93Lm5vZGUoKSkuZmluZCgnOmNoZWNrYm94JykucHJvcCgnY2hlY2tlZCcpO1xuICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAvLyByZWRyYXcgcm93XG4gICAgICAgICAgICByb3cuZGF0YShpdGVtKTtcbiAgICAgICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5maW5kKCc6Y2hlY2tib3gnKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIC8vIGlmIHJvdyBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3csIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlbG9hZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VsZWN0aW9uIGNoYW5nZVxuICAgKiBAcGFyYW0gJGV2ZW50XG4gICAqL1xuICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KSB7XG4gICAgY29uc3QgaW5wdXQgPSAgJGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIC8vIGdldCByb3cgZnJvbSBpZFxuICAgIGNvbnN0IHJvd0luZGV4ID0gcGFyc2VJbnQoLy0oXFxkKykkL2cuZXhlYyhpbnB1dC5pZClbMV0sIDEwKTtcbiAgICAvLyBnZXQgcm93XG4gICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhVGFibGUucm93KHJvd0luZGV4KS5kYXRhKCk7XG4gICAgLy8gZ2V0IHJvdyBpZGVudGlmaWVyXG4gICAgaWYgKHJvdykge1xuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eTtcbiAgICAgIGNvbnN0IGlkID0gcm93W2tleV07XG4gICAgICBsZXQgZmluZEl0ZW1JbmRleCA9IHRoaXMuc2VsZWN0ZWQuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgIHJldHVybiBpdGVtW2tleV0gPT09IGlkO1xuICAgICAgfSk7XG4gICAgICBpZiAoaW5wdXQuY2hlY2tlZCkge1xuICAgICAgICBpZiAoZmluZEl0ZW1JbmRleCA8IDApIHtcbiAgICAgICAgICAvLyBhZGQgcm93IHRvIHNlbGVjdGVkIHJvd3NcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkLnB1c2gocm93KTtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbXMuZW1pdCh0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZpbmRJdGVtSW5kZXggPj0gMCkge1xuICAgICAgICAgIC8vIHJlbW92ZSBzZWxlY3RlZCBpdGVtXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoZmluZEl0ZW1JbmRleCwgMSk7XG4gICAgICAgICAgaWYgKHRoaXMuc21hcnRTZWxlY3QpIHtcbiAgICAgICAgICAgIC8vIGFkZCByb3cgdG8gdW5zZWxlY3RlZCByb3dzXG4gICAgICAgICAgICBmaW5kSXRlbUluZGV4ID0gdGhpcy51bnNlbGVjdGVkLmZpbmRJbmRleCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gaXRlbVtrZXldID09PSBpZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGZpbmRJdGVtSW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgIHRoaXMudW5zZWxlY3RlZC5wdXNoKHJvdyk7XG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgcmVzZXRFbXB0eVRhYmxlKCkge1xuICAgIC8vIHRoaXMgb3BlcmF0aW9uIGlzIGltcG9ydGFudFxuICAgIC8vIGR1ZSB0byBuZyBkYXRhIGJpbmRpbmdcbiAgICAvLyBlbXB0eSB0YWJsZSB0ZW1wbGF0ZSBoYXMgbm8gdHJhbnNsYXRlZCB0ZXh0IGR1cmluZyBuZ09uSW5pdCgpXG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0pIHtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNFbXB0eVRhYmxlID1cbiAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNaZXJvUmVjb3JkcyA9IHRoaXMuZW1wdHlUYWJsZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZUVycm9yKGVycj86IGFueSkge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdKSB7XG4gICAgICBjb25zdCBpbm5lck1lc3NhZ2UgPSAodGhpcy5lcnJvclRlbXBsYXRlLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzbWFsbCcpLml0ZW0oMCk7XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHRoaXMubGFzdEVycm9yID0gZXJyO1xuICAgICAgICBpZiAoaW5uZXJNZXNzYWdlKSB7XG4gICAgICAgICAgaW5uZXJNZXNzYWdlLmlubmVySFRNTCA9IGVyci5lcnJvciAmJiBlcnIuZXJyb3IubWVzc2FnZSA/IGVyci5lcnJvci5tZXNzYWdlIDogZXJyLm1lc3NhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc0VtcHR5VGFibGUgPVxuICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gdGhpcy5lcnJvclRlbXBsYXRlLm5hdGl2ZUVsZW1lbnQuaW5uZXJIVE1MOyAgXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5uZXJNZXNzYWdlKSB7XG4gICAgICAgICAgaW5uZXJNZXNzYWdlLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNFbXB0eVRhYmxlID0gdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckVtcHR5VGFibGUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0pIHtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNFbXB0eVRhYmxlID0gdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGV4cG9ydCgpIHtcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kdC1idXR0b25zIC5idXR0b25zLWV4Y2VsJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWxlbWVudC5jbGljaygpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUNvbHVtbnMoY29sdW1uc1RvU2hvdykge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5kYXRhVGFibGU7XG4gICAgdGhpcy5jb25maWcuY29sdW1ucy5zbGljZSgxKS5mb3JFYWNoKChjb2x1bW4sIGkpID0+IHtcbiAgICAgIGlmICghY29sdW1uLmhpZGRlbikge1xuICAgICAgICBpZiAoY29sdW1uc1RvU2hvdy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICAvLyBub2luc3BlY3Rpb24gVHlwZVNjcmlwdFZhbGlkYXRlSlNUeXBlc1xuICAgICAgICAgIHRhYmxlLmNvbHVtbihjb2x1bW4ubmFtZSArICc6bmFtZScpLnZpc2libGUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIFR5cGVTY3JpcHRWYWxpZGF0ZUpTVHlwZXNcbiAgICAgICAgICB0YWJsZS5jb2x1bW4oY29sdW1uLm5hbWUgKyAnOm5hbWUnKS52aXNpYmxlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2hhbmdlcywgJ2NvbmZpZ1NyYycpKSB7XG4gICAgICBpZiAoY2hhbmdlcy5jb25maWdTcmMgIT0gbnVsbCkge1xuICAgICAgICAvLyBsb2FkIHRhYmxlIGNvbmZpZ3VyYXRpb24gb24gY2hhbmdlXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdHJpcGxlLWVxdWFsc1xuICAgICAgICBpZiAoY2hhbmdlcy5jb25maWdTcmMuY3VycmVudFZhbHVlICYmIChjaGFuZ2VzLmNvbmZpZ1NyYy5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy5jb25maWdTcmMucHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLl9odHRwLmdldChjaGFuZ2VzLmNvbmZpZ1NyYy5jdXJyZW50VmFsdWUpLnRvUHJvbWlzZSgpLnRoZW4oKGNvbmZpZzogVGFibGVDb25maWd1cmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBzZXQgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIC8vIGZldGNoIGFuZCByZWRyYXdcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goKTtcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUQUJMRVMnLCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0YWJsZSBjb25maWd1cmF0aW9uLicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0KGxvYWQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeSA9IG51bGw7XG4gICAgdGhpcy5kZXN0cm95KCk7XG4gICAgdGhpcy5hdXRvTG9hZCA9ICEhbG9hZDtcbiAgICB0aGlzLm5nT25Jbml0KCk7XG4gIH1cblxuICBzZWxlY3RDb2x1bW5zKCkge1xuICAgIC8vIGdldCBjb2x1bW4gb3JkZXIgZS5nLiBbMCwgNCwgMSwgMiwgM11cbiAgICBjb25zdCBjb2x1bW5PcmRlcjogbnVtYmVyW10gPSB0aGlzLmRhdGFUYWJsZS5jb2xSZW9yZGVyLm9yZGVyKCk7XG4gICAgLy8gZ2V0IGNvbHVtbiBkZWZpbml0aW9uc1xuICAgIGNvbnN0IGNvbHVtbkRlZnMgPSB0aGlzLmRhdGFUYWJsZS5zZXR0aW5ncygpLmluaXQoKS5jb2x1bW5zO1xuICAgIGNvbnN0IGNvbHVtbnMgPSBjb2x1bW5EZWZzLm1hcCgoXG4gICAgICBjb2x1bW5EZWY6IHsga2V5OiBzdHJpbmcsIHRpdGxlOiBzdHJpbmcsIHZpc2libGU6IGJvb2xlYW4sIHNvcnRhYmxlOiBib29sZWFuLCBpbmRleDogbnVtYmVyIH0sIGk6IG51bWJlcikgPT4ge1xuICAgICAgbGV0IGtleSA9IGBjb2x1bW4tJHtpfWA7XG4gICAgICBsZXQgdGl0bGUgPSBjb2x1bW5EZWYudGl0bGU7XG4gICAgICAvLyBnZXQgY29sdW1uIGluZGV4XG4gICAgICBjb25zdCBpbmRleCA9ICBjb2x1bW5PcmRlci5pbmRleE9mKGkpO1xuICAgICAgY29uc3QgdmlzaWJsZSA9IHRoaXMuZGF0YVRhYmxlLmNvbHVtbihpbmRleCkudmlzaWJsZSgpO1xuICAgICAgLy8gc2V0IHRpdGxlIGZvciBzZWxlY3QgY29sdW1uXG4gICAgICBpZiAoaSA9PSAwICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgICB0aXRsZSA9ICc8JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLlNlbGVjdENvbHVtbicpICsgJz4nO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IGNvbHVtbiB0aXRsZVxuICAgICAgaWYgKHRpdGxlICE9IG51bGwgJiYgdGl0bGUubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRpdGxlID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB7XG4gICAgICAgIC8vIHRyeSB0byBmaW5kIGNvbHVtbiBwbGFjZWhvbGRlclxuICAgICAgICBsZXQgcGxhY2Vob2xkZXIgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBwbGFjZWhvbGRlciA9IHRoaXMuY29uZmlnLmNvbHVtbnNbaSAtIDFdLnBsYWNlaG9sZGVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwbGFjZWhvbGRlciA9IHRoaXMuY29uZmlnLmNvbHVtbnNbaV0ucGxhY2Vob2xkZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBsYWNlaG9sZGVyICE9IG51bGwpIHtcbiAgICAgICAgICB0aXRsZSA9ICc8JyArIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChwbGFjZWhvbGRlcikgKyAnPic7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aXRsZSA9PSBudWxsKSB7XG4gICAgICAgIHRpdGxlID0gJzwnICsgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuVW5rbm93bkNvbHVtbicpICsgJz4nO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHtcbiAgICAgICAga2V5LFxuICAgICAgICB0aXRsZSxcbiAgICAgICAgdmlzaWJsZSxcbiAgICAgICAgaW5kZXhcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLl9jb2x1bW5TZWxlY3Rvci5zZWxlY3RDb2x1bW5zKGNvbHVtbnMpLnRoZW4oKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQucmVzdWx0ID09PSAnb2snKSB7XG4gICAgICAgIC8vIGdldCBjb2x1bW4gb3JkZXIgZS5nLiBbMywgMSwgMiwgMCwgNF1cbiAgICAgICAgbGV0IGluZGV4ZXMgPSBldmVudC5jb2x1bW5zLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgIHJldHVybiBpdGVtLmluZGV4O1xuICAgICAgICB9KTtcbiAgICAgICAgLy8gcmVzZXQgY29sdW1uIHZpc2liaWx0eVxuICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZXZlbnQuY29sdW1ucy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQuY29sdW1uc1tpbmRleF07XG4gICAgICAgICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW5PcmRlci5pbmRleE9mKGluZGV4KTtcbiAgICAgICAgICAvLyBzZXQgdmlzaWJpbHR5IHdpdGggcmVkcmF3ICg9dHJ1ZSlcbiAgICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb2x1bW4oY29sSW5kZXgpLnZpc2libGUoZWxlbWVudC52aXNpYmxlLCB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBmaW5hbGx5IGFwcGx5IGNvbHVtbiBvcmRlclxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb2xSZW9yZGVyLm9yZGVyKGluZGV4ZXMsIHRydWUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIHRvIHBhc3MgYW4gZXJyb3JIYW5kbGVyIGNhbGxiYWNrLCBpZiBkZXNpcmVkXG4gICAqIEByZXR1cm5zIHZvaWRcbiAgICovXG4gIHB1YmxpYyBhc3luYyBleHBvcnRWaWV3KG9wdGlvbnM/OiB7ZXJyb3JIYW5kbGVyPzogKHJlYXNvbj86IGFueSkgPT4gYW55fSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9sb2FkaW5nLnNob3dMb2FkaW5nKCk7XG4gICAgICAvLyB2YWxpZGF0ZSBxdWVyeSBpdGVtcyBhbmQgY29uZmlnXG4gICAgICBpZiAoISh0aGlzLl9sYXN0UXVlcnlUb3RhbEl0ZW1zICYmIHRoaXMuY29uZmlnKSkge1xuICAgICAgICAvLyBkbyBub3RoaW5nXG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGdldCBleHBvcnQgc2V0dGluZ3NcbiAgICAgIGNvbnN0IGV4cG9ydFNldHRpbmdzID0gdGhpcy5fY29uZmlndXJhdGlvbi5zZXR0aW5ncyBhcyBFeHBvcnRMaW1pdENvbmZpZ3VyYXRpb247XG4gICAgICAvLyBhbmQgZXhwb3J0IGxpbWl0XG4gICAgICBjb25zdCBleHBvcnRMaW1pdCA9XG4gICAgICAgIChleHBvcnRTZXR0aW5ncyAmJiBleHBvcnRTZXR0aW5ncy50YWJsZXMgJiYgZXhwb3J0U2V0dGluZ3MudGFibGVzLmV4cG9ydExpbWl0ID4gMClcbiAgICAgICAgPyBleHBvcnRTZXR0aW5ncy50YWJsZXMuZXhwb3J0TGltaXQgOiBNQVhfRVhQT1JUX0lURU1TO1xuICAgICAgLy8gYW5kIHZhbGlkYXRlIGl0XG4gICAgICBpZiAodGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcyA+IGV4cG9ydExpbWl0KSB7XG4gICAgICAgIC8vIGNhbGwgZXJyb3IgaGFuZGxlclxuICAgICAgICAvLyBwcm92aWRlIGEgcmVjb2duaXppYmxlIGVycm9yIHR5cGVcbiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lcnJvckhhbmRsZXIpIHtcbiAgICAgICAgICBvcHRpb25zLmVycm9ySGFuZGxlcihuZXcgRXhwb3J0TGltaXRFeGNlZWRlZEVycm9yKCdFeHBvcnQgbGltaXQgZXhjZWVkZWQnKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIG9yIHNob3cgd2FybmluZyBtb2RhbCBhbmQgZXhpdFxuICAgICAgICB0aGlzLl9tb2RhbFNlcnZpY2Uuc2hvd1dhcm5pbmdEaWFsb2codGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuRXhwb3J0TGlzdCcpLFxuICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudCgnVGFibGVzLkV4cG9ydExpbWl0RXhjZWVkZWQnLFxuICAgICAgICAgICAge2RhdGFMZW5ndGg6IHRoaXMuX2xhc3RRdWVyeVRvdGFsSXRlbXMsIGV4cG9ydExpbWl0fSksIERJQUxPR19CVVRUT05TLk9rKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgLy8gZ2V0IHRvdGFsIGRpc3BsYXllZCBpdGVtc1xuICAgICAgY29uc3QgdG90YWxEaXNwbGF5ZWRJdGVtcyA9IEFycmF5LmZyb20odGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5haURpc3BsYXkpLmxlbmd0aDtcbiAgICAgIC8vIGlmIHRoZXkgYWxyZWFkeSBzYXRpc2Z5IHRoZSBsYXN0IHF1ZXJ5IHRvdGFsXG4gICAgICBpZiAodG90YWxEaXNwbGF5ZWRJdGVtcyA9PT0gdGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcykge1xuICAgICAgICAvLyBwcmVwYXJlIGV4Y2VsIGRhdGEgaW1tZWRpYXRlbHlcbiAgICAgICAgY29uc3Qge2JvZHksIGhlYWRlcn0gPSB0aGlzLmdldEV4cG9ydGFibGVEYXRhKCk7XG4gICAgICAgIC8vIGFuZCBleHBvcnQgdGhlbSB0byBleGNlbFxuICAgICAgICB0aGlzLl9leHBvcnRTcHJlYWRzaGVldC5leHBvcnQoYm9keSwgYCR7dGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnLnRpdGxlIHx8ICdUYWJsZXMuRXhwb3J0UmVzdWx0cycpfS54bHN4YCwge1xuICAgICAgICAgICAgaGVhZGVyLFxuICAgICAgICAgICAgc2tpcEhlYWRlcjogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBhdCB0aGlzIHBvaW50LCBtb3JlIGRhdGEgbmVlZCB0byBiZSBmZXRjaGVkXG4gICAgICAgIC8vIGhvbGQgcHJldmlvdXMgZGF0YSBzdGF0ZVxuICAgICAgICBjb25zdCBwcmV2aW91c0RhdGFTdGF0ZSA9IHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5kYXRhKCkudG9BcnJheSgpO1xuICAgICAgICAvLyBnZXQgdGFyZ2V0IGRhdGEgc3RhdGUgYnkgZXhlY3V0aW5nIHRoZSBsYXN0IHF1ZXJ5XG4gICAgICAgIC8vIG5vdGU6IHRha2luZyB0aGUgZXhwb3J0TGltaXQgYW1vdW50IG9mIGl0ZW1zIHdpbGwgYWx3YXlzIHNhdGlzZnkgdGhlIHJlc3VsdHMsXG4gICAgICAgIC8vIGJlY2F1c2UgaXQgaGFzIGJlZW4gdmFsaWRhdGVkXG4gICAgICAgIGNvbnN0IHRhcmdldERhdGFTdGF0ZSA9IGF3YWl0IHRoaXMubGFzdFF1ZXJ5LnRha2UoZXhwb3J0TGltaXQpLmdldEl0ZW1zKCk7XG4gICAgICAgIC8vIGNoYW5nZSB0YWJsZSBkYXRhIG9uIHRoZSBmbHksIGJ1dCBkbyBub3QgcmVkcmF3XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNsZWFyKCkucm93cy5hZGQodGFyZ2V0RGF0YVN0YXRlKTtcbiAgICAgICAgLy8gcHJlcGFyZSBleGNlbCBkYXRhXG4gICAgICAgIGNvbnN0IHtib2R5LCBoZWFkZXJ9ID0gdGhpcy5nZXRFeHBvcnRhYmxlRGF0YSgpO1xuICAgICAgICAvLyByZXNldCB0YWJsZSBkYXRhXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNsZWFyKCkucm93cy5hZGQocHJldmlvdXNEYXRhU3RhdGUpO1xuICAgICAgICAvLyBhbmQgZXhwb3J0IHRhcmdldCBkYXRhIHRvIGV4Y2VsXG4gICAgICAgIHRoaXMuX2V4cG9ydFNwcmVhZHNoZWV0LmV4cG9ydChib2R5LCBgJHt0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jb25maWcudGl0bGUgfHwgJ1RhYmxlcy5FeHBvcnRSZXN1bHRzJyl9Lnhsc3hgLCB7XG4gICAgICAgICAgICBoZWFkZXIsXG4gICAgICAgICAgICBza2lwSGVhZGVyOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIGV4aXRcbiAgICAgIHJldHVybjtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8vIGxvZyBlcnJvclxuICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgLy8gY2FsbCBlcnJvciBoYW5kbGVyLCBpZiBkZWZpbmVkXG4gICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVycm9ySGFuZGxlcikge1xuICAgICAgICBvcHRpb25zLmVycm9ySGFuZGxlcihlcnIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdXNlIGRlZmF1bHQgZXJyb3Igc2VydmljZVxuICAgICAgICB0aGlzLl9lcnJvclNlcnZpY2Uuc2hvd0Vycm9yKGVyciwge1xuICAgICAgICAgIGNvbnRpbnVlTGluazogJy4nXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9sb2FkaW5nLmhpZGVMb2FkaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEV4cG9ydGFibGVEYXRhKCk6IHtib2R5OiBhbnlbXSwgaGVhZGVyOiBhbnlbXX0ge1xuICAgIGlmICghKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuZGF0YVRhYmxlLmJ1dHRvbnNcbiAgICAgICYmIHR5cGVvZiB0aGlzLmRhdGFUYWJsZS5idXR0b25zLmV4cG9ydERhdGEgPT09ICdmdW5jdGlvbicgJiYgdGhpcy5jb25maWcpKSB7XG4gICAgICByZXR1cm4ge2JvZHk6IFtdLCBoZWFkZXI6IFtdfTtcbiAgICB9XG4gICAgLy8gZmV0Y2ggZXhwb3J0YWJsZSBleGNlbCBkYXRhXG4gICAgbGV0IHtib2R5LCBoZWFkZXJ9ID0gdGhpcy5kYXRhVGFibGUuYnV0dG9ucy5leHBvcnREYXRhKCk7XG4gICAgY29uc3QgY2xlYW51cEluZGV4ZXMgPSBbXTtcbiAgICAvLyBjbGVhbiB1cCBoZWFkZXJzXG4gICAgaGVhZGVyID0gaGVhZGVyLmZpbHRlcigoaGVhZGVySXRlbTogc3RyaW5nLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAvLyBleGNsdWRlIGVtcHR5IGhlYWRlcnNcbiAgICAgIGlmIChoZWFkZXJJdGVtLnRyaW0oKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgY2xlYW51cEluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIGZpbmQgaXRlbSBieSB0aXRsZVxuICAgICAgY29uc3QgZmluZEl0ZW0gPSB0aGlzLmNvbmZpZy5jb2x1bW5zLmZpbmQoKGNvbHVtbikgPT4ge1xuICAgICAgICByZXR1cm4gY29sdW1uLnRpdGxlICYmIGNvbHVtbi50aXRsZS5sZW5ndGggJiYgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGNvbHVtbi50aXRsZSkgPT09IGhlYWRlckl0ZW07XG4gICAgICB9KTtcbiAgICAgIC8vIGV4Y2x1ZGUgaGlkZGVuIGNvbHVtbnNcbiAgICAgIGlmIChmaW5kSXRlbSAmJiBmaW5kSXRlbS5oaWRkZW4gPT09IHRydWUpIHtcbiAgICAgICAgY2xlYW51cEluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIC8vIGNsZWFuIHVwIGJvZHlcbiAgICBib2R5ID0gYm9keS5tYXAoKHJvdzogYW55IFtdKSA9PiB7XG4gICAgICByZXR1cm4gcm93LmZpbHRlcigoXywgcm93SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gY2xlYW51cEluZGV4ZXMuaW5kZXhPZihyb3dJbmRleCkgPT09IC0xO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtib2R5LCBoZWFkZXJ9O1xuICB9XG59XG4iXX0=