@rentman/rm-core 2.0.1 → 2.0.3
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.
- package/changelog.md +7 -0
- package/dist/rm-core.js +22 -50
- package/dist/rm-core.min.js +1 -1
- package/dist/src/classes/TemplateCache.d.ts +1 -1
- package/dist/src/classes/cache/AbstractCache.d.ts +12 -0
- package/dist/src/classes/cache/transaction/TransactionCache.d.ts +1 -11
- package/dist/src/models/CollectionEditResource.d.ts +0 -20
- package/package.json +1 -1
package/dist/rm-core.js
CHANGED
|
@@ -1132,7 +1132,6 @@ var ChangesCompilation_ChangesCompilation = /** @class */ (function () {
|
|
|
1132
1132
|
createPath(this.compilation.delete, [
|
|
1133
1133
|
itemEntry.itemType,
|
|
1134
1134
|
], [
|
|
1135
|
-
{},
|
|
1136
1135
|
[],
|
|
1137
1136
|
])
|
|
1138
1137
|
.push(itemEntry);
|
|
@@ -2090,12 +2089,8 @@ var CollectionEditResource = /** @class */ (function (_super) {
|
|
|
2090
2089
|
.collectionHandler
|
|
2091
2090
|
.moveItems(this.entry, destinationResource.entry, itemEntries);
|
|
2092
2091
|
};
|
|
2093
|
-
/**
|
|
2094
|
-
* @deprecated
|
|
2095
|
-
* Use {@link ChangesDelta.setItemDeleted ChangesDelta.setItemDeleted}
|
|
2096
|
-
*/
|
|
2097
2092
|
CollectionEditResource.prototype.removeItems = function (idArray) {
|
|
2098
|
-
var changesDelta = this.factory.changesDeltaFactory.
|
|
2093
|
+
var changesDelta = this.factory.changesDeltaFactory.construct();
|
|
2099
2094
|
var removedItemEntries = [];
|
|
2100
2095
|
for (var _i = 0, _a = this.items; _i < _a.length; _i++) {
|
|
2101
2096
|
var itemResource = _a[_i];
|
|
@@ -2106,32 +2101,16 @@ var CollectionEditResource = /** @class */ (function (_super) {
|
|
|
2106
2101
|
removedItemEntries.push(itemEntry);
|
|
2107
2102
|
}
|
|
2108
2103
|
changesDelta.setItemsDeleted(removedItemEntries);
|
|
2109
|
-
this.transaction.
|
|
2104
|
+
this.transaction.applyChangesDelta(changesDelta);
|
|
2110
2105
|
};
|
|
2111
|
-
/**
|
|
2112
|
-
* @deprecated
|
|
2113
|
-
* Use {@link ChangesDelta.setItemDeleted ChangesDelta.setItemDeleted}
|
|
2114
|
-
*/
|
|
2115
2106
|
CollectionEditResource.prototype.removeItem = function (itemId) {
|
|
2116
2107
|
return this.removeItems([itemId]);
|
|
2117
2108
|
};
|
|
2118
|
-
/**
|
|
2119
|
-
* @deprecated
|
|
2120
|
-
* Use {@link ChangesDelta.setItemCreated ChangesDelta.setItemCreated}
|
|
2121
|
-
*
|
|
2122
|
-
* todo[cache] this will fetchCollectionEntry a template for you, make a convenience function ?
|
|
2123
|
-
*/
|
|
2124
2109
|
CollectionEditResource.prototype.addItems = function (valuesArray) {
|
|
2125
2110
|
// will create and apply a ChangesDelta
|
|
2126
2111
|
return this.transaction.itemHandler
|
|
2127
2112
|
.createItems(this.entry.itemType, valuesArray, this.entry.parent);
|
|
2128
2113
|
};
|
|
2129
|
-
/**
|
|
2130
|
-
* @deprecated
|
|
2131
|
-
* Use {@link ChangesDelta.setItemCreated ChangesDelta.setItemCreated}
|
|
2132
|
-
*
|
|
2133
|
-
* todo[cache] this will fetchCollectionEntry a template for you, make a convenience function ?
|
|
2134
|
-
*/
|
|
2135
2114
|
CollectionEditResource.prototype.addItem = function (values) {
|
|
2136
2115
|
return this.addItems([values]);
|
|
2137
2116
|
};
|
|
@@ -2475,19 +2454,13 @@ var TransactionItemHandler_TransactionItemHandler = /** @class */ (function (_su
|
|
|
2475
2454
|
*/
|
|
2476
2455
|
TransactionItemHandler.prototype.createItems = function (itemType, valuesArray, parent) {
|
|
2477
2456
|
var _this = this;
|
|
2478
|
-
var changesDelta = this.changesDeltaFactory.construct();
|
|
2479
|
-
var templateColumns = {};
|
|
2480
|
-
var parentFields = {};
|
|
2481
|
-
if (parent !== null) {
|
|
2482
|
-
templateColumns[itemType] = this.columnUtil.getColumnsFromLink(parent.itemType, itemType);
|
|
2483
|
-
parentFields = this.itemEntryService.getLinkFieldsByParent(parent, itemType);
|
|
2484
|
-
}
|
|
2485
2457
|
return this.templateCache
|
|
2486
|
-
.fetchTemplate(itemType, undefined, {},
|
|
2458
|
+
.fetchTemplate(itemType, undefined, {}, {}, parent)
|
|
2487
2459
|
.then(function (template) {
|
|
2460
|
+
var changesDelta = _this.changesDeltaFactory.construct();
|
|
2488
2461
|
for (var _i = 0, valuesArray_1 = valuesArray; _i < valuesArray_1.length; _i++) {
|
|
2489
2462
|
var values = valuesArray_1[_i];
|
|
2490
|
-
changesDelta.setItemCreated(_this.keyService.getLocalId(), __assign({}, template.fields, values
|
|
2463
|
+
changesDelta.setItemCreated(_this.keyService.getLocalId(), __assign({}, template.fields, values), template.columns, parent);
|
|
2491
2464
|
}
|
|
2492
2465
|
return _this.transaction.applyChangesDelta(changesDelta);
|
|
2493
2466
|
}, this.errorHandler.reject);
|
|
@@ -2986,6 +2959,20 @@ var AbstractCache_AbstractCache = /** @class */ (function () {
|
|
|
2986
2959
|
this.children.splice(index, 1);
|
|
2987
2960
|
}
|
|
2988
2961
|
};
|
|
2962
|
+
/**
|
|
2963
|
+
* @description
|
|
2964
|
+
* Returns the {@link TransactionCollectionHandler.entries CollectionCache} of the transaction
|
|
2965
|
+
*/
|
|
2966
|
+
AbstractCache.prototype.getCurrentCollectionEntryCache = function () {
|
|
2967
|
+
return this.collectionHandler.entries;
|
|
2968
|
+
};
|
|
2969
|
+
/**
|
|
2970
|
+
* @description
|
|
2971
|
+
* Returns the {@link TransactionItemHandler.entries ItemCache} of the transaction
|
|
2972
|
+
*/
|
|
2973
|
+
AbstractCache.prototype.getCurrentItemEntryCache = function () {
|
|
2974
|
+
return this.itemHandler.entries;
|
|
2975
|
+
};
|
|
2989
2976
|
/**
|
|
2990
2977
|
* @description
|
|
2991
2978
|
* Called by applyChangesDelta from ServerCache and TransactionCache. Applies creates, updates and moves, doesn't apply deletes
|
|
@@ -3820,20 +3807,6 @@ var TransactionCache_TransactionCache = /** @class */ (function (_super) {
|
|
|
3820
3807
|
delete collectionMap[oldId];
|
|
3821
3808
|
}
|
|
3822
3809
|
};
|
|
3823
|
-
/**
|
|
3824
|
-
* @description
|
|
3825
|
-
* Returns the {@link TransactionCollectionHandler.entries CollectionCache} of the transaction
|
|
3826
|
-
*/
|
|
3827
|
-
TransactionCache.prototype.getCurrentCollectionEntryCache = function () {
|
|
3828
|
-
return this.collectionHandler.entries;
|
|
3829
|
-
};
|
|
3830
|
-
/**
|
|
3831
|
-
* @description
|
|
3832
|
-
* Returns the {@link TransactionItemHandler.entries ItemCache} of the transaction
|
|
3833
|
-
*/
|
|
3834
|
-
TransactionCache.prototype.getCurrentItemEntryCache = function () {
|
|
3835
|
-
return this.itemHandler.entries;
|
|
3836
|
-
};
|
|
3837
3810
|
/**
|
|
3838
3811
|
* @description
|
|
3839
3812
|
* Clones the {@link CollectionEntry CollectionEntry} and all {@link ItemEntry ItemEntries} in it, and sets the parent of the new entries.
|
|
@@ -8421,7 +8394,6 @@ var ChangesDeltaBase = /** @class */ (function () {
|
|
|
8421
8394
|
var itemEntry = deleted_1[_i];
|
|
8422
8395
|
if (this.deleted[itemEntry.itemType] === undefined) {
|
|
8423
8396
|
this.deleted[itemEntry.itemType] = [];
|
|
8424
|
-
return;
|
|
8425
8397
|
}
|
|
8426
8398
|
// todo[cache]: do we really have to check this ? deleting multiple times doesn't matter
|
|
8427
8399
|
// todo[cache]: this could also be a map of entryId -> itemEntry
|
|
@@ -8841,7 +8813,7 @@ var TemplateCache_TemplateCache = /** @class */ (function () {
|
|
|
8841
8813
|
}
|
|
8842
8814
|
/**
|
|
8843
8815
|
* @description
|
|
8844
|
-
* Fetches a {@link Template template}
|
|
8816
|
+
* Fetches a {@link Template template}, {@link TransactionItemHandler.createItems TransactionItemHandler.createItems} is a convenience function for this
|
|
8845
8817
|
*
|
|
8846
8818
|
* @param itemType The {@link ItemType ItemType} of the template item
|
|
8847
8819
|
* @param itemId Used for caching, multiple concurrent template calls for the same itemId will return the same template
|
|
@@ -9505,7 +9477,7 @@ var ChangesProcessorFactory_ChangesProcessorFactory = /** @class */ (function ()
|
|
|
9505
9477
|
|
|
9506
9478
|
var core_RmCore = /** @class */ (function () {
|
|
9507
9479
|
function RmCore(_apiRequestService, authInterface, errorHandler, exceptionHandler, promiseLibrary, linkTreeService) {
|
|
9508
|
-
this.version = '2.0.
|
|
9480
|
+
this.version = '2.0.3';
|
|
9509
9481
|
this.noop = noop;
|
|
9510
9482
|
// Create variables for each service in order to get a TypeScript error when a dependency hasn't been
|
|
9511
9483
|
// initialized yet.
|
|
@@ -9717,4 +9689,4 @@ function identity(value) {
|
|
|
9717
9689
|
/***/ })
|
|
9718
9690
|
/******/ ]);
|
|
9719
9691
|
});
|
|
9720
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SbUNvcmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1JtQ29yZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9SbUNvcmUvZXh0ZXJuYWwgXCJtb21lbnRcIiIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9VdGlsLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0FwaUZvcm1hdHRlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9BcGlSZXF1ZXN0U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9BcGlSZXNwb25zZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DaGFuZ2VzQ29tcGlsYXRpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ2hhbmdlc1Byb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0l0ZW1FbnRyeU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9JdGVtUmVzb3VyY2VPcHRpb25zLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvSXRlbUVudHJ5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvSXRlbVJlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvRWRpdFJlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvQ29sbGVjdGlvbkVudHJ5T3B0aW9ucy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0NvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uRW50cnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uUmVzb3VyY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvQ29sbGVjdGlvbkVkaXRSZXNvdXJjZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL1RlbXBsYXRlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvUmVtb3RlVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvTG9jYWxWaWV3UmVzb3VyY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9pbmRleC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvdHlwZXMvSXRlbVR5cGVzQ29sbGVjdGlvbi50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvdHlwZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvSXRlbUhhbmRsZXJCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uTWF0Y2hlckJhc2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sbGVjdGlvbk1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkV2ZW50SGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25DYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uRXhwYW5zaW9uLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbHVtbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5JbmZvLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbHVtblNldC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5TdWJzZXRDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5VdGlsLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NyZWF0ZVJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlQYXJzZXJCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1F1ZXJ5Q29sdW1uRXh0cmFjdG9yLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL0NvbGxlY3Rpb25IYW5kbGVyQmFzZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS9zZXJ2ZXIvU2VydmVyQ29sbGVjdGlvbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9JdGVtQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvSXRlbUVudHJ5U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9LZXlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0xvY2tTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL01vZHVsZUNoYW5nZXNDb21waWxhdGlvbi50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9RdWVyeU1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlQYXJzZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RDb2x1bW5FeHBhbnNpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvU29ja2V0TWVzc2FnZUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DaGFuZ2VzRGVsdGFCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NoYW5nZXNEZWx0YS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9JbnRlcm5hbENoYW5nZXNEZWx0YS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9SZXF1ZXN0QnVmZmVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RCdWZmZXJNYW5hZ2VyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2luZGV4LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1RlbXBsYXRlQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9BcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9DaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sbGVjdGlvbkNhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbGxlY3Rpb25FbnRyeUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sdW1uRXhwYW5zaW9uRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtbkluZm9GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sdW1uU2V0RmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtblN1YnNldENhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NyZWF0ZVJlcXVlc3RGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvSXRlbUNhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0l0ZW1FbnRyeUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9JdGVtUmVzb3VyY2VGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvUXVlcnlNYXRjaGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1F1ZXJ5UGFyc2VyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1JlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvVGVtcGxhdGVGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NvcmUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVB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LDZCQUE2QixHQUFHLDZCQUE2QixDQUFDO1FBQ25FLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxvQkFBb0IsQ0FBQztRQUNqRCxJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsQ0FBQztRQUN2QyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsbUJBQW1CLENBQUM7UUFDL0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDcEMsQ0FBQztJQUNGLGFBQUM7QUFBRCxDQUFDOztBQUVLLFNBQVUsSUFBSTtBQUNwQixDQUFDO0FBRUssU0FBVSxRQUFRLENBQUUsS0FBSztJQUM5QixPQUFPLEtBQUssQ0FBQztBQUNkLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BWc0I7QUFDSztBQUNIO0FBRUM7QUFDRTtBQUNKIiwiZmlsZSI6InJtLWNvcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJtb21lbnRcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wibW9tZW50XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlJtQ29yZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcIm1vbWVudFwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiUm1Db3JlXCJdID0gZmFjdG9yeShyb290W1wibW9tZW50XCJdKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMF9fKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18wX187IiwiZXhwb3J0IGZ1bmN0aW9uIGluc3RhbnRpYXRlT3B0aW9ucyAoXG5cdG9wdGlvbnM6IHtba2V5OiBzdHJpbmddOiBhbnl9LFxuXHR2YWx1ZXM6IG9iamVjdCxcbik6IHZvaWQge1xuXHRmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZXMpIHtcblx0XHRpZiAoIShrZXkgaW4gb3B0aW9ucykpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmICh2YWx1ZXNba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRvcHRpb25zW2tleV0gPSB2YWx1ZXNba2V5XTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd01lcmdlIChcblx0b2JqZWN0LFxuXHRkZWZhdWx0cyxcbikge1xuXHRpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gZGVmYXVsdHM7XG5cdH1cblxuXHRjb25zdCByZXN1bHQgPSB7fTtcblxuXHRmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0cykge1xuXHRcdHJlc3VsdFtrZXldID0gb2JqZWN0W2tleV0gPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRkZWZhdWx0c1trZXldIDogb2JqZWN0W2tleV07XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvcGVydGllcyAob2JqZWN0KSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0Zm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXJzdFByb3BlcnR5IChvYmplY3QpIHtcblx0aWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcblx0XHRyZXR1cm4ga2V5O1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbkFycmF5IChcblx0bmVlZGxlLFxuXHRoYXlzdGFjayxcbikge1xuXHRmb3IgKGNvbnN0IGhheSBvZiBoYXlzdGFjaykge1xuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0aWYgKG5lZWRsZSA9PSBoYXkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckFycmF5PFQ+IChcblx0c291cmNlOiBUW10sXG5cdGNhbGxiYWNrOiAoZWxlbTogVCkgPT4gYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJlZDogVFtdID0gW107XG5cblx0Zm9yIChjb25zdCBzcmMgb2Ygc291cmNlKSB7XG5cdFx0aWYgKGNhbGxiYWNrKHNyYykpIHtcblx0XHRcdGZpbHRlcmVkLnB1c2goc3JjKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoZmlsdGVyZWQubGVuZ3RoID09PSBzb3VyY2UubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZW1wdHlBcnJheShzb3VyY2UpO1xuXG5cdGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlcmVkKSB7XG5cdFx0c291cmNlLnB1c2goZmlsdGVyKTtcblx0fVxuXG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlBcnJheSAoYXJyYXkpOiB2b2lkIHtcblx0YXJyYXkuc3BsaWNlKDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEV4aXN0cyAoXG5cdHNvdXJjZSxcblx0cGF0aCxcbikge1xuXHRpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRmb3IgKGNvbnN0IHAgb2YgcGF0aCkge1xuXHRcdGlmICh0eXBlb2Ygc291cmNlW3BdID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHNvdXJjZSA9IHNvdXJjZVtwXTtcblx0fVxuXG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGF0aDxUPiAoXG5cdG9iamVjdDogYW55LFxuXHRwYXRoOiBBcnJheTxudW1iZXIgfCBzdHJpbmc+LFxuXHRkZWZhdWx0czogYW55W10sXG4pOiBUIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBwYXRoW2ldO1xuXG5cdFx0aWYgKG9iamVjdFt2YWx1ZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b2JqZWN0W3ZhbHVlXSA9IGRlZmF1bHRzW2ldO1xuXHRcdH1cblxuXHRcdG9iamVjdCA9IG9iamVjdFt2YWx1ZV07XG5cdH1cblxuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aCAoXG5cdG9iamVjdDoge30sXG5cdHBhdGg6IEFycmF5PG51bWJlciB8IHN0cmluZz4sXG5cdGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuKTogYW55IHtcblx0aWYgKG9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGZvciAoY29uc3QgcCBvZiBwYXRoKSB7XG5cdFx0b2JqZWN0ID0gb2JqZWN0W3BdOyAvLyB3b24ndCBhbHRlciB0aGUgY2FsbGVyJ3MgdmFyXG5cblx0XHRpZiAob2JqZWN0ID09PSB1bmRlZmluZWQgJiYgIWNyZWF0ZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vLyBUYWtlbiBmcm9tIEFuZ3VsYXJKUywgYWRkZWQgY29tbWVudHMgdG8gaWdub3JlIFR5cGVTY3JpcHQgZXJyb3JzXG5mdW5jdGlvbiBiYXNlRXh0ZW5kIChcblx0ZHN0LFxuXHRvYmpzLFxuXHRkZWVwLFxuKSB7XG5cdGZvciAobGV0IGkgPSAwLCBpaSA9IG9ianMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuXHRcdGNvbnN0IG9iaiA9IG9ianNbaV07XG5cblx0XHRpZiAoIWlzT2JqZWN0KG9iaikgJiYgIWlzRnVuY3Rpb24ob2JqKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cblx0XHRmb3IgKGxldCBqID0gMCwgamogPSBrZXlzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcblx0XHRcdGNvbnN0IGtleSA9IGtleXNbal07XG5cdFx0XHRjb25zdCBzcmMgPSBvYmpba2V5XTtcblxuXHRcdFx0aWYgKGRlZXAgJiYgaXNPYmplY3Qoc3JjKSkge1xuXHRcdFx0XHRpZiAoaXNEYXRlKHNyYykpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IG5ldyBEYXRlKHNyYy52YWx1ZU9mKCkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzUmVnRXhwKHNyYykpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IG5ldyBSZWdFeHAoc3JjKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzcmMubm9kZU5hbWUpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IHNyYy5jbG9uZU5vZGUodHJ1ZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNFbGVtZW50KHNyYykpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IHNyYy5jbG9uZSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICghaXNPYmplY3QoZHN0W2tleV0pKSB7XG5cdFx0XHRcdFx0XHRkc3Rba2V5XSA9IGlzQXJyYXkoc3JjKSA/IFtdIDoge307XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YmFzZUV4dGVuZChcblx0XHRcdFx0XHRcdGRzdFtrZXldLFxuXHRcdFx0XHRcdFx0W3NyY10sXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRzdFtrZXldID0gc3JjO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBkc3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQgKFxuXHRkc3QsXG5cdC4uLmFyZ3Ncbikge1xuXHRyZXR1cm4gYmFzZUV4dGVuZChcblx0XHRkc3QsXG5cdFx0YXJncyxcblx0XHRmYWxzZSxcblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlIChcblx0ZHN0LFxuXHQuLi5hcmdzXG4pIHtcblx0cmV0dXJuIGJhc2VFeHRlbmQoXG5cdFx0ZHN0LFxuXHRcdGFyZ3MsXG5cdFx0dHJ1ZSxcblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0ICh2YWx1ZSkge1xuXHQvLyBodHRwOi8vanNwZXJmLmNvbS9pc29iamVjdDRcblx0cmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JsYW5rT2JqZWN0ICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZSAodmFsdWUpIHtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb248VD4gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBUIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVnRXhwICh2YWx1ZSkge1xuXHRyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnQgKG5vZGUpIHtcblx0cmV0dXJuICEhKG5vZGUgJiZcblx0XHQoXG5cdFx0XHRub2RlLm5vZGVOYW1lICAvLyBXZSBhcmUgYSBkaXJlY3QgZWxlbWVudC5cblx0XHRcdHx8IChub2RlLnByb3AgJiYgbm9kZS5hdHRyICYmIG5vZGUuZmluZClcblx0XHQpXG5cdCk7ICAvLyBXZSBoYXZlIGFuIG9uIGFuZCBmaW5kIG1ldGhvZCBwYXJ0IG9mIGpRdWVyeSBBUEkuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dpbmRvdyAob2JqKSB7XG5cdHJldHVybiBvYmogJiYgb2JqLndpbmRvdyA9PT0gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyAoXG5cdG8xLFxuXHRvMixcbikge1xuXHRpZiAobzEgPT09IG8yKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAobzEgPT09IG51bGwgfHwgbzIgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG5cdGlmIChvMSAhPT0gbzEgJiYgbzIgIT09IG8yKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gLy8gTmFOID09PSBOYU5cblxuXHRjb25zdCB0MSA9IHR5cGVvZiBvMTtcblx0Y29uc3QgdDIgPSB0eXBlb2YgbzI7XG5cblx0bGV0IGxlbmd0aDtcblx0bGV0IGtleTtcblx0bGV0IGtleVNldDtcblxuXHRpZiAodDEgPT09IHQyICYmIHQxID09PSAnb2JqZWN0Jykge1xuXHRcdGlmIChpc0FycmF5KG8xKSkge1xuXHRcdFx0aWYgKCFpc0FycmF5KG8yKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGxlbmd0aCA9IG8xLmxlbmd0aDtcblxuXHRcdFx0aWYgKG8xLmxlbmd0aCA9PT0gbzIubGVuZ3RoKSB7XG5cdFx0XHRcdGZvciAoa2V5ID0gMDsga2V5IDwgbGVuZ3RoOyBrZXkrKykge1xuXHRcdFx0XHRcdGlmICghZXF1YWxzKFxuXHRcdFx0XHRcdFx0bzFba2V5XSxcblx0XHRcdFx0XHRcdG8yW2tleV0sXG5cdFx0XHRcdFx0KSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNEYXRlKG8xKSkge1xuXHRcdFx0aWYgKCFpc0RhdGUobzIpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNpbXBsZUNvbXBhcmUoXG5cdFx0XHRcdG8xLmdldFRpbWUoKSxcblx0XHRcdFx0bzIuZ2V0VGltZSgpLFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGlzUmVnRXhwKG8xKSkge1xuXHRcdFx0aWYgKCFpc1JlZ0V4cChvMikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbzEudG9TdHJpbmcoKSA9PT0gbzIudG9TdHJpbmcoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGlzV2luZG93KG8xKSB8fCBpc1dpbmRvdyhvMikgfHwgaXNBcnJheShvMikgfHwgaXNEYXRlKG8yKSB8fCBpc1JlZ0V4cChvMikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRrZXlTZXQgPSBjcmVhdGVNYXAoKTtcblx0XHRcdGZvciAoa2V5IGluIG8xKSB7XG5cdFx0XHRcdGlmIChpc0Z1bmN0aW9uKG8xW2tleV0pKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIWVxdWFscyhcblx0XHRcdFx0XHRvMVtrZXldLFxuXHRcdFx0XHRcdG8yW2tleV0sXG5cdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXlTZXRba2V5XSA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoa2V5IGluIG8yKSB7XG5cdFx0XHRcdGlmICghKGtleSBpbiBrZXlTZXQpICYmIGlzRGVmaW5lZChvMltrZXldKSAmJiAhaXNGdW5jdGlvbihvMltrZXldKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hcCAoKSB7XG5cdHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG5mdW5jdGlvbiBzaW1wbGVDb21wYXJlIChcblx0YSxcblx0Yixcbikge1xuXHRyZXR1cm4gYSA9PT0gYiB8fCAoYSAhPT0gYSAmJiBiICE9PSBiKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZE9iamVjdE1heERlcHRoIChtYXhEZXB0aCkge1xuXHRyZXR1cm4gaXNOdW1iZXIobWF4RGVwdGgpICYmIG1heERlcHRoID4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkgKFxuXHRzb3VyY2UsXG5cdGRlc3RpbmF0aW9uPyxcblx0bWF4RGVwdGg/LFxuKSB7XG5cdGNvbnN0IHN0YWNrU291cmNlID0gW107XG5cdGNvbnN0IHN0YWNrRGVzdCA9IFtdO1xuXG5cdG1heERlcHRoID0gaXNWYWxpZE9iamVjdE1heERlcHRoKG1heERlcHRoKSA/IG1heERlcHRoIDogTmFOO1xuXG5cdGlmIChkZXN0aW5hdGlvbikge1xuXHRcdGlmIChzb3VyY2UgPT09IGRlc3RpbmF0aW9uKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgY29weSEgU291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgaWRlbnRpY2FsLicpO1xuXHRcdH1cblxuXHRcdC8vIEVtcHR5IHRoZSBkZXN0aW5hdGlvbiBvYmplY3Rcblx0XHRpZiAoaXNBcnJheShkZXN0aW5hdGlvbikpIHtcblx0XHRcdGRlc3RpbmF0aW9uLmxlbmd0aCA9IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIGRlc3RpbmF0aW9uKSB7XG5cdFx0XHRcdGRlbGV0ZSBkZXN0aW5hdGlvbltrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja1NvdXJjZS5wdXNoKHNvdXJjZSk7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHN0YWNrRGVzdC5wdXNoKGRlc3RpbmF0aW9uKTtcblxuXHRcdHJldHVybiBjb3B5UmVjdXJzZShcblx0XHRcdHNvdXJjZSxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdFx0bWF4RGVwdGgsXG5cdFx0KTtcblx0fVxuXG5cdHJldHVybiBjb3B5RWxlbWVudChcblx0XHRzb3VyY2UsXG5cdFx0bWF4RGVwdGgsXG5cdCk7XG5cblx0ZnVuY3Rpb24gY29weVJlY3Vyc2UgKFxuXHRcdF9zb3VyY2UsXG5cdFx0X2Rlc3RpbmF0aW9uLFxuXHRcdF9tYXhEZXB0aCxcblx0KSB7XG5cdFx0X21heERlcHRoLS07XG5cblx0XHRpZiAoX21heERlcHRoIDwgMCkge1xuXHRcdFx0cmV0dXJuICcuLi4nO1xuXHRcdH1cblxuXHRcdGlmIChpc0FycmF5KF9zb3VyY2UpKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMCwgaWkgPSBfc291cmNlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0XHRcdFx0X2Rlc3RpbmF0aW9uLnB1c2goY29weUVsZW1lbnQoXG5cdFx0XHRcdFx0X3NvdXJjZVtpXSxcblx0XHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHRcdCkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNCbGFua09iamVjdChfc291cmNlKSkge1xuXHRcdFx0Ly8gY3JlYXRlTWFwKCkgZmFzdCBwYXRoIC0tLSBTYWZlIHRvIGF2b2lkIGhhc093blByb3BlcnR5IGNoZWNrIGJlY2F1c2UgcHJvdG90eXBlIGNoYWluIGlzIGVtcHR5XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBfc291cmNlKSB7XG5cdFx0XHRcdF9kZXN0aW5hdGlvbltrZXldID0gY29weUVsZW1lbnQoXG5cdFx0XHRcdFx0X3NvdXJjZVtrZXldLFxuXHRcdFx0XHRcdF9tYXhEZXB0aCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKF9zb3VyY2UgJiYgdHlwZW9mIF9zb3VyY2UuaGFzT3duUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdC8vIFNsb3cgcGF0aCwgd2hpY2ggbXVzdCByZWx5IG9uIGhhc093blByb3BlcnR5XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBfc291cmNlKSB7XG5cdFx0XHRcdGlmIChfc291cmNlLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0XHRfZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdFx0X3NvdXJjZVtrZXldLFxuXHRcdFx0XHRcdFx0X21heERlcHRoLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gU2xvd2VzdCBwYXRoIC0tLSBoYXNPd25Qcm9wZXJ0eSBjYW4ndCBiZSBjYWxsZWQgYXMgYSBtZXRob2Rcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIF9zb3VyY2UpIHtcblx0XHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcblx0XHRcdFx0XHRfc291cmNlLFxuXHRcdFx0XHRcdGtleSxcblx0XHRcdFx0KSkge1xuXHRcdFx0XHRcdF9kZXN0aW5hdGlvbltrZXldID0gY29weUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRfc291cmNlW2tleV0sXG5cdFx0XHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBfZGVzdGluYXRpb247XG5cdH1cblxuXHRmdW5jdGlvbiBjb3B5RWxlbWVudCAoXG5cdFx0X3NvdXJjZSxcblx0XHRfbWF4RGVwdGggPSA1LFxuXHQpIHtcblx0XHQvLyBTaW1wbGUgdmFsdWVzXG5cdFx0aWYgKCFpc09iamVjdChfc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIF9zb3VyY2U7XG5cdFx0fVxuXG5cdFx0Ly8gQWxyZWFkeSBjb3BpZWQgdmFsdWVzXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGNvbnN0IGluZGV4ID0gc3RhY2tTb3VyY2UuaW5kZXhPZihfc291cmNlKTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHJldHVybiBzdGFja0Rlc3RbaW5kZXhdO1xuXHRcdH1cblxuXHRcdGlmIChpc1dpbmRvdyhfc291cmNlKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNvcHkhIE1ha2luZyBjb3BpZXMgb2YgV2luZG93IGluc3RhbmNlcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuXHRcdH1cblxuXHRcdGxldCBuZWVkc1JlY3Vyc2UgPSBmYWxzZTtcblx0XHRsZXQgX2Rlc3RpbmF0aW9uID0gY29weVR5cGUoX3NvdXJjZSk7XG5cblx0XHRpZiAoX2Rlc3RpbmF0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdF9kZXN0aW5hdGlvbiA9IGlzQXJyYXkoX3NvdXJjZSkgPyBbXSA6IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKF9zb3VyY2UpKTtcblx0XHRcdG5lZWRzUmVjdXJzZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHN0YWNrU291cmNlLnB1c2goX3NvdXJjZSk7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHN0YWNrRGVzdC5wdXNoKF9kZXN0aW5hdGlvbik7XG5cblx0XHRyZXR1cm4gbmVlZHNSZWN1cnNlXG5cdFx0XHQ/IGNvcHlSZWN1cnNlKFxuXHRcdFx0XHRfc291cmNlLFxuXHRcdFx0XHRfZGVzdGluYXRpb24sXG5cdFx0XHRcdF9tYXhEZXB0aCxcblx0XHRcdClcblx0XHRcdDogX2Rlc3RpbmF0aW9uO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29weVR5cGUgKF9zb3VyY2UpIHtcblx0XHRzd2l0Y2ggKHRvU3RyaW5nLmNhbGwoX3NvdXJjZSkpIHtcblx0XHRcdGNhc2UgJ1tvYmplY3QgSW50OEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IEludDE2QXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgSW50MzJBcnJheV0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBGbG9hdDMyQXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQ4QXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgVWludDE2QXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgVWludDMyQXJyYXldJzpcblx0XHRcdFx0cmV0dXJuIG5ldyBfc291cmNlLmNvbnN0cnVjdG9yKFxuXHRcdFx0XHRcdGNvcHlFbGVtZW50KF9zb3VyY2UuYnVmZmVyKSxcblx0XHRcdFx0XHRfc291cmNlLmJ5dGVPZmZzZXQsXG5cdFx0XHRcdFx0X3NvdXJjZS5sZW5ndGgsXG5cdFx0XHRcdCk7XG5cblx0XHRcdGNhc2UgJ1tvYmplY3QgQXJyYXlCdWZmZXJdJzpcblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMFxuXHRcdFx0XHRpZiAoIV9zb3VyY2Uuc2xpY2UpIHtcblx0XHRcdFx0XHQvLyBJZiB3ZSdyZSBpbiB0aGlzIGNhc2Ugd2Uga25vdyB0aGUgZW52aXJvbm1lbnQgc3VwcG9ydHMgQXJyYXlCdWZmZXJcblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuXHRcdFx0XHRcdGNvbnN0IGNvcGllZCA9IG5ldyBBcnJheUJ1ZmZlcihfc291cmNlLmJ5dGVMZW5ndGgpO1xuXHRcdFx0XHRcdG5ldyBVaW50OEFycmF5KGNvcGllZCkuc2V0KG5ldyBVaW50OEFycmF5KF9zb3VyY2UpKTtcblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlICovXG5cdFx0XHRcdFx0cmV0dXJuIGNvcGllZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gX3NvdXJjZS5zbGljZSgwKTtcblxuXHRcdFx0Y2FzZSAnW29iamVjdCBCb29sZWFuXSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IE51bWJlcl0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBTdHJpbmddJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgRGF0ZV0nOlxuXHRcdFx0XHRyZXR1cm4gbmV3IF9zb3VyY2UuY29uc3RydWN0b3IoX3NvdXJjZS52YWx1ZU9mKCkpO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IFJlZ0V4cF0nOlxuXHRcdFx0XHRjb25zdCByZSA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0X3NvdXJjZS5fc291cmNlLFxuXHRcdFx0XHRcdF9zb3VyY2UudG9TdHJpbmcoKVxuXHRcdFx0XHRcdFx0Lm1hdGNoKC9bXi9dKiQvKVswXSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRyZS5sYXN0SW5kZXggPSBfc291cmNlLmxhc3RJbmRleDtcblxuXHRcdFx0XHRyZXR1cm4gcmU7XG5cblx0XHRcdGNhc2UgJ1tvYmplY3QgQmxvYl0nOlxuXHRcdFx0XHRyZXR1cm4gbmV3IF9zb3VyY2UuY29uc3RydWN0b3IoXG5cdFx0XHRcdFx0W19zb3VyY2VdLFxuXHRcdFx0XHRcdHt0eXBlOiBfc291cmNlLnR5cGV9LFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChpc0Z1bmN0aW9uKF9zb3VyY2UuY2xvbmVOb2RlKSkge1xuXHRcdFx0cmV0dXJuIF9zb3VyY2UuY2xvbmVOb2RlKHRydWUpO1xuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW4gfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGNvcHksIGVxdWFscyB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBBcGlGb3JtYXR0ZXIge1xuXG5cdE1PTUVOVF9JTlZBTElEID0gJ0ludmFsaWQgZGF0ZSc7XG5cdFNFUlZFUl9EQVRFVElNRV9GT1JNQVQgPSAnWVlZWS1NTS1ERFtUXUhIOm1tOnNzWic7XG5cdFNFUlZFUl9USU1FX0ZPUk1BVCA9ICdISDptbTpzcyc7XG5cdFNFUlZFUl9EQVRFX0ZPUk1BVCA9ICdZWVlZLU1NLUREJztcblxuXHRjb25zdHJ1Y3RvciAoKSB7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyBpZiBhIGNvbHVtbiB0eXBlIGlzIGFuICdleHBlbnNpdmUnIHR5cGUsIG1lYW5pbmcgdGhhdCB0aGUgYWN0aW9uIHRvIGZvcm1hdCB0aGUgZmllbGQgdGFrZXMgc2lnbmlmaWNhbnQgQ1BVIHRpbWVcblx0ICpcblx0ICogLS0tLVxuXHQgKiBAcmVtYXJrc1xuXHQgKiBDdXJyZW50bHkgb25seSB1c2VkIGZvciBNb21lbnQgb2JqZWN0c1xuXHQgKi9cblx0cHVibGljIGlzRXhwZW5zaXZlRm9ybWF0IChjb2x1bW5UeXBlOiBzdHJpbmcpIHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIHZhbHVlcyBpbiAnY2hhbmdlcycgaWYgdGhlIHZhbHVlcyBpbiAnaW5pdGlhbCcgYW5kICdjaGFuZ2VzJyBhcmUgdGhlIHNhbWUgKGxlYXZpbmcgdXNlciBjaGFuZ2VzIGludGFjdClcblx0ICovXG5cdHB1YmxpYyBtZXJnZUNvcHlGaWVsZHM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpbml0aWFsOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNoYW5nZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0bmV3SW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uLnBhdGg7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0bmV3SW5pdGlhbFtjb2x1bW5QYXRoXSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCYmIChcblx0XHRcdFx0XHRjb2x1bW5QYXRoID09PSAnaWQnIHx8XG5cdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5QYXRoXSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdFx0dGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRcdFx0Y29sdW1uLmFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5QYXRoXSxcblx0XHRcdFx0XHRcdGluaXRpYWxbY29sdW1uUGF0aF0sXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5sYXp5Q2xvbmUoXG5cdFx0XHRcdFx0Y29sdW1uLmFwaUNvbHVtbixcblx0XHRcdFx0XHRuZXdJbml0aWFsLFxuXHRcdFx0XHRcdGNoYW5nZXMsXG5cdFx0XHRcdFx0Y29sdW1uUGF0aCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhbmdlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2xvbmVzIHRoZSBmaWVsZHMgZnJvbSBgc291cmNlYCB0byBgZGVzdGluYXRpb25gLCBjYWxscyB7QGxpbmsgQXBpRm9ybWF0dGVyLmlzRXhwZW5zaXZlRm9ybWF0IGlzRXhwZW5zaXZlRm9ybWF0fSB0byBkZXRlcm1pbmUgaWYgdmFsdWVzIHNob3VsZCBpbW1lZGlhdGVseSBiZSBjbG9uZWQsIG9yIHRoZSBnZXR0ZXIgc2hvdWxkIGJlIGNsb25lZFxuXHQgKi9cblx0cHVibGljIGxhenlDbG9uZSAoXG5cdFx0YXBpQ29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRzb3VyY2U6IG9iamVjdCxcblx0XHRkZXN0aW5hdGlvbjogb2JqZWN0LFxuXHRcdGtleTogc3RyaW5nLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChhcGlDb2x1bW4udHlwZSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0XHRcdGtleSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGRlc3RpbmF0aW9uW2tleV07XG5cblx0XHRcdFx0XHRcdHJldHVybiBkZXN0aW5hdGlvbltrZXldID0gdGhpcy5jbG9uZShcblx0XHRcdFx0XHRcdFx0YXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0XHRcdHNvdXJjZVtrZXldLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVzdGluYXRpb25ba2V5XSA9IHRoaXMuY2xvbmUoXG5cdFx0XHRcdGFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRzb3VyY2Vba2V5XSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpbml0aWFsOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdG1vZGlmaWVkOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88YW55Pj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IHJlc3VsdDoge1tjb2x1bW5JZDogc3RyaW5nXTogYW55fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cdFx0XHRjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW4uYXBpQ29sdW1uO1xuXHRcdFx0Y29uc3QgY29sdW1uVHlwZSA9IGFwaUNvbHVtbi50eXBlO1xuXG5cdFx0XHRpZiAoYXBpQ29sdW1uLnJlYWRPbmx5KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXRoaXMuY29tcGFyZUZpZWxkcyhcblx0XHRcdFx0Y29sdW1uVHlwZSxcblx0XHRcdFx0aW5pdGlhbFtjb2x1bW5JZF0sXG5cdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IHRoaXMuZm9ybWF0UmVxdWVzdFZhbHVlKFxuXHRcdFx0XHRcdGNvbHVtblR5cGUsXG5cdFx0XHRcdFx0bW9kaWZpZWRbY29sdW1uSWRdLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdExvY2FsPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88YW55Pj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IHJlc3VsdDoge1tjb2x1bW5JZDogc3RyaW5nXTogYW55fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cdFx0XHRjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW4uYXBpQ29sdW1uO1xuXG5cdFx0XHRpZiAoYXBpQ29sdW1uLnJlYWRPbmx5KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHRbY29sdW1uSWRdID0gdGhpcy5mb3JtYXRSZXF1ZXN0VmFsdWUoXG5cdFx0XHRcdGFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRmaWVsZHNbY29sdW1uSWRdLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGhhc0NoYW5nZXMgKFxuXHRcdGluaXRpYWw6IEZpZWxkTWFwLFxuXHRcdG1vZGlmaWVkOiBGaWVsZE1hcCxcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHRcdGluY2x1ZGVSZWFkT25seUNvbHVtbnM6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cdFx0XHRjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW4uYXBpQ29sdW1uO1xuXG5cdFx0XHRpZiAoIWluY2x1ZGVSZWFkT25seUNvbHVtbnMgJiYgYXBpQ29sdW1uLnJlYWRPbmx5KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4uYXBpQ29sdW1uLnR5cGUpKSB7XG5cdFx0XHRcdGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuXHRcdFx0XHRcdG1vZGlmaWVkLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIElmIHRoZSBtb21lbnQgZ2V0dGVyIGhhc24ndCBiZWVuIHRyaWdnZXJlZCBvciBvdmVyd3JpdHRlbiB5ZXQsIHdlIGNhbiBhc3N1bWUgdGhlcmUgYXJlIG5vIGNoYW5nZXNcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGRlc2MgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIGRlc2MudmFsdWUgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRcdGFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRtb2RpZmllZDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IG9iamVjdFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cblx0XHRcdGlmIChhcGlDb2x1bW4ucmVhZE9ubHkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRhcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0aW5pdGlhbFtjb2x1bW5JZF0sXG5cdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0b2xkVmFsdWU6IGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRcdFx0bmV3VmFsdWU6IG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0XHRcdGNvbHVtbjogY29sdW1uLmFwaUNvbHVtbixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgY29weUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHNvdXJjZTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uLnBhdGg7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5QYXRoKVxuXHRcdFx0XHR8fCAoXG5cdFx0XHRcdFx0Ly8gcHJldmVudCB0cmlnZ2VyaW5nIGdldHRlciBmb3IgZXhwZW5zaXZlIGZvcm1hdHNcblx0XHRcdFx0XHQhdGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4uYXBpQ29sdW1uLnR5cGUpXG5cdFx0XHRcdFx0JiYgc291cmNlW2NvbHVtblBhdGhdID09PSB1bmRlZmluZWRcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmxhenlDbG9uZShcblx0XHRcdFx0Y29sdW1uLmFwaUNvbHVtbixcblx0XHRcdFx0c291cmNlLFxuXHRcdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdFx0Y29sdW1uUGF0aCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlc3RpbmF0aW9uO1xuXHR9XG5cblx0cHVibGljIHNoYWxsb3dDb3B5RmllbGRzIChcblx0XHRzaGFsbG93U291cmNlOiBGaWVsZE1hcCxcblx0XHRkZWVwU291cmNlOiBGaWVsZE1hcCxcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXAsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogRmllbGRNYXAge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW4ucGF0aDtcblxuXHRcdFx0ZGVzdGluYXRpb25bY29sdW1uUGF0aF0gPSBzaGFsbG93U291cmNlW2NvbHVtblBhdGhdICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRzaGFsbG93U291cmNlW2NvbHVtblBhdGhdIDpcblx0XHRcdFx0dGhpcy5jbG9uZShcblx0XHRcdFx0XHRjb2x1bW4uYXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0ZGVlcFNvdXJjZVtjb2x1bW5QYXRoXSxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHRwdWJsaWMgc2V0RGVmYXVsdFZhbHVlcyAoXG5cdFx0ZGVzdGluYXRpb246IEZpZWxkTWFwLFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88YW55Pj4sXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW4uaWRdID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoY29sdW1uLmFwaUNvbHVtbi50eXBlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHRwdWJsaWMgY29tcGFyZUZpZWxkcyAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdGZpcnN0PzogYW55LFxuXHRcdHNlY29uZD86IGFueSxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBzZWNvbmQgPT09IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAoc2Vjb25kID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbXBhcmVNb21lbnRPYmplY3RzKFxuXHRcdFx0XHRcdGZpcnN0LFxuXHRcdFx0XHRcdHNlY29uZCxcblx0XHRcdFx0KTtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29tcGFyZUR1cmF0aW9ucyhcblx0XHRcdFx0XHRmaXJzdCxcblx0XHRcdFx0XHRzZWNvbmQsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICdpZCc6IC8vIGlkIHR5cGVzXG5cdFx0XHRjYXNlICdpdGVtJzpcblx0XHRcdGNhc2UgJ2xpbmsnOlxuXHRcdFx0Y2FzZSAnY2hpbGQnOlxuXHRcdFx0Y2FzZSAnc2libGluZyc6XG5cdFx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0XHRcdHJldHVybiBmaXJzdCA9PSBzZWNvbmQ7IC8vIHVzZSBub24tc3RyaWN0IGNvbXBhcmlzb25cblx0XHRcdGNhc2UgJ2N1cnJlbnQnOlxuXHRcdFx0Y2FzZSAnZGltZW5zaW9uJzpcblx0XHRcdGNhc2UgJ2Rpc3RhbmNlJzpcblx0XHRcdGNhc2UgJ2RvdWJsZSc6IC8vIGZsb2F0aW5nIHBvaW50IHR5cGVzXG5cdFx0XHRjYXNlICdmaWxlc2l6ZSc6XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0Y2FzZSAncG93ZXInOlxuXHRcdFx0Y2FzZSAncXVhbnRpdHknOlxuXHRcdFx0Y2FzZSAndm9sdW1lJzpcblx0XHRcdGNhc2UgJ3dlaWdodCc6XG5cdFx0XHRjYXNlICdjb29yZGluYXRlJzpcblx0XHRcdGNhc2UgJ3ByaWNlJzpcblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2UnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlRmxvYXRzKFxuXHRcdFx0XHRcdGZpcnN0LFxuXHRcdFx0XHRcdHNlY29uZCxcblx0XHRcdFx0KTtcblx0XHRcdGNhc2UgJ2ludCc6IC8vIGludGVnZXIgdHlwZXNcblx0XHRcdGNhc2UgJ2Jvb2wnOiAvLyBib29sZWFuIHR5cGVzXG5cdFx0XHRjYXNlICdlbnVtJzpcblx0XHRcdGNhc2UgJ2VtYWlsJzogLy8gc3RyaW5nIHR5cGVzXG5cdFx0XHRjYXNlICdwaG9uZSc6XG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRjYXNlICdvcmRlcic6XG5cdFx0XHRcdHJldHVybiBmaXJzdCA9PT0gc2Vjb25kO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGVxdWFscyhcblx0XHRcdFx0XHRmaXJzdCxcblx0XHRcdFx0XHRzZWNvbmQsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNvbXBhcmVGbG9hdHMgKFxuXHRcdGE6IG51bWJlcixcblx0XHRiOiBudW1iZXIsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFic0EgPSBNYXRoLmFicyhhKTtcblx0XHRjb25zdCBhYnNCID0gTWF0aC5hYnMoYik7XG5cdFx0Y29uc3QgZGlmZiA9IE1hdGguYWJzKGEgLSBiKTtcblxuXHRcdGNvbnN0IEVQU0lMT04gPSAxLjE5ZS0wNztcblxuXHRcdC8vIHNob3J0Y3V0LCBoYW5kbGVzIGluZmluaXRpZXNcblx0XHRpZiAoYSA9PT0gYikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIGlmIChhID09PSAwIHx8IGIgPT09IDAgfHwgZGlmZiA8IE51bWJlci5NSU5fVkFMVUUpIHtcblx0XHRcdC8vIGEgb3IgYiBpcyB6ZXJvIG9yIGJvdGggYXJlIGV4dHJlbWVseSBjbG9zZSB0byBpdFxuXHRcdFx0Ly8gcmVsYXRpdmUgZXJyb3IgaXMgbGVzcyBtZWFuaW5nZnVsIGhlcmVcblx0XHRcdHJldHVybiBkaWZmIDwgKEVQU0lMT04gKiBOdW1iZXIuTUlOX1ZBTFVFKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gdXNlIHJlbGF0aXZlIGVycm9yXG5cdFx0XHRyZXR1cm4gZGlmZiAvIE1hdGgubWluKFxuXHRcdFx0XHQoYWJzQSArIGFic0IpLFxuXHRcdFx0XHROdW1iZXIuTUFYX1ZBTFVFLFxuXHRcdFx0KSA8IEVQU0lMT047XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNvbXBhcmVNb21lbnRPYmplY3RzIChcblx0XHRmaXJzdDogbW9tZW50Lk1vbWVudCxcblx0XHRzZWNvbmQ6IG1vbWVudC5Nb21lbnQsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmICghZmlyc3QuaXNWYWxpZCgpKSB7XG5cdFx0XHRyZXR1cm4gIXNlY29uZC5pc1ZhbGlkKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCFzZWNvbmQuaXNWYWxpZCgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSAvLyBmaXJzdCBJUyB2YWxpZFxuXG5cdFx0cmV0dXJuIGZpcnN0LmlzU2FtZShzZWNvbmQpO1xuXHR9XG5cblx0cHVibGljIGNvbXBhcmVEdXJhdGlvbnMgKFxuXHRcdGZpcnN0OiBtb21lbnQuRHVyYXRpb24sXG5cdFx0c2Vjb25kOiBtb21lbnQuRHVyYXRpb24sXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBmaXJzdC5hc01pbGxpc2Vjb25kcygpID09PSBzZWNvbmQuYXNNaWxsaXNlY29uZHMoKTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXNwb25zZVZhbHVlIChcblx0XHRjb2x1bW5UeXBlOiBzdHJpbmcsXG5cdFx0dmFsdWU6IGFueSxcblx0KSB7XG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVzcG9uc2VEYXRlKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVzcG9uc2VDb2xvcih2YWx1ZSk7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlRHVyYXRpb24odmFsdWUpO1xuXHRcdFx0Y2FzZSAnanNvbic6XG5cdFx0XHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlICE9PSAnJyA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWU7XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IDAgPyBudWxsIDogdmFsdWU7XG5cdFx0XHRjYXNlICdmaWxlc2l6ZSc6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSAvIDEwMDAwMDA7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3RWYWx1ZSAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdCkge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXF1ZXN0RGF0ZVRpbWUodmFsdWUpO1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlcXVlc3REYXRlKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVxdWVzdENvbG9yKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVxdWVzdER1cmF0aW9uKHZhbHVlKTtcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gMCA/IG51bGwgOiB2YWx1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVzcG9uc2VEYXRlICh2YWx1ZTogbnVsbCB8IGFueSk6IG1vbWVudC5Nb21lbnQge1xuXHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IG1vbWVudC5pbnZhbGlkKCkgOiBtb21lbnQodmFsdWUpO1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlc3BvbnNlRHVyYXRpb24gKHZhbHVlOiBudWxsIHwgbnVtYmVyKTogbW9tZW50LkR1cmF0aW9uIHtcblx0XHRyZXR1cm4gbW9tZW50LmR1cmF0aW9uKFxuXHRcdFx0dmFsdWUgPT09IG51bGwgPyAwIDogdmFsdWUsXG5cdFx0XHQnc2Vjb25kcycsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXNwb25zZUNvbG9yICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdmFsdWUuY2hhckF0KDApID09PSAnIycgPyB2YWx1ZSA6ICcjJyArIHZhbHVlO1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3REYXRlVGltZSAodmFsdWU6IG1vbWVudC5Nb21lbnQpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRyZXR1cm4gdmFsdWUuaXNWYWxpZCgpID8gdmFsdWUuZm9ybWF0KHRoaXMuU0VSVkVSX0RBVEVUSU1FX0ZPUk1BVCkgOiBudWxsO1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3REYXRlICh2YWx1ZTogbW9tZW50Lk1vbWVudCk6IHN0cmluZyB8IG51bGwge1xuXHRcdHJldHVybiB2YWx1ZS5pc1ZhbGlkKCkgPyB2YWx1ZS5mb3JtYXQodGhpcy5TRVJWRVJfREFURV9GT1JNQVQpIDogbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0RHVyYXRpb24gKHZhbHVlOiBtb21lbnQuRHVyYXRpb24pOiBudW1iZXIge1xuXHRcdHJldHVybiB2YWx1ZS5hc1NlY29uZHMoKTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0Q29sb3IgKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiB2YWx1ZS5jaGFyQXQoMCkgPT09ICcjJyA/IHZhbHVlLnN1YnN0cmluZygxKSA6IHZhbHVlO1xuXHR9XG5cblx0cHVibGljIGdldERlZmF1bHRWYWx1ZSAoY29sdW1uVHlwZTogc3RyaW5nKTogYW55IHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2ludCc6XG5cdFx0XHRjYXNlICdkb3VibGUnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdvcmRlcic6XG5cdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0Y2FzZSAnaXRlbSc6XG5cdFx0XHRjYXNlICdsaW5rJzpcblx0XHRcdGNhc2UgJ2NoaWxkJzpcblx0XHRcdGNhc2UgJ3NpYmxpbmcnOlxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRjYXNlICdlbnVtJzpcblx0XHRcdFx0cmV0dXJuICcwJztcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRcdHJldHVybiBtb21lbnQuaW52YWxpZCgpO1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gbW9tZW50LmR1cmF0aW9uKCk7XG5cdFx0XHRjYXNlICd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2xvbmd0ZXh0Jzpcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0Y2FzZSAnY29sb3InOlxuXHRcdFx0XHRyZXR1cm4gJyMwMDAwMDAnO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0Ly8gXHRcdFx0XHRcdGVtYWlsXG5cdFx0XHQvLyBcdFx0XHRcdFx0dXJsXG5cdFx0XHQvLyBcdFx0XHRcdFx0aHRtbFxuXHRcdFx0Ly8gXHRcdFx0XHRcdGpzb25cblx0XHRcdC8vIFx0XHRcdFx0XHRkYXRhXG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGlzRGVmYXVsdFZhbHVlIChcblx0XHRjb2x1bW5UeXBlOiBzdHJpbmcsXG5cdFx0dmFsdWU6IGFueSxcblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29tcGFyZUZpZWxkcyhcblx0XHRcdGNvbHVtblR5cGUsXG5cdFx0XHR2YWx1ZSxcblx0XHRcdHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGNvbHVtblR5cGUpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmUgKFxuXHRcdGNvbHVtblR5cGU6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHQpOiBhbnkge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jbG9uZUR1cmF0aW9uKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0XHRyZXR1cm4gbW9tZW50KHZhbHVlKTtcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0XHRyZXR1cm4gY29weSh2YWx1ZSk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGdldENsb25lRnVuY3Rpb24gKGNvbHVtblR5cGU6IHN0cmluZykge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jbG9uZUR1cmF0aW9uO1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNsb25lRGF0ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLmlkZW50aXR5O1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjbG9uZUR1cmF0aW9uIChkdXJhdGlvbjogbW9tZW50LkR1cmF0aW9uKSB7XG5cdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbihkdXJhdGlvbik7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVEYXRlIChkYXRlOiBtb21lbnQuTW9tZW50KTogbW9tZW50Lk1vbWVudCB7XG5cdFx0cmV0dXJuIGRhdGUuY2xvbmUoKTtcblx0fVxuXG5cdHB1YmxpYyBpZGVudGl0eTxUPiAoaW5wdXQ6IFQpOiBUIHtcblx0XHRyZXR1cm4gaW5wdXQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW5NYXAsIEFwaVJlcXVlc3RJdGVtTWFwLCBBcGlSZXF1ZXN0TGltaXQsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2Vcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQXBpUmVxdWVzdFNlcnZpY2Uge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBleHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZUludGVyZmFjZSxcblx0XHRwcml2YXRlIGFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeTogQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5XG5cdCkge1xuXG5cdH1cblxuXHR0ZW1wbGF0ZSAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBwYXJhbXM6IGFueSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLnRlbXBsYXRlKGl0ZW1UeXBlLCBwYXJhbXMpKTtcblx0fVxuXG5cdGNyZWF0ZSAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBpdGVtSWQ6IEl0ZW1JZCwgdmFsdWVzOiBhbnksIHBhcmVudFR5cGU/OiBJdGVtVHlwZSwgcGFyZW50SWQ/OiBJdGVtSWQpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS5jcmVhdGUoaXRlbVR5cGUsIGl0ZW1JZCwgdmFsdWVzLCBwYXJlbnRUeXBlLCBwYXJlbnRJZCkpO1xuXHR9XG5cblx0ZGVsZXRlIChpdGVtVHlwZTogSXRlbVR5cGUsIGl0ZW1JZHM6IEl0ZW1JZFtdKTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UuZGVsZXRlKGl0ZW1UeXBlLCBpdGVtSWRzKSk7XG5cdH1cblxuXHR1cGRhdGVJdGVtcyAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBpdGVtczogQXBpUmVxdWVzdEl0ZW1NYXAsIGNvbHVtbnM6IGFueSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUl0ZW1zKGl0ZW1UeXBlLCBpdGVtcywgY29sdW1ucykpO1xuXHR9XG5cblx0cmVxdWVzdFNrZWxldG9uIChwYXJhbXM6IGFueSwgcmVxdWVzdENhbmNlbGVyPzogUHJvbWlzZUludGVyZmFjZTxhbnk+KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UucmVxdWVzdFNrZWxldG9uKHBhcmFtcywgcmVxdWVzdENhbmNlbGVyKSk7XG5cdH1cblxuXHRtb3ZlSXRlbXMgKHBhcmVudFR5cGU6IEl0ZW1UeXBlLCBwYXJlbnRJZDogSXRlbUlkLCBpdGVtczoge1tpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW119KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UubW92ZUl0ZW1zKHBhcmVudFR5cGUsIHBhcmVudElkLCBpdGVtcykpO1xuXHR9XG5cblx0Y29sdW1ucyAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS5jb2x1bW5zKGl0ZW1UeXBlLCBjb2x1bW5zLCBwYXJhbXMpKTtcblx0fVxuXG5cdHF1ZXJ5IChpdGVtVHlwZTogSXRlbVR5cGUsIHF1ZXJ5OiBhbnksIGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5NYXAsIGxpbWl0PzogQXBpUmVxdWVzdExpbWl0KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UucXVlcnkoaXRlbVR5cGUsIHF1ZXJ5LCBjb2x1bW5zLCBsaW1pdCkpO1xuXHR9XG5cblx0cHJvY2Vzc1Jlc3BvbnNlIChyZXF1ZXN0OiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHJlcXVlc3QudGhlbigocmVzcG9uc2U6IGFueSkgPT4gdGhpcy5hcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkuY29uc3RydWN0KHJlc3BvbnNlKSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUsIEl0ZW1UeXBlTWFwLCBSZXNwb25zZUNvbHVtbiB9IGZyb20gJy4uL3R5cGVzJztcblxuLy8gdG9kb1tjYWNoZV0gZXh0ZW5kIGJhc2UgY2xhc3MgcGVyIHJlcXVlc3QgKGRlbGV0ZSBoYXMgZGlmZmVyZW50IHN0cnVjdHVyZSlcbmV4cG9ydCBjbGFzcyBBcGlSZXNwb25zZVByb2Nlc3NvciB7XG5cblx0Y29sdW1uczogSXRlbVR5cGVNYXA8UmVzcG9uc2VDb2x1bW5bXT47XG5cdGxpbmtzOiBJdGVtVHlwZU1hcDxJdGVtSWRbXT47XG5cdGNhY2hlYWJsZTogYm9vbGVhbjtcblx0bWFwOiBhbnk7XG5cblx0aXRlbXM6IGFueTtcblxuXHRjb2x1bW5JbmRleE1hcDoge1xuXHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0W2NvbHVtbklkOiBzdHJpbmddOiBudW1iZXJcblx0XHR9XG5cdH0gPSB7fTtcblxuXHRjb2x1bW5NYXA6IGFueSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIHJlc3BvbnNlOiBhbnksXG5cdCkge1xuXHRcdHRoaXMuY29sdW1ucyA9IHJlc3BvbnNlLmNvbHVtbnM7XG5cdFx0dGhpcy5pdGVtcyA9IHJlc3BvbnNlLml0ZW1zO1xuXHRcdHRoaXMubGlua3MgPSByZXNwb25zZS5saW5rcztcblx0XHR0aGlzLmNhY2hlYWJsZSA9IHJlc3BvbnNlLmNhY2hlYWJsZTtcblx0XHR0aGlzLm1hcCA9IHJlc3BvbnNlLm1hcDtcblxuXHRcdHRoaXMuY3JlYXRlQ29sdW1uTWFwcygpO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb2x1bW5NYXBzICgpIHtcblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHRoaXMuY29sdW1ucykge1xuXHRcdFx0dGhpcy5jb2x1bW5JbmRleE1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdHRoaXMuY29sdW1uTWFwW2l0ZW1UeXBlXSA9IHt9O1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1uc1tpdGVtVHlwZV0ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zW2l0ZW1UeXBlXVtpXTtcblxuXHRcdFx0XHR0aGlzLmNvbHVtbkluZGV4TWFwW2l0ZW1UeXBlXVtjb2x1bW4uaWRdID0gaTtcblx0XHRcdFx0dGhpcy5jb2x1bW5NYXBbaXRlbVR5cGVdW2NvbHVtbi5pZF0gPSBjb2x1bW47XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZldGNoQ29sdW1uT2JqZWN0IChpdGVtVHlwZTogSXRlbVR5cGUpOiBSZXNwb25zZUNvbHVtbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uTWFwW2l0ZW1UeXBlXTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaFZhbHVlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y29sdW1uSWQ6IHN0cmluZyxcblx0KSB7XG5cdFx0aWYgKHRoaXMuaXRlbXNbaXRlbVR5cGVdW2l0ZW1JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbk1hcFtpdGVtVHlwZV1bY29sdW1uSWRdO1xuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5JbmRleE1hcFtpdGVtVHlwZV1bY29sdW1uSWRdO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlc3BvbnNlVmFsdWUoXG5cdFx0XHRjb2x1bW4udHlwZSxcblx0XHRcdHRoaXMuaXRlbXNbaXRlbVR5cGVdW2l0ZW1JZF0uZGF0YVtpbmRleF0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaENvbHVtbkFycmF5IChpdGVtVHlwZTogSXRlbVR5cGUpOiBSZXNwb25zZUNvbHVtbltdIHtcblx0XHRjb25zdCByZXN1bHQ6IFJlc3BvbnNlQ29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgYXBpQ29sdW1uIG9mIHRoaXMuY29sdW1uc1tpdGVtVHlwZV0pIHtcblx0XHRcdHJlc3VsdC5wdXNoKGFwaUNvbHVtbik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaERlcml2ZWRPYmplY3QgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRyb290Q29sdW1uczogUmVzcG9uc2VDb2x1bW5bXSxcblx0KSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiByb290Q29sdW1ucykge1xuXHRcdFx0dGhpcy5mZXRjaERlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdHRoaXMuZmV0Y2hWYWx1ZShcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0Y29sdW1uLmlkLFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRjb2x1bW4sXG5cdFx0XHRcdHJlc3VsdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaERlcml2ZWRWYWx1ZXMgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0Y29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRkZXN0aW5hdGlvbjogYW55LFxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkQ29sdW1uIG9mIGNvbHVtbi5jaGlsZHJlbikge1xuXHRcdFx0bGV0IGNoaWxkVmFsdWU7XG5cblx0XHRcdGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRjaGlsZFZhbHVlID0gbnVsbDtcblx0XHRcdFx0ZGVzdGluYXRpb25bY2hpbGRDb2x1bW4ucGF0aF0gPSB0aGlzLmFwaUZvcm1hdHRlci5nZXREZWZhdWx0VmFsdWUoY2hpbGRDb2x1bW4uYXBpQ29sdW1uLnR5cGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2hpbGRWYWx1ZSA9IHRoaXMuZmV0Y2hWYWx1ZShcblx0XHRcdFx0XHRjb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0Y2hpbGRDb2x1bW4uaWQsXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NoaWxkQ29sdW1uLnBhdGhdID0gY2hpbGRWYWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNoaWxkQ29sdW1uLmlzTGVhZikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5mZXRjaERlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdGNoaWxkVmFsdWUsXG5cdFx0XHRcdGNoaWxkQ29sdW1uLFxuXHRcdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZldGNoT2JqZWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0XHRpbmNsdWRlTGlua3M6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuaXRlbXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXRlbSA9IHRoaXMuaXRlbXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdLmRhdGE7XG5cdFx0Y29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zW2l0ZW1UeXBlXVtpXTtcblxuXHRcdFx0aWYgKHRoaXMuYXBpRm9ybWF0dGVyLmlzRXhwZW5zaXZlRm9ybWF0KGNvbHVtbi50eXBlKSkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0cmVzdWx0LFxuXHRcdFx0XHRcdGNvbHVtbi5pZCxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2V0OlxuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIHJlc3VsdFtjb2x1bW4uaWRdO1xuXG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0W2NvbHVtbi5pZF0gPSB2YWx1ZTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgcmVzdWx0W2NvbHVtbi5pZF07XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdFtjb2x1bW4uaWRdID0gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVzcG9uc2VWYWx1ZShcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4udHlwZSxcblx0XHRcdFx0XHRcdFx0XHRkYXRhW2ldLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0W2NvbHVtbi5pZF0gPSB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXNwb25zZVZhbHVlKFxuXHRcdFx0XHRcdGNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdGRhdGFbaV0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGluY2x1ZGVMaW5rcykge1xuXHRcdFx0Y29uc3QgbGlua3MgPSB0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdLmxpbmtzO1xuXHRcdFx0cmVzdWx0Ll9fbGlua3MgPSB7fTtcblxuXHRcdFx0Zm9yIChjb25zdCBsaW5rVHlwZSBpbiBsaW5rcykge1xuXHRcdFx0XHRyZXN1bHQuX19saW5rc1tsaW5rVHlwZV0gPVxuXHRcdFx0XHRcdHRoaXMuZmV0Y2hPYmplY3RBcnJheShcblx0XHRcdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHRcdFx0aW5jbHVkZUxpbmtzLFxuXHRcdFx0XHRcdFx0bGlua3NbbGlua1R5cGVdLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaE9iamVjdEFycmF5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpbmNsdWRlTGlua3M/OiBib29sZWFuLFxuXHRcdGlkQXJyYXk/OiBJdGVtSWRbXSB8IG51bGwsXG5cdCk6IEFycmF5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCByZXN1bHQ6IGFueVtdID0gW107XG5cblx0XHRpZiAoaWRBcnJheSA9PT0gbnVsbCkge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gdGhpcy5pdGVtc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0cmVzdWx0LnB1c2godGhpcy5mZXRjaE9iamVjdChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0aW5jbHVkZUxpbmtzLFxuXHRcdFx0XHQpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRpZiAoaWRBcnJheSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZEFycmF5ID0gdGhpcy5saW5rc1tpdGVtVHlwZV07XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaWRBcnJheSkge1xuXHRcdFx0cmVzdWx0LnB1c2godGhpcy5mZXRjaE9iamVjdChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0aW5jbHVkZUxpbmtzLFxuXHRcdFx0KSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaENvbHVtbnNPYmplY3QgKCk6IHtbaXRlbVR5cGU6IHN0cmluZ106IFJlc3BvbnNlQ29sdW1ufSB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uTWFwO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnQsIEl0ZW1FbnRyeU1hcCwgSXRlbU1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEludGVybmFsQ3JlYXRlRGVsdGEgfSBmcm9tICcuL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcblxuaW1wb3J0IHsgY3JlYXRlUGF0aCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCB0eXBlIENyZWF0ZUNvbXBpbGF0aW9uID0ge1xuXHRbcGFyZW50VHlwZTogc3RyaW5nXToge1xuXHRcdFtwYXJlbnRJZDogbnVtYmVyXTogSXRlbU1hcDxJbnRlcm5hbENyZWF0ZURlbHRhPlxuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBEZWxldGVDb21waWxhdGlvbiA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGU+PlxufTtcblxuZXhwb3J0IHR5cGUgVXBkYXRlQ29tcGlsYXRpb24gPSBJdGVtRW50cnlNYXA8SXRlbVR5cGU+O1xuXG5leHBvcnQgdHlwZSBNb3ZlQ29tcGlsYXRpb24gPSB7XG5cdFtwYXJlbnRUeXBlOiBzdHJpbmddOiB7XG5cdFx0W3BhcmVudElkOiBudW1iZXJdOiBJdGVtRW50cnlbXVxuXHR9XG59O1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblxuXHRjb21waWxhdGlvbjoge1xuXHRcdGNyZWF0ZTogQ3JlYXRlQ29tcGlsYXRpb24sXG5cdFx0ZGVsZXRlOiBEZWxldGVDb21waWxhdGlvbixcblx0XHR1cGRhdGU6IFVwZGF0ZUNvbXBpbGF0aW9uLFxuXHRcdG1vdmU6IE1vdmVDb21waWxhdGlvblxuXHR9ID0ge1xuXHRcdGNyZWF0ZToge30sXG5cdFx0ZGVsZXRlOiB7fSxcblx0XHR1cGRhdGU6IHt9LFxuXHRcdG1vdmU6IHt9LFxuXHR9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHR0aGlzLnByb2Nlc3NEZWx0YSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzRGVsdGEgKCk6IHZvaWQge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0RGVsdGEoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGNvbnN0IGVudHJpZXNUb0JlRGVsZXRlZCA9IGNoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXTtcblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZW50cmllc1RvQmVEZWxldGVkKSB7XG5cdFx0XHRcdGlmIChpdGVtRW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmFkZERlbGV0ZUVudHJ5KFxuXHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGNoYW5nZXNEZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5hZGRDcmVhdGVFbnRyeSh0dXBsZSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuYWRkVXBkYXRlRW50cnkodHVwbGUuZW50cnkpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gY2hhbmdlc0RlbHRhLm1vdmVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS5tb3ZlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuYWRkTW92ZUVudHJ5KFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0dHVwbGUudG8sXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVmYXVsdFBhcmVudCAoKTogRW50cnlQYXJlbnQge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpdGVtVHlwZTogJ1ZvaWQnLFxuXHRcdFx0aXRlbUlkOiAwLFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIGFkZE1vdmVFbnRyeSAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnksXG5cdFx0bmV3UGFyZW50OiBFbnRyeVBhcmVudCxcblx0KTogdm9pZCB7XG5cdFx0Y3JlYXRlUGF0aDxJdGVtRW50cnlbXT4oXG5cdFx0XHR0aGlzLmNvbXBpbGF0aW9uLm1vdmUsXG5cdFx0XHRbXG5cdFx0XHRcdG5ld1BhcmVudC5pdGVtVHlwZSxcblx0XHRcdFx0bmV3UGFyZW50Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRbXSxcblx0XHRcdF0sXG5cdFx0KVxuXHRcdFx0LnB1c2goaXRlbUVudHJ5KTtcblx0fVxuXG5cdHByaXZhdGUgYWRkRGVsZXRlRW50cnkgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlPixcblx0KTogdm9pZCB7XG5cdFx0Y3JlYXRlUGF0aDxJdGVtRW50cnlbXT4oXG5cdFx0XHR0aGlzLmNvbXBpbGF0aW9uLmRlbGV0ZSxcblx0XHRcdFtcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdFtdLFxuXHRcdFx0XSxcblx0XHQpXG5cdFx0XHQucHVzaChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYWRkVXBkYXRlRW50cnkgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlPik6IHZvaWQge1xuXHRcdGNyZWF0ZVBhdGgoXG5cdFx0XHR0aGlzLmNvbXBpbGF0aW9uLnVwZGF0ZSxcblx0XHRcdFtcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdF0sXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYWRkQ3JlYXRlRW50cnkgKGNyZWF0ZURlbHRhOiBJbnRlcm5hbENyZWF0ZURlbHRhKTogdm9pZCB7XG5cdFx0bGV0IHBhcmVudCA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KGNyZWF0ZURlbHRhLmVudHJ5KTtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHBhcmVudCA9IHRoaXMuZ2V0RGVmYXVsdFBhcmVudCgpO1xuXHRcdH1cblxuXHRcdGNyZWF0ZVBhdGgoXG5cdFx0XHR0aGlzLmNvbXBpbGF0aW9uLmNyZWF0ZSxcblx0XHRcdFtcblx0XHRcdFx0cGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRwYXJlbnQuaXRlbUlkLFxuXHRcdFx0XHRjcmVhdGVEZWx0YS5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0Y3JlYXRlRGVsdGEuZW50cnkuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0Y3JlYXRlRGVsdGEsXG5cdFx0XHRdLFxuXHRcdCk7XG5cdH1cblxufVxuIiwiaW1wb3J0IHtcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENoYW5nZXNDb21waWxhdGlvbixcblx0Q29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0Q29sdW1uSW5mbyxcblx0RGVsZXRlQ29tcGlsYXRpb24sXG5cdGhhc1Byb3BlcnRpZXMsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdE1vdmVDb21waWxhdGlvbixcblx0U2VydmVyQ2FjaGUsXG5cdFVwZGF0ZUNvbXBpbGF0aW9uLFxufSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7XG5cdENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdE1vdmVJdGVtcyxcblx0QXBpUmVzcG9uc2UsXG5cdENyZWF0ZVJlcXVlc3RFbnRyeSxcblx0RmllbGRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5pbXBvcnQgeyBnZXRQYXRoLCBpbkFycmF5IH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgT25BZnRlckNyZWF0ZUNhbGxiYWNrID0gKGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXApID0+IHZvaWQ7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBFeGVjdXRlcyB0aGUgY2hhbmdlcyBmcm9tIGEgc3BlY2lmaWMge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgdHJhbnNhY3Rpb259IGFuZCByZXR1cm5zIGEge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9XG4gKi9cbmV4cG9ydCBjbGFzcyBDaGFuZ2VzUHJvY2Vzc29yIHtcblxuXHRwcml2YXRlIGl0ZW1JZENvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7fTtcblx0cHJpdmF0ZSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFNlcnZlckNhY2hlKCk7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRwcml2YXRlIGNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY3JlYXRlUmVxdWVzdEZhY3Rvcnk6IENyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdHByaXZhdGUgYnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRwcml2YXRlIG9uQWZ0ZXJDcmVhdGVDYWxsYmFjaz86IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0KSB7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEV4ZWN1dGVzIHRoZSByZXF1ZXN0cyBpbiB0aGUgb3JkZXIgb2Y6XG5cdCAqIDEuIGNyZWF0ZVxuXHQgKiAyLiBtb3ZlXG5cdCAqIDMuIGRlbGV0ZVxuXHQgKiA0LiB1cGRhdGVcblx0ICovXG5cdHB1YmxpYyBleGVjdXRlICgpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblx0XHRjb25zdCBjaGFuZ2VzQ29tcGlsYXRpb24gPSB0aGlzLmNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29tcGlsYXRpb24gPSBjaGFuZ2VzQ29tcGlsYXRpb24uY29tcGlsYXRpb247XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmV4ZWN1dGVDcmVhdGVSZXF1ZXN0cyhjaGFuZ2VzQ29tcGlsYXRpb24pXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5leGVjdXRlTW92ZVJlcXVlc3RzKGNvbXBpbGF0aW9uLm1vdmUpLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5leGVjdXRlVXBkYXRlUmVxdWVzdHMoY29tcGlsYXRpb24udXBkYXRlKSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMuZXhlY3V0ZURlbGV0ZVJlcXVlc3RzKGNvbXBpbGF0aW9uLmRlbGV0ZSksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB0aGlzLml0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGJ1aWxkTW92ZVJlcXVlc3QgKGNvbXBpbGF0aW9uRW50cmllczogSXRlbUVudHJ5W10pOiBBcGlSZXF1ZXN0TW92ZUl0ZW1zIHtcblx0XHRjb25zdCByZXN1bHQ6IEFwaVJlcXVlc3RNb3ZlSXRlbXMgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGNvbXBpbGF0aW9uRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbVR5cGUgPSBpdGVtRW50cnkuaXRlbVR5cGU7XG5cblx0XHRcdGlmIChyZXN1bHRbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzdWx0W2l0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHRbaXRlbVR5cGVdLnB1c2goaXRlbUVudHJ5Lml0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TWFwVmFsdWUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRtYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB0aGlzLml0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IEl0ZW1JZCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKG1hcCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmIChtYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcFtpdGVtVHlwZV1baXRlbUlkXTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZUNyZWF0ZVJlcXVlc3RzIChcblx0XHRjaGFuZ2VzQ29tcGlsYXRpb246IENoYW5nZXNDb21waWxhdGlvbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxhbnlbXT4ge1xuXHRcdGNvbnN0IHJlcXVlc3RzID0gdGhpcy5jcmVhdGVSZXF1ZXN0RmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0Y2hhbmdlc0NvbXBpbGF0aW9uLmNvbXBpbGF0aW9uLmNyZWF0ZSxcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHRcdFx0dGhpcy5icmVha1VwQnlQYXJlbnQsXG5cdFx0XHQpXG5cdFx0XHQucnVuKCk7XG5cblx0XHRjb25zdCByZXNwb25zZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8YW55Pj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgcmVxdWVzdCBvZiByZXF1ZXN0cykge1xuXHRcdFx0cmVzcG9uc2VzLnB1c2goXG5cdFx0XHRcdHRoaXNcblx0XHRcdFx0XHQuZXhlY3V0ZUNyZWF0ZVJlcXVlc3QocmVxdWVzdClcblx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdHJlc3VsdCA9PiB7XG5cdFx0XHRcdFx0XHRcdGlmICh0aGlzLm9uQWZ0ZXJDcmVhdGVDYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5vbkFmdGVyQ3JlYXRlQ2FsbGJhY2sodGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwKTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChyZXNwb25zZXMpO1xuXHR9XG5cblx0Ly8gdG9kb1tjYWNoZV0gdGVzdCBjcmVhdGUgcmVxdWVzdHNcblx0cHJpdmF0ZSBleGVjdXRlQ3JlYXRlUmVxdWVzdCAoXG5cdFx0cmVxdWVzdFJlc291cmNlOiBDcmVhdGVSZXF1ZXN0RW50cnk8YW55Pixcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UucmVxdWVzdFNrZWxldG9uKHJlcXVlc3RSZXNvdXJjZS5yZXF1ZXN0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdFx0XHRjb25zdCByZXNwb25zZU1hcCA9IHJlc3BvbnNlLm1hcDtcblx0XHRcdFx0XHRjb25zdCByZXNwb25zZUNvbHVtbnMgPSByZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKTtcblx0XHRcdFx0XHRjb25zdCBpdGVtRW50cmllcyA9IHJlcXVlc3RSZXNvdXJjZS5pdGVtcztcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaXRlbUVudHJpZXMpIHtcblx0XHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0UmVzb3VyY2UucmVxdWVzdC5jb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbUVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdJdGVtSWQgPSB0aGlzLmdldE1hcFZhbHVlKFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdHBhcnNlSW50KFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0XHRcdFx0MTAsXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZU1hcCxcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRpZiAobmV3SXRlbUlkID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0XHRcdFx0XHQnQ3JlYXRlIGZhaWxlZCEnLFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHdlJ3JlIHN1cmUgdGhlIGVudHJ5IGV4aXN0cywgYmVjYXVzZSBvdGhlcndpc2UgeW91IGNvdWxkbid0IHNhdmUgaXQgaW4gdGhlIGZpcnN0IHBsYWNlXG5cdFx0XHRcdFx0XHRcdGNvbnN0IGxvY2FsSXRlbUVudHJ5ID0gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdCkhO1xuXG5cdFx0XHRcdFx0XHRcdGxvY2FsSXRlbUVudHJ5Lml0ZW1JZCA9IG5ld0l0ZW1JZDtcblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2xvY2FsSXRlbUVudHJ5LmlkXSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyhcblx0XHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2xvY2FsSXRlbUVudHJ5LmlkXVxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuZW50cmllcy5hZGQobG9jYWxJdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhckJ5SXRlbUlkKFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdE51bWJlcihpdGVtSWQpLFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIucHJvY2Vzc0FwaVJlc3BvbnNlKFxuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0TnVtYmVyKG5ld0l0ZW1JZCksXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMsXG5cdFx0XHRcdFx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIGV4dGVuZCBjb252ZXJzaW9uIG1hcFxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gcmVzcG9uc2VNYXApIHtcblx0XHRcdFx0XHRcdGlmICh0aGlzLml0ZW1JZENvbnZlcnNpb25NYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiByZXNwb25zZU1hcFtpdGVtVHlwZV0pIHtcblx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwW2l0ZW1UeXBlXVtpdGVtSWRdID0gcmVzcG9uc2VNYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMudG9BcnJheSgpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdFx0XHRcdGNvbnN0IHBhcmVudCA9IGNvbGxlY3Rpb25FbnRyeS5wYXJlbnQ7XG5cblx0XHRcdFx0XHRcdGlmIChwYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgbmV3UGFyZW50SWQgPSB0aGlzLmdldE1hcFZhbHVlKFxuXHRcdFx0XHRcdFx0XHRcdHBhcmVudC5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRwYXJlbnQuaXRlbUlkLFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChuZXdQYXJlbnRJZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Lml0ZW1JZCA9IG5ld1BhcmVudElkO1xuXG5cdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5ID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KFxuXHRcdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMsXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjb25zdCB1cGRhdGVkQ29sdW1uczoge1tjb2x1bW5JZDogc3RyaW5nXTogQ29sdW1uSW5mbzxhbnk+fSA9XG5cdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5nZXRVcGRhdGVkSXRlbUNvbHVtbnModGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwKTtcblxuXHRcdFx0XHRcdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHVwZGF0ZWRDb2x1bW5zKSkge1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aWYgKHVwZGF0ZWRDb2x1bW5zLmlkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5vbkl0ZW1FbnRyaWVzQ3JlYXRlZChcblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtSWRDb252ZXJzaW9uTWFwW2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlVXBkYXRlUmVxdWVzdHMgKFxuXHRcdGNvbXBpbGF0aW9uOiBVcGRhdGVDb21waWxhdGlvbixcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdHM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2U+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjb21waWxhdGlvbikge1xuXHRcdFx0cmVxdWVzdHMucHVzaChcblx0XHRcdFx0dGhpcy5leGVjdXRlVXBkYXRlUmVxdWVzdChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRjb21waWxhdGlvbltpdGVtVHlwZV0sXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChyZXF1ZXN0cyk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVVcGRhdGVSZXF1ZXN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtRW50cmllczoge1tpdGVtSWQ6IG51bWJlcl06IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+fSxcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdDoge1tpdGVtVHlwZTogc3RyaW5nXToge1tpdGVtSWQ6IG51bWJlcl06IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT59fSA9IHt9O1xuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5zID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHZlcmlmeSBpZiB3ZSBzaG91bGQgY2FsbCBnZXRDb2xsZWN0aW9uTWF0Y2hlciBvbiBTZXJ2ZXJDYWNoZSBvciBUcmFuc2FjdGlvbkNhY2hlXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmdldENvbGxlY3Rpb25NYXRjaGVyKCk7XG5cblx0XHRyZXF1ZXN0W2l0ZW1UeXBlXSA9IHt9O1xuXG5cdFx0Ly8gd2UgbmVlZCB0byBkbyB0aGUgZm9ybWF0UmVxdWVzdCBjYWxsIGhlcmUgKGZpZWxkcyBtaWdodCBoYXZlIGJlZW4gdXBkYXRlZClcblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gaXRlbUVudHJpZXNbaXRlbUlkXTtcblx0XHRcdGNvbnN0IGl0ZW1SZXF1ZXN0OiBhbnkgPSByZXF1ZXN0W2l0ZW1UeXBlXVtpdGVtSWRdID0ge307XG5cdFx0XHRjb25zdCBwYXJhbWV0ZXJzID0gZ2V0UGF0aChcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi50YWJSZXF1ZXN0UGFyYW1ldGVycyxcblx0XHRcdFx0W1xuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XSxcblx0XHRcdCk7XG5cblx0XHRcdGl0ZW1SZXF1ZXN0LnZhbHVlcyA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZm9ybWF0UmVxdWVzdChpdGVtRW50cnkpO1xuXG5cdFx0XHRpZiAocGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGl0ZW1SZXF1ZXN0LnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucy5leHBhbmQoaXRlbUVudHJ5LmNvbHVtbnMpO1xuXG5cdFx0XHQvLyB0b2RvW2NhY2hlXSB0ZXN0XG5cdFx0XHRjb2xsZWN0aW9uTWF0Y2hlci5leHBhbmQoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdLmNoYW5nZXMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25zV2l0aEZpdHRpbmdJdGVtcyA9IGNvbGxlY3Rpb25NYXRjaGVyLmdldENvbGxlY3Rpb25zV2l0aEZpdHRpbmdJdGVtcygpO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uIG9mIGNvbGxlY3Rpb25zV2l0aEZpdHRpbmdJdGVtcykge1xuXHRcdFx0cmVxdWVzdENvbHVtbnMuZXhwYW5kKGNvbGxlY3Rpb24uY29sdW1ucyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgYXBpUmVxdWVzdENvbHVtbnMgPSByZXF1ZXN0Q29sdW1ucy5nZXQoKTtcblxuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQudXBkYXRlSXRlbXMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXF1ZXN0LFxuXHRcdFx0XHRhcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB0aGlzLnNlcnZlckNhY2hlLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVEZWxldGVSZXF1ZXN0cyAoXG5cdFx0Y29tcGlsYXRpb246IERlbGV0ZUNvbXBpbGF0aW9uLFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0czogQXJyYXk8UHJvbWlzZUludGVyZmFjZTx2b2lkPj4gPSBbXTtcblxuXHRcdC8vIGNsZWFyaW5nIG5vdCBuZWNlc3Nhcnlcblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNvbXBpbGF0aW9uKSB7XG5cdFx0XHRyZXF1ZXN0cy5wdXNoKFxuXHRcdFx0XHR0aGlzLmV4ZWN1dGVEZWxldGVSZXF1ZXN0KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGNvbXBpbGF0aW9uW2l0ZW1UeXBlXSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlcXVlc3RzKTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZURlbGV0ZVJlcXVlc3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdCkge1xuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQuZGVsZXRlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUVudHJpZXMubWFwKFxuXHRcdFx0XHRcdGVudHJ5ID0+IGVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0KSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdFx0XHRcdGNvbnN0IHJlc3BvbnNlSWRBcnJheSA9IHJlc3BvbnNlLml0ZW1zO1xuXHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyaWVzVG9CZURlbGV0ZWQ6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHQhaW5BcnJheShcblx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlSWRBcnJheSxcblx0XHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0XHRcdFx0XHQnRGVsZXRlIGZhaWxlZCEnLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXNUb0JlRGVsZXRlZC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1zRGVsZXRlZChpdGVtRW50cmllc1RvQmVEZWxldGVkKTtcblxuXHRcdFx0XHRcdHRoaXMuc2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChcblx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZU1vdmVSZXF1ZXN0cyAoXG5cdFx0Y29tcGlsYXRpb246IE1vdmVDb21waWxhdGlvbixcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdHM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8dm9pZD4+ID0gW107XG5cblx0XHRjb25zdCBleGVjdXRlTW92ZVJlcXVlc3QgPSAoXG5cdFx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0KSA9PiB7XG5cdFx0XHQvLyBvbmx5IHRoZSBwYXJlbnQgaWQgY291bGQgaGF2ZSBiZWVuIHVwZGF0ZWRcblx0XHRcdGNvbnN0IGNvbXBpbGF0aW9uRW50cmllcyA9IGNvbXBpbGF0aW9uW3BhcmVudFR5cGVdW3BhcmVudElkXTtcblx0XHRcdGNvbnN0IG5ld1BhcmVudElkID0gdGhpcy5nZXRNYXBWYWx1ZShcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0cGFyZW50SWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXF1ZXN0cy5wdXNoKFxuXHRcdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHRcdFx0Lm1vdmVJdGVtcyhcblx0XHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRuZXdQYXJlbnRJZCAhPT0gdW5kZWZpbmVkID8gbmV3UGFyZW50SWQgOiBwYXJlbnRJZCxcblx0XHRcdFx0XHRcdHRoaXMuYnVpbGRNb3ZlUmVxdWVzdChjb21waWxhdGlvbkVudHJpZXMpLFxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdFx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSB3aHkgZG9uJ3Qgd2UgdXNlIHRoZSByZXNwb25zZSA/XG5cdFx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGNvbXBpbGF0aW9uRW50cmllcykge1xuXHRcdFx0XHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMaW5rRmllbGRzQnlQYXJlbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZTogcGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtSWQ6IG5ld1BhcmVudElkICE9PSB1bmRlZmluZWQgPyBuZXdQYXJlbnRJZCA6IHBhcmVudElkLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHR0aGlzLnNlcnZlckNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoXG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH07XG5cblx0XHRmb3IgKGNvbnN0IHBhcmVudFR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdGZvciAoY29uc3QgcGFyZW50SWQgaW4gY29tcGlsYXRpb25bcGFyZW50VHlwZV0pIHtcblx0XHRcdFx0ZXhlY3V0ZU1vdmVSZXF1ZXN0KFxuXHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0K3BhcmVudElkLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChyZXF1ZXN0cyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IGluc3RhbnRpYXRlT3B0aW9ucyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbk1hcCwgQXBpUmVxdWVzdENvbHVtbnMsIEVudHJ5UGFyZW50TnVsbCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgSXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZSA9IFBhcnRpYWw8SXRlbUVudHJ5T3B0aW9ucz47XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnlPcHRpb25zIHtcblx0cHVibGljIGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zID0gdHJ1ZTtcblx0cHVibGljIHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbDtcblx0cHVibGljIHRlbXBsYXRlT3B0aW9uczogYW55ID0ge307IC8vIFRPRE9cblx0cHVibGljIHRlbXBsYXRlQ29sdW1uczogQXBpUmVxdWVzdENvbHVtbk1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yICh2YWx1ZXM6IEl0ZW1FbnRyeU9wdGlvbnNJbnRlcmZhY2UpIHtcblx0XHRpbnN0YW50aWF0ZU9wdGlvbnMoXG5cdFx0XHR0aGlzLFxuXHRcdFx0dmFsdWVzLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IGluc3RhbnRpYXRlT3B0aW9ucyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgT25DaGFuZ2VGdW5jdGlvbiB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEl0ZW1SZXNvdXJjZSB9IGZyb20gJy4vSXRlbVJlc291cmNlJztcblxuZXhwb3J0IHR5cGUgSXRlbVJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtUmVzb3VyY2VUeXBlIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4gPSBJdGVtUmVzb3VyY2U8YW55Pj4gPSBQYXJ0aWFsPEl0ZW1SZXNvdXJjZU9wdGlvbnM8SXRlbVJlc291cmNlVHlwZT4+O1xuXG5leHBvcnQgY2xhc3MgSXRlbVJlc291cmNlT3B0aW9uczxJdGVtUmVzb3VyY2VUeXBlIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4gPSBJdGVtUmVzb3VyY2U8YW55Pj4ge1xuXHRwdWJsaWMgZWRpdDogYm9vbGVhbiA9IGZhbHNlO1xuXHRwdWJsaWMgcmVtb3RlOiBib29sZWFuID0gZmFsc2U7XG5cdHB1YmxpYyBvbkNoYW5nZTogT25DaGFuZ2VGdW5jdGlvbjxJdGVtUmVzb3VyY2VUeXBlPiA9IG5vb3A7XG5cblx0Y29uc3RydWN0b3IgKHZhbHVlczogSXRlbVJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtUmVzb3VyY2VUeXBlPikge1xuXHRcdGluc3RhbnRpYXRlT3B0aW9ucyh0aGlzLCB2YWx1ZXMpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxubGV0IGN1cnJlbnRJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblxuXHRwdWJsaWMgaWQ6IG51bWJlciA9ICsrY3VycmVudElkO1xuXHRwdWJsaWMgcmVsb2FkUXVldWVkOiBib29sZWFuID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgZmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRwdWJsaWMgaXRlbUlkOiBJdGVtSWQsXG5cdFx0cHVibGljIGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBxdWV1ZVJlbG9hZCAoKTogdGhpcyB7XG5cdFx0dGhpcy5yZWxvYWRRdWV1ZWQgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NhbCAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuZmFjdG9yeS5rZXlTZXJ2aWNlLmlzTG9jYWxJZCh0aGlzLml0ZW1JZCk7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NrYWJsZSAoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuaXNMb2NhbCgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoICh0aGlzLml0ZW1UeXBlKSB7XG5cdFx0XHRjYXNlICdQcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ01hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdDb250YWN0Jzpcblx0XHRcdGNhc2UgJ01lZGV3ZXJrZXInOlxuXHRcdFx0Y2FzZSAnVm9lcnR1aWcnOlxuXHRcdFx0Y2FzZSAnVGVtcGxhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgdG9KU09OICgpIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aWQ6IHRoaXMuaWQsXG5cdFx0XHRjb2x1bW5zOiB0aGlzLmNvbHVtbnMsXG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgY3JlYXRlUGF0aCwgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRmllbGRNYXAsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbiB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXG5cdHB1YmxpYyBjb2x1bW5zOiB7W2NvbHVtbklkOiBzdHJpbmddOiBSZXNwb25zZUNvbHVtbn07XG5cdHB1YmxpYyBmaWVsZHM6IFJlYWRvbmx5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+O1xuXHRwdWJsaWMgaW5pdGlhbDogUmVhZG9ubHk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj47XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgcmVhZG9ubHkgZmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRwdWJsaWMgcmVhZG9ubHkgZW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHB1YmxpYyByZWFkb25seSBvcHRpb25zOiBJdGVtUmVzb3VyY2VPcHRpb25zPEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pixcblx0XHRwcm90ZWN0ZWQgcmVhZG9ubHkgX2lzTmV3OiBib29sZWFuLFxuXHRcdHByb3RlY3RlZCByZWFkb25seSB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0dGhpcy5jb2x1bW5zID0gZW50cnkuY29sdW1ucy5yZXNwb25zZVtlbnRyeS5jb2x1bW5zLml0ZW1UeXBlXTtcblx0XHR0aGlzLmluaXRpYWwgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5pbml0aWFsO1xuXG5cdFx0dGhpcy5vbkNvbnN0cnVjdCgpO1xuXHR9XG5cblx0Ly8gVXNlZCBmb3IgcmVzb3VyY2UgY2xlYXJpbmcgdGVzdHNcblx0cHVibGljIG9uQ29uc3RydWN0ICgpOiB2b2lkIHtcblxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSB0cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YX0gaW5zdGVhZFxuXHQgKi9cblx0cHVibGljIGNhbGxPbkNoYW5nZSAocHJldmlvdXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4pOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZXMgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1SZXNvdXJjZXNbdGhpcy5lbnRyeS5pZF07XG5cblx0XHRpZiAocmVzb3VyY2VzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vbkNoYW5nZShcblx0XHRcdFx0XHRcdHJlc291cmNlLFxuXHRcdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdFx0XHRjb2x1bW5JZCA9PiB0aGlzLmNvbXBhcmVJdGVtRmllbGQoXG5cdFx0XHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0XHR0aGlzLmZhY3RvcnkuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFV0aWxpdHkgZnVuY3Rpb24gdG8gZWFzaWx5IGNoZWNrIGlmIGEgZmllbGQgaXMgY2hhbmdlZC5cblx0ICogV2lsbCByZXR1cm4gYGZhbHNlYCBpZiB0aGUgZmllbGQgaXMgY2hhbmdlZFxuXHQgKlxuXHQgKiBAZXhhbXBsZVxuXHQgKiBvbkNoYW5nZTogKFxuXHQgKiAgICAgaXRlbVJlc291cmNlLFxuXHQgKiAgICAgcHJldmlvdXMsXG5cdCAqICAgICBjb21wYXJlSXRlbUZpZWxkXG5cdCAqICkge1xuXHQgKiAgICAgaWYgKCFjb21wYXJlSXRlbUZpZWxkKCdjb2x1bW5JZCcpKSB7XG5cdCAqICAgICAgICAgcHJvY2Vzc0l0ZW0oaXRlbVJlc291cmNlKTtcblx0ICogICAgIH1cblx0ICogfVxuXHQgKi9cblx0cHVibGljIGNvbXBhcmVJdGVtRmllbGQgKFxuXHRcdGNvbHVtbklkOiBrZXlvZiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHByZXZpb3VzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbnNbY29sdW1uSWRdO1xuXG5cdFx0aWYgKGNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgY29sdW1uIGluIEl0ZW1SZXNvdXJjZS5jb21wYXJlSXRlbUZpZWxkJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZmFjdG9yeS5hcGlGb3JtYXR0ZXIuY29tcGFyZUZpZWxkcyhcblx0XHRcdGNvbHVtbi50eXBlLFxuXHRcdFx0dGhpcy5maWVsZHNbY29sdW1uSWRdLFxuXHRcdFx0cHJldmlvdXNbY29sdW1uSWRdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgaGFzQ2hhbmdlcyAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC50cmFuc2FjdGlvblxuXHRcdFx0Lml0ZW1IYW5kbGVyXG5cdFx0XHQuZGV0ZWN0RW50cnlDaGFuZ2VzKHRoaXMuZW50cnkuaWQpO1xuXHR9XG5cblx0cHVibGljIHNldFRyYW5zYWN0aW9uUGFyYW1ldGVycyAoXG5cdFx0cGFyYW1ldGVyczogYW55LFxuXHQpOiB2b2lkIHtcblx0XHRjcmVhdGVQYXRoKFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi50YWJSZXF1ZXN0UGFyYW1ldGVycyxcblx0XHRcdFtcblx0XHRcdFx0dGhpcy5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5lbnRyeS5pdGVtSWQsXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHR7fSxcblx0XHRcdFx0cGFyYW1ldGVycyxcblx0XHRcdF0sXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogJ2lzTmV3JyBtZWFucyB0aGF0IHRoZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gaXMgYSBsb2NhbCBpdGVtIGFuZCB0aGF0IHRoaXMgcmVzb3VyY2Ugd2FzIGNyZWF0ZWQgd2hlbiB0aGUge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IHdhcyBmaXJzdCBjcmVhdGVkXG5cdCAqL1xuXHRwdWJsaWMgaXNOZXcgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLl9pc05ldztcblx0fVxuXG5cdHB1YmxpYyBpc0xvY2FsICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5lbnRyeS5pc0xvY2FsKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgdGhlIHJlZmVyZW5jZSB0byB0aGUge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2V9IGZyb20gdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9LCBzbyB0aGF0IHRoZSBPbkNoYW5nZSBjYWxsYmFjayB3b24ndCBiZSBjYWxsZWQgYW55bW9yZS5cblx0ICpcblx0ICogV2FybmluZzpcblx0ICogVGhpcyBkb2Vzbid0IHJldmVydCBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBpdGVtLCBpbiBvcmRlciB0byByZXZlcnQgdGhlIGNoYW5nZXMgeW91IHNob3VsZCB1c2Uge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuY2xlYXJJdGVtRW50cnkgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5jbGVhckl0ZW1FbnRyeX1cblx0ICovXG5cdHB1YmxpYyBjbGVhclJlc291cmNlICgpOiB2b2lkIHtcblx0XHR0aGlzLnRyYW5zYWN0aW9uLmNsZWFySXRlbVJlc291cmNlKHRoaXMpO1xuXHR9XG5cblx0cHVibGljIHRvSlNPTiAoKSB7XG5cdFx0Y29uc3QgY29sdW1uSWRzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiB0aGlzLmNvbHVtbnMpIHtcblx0XHRcdGNvbHVtbklkcy5wdXNoKGNvbHVtbklkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0Y29sdW1uczogY29sdW1uSWRzLFxuXHRcdFx0ZmllbGRzOiB0aGlzLmZpZWxkcyxcblx0XHRcdGVudHJ5OiB0aGlzLmVudHJ5LFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW5QYXRoLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcGF0aCBjb3VsZG4ndCBiZSB0cmF2ZXJzZWRcblx0ICpcblx0ICogQHBhcmFtIGNvbHVtblBhdGggQ2FuIGVpdGhlciBiZSBhbiBhcnJheSBvZiBjb2x1bW5JZHMgKFsnY29sdW1uJywgJ2NvbHVtbjInXSkgb3IgYSBjb25maWcgY29sdW1uIHN0cmluZyAoJ2NvbHVtbj5jb2x1bW4yJylcblx0ICovXG5cdHB1YmxpYyBnZXREZXJpdmVkVmFsdWU8VCBleHRlbmRzIGFueSA9IGFueT4gKGNvbHVtblBhdGg6IHN0cmluZ1tdIHwgc3RyaW5nKTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZ2V0RGVyaXZlZFZhbHVlKFxuXHRcdFx0dGhpcy5lbnRyeSxcblx0XHRcdGNvbHVtblBhdGgsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVHJhdmVyc2VzIHRoZSBjb2x1bW4gcGF0aCBhbmQgcmV0dXJucyB0aGUgZmllbGRzIG9mIHRoZSBkZXJpdmVkIGl0ZW0sIHJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBpdGVtIGlzbid0IGZvdW5kXG5cdCAqXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIEFzc3VtZXMgdGhlIGRlcml2ZWQgaXRlbSdzIHZhbHVlcyBhcmUgYWxyZWFkeSBjYWNoZWRcblx0ICovXG5cdHB1YmxpYyBnZXREZXJpdmVkVmFsdWVzIChcblx0XHRjb2x1bW5QYXRoOiBzdHJpbmdbXSxcblx0KTogUmVhZG9ubHk8RmllbGRNYXA+IHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5nZXREZXJpdmVkVmFsdWVzKFxuXHRcdFx0dGhpcy5lbnRyeSxcblx0XHRcdGNvbHVtblBhdGgsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlLCBJdGVtUmVzb3VyY2VPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT5cblx0ZXh0ZW5kcyBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB7XG5cblx0ZmllbGRzOiBSZWFkb25seTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PjtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdGZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1SZXNvdXJjZU9wdGlvbnM8Vmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGlzTmV3OiBib29sZWFuLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGZhY3RvcnksXG5cdFx0XHRlbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRpc05ldyxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cblx0XHR0aGlzLmZpZWxkcyA9IHRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5jaGFuZ2VzO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEl0ZW1SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtUmVzb3VyY2UsIEl0ZW1SZXNvdXJjZU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRmllbGRNYXAsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PlxuXHRleHRlbmRzIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblxuXHRwcm90ZWN0ZWQgbG9jYWxDb3BpZXM6IEFycmF5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0cHVibGljIGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPjtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0ZmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbVJlc291cmNlT3B0aW9ucyxcblx0XHRpc05ldzogYm9vbGVhbixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRmYWN0b3J5LFxuXHRcdFx0ZW50cnksXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0aXNOZXcsXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXG5cdFx0dGhpcy5maWVsZHMgPSB0cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcztcblx0fVxuXG5cdHB1YmxpYyBpc05ldyAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzTmV3O1xuXHR9XG5cblx0cHVibGljIGNvcHlGaWVsZHMgKGRlc3RpbmF0aW9uOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+ID0ge30pOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmVudHJ5O1xuXG5cdFx0dGhpcy5mYWN0b3J5LmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0dGhpcy5maWVsZHMsXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0KTtcblxuXHRcdHJldHVybiBkZXN0aW5hdGlvbjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVXBkYXRlcyB0aGUgZmllbGRzIG9mIHRoZSBpdGVtIGFuZCBjYWxscyBvbkNoYW5nZSwgd2hlbiB1cGRhdGluZyBtYW55IGZpZWxkcyBvZiBtYW55IGl0ZW1zIGl0J3MgYmV0dGVyIHRvIGNyZWF0ZSBhIHtAbGluayBDaGFuZ2VzRGVsdGEgQ2hhbmdlc0RlbHRhfSB5b3Vyc2VsZiBzbyBhbGwgY2hhbmdlcyBjYW4gYmUgYXBwbGllZCBhdCBvbmNlXG5cdCAqL1xuXHRwdWJsaWMgc2V0RmllbGRzIChcblx0XHR2YWx1ZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dGhpcz4ge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHZhbHVlcykge1xuXHRcdFx0Y29uc3QgY29sdW1uID0gY29sdW1uc1tjb2x1bW5JZF07XG5cblx0XHRcdGlmIChjb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0J3NldEZpZWxkczogbm8gY29sdW1uIGZvdW5kIGZvcicsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy50cmFuc2FjdGlvbi5jcmVhdGVDaGFuZ2VzRGVsdGEoKTtcblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHR2YWx1ZXMsXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHQuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMsXG5cdFx0XHRcdHRoaXMuZmFjdG9yeS5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8vIHRvZG9bY2FjaGVdIFNob3VsZCB5b3Ugc3RpbGwgYmUgYWJsZSB0byBkbyB0aGlzID8gRXZlcnl0aGluZyBzaG91bGQgaGFwcGVuIGluIGEgdHJhbnNhY3Rpb25cblx0Ly8gcHVibGljIHNhdmUgKHBhcmFtZXRlcnM/OiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPHRoaXM+IHtcblx0Ly8gY29uc3QgZmFjdG9yeSA9IHRoaXMuZmFjdG9yeTtcblx0Ly8gY29uc3QgaXRlbUVudHJ5ID0gdGhpcy5lbnRyeTtcblx0Ly8gY29uc3QgcGFyYW1ldGVyTWFwID0ge307XG5cdC8vXG5cdC8vIGlmIChwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHtcblx0Ly8gXHRjcmVhdGVQYXRoKFxuXHQvLyBcdFx0cGFyYW1ldGVyTWFwLFxuXHQvLyBcdFx0W1xuXHQvLyBcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdC8vIFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdC8vIFx0XHRdLFxuXHQvLyBcdFx0W1xuXHQvLyBcdFx0XHR7fSxcblx0Ly8gXHRcdFx0cGFyYW1ldGVycyxcblx0Ly8gXHRcdF0sXG5cdC8vIFx0KTtcblx0Ly8gfVxuXHQvL1xuXHQvLyByZXR1cm4gKFxuXHQvLyBcdGl0ZW1FbnRyeS5pc0xvY2thYmxlKCkgP1xuXHQvLyBcdFx0ZmFjdG9yeS5sb2NrU2VydmljZS5mZXRjaExvY2soaXRlbUVudHJ5KSA6XG5cdC8vIFx0XHRmYWN0b3J5LnByb21pc2VTZXJ2aWNlLndoZW4oKVxuXHQvLyApLnRoZW4oXG5cdC8vIFx0KCkgPT4ge1xuXHQvLyBcdFx0Ly8gYWRkVG9Db2xsZWN0aW9ucyBpcyBjYWxsZWQgaW4gY2hhbmdlc1Byb2Nlc3NvclxuXHQvLyBcdFx0cmV0dXJuIHRoaXMuY2hhbmdlc1Byb2Nlc3Nvci5leGVjdXRlKFxuXHQvLyBcdFx0XHRbaXRlbUVudHJ5XSxcblx0Ly8gXHRcdFx0W10sXG5cdC8vIFx0XHRcdHBhcmFtZXRlck1hcCxcblx0Ly8gXHRcdCk7XG5cdC8vIFx0fSxcblx0Ly8gXHRmYWN0b3J5LmVycm9ySGFuZGxlci5yZWplY3QsXG5cdC8vIClcblx0Ly8gXHQudGhlbihcblx0Ly8gXHRcdCgpID0+IHtcblx0Ly8gXHRcdFx0cmV0dXJuIHRoaXM7XG5cdC8vIFx0XHR9LFxuXHQvLyBcdFx0ZmFjdG9yeS5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHQvLyBcdCk7XG5cdC8vIH1cbn1cbiIsImltcG9ydCB7IGluc3RhbnRpYXRlT3B0aW9ucyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEFwaVJlcXVlc3RDb2x1bW5zLCBBcGlSZXF1ZXN0TGltaXQsIEVudHJ5UGFyZW50TnVsbCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZSA9IFBhcnRpYWw8Q29sbGVjdGlvbkVudHJ5T3B0aW9ucz47XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRW50cnlPcHRpb25zIHtcblx0Y29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMgPSBbXTtcblx0cXVlcnk6IEFwaVF1ZXJ5IHwgbnVsbCA9IG51bGw7XG5cdHF1ZXJ5UGFyYW1zOiBhbnkgPSB7fTsgLy8gVE9ET1xuXHRxdWVyeUNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zID0gW107XG5cdHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbDtcblx0ZGVmZXJSZXF1ZXN0OiBib29sZWFuID0gZmFsc2U7XG5cdGxpbWl0OiBBcGlSZXF1ZXN0TGltaXQgfCBudWxsID0gbnVsbDtcblx0ZW50cnlLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yICh2YWx1ZXM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2UpIHtcblx0XHRpbnN0YW50aWF0ZU9wdGlvbnMoXG5cdFx0XHR0aGlzLFxuXHRcdFx0dmFsdWVzLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IGluc3RhbnRpYXRlT3B0aW9ucyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uUmVzb3VyY2UsIEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbnZlcnNpb25NYXAsIEl0ZW1UeXBlLCBPbkNoYW5nZUZ1bmN0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb3VyY2VDYWxsYmFjazxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSAoXG5cdGl0ZW1SZXNvdXJjZXM6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pixcblx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc291cmNlT25BZGRDYWxsYmFjazxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSAoXG5cdGl0ZW1SZXNvdXJjZXM6IEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pixcblx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0aXNJbml0aWFsQ2FsbDogYm9vbGVhbixcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc291cmNlSW5pdGlhbENhbGxiYWNrPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IChcblx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcbikgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgT25JdGVtc0NyZWF0ZWRDYWxsYmFjayA9IChjb252ZXJzaW9uTWFwOiBDb252ZXJzaW9uTWFwKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IFBhcnRpYWw8Q29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+PjtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IHtcblx0ZWRpdEl0ZW1zOiBib29sZWFuID0gZmFsc2U7XG5cdHJlbW90ZUl0ZW1zOiBib29sZWFuID0gZmFsc2U7XG5cdGVkaXRDb2xsZWN0aW9uOiBib29sZWFuID0gZmFsc2U7XG5cdGVuYWJsZVNhdmU6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdC8qKlxuXHQgKiBAZGVwcmVjYXRlZFxuXHQgKiBZb3Ugc2hvdWxkIHVzZSBpdGVtUmVzb3VyY2Uub25DaGFuZ2UgYW5kIGNvbXBhcmUgcHJldmlvdXMuaWQgd2l0aCBmaWVsZHMuaWRcblx0ICovXG5cdG9uSXRlbXNDcmVhdGVkOiBPbkl0ZW1zQ3JlYXRlZENhbGxiYWNrID0gbm9vcDtcblx0b25DaGFuZ2U6IE9uQ2hhbmdlRnVuY3Rpb24gPSBub29wO1xuXHRvbkFkZDogQ29sbGVjdGlvblJlc291cmNlT25BZGRDYWxsYmFjazxJdGVtVHlwZVR5cGU+ID0gbm9vcDtcblx0b25SZW1vdmU6IENvbGxlY3Rpb25SZXNvdXJjZUNhbGxiYWNrPEl0ZW1UeXBlVHlwZT4gPSBub29wO1xuXHRvbkFkZEluaXRpYWw6IENvbGxlY3Rpb25SZXNvdXJjZUluaXRpYWxDYWxsYmFjazxJdGVtVHlwZVR5cGU+ID0gbm9vcDtcblx0b25SZW1vdmVJbml0aWFsOiBDb2xsZWN0aW9uUmVzb3VyY2VJbml0aWFsQ2FsbGJhY2s8SXRlbVR5cGVUeXBlPiA9IG5vb3A7XG5cdHJlc291cmNlS2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblx0Y3VzdG9tOiBhbnkgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yICh2YWx1ZXM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPikge1xuXHRcdGluc3RhbnRpYXRlT3B0aW9ucyhcblx0XHRcdHRoaXMsXG5cdFx0XHR2YWx1ZXMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSwgQ29sdW1uRXhwYW5zaW9uLCBDb2x1bW5JbmZvLCBDb2x1bW5TZXQsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtblNldEZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRBcGlRdWVyeSxcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdENvbGxlY3Rpb25RdWVyeSxcblx0RW50cnlQYXJlbnROdWxsLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRRdWVyeUNhbGxiYWNrLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmxldCBjdXJyZW50SWQgPSAwO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cblx0cHVibGljIGlkOiBudW1iZXIgPSBjdXJyZW50SWQrKztcblx0cHVibGljIHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbDtcblx0cHVibGljIHF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnk7XG5cdHB1YmxpYyBjb2x1bW5zOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPjtcblx0cHVibGljIHJlbG9hZFF1ZXVlZDogYm9vbGVhbiA9IGZhbHNlO1xuXHRwdWJsaWMgcHJvbWlzZTogUHJvbWlzZUludGVyZmFjZTx0aGlzPjtcblxuXHQvLyBwcml2YXRlIHRlbXBsYXRlQ29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4gfCBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cHVibGljIG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCkge1xuXHRcdHRoaXMucGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG5cdFx0dGhpcy5xdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblx0XHR0aGlzLmNvbHVtbnMgPSB0aGlzLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0U3R1Yihcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgaXNMb2NhbCAoKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMua2V5U2VydmljZS5pc0xvY2FsSWQocGFyZW50Lml0ZW1JZCk7XG5cdH1cblxuXHRwdWJsaWMgbWF0Y2hQYXJlbnQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gPT0gdG8gY29tcGFyZSBpdGVtSWRzXG5cdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRyZXR1cm4gcGFyZW50Lml0ZW1UeXBlID09PSBpdGVtVHlwZSAmJiBwYXJlbnQuaXRlbUlkID09IGl0ZW1JZDtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRRdWVyeSAoY2FsbGJhY2s/OiBRdWVyeUNhbGxiYWNrKTogQXBpUXVlcnkge1xuXHRcdGNvbnN0IG9wdGlvbnMgPSB0aGlzLm9wdGlvbnM7XG5cblx0XHRpZiAoY2FsbGJhY2sgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucXVlcnk7XG5cdFx0fVxuXG5cdFx0b3B0aW9ucy5xdWVyeVBhcmFtcyA9IGNhbGxiYWNrKG9wdGlvbnMucXVlcnlQYXJhbXMpO1xuXG5cdFx0cmV0dXJuIHRoaXMucXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkob3B0aW9ucyk7XG5cdH1cblxuXHRwdWJsaWMgcXVldWVSZWxvYWQgKCk6IHZvaWQge1xuXHRcdHRoaXMucmVsb2FkUXVldWVkID0gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRDb2x1bW5zIChjb2x1bW5FeHBhbnNpb246IENvbHVtbkV4cGFuc2lvbjxJdGVtVHlwZVR5cGU+KTogdm9pZCB7XG5cdFx0Y29uc3QgZXhwYW5zaW9uUmVzdWx0ID0gY29sdW1uRXhwYW5zaW9uLnJ1bih0aGlzLmNvbHVtbnMpO1xuXG5cdFx0aWYgKGV4cGFuc2lvblJlc3VsdCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuY29sdW1ucyA9IGV4cGFuc2lvblJlc3VsdC5tZXJnZWQ7XG5cdFx0Ly8gdGhpcy50ZW1wbGF0ZUNvbHVtbnMgPSBudWxsO1xuXHRcdHRoaXMub3B0aW9ucy5jb2x1bW5zID0gdGhpcy5jb2x1bW5zLnJlcXVlc3Q7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kUmVxdWVzdENvbHVtbnMgKHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IHZvaWQge1xuXHRcdHRoaXMuY29sdW1ucy5leHBhbmRSZXF1ZXN0Q29sdW1ucyhyZXF1ZXN0Q29sdW1ucyk7XG5cdFx0dGhpcy5vcHRpb25zLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMucmVxdWVzdDtcblx0fVxuXG5cdHB1YmxpYyBnZXRVcGRhdGVkSXRlbUNvbHVtbnMgKFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IHtbY29sdW1uSWQ6IHN0cmluZ106IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPn0ge1xuXHRcdGNvbnN0IGl0ZW1Db2x1bW5zID0gdGhpcy5jb2x1bW5zLml0ZW07XG5cdFx0Y29uc3QgcmVzdWx0OiB7W2NvbHVtbklkOiBzdHJpbmddOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT59ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBpdGVtQ29sdW1ucykge1xuXHRcdFx0aWYgKGNvbnZlcnNpb25NYXBbY29sdW1uLmFwaUNvbHVtbi5pdGVtVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXN1bHRbY29sdW1uLmlkXSA9IGNvbHVtbjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Ly8gdG9kb1tjYWNoZV1cblx0Ly8gZ2V0QWRkZWRJdGVtcyAocmV0dXJuSXRlbUlkczogdHJ1ZSk6IEl0ZW1JZFtdO1xuXHQvLyBnZXRBZGRlZEl0ZW1zIChyZXR1cm5JdGVtSWRzPzogYm9vbGVhbik6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pjtcblx0Ly8gZ2V0QWRkZWRJdGVtcyAocmV0dXJuSXRlbUlkczogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdC8vIFx0Y29uc3QgaW5pdGlhbCA9IHRoaXMuaW5pdGlhbDtcblx0Ly8gXHRjb25zdCBtb2RpZmllZCA9IHRoaXMuaXRlbXM7XG5cdC8vIFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB8IEl0ZW1JZD4gPSBbXTtcblx0Ly9cblx0Ly8gXHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBtb2RpZmllZCkge1xuXHQvLyBcdFx0aWYgKGluaXRpYWwuaW5kZXhPZihpdGVtRW50cnkpID09PSAtMSkge1xuXHQvLyBcdFx0XHRyZXN1bHQucHVzaChyZXR1cm5JdGVtSWRzID8gaXRlbUVudHJ5Lml0ZW1JZCA6IGl0ZW1FbnRyeSk7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fVxuXHQvL1xuXHQvLyBcdHJldHVybiByZXN1bHQ7XG5cdC8vIH1cblx0Ly9cblx0Ly8gZ2V0UmVtb3ZlZEl0ZW1zIChyZXR1cm5JdGVtSWRzOiB0cnVlKTogSXRlbUlkW107XG5cdC8vIGdldFJlbW92ZWRJdGVtcyAocmV0dXJuSXRlbUlkcz86IGJvb2xlYW4pOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj47XG5cdC8vIGdldFJlbW92ZWRJdGVtcyAocmV0dXJuSXRlbUlkczogYm9vbGVhbiA9IGZhbHNlKSB7XG5cdC8vIFx0Y29uc3QgaW5pdGlhbCA9IHRoaXMuaW5pdGlhbDtcblx0Ly8gXHRjb25zdCBtb2RpZmllZCA9IHRoaXMuaXRlbXM7XG5cdC8vIFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB8IEl0ZW1JZD4gPSBbXTtcblx0Ly9cblx0Ly8gXHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpbml0aWFsKSB7XG5cdC8vIFx0XHRpZiAobW9kaWZpZWQuaW5kZXhPZihpdGVtRW50cnkpID09PSAtMSkge1xuXHQvLyBcdFx0XHRyZXN1bHQucHVzaChyZXR1cm5JdGVtSWRzID8gaXRlbUVudHJ5Lml0ZW1JZCA6IGl0ZW1FbnRyeSk7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fVxuXHQvL1xuXHQvLyBcdHJldHVybiByZXN1bHQ7XG5cdC8vIH1cblx0Ly9cblx0Ly8gZ2V0VXBkYXRlZEl0ZW1zICgpOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHQvLyBcdGNvbnN0IG1vZGlmaWVkID0gdGhpcy5pdGVtcztcblx0Ly8gXHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHQvL1xuXHQvLyBcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIG1vZGlmaWVkKSB7XG5cdC8vIFx0XHRpZiAoIWl0ZW1FbnRyeS5pc0xvY2FsKCkgJiYgaXRlbUVudHJ5Lmhhc0NoYW5nZXMoKSkge1xuXHQvLyBcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHQvLyBcdFx0fVxuXHQvLyBcdH1cblx0Ly9cblx0Ly8gXHRyZXR1cm4gcmVzdWx0O1xuXHQvLyB9XG5cblx0Ly8gdG9kb1tjYWNoZV0gVGhpcyBpcyB1c2VkIGluIHRoZSBmcm9udGVuZCBpbiB0aGUgcGxhbm5lciwgYnV0IEkgdGhpbmsgd2Ugc2hvdWxkIGZpeCB0aGF0IGluIHRoZSBmcm9udGVuZCBzb21lIG90aGVyIHdheVxuXHQvLyBwdWJsaWMgb25BZGRJbml0aWFsIChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KTogdm9pZCB7XG5cdC8vIFx0Zm9yIChjb25zdCByZXNvdXJjZSBvZiB0aGlzLnJlc291cmNlcykge1xuXHQvLyBcdFx0dHJ5IHtcblx0Ly8gXHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vbkFkZEluaXRpYWwoXG5cdC8vIFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdC8vIFx0XHRcdFx0dGhpcyxcblx0Ly8gXHRcdFx0KTtcblx0Ly8gXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdC8vIFx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fVxuXHQvLyB9XG5cdC8vXG5cdC8vIHB1YmxpYyBvblJlbW92ZUluaXRpYWwgKGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pOiB2b2lkIHtcblx0Ly8gXHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHRoaXMucmVzb3VyY2VzKSB7XG5cdC8vIFx0XHR0cnkge1xuXHQvLyBcdFx0XHRyZXNvdXJjZS5vcHRpb25zLm9uUmVtb3ZlSW5pdGlhbChcblx0Ly8gXHRcdFx0XHRpdGVtRW50cmllcyxcblx0Ly8gXHRcdFx0XHR0aGlzLFxuXHQvLyBcdFx0XHQpO1xuXHQvLyBcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0Ly8gXHRcdFx0dGhpcy5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0Ly8gXHRcdH1cblx0Ly8gXHR9XG5cdC8vIH1cbn1cbiIsImltcG9ydCB7IGZpbHRlckFycmF5IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLCBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZSwgTG9jYWxWaWV3UmVzb3VyY2UgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0RmllbGRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbVJlc291cmNlSXRlbUlkTWFwLFxuXHRJdGVtVHlwZSxcblx0T25DaGFuZ2VGdW5jdGlvbixcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UXVlcnlDYWxsYmFjayxcblx0UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55LCBUIGV4dGVuZHMgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4gPSBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cblx0cHVibGljIGl0ZW1zOiBUW107XG5cdHB1YmxpYyBjb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwO1xuXHRwcm90ZWN0ZWQgaXRlbUlkTWFwOiBJdGVtUmVzb3VyY2VJdGVtSWRNYXA8VD4gPSB7fTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IG9uQ2hhbmdlOiBPbkNoYW5nZUZ1bmN0aW9uO1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIGZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHVibGljIGVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRwdWJsaWMgb3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+LFxuXHRcdHB1YmxpYyB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0dGhpcy5pdGVtcyA9IFtdO1xuXHRcdHRoaXMuaXRlbUlkTWFwID0ge307XG5cdFx0dGhpcy5jb2x1bW5zID0gZW50cnkuY29sdW1ucy5yZXNwb25zZTtcblxuXHRcdC8vIHRoaXMgYWxsb3dzIHVzIHRvIHVwZGF0ZSB0aGUgb25DaGFuZ2UgZnVuY3Rpb24gaW4gdGhlIG9wdGlvbnNcblx0XHR0aGlzLm9uQ2hhbmdlID0gKFxuXHRcdFx0aXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRcdHByZXZpb3VzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdCkgPT4ge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHQhaXRlbVJlc291cmNlLmNvbXBhcmVJdGVtRmllbGQoXG5cdFx0XHRcdFx0J2lkJyxcblx0XHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdC8vIHRvZG9bY2FjaGVdIGNoZWNrIGlmIHByZXZpb3VzLmlkIG1hdGNoZXMgd2l0aCBJRHMgaW4gdGhlIG1hcFxuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSWRNYXBbcHJldmlvdXMuaWRdO1xuXHRcdFx0XHR0aGlzLml0ZW1JZE1hcFtpdGVtUmVzb3VyY2UuZW50cnkuaXRlbUlkXSA9IGl0ZW1SZXNvdXJjZSBhcyBUO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLm9wdGlvbnMub25DaGFuZ2UoXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZSxcblx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdGNvbHVtbklkID0+IGl0ZW1SZXNvdXJjZS5jb21wYXJlSXRlbUZpZWxkKFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9O1xuXG5cdFx0dGhpcy5hZGRJdGVtUmVzb3VyY2VzKFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1t0aGlzLmVudHJ5LmlkXSxcblx0XHRcdHRydWUsXG5cdFx0KTtcblxuXHRcdHRoaXMub25Db25zdHJ1Y3QoKTtcblx0fVxuXG5cdC8vIFVzZWQgZm9yIHJlc291cmNlIGNsZWFyaW5nIHRlc3RzXG5cdHB1YmxpYyBvbkNvbnN0cnVjdCAoKTogdm9pZCB7XG5cblx0fVxuXG5cdHB1YmxpYyBnZXRJZEFycmF5ICgpOiBJdGVtSWRbXSB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbXMubWFwKFxuXHRcdFx0aXRlbVJlc291cmNlID0+IGl0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWQsXG5cdFx0KTtcblx0fVxuXG5cdC8vIHRvZG9bdHlwZV0gSXRlbXMgY2FuIGJlIHVuZGVmaW5lZCwgYnV0IHRoaXMgZ2l2ZXMgYSBsb3Qgb2YgZXJyb3JzIGZyb250ZW5kXG5cdHB1YmxpYyBnZXRJdGVtQnlJZCAoaXRlbUlkOiBudW1iZXIpOiBUIHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtSWRNYXBbaXRlbUlkXTtcblx0fVxuXG5cdHB1YmxpYyBhZGRJdGVtUmVzb3VyY2VzIChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdF9pc0luaXRpYWxDYWxsOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFRbXSB7IC8vIHNob3VsZCBiZSBmYXN0XG5cdFx0aWYgKGl0ZW1FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblxuXHRcdGNvbnN0IGxvY2FsSXRlbUVudHJpZXMgPSB0aGlzLml0ZW1zLm1hcChcblx0XHRcdGl0ZW1SZXNvdXJjZSA9PiBpdGVtUmVzb3VyY2UuZW50cnksXG5cdFx0KTtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIGxvb2sgaW4gaXRlbUlkTWFwID8gd2Ugb25seSB3YW50IHRvIGFkZCByZXNvdXJjZXMgaWYgdGhlcmUgaXMgbm9uZSB5ZXRcblx0XHRpdGVtRW50cmllcyA9IGl0ZW1FbnRyaWVzLmZpbHRlcihcblx0XHRcdGl0ZW1FbnRyeSA9PiBsb2NhbEl0ZW1FbnRyaWVzLmluZGV4T2YoaXRlbUVudHJ5KSA9PT0gLTEsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmNyZWF0ZUl0ZW1SZXNvdXJjZXMoXG5cdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdHtcblx0XHRcdFx0cmVtb3RlOiB0aGlzLm9wdGlvbnMucmVtb3RlSXRlbXMsXG5cdFx0XHRcdGVkaXQ6IHRoaXMub3B0aW9ucy5lZGl0SXRlbXMsXG5cdFx0XHRcdG9uQ2hhbmdlOiB0aGlzLm9uQ2hhbmdlLFxuXHRcdFx0fSxcblx0XHQpIGFzIFRbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1JZCA9IGl0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWQ7XG5cblx0XHRcdGlmICh0aGlzLml0ZW1JZE1hcFtpdGVtSWRdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBZGRlZCBhIHJlc291cmNlIG9mIGFuIGVudHJ5IHRoYXQgd2FzIGFscmVhZHkgaW4gdGhlIGNvbGxlY3Rpb24gIScpO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLml0ZW1zLnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdHRoaXMuaXRlbUlkTWFwW2l0ZW1JZF0gPSBpdGVtUmVzb3VyY2U7XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gSXQgd291bGQgYmUgbmljZSB0byBjYWxsICdvbkFkZCcgYWxzbyB3aXRoIHRoZSBpbml0aWFsIHNldCBvZiByZXNvdXJjZXMsIGJ1dCB0aGF0IGlzIGEgbG90IG9mIHdvcmsgdG8gaW1wbGVtZW50IGZyb250ZW5kXG5cdFx0Ly8gdGhpcy5jYWxsT25BZGQoXG5cdFx0Ly8gXHRpdGVtUmVzb3VyY2VzLFxuXHRcdC8vIFx0aXNJbml0aWFsQ2FsbCxcblx0XHQvLyApO1xuXG5cdFx0cmV0dXJuIGl0ZW1SZXNvdXJjZXM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30gdGhhdCB3aGVyZSByZW1vdmVkIGZyb20gdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgY29sbGVjdGlvbn0uXG5cdCAqIEZpbHRlcnMgb24ge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2V9LntAbGluayBJdGVtRW50cnkgZW50cnl9ID09PSB7QGxpbmsgSXRlbUVudHJ5IGVudHJ5fVxuXHQgKi9cblx0cHVibGljIHJlbW92ZUl0ZW1SZXNvdXJjZXMgKGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pOiBUW10ge1xuXHRcdGNvbnN0IHJlc3VsdDogVFtdID0gW107XG5cblx0XHRmaWx0ZXJBcnJheShcblx0XHRcdHRoaXMuaXRlbXMsXG5cdFx0XHRpdGVtUmVzb3VyY2UgPT4ge1xuXHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0XHRcdGlmIChpdGVtUmVzb3VyY2UuZW50cnkgPT09IGl0ZW1FbnRyeSkge1xuXHRcdFx0XHRcdFx0aXRlbVJlc291cmNlLmNsZWFyUmVzb3VyY2UoKTtcblx0XHRcdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1SZXNvdXJjZSk7XG5cdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSWRNYXBbaXRlbUVudHJ5Lml0ZW1JZF07XG5cblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH0sXG5cdFx0KTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgY2FsbE9uQWRkIChcblx0XHRpdGVtUmVzb3VyY2VzOiBUW10sXG5cdFx0aXNJbml0aWFsQ2FsbDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiB2b2lkIHtcblx0XHR0cnkge1xuXHRcdFx0dGhpcy5vcHRpb25zLm9uQWRkKFxuXHRcdFx0XHRpdGVtUmVzb3VyY2VzLFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRpc0luaXRpYWxDYWxsLFxuXHRcdFx0KTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0dGhpcy5mYWN0b3J5LmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjYWxsT25SZW1vdmUgKGl0ZW1SZXNvdXJjZXM6IFRbXSk6IHZvaWQge1xuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMub25SZW1vdmUoXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZXMsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmZhY3RvcnkuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZvckVhY2ggKGNhbGxiYWNrOiAoaXRlbVJlc291cmNlOiBUKSA9PiB2b2lkKTogdm9pZCB7XG5cdFx0Y29uc3QgaXRlbVJlc291cmNlcyA9IHRoaXMuaXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtUmVzb3VyY2VzKSB7XG5cdFx0XHRjYWxsYmFjayhpdGVtUmVzb3VyY2UpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBmaWx0ZXIgKGNhbGxiYWNrOiAoaXRlbVJlc291cmNlOiBUKSA9PiBib29sZWFuKTogVFtdIHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblx0XHRjb25zdCByZXN1bHQ6IFRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0aWYgKGNhbGxiYWNrKGl0ZW1SZXNvdXJjZSkpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGZpcnN0IChjYWxsYmFjazogKGl0ZW1SZXNvdXJjZTogVCkgPT4gYm9vbGVhbik6IFQgfCBudWxsIHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdGlmIChjYWxsYmFjayhpdGVtUmVzb3VyY2UpKSB7XG5cdFx0XHRcdHJldHVybiBpdGVtUmVzb3VyY2U7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRwdWJsaWMgc29tZSAoY2FsbGJhY2s6IChpdGVtUmVzb3VyY2U6IFQpID0+IGJvb2xlYW4pOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5maXJzdChjYWxsYmFjaykgIT09IG51bGw7XG5cdH1cblxuXHRwdWJsaWMgZ3JvdXBCeSAoYXJndW1lbnQ6IHN0cmluZyB8ICgoaXRlbVJlc291cmNlOiBUKSA9PiBzdHJpbmcgfCBudWxsKSk6IHtba2V5OiBzdHJpbmddOiBUW119IHtcblx0XHRjb25zdCBpdGVtc1Jlc291cmNlcyA9IHRoaXMuaXRlbXM7XG5cdFx0Y29uc3QgcmVzdWx0OiB7W2tleTogc3RyaW5nXTogVFtdfSA9IHt9O1xuXG5cdFx0aWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGlmICh0aGlzLmVudHJ5LmNvbHVtbnMucmVzcG9uc2VbdGhpcy5lbnRyeS5pdGVtVHlwZV1bYXJndW1lbnRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBUcnlpbmcgdG8gZ3JvdXAgb24gYSBjb2x1bW4gbm90IHJlcXVlc3RlZCBieSB0aGlzIGNvbGxlY3Rpb24hIChjb2x1bW4gJyR7YXJndW1lbnR9JylgKTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbXNSZXNvdXJjZXMpIHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBpdGVtUmVzb3VyY2UuZmllbGRzW2FyZ3VtZW50XTtcblxuXHRcdFx0XHRpZiAocmVzdWx0W3ZhbHVlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmVzdWx0W3ZhbHVlXSA9IFtdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0W3ZhbHVlXS5wdXNoKGl0ZW1SZXNvdXJjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ2Z1bmN0aW9uJykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbXNSZXNvdXJjZXMpIHtcblx0XHRcdFx0Y29uc3QgdmFsdWUgPSBhcmd1bWVudChpdGVtUmVzb3VyY2UpO1xuXG5cdFx0XHRcdGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHJlc3VsdFt2YWx1ZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJlc3VsdFt2YWx1ZV0gPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdFt2YWx1ZV0ucHVzaChpdGVtUmVzb3VyY2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgbWFwPFU+IChhcmd1bWVudDogc3RyaW5nIHwgKChpdGVtUmVzb3VyY2U6IFQpID0+IFUpKTogVVtdIHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblx0XHRjb25zdCBsZW5ndGggPSBpdGVtUmVzb3VyY2VzLmxlbmd0aDtcblx0XHRjb25zdCByZXN1bHQgPSBuZXcgQXJyYXkobGVuZ3RoKTtcblxuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IGl0ZW1SZXNvdXJjZXNbaV0uZmllbGRzW2FyZ3VtZW50XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdHJlc3VsdFtpXSA9IGFyZ3VtZW50KGl0ZW1SZXNvdXJjZXNbaV0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgcmVkdWNlPFU+IChcblx0XHRjYWxsYmFjazogKFxuXHRcdFx0aXRlbVJlc291cmNlOiBULFxuXHRcdFx0dmFsdWU6IFUsXG5cdFx0KSA9PiBVLFxuXHRcdHZhbHVlOiBVLFxuXHQpOiBVIHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdHZhbHVlID0gY2FsbGJhY2soXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZSxcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBuZXcgaXRlbXMgYW5kIGFkZHMgdGhlbSB0byB0aGUgY29sbGVjdGlvblxuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiAtIFVzZWQgdG8gcmV0dXJuIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30sIGJ1dCB5b3Ugc2hvdWxkIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLm9uQWRkIG9uQWRkKSBpbnN0ZWFkXG5cdCAqL1xuXHRwdWJsaWMgZXh0ZW5kIChcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC50cmFuc2FjdGlvblxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZXh0ZW5kQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0XHRxdWVyeUNhbGxiYWNrLFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZX0gZnJvbSB0aGUge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9XG5cdCAqXG5cdCAqIEByZW1hcmtzXG5cdCAqIC0gRG9lc24ndCByZXZlcnQgY2hhbmdlcyBvbiB0aGUgaXRlbXMgdGhlbXNlbHZlc1xuXHQgKi9cblx0cHVibGljIGNsZWFyUmVzb3VyY2UgKGNsZWFySXRlbXM6IGJvb2xlYW4gPSB0cnVlKTogdm9pZCB7XG5cdFx0aWYgKGNsZWFySXRlbXMpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIHRoaXMuaXRlbXMpIHtcblx0XHRcdFx0aXRlbVJlc291cmNlLmNsZWFyUmVzb3VyY2UoKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLnRyYW5zYWN0aW9uLmNsZWFyQ29sbGVjdGlvblJlc291cmNlKHRoaXMpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsXG5cdEl0ZW1SZXNvdXJjZSxcblx0TG9jYWxWaWV3UmVzb3VyY2UsXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnksIFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiA9IExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+XG5cdGV4dGVuZHMgQ29sbGVjdGlvblJlc291cmNlIDxJdGVtVHlwZVR5cGUsIFQ+IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlPixcblx0XHR0cmFuc2FjdGlvbkNhY2hlOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0dHJhbnNhY3Rpb25DYWNoZSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4uL2NsYXNzZXMvQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FbnRyeSxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLFxuXHRJdGVtRW50cnksXG5cdEl0ZW1SZXNvdXJjZSxcblx0TG9jYWxWaWV3UmVzb3VyY2UsXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnksIFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiA9IExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+XG5cdGV4dGVuZHMgQ29sbGVjdGlvblJlc291cmNlIDxJdGVtVHlwZVR5cGUsIFQ+IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0ZmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnM8SXRlbVR5cGVUeXBlPixcblx0XHR0cmFuc2FjdGlvbkNhY2hlOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0dHJhbnNhY3Rpb25DYWNoZSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSB7QGxpbmsgQ2hhbmdlc0RlbHRhLnNldEl0ZW1Nb3ZlZCBDaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkfVxuXHQgKi9cblx0cHVibGljIG1vdmVJdGVtcyAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRkZXN0aW5hdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0KTogdm9pZCB7XG5cdFx0aWYgKHRoaXMub3B0aW9ucy5lbmFibGVTYXZlKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ2NvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2U6IENhbm5vdCBtb3ZlIGl0ZW1zOiBzYXZpbmcgZW5hYmxlZCcpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQudHJhbnNhY3Rpb25cblx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0Lm1vdmVJdGVtcyhcblx0XHRcdFx0dGhpcy5lbnRyeSxcblx0XHRcdFx0ZGVzdGluYXRpb25SZXNvdXJjZS5lbnRyeSxcblx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSB7QGxpbmsgQ2hhbmdlc0RlbHRhLnNldEl0ZW1EZWxldGVkIENoYW5nZXNEZWx0YS5zZXRJdGVtRGVsZXRlZH1cblx0ICovXG5cdHB1YmxpYyByZW1vdmVJdGVtcyAoXG5cdFx0aWRBcnJheTogSXRlbUlkW10sXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuZmFjdG9yeS5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblx0XHRjb25zdCByZW1vdmVkSXRlbUVudHJpZXM6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiB0aGlzLml0ZW1zKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtUmVzb3VyY2UuZW50cnk7XG5cblx0XHRcdGlmIChpZEFycmF5LmluZGV4T2YoaXRlbUVudHJ5Lml0ZW1JZCkgPT09IC0xKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZW1vdmVkSXRlbUVudHJpZXMucHVzaChpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtc0RlbGV0ZWQocmVtb3ZlZEl0ZW1FbnRyaWVzKTtcblxuXHRcdHRoaXMudHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChjaGFuZ2VzRGVsdGEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSB7QGxpbmsgQ2hhbmdlc0RlbHRhLnNldEl0ZW1EZWxldGVkIENoYW5nZXNEZWx0YS5zZXRJdGVtRGVsZXRlZH1cblx0ICovXG5cdHB1YmxpYyByZW1vdmVJdGVtIChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlSXRlbXMoXG5cdFx0XHRbaXRlbUlkXSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFVzZSB7QGxpbmsgQ2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkIENoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZH1cblx0ICpcblx0ICogdG9kb1tjYWNoZV0gdGhpcyB3aWxsIGZldGNoQ29sbGVjdGlvbkVudHJ5IGEgdGVtcGxhdGUgZm9yIHlvdSwgbWFrZSBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uID9cblx0ICovXG5cdHB1YmxpYyBhZGRJdGVtcyAoXG5cdFx0dmFsdWVzQXJyYXk6IEFycmF5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENoYW5nZXNEZWx0YVJlc3VsdD4ge1xuXHRcdC8vIHdpbGwgY3JlYXRlIGFuZCBhcHBseSBhIENoYW5nZXNEZWx0YVxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyXG5cdFx0XHQuY3JlYXRlSXRlbXMoXG5cdFx0XHRcdHRoaXMuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdHZhbHVlc0FycmF5LFxuXHRcdFx0XHR0aGlzLmVudHJ5LnBhcmVudCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICogVXNlIHtAbGluayBDaGFuZ2VzRGVsdGEuc2V0SXRlbUNyZWF0ZWQgQ2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkfVxuXHQgKlxuXHQgKiB0b2RvW2NhY2hlXSB0aGlzIHdpbGwgZmV0Y2hDb2xsZWN0aW9uRW50cnkgYSB0ZW1wbGF0ZSBmb3IgeW91LCBtYWtlIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gP1xuXHQgKi9cblx0cHVibGljIGFkZEl0ZW0gKFxuXHRcdHZhbHVlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hZGRJdGVtcyhcblx0XHRcdFt2YWx1ZXNdLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVGVtcGxhdGVGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlLCBGaWVsZE1hcCwgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT47XG5cdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcDtcblx0Y29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT47IC8vIFRPRE86IHJlbmFtZSB0byBjb2x1bW5TZXRcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0ZmFjdG9yeTogVGVtcGxhdGVGYWN0b3J5LFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHB1YmxpYyByZXNwb25zZTogQXBpUmVzcG9uc2UsXG5cdFx0YWRkaXRpb25hbENvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCkge1xuXHRcdHRoaXMuZmllbGRzID0gcmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlLmxpbmtzW2l0ZW1UeXBlXVswXSxcblx0XHQpITtcblxuXHRcdHRoaXMucmVzcG9uc2VDb2x1bW5zID0gZmFjdG9yeS5jb2x1bW5VdGlsLm1lcmdlUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRhZGRpdGlvbmFsQ29sdW1ucyxcblx0XHQpLm1lcmdlZDtcblxuXHRcdHRoaXMuY29sdW1ucyA9IGZhY3RvcnkuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3RGcm9tUmVzcG9uc2UoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHRoaXMucmVzcG9uc2VDb2x1bW5zLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZU9wdGlvbnMsIFZpZXdSZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT5cblx0ZXh0ZW5kcyBWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdGZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1SZXNvdXJjZU9wdGlvbnM8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGlzTmV3OiBib29sZWFuLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGZhY3RvcnksXG5cdFx0XHRlbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRpc05ldyxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cblx0XHR0aGlzLmZpZWxkcyA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmluaXRpYWw7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZU9wdGlvbnMsIFZpZXdSZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PlxuXHRleHRlbmRzIFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0ZmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbVJlc291cmNlT3B0aW9ucyxcblx0XHRpc05ldzogYm9vbGVhbixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRmYWN0b3J5LFxuXHRcdFx0ZW50cnksXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0aXNOZXcsXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXG5cdFx0dGhpcy5maWVsZHMgPSB0cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcztcblx0fVxufVxuIiwiLy8gc2hvdWxkIGJlIG9yZGVyZWQgYnkgZGVwZW5kZW5jeSFcbmV4cG9ydCAqIGZyb20gJy4vSXRlbUVudHJ5T3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1SZXNvdXJjZU9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtRW50cnknO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtUmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9WaWV3UmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FZGl0UmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uRW50cnlPcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25FbnRyeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25SZXNvdXJjZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25WaWV3UmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uRWRpdFJlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vVGVtcGxhdGUnO1xuZXhwb3J0ICogZnJvbSAnLi9SZW1vdGVWaWV3UmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Mb2NhbFZpZXdSZXNvdXJjZSc7XG4iLCJpbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciwgQ29sbGVjdGlvbk1hdGNoZXIsIENvbHVtblNldCwgUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5LFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1FbnRyeSxcblx0SXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZSxcblx0SXRlbVJlc291cmNlLFxuXHRJdGVtUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLFxufSBmcm9tICcuLi9tb2RlbHMnO1xuXG5leHBvcnQgdHlwZSBFbnRyeVBhcmVudCA9IHtpdGVtVHlwZTogc3RyaW5nLCBpdGVtSWQ6IG51bWJlcn07XG5cbmV4cG9ydCB0eXBlIEVudHJ5UGFyZW50TnVsbCA9IEVudHJ5UGFyZW50IHwgbnVsbDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFVzZWQgZm9yIGZpZWxkcyB0aGF0IGJlbG9uZyB0byBhIHNwZWNpZmljIGl0ZW1UeXBlXG4gKi9cbmV4cG9ydCB0eXBlIEZpZWxkTWFwPF9JdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdFtrZXk6IHN0cmluZ106IGFueVxufTtcblxuZXhwb3J0IHR5cGUgSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSBJdGVtRW50cnlPcHRpb25zSW50ZXJmYWNlICYgSXRlbVJlc291cmNlT3B0aW9uc0ludGVyZmFjZTtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID1cblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZVxuXHQmIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPjtcblxuZXhwb3J0IGludGVyZmFjZSBDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlO1xuXHRvcHRpb25zOiB7ZW50cnk6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsIHJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZT59O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT5cblx0ZXh0ZW5kcyBDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+IHtcblx0bGlua0ZpZWxkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCB0eXBlIE9uQ2hhbmdlRnVuY3Rpb248SXRlbVJlc291cmNlVHlwZSBleHRlbmRzIEl0ZW1SZXNvdXJjZTxhbnk+ID0gSXRlbVJlc291cmNlPGFueT4+ID0gKFxuXHRpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZVR5cGUsXG5cdHByZXZpb3VzOiBGaWVsZE1hcDxJdGVtUmVzb3VyY2VUeXBlWydlbnRyeSddWydpdGVtVHlwZSddPixcblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zICd0cnVlJyBpZiB0aGUgZmllbGQgY2hhbmdlZFxuXHQgKi9cblx0Y29tcGFyZUZpZWxkOiAoZmllbGQ6IGtleW9mIEZpZWxkTWFwPEl0ZW1SZXNvdXJjZVR5cGVbJ2VudHJ5J11bJ2l0ZW1UeXBlJ10+KSA9PiBib29sZWFuLFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgY29uc3QgZW51bSBTdGF0ZUtleVR5cGUge1xuXHROZXcgPSAnbmV3Jyxcblx0RHVwbGljYXRlID0gJ2R1cGxpY2F0ZSdcbn1cblxuZXhwb3J0IHR5cGUgU3RhdGVLZXkgPSB7dHlwZTogU3RhdGVLZXlUeXBlLCB0ZW1wbGF0ZT86IHN0cmluZywgaXRlbUlkPzogbnVtYmVyfTtcblxuZXhwb3J0IHR5cGUgU29ja2V0TWVzc2FnZVR5cGUgPSAnZXZlbnQnIHwgJ25vdGlmaWNhdGlvbic7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0TWVzc2FnZSB7XG5cdGhlYWRlcjoge1xuXHRcdGRvbWFpbjogc3RyaW5nLFxuXHRcdGFjY291bnQ6IHN0cmluZyxcblx0XHRzZW5kZXI6IHtcblx0XHRcdGRpc3BsYXluYW1lOiBzdHJpbmcsXG5cdFx0XHRpdGVtVHlwZTogJ01lZGV3ZXJrZXInLFxuXHRcdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0XHRhdXRob3JpemVkOiBib29sZWFuLFxuXHRcdFx0c2Vzc2lvbjogc3RyaW5nXG5cdFx0fSxcblx0XHRtZXNzYWdlSWQ6IHtcblx0XHRcdElkOiBzdHJpbmcsXG5cdFx0XHRzZXF1ZW5jZTogbnVtYmVyLFxuXHRcdFx0YmF0Y2g6IG51bWJlcixcblx0XHRcdHJlcXVlc3Q6IG51bWJlclxuXHRcdH0sXG5cdFx0c2VudDogc3RyaW5nLFxuXHRcdGZvcmNlRXZhbHVhdGU6IGJvb2xlYW5cblx0fTtcblx0Ym9keTogYW55O1xuXHRtZXNzYWdlVHlwZTogU29ja2V0TWVzc2FnZVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0TWVzc2FnZUNyZWF0ZVxuXHRleHRlbmRzIFNvY2tldE1lc3NhZ2Uge1xuXG5cdGJvZHk6IHtcblx0XHRldmVudFR5cGU6ICdjcmVhdGUnLFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXBcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbXM6IHtcblx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0XHRbaXRlbUlkOiBudW1iZXJdOiB7XG5cdFx0XHRcdFx0cGFyZW50OiBudWxsIHwgRW50cnlQYXJlbnQsXG5cdFx0XHRcdFx0dmFsdWVzOiBGaWVsZE1hcFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldE1lc3NhZ2VVcGRhdGVcblx0ZXh0ZW5kcyBTb2NrZXRNZXNzYWdlIHtcblxuXHRib2R5OiB7XG5cdFx0ZXZlbnRUeXBlOiAndXBkYXRlJyxcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1zOiB7XG5cdFx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFx0W2l0ZW1JZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdHBhcmVudDogbnVsbCB8IEVudHJ5UGFyZW50LFxuXHRcdFx0XHRcdHZhbHVlczogRmllbGRNYXBcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRNZXNzYWdlTGlua1RvXG5cdGV4dGVuZHMgU29ja2V0TWVzc2FnZSB7XG5cblx0Ym9keToge1xuXHRcdGV2ZW50VHlwZTogJ2xpbmt0bycsXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtczoge1xuXHRcdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtpdGVtSWQ6IG51bWJlcl06IHtcblx0XHRcdFx0XHRwYXJlbnQ6IG51bGwgfCBFbnRyeVBhcmVudCxcblx0XHRcdFx0XHR2YWx1ZXM6IEZpZWxkTWFwXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0TWVzc2FnZURlbGV0ZVxuXHRleHRlbmRzIFNvY2tldE1lc3NhZ2Uge1xuXG5cdGJvZHk6IHtcblx0XHRldmVudFR5cGU6ICdkZWxldGUnLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtczogSXRlbUlkW11cblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGdW5jdGlvbkNoYW5nZXNSZXNvbHZlU29ja2V0TWVzc2FnZVxuXHRleHRlbmRzIFNvY2tldE1lc3NhZ2Uge1xuXHRib2R5OiB7XG5cdFx0aXRlbVR5cGU6ICdGdW5jdGlvbkNoYW5nZXNSZXNvbHZlJyxcblx0XHRba2V5OiBzdHJpbmddOiBhbnlcblx0fTtcbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSByZXNvdXJjZVxuXG5leHBvcnQgdHlwZSBJdGVtUmVzb3VyY2VJdGVtSWRNYXA8VCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxhbnk+ID0gSXRlbVJlc291cmNlPGFueT4+ID0ge1xuXHRbaXRlbUlkOiBudW1iZXJdOiBUXG59O1xuXG5leHBvcnQgdHlwZSBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXA8VCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxhbnk+ID0gSXRlbVJlc291cmNlPGFueT4+ID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IFRbXVxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSXRlbSBFbnRyeVxuXG5leHBvcnQgdHlwZSBJdGVtSWQgPSBudW1iZXI7XG5cbmV4cG9ydCB0eXBlIEl0ZW1UeXBlID0gc3RyaW5nO1xuXG5leHBvcnQgdHlwZSBJdGVtTWFwPFQ+ID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRbaXRlbUlkOiBzdHJpbmddOiBUXG5cdH1cbn07XG5cbmV4cG9ydCB0eXBlIEl0ZW1FbnRyeU1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSBJdGVtTWFwPEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PjtcblxuZXhwb3J0IHR5cGUgSXRlbUVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge1xuXHRbcGFyZW50SWQ6IG51bWJlcl06IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pjtcbn07XG5cbmV4cG9ydCB0eXBlIENvbnZlcnNpb25NYXAgPSB7XG5cdFtpdGVtSWQ6IG51bWJlcl06IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogQ29udmVyc2lvbk1hcFxufTtcblxuZXhwb3J0IHR5cGUgQ3JlYXRlUmVxdWVzdFBhcmFtZXRlck1hcDxUID0gYW55PiA9IEl0ZW1NYXA8VD47XG5cbmV4cG9ydCB0eXBlIEl0ZW1FcnJvciA9IHttZXNzYWdlOiBzdHJpbmd9O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb2xsZWN0aW9uIEVudHJ5XG5cbmV4cG9ydCB0eXBlIFF1ZXJ5UGFyYW1zID0gYW55OyAvLyBUT0RPXG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25RdWVyeSA9IHtvYmplY3Q6IG9iamVjdCwgc3RyaW5nOiBzdHJpbmd9O1xuXG5leHBvcnQgdHlwZSBRdWVyeUNhbGxiYWNrID0gKHF1ZXJ5UGFyYW1zOiBRdWVyeVBhcmFtcykgPT4gUXVlcnlQYXJhbXM7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHtcblx0W3BhcmVudElkOiBudW1iZXJdOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPlxufTtcblxuZXhwb3J0IHR5cGUgQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8VCBleHRlbmRzIENvbGxlY3Rpb25SZXNvdXJjZTxhbnk+ID0gQ29sbGVjdGlvblJlc291cmNlPGFueT4+ID0ge1xuXHRbcGFyZW50SWQ6IG51bWJlcl06IFRcbn07XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdGZpdHRpbmc6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0bm90Zml0dGluZzogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRtYXliZTogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuZGVkQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPlxuXHRleHRlbmRzIENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGU+IHtcblx0Y29sbGVjdGlvbjogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR3JvdXBlZEV4dGVuZGVkQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cdFtjb2xsZWN0aW9uSWQ6IG51bWJlcl06IEV4dGVuZGVkQ29sbGVjdGlvbk1hdGNoUmVzdWx0PEl0ZW1UeXBlVHlwZT47XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IENvbHVtbnNcblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VDb2x1bW4gPSBhbnk7IC8vIFRPRE9cblxuZXhwb3J0IHR5cGUgUmVzcG9uc2VDb2x1bW5NYXAgPSB7XG5cdFtjb2x1bW5JZDogc3RyaW5nXTogUmVzcG9uc2VDb2x1bW5cbn07XG5cbmV4cG9ydCB0eXBlIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogUmVzcG9uc2VDb2x1bW5NYXBcbn07XG5cbmV4cG9ydCB0eXBlIENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdG1lcmdlZDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdGRpZmZlcmVuY2U6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+XG59O1xuXG5leHBvcnQgdHlwZSBSb290Q29sdW1uTWFwID0ge1tjb2x1bW5JZDogc3RyaW5nXToge2FwaUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sIGNoaWxkcmVuOiBSb290Q29sdW1uTWFwfX07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFwaSByZWZlcmVuY2VcblxuZXhwb3J0IHR5cGUgQXBpUmVzcG9uc2UgPSBBcGlSZXNwb25zZVByb2Nlc3NvcjsgLy8gVE9ET1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBcGkgdGVtcGxhdGUgcmVzcG9uc2VcbmV4cG9ydCB0eXBlIFRlbXBsYXRlSXRlbVJlc291cmNlTWFwPFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55Pj4gPSB7XG5cdG1haW46IFQ7XG5cdGxpbmtlZDogSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwXG59O1xuXG5leHBvcnQgdHlwZSBJdGVtVHlwZU1hcDxUID0gYW55PiA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBUO1xufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXBpIHJlcXVlc3RcblxuZXhwb3J0IHR5cGUgQXBpUXVlcnkgPSBhbnk7IC8vIFRPRE9cblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdEl0ZW1WYWx1ZXMgPSB7XG5cdHZhbHVlcz86IGFueSxcblx0bGlua3M/OiB7XG5cdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXVxuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0SXRlbU1hcCA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0W2l0ZW1JZDogbnVtYmVyXTogQXBpUmVxdWVzdEl0ZW1WYWx1ZXNcblx0fTtcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RDb2x1bW4gPSBzdHJpbmcgfCB7W2NvbHVtbklkOiBzdHJpbmddOiBBcGlSZXF1ZXN0Q29sdW1uW119O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0Q29sdW1ucyA9IEFwaVJlcXVlc3RDb2x1bW5bXSB8IHRydWU7XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RDb2x1bW5NYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnNcbn07XG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RMaW1pdCA9IHtcblx0ZmllbGQ6IHN0cmluZyxcblx0bGltaXQ6IG51bWJlcixcblx0b2Zmc2V0PzogbnVtYmVyLFxuXHRvcmRlcj86ICdkZXNjJyB8ICdhc2MnXG59O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0TW92ZUl0ZW1zID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDcmVhdGUgcmVxdWVzdFxuXG5leHBvcnQgdHlwZSBDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge1xuXHRyZXF1ZXN0OiB7XG5cdFx0cmVxdWVzdFR5cGU6ICdjcmVhdGUnLFxuXHRcdGl0ZW1UeXBlPzogSXRlbVR5cGVUeXBlLFxuXHRcdHBhcmVudFR5cGU/OiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZD86IHtbaXRlbUlkOiBzdHJpbmddOiBJdGVtSWR9LFxuXHRcdGl0ZW1zOiBBcGlSZXF1ZXN0SXRlbU1hcCxcblx0XHRjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwXG5cdH0sXG5cdGNvbHVtbnM6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb24sXG5cdGl0ZW1zOiBJdGVtRW50cnlNYXA8SXRlbVR5cGVUeXBlPixcblx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25NYXRjaGVyXG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgZW51bSBBcGlMaW5rVHJlZVR5cGUge1xuXHRJVEVNVEFCTEUgPSAnaXRlbXRhYmxlJyxcblx0RElSRUNUID0gJ2RpcmVjdCdcbn1cblxuZXhwb3J0IHR5cGUgQXBpTGlua1RyZWVFbnRyeSA9IHtcblx0dHlwZTogQXBpTGlua1RyZWVUeXBlLklURU1UQUJMRVxufSB8IHtcblx0dHlwZTogQXBpTGlua1RyZWVUeXBlLkRJUkVDVCxcblx0ZmllbGQ6IHN0cmluZ1xufTtcblxuZXhwb3J0IHR5cGUgQXBpTGlua1RyZWUgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFtjaGlsZFR5cGU6IHN0cmluZ106IEFwaUxpbmtUcmVlRW50cnlcblx0fVxufTtcbiIsImV4cG9ydCAqIGZyb20gJy4vSXRlbVR5cGVzQ29sbGVjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL1Byb21pc2VJbnRlcmZhY2UnO1xuIiwiaW1wb3J0IHsgSXRlbUNhY2hlRmFjdG9yeSwgSXRlbUVudHJ5RmFjdG9yeSB9IGZyb20gJy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1FbnRyeU9wdGlvbnMgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXBpRm9ybWF0dGVyIH0gZnJvbSAnLi4vQXBpRm9ybWF0dGVyJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YSB9IGZyb20gJy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFCYXNlLCBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEgfSBmcm9tICcuLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi9Db2x1bW5JbmZvJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IEl0ZW1DYWNoZSB9IGZyb20gJy4uL0l0ZW1DYWNoZSc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vVXRpbCc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXMgfSBmcm9tICcuL3NlcnZlci9TZXJ2ZXJJdGVtSGFuZGxlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMgfSBmcm9tICcuL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXInO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSXRlbUhhbmRsZXJCYXNlIHtcblxuXHRwdWJsaWMgcmVhZG9ubHkgZW50cmllczogSXRlbUNhY2hlO1xuXHRwdWJsaWMgYWJzdHJhY3QgaXRlbUNoYW5nZXM6IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXMgfCBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXM7XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcm90ZWN0ZWQgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJvdGVjdGVkIGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0aXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCkge1xuXHRcdHRoaXMuZW50cmllcyA9IGl0ZW1DYWNoZUZhY3RvcnkuY29uc3RydWN0KHRoaXMudHJhbnNhY3Rpb24pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBJdGVtRW50cmllcyBmb3IgdGhlIGdpdmVuIHF1ZXJ5LCBkb2VzIG5vdCBsb29rIGluIHRoZSBjYWNoZSwgc2luY2Ugd2UgZG9uJ3Qga25vdyB3aGljaCBJdGVtSWRzIGJlbG9uZyB0byB0aGUgcXVlcnkgIVxuXHQgKlxuXHQgKiB0b2RvOiBXZSBjb3VsZCBzdG9yZSBjb2xsZWN0aW9ucyBieSB0aGVpciBxdWVyeSBzdHJpbmcsIGFuZCB0aGVuIHNlZSBpZiB0aGUgcXVlcnkgaXMgYWxyZWFkeSBjYWNoZWRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBmZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGVudHJ5T3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgSXRlbUVudHJpZXMgZm9yIHRoZSBnaXZlbiBJdGVtSWRzXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhbiBJdGVtRW50cnkgd2l0aCB0aGUgZ2l2ZW4gaXRlbUlkXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUHJvY2Vzc2VzIHRoZSBwYXNzZWQge0BsaW5rIENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSB1cGRhdGUgZGVsdGF9IG9uIHRoZSB0cmFuc2FjdGlvbiwgaWYgdGhlcmUgYXJlIG5vIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIGl0ZW1DaGFuZ2VzfSB0aGUgbmV3IHZhbHVlcyB3aWxsIG5vdCBiZSBwcm9jZXNzZWRcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBwcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlc1R1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEsXG5cdCk6IHZvaWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBUcmF2ZXJzZXMgdGhlIGNvbHVtbiBwYXRoIGFuZCByZXR1cm5zIHRoZSBmaWVsZHMgb2YgdGhlIGRlcml2ZWQgaXRlbSwgcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGl0ZW0gaXNuJ3QgZm91bmRcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogQXNzdW1lcyB0aGUgZGVyaXZlZCBpdGVtJ3MgdmFsdWVzIGFyZSBhbHJlYWR5IGNhY2hlZFxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZXMgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5LFxuXHRcdGNvbHVtblBhdGg6IHN0cmluZ1tdLFxuXHQpOiBSZWFkb25seTxGaWVsZE1hcD4gfCB1bmRlZmluZWQge1xuXHRcdGxldCBkZXJpdmVkSXRlbUVudHJ5OiBJdGVtRW50cnkgfCB1bmRlZmluZWQgPSBpdGVtRW50cnk7XG5cdFx0bGV0IGZpZWxkcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0pO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBvZiBjb2x1bW5QYXRoKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSBkZXJpdmVkSXRlbUVudHJ5LmNvbHVtbnMucmVzcG9uc2VbZGVyaXZlZEl0ZW1FbnRyeS5pdGVtVHlwZV1bY29sdW1uSWRdO1xuXG5cdFx0XHRpZiAoY29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBDb2x1bW4gJyR7Y29sdW1uSWR9JyBub3QgZm91bmQgb24gZW50cnkgaW4gSXRlbVJlc291cmNlLmdldERlcml2ZWRWYWx1ZWApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY29sdW1uLml0ZW1UeXBlID09PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ29sdW1uICcke2NvbHVtbklkfScgZG9lc24ndCBoYXZlIGNoaWxkcmVuIGluIEl0ZW1SZXNvdXJjZS5nZXREZXJpdmVkVmFsdWVgKTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgaXRlbUlkID0gZmllbGRzW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKGl0ZW1JZCA9PT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdFx0fVxuXG5cdFx0XHRkZXJpdmVkSXRlbUVudHJ5ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkKFxuXHRcdFx0XHRjb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChkZXJpdmVkSXRlbUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKGBEZXJpdmVkIGl0ZW1FbnRyeSAke2NvbHVtbi5pdGVtVHlwZX06JHtpdGVtSWR9IGNvdWxkbid0IGJlIGZvdW5kYCk7XG5cdFx0XHR9XG5cblx0XHRcdGZpZWxkcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0ZGVyaXZlZEl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmaWVsZHM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBjb2x1bW5QYXRoLCBvciB1bmRlZmluZWQgd2hlbiB0aGUgcGF0aCBjb3VsZG4ndCBiZSB0cmF2ZXJzZWRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeSBUaGUgcm9vdCBlbnRyeSB0byBzdGFydCB0aGUgcGF0aCBmcm9tXG5cdCAqIEBwYXJhbSBjb2x1bW5QYXRoIENhbiBlaXRoZXIgYmUgYW4gYXJyYXkgb2YgY29sdW1uSWRzIChbJ2NvbHVtbicsICdjb2x1bW4yJ10pIG9yIGEgY29uZmlnIGNvbHVtbiBzdHJpbmcgKCdjb2x1bW4+Y29sdW1uMicpXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RGVyaXZlZFZhbHVlPFQgZXh0ZW5kcyBhbnkgPSBhbnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRjb2x1bW5QYXRoOiBzdHJpbmdbXSB8IHN0cmluZyxcblx0KTogVCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHR5cGVvZiBjb2x1bW5QYXRoID09PSAnc3RyaW5nJykge1xuXHRcdFx0Y29sdW1uUGF0aCA9IHRoaXMuY29sdW1uVXRpbC5wYXJzZUNvbmZpZ0NvbHVtbihjb2x1bW5QYXRoKTtcblx0XHR9XG5cblx0XHRjb25zdCBmaWVsZHMgPSB0aGlzLmdldERlcml2ZWRWYWx1ZXMoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRjb2x1bW5QYXRoLnNsaWNlKFxuXHRcdFx0XHQwLFxuXHRcdFx0XHQtMSxcblx0XHRcdCksXG5cdFx0KTtcblxuXHRcdGlmIChmaWVsZHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmllbGRzW2NvbHVtblBhdGhbY29sdW1uUGF0aC5sZW5ndGggLSAxXV07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENsZWFycyB0aGUgZW50cnkgZnJvbSB0aGlzIHRyYW5zYWN0aW9uLCByZW1vdmluZyBpdCBmcm9tIHRoZSB7QGxpbmsgSXRlbUNhY2hlIEl0ZW1DYWNoZX0gYW5kIHJlbW92aW5nIGFsbCBjaGFuZ2VzXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJJdGVtRW50cnkgKGVudHJ5OiBJdGVtRW50cnkpOiB2b2lkIHtcblx0XHR0aGlzLmVudHJpZXMuY2xlYXIoZW50cnkpO1xuXHRcdGRlbGV0ZSB0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gZnJvbSB0aGUgcGFzc2VkIHtAbGluayBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhfSBhbmQgc3RvcmVzIGl0IGluIHRoaXMgdHJhbnNhY3Rpb24ncyB7QGxpbmsgSXRlbUNhY2hlIEl0ZW1DYWNoZX1cblx0ICovXG5cdHByb3RlY3RlZCBjcmVhdGVJdGVtRW50cnkgKFxuXHRcdGNyZWF0ZVR1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEsXG5cdCk6IEl0ZW1FbnRyeSB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtRW50cnlGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGNyZWF0ZVR1cGxlLml0ZW1JZCxcblx0XHRcdGNyZWF0ZVR1cGxlLmNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHRoaXMuZW50cmllcy5hZGQoaXRlbUVudHJ5KTtcblxuXHRcdHJldHVybiBpdGVtRW50cnk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlY3Vyc2l2ZWx5IGZldGNoZXMgZGVyaXZlZCB2YWx1ZXMgYXMgc2VwYXJhdGUgcmVxdWVzdHMsIGluc3RlYWQgb2YgYXMgY29sdW1ucyBvZiBhIHByaW1hcnkgaXRlbVxuXHQgKiBDYW4gYmUgdXNlZCB3aGVuIGRlcml2ZWQgdmFsdWVzIG9mIGEgbG9jYWwgaXRlbSBoYXZlIHRvIGJlIGZldGNoZWQsIHNpbmNlIGEgbG9jYWwgaXRlbSBjYW4ndCBiZSB1c2VkIGFzIHJvb3QgaXRlbSBvZiBhIHF1ZXJ5XG5cdCAqL1xuXHRwdWJsaWMgZmV0Y2hEZXJpdmVkVmFsdWVzQnlDb2x1bW48SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdHJvb3RDb2x1bW46IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPixcblx0XHRjaGFuZ2VzRGVsdGE/OiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQgfCBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRjb25zdCBjaGlsZENvbHVtbnMgPSByb290Q29sdW1uLmNoaWxkcmVuO1xuXG5cdFx0aWYgKGNoaWxkQ29sdW1ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRjb25zdCBmaXJzdENoaWxkID0gY2hpbGRDb2x1bW5zWzBdO1xuXG5cdFx0aWYgKGNoaWxkQ29sdW1ucy5sZW5ndGggPT09IDEgJiYgZmlyc3RDaGlsZC5hcGlDb2x1bW4udHlwZSA9PT0gJ2lkJykge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBZb3Ugc2hvdWxkIHVzZSBmaWVsZHNbY29sdW1uSWRdIGluc3RlYWQgb2YgZGVyaXZlZFsnY29sdW1uSWQ+aWQnXSB0byBnZXQgdGhlIGlkIG9mIGEgZGVyaXZlZCBpdGVtYCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXRlbUlkTWFwOiB7W2l0ZW1JZDogc3RyaW5nXTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1JZCA9IHRoaXMuZ2V0SXRlbUlkQnlDb2x1bW4oXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0cm9vdENvbHVtbixcblx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGl0ZW1JZCA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGl0ZW1JZE1hcFtpdGVtSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aXRlbUlkTWFwW2l0ZW1JZF0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0aXRlbUlkTWFwW2l0ZW1JZF0ucHVzaChpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGlmICghaGFzUHJvcGVydGllcyhpdGVtSWRNYXApKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXRlbUlkczogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGl0ZW1JZE1hcCkge1xuXHRcdFx0aXRlbUlkcy5wdXNoKCtpdGVtSWQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbklkczogc3RyaW5nW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNoaWxkQ29sdW1ucykge1xuXHRcdFx0Y29sdW1uSWRzLnB1c2goY29sdW1uLmlkKTtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBjaGVjayBpZiB3ZSBoYXZlIHRoZXNlIHZhbHVlcyBjYWNoZWQgYWxyZWFkeVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRyb290Q29sdW1uLml0ZW1UeXBlISxcblx0XHRcdFx0aXRlbUlkcyxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMoe2NvbHVtbnM6IGNvbHVtbklkc30pLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlRGVyaXZlZFZhbHVlcyhcblx0XHRcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHRcdFx0Y2hpbGRDb2x1bW5zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZURlcml2ZWRWYWx1ZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y2hhbmdlc0RlbHRhPzogQ2hhbmdlc0RlbHRhQmFzZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZUludGVyZmFjZTxhbnk+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0dGhpcy5mZXRjaERlcml2ZWRWYWx1ZXNCeUNvbHVtbihcblx0XHRcdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdFx0XHRjb2x1bW4sXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gaXRlbUVudHJpZXMsXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4sIHdpbGwgbG9vayBpbnRvIHRoZSBjdXJyZW50IGRlbHRhIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlYWQgaXRlbUNoYW5nZXNcblx0ICovXG5cdHByb3RlY3RlZCBnZXRJdGVtSWRCeUNvbHVtbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y2hhbmdlc0RlbHRhPzogQ2hhbmdlc0RlbHRhQmFzZSxcblx0KTogSXRlbUlkIHtcblx0XHRpZiAoY29sdW1uLmxldmVsID09PSAwKSB7XG5cdFx0XHRpZiAoY2hhbmdlc0RlbHRhICE9PSB1bmRlZmluZWQgJiYgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdLmNoYW5nZXMuZmllbGRzW2NvbHVtbi5wYXRoXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0pW2NvbHVtbi5wYXRoXTtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBjaGVjayBpZiB0aGUgdmFsdWUgb2YgdGhlIGRlcml2ZWQgaXRlbSBpcyB1cGRhdGVkIGluIHRoaXMgZGVsdGEgP1xuXHRcdC8vIGlmIChjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdICE9PSB1bmRlZmluZWQpIHtcblx0XHQvLyBcdHJldHVybiBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdLmNoYW5nZXMuZGVyaXZlZFtjb2x1bW4ucGF0aF07XG5cdFx0Ly8gfVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gZGVyaXZlZCB2YWx1ZXMgY291bGQgYWxzbyBiZSBjaGFuZ2VkIGluIHRoaXMgZGVsdGEsIHNob3VsZG4ndCB3ZSBnZXQgdGhlIGRlcml2ZWQgaXRlbUVudHJ5IGFuZCBjYWxsIGdldEl0ZW1JZEJ5Q29sdW1uID9cblx0XHRyZXR1cm4gdGhpcy5nZXREZXJpdmVkVmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRjb2x1bW4ucGF0aCxcblx0XHQpITtcblx0fVxufVxuIiwiaW1wb3J0IHtcblx0Q2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uU2V0RmFjdG9yeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRJdGVtQ2FjaGVGYWN0b3J5LFxuXHRJdGVtRW50cnlGYWN0b3J5LFxufSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zLCBJdGVtUmVzb3VyY2UsIFRlbXBsYXRlIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVF1ZXJ5LFxuXHRBcGlSZXF1ZXN0Q29sdW1uTWFwLFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0Q29sdW1uRXhwYW5zaW9uUmVzdWx0LFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhLCBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhQmFzZSwgQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhLCBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0Q29sdW1uSGFuZGxlcixcblx0Q29sdW1uSW5mbyxcblx0Q29sdW1uU2V0LFxuXHRDb2x1bW5TdWJzZXRDYWNoZSxcblx0Q29sdW1uVXRpbCxcblx0aGFzUHJvcGVydGllcyxcblx0SXRlbUVudHJ5U2VydmljZSxcblx0S2V5U2VydmljZSxcblx0U2VydmVyQ2FjaGUsXG59IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuLi8uLi9UZW1wbGF0ZUNhY2hlJztcbmltcG9ydCB7IEl0ZW1IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0l0ZW1IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IHR5cGUgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IHtcblx0aW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0Y2hhbmdlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPlxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEluIGEge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb259IG9ubHkgbG9jYWwgaXRlbXMgY2FuIGJlIHN0b3JlZCwgc28gYWxsIGVudHJpZXMgaW4ge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuZW50cmllcyB0aGlzLmVudHJpZXN9IGFyZSBsb2NhbFxuICogSWYgYSBub24tbG9jYWwgZW50cnkgaXMgcmVxdWVzdGVkIGl0IHNob3VsZCBiZSBwYXNzZWQgb24gdG8gdGhlIHtAbGluayBTZXJ2ZXJJdGVtSGFuZGxlciBTZXJ2ZXJJdGVtSGFuZGxlcn0gd2hpY2ggd2lsbCBmZXRjaENvbGxlY3Rpb25FbnRyeSB0aGUgZW50cnkgZnJvbSB0aGUgc2VydmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyXG5cdGV4dGVuZHMgSXRlbUhhbmRsZXJCYXNlIHtcblxuXHQvLyB0b2RvW2NhY2hlXSBzaG91bGQgdGhpcyBiZSB7W2l0ZW1UeXBlOiBzdHJpbmddOiB7W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiBJdGVtRW50cnl9fSBmb3IgcXVpY2sgbG9va3VwID9cblx0cHVibGljIGRlbGV0ZWRJdGVtczogSXRlbVR5cGVNYXA8SXRlbUVudHJ5W10+ID0ge307XG5cblx0cHVibGljIGl0ZW1DaGFuZ2VzOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXNcblx0fSA9IHt9O1xuXG5cdHB1YmxpYyBpdGVtUmVzb3VyY2VzOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiBJdGVtUmVzb3VyY2VbXVxuXHR9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcml2YXRlIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSB0ZW1wbGF0ZUNhY2hlOiBUZW1wbGF0ZUNhY2hlLFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0ZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0Y29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRpdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVJdGVtRW50cnkgKFxuXHRcdGNyZWF0ZVR1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEsXG5cdCk6IEl0ZW1FbnRyeSB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gc3VwZXIuY3JlYXRlSXRlbUVudHJ5KGNyZWF0ZVR1cGxlKTtcblx0XHRjb25zdCBkZWZhdWx0TG9jYWxDaGFuZ2VzID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldExvY2FsRGVmYXVsdFZhbHVlcygpO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBkZWZhdWx0TG9jYWxDaGFuZ2VzKSB7XG5cdFx0XHRjcmVhdGVUdXBsZS5maWVsZHNbY29sdW1uSWRdID0gZGVmYXVsdExvY2FsQ2hhbmdlc1tjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRjcmVhdGVUdXBsZS5maWVsZHMsXG5cdFx0XHR7fSxcblx0XHRcdGNyZWF0ZVR1cGxlLmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0dGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID0ge1xuXHRcdFx0aW5pdGlhbDogY3JlYXRlVHVwbGUuZmllbGRzLFxuXHRcdFx0Y2hhbmdlczogY2hhbmdlcyxcblx0XHR9O1xuXG5cdFx0dGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdLmluaXRpYWwuaWQgPSBpdGVtRW50cnkuaXRlbUlkO1xuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXS5jaGFuZ2VzLmlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblxuXHRcdHJldHVybiBpdGVtRW50cnk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIGxvY2FsIHtAbGluayBGaWVsZE1hcCBjaGFuZ2VzfSBvZiB0aGUge0BsaW5rIEl0ZW1FbnRyeSBlbnRyeX0gb24gdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufSBpbiBhIGZvcm1hdHRlZCB3YXkgdGhlIEFQSSBhY2NlcHRzXG5cdCAqL1xuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdDxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdCk6IEZpZWxkTWFwPEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+IHtcblx0XHRjb25zdCBtYWluQ29sdW1ucyA9IGVudHJ5LmNvbHVtbnMubWFpbjtcblxuXHRcdGlmIChlbnRyeS5pc0xvY2FsKCkpIHtcblx0XHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXF1ZXN0TG9jYWwoXG5cdFx0XHRcdHRoaXMuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmNoYW5nZXMsXG5cdFx0XHRcdG1haW5Db2x1bW5zLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVxdWVzdChcblx0XHRcdHRoaXMuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmluaXRpYWwsXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5jaGFuZ2VzLFxuXHRcdFx0bWFpbkNvbHVtbnMsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhIG5ldyB7QGxpbmsgVGVtcGxhdGUgdGVtcGxhdGV9IGFuZCBjcmVhdGVzIG5ldyB7QGxpbmsgSXRlbUVudHJ5IGl0ZW1FbnRyaWVzfSB3aXRoIHRoZSBwYXNzZWQgdmFsdWVzXG5cdCAqL1xuXHRwdWJsaWMgY3JlYXRlSXRlbXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHZhbHVlc0FycmF5OiBBcnJheTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+Pixcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0Y29uc3QgdGVtcGxhdGVDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwID0ge307XG5cdFx0bGV0IHBhcmVudEZpZWxkczogUGFydGlhbDxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiA9IHt9O1xuXG5cdFx0aWYgKHBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0dGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSA9IHRoaXMuY29sdW1uVXRpbC5nZXRDb2x1bW5zRnJvbUxpbmsoXG5cdFx0XHRcdHBhcmVudC5pdGVtVHlwZSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHQpO1xuXG5cdFx0XHRwYXJlbnRGaWVsZHMgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0TGlua0ZpZWxkc0J5UGFyZW50KFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy50ZW1wbGF0ZUNhY2hlXG5cdFx0XHQuZmV0Y2hUZW1wbGF0ZShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHVuZGVmaW5lZCxcblx0XHRcdFx0e30sXG5cdFx0XHRcdHRlbXBsYXRlQ29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQodGVtcGxhdGU6IFRlbXBsYXRlPEl0ZW1UeXBlVHlwZT4pID0+IHtcblx0XHRcdFx0XHRmb3IgKGNvbnN0IHZhbHVlcyBvZiB2YWx1ZXNBcnJheSkge1xuXHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0XHRcdFx0XHR0aGlzLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpLFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0Li4udGVtcGxhdGUuZmllbGRzLFxuXHRcdFx0XHRcdFx0XHRcdC4uLnZhbHVlcyxcblx0XHRcdFx0XHRcdFx0XHQuLi5wYXJlbnRGaWVsZHMsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHRlbXBsYXRlLmNvbHVtbnMsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY2xlYXJJdGVtRW50cnkgKGVudHJ5OiBJdGVtRW50cnkpOiB2b2lkIHtcblx0XHRzdXBlci5jbGVhckl0ZW1FbnRyeShlbnRyeSk7XG5cblx0XHRkZWxldGUgdGhpcy5pdGVtUmVzb3VyY2VzW2VudHJ5LmlkXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogU3RvcmVzIGFtIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfSBvbiB0aGUgdHJhbnNhY3Rpb24sIHVzZWQgdG8gY2FsbCB7QGxpbmsgSXRlbVJlc291cmNlLm9wdGlvbnMub25DaGFuZ2UgdGhlIG9uQ2hhbmdlIGNhbGxiYWNrfVxuXHQgKi9cblx0cHVibGljIGFkZFJlc291cmNlIChyZXNvdXJjZTogSXRlbVJlc291cmNlKTogdm9pZCB7XG5cdFx0bGV0IHJlc291cmNlQXJyYXkgPSB0aGlzLml0ZW1SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXG5cdFx0aWYgKHJlc291cmNlQXJyYXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzb3VyY2VBcnJheSA9IHRoaXMuaXRlbVJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF0gPSBbXTtcblx0XHR9XG5cblx0XHRyZXNvdXJjZUFycmF5LnB1c2gocmVzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIGEgcmVzb3VyY2UgZnJvbSB0aGUgdHJhbnNhY3Rpb24sIHByZXZlbnRpbmcgdGhlIHtAbGluayBJdGVtUmVzb3VyY2Uub3B0aW9ucy5vbkNoYW5nZSB0aGUgb25DaGFuZ2UgY2FsbGJhY2t9IGZyb20gYmVpbmcgY2FsbGVkLlxuXHQgKiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSByZXNvdXJjZSBpcyBubyBsb25nZXIgbmVlZGVkXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJSZXNvdXJjZSAocmVzb3VyY2U6IEl0ZW1SZXNvdXJjZSk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMuaXRlbVJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF07XG5cblx0XHQvLyBJdCBjYW4gYmUgdGhhdCBhbiBpdGVtIHdhcyBhbHJlYWR5IG1hcmtlZCBmb3IgZGVsZXRpb24sIGFuZCBhbGwgcmVzb3VyY2VzIGFyZSBhbHJlYWR5IGRlbGV0ZWRcblx0XHRpZiAocmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpbmRleCA9IHJlc291cmNlcy5pbmRleE9mKHJlc291cmNlKTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHJlc291cmNlcy5zcGxpY2UoXG5cdFx0XHRcdGluZGV4LFxuXHRcdFx0XHQxLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocmVzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0ZGVsZXRlIHRoaXMuaXRlbVJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF07XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGRldGVjdENoYW5nZXMgKCk6IGJvb2xlYW4ge1xuXHRcdC8vIGlmIGFuIGVudHJ5IGlzIGluIHRoaXMgdHJhbnNhY3Rpb24ncyBjYWNoZSBpdCdzIGEgbG9jYWwgb25lLCB3aGljaCBjb3VudHMgYXMgYSBjaGFuZ2Vcblx0XHRmb3IgKGNvbnN0IF9pdGVtRW50cnlJZCBpbiB0aGlzLmVudHJpZXMuZW50cmllc0J5RW50cnlJZCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiB0aGlzLml0ZW1DaGFuZ2VzKSB7XG5cdFx0XHRjb25zdCBoYXNDaGFuZ2VzID0gdGhpcy5kZXRlY3RFbnRyeUNoYW5nZXMoTnVtYmVyKGl0ZW1FbnRyeUlkKSk7XG5cblx0XHRcdGlmIChoYXNDaGFuZ2VzKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2hlY2tzIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgY2hhbmdlcyBmb3IgdGhlIHBhc3NlZCB7QGxpbmsgSXRlbUVudHJ5LmlkIEl0ZW1FbnRyeUlkfVxuXHQgKlxuXHQgKiAtLS0tLVxuXHQgKiBAcmVtYXJrc1xuXHQgKiBDb21wYXJlcyBldmVyeSBmaWVsZCAob2YgdGhlIGVudHJ5KSBpbiB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5pdGVtQ2hhbmdlcyBpdGVtQ2hhbmdlc30gd2l0aCB0aGUgaW5pdGlhbCBmaWVsZHMsIGJlY2F1c2UgZmllbGRzIGFyZSBjb3BpZWQgb3ZlciB3aGVuIGNyZWF0aW5nIGEgcmVzb3VyY2UgaGF2aW5nIHNvbWV0aGluZyBpbiBpdGVtQ2hhbmdlcyBkb2Vzbid0IGFjdHVhbGx5IG1lYW4gdGhhdCB0aGVyZSBhcmUgY2hhbmdlcyAoanVzdCB0aGF0IGEgcmVzb3VyY2UgaGFzIGJlZW4gbWFkZSlcblx0ICovXG5cdHB1YmxpYyBkZXRlY3RFbnRyeUNoYW5nZXMgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pOiBib29sZWFuIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKSE7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmhhc0NoYW5nZXMoXG5cdFx0XHRjaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRjaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0dHJ1ZSwgLy8gQWxzbyB0YWtlIGludG8gYWNjb3VudCBtb3Zlc1xuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFByb2Nlc3NlcyBvbiBhIGNhY2hlZCBlbnRyeSwgaWYgdGhlcmUgYXJlIG5vIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIGl0ZW1DaGFuZ2VzfSB0aGUgbmV3IHZhbHVlcyB3aWxsIG5vdCBiZSBwcm9jZXNzZWQsIHVubGVzcyBmb3JjZU92ZXJ3cml0ZSBpcyBzZXRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeUNoYW5nZXNUdXBsZSBUaGUgY2hhbmdlcyB0dXBsZVxuXHQgKiBAcGFyYW0gZm9yY2VPdmVyd3JpdGUgSW5zdGVhZCBvZiBjYWxsaW5nIHtAbGluayBBcGlGb3JtYXR0ZXIubWVyZ2VDb3B5RmllbGRzIG1lcmdlQ29weUZpZWxkc30sIHtAbGluayBBcGlGb3JtYXR0ZXIuY29weUZpZWxkcyBjb3B5RmllbGRzfSB3aWxsIGJlIHVzZWQgKGJlY2F1c2UgQVBJIHZhbHVlcyBhcmUgYWx3YXlzIHJpZ2h0KVxuXHQgKiBAcGFyYW0gdXBkYXRlSW5pdGlhbCBTaG91bGQgYmUgYHRydWVgIGlmIGNhbGxlZCBieSBhcHBseUNoYW5nZXNGcm9tUGFyZW50XG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIFRoZSBwcmV2aW91cyBjaGFuZ2VzIHtAbGluayBGaWVsZE1hcCBGaWVsZE1hcH1cblx0ICovXG5cdHB1YmxpYyBwcm9jZXNzSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeUNoYW5nZXNUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Zm9yY2VPdmVyd3JpdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHR1cGRhdGVJbml0aWFsOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5lbnRyeTtcblx0XHRjb25zdCBjaGFuZ2VzID0gaXRlbUVudHJ5Q2hhbmdlc1R1cGxlLmNoYW5nZXM7XG5cblx0XHQvLyBJZiB3ZSBkb24ndCBoYXZlIHRoZXNlIGl0ZW1zIGNhY2hlZCAgd2UgZG9uJ3QgbmVlZCB0byBtZXJnZS9jb3B5IGFueXRoaW5nXG5cdFx0aWYgKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIWZvcmNlT3ZlcndyaXRlKSB7XG5cdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gdGVzdCB0aGlzXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRcdGNoYW5nZXM6IHt9LFxuXHRcdFx0XHRpbml0aWFsOiB7fSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZXMuZXhwYW5kZWRDb2x1bW5zICE9PSBudWxsKSB7XG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucyA9IGNoYW5nZXMuZXhwYW5kZWRDb2x1bW5zLm1lcmdlZDtcblx0XHR9XG5cblx0XHRjb25zdCBsb2NhbENoYW5nZXMgPSB0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRjb25zdCBwcmV2aW91cyA9IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdHt9LFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzVXBkYXRlZEZpZWxkcyA9IHRoaXMuYXBpRm9ybWF0dGVyLmhhc0NoYW5nZXMoXG5cdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0aWYgKGZvcmNlT3ZlcndyaXRlKSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5tZXJnZUNvcHlGaWVsZHMoXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0Y2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmICh1cGRhdGVJbml0aWFsKSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VzLmZpZWxkcy5kaXNwbGF5bmFtZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBuZXdEaXNwbGF5TmFtZSA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXREaXNwbGF5TmFtZShcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChuZXdEaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLmRpc3BsYXluYW1lID0gbmV3RGlzcGxheU5hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGhhc1VwZGF0ZWRGaWVsZHMpIHtcblx0XHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMuaXRlbVJlc291cmNlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRpZiAocmVzb3VyY2VzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Zm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vbkNoYW5nZShcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2UsXG5cdFx0XHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5JZCA9PiByZXNvdXJjZS5jb21wYXJlSXRlbUZpZWxkKFxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0dGhpcy5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcHJldmlvdXM7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9LFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogKFxuXHRcdFx0c291cmNlRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdCkgPT4gdm9pZCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHQvLyB0aGUgdGhlIGl0ZW1zIG1pZ2h0IHJlZmVyZW5jZSBlYWNoIG90aGVyLCBzbyB1cGRhdGUgdGhlIGNvbnZlcnNpb24gbWFwIGZpcnN0XG5cdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmJhdGNoRXhwYW5kQ29udmVyc2lvbk1hcChcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdHRoaXMuY2xvbmVJdGVtRW50cnkoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRzb3VyY2VFbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0bmV3RmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+ID0ge30sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9LFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogKFxuXHRcdFx0c291cmNlRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdCkgPT4gdm9pZCxcblx0KTogSXRlbUlkIHtcblx0XHRjb25zdCBzb3VyY2VFbnRyeUNoYW5nZXNUdXBsZSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0TG9jYWxJdGVtRW50cnlDaGFuZ2VzVHVwbGUoXG5cdFx0XHRzb3VyY2VFbnRyeS5pZCxcblx0XHQpO1xuXG5cdFx0Y29uc3QgbmV3SXRlbUlkID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmV4cGFuZENvbnZlcnNpb25NYXAoXG5cdFx0XHRzb3VyY2VFbnRyeSxcblx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0KTtcblxuXHRcdGNvbnN0IHNvdXJjZVBhcmVudCA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KHNvdXJjZUVudHJ5KTtcblx0XHRsZXQgbmV3UGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsO1xuXG5cdFx0aWYgKHNvdXJjZVBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgbmV3UGFyZW50SWQgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0Q29udmVyc2lvblZhbHVlKFxuXHRcdFx0XHRzb3VyY2VQYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdHNvdXJjZVBhcmVudC5pdGVtSWQsXG5cdFx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0XHQpO1xuXG5cdFx0XHRuZXdQYXJlbnQgPSB7XG5cdFx0XHRcdGl0ZW1UeXBlOiBzb3VyY2VQYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZDogbmV3UGFyZW50SWQgfHwgc291cmNlUGFyZW50Lml0ZW1JZCxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29waWVkRmllbGRzID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdHNvdXJjZUVudHJ5Q2hhbmdlc1R1cGxlLmNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdHt9LFxuXHRcdFx0c291cmNlRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRjb25zdCB1cGRhdGVkSXRlbVZhbHVlcyA9IHRoaXMudXBkYXRlSXRlbVZhbHVlcyhcblx0XHRcdGNvcGllZEZpZWxkcyxcblx0XHRcdG5ld1BhcmVudCxcblx0XHRcdHNvdXJjZUVudHJ5LmNvbHVtbnMuaXRlbSxcblx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdXBkYXRlZEl0ZW1WYWx1ZXMpIHtcblx0XHRcdGNvcGllZEZpZWxkc1tjb2x1bW5JZF0gPSB1cGRhdGVkSXRlbVZhbHVlc1tjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBuZXdGaWVsZHMpIHtcblx0XHRcdGNvcGllZEZpZWxkc1tjb2x1bW5JZF0gPSBuZXdGaWVsZHNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGlmIChtb2RpZnlGaWVsZHNDYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjayhcblx0XHRcdFx0c291cmNlRW50cnksXG5cdFx0XHRcdGNvcGllZEZpZWxkcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0bmV3SXRlbUlkLFxuXHRcdFx0bmV3RmllbGRzLFxuXHRcdFx0c291cmNlRW50cnkuY29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIG5ld0l0ZW1JZDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGVudHJ5T3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdC5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdGVudHJ5T3B0aW9ucyxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRpZiAoIXRoaXMua2V5U2VydmljZS5pc0xvY2FsSWQoaXRlbUlkKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0Lml0ZW1IYW5kbGVyXG5cdFx0XHRcdC5mZXRjaEl0ZW1FbnRyeShcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBjYWNoZWRFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0aWYgKGNhY2hlZEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLnBhcmVudCBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoXG5cdFx0XHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdoZW4gZXhwYW5kaW5nIGl0ZW1zIHdpdGggbmV3IGRhdGEgKHdoaWNoIGFyZW4ndCB0ZWNobmljYWxseSBjaGFuZ2VzKSBpdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgdHJhbnNhY3Rpb24gdGhlIGl0ZW0gbGl2ZXMgb25cblx0XHRcdC8vIFdlIGRvIHRoZSBzYW1lIChidXQgZmFzdGVyKSBieSBza2lwcGluZyBzdHJhaWdodCB0byB0aGUgc2VydmVyIGNhY2hlIGZvciByZW1vdGUgaXRlbXNcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLnBhcmVudC5pdGVtSGFuZGxlci5mZXRjaEl0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoTG9jYWxJdGVtRW50cnlEYXRhKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGl0ZW1FbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHRcdC5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4gaXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgdGVtcGxhdGUgYW5kIGNyZWF0ZXMgYSBuZXcge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9LCB3aWxsIGVycm9yIGlmIHRoZSBJdGVtRW50cnkgd2l0aCB0aGUgZ2l2ZW4gSXRlbUlkIGFscmVhZHkgZXhpc3RzXG5cdCAqL1xuXHRwdWJsaWMgZmV0Y2hOZXdJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCkgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZUV4aXN0aW5nTG9jYWxJdGVtRXJyb3IoaXRlbVR5cGUpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy50ZW1wbGF0ZUNhY2hlXG5cdFx0XHQuZmV0Y2hUZW1wbGF0ZShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0b3B0aW9ucy50ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHRcdG9wdGlvbnMudGVtcGxhdGVDb2x1bW5zLFxuXHRcdFx0XHRvcHRpb25zLnBhcmVudCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHR0ZW1wbGF0ZSA9PiB7XG5cdFx0XHRcdFx0Ly8gSXQgY291bGQgYmUgdGhhdCBmb3Igd2hhdGV2ZXIgcmVhc29uICdmZXRjaE5ld0l0ZW0nIGlzIGNhbGxlZCBhIHNlY29uZCB0aW1lIHdoaWxlIGxvYWRpbmdcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHR0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0KSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KFxuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UuY3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdFx0XHRcdHRoaXMucmVzb2x2ZUxvY2FsKFxuXHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRvcHRpb25zLnBhcmVudCxcblx0XHRcdFx0XHRcdHRlbXBsYXRlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgcmVtb3RlSXRlbUlkczogSXRlbUlkW10gPSBbXTtcblx0XHRjb25zdCBsb2NhbEl0ZW1JZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBpdGVtSWRzKSB7XG5cdFx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHRcdGxvY2FsSXRlbUlkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW1vdGVJdGVtSWRzLnB1c2goaXRlbUlkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbCh7XG5cdFx0XHRcdHJlbW90ZTogdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHRcdFx0Lml0ZW1IYW5kbGVyXG5cdFx0XHRcdFx0LmZldGNoSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdHJlbW90ZUl0ZW1JZHMsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdGxvY2FsOiB0aGlzLmZldGNoTG9jYWxJdGVtRW50cmllcyhcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRsb2NhbEl0ZW1JZHMsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KSxcblx0XHRcdH0pXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzdWx0ID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0LnJlbW90ZS5jb25jYXQocmVzdWx0LmxvY2FsKTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHQvLyB0b2RvW2NhY2hlXSBtb3ZlIHRvIFRyYW5zYWN0aW9uQ2FjaGUgP1xuXHRwdWJsaWMgZmV0Y2hUaXRsZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IHRpdGxlRmllbGQgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0VGl0bGVGaWVsZChpdGVtVHlwZSk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoSXRlbUVudHJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRuZXcgSXRlbUVudHJ5T3B0aW9ucyh7XG5cdFx0XHRcdFx0Y29sdW1uczogW3RpdGxlRmllbGRdLFxuXHRcdFx0XHR9KSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaWQsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGNoYW5nZXNbdGl0bGVGaWVsZF07XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZUxvY2FsSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5TdWJzZXRDYWNoZTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKGNvbHVtblN1YnNldENhY2hlLnJ1bihpdGVtRW50cnkuY29sdW1ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oaXRlbUVudHJ5KTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2x1bW5EaWZmZXJlbmNlID0gdGhpcy5nZXRDb2x1bW5EaWZmZXJlbmNlKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5IYW5kbGVyXG5cdFx0XHQuZmV0Y2goXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uRGlmZmVyZW5jZSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmV4cGFuZExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRbaXRlbUVudHJ5XSxcblx0XHRcdFx0XHRcdGNvbHVtbkRpZmZlcmVuY2UsXG5cdFx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IGl0ZW1FbnRyeSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0Q29sdW1uRGlmZmVyZW5jZSAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IEFwaVJlcXVlc3RDb2x1bW5zIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5yZXF1ZXN0LFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KS5kaWZmZXJlbmNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlTG9jYWw8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsLFxuXHRcdHRlbXBsYXRlOiBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBpdGVtSWRDb252ZXJzaW9uID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZUxvY2FsQ29udmVyc2lvbk1hcChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0dHJ1ZSxcblx0XHRcdHRlbXBsYXRlLnJlc3BvbnNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCB1cGRhdGVkSXRlbVZhbHVlcyA9IHRoaXMudXBkYXRlSXRlbVZhbHVlcyhcblx0XHRcdHRlbXBsYXRlLmZpZWxkcyxcblx0XHRcdHBhcmVudCxcblx0XHRcdHRlbXBsYXRlLmNvbHVtbnMuaXRlbSxcblx0XHRcdGl0ZW1JZENvbnZlcnNpb24sXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdXBkYXRlZEl0ZW1WYWx1ZXMpIHtcblx0XHRcdHRlbXBsYXRlLmZpZWxkc1tjb2x1bW5JZF0gPSB1cGRhdGVkSXRlbVZhbHVlc1tjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0dGVtcGxhdGUuZmllbGRzLFxuXHRcdFx0dGVtcGxhdGUuY29sdW1ucyxcblx0XHRcdHBhcmVudCxcblx0XHQpO1xuXG5cdFx0dGhpcy5jcmVhdGVMb2NhbEVudHJpZXMoXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHRcdHRlbXBsYXRlLFxuXHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUxvY2FsRW50cmllcyAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0bG9jYWxQYXJlbnRJZDogSXRlbUlkLFxuXHRcdHRlbXBsYXRlOiBUZW1wbGF0ZTxJdGVtVHlwZT4sXG5cdFx0aXRlbUlkQ29udmVyc2lvbjogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRmaWx0ZXJJdGVtRW50cnk6IDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHQpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlLCAvLyByZXR1cm4gdHJ1ZSB0byBpbmNsdWRlIGl0ZW1cblx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjaz86IDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRcdGl0ZW1JZENvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFx0KSA9PiB2b2lkLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBhcGlSZXNwb25zZSA9IHRlbXBsYXRlLnJlc3BvbnNlO1xuXHRcdGNvbnN0IGNvbHVtblNldE1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogQ29sdW1uU2V0PEl0ZW1UeXBlPn0gPSB7fTtcblxuXHRcdGNvbnN0IGNyZWF0ZUVudHJpZXMgPSAoXG5cdFx0XHRfcGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0XHRfbG9jYWxQYXJlbnRJZDogSXRlbUlkLFxuXHRcdFx0YXBpUGFyZW50SWQ6IEl0ZW1JZCxcblx0XHQpID0+IHtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHtcblx0XHRcdFx0aXRlbVR5cGU6IF9wYXJlbnRUeXBlLFxuXHRcdFx0XHRpdGVtSWQ6IF9sb2NhbFBhcmVudElkLFxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgbGlua3MgPSBhcGlSZXNwb25zZS5pdGVtc1tfcGFyZW50VHlwZV1bYXBpUGFyZW50SWRdLmxpbmtzO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGxpbmtzKSB7XG5cdFx0XHRcdGlmICghbGlua3MuaGFzT3duUHJvcGVydHkoaXRlbVR5cGUpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29sdW1uU2V0TWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29sdW1uU2V0TWFwW2l0ZW1UeXBlXSA9IHRoaXMuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZS5yZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoY29uc3QgYXBpSXRlbUlkIG9mIGxpbmtzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdGNvbnN0IGZpZWxkcyA9IGFwaVJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0KSE7XG5cblx0XHRcdFx0XHRpZiAoIWZpbHRlckl0ZW1FbnRyeShcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGxvY2FsSXRlbUlkID0gaXRlbUlkQ29udmVyc2lvbltpdGVtVHlwZV1bYXBpSXRlbUlkXTtcblxuXHRcdFx0XHRcdGNvbnN0IHVwZGF0ZWRJdGVtVmFsdWVzID0gdGhpcy51cGRhdGVJdGVtVmFsdWVzKFxuXHRcdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRcdFx0Y29sdW1uU2V0TWFwW2l0ZW1UeXBlXS5pdGVtLFxuXHRcdFx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiB1cGRhdGVkSXRlbVZhbHVlcykge1xuXHRcdFx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHVwZGF0ZWRJdGVtVmFsdWVzW2NvbHVtbklkXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAobW9kaWZ5RmllbGRzQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdFx0XHRcdGl0ZW1JZENvbnZlcnNpb24sXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRvZG9bY2FjaGVdIHRlc3QgcGFyZW50RmllbGRzLCBzaW5jZSB3ZSBkb24ndCBoYXZlIGNvbHVtbnMgZm9yIGl0XG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0XHRcdFx0bG9jYWxJdGVtSWQsXG5cdFx0XHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdFx0XHRjb2x1bW5TZXRNYXBbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjcmVhdGVFbnRyaWVzKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRsb2NhbEl0ZW1JZCxcblx0XHRcdFx0XHRcdGFwaUl0ZW1JZCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGNyZWF0ZUVudHJpZXMoXG5cdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0bG9jYWxQYXJlbnRJZCxcblx0XHRcdGFwaVJlc3BvbnNlLmxpbmtzW3BhcmVudFR5cGVdWzBdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kTG9jYWxJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhQmFzZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRpZiAoaXRlbUVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGl0ZW1FbnRyaWVzKTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGV4cGFuc2lvblJlc3VsdCA9IGNvbHVtbkV4cGFuc2lvbi5ydW4oaXRlbUVudHJ5LmNvbHVtbnMpO1xuXG5cdFx0XHRpZiAoZXhwYW5zaW9uUmVzdWx0ID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZExvY2FsSXRlbUVudHJ5KFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0ZXhwYW5zaW9uUmVzdWx0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlRGVyaXZlZFZhbHVlcyhcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uLmFnZ3JlZ2F0ZVJvb3RDb2x1bW5zKCksXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyB1cGRhdGVJdGVtVmFsdWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0XHRpdGVtQ29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pixcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGl0ZW1Db2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cblx0XHRcdC8vIFRPRE86IHdlIGNhbiByZWNvbnNpZGVyIHRoaXMgb25jZSBhbGwgY29sdW1ucyBhcmUgcmVzcGVjdGVkIGZvciBsb2NhbCBpdGVtcyBbUk00LTEwMzc4XVxuXHRcdFx0bGV0IG5ld1ZhbHVlO1xuXG5cdFx0XHRpZiAoYXBpQ29sdW1uLnR5cGUgPT09ICdsaW5rJyAmJiBjaGFuZ2VzW2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmIChwYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0XHRuZXdWYWx1ZSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5ld1ZhbHVlID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldENvbnZlcnNpb25WYWx1ZShcblx0XHRcdFx0XHRhcGlDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5JZF0sXG5cdFx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG5ld1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IG5ld1ZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGRhdGEgZm9yIHRoZSBwYXNzZWQgSXRlbVR5cGUvSXRlbUlkL2NvbHVtbnMsIGlzIGFibGUgdG8gZmV0Y2hDb2xsZWN0aW9uRW50cnkgbm9uLWxvY2FsIGRlcml2ZWQgdmFsdWVzLlxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIEFzc3VtZXMgdGhlIHRoZSBJdGVtRW50cnkgd2l0aCB0aGUgZ2l2ZW4gSXRlbVR5cGUtSXRlbUlkIGlzIGFscmVhZHkgY2FjaGVkXG5cdCAqL1xuXHRwdWJsaWMgZmV0Y2hMb2NhbEl0ZW1FbnRyeURhdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCkge1xuXHRcdGNvbnN0IGNhY2hlZEVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRpZiAoY2FjaGVkRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlc29sdmVMb2NhbEl0ZW1FbnRyeShcblx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdGNhY2hlZEVudHJ5LFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMb2NhbEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZSA9IHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpO1xuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPGFueT4+ID0gW107XG5cblx0XHRjb25zdCBpdGVtSWRzT25QYXJlbnRUcmFuc2FjdGlvbjogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdGNvbnN0IGNhY2hlZEVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChjYWNoZWRFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLnBhcmVudCBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5jcmVhdGVVbmZvdW5kTG9jYWxJdGVtRXJyb3IoaXRlbVR5cGUpLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXaGVuIGV4cGFuZGluZyBpdGVtcyB3aXRoIG5ldyBkYXRhICh3aGljaCBhcmVuJ3QgdGVjaG5pY2FsbHkgY2hhbmdlcykgaXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHRoZSBpdGVtIGxpdmVzIG9uXG5cdFx0XHRcdC8vIFdlIGRvIHRoZSBzYW1lIChidXQgZmFzdGVyKSBieSBza2lwcGluZyBzdHJhaWdodCB0byB0aGUgc2VydmVyIGNhY2hlIGZvciByZW1vdGUgaXRlbXNcblx0XHRcdFx0aXRlbUlkc09uUGFyZW50VHJhbnNhY3Rpb24ucHVzaChpdGVtSWQpO1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLmZldGNoTG9jYWxJdGVtRW50cnlEYXRhKFxuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1JZHNPblBhcmVudFRyYW5zYWN0aW9uLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLnBhcmVudCBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVHJpZWQgbG9va2luZyBmb3IgbG9jYWwgZW50cmllcyBvbiB0aGUgc2VydmVyQ2FjaGUnKTtcblx0XHRcdH1cblxuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0KHRoaXMudHJhbnNhY3Rpb24ucGFyZW50IGFzIFRyYW5zYWN0aW9uQ2FjaGUpLml0ZW1IYW5kbGVyLmZldGNoTG9jYWxJdGVtRW50cmllcyhcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWRzT25QYXJlbnRUcmFuc2FjdGlvbixcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbChwcm9taXNlcylcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHRcdC5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4gaXRlbUlkcy5tYXAoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUlkID0+IHRoaXMudHJhbnNhY3Rpb24uZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0XHRcdCkhLFxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRMb2NhbEl0ZW1FbnRyeTxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGNvbHVtbkV4cGFuc2lvblJlc3VsdDogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBtYWluQ29sdW1ucyA9IGNvbHVtbkV4cGFuc2lvblJlc3VsdC5kaWZmZXJlbmNlLm1haW47XG5cblx0XHRlbnRyeS5jb2x1bW5zID0gY29sdW1uRXhwYW5zaW9uUmVzdWx0Lm1lcmdlZDtcblxuXHRcdGlmIChtYWluQ29sdW1ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmdldExvY2FsVmFsdWVzKFxuXHRcdFx0ZW50cnksXG5cdFx0XHRtYWluQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHZhbHVlcykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRlbnRyeSxcblx0XHRcdHZhbHVlcyxcblx0XHRcdGNvbHVtbkV4cGFuc2lvblJlc3VsdCxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRMb2NhbFZhbHVlczxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+IHtcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChlbnRyeSk7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXSk7XG5cdFx0Y29uc3QgcmVzdWx0OiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cblx0XHRcdC8vIHBhcmVudCBjb2x1bW5zIG1pZ2h0IGFsc28gYmUgaW5jbHVkZWQgaW4gdGhlIGRpZmZlcmVuY2Vcblx0XHRcdGlmIChjaGFuZ2VzW2NvbHVtbklkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjb2x1bW5UeXBlID0gY29sdW1uLmFwaUNvbHVtbi50eXBlO1xuXG5cdFx0XHRyZXN1bHRbY29sdW1uSWRdID0gY29sdW1uVHlwZSA9PT0gJ2xpbmsnICYmIHBhcmVudCAhPT0gbnVsbCA/XG5cdFx0XHRcdHBhcmVudC5pdGVtSWQgOlxuXHRcdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5nZXREZWZhdWx0VmFsdWUoY29sdW1uVHlwZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxufVxuIiwiaW1wb3J0IHsgUm1Db3JlIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0SXRlbUNhY2hlRmFjdG9yeSxcblx0SXRlbUVudHJ5RmFjdG9yeSxcblx0SXRlbVJlc291cmNlRmFjdG9yeSxcblx0TW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0UXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0UXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQge1xuXHRBdXRoSW50ZXJmYWNlLFxuXHRFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1JZENvbnZlcnNpb25NYXAsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXBpRm9ybWF0dGVyIH0gZnJvbSAnLi4vQXBpRm9ybWF0dGVyJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4uL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgT25BZnRlckNyZWF0ZUNhbGxiYWNrIH0gZnJvbSAnLi4vQ2hhbmdlc1Byb2Nlc3Nvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBDb2x1bW5DYWNoZSB9IGZyb20gJy4uL0NvbHVtbkNhY2hlJztcbmltcG9ydCB7IENvbHVtbkhhbmRsZXIgfSBmcm9tICcuLi9Db2x1bW5IYW5kbGVyJztcbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi9Db2x1bW5JbmZvJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IEludGVybmFsQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4uL0l0ZW1FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgTG9ja1NlcnZpY2UgfSBmcm9tICcuLi9Mb2NrU2VydmljZSc7XG5pbXBvcnQgeyBRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi9RdWVyeVNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlck1hbmFnZXIgfSBmcm9tICcuLi9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5pbXBvcnQgeyBUZW1wbGF0ZUNhY2hlIH0gZnJvbSAnLi4vVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi9zZXJ2ZXIvU2VydmVyQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcywgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL3NlcnZlci9TZXJ2ZXJJdGVtSGFuZGxlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLCBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkl0ZW1IYW5kbGVyJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2FjaGUge1xuXG5cdHB1YmxpYyBjaGlsZHJlbjogVHJhbnNhY3Rpb25DYWNoZVtdID0gW107XG5cblx0cHVibGljIHJlYWRvbmx5IGl0ZW1IYW5kbGVyOiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyIHwgU2VydmVySXRlbUhhbmRsZXI7XG5cdHB1YmxpYyByZWFkb25seSBjb2xsZWN0aW9uSGFuZGxlcjogVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlciB8IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyO1xuXG5cdHB1YmxpYyBwYXJlbnQ6IEFic3RyYWN0Q2FjaGUgfCBudWxsO1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGNvcmU6IFJtQ29yZSxcblx0XHRwcm90ZWN0ZWQgY29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHByb3RlY3RlZCByZXF1ZXN0QnVmZmVyTWFuYWdlcjogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cHJvdGVjdGVkIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgYXV0aEludGVyZmFjZTogQXV0aEludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgbG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCB0ZW1wbGF0ZUNhY2hlOiBUZW1wbGF0ZUNhY2hlLFxuXHRcdHByb3RlY3RlZCBpdGVtQ2FjaGVGYWN0b3J5OiBJdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJvdGVjdGVkIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0cHJvdGVjdGVkIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCBpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uRW50cnlGYWN0b3J5OiBDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgcXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuXHRcdHByb3RlY3RlZCBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcm90ZWN0ZWQgbGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUNoaWxkIChpZD86IHN0cmluZyk6IFRyYW5zYWN0aW9uQ2FjaGUge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uID0gbmV3IFRyYW5zYWN0aW9uQ2FjaGUoXG5cdFx0XHR0aGlzLmNvcmUsXG5cdFx0XHR0aGlzLmNvbHVtbkNhY2hlLFxuXHRcdFx0dGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0aGlzLmF1dGhJbnRlcmZhY2UsXG5cdFx0XHR0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0XHR0aGlzLmxvY2tTZXJ2aWNlLFxuXHRcdFx0dGhpcy5tb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0dGhpcy5pdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0dGhpcy50ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0dGhpcy5pdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcy5lcnJvckhhbmRsZXIsXG5cdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHR0aGlzLnByb21pc2VTZXJ2aWNlLFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uSGFuZGxlcixcblx0XHRcdHRoaXMuY29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0dGhpcy5pdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5hcGlGb3JtYXR0ZXIsXG5cdFx0XHR0aGlzLmxpbmtUcmVlU2VydmljZSxcblx0XHRcdHRoaXMsXG5cdFx0XHRpZCxcblx0XHQpO1xuXG5cdFx0dGhpcy5jaGlsZHJlbi5wdXNoKHRyYW5zYWN0aW9uKTtcblxuXHRcdHJldHVybiB0cmFuc2FjdGlvbjtcblx0fVxuXG5cdHB1YmxpYyBvbkNoaWxkRGVzdHJveSAoY2FjaGU6IFRyYW5zYWN0aW9uQ2FjaGUpOiB2b2lkIHtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuY2hpbGRyZW4uaW5kZXhPZihjYWNoZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHR0aGlzLmNoaWxkcmVuLnNwbGljZShcblx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdDEsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRTZXJ2ZXJDYWNoZSAoKTogU2VydmVyQ2FjaGU7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExvY2FsSXRlbUVudHJ5IChpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddKTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtRW50cnlbJ2l0ZW1JZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQ7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQXBwbGllcyBjaGFuZ2VzIGZyb20gYSBjaGlsZCB0cmFuc2FjdGlvbiB0byBhIHBhcmVudFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGFwcGx5Q2hhbmdlc0Zyb21DaGlsZCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0YnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2s/OiBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUlkQ29udmVyc2lvbk1hcD47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDYWxsZWQgYnkgYSBwYXJlbnQgdHJhbnNhY3Rpb24sIHByb3BhZ2F0ZXMgY2hhbmdlcyBkb3dud2FyZHMgdG8gYWxsIGNoaWxkIGNhY2hlc1xuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiAtIFNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIGNvcmVcblx0ICpcblx0ICogdG9kb1tjYWNoZV0gU2hvdWxkIHdlIHJlZmV0Y2ggZGVyaXZlZCB2YWx1ZXMganVzdCBsaWtlIGluIGFwcGx5Q2hhbmdlc0RlbHRhID9cblx0ICpcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCAoXG5cdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGE6IEludGVybmFsQ2hhbmdlc0RlbHRhLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlOiBib29sZWFuLFxuXHQpOiB2b2lkO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRQYXJlbnQgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5LFxuXHRcdGZyb21Jbml0aWFsPzogYm9vbGVhbixcblx0KTogRW50cnlQYXJlbnROdWxsO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHRcdGNvcHlGaWVsZHM/OiBib29sZWFuLFxuXHQpOiBGaWVsZE1hcDtcblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0TG9jYWxJdGVtRW50cnlDaGFuZ2VzVHVwbGUgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQmVjYXVzZSB0aGUgYGl0ZW1DaGFuZ2VzYCBvYmplY3QgZGlmZmVycyBiZXR3ZWVuIHRoZSB7QGxpbmsgU2VydmVySXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgU2VydmVySXRlbUhhbmRsZXJ9IGFuZCB0aGUge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgVHJhbnNhY3Rpb25JdGVtSGFuZGxlcn0gd2UgbmVlZCBhIGZ1bmN0aW9uIHRvIG5vcm1hbGlzZSB0aG9zZSB2YWx1ZXNcblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogLSBTaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBjb3JlXG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRjaGFuZ2VzT2JqZWN0OiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZT4gfCBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlPixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgYWJzdHJhY3QgYXBwbHlDaGFuZ2VzRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENoYW5nZXNEZWx0YVJlc3VsdD47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDYWxsZWQgYnkgYXBwbHlDaGFuZ2VzRGVsdGEgZnJvbSBTZXJ2ZXJDYWNoZSBhbmQgVHJhbnNhY3Rpb25DYWNoZS4gQXBwbGllcyBjcmVhdGVzLCB1cGRhdGVzIGFuZCBtb3ZlcywgZG9lc24ndCBhcHBseSBkZWxldGVzXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcm90ZWN0ZWQgX2FwcGx5Q2hhbmdlc0RlbHRhIChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0KToge1xuXHRcdHJlc3VsdDogQ2hhbmdlc0RlbHRhUmVzdWx0LFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRyb2xsYmFja0Z1bmN0aW9uczogQXJyYXk8KGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhKSA9PiB2b2lkPixcblx0fSB7XG5cdFx0Ly8gV2UgaGF2ZSB0byBjb252ZXJ0IHRoZSBDaGFuZ2VzRGVsdGEgdG8gYW4gSW50ZXJuYWxDaGFuZ2VzRGVsdGEgaW4gb3JkZXIgdG8gcGFzcyBpdCB0byB0aGUgQ29sbGVjdGlvbk1hdGNoZXIgYW5kIGNoaWxkIFRyYW5zYWN0aW9uc1xuXHRcdGNvbnN0IGludGVybmFsQ2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdGNvbnN0IGNyZWF0ZWRFbnRyaWVzOiBDaGFuZ2VzRGVsdGFSZXN1bHRbJ2NyZWF0ZWQnXSA9IFtdO1xuXHRcdGNvbnN0IHJvbGxiYWNrRnVuY3Rpb25zOiBBcnJheTwoY2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEpID0+IHZvaWQ+ID0gW107XG5cblx0XHQvLyBXZSBvbmx5IGNyZWF0ZSBuZXcgZW50cmllcyBvbiB0aGUgZGlyZWN0IHRyYW5zYWN0aW9uLCBub3Qgb24gdGhlIGNoaWxkcmVuXG5cdFx0Zm9yIChjb25zdCB0dXBsZSBvZiBjaGFuZ2VzRGVsdGEuY3JlYXRlZCkge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtSGFuZGxlci5jcmVhdGVJdGVtRW50cnkodHVwbGUpO1xuXG5cdFx0XHRjcmVhdGVkRW50cmllcy5wdXNoKGl0ZW1FbnRyeSk7XG5cblx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdHRoaXMuZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0pLFxuXHRcdFx0KTtcblxuXHRcdFx0cm9sbGJhY2tGdW5jdGlvbnMucHVzaChcblx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiByb2xsYmFja0RlbHRhLnNldEl0ZW1EZWxldGVkKGl0ZW1FbnRyeSksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gY2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRjb25zdCBwcmV2aW91cyA9IHRoaXMuaXRlbUhhbmRsZXIucHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdHR1cGxlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0KTtcblxuXHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0dHVwbGUuY2hhbmdlcy5leHBhbmRlZENvbHVtbnMsXG5cdFx0XHQpO1xuXG5cdFx0XHRyb2xsYmFja0Z1bmN0aW9ucy5wdXNoKFxuXHRcdFx0XHRyb2xsYmFja0RlbHRhID0+IHJvbGxiYWNrRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAodHVwbGUuY2hhbmdlcy5wYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkKFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMucGFyZW50LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXaGVuIHJvbGxpbmcgYmFjayBhIGRlbHRhIHdlIGNhbGwgYHNldEl0ZW1VcGRhdGVkYCB0byByZXN0b3JlIGRlbGV0aW9uc1xuXHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyKSB7XG5cdFx0XHRcdGNvbnN0IGRlbGV0ZWRFbnRyaWVzID0gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbdHVwbGUuZW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0XHRcdGlmIChkZWxldGVkRW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGRlbGV0ZWRFbnRyaWVzLmluZGV4T2YodHVwbGUuZW50cnkpO1xuXG5cdFx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdFx0ZGVsZXRlZEVudHJpZXMuc3BsaWNlKFxuXHRcdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0XHQxLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVzdWx0OiB7XG5cdFx0XHRcdGNyZWF0ZWQ6IGNyZWF0ZWRFbnRyaWVzLFxuXHRcdFx0XHRyb2xsYmFjazogKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJvbGxiYWNrRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGZuIG9mIHJvbGxiYWNrRnVuY3Rpb25zKSB7XG5cdFx0XHRcdFx0XHRmbihyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEVuc3VyZXMgdGhhdCBmb3IgYWxsIHVwZGF0ZWQgaXRlbXMgaW4gdGhlIGRlbHRhIHRoZSByZXF1aXJlZCBkZXJpdmVkIHZhbHVlcyBhcmUgcHJlc2VudFxuXHQgKi9cblx0cHJvdGVjdGVkIGZldGNoVXBkYXRlZERlcml2ZWRWYWx1ZXNGcm9tRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeVtdW10+IHtcblx0XHRjb25zdCBkZXJpdmVkUHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W10+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cdFx0XHRjb25zdCBjaGFuZ2VkUm9vdENvbHVtbnM6IENvbHVtbkluZm9bXSA9IFtdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiB0dXBsZS5lbnRyeS5jb2x1bW5zLnJvb3QpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMuZmllbGRzLmhhc093blByb3BlcnR5KGNvbHVtbi5pZClcblx0XHRcdFx0XHQmJiB0dXBsZS5jaGFuZ2VzLmZpZWxkc1tjb2x1bW4uaWRdICE9PSB0aGlzLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1t0dXBsZS5lbnRyeS5pZF0pW2NvbHVtbi5pZF1cblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y2hhbmdlZFJvb3RDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hhbmdlZFJvb3RDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0ZGVyaXZlZFByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdFx0W3R1cGxlLmVudHJ5XSxcblx0XHRcdFx0XHRjaGFuZ2VkUm9vdENvbHVtbnMsXG5cdFx0XHRcdFx0Ly8gV2UgcGFzcyB0aGUgZGVsdGEgc28gdGhlIG5ldyByb290Q29sdW1uJ3MgdmFsdWVzIGFyZSByZWFkXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgbmV3IGRlcml2ZWQgdmFsdWVzIGV4aXN0IGJlZm9yZSBjYWxsaW5nIG9uQ2hhbmdlLCBzaW5jZSB0aGUgb25DaGFuZ2UgZnVuY3Rpb24gbWlnaHQgdXNlIHRoZSBuZXcgdmFsdWVzXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKGRlcml2ZWRQcm9taXNlcyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFic3RyYWN0Q2FjaGUsIEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uLyc7XG5pbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzLyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBJdGVtVHlwZT4gPSB7XG5cdFtpdGVtSWQ6IG51bWJlcl06IHtcblx0XHRpdGVtOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRpc01hdGNoOiBib29sZWFuIHwgJ21heWJlJ1xuXHR9XG59O1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbk1hdGNoZXJCYXNlIHtcblxuXHRwcm90ZWN0ZWQgbWFwOiB7XG5cdFx0W2NvbGxlY3Rpb25FbnRyeUlkOiBudW1iZXJdOiB7XG5cdFx0XHRjb2xsZWN0aW9uOiBDb2xsZWN0aW9uRW50cnlcblx0XHRcdG1hdGNoZXM6IENvbGxlY3Rpb25NYXRjaGVyTWF0Y2hlc1xuXHRcdH1cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdFx0cHJpdmF0ZSBnZXRDb2xsZWN0aW9uRW50cmllczogKGl0ZW1UeXBlOiBJdGVtVHlwZSkgPT4gQ29sbGVjdGlvbkVudHJ5W10sXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGV4cGFuZDxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4sXG5cdCk6IHRoaXMge1xuXHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlciA9IHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRmaWVsZHMsXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChpdGVtRW50cnkpLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZXhwYW5kKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IHF1ZXJ5TWF0Y2hlci5tYXRjaFF1ZXJ5KGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgcHJvY2Vzc0RlbHRhIChpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEpOiB0aGlzIHtcblx0XHQvLyB3ZSBkbyBkZWxldGluZyBmaXJzdCBiZWNhdXNlIGl0J3MgdGhlIGxlYXN0IGV4cGVuc2l2ZSBvcGVyYXRpb25cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGNvbnN0IGVudHJpZXNUb0JlRGVsZXRlZCA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBlbnRyaWVzVG9CZURlbGV0ZWQpIHtcblx0XHRcdFx0dGhpcy5fZXhwYW5kKFxuXHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHQvLyBDb2xsZWN0aW9ucyBjYW4gbmV2ZXIgY29udGFpbiBkZWxldGVkIGl0ZW1zIHRvIHRoZXkncmUgYWx3YXlzIG5vdCBmaXR0aW5nXG5cdFx0XHRcdFx0KCkgPT4gZmFsc2UsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmNyZWF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRjb25zdCBxdWVyeU1hdGNoZXIgPSB0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHR0dXBsZS5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0dHVwbGUuZmllbGRzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudCh0dXBsZS5lbnRyeSksXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWQpIHtcblx0XHRcdGNvbnN0IG1vdmVkID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdG1vdmVkLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gY29sbGVjdGlvbkVudHJ5Lm1hdGNoUGFyZW50KFxuXHRcdFx0XHRcdG1vdmVkLnRvLml0ZW1UeXBlLFxuXHRcdFx0XHRcdG1vdmVkLnRvLml0ZW1JZCxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRjb25zdCBjaGFuZ2VzID0ge307XG5cdFx0XHRjb25zdCBjYWNoZWRDaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbi5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHROdW1iZXIoaXRlbUVudHJ5SWQpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IGNvcHlDaGFuZ2UgPSAoXG5cdFx0XHRcdGZpZWxkczogRmllbGRNYXAsXG5cdFx0XHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0XHQpID0+IHtcblx0XHRcdFx0Y29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG5cdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmIChkZXNjICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0XHRkZXNjLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5JZF0gPSBmaWVsZHNbY29sdW1uSWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIGNhY2hlZENoYW5nZXMpIHtcblx0XHRcdFx0Y29weUNoYW5nZShcblx0XHRcdFx0XHRjYWNoZWRDaGFuZ2VzLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHR1cGxlLmNoYW5nZXMuZmllbGRzKSB7XG5cdFx0XHRcdGNvcHlDaGFuZ2UoXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlciA9IHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdHR1cGxlLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudCh0dXBsZS5lbnRyeSksXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhc0ZpdHRpbmdJdGVtcyAobWF0Y2hlczogQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzKSB7XG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbWF0Y2hlcykge1xuXHRcdFx0aWYgKG1hdGNoZXNbaXRlbUlkXS5pc01hdGNoID09PSB0cnVlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHByb3RlY3RlZCBfZXhwYW5kIChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRtYXRjaEZ1bmN0aW9uOiAoY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnkpID0+IGJvb2xlYW4gfCAnbWF5YmUnLFxuXHQpOiB0aGlzIHtcblx0XHRjb25zdCBtYXAgPSB0aGlzLm1hcDtcblx0XHRjb25zdCBpdGVtSWQgPSBpdGVtRW50cnkuaXRlbUlkO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSB0aGlzLmdldENvbGxlY3Rpb25FbnRyaWVzKGl0ZW1FbnRyeS5pdGVtVHlwZSk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeSBvZiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5SWQgPSBjb2xsZWN0aW9uRW50cnkuaWQ7XG5cdFx0XHRsZXQgbWF0Y2hlcztcblxuXHRcdFx0aWYgKG1hcFtjb2xsZWN0aW9uRW50cnlJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRtYXBbY29sbGVjdGlvbkVudHJ5SWRdID0ge1xuXHRcdFx0XHRcdGNvbGxlY3Rpb246IGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRtYXRjaGVzOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlcyA9IG1hcFtjb2xsZWN0aW9uRW50cnlJZF0ubWF0Y2hlcztcblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gV2UgY291bGQgb3B0aW1pc2Ugc29tZSB0aGluZ3MgaGVyZSBieSBjaGVja2luZyBpZiB0cmFuc2FjdGlvbi5jb2xsZWN0aW9uQ2hhbmdlcyBhbHJlYWR5IGNvbnRhaW5zIGl0ZW1FbnRyeSwgaWYgdGhhdCdzIHRoZSBjYXNlIHdlIGRvbid0IGhhdmUgdG8gbWF0Y2ggYXQgYWxsXG5cdFx0XHQvLyBDdXJyZW50bHkgYWxyZWFkeSBleGlzdGluZyBlbnRyaWVzIGFyZSBmaWx0ZXJlZCBpbiBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMgKGNoYW5nZXMuaW5kZXhPZihpdGVtRW50cnkpICE9PSAtMSlcblx0XHRcdGlmIChtYXRjaGVzW2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlc1tpdGVtSWRdID0ge1xuXHRcdFx0XHRpdGVtOiBpdGVtRW50cnksXG5cdFx0XHRcdGlzTWF0Y2g6IG1hdGNoRnVuY3Rpb24oY29sbGVjdGlvbkVudHJ5KSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckJhc2UgfSBmcm9tICcuL0NvbGxlY3Rpb25NYXRjaGVyQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlclxuXHRleHRlbmRzIENvbGxlY3Rpb25NYXRjaGVyQmFzZSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXM6IChpdGVtVHlwZTogSXRlbVR5cGUpID0+IENvbGxlY3Rpb25FbnRyeVtdLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGdldENvbGxlY3Rpb25FbnRyaWVzLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zICgpOiBDb2xsZWN0aW9uRW50cnlbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBDb2xsZWN0aW9uRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uSWQgaW4gdGhpcy5tYXApIHtcblx0XHRcdGNvbnN0IG1hcEVudHJ5ID0gdGhpcy5tYXBbY29sbGVjdGlvbklkXTtcblxuXHRcdFx0aWYgKHRoaXMuaGFzRml0dGluZ0l0ZW1zKG1hcEVudHJ5Lm1hdGNoZXMpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKG1hcEVudHJ5LmNvbGxlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk1hdGNoZXIgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXMgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckJhc2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5cbmV4cG9ydCB0eXBlIEdyb3VwZWRDb2xsZWN0aW9uTWF0Y2hlclJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdGZpdHRpbmc6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0bm90Rml0dGluZzogSXRlbUlkW10sXG5cdG1heWJlOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQcm9jZXNzZXMgYSBkZWx0YSBhbmQgYWRkcyB0aGUgaXRlbXMgdG8gdGhlIHJpZ2h0IGNvbGxlY3Rpb25zLCB0aGlzIGlzIHRoZSBPTkxZIGNsYXNzIHRoYXQgc2hvdWxkIGNoYW5nZSBjb2xsZWN0aW9uIGl0ZW1zXG4gKlxuICogLS0tLS0tXG4gKlxuICogQHJlbWFya1xuICogVGhlIENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBhY2Nlc3MvbW9kaWZ5IHRoZSB0cmFuc2FjdGlvbiBiZWNhdXNlIGl0J3MgT05MWSBjYWxsZWQgZnJvbSBhcHBseUNoYW5nZXNGcm9tUGFyZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yXG5cdGV4dGVuZHMgQ29sbGVjdGlvbk1hdGNoZXIge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHRcdGdldENvbGxlY3Rpb25FbnRyaWVzOiAoaXRlbVR5cGU6IEl0ZW1UeXBlKSA9PiBDb2xsZWN0aW9uRW50cnlbXSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRnZXRDb2xsZWN0aW9uRW50cmllcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zICgpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25JZCBpbiB0aGlzLm1hcCkge1xuXHRcdFx0Y29uc3QgbWFwRW50cnkgPSB0aGlzLm1hcFtjb2xsZWN0aW9uSWRdO1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gbWFwRW50cnkuY29sbGVjdGlvbjtcblx0XHRcdGNvbnN0IGdyb3VwZWRJdGVtRW50cmllcyA9IHRoaXMuZ3JvdXBJdGVtRW50cmllcyhtYXBFbnRyeS5tYXRjaGVzKTtcblxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5yZW1vdmVJdGVtRW50cmllc0Zyb21Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHRncm91cGVkSXRlbUVudHJpZXMubm90Rml0dGluZyxcblx0XHRcdCk7XG5cblx0XHRcdHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuYWRkSXRlbUVudHJpZXNUb0NvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdGdyb3VwZWRJdGVtRW50cmllcy5maXR0aW5nLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGdyb3VwZWRJdGVtRW50cmllcy5tYXliZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdFx0XHQucXVlcnkoXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0LFxuXHRcdFx0XHRcdFx0e1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdOiBbJ2lkJ119LFxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gV2Ugbm93IGV4YWN0bHkga25vdyB3aGljaCBvZiB0aGUgbWF5YmUgaXRlbXMgZml0XG5cblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHRcdFx0XHRcdGdyb3VwZWRJdGVtRW50cmllcy5tYXliZS5maWx0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnkgPT4gcmVzcG9uc2UubGlua3NbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXS5pbmRleE9mKGl0ZW1FbnRyeS5pdGVtSWQpID4gLTEsXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdyb3VwSXRlbUVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRtYXRjaGVzOiBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXM8SXRlbVR5cGVUeXBlPixcblx0KTogR3JvdXBlZENvbGxlY3Rpb25NYXRjaGVyUmVzdWx0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGZpdHRpbmc6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRcdGNvbnN0IG5vdEZpdHRpbmc6IEl0ZW1JZFtdID0gW107XG5cdFx0Y29uc3QgbWF5YmU6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbWF0Y2hlcykge1xuXHRcdFx0Y29uc3QgbWF0Y2ggPSBtYXRjaGVzW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBtYXRjaC5pdGVtO1xuXHRcdFx0Y29uc3QgaXNNYXRjaCA9IG1hdGNoLmlzTWF0Y2g7XG5cblx0XHRcdGlmIChpc01hdGNoID09PSB0cnVlKSB7XG5cdFx0XHRcdGZpdHRpbmcucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fSBlbHNlIGlmIChpc01hdGNoID09PSBmYWxzZSkge1xuXHRcdFx0XHRub3RGaXR0aW5nLnB1c2goaXRlbUVudHJ5Lml0ZW1JZCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXliZS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGZpdHRpbmc6IGZpdHRpbmcsXG5cdFx0XHRub3RGaXR0aW5nOiBub3RGaXR0aW5nLFxuXHRcdFx0bWF5YmU6IG1heWJlLFxuXHRcdH07XG5cdH1cblxufVxuIiwiaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUlkQ29udmVyc2lvbk1hcCwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24gPSAnYWx3YXlzJyB8ICdvbkNsb3NlJyB8ICdza2lwT25DbG9zZSc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGUgPSB7XG5cdG9uQmVmb3JlU2F2ZTogKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlKSA9PiBhbnksXG5cdG9uU2F2ZVN1Y2Nlc3M6IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpID0+IGFueVxufTtcblxudHlwZSBDYWxsYmFja01hcDxUIGV4dGVuZHMga2V5b2YgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZT4gPSB7XG5cdFtrZXk6IHN0cmluZ106IHtcblx0XHRjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVtUXSxcblx0XHRjb25kaXRpb246IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvblxuXHR9XG59O1xuXG5jb25zdCBERUZBVUxUX1BSSU9SSVRZID0gMTAwO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25FdmVudEhhbmRsZXIge1xuXHRwcml2YXRlIGNhbGxiYWNrczoge1xuXHRcdFtUIGluIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVdOiBBcnJheTxbXG5cdFx0XHRudW1iZXIsXG5cdFx0XHRDYWxsYmFja01hcDxUPlxuXHRcdF0+XG5cdH0gPSB7XG5cdFx0b25CZWZvcmVTYXZlOiBbXSxcblx0XHRvblNhdmVTdWNjZXNzOiBbXSxcblx0fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyQ2FsbGJhY2s8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHR0eXBlOiBULFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdLFxuXHRcdGNvbmRpdGlvbjogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uID0gJ2Fsd2F5cycsXG5cdFx0cHJpb3JpdHk6IG51bWJlciA9IERFRkFVTFRfUFJJT1JJVFksXG5cdCk6ICgpID0+IHZvaWQge1xuXHRcdHRoaXMuZ2V0UHJpb3JpdHlMZXZlbChcblx0XHRcdHR5cGUsXG5cdFx0XHRwcmlvcml0eSxcblx0XHQpW2tleV0gPSB7XG5cdFx0XHRjYWxsYmFjayxcblx0XHRcdGNvbmRpdGlvbixcblx0XHR9O1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGRlbGV0ZSB0aGlzLmdldFByaW9yaXR5TGV2ZWwoXG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdHByaW9yaXR5LFxuXHRcdFx0KVtrZXldO1xuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgZXhlY3V0ZUNhbGxiYWNrczxUIGV4dGVuZHMga2V5b2YgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZT4gKFxuXHRcdHR5cGU6IFQsXG5cdFx0ZXhlY3V0ZTogKGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdKSA9PiBhbnksXG5cdFx0Y2xvc2VUYWI6IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8YW55PiB7XG5cdFx0Y29uc3QgcHJpb3JpdHlMZXZlbHMgPSB0aGlzLmNhbGxiYWNrc1t0eXBlXTtcblx0XHRjb25zdCBjb25kaXRpb246IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvbiA9IGNsb3NlVGFiID8gJ29uQ2xvc2UnIDogJ3NraXBPbkNsb3NlJztcblxuXHRcdGxldCBjaGFpbiA9IHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXG5cdFx0Zm9yIChjb25zdCBwcmlvcml0eUxldmVsIG9mIHByaW9yaXR5TGV2ZWxzKSB7XG5cdFx0XHRjaGFpbiA9IGNoYWluLnRoZW4oXG5cdFx0XHRcdHRoaXMuZXhlY3V0ZUNhbGxiYWNrc1ByaW9yaXR5TGV2ZWwoXG5cdFx0XHRcdFx0cHJpb3JpdHlMZXZlbFsxXSBhcyBDYWxsYmFja01hcDxUPixcblx0XHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHRcdFx0ZXhlY3V0ZSxcblx0XHRcdFx0KSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhaW47XG5cdH1cblxuXHRwcml2YXRlIGdldFByaW9yaXR5TGV2ZWw8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHR0eXBlOiBULFxuXHRcdGRlc3RpbmF0aW9uUHJpb3JpdHk6IG51bWJlcixcblx0KTogQ2FsbGJhY2tNYXA8VD4ge1xuXHRcdGNvbnN0IHByaW9yaXR5TGV2ZWxzID0gdGhpcy5jYWxsYmFja3NbdHlwZV07XG5cdFx0bGV0IG5ld1ByaW9yaXR5TGV2ZWw7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByaW9yaXR5TGV2ZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBwcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbHNbaV07XG5cblx0XHRcdGlmIChwcmlvcml0eUxldmVsWzBdIDwgZGVzdGluYXRpb25Qcmlvcml0eSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByaW9yaXR5TGV2ZWxbMF0gPT09IGRlc3RpbmF0aW9uUHJpb3JpdHkpIHtcblx0XHRcdFx0cmV0dXJuIHByaW9yaXR5TGV2ZWxbMV0gYXMgQ2FsbGJhY2tNYXA8VD47XG5cdFx0XHR9XG5cblx0XHRcdG5ld1ByaW9yaXR5TGV2ZWwgPSB7fTtcblxuXHRcdFx0cHJpb3JpdHlMZXZlbHMuc3BsaWNlKFxuXHRcdFx0XHRpLFxuXHRcdFx0XHQwLFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0ZGVzdGluYXRpb25Qcmlvcml0eSxcblx0XHRcdFx0XHRuZXdQcmlvcml0eUxldmVsLFxuXHRcdFx0XHRdLFxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuIG5ld1ByaW9yaXR5TGV2ZWw7XG5cdFx0fVxuXG5cdFx0bmV3UHJpb3JpdHlMZXZlbCA9IHt9O1xuXG5cdFx0cHJpb3JpdHlMZXZlbHMucHVzaChbXG5cdFx0XHRkZXN0aW5hdGlvblByaW9yaXR5LFxuXHRcdFx0bmV3UHJpb3JpdHlMZXZlbCxcblx0XHRdKTtcblxuXHRcdHJldHVybiBuZXdQcmlvcml0eUxldmVsO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlQ2FsbGJhY2tzUHJpb3JpdHlMZXZlbDxUIGV4dGVuZHMga2V5b2YgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZT4gKFxuXHRcdGNhbGxiYWNrczogQ2FsbGJhY2tNYXA8VD4sXG5cdFx0Y29uZGl0aW9uOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFx0ZXhlY3V0ZTogKGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdKSA9PiBhbnksXG5cdCk6ICgpID0+IFByb21pc2VJbnRlcmZhY2U8YW55PiB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNvbnN0IHJlc3VsdDoge1trZXk6IHN0cmluZ106IGFueX0gPSB7fTtcblxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gY2FsbGJhY2tzKSB7XG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrRW50cnkgPSBjYWxsYmFja3Nba2V5XTtcblxuXHRcdFx0XHRpZiAoY2FsbGJhY2tFbnRyeS5jb25kaXRpb24gIT09IGNvbmRpdGlvbiAmJiBjYWxsYmFja0VudHJ5LmNvbmRpdGlvbiAhPT0gJ2Fsd2F5cycpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmVzdWx0W2tleV0gPSBleGVjdXRlKGNhbGxiYWNrRW50cnkuY2FsbGJhY2spO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlc3VsdCk7XG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgbm9vcCwgUm1Db3JlIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0SXRlbUNhY2hlRmFjdG9yeSxcblx0SXRlbUVudHJ5RmFjdG9yeSxcblx0SXRlbVJlc291cmNlRmFjdG9yeSxcblx0TW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0UXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0UXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQge1xuXHRBdXRoSW50ZXJmYWNlLFxuXHRFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FZGl0UmVzb3VyY2UsXG5cdENvbGxlY3Rpb25FbnRyeSxcblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLFxuXHRDb2xsZWN0aW9uVmlld1Jlc291cmNlLFxuXHRFZGl0UmVzb3VyY2UsXG5cdEl0ZW1FbnRyeSxcblx0SXRlbUVudHJ5T3B0aW9ucyxcblx0SXRlbVJlc291cmNlLFxuXHRMb2NhbFZpZXdSZXNvdXJjZSxcblx0UmVtb3RlVmlld1Jlc291cmNlLFxufSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpTGlua1RyZWVUeXBlLFxuXHRBcGlRdWVyeSxcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdENvbGxlY3Rpb25EZWZpbml0aW9uLFxuXHRDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0Q29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRDb252ZXJzaW9uTWFwLFxuXHRDcmVhdGVSZXF1ZXN0UGFyYW1ldGVyTWFwLFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXAsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0TGlua0NvbGxlY3Rpb25EZWZpbml0aW9uLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRTdGF0ZUtleVR5cGUsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlJztcbmltcG9ydCB7IENvbHVtbkhhbmRsZXIgfSBmcm9tICcuLi8uLi9Db2x1bW5IYW5kbGVyJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi8uLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENvbGxlY3Rpb25DYWNoZSxcblx0Q29sdW1uQ2FjaGUsXG5cdGhhc1Byb3BlcnRpZXMsXG5cdEl0ZW1DYWNoZSxcblx0TG9ja1NlcnZpY2UsXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCxcblx0T25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHRSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0VHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uLFxuXHRUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlLFxuXHRUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyLFxuXHRUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMsXG5cdFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIsXG59IGZyb20gJy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEludGVybmFsQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vLi4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL0l0ZW1FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uLy4uL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgUXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vUXVlcnlTZXJ2aWNlJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuLi8uLi9UZW1wbGF0ZUNhY2hlJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuLi9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi4vc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyIH0gZnJvbSAnLi9UcmFuc2FjdGlvbkV2ZW50SGFuZGxlcic7XG5cbnR5cGUgRWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge21haW46IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+LCBsaW5rZWQ6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcH07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0gaXMgcmVzcG9uc2libGUgZm9yIGtlZXBpbmcgdHJhY2sgb2YgbmV3bHkgY3JlYXRlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfVxuICogYW5kIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJpZXN9LCBhbmQgdGhlIGNoYW5nZXMgb2YgZXhpc3RpbmcgSXRlbUVudHJpZXMgYW5kIENvbGxlY3Rpb25FbnRyaWVzLlxuICpcbiAqIFRoZSBUcmFuc2FjdGlvbkNhY2hlIGlzIGFsc28gcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlc30sIHdoaWNoIGlzIGEgY29tYmluYXRpb24gb2YgYW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IGFuZCB0aGUgY3VycmVudCB0cmFuc2FjdGlvbidzIGNoYW5nZXMgb24gdGhpcyBJdGVtRW50cnlcbiAqL1xuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQ2FjaGVcblx0ZXh0ZW5kcyBBYnN0cmFjdENhY2hlIHtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFN0b3JlcyB0aGUgJ3Jvb3QnIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSwgdGhpcyB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gY2FuIGJlIHVzZWQgYXMgcmVxdWVzdCBwYXJlbnQgdG8gc3RvcmUgdGhlIHdob2xlIHRyYW5zYWN0aW9uIGF0IG9uY2Vcblx0ICovXG5cdHB1YmxpYyByb290SXRlbTogSXRlbUVudHJ5PGFueT4gfCB1bmRlZmluZWQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBTdG9yZXMgYWRkaXRpb25hbCByZXF1ZXN0IHBhcmFtZXRlcnMgZm9yIHdoZW4gdGhlIHRyYW5zYWN0aW9uIGlzIHN0b3JlZCB0byB0aGUgc2VydmVyXG5cdCAqL1xuXHRwdWJsaWMgdGFiUmVxdWVzdFBhcmFtZXRlcnMgPSB7fTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIElzIHRydWUgd2hpbGUgdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IGlzIGFwcGx5aW5nIGNoYW5nZXMgdG8gdGhlIHBhcmVudCAoY2FuIGVpdGhlciBiZSB0aHJvdWdoIGEgbWVyZ2Ugb3IgYW4gQXBpIHNhdmUpXG5cdCAqL1xuXHRwdWJsaWMgaXNTYXZpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIElzIHRydWUgd2hlbiB0aGUgY3VycmVudCB0cmFuc2FjdGlvbiBoYXM6XG5cdCAqIC0gTmV3bHkgY3JlYXRlZCBpdGVtc1xuXHQgKiAtIFJlbW92ZWQgaXRlbXMgKGZyb20gY29sbGVjdGlvbnMpXG5cdCAqIC0gQ2hhbmdlcyBvbiBleGlzdGluZyBpdGVtc1xuXHQgKi9cblx0cHVibGljIGhhc0NoYW5nZXMgPSBmYWxzZTtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRoZSB0cmFuc2FjdGlvbidzIHBhcmVudFxuXHQgKi9cblx0cHVibGljIHJlYWRvbmx5IHBhcmVudDogQWJzdHJhY3RDYWNoZTtcblxuXHRwdWJsaWMgcmVhZG9ubHkgaXRlbUhhbmRsZXI6IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXI7XG5cdHB1YmxpYyByZWFkb25seSBjb2xsZWN0aW9uSGFuZGxlcjogVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlcjtcblxuXHRwcml2YXRlIHJlYWRvbmx5IGV2ZW50SGFuZGxlcjogVHJhbnNhY3Rpb25FdmVudEhhbmRsZXI7XG5cblx0cHJpdmF0ZSBjaGFuZ2VzSW50ZXJ2YWw6IG51bGwgfCBudW1iZXIgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRjb3JlOiBSbUNvcmUsXG5cdFx0Y29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0bG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHRlbXBsYXRlQ2FjaGU6IFRlbXBsYXRlQ2FjaGUsXG5cdFx0aXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0Y29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdGNvbGxlY3Rpb25FbnRyeUZhY3Rvcnk6IENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0XHRwYXJlbnQ6IEFic3RyYWN0Q2FjaGUsXG5cdFx0LyoqXG5cdFx0ICogQGRlc2NyaXB0aW9uXG5cdFx0ICogRm9yIGRlYnVnZ2luZyBwdXJwb3Nlc1xuXHRcdCAqL1xuXHRcdHB1YmxpYyBpZD86IHN0cmluZyxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb3JlLFxuXHRcdFx0Y29sdW1uQ2FjaGUsXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0bG9ja1NlcnZpY2UsXG5cdFx0XHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cblx0XHR0aGlzLml0ZW1IYW5kbGVyID0gbmV3IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIoXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdHRlbXBsYXRlQ2FjaGUsXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29sdW1uSGFuZGxlcixcblx0XHRcdGNvbHVtblNldEZhY3RvcnksXG5cdFx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRpdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlciA9IG5ldyBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyKFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdGNvbHVtbkhhbmRsZXIsXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHR0aGlzLml0ZW1IYW5kbGVyLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VTZXJ2aWNlLFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdHRoaXMsXG5cdFx0KTtcblxuXHRcdHRoaXMuZXZlbnRIYW5kbGVyID0gbmV3IFRyYW5zYWN0aW9uRXZlbnRIYW5kbGVyKFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdHByb21pc2VTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZGVzdHJveSAoKTogdm9pZCB7XG5cdFx0dGhpcy5wYXJlbnQub25DaGlsZERlc3Ryb3kodGhpcyk7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlQ2hhbmdlc0RlbHRhICgpOiBDaGFuZ2VzRGVsdGEge1xuXHRcdHJldHVybiB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNoYW5nZXMgZnJvbSB0aGUgcGFyZW50IFRyYW5zYWN0aW9uIGludG8gdGhpcyBUcmFuc2FjdGlvbidzIG93biBjaGFuZ2VzIGFuZCB0aGVuIHByb3BhZ2F0ZXNcblx0ICogdGhlbSB0byBhbGwgY2hpbGQgVHJhbnNhY3Rpb25zLCB0aGlzIGFzc3VtZXMgdGhhdCBhbiBhY3Rpb24gaXMgYWxyZWFkeSBoYW5kbGVkIGluIGEgcGFyZW50LCBzbyBpdCBkb2VzJ3QgaGFuZGxlIGNyZWF0ZWQgZW50cmllc1xuXHQgKiBhbmQgcmVtb3ZlcyBlbnRyaWVzIHRoYXQgd2VyZSBpbiB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5kZWxldGVkSXRlbXMgZGVsZXRlZEl0ZW1zfSBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5IGRlbGV0ZWRcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudH0gYW5kIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhfSBpcyB0aGF0IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgYXNzdW1lc1xuXHQgKiB0aGUgY2hhbmdlIGhhcyBhbHJlYWR5IGJlZW4gcHJvY2Vzc2VkLCBhbmQgYXBwbHlDaGFuZ2VzRGVsdGEgd2lsbCBwcm9jZXNzIHRoZSBjaGFuZ2VzIG9uY2UgeW91IHNhdmUgdGhlIHRyYW5zYWN0aW9uXG5cdCAqXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuXHQgKiBVc2Uge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEgYXBwbHlDaGFuZ2VzRGVsdGF9IGlmIHlvdSB3YW50IHRvIGFwcGx5IGNoYW5nZXMgZnJvbSBvdXRzaWRlIHRoZSBjb3JlXG5cdCAqXG5cdCAqIEBwYXJhbSBpbnRlcm5hbENoYW5nZXNEZWx0YSBDaGFuZ2VzIHRvIGJlIGFwcGxpZWRcblx0ICogQHBhcmFtIGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlIElmICdpc0NhbGxlZEFmdGVyQXBpU2F2ZScgaXMgdHJ1ZSBsb2NhbCBjaGFuZ2VzIHdpbGwgYWx3YXlzIGJlIG92ZXJ3cml0dGVuIChpbnN0ZWFkIG9mIG9ubHkgd2hlbiB0aGVyZSBhcmUgbm8gY2hhbmdlcylcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tUGFyZW50IChcblx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEsXG5cdFx0aXNDYWxsZWRBZnRlckFwaVNhdmU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0Ly8gV2UgZG9uJ3QgbmVlZCB0byBwcm9jZXNzIGNyZWF0ZWQgaXRlbXMsIGJlc2lkZXMgY2hlY2tpbmcgaWYgdGhleSBmaXQgaW4gY29sbGVjdGlvbnNcblx0XHQvLyBjcmVhdGluZyBlbnRyaWVzIGlzIGFscmVhZHkgZG9uZSBieSBgYXBwbHlDaGFuZ2VzRGVsdGFgIG9uIGEgcGFyZW50IHRyYW5zYWN0aW9uXG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdHR1cGxlLFxuXHRcdFx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZSxcblx0XHRcdFx0dHJ1ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtUmVzb3VyY2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXS5pbmRleE9mKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRcdFx0XHQvLyBpZiBhbiBpdGVtIGlzIGRlbGV0ZWQgb24gYW5vdGhlciBjYWNoZSB3ZSBzaG91bGRuJ3QgYXR0ZW1wdCBhbm90aGVyIHJlcXVlc3QsIHNvIHdlIHJlbW92ZSBpdCBmcm9tIHRoZSB0by1iZS1kZWxldGVkIGFycmF5XG5cdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdLnNwbGljZShcblx0XHRcdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0XHRcdDEsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25NYXRjaGVyID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IoXG5cdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXG5cdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoKTtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHdlIGNvdWxkIGFwcGx5IHRoZSBjaGFuZ2VzIHRvIGNoaWxkcmVuIHdoaWxlIHRoZSBwcm9taXNlIGlzIHJ1bm5pbmdcblx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcblx0XHRcdGNoaWxkLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpO1xuXHRcdH1cblxuXHRcdC8vIHRvZG9bY2FjaGVdIGRvIHdlIHdhbnQgdGhpcz8gTWF5YmUgYWZ0ZXIgbWVyZ2luZyB0aGUgc2VydmVyIGNoYW5nZXMgdGhlcmUncyBubyBjaGFuZ2VzIGFueW1vcmVcblx0XHR0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTtcblx0XHR0aGlzLmRldGVjdENoYW5nZXMoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQXBwbGllcyBjaGFuZ2VzIHRvIHRoaXMgdHJhbnNhY3Rpb24gYW5kIGl0cyBjaGlsZHJlblxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50fSBhbmQge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCBhc3N1bWVzXG5cdCAqIHRoZSBjaGFuZ2UgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIGFuZCBhcHBseUNoYW5nZXNEZWx0YSB3aWxsIHByb2Nlc3MgdGhlIGNoYW5nZXMgaXRzZWxmIChyZXN1bHQgdnMgY2F1c2UpXG5cdCAqXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuXHQgKlxuXHQgKiBEaWZmZXJzIGZyb20ge0BsaW5rIFNlcnZlckNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhIFNlcnZlckNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhfSBpbiB0aGUgaGFuZGxpbmcgb2YgZGVsZXRlZCBlbnRyaWVzIGFuZCB0aGUgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCBjYWxsXG5cdCAqL1xuXHRwdWJsaWMgYXBwbHlDaGFuZ2VzRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENoYW5nZXNEZWx0YVJlc3VsdD4ge1xuXHRcdGlmIChcblx0XHRcdGNoYW5nZXNEZWx0YS5jcmVhdGVkLmxlbmd0aCA9PT0gMFxuXHRcdFx0JiYgIWhhc1Byb3BlcnRpZXMoY2hhbmdlc0RlbHRhLnVwZGF0ZWQpXG5cdFx0XHQmJiAhaGFzUHJvcGVydGllcyhjaGFuZ2VzRGVsdGEuZGVsZXRlZClcblx0XHQpIHtcblx0XHRcdC8vIGVtcHR5IGRlbHRhLCBubyBuZWVkIHRvIGRvIGFueXRoaW5nXG5cblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oe1xuXHRcdFx0XHRjcmVhdGVkOiBbXSxcblx0XHRcdFx0cm9sbGJhY2s6IG5vb3AsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoVXBkYXRlZERlcml2ZWRWYWx1ZXNGcm9tRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRjb25zdCB7cmVzdWx0LCBpbnRlcm5hbENoYW5nZXNEZWx0YSwgcm9sbGJhY2tGdW5jdGlvbnN9ID0gc3VwZXIuX2FwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cblx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGNoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRcdFx0XHRjb25zdCBvbGRDaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtUmVzb3VyY2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdC8vIHRvZG9bY2FjaGVdIGNoZWNrIGlmIGl0J3MgYWxyZWFkeSBpbiB0aGUgYXJyYXkgP1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdLnB1c2goaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtRGVsZXRlZChpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyb2xsYmFja0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9sZENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdFx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmdldEFsbENvbGxlY3Rpb25zQnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyXG5cdFx0XHRcdFx0XHQucHJvY2Vzc0RlbHRhKGludGVybmFsQ2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcblx0XHRcdFx0XHRcdGNoaWxkLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRvZG9bY2FjaGVdIGRvIHdlIHdhbnQgdGhpcz8gTWF5YmUgYWZ0ZXIgbWVyZ2luZyB0aGUgc2VydmVyIGNoYW5nZXMgdGhlcmUncyBubyBjaGFuZ2VzIGFueW1vcmUsIGNvdWxkIGJlIGEgcGVyZm9ybWFuY2UgdGhpbmd5XG5cdFx0XHRcdFx0dGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cdFx0XHRcdFx0dGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRTZXJ2ZXJDYWNoZSAoKTogU2VydmVyQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzLnBhcmVudC5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHRoZSBlbnRyeSdzIHBhcmVudCBmcm9tIHRoZSBjbG9zZXN0IHRyYW5zYWN0aW9uXG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVtRW50cnkgVGhlIGVudHJ5IHRvIGdldCB0aGUgcGFyZW50IGZyb21cblx0ICogQHBhcmFtIGZyb21Jbml0aWFsIElmIGB0cnVlYCB0aGUgcGFyZW50IHZhbHVlcyB3aWxsIGJlIHJlYWQgZnJvbSB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzLmluaXRpYWwgaW5pdGlhbH0gKFVzZWZ1bCBmb3Igd2hlbiB5b3UndmUgbW92ZWQgYW4gZW50cnkpXG5cdCAqL1xuXHQvLyB0b2RvW2NhY2hlXSByZW5hbWUgdG8gZ2V0SXRlbVBhcmVudCBvciBnZXRQYXJlbnRPYmplY3Q/XG5cdHB1YmxpYyBnZXRQYXJlbnQgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5LFxuXHRcdGZyb21Jbml0aWFsOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEVudHJ5UGFyZW50TnVsbCB7XG5cdFx0Y29uc3QgY2hhbmdlc1R1cGxlID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0aWYgKGNoYW5nZXNUdXBsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBmaWVsZHMgPSBjaGFuZ2VzVHVwbGVbZnJvbUluaXRpYWwgPyAnaW5pdGlhbCcgOiAnY2hhbmdlcyddO1xuXG5cdFx0XHRpZiAoaXRlbUVudHJ5LmNvbHVtbnMubGluayAhPT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBpdGVtRW50cnkuY29sdW1ucy5saW5rLmFwaUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQ6IGZpZWxkc1tpdGVtRW50cnkuY29sdW1ucy5saW5rLmlkXSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW5zID0gaXRlbUVudHJ5LmNvbHVtbnMucmVzcG9uc2VbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMuaXRlbXR5cGUgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHQmJiByZXNwb25zZUNvbHVtbnMuaXRlbSAhPT0gdW5kZWZpbmVkXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRpdGVtVHlwZTogZmllbGRzLml0ZW10eXBlLFxuXHRcdFx0XHRcdGl0ZW1JZDogZmllbGRzLml0ZW0sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldFBhcmVudChcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdGZyb21Jbml0aWFsLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFRyYXZlcnNlcyB0aGUgdHJhbnNhY3Rpb24gY2hhaW4gYW5kIHJldHVybnMgdGhlIGNoYW5nZXMgb2YgdGhlIGl0ZW0gb24gdGhlIGZpcnN0IHRyYW5zYWN0aW9uXG5cdCAqXG5cdCAqIEBwYXJhbSBjb3B5RmllbGRzIElmIHNldCwgd2lsbCBjYWxsIHtAbGluayBBcGlGb3JtYXR0ZXIuY29weUZpZWxkcyBBcGlGb3JtYXR0ZXIuY29weUZpZWxkc30sIG90aGVyd2lzZSBqdXN0IHJldHVybnMgdGhlIG9iamVjdFxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdFx0Y29weUZpZWxkczogYm9vbGVhbiA9IHRydWUsXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF07XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRpZiAoIWNvcHlGaWVsZHMpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXMuY2hhbmdlcztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0e30sXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBhcmVudC5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0aXRlbUVudHJ5SWQsXG5cdFx0XHRjb3B5RmllbGRzLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgdGhlIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfSBmcm9tIHRoZSB0cmFuc2FjdGlvbiwgcHJldmVudGluZyB0aGUge0BsaW5rIEl0ZW1SZXNvdXJjZS5vcHRpb25zLm9uQ2hhbmdlIHRoZSBvbkNoYW5nZSBjYWxsYmFja30gZnJvbSBiZWluZyBjYWxsZWQuXG5cdCAqIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBuZWVkZWRcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBEb2VzIG5vdCByZW1vdmUgY2hhbmdlc1xuXHQgKi9cblx0cHVibGljIGNsZWFySXRlbVJlc291cmNlIChyZXNvdXJjZTogSXRlbVJlc291cmNlKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuY2xlYXJSZXNvdXJjZShyZXNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlfSBmcm9tIHRoZSB0cmFuc2FjdGlvbiwgcHJldmVudGluZyB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5vcHRpb25zLm9uQWRkIG9uQWRkfSBhbmQge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZS5vcHRpb25zLm9uUmVtb3ZlIG9uUmVtb3ZlfSBjYWxsYmFja3MgZnJvbSBiZWluZyBjYWxsZWQuXG5cdCAqIFlvdSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHdoZW4gdGhlIHJlc291cmNlIGlzIG5vIGxvbmdlciBuZWVkZWRcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBEb2VzIG5vdCByZW1vdmUgY2hhbmdlc1xuXHQgKi9cblx0cHVibGljIGNsZWFyQ29sbGVjdGlvblJlc291cmNlIChyZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlKTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuY2xlYXJSZXNvdXJjZShyZXNvdXJjZSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLnJvb3RJdGVtIHJvb3RJdGVtfSBpcyB1c2VzIGxvY2tzXG5cdCAqL1xuXHRwdWJsaWMgaXNMb2NrYWJsZSAoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMucm9vdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJvb3RJdGVtLmlzTG9ja2FibGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRGlzYWJsZXMgdGhlIHRyYW5zYWN0aW9uJ3MgY2hhbmdlcyB3YXRjaGVyLCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBubyBsb25nZXIgYXV0b21hdGljYWxseSBkZXRlY3QgY2hhbmdlcyBvbiBpdGVtc1xuXHQgKi9cblx0cHVibGljIGRpc2FibGVDaGFuZ2VzV2F0Y2hlciAoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY2hhbmdlc0ludGVydmFsID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y2xlYXJJbnRlcnZhbCh0aGlzLmNoYW5nZXNJbnRlcnZhbCk7XG5cdFx0dGhpcy5jaGFuZ2VzSW50ZXJ2YWwgPSBudWxsO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBFbmFibGVzIHRoZSB0cmFuc2FjdGlvbidzIGNoYW5nZXMgd2F0Y2hlciwgdGhlIHRyYW5zYWN0aW9uIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGNoYW5nZXMgb24gaXRlbXNcblx0ICovXG5cdHB1YmxpYyBlbmFibGVDaGFuZ2VzV2F0Y2hlciAoKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY2hhbmdlc0ludGVydmFsICE9PSBudWxsKSB7XG5cdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdCdDaGFuZ2VzIHdhdGNoZXIgYWxyZWFkeSBydW5uaW5nIScsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHQpO1xuXHRcdFx0dGhpcy5kaXNhYmxlQ2hhbmdlc1dhdGNoZXIoKTtcblx0XHR9XG5cblx0XHR0aGlzLmNoYW5nZXNJbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbChcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0aWYgKCF0aGlzLmRldGVjdENoYW5nZXMoKSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZGlzYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cblx0XHRcdFx0aWYgKHRoaXMuaXNMb2NrYWJsZSgpKSB7XG5cdFx0XHRcdFx0dGhpcy5sb2NrU2VydmljZS5mZXRjaExvY2sodGhpcy5yb290SXRlbSEpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0MzAwMCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBTYXZlcyB0aGUgdHJhbnNhY3Rpb24sIHRoaXMgaGFzIGEgZGlmZmVyZW50IGVmZmVjdCBkZXBlbmRpbmcgb24gdGhlIHRyYW5zYWN0aW9uJ3MgcGFyZW50LlxuXHQgKlxuXHQgKiAtIElmIHRoZSBwYXJlbnQgaXMgYW5vdGhlciB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSBpdCB3aWxsIG1lcmdlIHRoZSBjaGFuZ2VzIG9mIHRoZSBjaGlsZCB0cmFuc2FjdGlvbiBpbiB0aGUgdGhlIHBhcmVudCB0cmFuc2FjdGlvblxuXHQgKiAtIElmIHRoZSBwYXJlbnQgaXMgdGhlIHtAbGluayBTZXJ2ZXJDYWNoZSBTZXJ2ZXJDYWNoZX0gaXQgd2lsbCBzYXZlIHRoZSBjaGFuZ2VzIHRvIHRoZSBBUGlcblx0ICovXG5cdHB1YmxpYyBzYXZlIChcblx0XHRjbG9zZVRhYiA9IGZhbHNlLFxuXHRcdHBhcmFtZXRlcnM6IENyZWF0ZVJlcXVlc3RQYXJhbWV0ZXJNYXAgPSB7fSxcblx0XHRicmVha1VwQnlQYXJlbnQ/OiBib29sZWFuLFxuXHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjaz86IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuaXNTYXZpbmcpIHtcblx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoKTtcblx0XHR9XG5cblx0XHR0aGlzLmlzU2F2aW5nID0gdHJ1ZTtcblxuXHRcdHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuXHRcdHRoaXMuZGlzYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cblx0XHRsZXQgaXRlbUlkQ29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcDtcblxuXHRcdHJldHVybiAoXG5cdFx0XHR0aGlzLmlzTG9ja2FibGUoKVxuXHRcdFx0XHQ/IHRoaXMubG9ja1NlcnZpY2UuZmV0Y2hMb2NrKHRoaXMucm9vdEl0ZW0hKVxuXHRcdFx0XHQ6IHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpXG5cdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZUNhbGxiYWNrcyhcblx0XHRcdFx0XHRcdCdvbkJlZm9yZVNhdmUnLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPT4gY2FsbGJhY2sodGhpcyksXG5cdFx0XHRcdFx0XHRjbG9zZVRhYixcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHRoaXMudGFiUmVxdWVzdFBhcmFtZXRlcnMgPSB7XG5cdFx0XHRcdFx0XHQuLi50aGlzLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdFx0Li4ucGFyYW1ldGVycyxcblx0XHRcdFx0XHR9O1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMucGFyZW50LmFwcGx5Q2hhbmdlc0Zyb21DaGlsZChcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRcdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRfaXRlbUlkQ29udmVyc2lvbk1hcCA9PiB7XG5cdFx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbk1hcCA9IF9pdGVtSWRDb252ZXJzaW9uTWFwO1xuXG5cdFx0XHRcdFx0dGhpcy50YWJSZXF1ZXN0UGFyYW1ldGVycyA9IHt9O1xuXG5cdFx0XHRcdFx0aWYgKHRoaXMuaXNMb2NrYWJsZSgpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmxvY2tTZXJ2aWNlLmNsZWFyTG9jayh0aGlzLnJvb3RJdGVtISk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIuZXhlY3V0ZUNhbGxiYWNrcyhcblx0XHRcdFx0XHRcdCdvblNhdmVTdWNjZXNzJyxcblx0XHRcdFx0XHRcdGNhbGxiYWNrID0+IGNhbGxiYWNrKFxuXHRcdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdGNsb3NlVGFiLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0aWYgKCFjbG9zZVRhYikge1xuXHRcdFx0XHRcdFx0dGhpcy5lbmFibGVDaGFuZ2VzV2F0Y2hlcigpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHJldHVybiBpdGVtSWRDb252ZXJzaW9uTWFwO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQuY2F0Y2goXG5cdFx0XHRcdGVycm9yID0+IHtcblx0XHRcdFx0XHR0aGlzLmlzU2F2aW5nID0gZmFsc2U7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KGVycm9yKTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZGV0ZWN0Q2hhbmdlcyAoKTogYm9vbGVhbiB7XG5cdFx0aWYgKHRoaXMuaGFzQ2hhbmdlcykge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuZGV0ZWN0Q2hhbmdlcygpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5oYXNDaGFuZ2VzID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5oYXNDaGFuZ2VzID0gZmFsc2U7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgYW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IHRocm91Z2ggYW4ge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2V9IGZyb20gdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IHdoaWNoIG1lYW5zIHRoYXQgY2hhbmdlcyBvbiB0aGlzIGVudHJ5IHdpbGwgbm8gbG9uZ2VyIGJlIHRyYWNrZWQuXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJJdGVtIChpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxhbnk+KTogdm9pZCB7XG5cdFx0dGhpcy5jbGVhckl0ZW1FbnRyeShpdGVtUmVzb3VyY2UuZW50cnkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIGFuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBmcm9tIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSB3aGljaCBtZWFucyB0aGF0IGNoYW5nZXMgb24gdGhpcyBlbnRyeSB3aWxsIG5vIGxvbmdlciBiZSB0cmFja2VkLlxuXHQgKi9cblx0cHVibGljIGNsZWFySXRlbUVudHJ5IChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuY2xlYXJJdGVtRW50cnkoaXRlbUVudHJ5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyBhIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fSB0aHJvdWdoIGEge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBDb2xsZWN0aW9uUmVzb3VyY2V9IGZyb20gdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IHdoaWNoIG1lYW5zIHRoYXQgY2hhbmdlcyBvbiB0aGlzIGNvbGxlY3Rpb24gd2lsbCBubyBsb25nZXIgYmUgdHJhY2tlZC5cblx0ICovXG5cdHB1YmxpYyBjbGVhckNvbGxlY3Rpb24gKGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPGFueT4pOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jbGVhckVudHJ5KGNvbGxlY3Rpb25SZXNvdXJjZS5lbnRyeSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFkZHMgYSBjYWxsYmFjayB0aGF0IHdpbGwgZmlyZSBiZWZvcmUgdGhlIHRyYW5zYWN0aW9uIGlzIHNhdmVkLCByZWplY3RpbmcgdGhpcyBjYWxsYmFjayB3aWxsIHByZXZlbnQgdGhlIHRyYW5zYWN0aW9uIGZyb20gc2F2aW5nXG5cdCAqL1xuXHRwdWJsaWMgb25CZWZvcmVTYXZlIChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVsnb25CZWZvcmVTYXZlJ10sXG5cdFx0Y29uZGl0aW9uPzogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uLFxuXHRcdHByaW9yaXR5PzogbnVtYmVyLFxuXHQpOiAoKSA9PiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5ldmVudEhhbmRsZXIucmVnaXN0ZXJDYWxsYmFjayhcblx0XHRcdCdvbkJlZm9yZVNhdmUnLFxuXHRcdFx0a2V5LFxuXHRcdFx0Y2FsbGJhY2ssXG5cdFx0XHRjb25kaXRpb24sXG5cdFx0XHRwcmlvcml0eSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBZGRzIGEgY2FsbGJhY2sgdGhhdCB3aWxsIGZpcmUgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgc2F2ZWQgc3VjY2Vzc2Z1bGx5XG5cdCAqL1xuXHRwdWJsaWMgb25TYXZlU3VjY2VzcyAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0Y2FsbGJhY2s6IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVbJ29uU2F2ZVN1Y2Nlc3MnXSxcblx0XHRjb25kaXRpb24/OiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFx0cHJpb3JpdHk/OiBudW1iZXIsXG5cdCk6ICgpID0+IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5yZWdpc3RlckNhbGxiYWNrKFxuXHRcdFx0J29uU2F2ZVN1Y2Nlc3MnLFxuXHRcdFx0a2V5LFxuXHRcdFx0Y2FsbGJhY2ssXG5cdFx0XHRjb25kaXRpb24sXG5cdFx0XHRwcmlvcml0eSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIGEge0BsaW5rIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25SZXN1bHR9IGZvciB0aGUgdHJhbnNhY3Rpb25cblx0ICovXG5cdHB1YmxpYyBnZXRNb2R1bGVDaGFuZ2VzICgpOiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25SZXN1bHQge1xuXHRcdGlmICh0aGlzLnJvb3RJdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignTm8gcm9vdCBpdGVtIGZvciB0cmFuc2FjdGlvbiBjYWNoZSAnICsgdGhpcyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMubW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdCh0aGlzKVxuXHRcdFx0LnByb2Nlc3MoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVXBkYXRlcyB0aGUgcGFzc2VkIG1hcCB3aXRoIHRoZSBuZXcge0BsaW5rIENvbnZlcnNpb25NYXAgQ2NvbnZlcnNpb25NYXB9IHZhbHVlc1xuXHQgKi9cblx0cHVibGljIHVwZGF0ZUl0ZW1JZE1hcCAoXG5cdFx0Y29sbGVjdGlvbk1hcDoge1tpdGVtSWQ6IG51bWJlcl06IGFueX0sXG5cdFx0Y29udmVyc2lvbk1hcDogQ29udmVyc2lvbk1hcCxcblx0KTogdm9pZCB7XG5cdFx0aWYgKGNvbnZlcnNpb25NYXAgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3Qgb2xkSWQgaW4gY29udmVyc2lvbk1hcCkge1xuXHRcdFx0Y29uc3QgbmV3SWQgPSBjb252ZXJzaW9uTWFwW29sZElkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25NYXBbb2xkSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbGxlY3Rpb25NYXBbbmV3SWRdID0gY29sbGVjdGlvbk1hcFtvbGRJZF07XG5cdFx0XHRkZWxldGUgY29sbGVjdGlvbk1hcFtvbGRJZF07XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzIENvbGxlY3Rpb25DYWNoZX0gb2YgdGhlIHRyYW5zYWN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudENvbGxlY3Rpb25FbnRyeUNhY2hlICgpOiBDb2xsZWN0aW9uQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmVudHJpZXMgSXRlbUNhY2hlfSBvZiB0aGUgdHJhbnNhY3Rpb25cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50SXRlbUVudHJ5Q2FjaGUgKCk6IEl0ZW1DYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcztcblx0fVxuXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY2xvbmVDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY2xvbmVDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZX0sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY2xvbmVDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlfSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY2xvbmVDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENsb25lcyB0aGUge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IGFuZCBhbGwge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gaW4gaXQsIGFuZCBzZXRzIHRoZSBwYXJlbnQgb2YgdGhlIG5ldyBlbnRyaWVzLlxuXHQgKiBSZXR1cm5zIGEge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBDb2xsZWN0aW9uUmVzb3VyY2V9IG9mIHRoZSBuZXdseSBjbG9uZWQge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9XG5cdCAqL1xuXHRwdWJsaWMgY2xvbmVDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCkge1xuXHRcdGNvbnN0IHBhcmVudCA9IG9wdGlvbnMucGFyZW50O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCB8fCBwYXJlbnQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdQYXJlbnQgcmVxdWlyZWQgZm9yIGNsb25lQ29sbGVjdGlvbicpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZShcblx0XHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuY2xvbmVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGNvbGxlY3Rpb25SZXNvdXJjZS5lbnRyeSxcblx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0KSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBjbG9uZUl0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY2xvbmVJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY2xvbmVJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENsb25lcyB0aGUge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IGFuZCByZXR1cm5zIGEge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2V9IG9mIHRoZSBuZXdseSBjbG9uZWQge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9XG5cdCAqL1xuXHRwdWJsaWMgY2xvbmVJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KSB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5jbG9uZUl0ZW1FbnRyeShcblx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdGl0ZW1SZXNvdXJjZS5lbnRyeSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0Y2hhbmdlc0RlbHRhUmVzdWx0ID0+IHtcblx0XHRcdFx0XHRjb25zdCBpdGVtRW50cnkgPSBjaGFuZ2VzRGVsdGFSZXN1bHQuY3JlYXRlZFswXTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUl0ZW1SZXNvdXJjZShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldEFsbExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldEFsbExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC5xdWVyeShcblx0XHRcdFx0bGlua1R5cGUsXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHR7W2xpbmtUeXBlXTogWydpZCddfSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0TGlua0NvbGxlY3Rpb25zKFxuXHRcdFx0XHRcdFx0bGlua1R5cGUsXG5cdFx0XHRcdFx0XHRyZXNwb25zZS5saW5rc1tsaW5rVHlwZV0sXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnNGcm9tRGVmPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRkZWZpbml0aW9uOiBMaW5rQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHRsaW5rSWRBcnJheSxcblx0XHRcdFx0ZGVmaW5pdGlvbi5pdGVtVHlwZSxcblx0XHRcdFx0ZGVmaW5pdGlvbi5vcHRpb25zLmVudHJ5LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPikgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXMoXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cmllcyxcblx0XHRcdFx0XHRcdGRlZmluaXRpb24ub3B0aW9ucy5yZXNvdXJjZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRsaW5rSWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRsaW5rSWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRsaW5rSWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRsaW5rSWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5mZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0bGlua0lkQXJyYXksXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoY29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2VzKFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJpZXMsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbkZyb21EZWY8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRkZWZpbml0aW9uOiBDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5mZXRjaENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0ZGVmaW5pdGlvbi5pdGVtVHlwZSxcblx0XHRcdFx0ZGVmaW5pdGlvbi5vcHRpb25zLmVudHJ5LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGVudHJ5ID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2UoXG5cdFx0XHRcdFx0XHRlbnRyeSxcblx0XHRcdFx0XHRcdGRlZmluaXRpb24ub3B0aW9ucy5yZXNvdXJjZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdENvbGxlY3Rpb246IHRydWUsIGVkaXRJdGVtczogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldENvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZSwgcmVtb3RlSXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmZldGNoQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0ZW50cnkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZShcblx0XHRcdFx0XHRcdGVudHJ5LFxuXHRcdFx0XHRcdFx0bmV3IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uRGVmPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRlbnRyeTogbmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyksIC8vIHdlIG5lZWQgdGhlIGRlZmF1bHQgY29sdW1uIHZhbHVlXG5cdFx0XHRcdHJlc291cmNlOiBuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdH0sXG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnNEZWY8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGxpbmtGaWVsZDogc3RyaW5nLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IExpbmtDb2xsZWN0aW9uRGVmaW5pdGlvbjxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0bGlua0ZpZWxkOiBsaW5rRmllbGQsXG5cdFx0XHRvcHRpb25zOiB7XG5cdFx0XHRcdGVudHJ5OiBuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSwgLy8gd2UgbmVlZCB0aGUgZGVmYXVsdCBjb2x1bW4gdmFsdWVcblx0XHRcdFx0cmVzb3VyY2U6IG5ldyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1CeVN0YXRlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRzdGF0ZUtleTogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXRJdGVtQnlTdGF0ZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0c3RhdGVLZXk6IEl0ZW1JZCB8IHN0cmluZyxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXRJdGVtQnlTdGF0ZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0c3RhdGVLZXk6IEl0ZW1JZCB8IHN0cmluZyxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVwcmVjYXRlZFxuXHQgKiBVc2UgZ2V0SXRlbUJ5SWQvZ2V0TmV3UmVzb3VyY2VXaXRoSWRcblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogc3RhdGVLZXkgY2FuIGJlIGEga2V5d29yZCBvciBhIGxvY2FsIGlkIChpbiBjYXNlIG9mIGEgcmVmcmVzaClcblx0ICovXG5cdHB1YmxpYyBnZXRJdGVtQnlTdGF0ZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0c3RhdGVLZXk6IEl0ZW1JZCB8IHN0cmluZyxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSA9IHt9LFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCkge1xuXHRcdGNvbnN0IHBhcnNlZFN0YXRlS2V5ID0gdGhpcy5rZXlTZXJ2aWNlLnBhcnNlU3RhdGVLZXkoc3RhdGVLZXkgYXMgc3RyaW5nKTtcblxuXHRcdGlmIChwYXJzZWRTdGF0ZUtleSA9PT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gc3RhdGVLZXkgYXMgSXRlbUlkO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCF0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKGl0ZW1JZClcblx0XHRcdFx0fHwgdGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzXG5cdFx0XHRcdFx0LmNvbnRhaW5zKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmdldEl0ZW1CeUlkKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdGlzUm9vdCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHBhcnNlZFN0YXRlS2V5LnR5cGUgPT09IFN0YXRlS2V5VHlwZS5EdXBsaWNhdGUpIHtcblx0XHRcdHJldHVybiB0aGlzLmdldER1cGxpY2F0ZUJ5SWQoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRwYXJzZWRTdGF0ZUtleS5pdGVtSWQgYXMgSXRlbUlkLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0aXNSb290LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5nZXROZXdSZXNvdXJjZShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdGZhbHNlLFxuXHRcdFx0aXNSb290LFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0RHVwbGljYXRlQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0ZHVwbGljYXRlSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rczogdHJ1ZSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXREdXBsaWNhdGVCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRkdXBsaWNhdGVJZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzPzogYm9vbGVhbixcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0RHVwbGljYXRlQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0ZHVwbGljYXRlSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSA9IHt9LFxuXHRcdHJldHVybkxpbmtzPzogYm9vbGVhbixcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZT4gfCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGlmIChvcHRpb25zLnRlbXBsYXRlT3B0aW9ucyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvcHRpb25zLnRlbXBsYXRlT3B0aW9ucyA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLnRlbXBsYXRlT3B0aW9ucy5pdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG9wdGlvbnMudGVtcGxhdGVPcHRpb25zLml0ZW0gPSBkdXBsaWNhdGVJZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5nZXROZXdSZXNvdXJjZVdpdGhJZChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsRHVwbGljYXRlSWQoKSxcblx0XHRcdG9wdGlvbnMgYXMgSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0XHRyZXR1cm5MaW5rcyxcblx0XHRcdGlzUm9vdCxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlV2l0aElkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rczogdHJ1ZSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXROZXdSZXNvdXJjZVdpdGhJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXROZXdSZXNvdXJjZVdpdGhJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0cmV0dXJuTGlua3M6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZT4gfCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXG5cdFx0b3B0aW9ucy5lZGl0ID0gdHJ1ZTtcblxuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyXG5cdFx0XHQuZmV0Y2hOZXdJdGVtRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGRlbHRhUmVzdWx0ID0+IHtcblx0XHRcdFx0XHRsZXQgbWFpbkVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB8IHVuZGVmaW5lZDtcblx0XHRcdFx0XHRjb25zdCBsaW5rZWRFbnRyaWVzTWFwOiBJdGVtVHlwZU1hcDxJdGVtRW50cnlbXT4gPSB7fTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGRlbHRhUmVzdWx0LmNyZWF0ZWQpIHtcblx0XHRcdFx0XHRcdGlmIChcblx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlID09PSBpdGVtVHlwZVxuXHRcdFx0XHRcdFx0XHQmJiBpdGVtRW50cnkuaXRlbUlkID09PSBpdGVtSWRcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRtYWluRW50cnkgPSBpdGVtRW50cnk7XG5cblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGlmIChsaW5rZWRFbnRyaWVzTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRsaW5rZWRFbnRyaWVzTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0bGlua2VkRW50cmllc01hcFtpdGVtRW50cnkuaXRlbVR5cGVdLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAobWFpbkVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHRocm93IG5ldyBFcnJvcignVGhlIEl0ZW1FbnRyeSB3aXRoIHRoZSByZXF1ZXN0ZWQgSXRlbUlkIHdhcyBub3QgaW4gdGhlIHRlbXBsYXRlIHJlc3BvbnNlJyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgbWFpbiA9IHRoaXMuY3JlYXRlSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHRcdFx0XHRtYWluRW50cnksXG5cdFx0XHRcdFx0XHRvcHRpb25zIGFzIEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHRcdFx0XHRcdFx0aXNSb290LFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0aWYgKCFyZXR1cm5MaW5rcykge1xuXHRcdFx0XHRcdFx0cmV0dXJuIG1haW47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgbGlua2VkID0gdGhpcy5wcm9jZXNzTGlua2VkSXRlbXMoXG5cdFx0XHRcdFx0XHRsaW5rZWRFbnRyaWVzTWFwLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdG1haW46IG1haW4sXG5cdFx0XHRcdFx0XHRsaW5rZWQ6IGxpbmtlZCxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldE5ld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rczogdHJ1ZSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXROZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhIG5ldyBJdGVtRW50cnkgYW5kIHJlc291cmNlXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdFx0cmV0dXJuTGlua3M/OiBib29sZWFuLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlTGlua3M8SXRlbVR5cGVUeXBlPiB8IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TmV3UmVzb3VyY2VXaXRoSWQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHRoaXMua2V5U2VydmljZS5nZXRMb2NhbElkKCksXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0cmV0dXJuTGlua3MsXG5cdFx0XHRpc1Jvb3QsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRJdGVtc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRJdGVtc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldEl0ZW1zQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgbXVsdGlwbGUgaXRlbXMgd2l0aCB0aGVpciByZXNwZWN0aXZlIGNoYW5nZXMgb2YgdGhlIGN1cnJlbnQge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgdHJhbnNhY3Rpb259XG5cdCAqL1xuXHRwdWJsaWMgZ2V0SXRlbXNCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSB7fSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRjb25zdCBlbnRyeU9wdGlvbnMgPSBuZXcgSXRlbUVudHJ5T3B0aW9ucyhvcHRpb25zKTtcblxuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyXG5cdFx0XHQuZmV0Y2hJdGVtRW50cmllc0J5UXVlcnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0ZW50cnlPcHRpb25zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSXRlbVJlc291cmNlcyhcblx0XHRcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1zQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbXNCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldEl0ZW1zQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBtdWx0aXBsZSBpdGVtcyB3aXRoIHRoZWlyIHJlc3BlY3RpdmUgY2hhbmdlcyBvZiB0aGUgY3VycmVudCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn1cblx0ICovXG5cdHB1YmxpYyBnZXRJdGVtc0J5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PiB7XG5cblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoSXRlbUVudHJpZXMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWRzLFxuXHRcdFx0XHRuZXcgSXRlbUVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoaXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PikgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUl0ZW1SZXNvdXJjZXMoXG5cdFx0XHRcdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRJdGVtQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldEl0ZW1CeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXRJdGVtQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGl0ZW0gd2l0aCB0aGUgY2hhbmdlcyBvZiB0aGUgY3VycmVudCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn1cblx0ICpcblx0ICogQHBhcmFtIGlzUm9vdCBTZXRzIHRoZSBpdGVtIGFzIHRoZSByb290IGl0ZW0gb2YgdGhlIHRyYW5zYWN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SXRlbUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyXG5cdFx0XHQuZmV0Y2hJdGVtRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdChpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlSXRlbVJlc291cmNlKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHRcdGlzUm9vdCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSB0aXRsZSBvZiBhbiBpdGVtLCBkb2VzIG5vdCBjcmVhdGUgYW4ge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2V9XG5cdCAqL1xuXHRwdWJsaWMgZmV0Y2hUaXRsZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHN0cmluZz4ge1xuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyLmZldGNoVGl0bGUoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBNZXJnZXMgdGhlIHBhc3NlZCBjaGlsZCBUcmFuc2FjdGlvbiBpbnRvIHRoaXMgdHJhbnNhY3Rpb24gYW5kIHRoZW4gcHJvcGFnYXRlcyB0aGVtIHRvIHRoZSBvdGhlciBjaGlsZCB0cmFuc2FjdGlvbnNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tQ2hpbGQgKFxuXHRcdGNoaWxkVHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0X2JyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0X29uQWZ0ZXJDcmVhdGVDYWxsYmFjaz86IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTxJdGVtSWRDb252ZXJzaW9uTWFwPiB7XG5cdFx0Y29uc3QgbGlua1RyZWUgPSB0aGlzLmxpbmtUcmVlU2VydmljZS5nZXQoKTtcblx0XHRjb25zdCBpbnRlcm5hbENoYW5nZXNEZWx0YSA9IGNoaWxkVHJhbnNhY3Rpb24uZ2V0RGVsdGEoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHQvLyBCaXQgb2YgYSBoYWNrLCBidXQgd2hlbiBtZXJnaW5nIHRyYW5zYWN0aW9ucyB3ZSB3YW50IHRvIGhhbmRsZSBtb3ZlcyBhcyB1cGRhdGVzXG5cdFx0XHQvLyBXZSBvbmx5IHdhbnQgdGhlIG1vdmVzIGluIHRoZXJlIGJlY2F1c2Ugd2UgbmVlZCB0byBkbyBhIGxpbmtUbyByZXF1ZXN0IHdoZW4gc2F2aW5nIHRvIHRoZSBBUElcblx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdHR1cGxlLnRvLFxuXHRcdFx0KTtcblxuXHRcdFx0ZGVsZXRlIGludGVybmFsQ2hhbmdlc0RlbHRhLm1vdmVkW2l0ZW1FbnRyeUlkXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdID0gY2hpbGRUcmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1t0dXBsZS5lbnRyeS5pZF07XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzKFxuXHRcdFx0XHRcdHR1cGxlLFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmNyZWF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuYWRkKHR1cGxlLmVudHJ5KTtcblx0XHRcdGNoaWxkVHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcih0dXBsZS5lbnRyeSk7XG5cblx0XHRcdGNvbnN0IGxvY2FsQ2hhbmdlcyA9IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdID0gY2hpbGRUcmFuc2FjdGlvbi5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1t0dXBsZS5lbnRyeS5pZF07XG5cdFx0XHRjb25zdCBuZXdEaXNwbGF5TmFtZSA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXREaXNwbGF5TmFtZShcblx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKG5ld0Rpc3BsYXlOYW1lICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMuZGlzcGxheW5hbWUgPSBuZXdEaXNwbGF5TmFtZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHRoaXMucm9vdEl0ZW0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zdCBsaW5rTm9kZSA9IGxpbmtUcmVlW3RoaXMucm9vdEl0ZW0uaXRlbVR5cGVdW3R1cGxlLmVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdFx0XHRpZiAobGlua05vZGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdGlmIChsaW5rTm9kZS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuSVRFTVRBQkxFKSB7XG5cdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcy5pdGVtdHlwZSA9IHRoaXMucm9vdEl0ZW0uaXRlbVR5cGU7XG5cdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcy5pdGVtID0gdGhpcy5yb290SXRlbS5pdGVtSWQ7XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChsaW5rTm9kZS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuRElSRUNUKSB7XG5cdFx0XHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlc1tsaW5rTm9kZS5maWVsZF0gPSB0aGlzLnJvb3RJdGVtLml0ZW1JZDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaW50ZXJuYWxDaGFuZ2VzRGVsdGEuZGVsZXRlZFtpdGVtVHlwZV0pIHtcblx0XHRcdFx0Ly8gaWYgYW4gaXRlbUVudHJ5IHdhcyBhIGxvY2FsIGVudHJ5IG9uIGEgY2hpbGQgdHJhbnNhY3Rpb24sIGl0J3MgaW1wb3NzaWJsZSB0aGF0IGl0IGlzIG9uIHRoaXMgdHJhbnNhY3Rpb25cblx0XHRcdFx0aWYgKGl0ZW1FbnRyeS5pc0xvY2FsKCkpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtVHlwZV0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMuaGFzQ2hhbmdlcyA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcy5leHBhbmRJdGVtc0Zyb21EZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5nZXRBbGxDb2xsZWN0aW9uc0J5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjb2xsZWN0aW9uTWF0Y2hlclxuXHRcdFx0XHRcdFx0LnByb2Nlc3NEZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC5yZW1vdmVGcm9tQW5kQWRkVG9Db2xsZWN0aW9ucygpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRpZiAoY2hpbGQgPT09IGNoaWxkVHJhbnNhY3Rpb24pIHtcblx0XHRcdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNoaWxkLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpbnRlcm5hbENoYW5nZXNEZWx0YS5pdGVtSWRDb252ZXJzaW9uTWFwO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBhbHJlYWR5IGNhY2hlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gYW5kIHRoZSBjaGFuZ2VzIG9mIHRoaXMgc3BlY2lmaWMgdHJhbnNhY3Rpb24gZm9yIHRoYXQgZW50cnlcblx0ICovXG5cdHB1YmxpYyBnZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0KToge1xuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y2hhbmdlczogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzXG5cdH0ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZ2V0TG9jYWxJdGVtRW50cnkoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIGdldCBhIGxvY2FsIEl0ZW1FbnRyeSB3aXRoIGVudHJ5SWQgJyR7aXRlbUVudHJ5SWR9JyBidXQgY291bGRuJ3QgZmluZCBpdGApO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRlbnRyeTogaXRlbUVudHJ5LFxuXHRcdFx0Y2hhbmdlczogdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0sXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBJdGVtRW50cnkgZnJvbSB0aGUgY2FjaGUsIGRvZXNuJ3QgZG8gYSBBUEkgcmVxdWVzdCwgdXNlZCBmb3Igc2F2aW5nXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdCk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmdldEJ5RW50cnlJZChpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBpdGVtRW50cnk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiBJdGVtRW50cnkgZnJvbSB0aGUgY2FjaGUgYnkgSXRlbUlkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgYW4gQ29sbGVjdGlvbkVudHJ5IGZyb20gdGhlIGNhY2hlLCBkb2Vzbid0IGRvIGEgQVBJIHJlcXVlc3QsIHVzZWQgZm9yIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlFbnRyeUlkKGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkoY29sbGVjdGlvbkVudHJ5SWQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSBjb21wbGV0ZSB7QGxpbmsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgSW50ZXJuYWxDaGFuZ2VzRGVsdGF9IG9mIHRoZSBUcmFuc2FjdGlvbkNhY2hlLCB0aGlzIG9ubHkgdGFrZXMgaW50byBhY2NvdW50IHRoZSBlbmQgcmVzdWx0IChpbml0aWFsIGlzIGNvbXBhcmVkIHRvIGNoYW5nZXMpLCBzbyBjaGFuZ2luZyBzb21ldGhpbmcgYW5kIHJldmVydGluZyBpdFxuXHQgKiB3b24ndCBiZSBpbmNsdWRlZFxuXHQgKi9cblx0cHVibGljIGdldERlbHRhICgpOiBJbnRlcm5hbENoYW5nZXNEZWx0YSB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlcykge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlKE51bWJlcihpdGVtRW50cnlJZCkpO1xuXG5cdFx0XHQvLyBBbiBpdGVtIGNhbiBiZSB1c2VkIGJ5IGEgMm5kKyBsZXZlbCBjaGlsZCBUcmFuc2FjdGlvbkNhY2hlLCBpdCB3aWxsIGJlIGxvY2FsIHRoYW4gYnV0IGl0IHNob3VsZCBvbmx5IGNvdW50IGFzIGEgY3JlYXRlXG5cdFx0XHQvLyBvbiB0aGUgdHJhbnNhY3Rpb24gdGhhdCBhY3R1YWxseSBjcmVhdGVkIHRoZSBlbnRyeVxuXHRcdFx0aWYgKFxuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY29udGFpbnMoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0dHVwbGUuZW50cnkuaXRlbUlkLFxuXHRcdFx0XHQpXG5cdFx0XHRcdCYmIHR1cGxlLmVudHJ5LmlzTG9jYWwoKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG5ld1BhcmVudCA9IHRoaXMuZ2V0UGFyZW50KFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChuZXdQYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0Y29uc3Qgb2xkUGFyZW50ID0gdGhpcy5nZXRQYXJlbnQoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0IXRoaXMuaXRlbUVudHJ5U2VydmljZS5tYXRjaFBhcmVudChcblx0XHRcdFx0XHRcdG9sZFBhcmVudCxcblx0XHRcdFx0XHRcdG5ld1BhcmVudCxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWQoXG5cdFx0XHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0XHRcdG5ld1BhcmVudCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0Ly8gaGFzQ2hhbmdlcyBvbmx5IHRha2VzIHdyaXRhYmxlIGNvbHVtbnMgaW50byBhY2NvdW50IGJ5IGRlZmF1bHQsIHNvIGp1c3QgbW92aW5nIHNvbWV0aGluZyBkb2Vzbid0IGNvdW50IGFzIGFuIHVwZGF0ZVxuXHRcdFx0XHQhdGhpcy5hcGlGb3JtYXR0ZXIuaGFzQ2hhbmdlcyhcblx0XHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXMpIHtcblx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtc0RlbGV0ZWQodGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbVR5cGVdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhbmdlc0RlbHRhO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCk6IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+O1xuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCk6IFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+O1xuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpOiBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+O1xuXG5cdC8vIHRvZG9bY2FjaGVdIG1vdmUgdG8gVHJhbnNhY3Rpb25JdGVtSGFuZGxlclxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRpc1Jvb3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCkge1xuXHRcdGlmIChpc1Jvb3QpIHtcblx0XHRcdHRoaXMucm9vdEl0ZW0gPSBpdGVtRW50cnk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRcdGluaXRpYWw6IHRoaXMuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShpdGVtRW50cnkuaWQpLFxuXHRcdFx0XHRjaGFuZ2VzOiB0aGlzLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoaXRlbUVudHJ5LmlkKSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb3VyY2UgPSB0aGlzLml0ZW1SZXNvdXJjZUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHRoaXMsXG5cdFx0XHRpc05ldyxcblx0XHQpO1xuXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5hZGRSZXNvdXJjZShyZXNvdXJjZSk7XG5cblx0XHRyZXR1cm4gcmVzb3VyY2U7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdCk6IEFycmF5PEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7cmVtb3RlOiB0cnVlfSxcblx0KTogQXJyYXk8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KTogQXJyYXk8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpOiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGNvbnN0cnVjdG9yID0gdGhpcy5pdGVtUmVzb3VyY2VGYWN0b3J5LmdldENvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRpZiAodGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID0ge1xuXHRcdFx0XHRcdGluaXRpYWw6IHRoaXMuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRjaGFuZ2VzOiB0aGlzLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaWQsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlc291cmNlID0gY29uc3RydWN0b3IoaXRlbUVudHJ5KTtcblxuXHRcdFx0cmVzdWx0LnB1c2gocmVzb3VyY2UpO1xuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5hZGRSZXNvdXJjZShyZXNvdXJjZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBwcm9jZXNzTGlua2VkSXRlbXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rZWRFbnRyaWVzOiBJdGVtVHlwZU1hcDxJdGVtRW50cnlbXT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdCk6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcDxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIHByb2Nlc3NMaW5rZWRJdGVtczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtlZEVudHJpZXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHQpOiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXA8UmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBwcm9jZXNzTGlua2VkSXRlbXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rZWRFbnRyaWVzOiBJdGVtVHlwZU1hcDxJdGVtRW50cnlbXT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcDxMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgcHJvY2Vzc0xpbmtlZEl0ZW1zIChcblx0XHRsaW5rZWRFbnRyaWVzOiBJdGVtVHlwZU1hcDxJdGVtRW50cnlbXT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdCkge1xuXHRcdGNvbnN0IHJlc3VsdDogSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGxpbmtlZEVudHJpZXMpIHtcblx0XHRcdHJlc3VsdFtpdGVtVHlwZV0gPSB0aGlzLmNyZWF0ZUl0ZW1SZXNvdXJjZXMoXG5cdFx0XHRcdGxpbmtlZEVudHJpZXNbaXRlbVR5cGVdLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRjb25zdCByZXN1bHQ6IHtbcGFyZW50SWQ6IHN0cmluZ106IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0cmVzdWx0W3BhcmVudElkXSA9IHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cmllc1twYXJlbnRJZF0sXG5cdFx0XHRcdHJlc291cmNlT3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSwgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblxuXHRcdGlmICh0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdID0gW107XG5cblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25NYXRjaGVyID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IoXG5cdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdFx0dGhpcyxcblx0XHRcdFx0KCkgPT4gW2NvbGxlY3Rpb25FbnRyeV0sXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCB0cmFuc2FjdGlvbnM6IEFic3RyYWN0Q2FjaGVbXSA9IHRoaXMuZ2V0VHJhbnNhY3Rpb25DaGFpbigpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IHRyYW5zYWN0aW9uIG9mIHRyYW5zYWN0aW9ucykge1xuXHRcdFx0XHRjb25zdCBpdGVtRW50cmllcyA9IHRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0QnlJdGVtVHlwZShjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUpO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMuZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pZCxcblx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjb2xsZWN0aW9uTWF0Y2hlci5leHBhbmQoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Y29sbGVjdGlvbk1hdGNoZXIucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoKTtcblx0XHR9XG5cblx0XHRjb25zdCByZXNvdXJjZSA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRyZXNvdXJjZU9wdGlvbnMsXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmFkZFJlc291cmNlKHJlc291cmNlKTtcblxuXHRcdHJldHVybiByZXNvdXJjZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGlzIHRyYW5zYWN0aW9uIGFuZCBhbGwgcGFyZW50c1xuXHQgKi9cblx0cHVibGljIGdldFRyYW5zYWN0aW9uQ2hhaW4gKCk6IEFic3RyYWN0Q2FjaGVbXSB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25zOiBBYnN0cmFjdENhY2hlW10gPSBbXTtcblx0XHRsZXQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUgPSB0aGlzO1xuXG5cdFx0ZG8ge1xuXHRcdFx0dHJhbnNhY3Rpb25zLnB1c2godHJhbnNhY3Rpb24pO1xuXG5cdFx0XHQvLyBAdHMtaWdub3JlIHdoaWxlIGxvb3Agd2lsbCBicmVha1xuXHRcdFx0dHJhbnNhY3Rpb24gPSB0cmFuc2FjdGlvbi5wYXJlbnQ7XG5cdFx0fSB3aGlsZSAodHJhbnNhY3Rpb24gIT09IG51bGwpO1xuXG5cdFx0cmV0dXJuIHRyYW5zYWN0aW9ucztcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhbGwgcmVxdWlyZWQgY29sdW1ucyB0byBtYXRjaC9maXQgaW4gY29sbGVjdGlvbnNcblx0ICovXG5cdHByaXZhdGUgZXhwYW5kSXRlbXNGcm9tRGVsdGEgKGRlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W11bXT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXA6IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1FbnRyeVtdfSA9IHt9O1xuXHRcdGNvbnN0IGNvbHVtbnNQZXJJdGVtVHlwZU1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnN9ID0ge307XG5cblx0XHRjb25zdCBhZGRFbnRyeSA9XG5cdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRpZiAoaXRlbUVudHJpZXNQZXJJdGVtVHlwZU1hcFtpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPSBbXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBkZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRhZGRFbnRyeShkZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBkZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRhZGRFbnRyeShkZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXS5lbnRyeSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLmV4cGFuZChjb2xsZWN0aW9uRW50cnkuY29sdW1ucyk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbHVtbnNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0gPSBjb2x1bW5FeHBhbnNpb24uZ2V0KClbaXRlbVR5cGVdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeVtdPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY29sdW1uc1Blckl0ZW1UeXBlTWFwKSB7XG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmV4cGFuZExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0ZGVsdGEsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUVudHJpZXNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0Y29sdW1uc1Blckl0ZW1UeXBlTWFwW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHR0aGlzLmNvbHVtbkNhY2hlXG5cdFx0XHRcdFx0XHQucmV0cmlldmUoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5zUGVySXRlbVR5cGVNYXBbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LmNhY2hlZCxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDaGFuZ2VzRnJvbUl0ZW1DaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0Y2hhbmdlc09iamVjdDogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBjaGFuZ2VzT2JqZWN0LmNoYW5nZXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uUmVzb3VyY2UgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk1hdGNoUmVzdWx0LCBDb2xsZWN0aW9uUXVlcnksIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5lbnVtIENPTlNUQU5UUyB7XG5cdE1BWUJFID0gJ21heWJlJ1xufVxuXG50eXBlIENvbGxlY3Rpb25FbnRyeU1hcCA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0W2NvbGxlY3Rpb25FbnRyeUlkOiBudW1iZXJdOiBDb2xsZWN0aW9uRW50cnk8YW55PlxuXHR9XG59O1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkNhY2hlIHtcblx0cHJpdmF0ZSBlbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlNYXAgPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGdldEJ5RW50cnlJZCAoY29sbGVjdGlvbkVudHJ5SWQ6IENvbGxlY3Rpb25FbnRyeVsnaWQnXSk6IENvbGxlY3Rpb25FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiB0aGlzLmVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV1bY29sbGVjdGlvbkVudHJ5SWRdO1xuXG5cdFx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0Y29udGFpbnMgKGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PGFueT4pOiBib29sZWFuIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudHJpZXNbY29sbGVjdGlvbkVudHJ5LmlkXSAhPT0gdW5kZWZpbmVkO1xuXHR9XG5cblx0c29tZSAoY2FsbGJhY2s6IChlbnRyeTogQ29sbGVjdGlvbkVudHJ5PGFueT4pID0+IGJvb2xlYW4pOiBib29sZWFuIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0aWYgKGNhbGxiYWNrKGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdKSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Zm9yRWFjaCAoY2FsbGJhY2s6IChlbnRyeTogQ29sbGVjdGlvbkVudHJ5PGFueT4pID0+IHZvaWQpOiB2b2lkIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0Y2FsbGJhY2soZW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qXHRmaWx0ZXIgKGNhbGxiYWNrOiAoZW50cnk6IENvbGxlY3Rpb25FbnRyeSkgPT4gYm9vbGVhbik6IHZvaWQge1xuXHQgY29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0IGNvbnN0IGZpbHRlcmVkRW50cmllczogQ29sbGVjdGlvbkVudHJ5TWFwICA9IHt9O1xuXG5cdCBmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0IGZpbHRlcmVkRW50cmllc1tpdGVtVHlwZV0gPSB7fTtcblxuXHQgZm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdCBjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBlbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXTtcblxuXHQgaWYgKGNhbGxiYWNrKGNvbGxlY3Rpb25FbnRyeSkpXG5cdCBmaWx0ZXJlZEVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdID0gY29sbGVjdGlvbkVudHJ5O1xuXHQgfVxuXHQgfVxuXG5cdCB0aGlzLmVudHJpZXMgPSBmaWx0ZXJlZEVudHJpZXM7XG5cdCB9XG5cdCAqL1xuXHR0b0FycmF5ICgpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PGFueT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChlbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGFkZDxUIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PGFueT4+IChjb2xsZWN0aW9uRW50cnk6IFQpOiBUIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0aWYgKGVudHJpZXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVudHJpZXNbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGVudHJpZXNbaXRlbVR5cGVdW2NvbGxlY3Rpb25FbnRyeS5pZF0gPSBjb2xsZWN0aW9uRW50cnk7XG5cdH1cblxuXHRjbGVhciAoY29sbGVjdGlvbkVudHJ5PzogQ29sbGVjdGlvbkVudHJ5PGFueT4pOiBib29sZWFuIHtcblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuZW50cmllcyA9IHt9O1xuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuY29udGFpbnMoY29sbGVjdGlvbkVudHJ5KSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWxldGUgdGhpcy5lbnRyaWVzW2NvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZV1bY29sbGVjdGlvbkVudHJ5LmlkXTtcblx0fVxuXG5cdGdldEJ5SXRlbVR5cGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChpdGVtVHlwZTogSXRlbVR5cGVUeXBlKSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdHJlc3VsdC5wdXNoKGVudHJpZXNbZW50cnlJZF0pO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRtYXRjaFBhcmVudCAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8YW55Pixcblx0XHRpdGVtVHlwZTogc3RyaW5nLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpIHtcblx0XHRjb25zdCBwYXJlbnQgPSBjb2xsZWN0aW9uRW50cnkucGFyZW50O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vID09IHRvIGNvbXBhcmUgaXRlbUlkc1xuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0cmV0dXJuIHBhcmVudC5pdGVtVHlwZSA9PT0gaXRlbVR5cGUgJiYgcGFyZW50Lml0ZW1JZCA9PSBpdGVtSWQ7XG5cdH1cblxuXHQvLyBUT0RPOiB0aGluayBvZiBiZXR0ZXIgbmFtZVxuXHRnZXRCeVBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0KTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4gfCBudWxsIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRpZiAodGhpcy5tYXRjaFBhcmVudChcblx0XHRcdFx0ZW50cmllc1tlbnRyeUlkXSxcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0cGFyZW50SWQsXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJldHVybiBlbnRyaWVzW2VudHJ5SWRdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0Q29sbGVjdGlvbnNCeVBhcmVudCAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxhbnk+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF07XG5cblx0XHRcdFx0aWYgKHRoaXMubWF0Y2hQYXJlbnQoXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0cGFyZW50SWQsXG5cdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRyZXN1bHQucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyaWVzfSB3aGljaCBjb250YWluIHRoZSBpdGVtIHdpdGggdGhlIHBhc3NlZCBJdGVtVHlwZS9JdGVtSWRcblx0ICovXG5cdGdldEJ5Q29udGFpbmluZ0l0ZW08SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblx0XHRcdGNvbnN0IGl0ZW1zID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0XHRpZiAoaXRlbXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRpdGVtcy5zb21lKFxuXHRcdFx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0XHRcdFx0aXRlbUVudHJ5ID0+IGl0ZW1FbnRyeS5pdGVtSWQgPT0gaXRlbUlkLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDaGVja3MgaWYgdGhlIHBhc3NlZCBmaWVsZHMgd291bGQgZml0IGluIHRoZSBjb2xsZWN0aW9ucyB1c2luZyB0aGUge0BsaW5rIFF1ZXJ5TWF0Y2hlciBRdWVyeU1hdGNoZXJ9XG5cdCAqL1xuXHRnZXRCeUZpdHRpbmdJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRmaWVsZHM6IEZpZWxkTWFwLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsLFxuXHQpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGU+ID0ge1xuXHRcdFx0Zml0dGluZzogW10sXG5cdFx0XHRub3RmaXR0aW5nOiBbXSxcblx0XHRcdG1heWJlOiBbXSxcblx0XHR9O1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHQvLyBjb25zb2xlLnRpbWUoJ2dldEJ5Rml0dGluZ0l0ZW0nKTtcblxuXHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlciA9IHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGZpZWxkcyxcblx0XHRcdHBhcmVudCxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbZW50cnlJZF07XG5cdFx0XHRjb25zdCBtYXRjaFJlc3VsdCA9IHF1ZXJ5TWF0Y2hlci5tYXRjaFF1ZXJ5KGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QpO1xuXG5cdFx0XHQvLyB0b2RvW2NhY2hlXTogbWF5YmU/XG5cdFx0XHRpZiAobWF0Y2hSZXN1bHQgPT09IHRydWUpIHtcblx0XHRcdFx0cmVzdWx0LmZpdHRpbmcucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fSBlbHNlIGlmIChtYXRjaFJlc3VsdCA9PT0gQ09OU1RBTlRTLk1BWUJFKSB7XG5cdFx0XHRcdHJlc3VsdC5tYXliZS5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXN1bHQubm90Zml0dGluZy5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gY29uc29sZS50aW1lRW5kKCdnZXRCeUZpdHRpbmdJdGVtJyk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Z2V0QnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4gfCBudWxsIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBudWxsO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBlbnRyaWVzW2VudHJ5SWRdO1xuXG5cdFx0XHRpZiAoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5LnN0cmluZyA9PT0gcXVlcnkuc3RyaW5nKSB7XG5cdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRnZXRCeUtleTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0ZW50cnlLZXk6IHN0cmluZyxcblx0KTogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmVudHJ5S2V5ID09PSBlbnRyeUtleSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvLyB0b2RvW2NhY2hlXSByZW1vdmUgdGhpcywgeW91IHNob3VsZCBnZXQgYSBuZXcgcmVzb3VyY2UuLi5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqL1xuXHRwdWJsaWMgZ2V0UmVzb3VyY2VCeUtleTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVzb3VyY2VLZXk6IHN0cmluZyxcblx0KTogQXJyYXk8Q29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCB8fCAhKHRoaXMudHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBUcmFuc2FjdGlvbkNhY2hlKSkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uUmVzb3VyY2VzW2VudHJ5SWRdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHJlc291cmNlcykge1xuXHRcdFx0XHRpZiAocmVzb3VyY2Uub3B0aW9ucy5yZXNvdXJjZUtleSA9PT0gcmVzb3VyY2VLZXkpIHtcblx0XHRcdFx0XHRyZXN1bHQucHVzaChyZXNvdXJjZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG4iLCJpbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgUXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBRdWVyeVBhcnNlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucywgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlLCBDb2xsZWN0aW9uUXVlcnksIEVudHJ5UGFyZW50TnVsbCwgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FbnRyeVNlcnZpY2Uge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGNyZWF0ZVVuZm91bmRMb2NhbENvbGxlY3Rpb25FcnJvciAoaXRlbVR5cGU6IEl0ZW1UeXBlKToge21lc3NhZ2U6IHN0cmluZ30ge1xuXHRcdHJldHVybiB7bWVzc2FnZTogYEEgbG9jYWwgY29sbGVjdGlvbiBvZiB0eXBlICR7aXRlbVR5cGV9IGNvdWxkIG5vdCBiZSBmb3VuZGB9O1xuXHR9XG5cblx0Ly8gbm8gbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgY29sdW1ucyBwcm9wZXJ0eSwgaXQgd2lsbCBiZSByZXBsYWNlZCBpbiB3aGVuIGNvbHVtbnMgYXJlIGV4cGFuZGVkXG5cdGNsb25lT3B0aW9ucyAoXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0gbmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyk7IC8vIGRvZXMgYSBzaGFsbG93IGNvcHlcblxuXHRcdHJlc3VsdC5xdWVyeVBhcmFtcyA9IHRoaXMuY2xvbmVRdWVyeVBhcmFtcyhvcHRpb25zLnF1ZXJ5UGFyYW1zKTtcblx0XHRyZXN1bHQucGFyZW50ID0gcGFyZW50O1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByb2Nlc3NPcHRpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAob3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPik6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMge1xuXHRcdHJldHVybiBuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKTtcblx0fVxuXG5cdGNsb25lUXVlcnlQYXJhbXM8VCBleHRlbmRzIG9iamVjdD4gKHBhcmFtZXRlcnM6IFQpOiBUIHtcblx0XHRjb25zdCByZXN1bHQ6IGFueSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBrZXkgaW4gcGFyYW1ldGVycykge1xuXHRcdFx0Y29uc3QgdmFsdWUgPSBwYXJhbWV0ZXJzW2tleV07XG5cdFx0XHRsZXQgY2xvbmU7XG5cblx0XHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0XHRjbG9uZSA9IHZhbHVlLnNsaWNlKCk7XG5cdFx0XHR9Ly8gd2UncmUgb25seSB1c2luZyBwcmltaXRpdmUgYXJyYXlzXG5cdFx0XHRlbHNlIGlmIChtb21lbnQuaXNNb21lbnQodmFsdWUpKSB7XG5cdFx0XHRcdGNsb25lID0gdmFsdWUuY2xvbmUoKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNsb25lID0gdmFsdWU7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdFtrZXldID0gY2xvbmU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGNyZWF0ZVF1ZXJ5IChvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zKTogQ29sbGVjdGlvblF1ZXJ5IHtcblx0XHRjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcblxuXHRcdGxldCBxdWVyeTtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHF1ZXJ5ID0gb3B0aW9ucy5xdWVyeTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29uc3QgbGlua2VkVG9RdWVyeSA9IHtcblx0XHRcdFx0bGlua2VkVG86IHBhcmVudC5pdGVtVHlwZSxcblx0XHRcdFx0cXVlcnk6IHtpZDogJyZwYXJlbnRJZCd9LFxuXHRcdFx0fTtcblx0XHRcdG9wdGlvbnMucXVlcnlQYXJhbXMucGFyZW50SWQgPSBwYXJlbnQuaXRlbUlkO1xuXG5cdFx0XHRxdWVyeSA9IG9wdGlvbnMucXVlcnkgPT09IG51bGwgP1xuXHRcdFx0XHRsaW5rZWRUb1F1ZXJ5IDpcblx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuYWRkQW5kQ29uZGl0aW9uKFxuXHRcdFx0XHRcdG9wdGlvbnMucXVlcnksXG5cdFx0XHRcdFx0bGlua2VkVG9RdWVyeSxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMucXVlcnlQYXJzZXJGYWN0b3J5XG5cdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0b3B0aW9ucy5xdWVyeVBhcmFtcyxcblx0XHRcdClcblx0XHRcdC5wYXJzZSgpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9iamVjdDogcGFyc2VkUXVlcnlbMF0sXG5cdFx0XHRzdHJpbmc6IHBhcnNlZFF1ZXJ5WzFdLFxuXHRcdH07XG5cdH1cblxuXHRnZXRJZEFycmF5IChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PGFueT4+LFxuXHRcdGFjY3VtdWxhdG9yOiBJdGVtSWRbXSA9IFtdLFxuXHQpOiBJdGVtSWRbXSB7XG5cdFx0aWYgKGFjY3VtdWxhdG9yID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGFjY3VtdWxhdG9yID0gW107XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGFjY3VtdWxhdG9yLnB1c2goaXRlbUVudHJ5Lml0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGFjY3VtdWxhdG9yO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGaWx0ZXJzIGFuIGFycmF5IG9mIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IGFjY29yZGluZyB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uXG5cdCAqIERvZXMgYW4gaW4tcGxhY2UgcmVwbGFjZW1lbnQgb2YgdGhlIGl0ZW1zIGluIHRoZSBhcnJheSB0aGF0IGRvIG1hdGNoIHRoZSBjb25kaXRpb24gKGtlZXBpbmcgdGhlIGFycmF5IHJlZmVyZW5jZSlcblx0ICpcblx0ICogQHJldHVybnMge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gdGhhdCBmYWlsZWQgdGhlIGNvbmRpdGlvblxuXHQgKi9cblx0ZmlsdGVyQXJyYXk8VCBleHRlbmRzIEl0ZW1FbnRyeTxhbnk+ID0gSXRlbUVudHJ5PGFueT4+IChcblx0XHRpdGVtRW50cmllczogVFtdLFxuXHRcdGNhbGxiYWNrOiAoaXRlbUVudHJ5OiBUKSA9PiBib29sZWFuLFxuXHQpOiBUW10ge1xuXHRcdGNvbnN0IGZpbHRlcmVkRW50cmllczogVFtdID0gW107XG5cdFx0Y29uc3QgcmVtb3ZlZEVudHJpZXM6IFRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdChjYWxsYmFjayhpdGVtRW50cnkpID8gZmlsdGVyZWRFbnRyaWVzIDogcmVtb3ZlZEVudHJpZXMpLnB1c2goaXRlbUVudHJ5KTtcblx0XHR9XG5cblx0XHRpZiAocmVtb3ZlZEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gcmVtb3ZlZEVudHJpZXM7XG5cdFx0fVxuXG5cdFx0aXRlbUVudHJpZXMubGVuZ3RoID0gZmlsdGVyZWRFbnRyaWVzLmxlbmd0aDtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgaXRlbUVudHJpZXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGl0ZW1FbnRyaWVzW2ldID0gZmlsdGVyZWRFbnRyaWVzW2ldO1xuXHRcdH1cblxuXHRcdHJldHVybiByZW1vdmVkRW50cmllcztcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucywgQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZSwgSXRlbVJlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlIHtcblxuXHRwcm9jZXNzT3B0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPlxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKTtcblx0fVxuXG5cdGdldElkQXJyYXkgKGl0ZW1SZXNvdXJjZXM6IEFycmF5PEl0ZW1SZXNvdXJjZTxhbnk+Pik6IEl0ZW1JZFtdIHtcblx0XHRjb25zdCByZXN1bHQ6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtUmVzb3VyY2VzKVxuXHRcdFx0cmVzdWx0LnB1c2goaXRlbVJlc291cmNlLmVudHJ5Lml0ZW1JZCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW4sIEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW4sIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5DYWNoZSB7XG5cdGNhY2hlOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwID0ge307XG5cdGFsbENvbHVtbnM6IHtbaXRlbVR5cGU6IHN0cmluZ106IGJvb2xlYW59ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0KSB7XG5cdH1cblxuXHRzZXRDb2x1bW4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXNwb25zZUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdCk6IFJlc3BvbnNlQ29sdW1uIHtcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cblx0XHRpZiAoY2FjaGVbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNhY2hlW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdGNvbnN0IGVudHJ5ID0gY2FjaGVbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IGNvbHVtbklkID0gcmVzcG9uc2VDb2x1bW4uaWQ7XG5cblx0XHRpZiAoZW50cnlbY29sdW1uSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVudHJ5W2NvbHVtbklkXSA9IHJlc3BvbnNlQ29sdW1uO1xuXHRcdH1cblxuXHRcdHJldHVybiBlbnRyeVtjb2x1bW5JZF07XG5cdH1cblxuXHRzZXRDb2x1bW5zIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB7XG5cdFx0Y29uc3QgcmVzdWx0OiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IHJlc3BvbnNlVHlwZSBpbiByZXNwb25zZUNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbnMgPSByZXNwb25zZUNvbHVtbnNbcmVzcG9uc2VUeXBlXTtcblxuXHRcdFx0cmVzdWx0W3Jlc3BvbnNlVHlwZV0gPSB7fTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBjb2x1bW5zKSB7XG5cdFx0XHRcdHJlc3VsdFtyZXNwb25zZVR5cGVdW2NvbHVtbklkXSA9IHRoaXMuc2V0Q29sdW1uKFxuXHRcdFx0XHRcdHJlc3BvbnNlVHlwZSxcblx0XHRcdFx0XHRjb2x1bW5zW2NvbHVtbklkXSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocmVxdWVzdENvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdHRoaXMuYWxsQ29sdW1uc1tpdGVtVHlwZV0gPSB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRyZXRyaWV2ZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KToge2NhY2hlZDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCwgbWlzc2luZzogQXBpUmVxdWVzdENvbHVtbnN9IHtcblx0XHRpZiAocmVxdWVzdENvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdGlmICh0aGlzLmNvbnRhaW5zQWxsKGl0ZW1UeXBlKSkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGNhY2hlZDogdGhpcy5nZXRDb2x1bW5zKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHRtaXNzaW5nOiBbXSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0Y2FjaGVkOiB7fSxcblx0XHRcdFx0bWlzc2luZzogdHJ1ZSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzcG9uc2VBY2N1bXVsYXRvciA9IHt9O1xuXHRcdGNvbnN0IHJlcXVlc3RBY2N1bXVsYXRvcjogUmVzcG9uc2VDb2x1bW5bXSA9IFtdO1xuXG5cdFx0dGhpcy5yZXRyaWV2ZUNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0cmVxdWVzdEFjY3VtdWxhdG9yLFxuXHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcixcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNhY2hlZDogcmVzcG9uc2VBY2N1bXVsYXRvcixcblx0XHRcdG1pc3Npbmc6IHJlcXVlc3RBY2N1bXVsYXRvcixcblx0XHR9O1xuXHR9XG5cblx0Y29udGFpbnNBbGwgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmFsbENvbHVtbnNbaXRlbVR5cGVdID09PSB0cnVlO1xuXHR9XG5cblx0Z2V0Q29sdW1ucyAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB7XG5cdFx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdFx0cmV0dXJuIHtbaXRlbVR5cGVdOiBjYWNoZVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCA/IFtdIDogY2FjaGVbaXRlbVR5cGVdfTtcblx0fVxuXG5cdHByaXZhdGUgcmV0cmlldmVDb2x1bW5zIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRyZXF1ZXN0QWNjdW11bGF0b3I6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRyZXNwb25zZUFjY3VtdWxhdG9yOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiB2b2lkIHtcblx0XHQvLyBhbHdheXMgcmV0cmlldmUgdGhlIGlkIGNvbHVtblxuXHRcdHRoaXMucmV0cmlldmVDb2x1bW4oXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdCdpZCcsXG5cdFx0XHRyZXF1ZXN0QWNjdW11bGF0b3IsXG5cdFx0XHRyZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IHJlcXVlc3RDb2x1bW4gb2YgcmVxdWVzdENvbHVtbnMpIHtcblx0XHRcdHRoaXMucmV0cmlldmVDb2x1bW4oXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1uLFxuXHRcdFx0XHRyZXF1ZXN0QWNjdW11bGF0b3IsXG5cdFx0XHRcdHJlc3BvbnNlQWNjdW11bGF0b3IsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgcmV0cmlldmVDb2x1bW4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uOiBBcGlSZXF1ZXN0Q29sdW1uLFxuXHRcdHJlcXVlc3RBY2N1bXVsYXRvcjogUmVzcG9uc2VDb2x1bW5bXSxcblx0XHRyZXNwb25zZUFjY3VtdWxhdG9yOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtblV0aWwucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXHRcdGNvbnN0IHJlc3BvbnNlQ29sdW1uID0gdGhpcy5nZXRDb2x1bW4oXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbHVtbi5pZCxcblx0XHQpO1xuXG5cdFx0aWYgKHJlc3BvbnNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlcXVlc3RBY2N1bXVsYXRvci5wdXNoKHJlcXVlc3RDb2x1bW4pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmIChyZXNwb25zZUFjY3VtdWxhdG9yW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXNwb25zZUFjY3VtdWxhdG9yW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHJlc3BvbnNlQWNjdW11bGF0b3JbaXRlbVR5cGVdW2NvbHVtbi5pZF0gPSByZXNwb25zZUNvbHVtbjtcblxuXHRcdGlmIChjb2x1bW4uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWlzc2luZ0Rlcml2ZWQ6IFJlc3BvbnNlQ29sdW1uW10gPSBbXTtcblxuXHRcdHRoaXMucmV0cmlldmVDb2x1bW5zKFxuXHRcdFx0cmVzcG9uc2VDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRjb2x1bW4uY2hpbGRyZW4sXG5cdFx0XHRtaXNzaW5nRGVyaXZlZCxcblx0XHRcdHJlc3BvbnNlQWNjdW11bGF0b3IsXG5cdFx0KTtcblxuXHRcdGlmIChtaXNzaW5nRGVyaXZlZC5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXF1ZXN0QWNjdW11bGF0b3IucHVzaCh7W2NvbHVtbi5pZF06IG1pc3NpbmdEZXJpdmVkfSk7XG5cdH1cblxuXHRwcml2YXRlIGdldENvbHVtbiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdCk6IFJlc3BvbnNlQ29sdW1uIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGVbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGNhY2hlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2FjaGVbY29sdW1uSWRdO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5JbmZvLCBDb2x1bW5TZXQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtbkluZm9GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRDb2x1bW5FeHBhbnNpb25SZXN1bHQsXG5cdEl0ZW1UeXBlLFxuXHRSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRSb290Q29sdW1uTWFwLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGdldEZpcnN0UHJvcGVydHkgfSBmcm9tICcuL1V0aWwnO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogQSBDb2x1bW5FeHBhbnNpb24gaXMgdXNlZCB0byBtYWtlIHN1cmUge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gdGhhdCBoYXZlIHRoZSBzYW1lIHtAbGluayBDb2x1bW5TZXQgQ29sdW1uU2V0fSAobWF0Y2hlZCBvbiB7QGxpbmsgQ29sdW1uU2V0LmlkIENvbHVtblNldC5pZH0pIHdpbGwgYWxsIGdldCB0aGUgc2FtZSBuZXcgZXhwYW5kZWQgQ29sdW1uU2V0XG4gKi9cbmV4cG9ydCBjbGFzcyBDb2x1bW5FeHBhbnNpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IHtcblxuXHRleHBhbnNpb25NYXA6IHtbY29sdW1uU2V0SWQ6IHN0cmluZ106IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGU+IHwgbnVsbH0gPSB7fTtcblx0ZXhwYW5zaW9uTWFwU2l6ZTogbnVtYmVyID0gMDtcblx0cmVxdWVzdENvbHVtbnNUcnVlOiBib29sZWFuO1xuXHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtbkluZm9GYWN0b3J5OiBDb2x1bW5JbmZvRmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cHVibGljIHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KSB7XG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHQvLyByZXF1ZXN0Q29sdW1ucyBzaG91bGQgYWx3YXlzIGJlIGFuIGFycmF5LCB3aGVuIGl0IGlzIHRydWUgZGVyaXZlZCBjb2x1bW4gaW5mb3JtYXRpb24gd2lsbCBiZSBsb3N0XG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZSA9IHRydWU7XG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zID0gW107XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gcmVzcG9uc2VDb2x1bW5zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zLnB1c2goY29sdW1uSWQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZSA9IGZhbHNlO1xuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1ucyA9IHJlcXVlc3RDb2x1bW5zO1xuXHRcdH1cblx0fVxuXG5cdHJ1biAoY29sdW1uU2V0OiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPik6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGU+IHwgbnVsbCB7XG5cdFx0Y29uc3QgZXhwYW5zaW9uTWFwID0gdGhpcy5leHBhbnNpb25NYXA7XG5cdFx0Y29uc3QgY29sdW1uU2V0SWQgPSBjb2x1bW5TZXQuaWQ7XG5cblx0XHRpZiAoZXhwYW5zaW9uTWFwW2NvbHVtblNldElkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZXhwYW5zaW9uTWFwW2NvbHVtblNldElkXTtcblx0XHR9XG5cblx0XHR0aGlzLmV4cGFuc2lvbk1hcFNpemUrKztcblxuXHRcdHJldHVybiBleHBhbnNpb25NYXBbY29sdW1uU2V0SWRdID0gY29sdW1uU2V0LmlzU3VwZXJzZXRPZih0aGlzLnJlcXVlc3RDb2x1bW5zKSA/XG5cdFx0XHRudWxsIDpcblx0XHRcdGNvbHVtblNldC5leHBhbmQoXG5cdFx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnNUcnVlLFxuXHRcdFx0XHR0aGlzLnJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdCk7XG5cdH1cblxuXHRhZ2dyZWdhdGVSb290Q29sdW1ucyAoKTogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgZXhwYW5zaW9uTWFwID0gdGhpcy5leHBhbnNpb25NYXA7XG5cblx0XHRpZiAodGhpcy5leHBhbnNpb25NYXBTaXplID09PSAxKSB7XG5cdFx0XHRjb25zdCBleHBhbnNpb25SZXN1bHQgPSBleHBhbnNpb25NYXBbZ2V0Rmlyc3RQcm9wZXJ0eShleHBhbnNpb25NYXApIGFzIHN0cmluZ107XG5cblx0XHRcdHJldHVybiBleHBhbnNpb25SZXN1bHQgIT09IG51bGwgPyBleHBhbnNpb25SZXN1bHQuZGlmZmVyZW5jZS5yb290IDogW107XG5cdFx0fVxuXG5cdFx0Y29uc3Qgcm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5TZXRJZCBpbiBleHBhbnNpb25NYXApIHtcblx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IGV4cGFuc2lvbk1hcFtjb2x1bW5TZXRJZF07XG5cblx0XHRcdGlmIChjb2x1bW5FeHBhbnNpb24gPT09IG51bGwpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcChcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLmRpZmZlcmVuY2Uucm9vdCxcblx0XHRcdFx0cm9vdENvbHVtbk1hcCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uSW5mb0ZhY3RvcnkuY29uc3RydWN0RnJvbVJvb3RNYXAocm9vdENvbHVtbk1hcCk7XG5cdH1cblxuXHRwcml2YXRlIGV4cGFuZFJvb3RDb2x1bW5NYXAgKFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sXG5cdFx0ZGVzdGluYXRpb246IFJvb3RDb2x1bW5NYXAsXG5cdCkge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtbklkID0gY29sdW1uLmlkO1xuXG5cdFx0XHRpZiAoZGVzdGluYXRpb25bY29sdW1uSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSWRdID0ge1xuXHRcdFx0XHRcdGFwaUNvbHVtbjogY29sdW1uLmFwaUNvbHVtbixcblx0XHRcdFx0XHRjaGlsZHJlbjoge30sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcChcblx0XHRcdFx0Y29sdW1uLmNoaWxkcmVuLFxuXHRcdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JZF0uY2hpbGRyZW4sXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UsIENvbHVtbkNhY2hlLCBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UsIFJlc3BvbnNlQ29sdW1uLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uSGFuZGxlciB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgY2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0KSB7XG5cdH1cblxuXHRzZXRDb2x1bW4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXNwb25zZUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdCk6IFJlc3BvbnNlQ29sdW1uIHtcblx0XHRyZXR1cm4gdGhpcy5jYWNoZS5zZXRDb2x1bW4oXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlQ29sdW1uLFxuXHRcdCk7XG5cdH1cblxuXHRzZXRDb2x1bW5zIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB7XG5cdFx0cmV0dXJuIHRoaXMuY2FjaGUuc2V0Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblx0fVxuXG5cdGZldGNoSXRlbVR5cGVUcmFuc2xhdGlvbnMgKGl0ZW1UeXBlczogSXRlbVR5cGVbXSk6IFByb21pc2VJbnRlcmZhY2U8e1tpdGVtVHlwZTogc3RyaW5nXTogc3RyaW5nfT4ge1xuXHRcdGNvbnN0IHByb21pc2VzOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBQcm9taXNlSW50ZXJmYWNlPFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBvZiBpdGVtVHlwZXMpIHtcblx0XHRcdHByb21pc2VzW2l0ZW1UeXBlXSA9IHRoaXMuZmV0Y2goXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRbJ2lkJ10sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChwcm9taXNlcylcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgcmVzdWx0OiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHJlc3BvbnNlKSB7XG5cdFx0XHRcdFx0XHRyZXN1bHRbaXRlbVR5cGVdID0gcmVzcG9uc2VbaXRlbVR5cGVdW2l0ZW1UeXBlXS5pZC5uYW1lO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRyZXF1ZXN0IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0Y29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cGFyYW1zID0ge2ZpbHRlcjogZmFsc2V9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA+IHtcblx0XHRyZXR1cm4gdGhpcy5hcGlSZXF1ZXN0U2VydmljZS5jb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR7W2l0ZW1UeXBlXTogY29sdW1uc30sXG5cdFx0XHRwYXJhbXMsXG5cdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNvbHVtblJlc291cmNlID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jYWNoZS5zZXRDb2x1bW5zKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRjb2x1bW5zLFxuXHRcdFx0XHRcdFx0Y29sdW1uUmVzb3VyY2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdGZldGNoIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHBhcmFtcz86IGFueSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwPiB7XG5cdFx0Y29uc3QgY29sdW1uUmVzb3VyY2UgPSB0aGlzLmNhY2hlLnJldHJpZXZlKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0aWYgKGNvbHVtblJlc291cmNlLm1pc3NpbmcgIT09IHRydWUgJiYgY29sdW1uUmVzb3VyY2UubWlzc2luZy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sdW1uUmVzb3VyY2UuY2FjaGVkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2x1bW5SZXNvdXJjZS5taXNzaW5nLFxuXHRcdFx0cGFyYW1zLFxuXHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNvbHVtblV0aWwubWVyZ2VSZXNwb25zZUNvbHVtbnMoXG5cdFx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0XHRjb2x1bW5SZXNvdXJjZS5jYWNoZWQsXG5cdFx0XHRcdFx0KS5tZXJnZWQ7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0ZmV0Y2hBbGwgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IFByb21pc2VJbnRlcmZhY2U8UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcD4ge1xuXHRcdGlmICh0aGlzLmNhY2hlLmNvbnRhaW5zQWxsKGl0ZW1UeXBlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbih0aGlzLmNhY2hlLmdldENvbHVtbnMoaXRlbVR5cGUpKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR0cnVlLFxuXHRcdCk7XG5cdH1cbn1cbiIsImV4cG9ydCBjb25zdCBBTExfUEVSTUlTU0lPTlMgPSAnNyc7XG5cbmV4cG9ydCBjb25zdCBDT0xVTU5fU0VQRVJBVE9SID0gJz4nO1xuZXhwb3J0IGNvbnN0IFJFTkRFUl9BU19TRVBFUkFUT1IgPSAnOic7XG5cbmV4cG9ydCBjb25zdCBORVdfUFJFRklYOiBzdHJpbmcgPSAnLTEnO1xuZXhwb3J0IGNvbnN0IERVUExJQ0FURV9QUkVGSVg6IHN0cmluZyA9ICctMic7XG5cbmV4cG9ydCBjb25zdCBORVdfS0VZV09SRDogc3RyaW5nID0gJ25ldy0nO1xuZXhwb3J0IGNvbnN0IERVUExJQ0FURV9LRVlXT1JEOiBzdHJpbmcgPSAnZHVwLSc7XG4iLCJpbXBvcnQgeyBDT0xVTU5fU0VQRVJBVE9SIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbiB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtbkluZm88SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0aWQ6IHN0cmluZztcblx0bGV2ZWw6IG51bWJlcjtcblx0cGF0aDogc3RyaW5nO1xuXHR0YWlsUGF0aDogc3RyaW5nO1xuXHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlIHwgbnVsbCA9IG51bGw7XG5cdGNoaWxkcmVuOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGlzTGVhZjogYm9vbGVhbiA9IHRydWU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHJlYWRvbmx5IGFwaUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0cmVhZG9ubHkgcGFyZW50OiBDb2x1bW5JbmZvPEl0ZW1UeXBlPiB8IG51bGwgPSBudWxsXG5cdCkge1xuXHRcdGNvbnN0IGNvbHVtbklkID0gYXBpQ29sdW1uLmlkO1xuXG5cdFx0dGhpcy5pZCA9IGNvbHVtbklkO1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0dGhpcy5sZXZlbCA9IDA7XG5cdFx0XHR0aGlzLnBhdGggPSBjb2x1bW5JZDtcblx0XHRcdHRoaXMudGFpbFBhdGggPSAnJztcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5sZXZlbCA9IHBhcmVudC5sZXZlbCArIDE7XG5cdFx0XHR0aGlzLnBhdGggPSBwYXJlbnQucGF0aCArIENPTFVNTl9TRVBFUkFUT1IgKyBjb2x1bW5JZDtcblx0XHRcdHRoaXMudGFpbFBhdGggPSBwYXJlbnQubGV2ZWwgPT09IDAgP1xuXHRcdFx0XHRjb2x1bW5JZCA6XG5cdFx0XHRcdHBhcmVudC50YWlsUGF0aCArIENPTFVNTl9TRVBFUkFUT1IgKyBjb2x1bW5JZDtcblx0XHR9XG5cdH1cblxuXHRzZXRDaGlsZHJlbiAoaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSwgY2hpbGRyZW46IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4pOiB0aGlzIHtcblx0XHR0aGlzLml0ZW1UeXBlID0gaXRlbVR5cGU7XG5cdFx0dGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuXHRcdHRoaXMuaXNMZWFmID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uSW5mbywgQ29sdW1uVXRpbCwgUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBDb2x1bW5FeHBhbnNpb25SZXN1bHQsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBlbXB0eU9iamVjdCA9IHt9O1xubGV0IGN1cnJlbnRJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0aWQgPSArK2N1cnJlbnRJZDtcblxuXHRyZXF1ZXN0OiBBcGlSZXF1ZXN0Q29sdW1ucztcblx0cmVxdWVzdENvbHVtbnNUcnVlOiBib29sZWFuO1xuXHRyZXNwb25zZTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IGVtcHR5T2JqZWN0O1xuXG5cdGxpbms6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB8IG51bGwgPSBudWxsO1xuXHRtYWluOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGRlcml2ZWQ6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0cm9vdDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRsZWFmOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdGZvcm1hdHRlZDoge21haW46IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4sIGRlcml2ZWQ6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj59ID0ge1xuXHRcdG1haW46IFtdLFxuXHRcdGRlcml2ZWQ6IFtdLFxuXHR9O1xuXHRmaWx0ZXJlZDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRjdXN0b206IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0c2VhcmNoYWJsZTogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRpdGVtOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdG5vdEl0ZW06IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgZ3JvdXBDb2x1bW5JbmZvIChjb2x1bW5JbmZvOiBDb2x1bW5JbmZvKTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1uVXRpbCA9IHRoaXMuY29sdW1uVXRpbDtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbiA9IGNvbHVtbkluZm8uYXBpQ29sdW1uO1xuXHRcdGNvbnN0IGlzRGVyaXZlZCA9IGNvbHVtbkluZm8ucGFyZW50ICE9PSBudWxsO1xuXG5cdFx0aWYgKGlzRGVyaXZlZCkge1xuXHRcdFx0dGhpcy5kZXJpdmVkLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubWFpbi5wdXNoKGNvbHVtbkluZm8pO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW4udHlwZSA9PT0gJ2xpbmsnKSB7XG5cdFx0XHRcdHRoaXMubGluayA9IGNvbHVtbkluZm87XG5cdFx0XHR9XG5cblx0XHRcdC8vIHdlIGNvdWxkIHBvc3NpYmx5IGFkZCBkZXJpdmVkIGNvbHVtbnMgdG8gJ25vdEl0ZW0nXG5cdFx0XHR0aGlzW2NvbHVtblV0aWwuaXNJdGVtQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSA/ICdpdGVtJyA6ICdub3RJdGVtJ10ucHVzaChjb2x1bW5JbmZvKTtcblxuXHRcdFx0aWYgKCFjb2x1bW5JbmZvLmlzTGVhZikge1xuXHRcdFx0XHR0aGlzLnJvb3QucHVzaChjb2x1bW5JbmZvKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoY29sdW1uVXRpbC5pc0Zvcm1hdHRlZENvbHVtbihyZXNwb25zZUNvbHVtbikpIHtcblx0XHRcdHRoaXMuZm9ybWF0dGVkW2lzRGVyaXZlZCA/ICdkZXJpdmVkJyA6ICdtYWluJ10ucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uVXRpbC5pc0ZpbHRlcmVkQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSkge1xuXHRcdFx0dGhpcy5maWx0ZXJlZC5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5VdGlsLmlzU2VhcmNoYWJsZUNvbHVtbihyZXNwb25zZUNvbHVtbikpIHtcblx0XHRcdHRoaXMuc2VhcmNoYWJsZS5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5VdGlsLmlzQ3VzdG9tQ29sdW1uKHJlc3BvbnNlQ29sdW1uKSkge1xuXHRcdFx0dGhpcy5jdXN0b20ucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uSW5mby5pc0xlYWYpIHtcblx0XHRcdHRoaXMubGVhZi5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblx0fVxuXG5cdHRvSlNPTiAoKSB7XG5cdFx0Y29uc3QgcGFyc2VDb2x1bW5zID0gKGNvbHVtbnM6IENvbHVtbkluZm9bXSkgPT4gY29sdW1ucy5tYXAoXG5cdFx0XHRjID0+IGMuaWQpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1haW46IHBhcnNlQ29sdW1ucyh0aGlzLm1haW4pLFxuXHRcdFx0ZGVyaXZlZDogcGFyc2VDb2x1bW5zKHRoaXMuZGVyaXZlZCksXG5cdFx0fTtcblx0fVxuXG5cdGV4cGFuZFJlcXVlc3RDb2x1bW5zIChjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IHZvaWQge1xuXHRcdGNvbnN0IG1lcmdlZFJlcXVlc3RDb2x1bW5zID0gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHR0aGlzLnJlcXVlc3QsXG5cdFx0XHRjb2x1bW5zLFxuXHRcdCkubWVyZ2VkO1xuXG5cdFx0dGhpcy5yZXF1ZXN0ID0gbWVyZ2VkUmVxdWVzdENvbHVtbnM7XG5cdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUgPSBtZXJnZWRSZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZTtcblx0fVxuXG5cdGlzU3VwZXJzZXRPZiAoY29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMpOiBib29sZWFuIHtcblx0XHRpZiAoY29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdENvbHVtbnNUcnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtblV0aWwgPSB0aGlzLmNvbHVtblV0aWw7XG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbnMgPSB0aGlzLnJlcXVlc3Q7XG5cblx0XHRpZiAocmVxdWVzdENvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiAhY29sdW1uVXRpbC5jb250YWluc0Rlcml2ZWRDb2x1bW5zKGNvbHVtbnMpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGlmICghY29sdW1uVXRpbC5jb250YWluc0NvbHVtbihcblx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNZXJnZWRDb2x1bW5TZXQgKFxuXHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQsXG5cdFx0bWVyZ2VkUmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdHJlcXVlc3RDb2x1bW5zVHJ1ZTogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IHJlc3VsdCA9IHRoaXMuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlPihcblx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRtZXJnZWRSZXF1ZXN0Q29sdW1ucy5tZXJnZWQsXG5cdFx0XHRtZXJnZWRSZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdHJlc3VsdC5yZXF1ZXN0Q29sdW1uc1RydWUgPSB0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZSB8fCByZXF1ZXN0Q29sdW1uc1RydWU7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAocmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0IHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHR0aGlzLnJlcXVlc3QsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXHR9XG5cblx0bWVyZ2VSZXNwb25zZUNvbHVtbnMgKHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdHJldHVybiB0aGlzLmNvbHVtblV0aWwubWVyZ2VSZXNwb25zZUNvbHVtbnMoXG5cdFx0XHR0aGlzLnJlc3BvbnNlLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdCkubWVyZ2VkO1xuXHR9XG5cblx0bWVyZ2UgKGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4pOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuZ2V0TWVyZ2VkQ29sdW1uU2V0KFxuXHRcdFx0dGhpcy5tZXJnZVJlcXVlc3RDb2x1bW5zKGNvbHVtblNldC5yZXF1ZXN0KSxcblx0XHRcdHRoaXMubWVyZ2VSZXNwb25zZUNvbHVtbnMoY29sdW1uU2V0LnJlc3BvbnNlKSxcblx0XHRcdGNvbHVtblNldC5yZXF1ZXN0Q29sdW1uc1RydWUsXG5cdFx0KTtcblx0fVxuXG5cdGV4cGFuZCAoXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlcXVlc3RDb2x1bW5zVHJ1ZTogYm9vbGVhbixcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IENvbHVtbkV4cGFuc2lvblJlc3VsdDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBtZXJnZWRSZXF1ZXN0Q29sdW1ucyA9IHRoaXMubWVyZ2VSZXF1ZXN0Q29sdW1ucyhyZXF1ZXN0Q29sdW1ucyk7XG5cdFx0Y29uc3QgbWVyZ2VkUmVzcG9uc2VDb2x1bW5zID0gdGhpcy5tZXJnZVJlc3BvbnNlQ29sdW1ucyhyZXNwb25zZUNvbHVtbnMpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lcmdlZDogdGhpcy5nZXRNZXJnZWRDb2x1bW5TZXQoXG5cdFx0XHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRtZXJnZWRSZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zVHJ1ZSxcblx0XHRcdCksXG5cdFx0XHRkaWZmZXJlbmNlOiB0aGlzLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRcdG1lcmdlZFJlcXVlc3RDb2x1bW5zLmRpZmZlcmVuY2UsXG5cdFx0XHRcdG1lcmdlZFJlc3BvbnNlQ29sdW1ucywgLy8gd2UgbmVlZCB0byBiZSBhYmxlIHRvIGxvb2sgdXAgdGhlIHBhcmVudCBvZiBkZXJpdmVkIGNvbHVtbnNcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGZhbHNlXG5cdFx0XHQpXG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU2V0IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4ge1xuXHRwcml2YXRlIGNhY2hlOiB7W2NvbHVtblNldElkOiBudW1iZXJdOiBib29sZWFufSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgcmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zXG5cdCkge1xuXG5cdH1cblxuXHRydW4gKGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4pOiBib29sZWFuIHtcblx0XHRjb25zdCBjYWNoZSA9IHRoaXMuY2FjaGU7XG5cdFx0Y29uc3QgY29sdW1uU2V0SWQgPSBjb2x1bW5TZXQuaWQ7XG5cblx0XHRpZiAoY2FjaGVbY29sdW1uU2V0SWRdICE9PSB1bmRlZmluZWQpXG5cdFx0XHRyZXR1cm4gY2FjaGVbY29sdW1uU2V0SWRdO1xuXG5cdFx0cmV0dXJuIGNhY2hlW2NvbHVtblNldElkXSA9IGNvbHVtblNldC5pc1N1cGVyc2V0T2YodGhpcy5yZXF1ZXN0Q29sdW1ucyk7XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBDT0xVTU5fU0VQRVJBVE9SLCBSRU5ERVJfQVNfU0VQRVJBVE9SIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7XG5cdEFwaUxpbmtUcmVlVHlwZSxcblx0QXBpUmVxdWVzdENvbHVtbixcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdEl0ZW1UeXBlLFxuXHRSZXNwb25zZUNvbHVtbixcblx0UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0UmVzcG9uc2VDb2x1bW5NYXAsXG59IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgZXh0ZW5kLCBpc0RlZmluZWQgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQ8VCBleHRlbmRzIEFwaVJlcXVlc3RDb2x1bW5zID0gQXBpUmVxdWVzdENvbHVtbnMsXG5cdFUgZXh0ZW5kcyBBcGlSZXF1ZXN0Q29sdW1ucyA9IEFwaVJlcXVlc3RDb2x1bW5zPiA9IHttZXJnZWQ6IFQsIGRpZmZlcmVuY2U6IFV9O1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uVXRpbCB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgbGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDaGVja3MgdGhlIHtAbGluayBBcGlMaW5rVHJlZSBMaW5rVHJlZX0gYW5kIHJldHVybnMgdGhlIGxpbmsgY29sdW1uSWRzIGZvciB0aGUgZ2l2ZW4gSXRlbVR5cGVcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiAtIEZvciB7QGxpbmsgQXBpTGlua1RyZWVUeXBlLkRJUkVDVCBkaXJlY3QgbGlua3N9IGl0IHdpbGwgYmUgYSBjb2x1bW5JZFxuXHQgKiAtIEZvciB7QGxpbmsgQXBpTGlua1RyZWVUeXBlLklURU1UQUJMRSBpdGVtdGFibGUgbGlua3N9IGl0IHdpbGwgYmUgJ2l0ZW10eXBlJyBhbmQgJ2l0ZW0nXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q29sdW1uc0Zyb21MaW5rIChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdCk6IEFwaVJlcXVlc3RDb2x1bW5bXSB7XG5cdFx0Y29uc3QgbGlua1RyZWUgPSB0aGlzLmxpbmtUcmVlU2VydmljZS5nZXQoKTtcblx0XHRjb25zdCBsaW5rVHJlZUVudHJ5ID0gbGlua1RyZWVbcGFyZW50VHlwZV1baXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXBpUmVxdWVzdENvbHVtbltdID0gW107XG5cblx0XHRzd2l0Y2ggKGxpbmtUcmVlRW50cnkudHlwZSkge1xuXHRcdFx0Y2FzZSBBcGlMaW5rVHJlZVR5cGUuRElSRUNUOlxuXHRcdFx0XHRyZXN1bHQucHVzaChsaW5rVHJlZUVudHJ5LmZpZWxkKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRjYXNlIEFwaUxpbmtUcmVlVHlwZS5JVEVNVEFCTEU6XG5cdFx0XHRcdHJlc3VsdC5wdXNoKCdpdGVtdHlwZScpO1xuXHRcdFx0XHRyZXN1bHQucHVzaCgnaXRlbScpO1xuXHRcdFx0XHRicmVhaztcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Z2V0Q29sdW1uUGF0aCAoXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5bXSxcblx0XHRyZW5kZXJBczogbnVsbCB8IHN0cmluZyxcblx0KSB7XG5cdFx0bGV0IHNlcGFyYXRvciA9ICcnO1xuXHRcdGxldCByZXN1bHQgPSAnJztcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdHJlc3VsdCArPSBzZXBhcmF0b3IgKyBjb2x1bW4uaWQ7XG5cdFx0XHRzZXBhcmF0b3IgPSBDT0xVTU5fU0VQRVJBVE9SO1xuXHRcdH1cblxuXHRcdGlmIChyZW5kZXJBcyAhPT0gbnVsbCkge1xuXHRcdFx0cmVzdWx0ICs9IFJFTkRFUl9BU19TRVBFUkFUT1IgKyByZW5kZXJBcztcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Z2V0RGF0ZUZvcm1hdE9wdGlvbnMgKGNvbHVtblR5cGU/OiAnZGF0ZXRpbWUnKSB7XG5cdFx0Y29uc3Qgbm93ID0gbW9tZW50KCk7XG5cblx0XHRjb25zdCBmb3JtYXRzID0ge1xuXHRcdFx0J0otTS1ZJzogbm93LmZvcm1hdCgnREQtTU0tWVlZWScpLFxuXHRcdFx0J0otTSc6IG5vdy5mb3JtYXQoJ0RELU1NJyksXG5cdFx0XHQnaitGK1knOiBub3cuZm9ybWF0KCdEIE1NTSBZWVlZJyksXG5cdFx0XHQnRCtqK0YrWSc6IG5vdy5mb3JtYXQoJ2RkZGQgRCBNTU0gWVlZWScpLFxuXHRcdFx0J0YnOiBub3cuZm9ybWF0KCdNTU0nKSxcblx0XHRcdCdmJzogbm93LmZvcm1hdCgnTU1NTScpLFxuXHRcdFx0J0QnOiBub3cuZm9ybWF0KCdkZGRkJyksXG5cdFx0XHQnZCc6IG5vdy5mb3JtYXQoJ2RkZCcpLFxuXHRcdH07XG5cblx0XHRpZiAoY29sdW1uVHlwZSA9PT0gJ2RhdGV0aW1lJykge1xuXHRcdFx0ZXh0ZW5kKFxuXHRcdFx0XHRmb3JtYXRzLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0J0otTS1ZK0g6aSc6IG5vdy5mb3JtYXQoJ0RELU1NLVlZWVkgSEg6bW0nKSxcblx0XHRcdFx0XHQnSi1NK0g6aSc6IG5vdy5mb3JtYXQoJ0RELU1NIEhIOm1tJyksXG5cdFx0XHRcdFx0J2orRitZK0g6aSc6IG5vdy5mb3JtYXQoJ0REIE1NTU0gWSBISDptbScpLFxuXHRcdFx0XHRcdCdEK2orRitZK0g6aSc6IG5vdy5mb3JtYXQoJ2RkZGQgREQgTU1NIFkgSEg6bW0nKSxcblx0XHRcdFx0XHQnSDppJzogbm93LmZvcm1hdCgnSEg6bW0nKSxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZvcm1hdHM7XG5cdH1cblxuXHRpc1N0cmluZ0NvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2VtYWlsJzpcblx0XHRcdGNhc2UgJ3Bob25lJzpcblx0XHRcdGNhc2UgJ3VybCc6XG5cdFx0XHRjYXNlICd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2xvbmd0ZXh0Jzpcblx0XHRcdGNhc2UgJ3RleHRyZXBsYWNlJzpcblx0XHRcdFx0Ly8gY2FzZSAnaHRtbCc6IC8vIFRPRE86IHNvcnQgb24gZmlsdGVyZWQgdmFsdWVcblx0XHRcdFx0Ly8gY2FzZSAnZW51bSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzRmxvYXRDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdkb3VibGUnOiAvLyBmbG9hdGluZyBwb2ludCB0eXBlc1xuXHRcdFx0Y2FzZSAndm9sdW1lJzpcblx0XHRcdGNhc2UgJ3dlaWdodCc6XG5cdFx0XHRjYXNlICdkaXN0YW5jZSc6XG5cdFx0XHRjYXNlICdkaW1lbnNpb24nOlxuXHRcdFx0Y2FzZSAncG93ZXInOlxuXHRcdFx0Y2FzZSAnY3VycmVudCc6XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdwZXJjZW50YWdlJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNJbnRDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdpbnQnOiAvLyBpbnRlZ2VyIHR5cGVzXG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0Y2FzZSAncXVhbnRpdHknOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc051bWJlckNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmlzRmxvYXRDb2x1bW4oY29sdW1uKSB8fCB0aGlzLmlzSW50Q29sdW1uKGNvbHVtbik7XG5cdH1cblxuXHRpc0N1c3RvbUNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBjb2x1bW4uZmllbGR0eXBlID09PSAnY3VzdG9tZmllbGQnO1xuXHR9XG5cblx0aXNJdGVtQ29sdW1uIChcblx0XHRjb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHRcdGluY2x1ZGVJZCA9IHRydWUsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2lkJzpcblx0XHRcdFx0cmV0dXJuIGluY2x1ZGVJZDtcblx0XHRcdGNhc2UgJ2l0ZW0nOlxuXHRcdFx0Y2FzZSAnY2hpbGQnOlxuXHRcdFx0Y2FzZSAnc2libGluZyc6XG5cdFx0XHRjYXNlICdsaW5rJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNEYXRlQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzUmVuZGVyZWRDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNGaWx0ZXJlZENvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdC8vIHVnbHkgaGFjayA6LShcblx0XHRpZiAoY29sdW1uLmlkID09PSAnc3RhZmZlbCcpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW4uZ2VuZXJhdG9yICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ3ByaWNlJzpcblx0XHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0Y2FzZSAnZW51bSc6XG5cdFx0XHRjYXNlICdjb3VudHJ5Jzpcblx0XHRcdGNhc2UgJ3ZvbHVtZSc6XG5cdFx0XHRjYXNlICd3ZWlnaHQnOlxuXHRcdFx0Y2FzZSAnZGlzdGFuY2UnOlxuXHRcdFx0Y2FzZSAnZGltZW5zaW9uJzpcblx0XHRcdGNhc2UgJ3F1YW50aXR5Jzpcblx0XHRcdGNhc2UgJ2VtYWlsJzpcblx0XHRcdGNhc2UgJ3VybCc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0Y2FzZSAnaHRtbCc6XG5cdFx0XHRjYXNlICd0ZXh0cmVwbGFjZSc6XG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRjYXNlICdwZXJjZW50YWdlJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNGb3JtYXR0ZWRDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0Y2FzZSAnY29sb3InOlxuXHRcdFx0Y2FzZSAnanNvbic6XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0Y2FzZSAnZmlsZXNpemUnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc1NlbGVjdGFibGVDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdibG9iJzpcblx0XHRcdGNhc2UgJ2Nvb3JkaW5hdGUnOlxuXHRcdFx0Y2FzZSAnZm9yY2V1cGRhdGUnOlxuXHRcdFx0Y2FzZSAnaWQnOlxuXHRcdFx0Y2FzZSAnanNvbic6XG5cdFx0XHRjYXNlICdvcmRlcic6XG5cdFx0XHRjYXNlICdwYXJlbnRpZCc6XG5cdFx0XHRjYXNlICdwYXJlbnR0eXBlJzpcblx0XHRcdGNhc2UgJ3Bhc3N3b3JkJzpcblx0XHRcdGNhc2UgJ3Rva2VuJzpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aGFzTG9jYXRpb25Qcm9wZXJ0eSAoXG5cdFx0Y29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRsb2NhdGlvbjogbnVtYmVyLFxuXHQpOiBib29sZWFuIHtcblx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYml0d2lzZVxuXHRcdHJldHVybiAobG9jYXRpb24gJiBjb2x1bW4ubG9jYXRpb24pICE9PSAwO1xuXHR9XG5cblx0aXNFZGl0YWJsZUNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdGlmIChjb2x1bW4ucmVhZE9ubHkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0aXNTZWFyY2hhYmxlQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0Y2FzZSAncGhvbmUnOlxuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRjYXNlICdodG1sJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0Z2V0RGVmYXVsdFdlaWdodCAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IG51bWJlciB7XG5cdFx0Ly8gXHRcdFx0Y29uc29sZS5sb2coJ2dldERlZmF1bHRXZWlnaHQnLCBjb2x1bW4pO1xuXG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZG91YmxlJzpcblx0XHRcdGNhc2UgJ3ByaWNlJzpcblx0XHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0Y2FzZSAnaW50Jzpcblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2UnOlxuXHRcdFx0Y2FzZSAnY29sb3InOlxuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ3Bvd2VyJzpcblx0XHRcdGNhc2UgJ2N1cnJlbnQnOlxuXHRcdFx0XHRyZXR1cm4gMC41O1xuXG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0Y2FzZSAnZW51bSc6XG5cdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRjYXNlICd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2l0ZW0nOlxuXHRcdFx0Y2FzZSAnbGluayc6XG5cdFx0XHRcdHJldHVybiAxLjU7XG5cblx0XHRcdGNhc2UgJ2xvbmd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2h0bWwnOlxuXHRcdFx0Y2FzZSAndGV4dHJlcGxhY2UnOlxuXHRcdFx0XHRyZXR1cm4gMjtcblxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gMTtcblx0XHR9XG5cdH1cblxuXHRnZXRDb21wYXJhdG9ycyAoY29sdW1uOiBSZXNwb25zZUNvbHVtbiAmIHt0eXBlOiAnZGltZW5zaW9uJyB8ICd3ZWlnaHQnIHwgJ3ByaWNlJ30pOiBbJz0nLCAnPicsICc8J107XG5cdGdldENvbXBhcmF0b3JzIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uICYge3R5cGU6ICdkYXRlJyB8ICdkYXRldGltZScgfCAndGltZScgfCAnZHVyYXRpb24nfSk6IFsnPicsICc8J107XG5cdGdldENvbXBhcmF0b3JzIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogWyc9JywgJyE9J107XG5cdGdldENvbXBhcmF0b3JzIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKSB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGltZW5zaW9uJzpcblx0XHRcdGNhc2UgJ3dlaWdodCc6XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRcdHJldHVybiBbXG5cdFx0XHRcdFx0Jz0nLFxuXHRcdFx0XHRcdCc+Jyxcblx0XHRcdFx0XHQnPCcsXG5cdFx0XHRcdF07XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ3RpbWUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdCc+Jyxcblx0XHRcdFx0XHQnPCcsXG5cdFx0XHRcdF07XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdCc9Jyxcblx0XHRcdFx0XHQnIT0nLFxuXHRcdFx0XHRdO1xuXHRcdH1cblx0fVxuXG5cdGNvbnRhaW5zQ29sdW1uIChcblx0XHRyZXF1ZXN0Q29sdW1uOiBBcGlSZXF1ZXN0Q29sdW1uLFxuXHRcdGRlc3RpbmF0aW9uOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXHRcdGNvbnN0IGNvbHVtbkluZGV4ID0gdGhpcy5maW5kUmVxdWVzdENvbHVtbihcblx0XHRcdGNvbHVtbi5pZCxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdCk7XG5cblx0XHRpZiAoY29sdW1uSW5kZXggPT09IC0xKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtbi5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgZGVzdGluYXRpb25bY29sdW1uSW5kZXhdID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY2hpbGRDb2x1bW4gb2YgY29sdW1uLmNoaWxkcmVuKSB7XG5cdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRpZiAoIXRoaXMuY29udGFpbnNDb2x1bW4oXG5cdFx0XHRcdGNoaWxkQ29sdW1uLFxuXHRcdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF1bY29sdW1uLmlkXSxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Y29udGFpbnNEZXJpdmVkQ29sdW1ucyAocmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSk6IGJvb2xlYW4ge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIHJlcXVlc3RDb2x1bW5zKSB7XG5cdFx0XHRpZiAodGhpcy5wYXJzZVJlcXVlc3RDb2x1bW4oY29sdW1uKS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJlc3BvbnNlQ29sdW1uc0F2YWlsYWJsZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdFx0cmVzcG9uc2VDb2x1bW5NYXA6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGZvciAoY29uc3QgcmVxdWVzdENvbHVtbiBvZiByZXF1ZXN0Q29sdW1ucykge1xuXHRcdFx0Y29uc3QgcGFyc2VkQ29sdW1uID0gdGhpcy5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cdFx0XHRjb25zdCBjaGlsZHJlbiA9IHBhcnNlZENvbHVtbi5jaGlsZHJlbjtcblx0XHRcdGNvbnN0IHJlc3BvbnNlQ29sdW1ucyA9IHJlc3BvbnNlQ29sdW1uTWFwW2l0ZW1UeXBlXTtcblx0XHRcdGxldCByZXNwb25zZUNvbHVtbjtcblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1ucyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmVzcG9uc2VDb2x1bW4gPSByZXNwb25zZUNvbHVtbnNbcGFyc2VkQ29sdW1uLmlkXTtcblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNoaWxkcmVuLmxlbmd0aCA+IDAgJiZcblx0XHRcdFx0IXRoaXMucmVzcG9uc2VDb2x1bW5zQXZhaWxhYmxlKFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRcdGNoaWxkcmVuLFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uTWFwLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0Y29weVJlcXVlc3RDb2x1bW5zIChjb2x1bW5zOiB0cnVlKTogdHJ1ZTtcblx0Y29weVJlcXVlc3RDb2x1bW5zIChjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10pOiBBcGlSZXF1ZXN0Q29sdW1uW107XG5cdGNvcHlSZXF1ZXN0Q29sdW1ucyAoY29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMpOiBBcGlSZXF1ZXN0Q29sdW1ucyB7XG5cdFx0aWYgKGNvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdDogQXBpUmVxdWVzdENvbHVtbltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRyZXN1bHQucHVzaCh0aGlzLmNvcHlSZXF1ZXN0Q29sdW1uKGNvbHVtbikpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRjb3B5UmVxdWVzdENvbHVtbiAocmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbik6IEFwaVJlcXVlc3RDb2x1bW4ge1xuXHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXG5cdFx0aWYgKGNvbHVtbi5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBjb2x1bW4uaWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hpbGRyZW46IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZENvbHVtbiBvZiBjb2x1bW4uY2hpbGRyZW4pIHtcblx0XHRcdGNoaWxkcmVuLnB1c2godGhpcy5jb3B5UmVxdWVzdENvbHVtbihjaGlsZENvbHVtbikpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7W2NvbHVtbi5pZF06IGNoaWxkcmVufTtcblx0fVxuXG5cdG1lcmdlUmVxdWVzdENvbHVtbnMgKFxuXHRcdGZpcnN0OiB0cnVlLFxuXHRcdHNlY29uZDogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdDx0cnVlLCBbXT47XG5cdG1lcmdlUmVxdWVzdENvbHVtbnMgKFxuXHRcdGZpcnN0OiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdFx0c2Vjb25kOiB0cnVlLFxuXHQpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQ8dHJ1ZSwgdHJ1ZT47XG5cdG1lcmdlUmVxdWVzdENvbHVtbnMgKFxuXHRcdGZpcnN0OiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdFx0c2Vjb25kOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6XG5cdFx0UmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0PEFwaVJlcXVlc3RDb2x1bW5bXSwgQXBpUmVxdWVzdENvbHVtbltdPjtcblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Zmlyc3Q6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHNlY29uZDogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdDtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNvbHVtbnMgYW5kIHJldHVybnMgdGhlIG1lcmdlZCBzZXQgYW5kIHRoZSBkaWZmZXJlbmNlLlxuXHQgKlxuXHQgKiBAcmV0dXJuc1xuXHQgKiAtIE1lcmdlZDogVGhlIG1lcmdlZCBzZXQgb2YgY29sdW1uc1xuXHQgKiAtIERpZmZlcmVuY2U6IENvbHVtbnMgdGhhdCBhcmUgaW4gc2Vjb25kLCBidXQgbm90IGluIGZpcnN0XG5cdCAqL1xuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0c2Vjb25kOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0IHtcblx0XHRpZiAoZmlyc3QgPT09IHRydWUpIC8vID09PSBvcGVyYXRvciBuZWVkZWQgaGVyZVxuXHRcdHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1lcmdlZDogdHJ1ZSxcblx0XHRcdFx0ZGlmZmVyZW5jZTogW10sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChzZWNvbmQgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdG1lcmdlZDogdHJ1ZSxcblx0XHRcdFx0ZGlmZmVyZW5jZTogdHJ1ZSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgbWVyZ2VkID0gdGhpcy5jb3B5UmVxdWVzdENvbHVtbnMoZmlyc3QpO1xuXHRcdGNvbnN0IGRpZmZlcmVuY2U6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2Ygc2Vjb25kKSB7XG5cdFx0XHRjb25zdCBhZGRlZENvbHVtbiA9IHRoaXMubWVyZ2VSZXF1ZXN0Q29sdW1uKFxuXHRcdFx0XHRjb2x1bW4sXG5cdFx0XHRcdG1lcmdlZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChhZGRlZENvbHVtbiAhPT0gbnVsbCkge1xuXHRcdFx0XHRkaWZmZXJlbmNlLnB1c2goYWRkZWRDb2x1bW4pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRtZXJnZWQ6IG1lcmdlZCxcblx0XHRcdGRpZmZlcmVuY2U6IGRpZmZlcmVuY2UsXG5cdFx0fTtcblx0fVxuXG5cdG1lcmdlUmVxdWVzdENvbHVtbiAoXG5cdFx0cmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbixcblx0XHRkZXN0aW5hdGlvbjogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpIHtcblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblx0XHRjb25zdCBjb2x1bW5JbmRleCA9IHRoaXMuZmluZFJlcXVlc3RDb2x1bW4oXG5cdFx0XHRjb2x1bW4uaWQsXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHQpO1xuXG5cdFx0aWYgKGNvbHVtbkluZGV4ID09PSAtMSkge1xuXHRcdFx0ZGVzdGluYXRpb24ucHVzaChyZXF1ZXN0Q29sdW1uKTtcblx0XHRcdHJldHVybiByZXF1ZXN0Q29sdW1uO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW4uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XSA9IHtcblx0XHRcdFx0W2NvbHVtbi5pZF06IFtdLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCBhZGRlZENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNoaWxkQ29sdW1uIG9mIGNvbHVtbi5jaGlsZHJlbikge1xuXHRcdFx0Y29uc3QgYWRkZWRDb2x1bW4gPSB0aGlzLm1lcmdlUmVxdWVzdENvbHVtbihcblx0XHRcdFx0Y2hpbGRDb2x1bW4sXG5cdFx0XHRcdC8vIEB0cy1pZ25vcmVcblx0XHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSW5kZXhdW2NvbHVtbi5pZF0sXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoYWRkZWRDb2x1bW4gIT09IG51bGwpIHtcblx0XHRcdFx0YWRkZWRDb2x1bW5zLnB1c2goYWRkZWRDb2x1bW4pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChhZGRlZENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1tjb2x1bW4uaWRdOiBhZGRlZENvbHVtbnN9O1xuXHR9XG5cblx0Z2V0UmVxdWVzdENvbHVtbklkIChyZXF1ZXN0Q29sdW1uOiBBcGlSZXF1ZXN0Q29sdW1uKTogc3RyaW5nIHtcblx0XHRpZiAodHlwZW9mIHJlcXVlc3RDb2x1bW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4gcmVxdWVzdENvbHVtbjtcblx0XHR9XG5cblx0XHRsZXQgY29sdW1uSWQ7XG5cblx0XHRmb3IgKGNvbHVtbklkIGluIHJlcXVlc3RDb2x1bW4pIHtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29sdW1uSWQgYXMgc3RyaW5nO1xuXHR9XG5cblx0cGFyc2VSZXF1ZXN0Q29sdW1uIChyZXF1ZXN0Q29sdW1uOiBBcGlSZXF1ZXN0Q29sdW1uKToge2lkOiBzdHJpbmcsIGNoaWxkcmVuOiBBcGlSZXF1ZXN0Q29sdW1uW119IHtcblx0XHRpZiAodHlwZW9mIHJlcXVlc3RDb2x1bW4gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRpZDogcmVxdWVzdENvbHVtbixcblx0XHRcdFx0Y2hpbGRyZW46IFtdLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRsZXQgY29sdW1uSWQ7XG5cblx0XHRmb3IgKGNvbHVtbklkIGluIHJlcXVlc3RDb2x1bW4pIHtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0aWQ6IGNvbHVtbklkIGFzIHN0cmluZyxcblx0XHRcdGNoaWxkcmVuOiByZXF1ZXN0Q29sdW1uW2NvbHVtbklkIGFzIHN0cmluZ10sXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHR3byBzZXRzIG9mIHtAbGluayBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXBzfS5cblx0ICpcblx0ICogQHJldHVybnNcblx0ICogLSBNZXJnZWQ6IFRoZSBtZXJnZWQgc2V0IG9mIGNvbHVtbnNcblx0ICogLSBEaWZmZXJlbmNlOiBDb2x1bW5zIHRoYXQgYXJlIGluIHNlY29uZCwgYnV0IG5vdCBpbiBmaXJzdFxuXHQgKi9cblx0bWVyZ2VSZXNwb25zZUNvbHVtbnMgKFxuXHRcdGZpcnN0OiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdHNlY29uZDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KToge21lcmdlZDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCwgZGlmZmVyZW5jZTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcH0ge1xuXHRcdGNvbnN0IG1lcmdlZDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHt9O1xuXHRcdGNvbnN0IGRpZmZlcmVuY2U6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZmlyc3QpIHtcblx0XHRcdGlmIChzZWNvbmRbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bWVyZ2VkW2l0ZW1UeXBlXSA9IGZpcnN0W2l0ZW1UeXBlXTtcblxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgbWVyZ2VSZXN1bHQgPSB0aGlzLm1lcmdlUmVzcG9uc2VDb2x1bW5NYXAoXG5cdFx0XHRcdGZpcnN0W2l0ZW1UeXBlXSxcblx0XHRcdFx0c2Vjb25kW2l0ZW1UeXBlXSxcblx0XHRcdCk7XG5cblx0XHRcdG1lcmdlZFtpdGVtVHlwZV0gPSBtZXJnZVJlc3VsdC5tZXJnZWQ7XG5cdFx0XHRkaWZmZXJlbmNlW2l0ZW1UeXBlXSA9IG1lcmdlUmVzdWx0LmRpZmZlcmVuY2U7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBzZWNvbmQpIHtcblx0XHRcdGlmIChmaXJzdFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRtZXJnZWRbaXRlbVR5cGVdID0gc2Vjb25kW2l0ZW1UeXBlXTtcblx0XHRcdFx0ZGlmZmVyZW5jZVtpdGVtVHlwZV0gPSBzZWNvbmRbaXRlbVR5cGVdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRtZXJnZWQ6IG1lcmdlZCxcblx0XHRcdGRpZmZlcmVuY2U6IGRpZmZlcmVuY2UsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHR3byBzZXRzIG9mIHtAbGluayBSZXNwb25zZUNvbHVtbk1hcCByZXNwb25zZSBjb2x1bW5zfS5cblx0ICpcblx0ICogQHJldHVybnNcblx0ICogLSBNZXJnZWQ6IFRoZSBtZXJnZWQgc2V0IG9mIGNvbHVtbnNcblx0ICogLSBEaWZmZXJlbmNlOiBDb2x1bW5zIHRoYXQgYXJlIGluIHNlY29uZCwgYnV0IG5vdCBpbiBmaXJzdFxuXHQgKi9cblx0bWVyZ2VSZXNwb25zZUNvbHVtbk1hcCAoXG5cdFx0Zmlyc3Q6IFJlc3BvbnNlQ29sdW1uTWFwLFxuXHRcdHNlY29uZDogUmVzcG9uc2VDb2x1bW5NYXAsXG5cdCk6IHttZXJnZWQ6IFJlc3BvbnNlQ29sdW1uTWFwLCBkaWZmZXJlbmNlOiBSZXNwb25zZUNvbHVtbk1hcH0ge1xuXHRcdGNvbnN0IG1lcmdlZDogUmVzcG9uc2VDb2x1bW5NYXAgPSB7fTtcblx0XHRjb25zdCBkaWZmZXJlbmNlOiBSZXNwb25zZUNvbHVtbk1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBmaXJzdCkge1xuXHRcdFx0bWVyZ2VkW2NvbHVtbklkXSA9IGZpcnN0W2NvbHVtbklkXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHNlY29uZCkge1xuXHRcdFx0aWYgKGlzRGVmaW5lZChmaXJzdFtjb2x1bW5JZF0pKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRtZXJnZWRbY29sdW1uSWRdID0gc2Vjb25kW2NvbHVtbklkXTtcblx0XHRcdGRpZmZlcmVuY2VbY29sdW1uSWRdID0gc2Vjb25kW2NvbHVtbklkXTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVyZ2VkOiBtZXJnZWQsXG5cdFx0XHRkaWZmZXJlbmNlOiBkaWZmZXJlbmNlLFxuXHRcdH07XG5cdH1cblxuXHRpc0xvY2FsQ29sdW1uSWQgKGNvbHVtbklkOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29sdW1uSWQuc3Vic3RyaW5nKFxuXHRcdFx0MCxcblx0XHRcdDIsXG5cdFx0KSA9PT0gJ19fJztcblx0fVxuXG5cdHByb2Nlc3NDb25maWdDb2x1bW5zIChjb25maWdDb2x1bW5zOiBzdHJpbmdbXSk6IEFwaVJlcXVlc3RDb2x1bW5bXSB7XG5cdFx0Y29uc3QgcmVxdWVzdDogQXBpUmVxdWVzdENvbHVtbltdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb25maWdDb2x1bW5zKSB7XG5cdFx0XHRpZiAodGhpcy5pc0xvY2FsQ29sdW1uSWQoY29sdW1uKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5wcm9jZXNzQ29uZmlnQ29sdW1uKFxuXHRcdFx0XHR0aGlzLnBhcnNlQ29uZmlnQ29sdW1uKGNvbHVtbiksXG5cdFx0XHRcdHJlcXVlc3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXF1ZXN0O1xuXHR9XG5cblx0cGFyc2VDb25maWdDb2x1bW4gKGNvbmZpZ0NvbHVtbjogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRcdHJldHVybiBjb25maWdDb2x1bW4uc3BsaXQoUkVOREVSX0FTX1NFUEVSQVRPUilbMF0uc3BsaXQoQ09MVU1OX1NFUEVSQVRPUik7XG5cdH1cblxuXHRwcm9jZXNzQ29uZmlnQ29sdW1uIChcblx0XHRwYXJzZWRDb25maWdDb2x1bW46IHN0cmluZ1tdLFxuXHRcdGRlc3RpbmF0aW9uOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCkge1xuXHRcdGNvbnN0IGNvbHVtbklkID0gcGFyc2VkQ29uZmlnQ29sdW1uWzBdO1xuXHRcdGNvbnN0IGlzTGVhZiA9IHBhcnNlZENvbmZpZ0NvbHVtbi5sZW5ndGggPT09IDE7XG5cdFx0bGV0IGNvbHVtbkluZGV4ID0gdGhpcy5maW5kUmVxdWVzdENvbHVtbihcblx0XHRcdGNvbHVtbklkLFxuXHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0KTtcblxuXHRcdGlmIChpc0xlYWYpIHtcblx0XHRcdGlmIChjb2x1bW5JbmRleCA9PT0gLTEpIHtcblx0XHRcdFx0ZGVzdGluYXRpb24ucHVzaChjb2x1bW5JZCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uSW5kZXggPT09IC0xKSB7XG5cdFx0XHRjb2x1bW5JbmRleCA9IGRlc3RpbmF0aW9uLnB1c2goe1tjb2x1bW5JZF06IFtdfSkgLSAxO1xuXHRcdH0gZWxzZSBpZiAodHlwZW9mIGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XSA9IHtbY29sdW1uSWRdOiBbXX07XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHRoaXMucHJvY2Vzc0NvbmZpZ0NvbHVtbihcblx0XHRcdHBhcnNlZENvbmZpZ0NvbHVtbi5zbGljZSgxKSxcblx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XVtjb2x1bW5JZF0sXG5cdFx0KTtcblx0fVxuXG5cdGZpbmRSZXF1ZXN0Q29sdW1uIChcblx0XHRjb2x1bW5JZDogc3RyaW5nLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6IG51bWJlciB7XG5cdFx0Zm9yIChsZXQgaSA9IDA7IGkgPCByZXF1ZXN0Q29sdW1ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgY29sdW1uID0gcmVxdWVzdENvbHVtbnNbaV07XG5cblx0XHRcdGlmICh0aGlzLmdldFJlcXVlc3RDb2x1bW5JZChjb2x1bW4pID09PSBjb2x1bW5JZCkge1xuXHRcdFx0XHRyZXR1cm4gaTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gLTE7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ3JlYXRlQ29tcGlsYXRpb24sIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENyZWF0ZVJlcXVlc3RFbnRyeSwgSXRlbUlkLCBJdGVtTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSW50ZXJuYWxDcmVhdGVEZWx0YSB9IGZyb20gJy4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlcXVlc3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IHtcblxuXHRyZXF1ZXN0czogQXJyYXk8Q3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29tcGlsYXRpb246IENyZWF0ZUNvbXBpbGF0aW9uLFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0cHJpdmF0ZSBicmVha3VwQnlQYXJlbnQgPSBmYWxzZSxcblx0KSB7XG5cdH1cblxuXHRmaW5hbGl6ZVJlcXVlc3QgKHJlcXVlc3RSZXNvdXJjZTogQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4pIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHJlcXVlc3RSZXNvdXJjZS5jb2xsZWN0aW9ucy5nZXRDb2xsZWN0aW9uc1dpdGhGaXR0aW5nSXRlbXMoKTtcblx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSByZXF1ZXN0UmVzb3VyY2UuY29sdW1ucztcblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNvbGxlY3Rpb25FbnRyaWVzKSB7XG5cdFx0XHRjb2x1bW5FeHBhbnNpb24uZXhwYW5kKGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zKTtcblx0XHR9XG5cblx0XHRyZXF1ZXN0UmVzb3VyY2UucmVxdWVzdC5jb2x1bW5zID0gY29sdW1uRXhwYW5zaW9uLmdldCgpO1xuXG5cdFx0cmV0dXJuIHJlcXVlc3RSZXNvdXJjZTtcblx0fVxuXG5cdHNldFJlcXVlc3RQYXJlbnQgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RFbnRyeTogQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3QgPSByZXF1ZXN0RW50cnkucmVxdWVzdDtcblxuXHRcdGlmIChwYXJlbnRUeXBlID09PSAnVm9pZCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXF1ZXN0LnBhcmVudFR5cGUgPSBwYXJlbnRUeXBlO1xuXHRcdHJlcXVlc3QucGFyZW50SWQgPSB7fTtcblxuXHRcdHJldHVybiB0cnVlO1xuXHR9XG5cblx0cHVibGljIHJ1biAoKSB7XG5cdFx0Y29uc3QgY29tcGlsYXRpb24gPSB0aGlzLmNvbXBpbGF0aW9uO1xuXG5cdFx0aWYgKHRoaXMuYnJlYWt1cEJ5UGFyZW50KSB7XG5cdFx0XHRmb3IgKGNvbnN0IHBhcmVudFR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdFx0Y29uc3QgcGFyZW50TWFwID0gY29tcGlsYXRpb25bcGFyZW50VHlwZV07XG5cblx0XHRcdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBwYXJlbnRNYXApIHtcblx0XHRcdFx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChwYXJlbnRJZCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IHJlcXVlc3RSZXNvdXJjZSA9IHRoaXMuaW5pdGlhbGl6ZVJlcXVlc3QoKTtcblxuXHRcdFx0XHRcdHRoaXMuZXh0ZW5kUmVxdWVzdChcblx0XHRcdFx0XHRcdHBhcmVudE1hcFtwYXJlbnRJZF0sXG5cdFx0XHRcdFx0XHR0aGlzLnNldFJlcXVlc3RQYXJlbnQoXG5cdFx0XHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RSZXNvdXJjZSxcblx0XHRcdFx0XHRcdCkgPyArcGFyZW50SWQgOiBudWxsLFxuXHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHR0aGlzLnJlcXVlc3RzLnB1c2godGhpcy5maW5hbGl6ZVJlcXVlc3QocmVxdWVzdFJlc291cmNlKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Zm9yIChjb25zdCBwYXJlbnRUeXBlIGluIGNvbXBpbGF0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHBhcmVudE1hcCA9IGNvbXBpbGF0aW9uW3BhcmVudFR5cGVdO1xuXHRcdFx0XHRjb25zdCByZXF1ZXN0UmVzb3VyY2UgPSB0aGlzLmluaXRpYWxpemVSZXF1ZXN0KCk7XG5cdFx0XHRcdGNvbnN0IGhhc1BhcmVudCA9IHRoaXMuc2V0UmVxdWVzdFBhcmVudChcblx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdHJlcXVlc3RSZXNvdXJjZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRsZXQgdmFsaWRSZXF1ZXN0ID0gZmFsc2U7XG5cblx0XHRcdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBwYXJlbnRNYXApIHtcblx0XHRcdFx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChwYXJlbnRJZCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuZXh0ZW5kUmVxdWVzdChcblx0XHRcdFx0XHRcdHBhcmVudE1hcFtwYXJlbnRJZF0sXG5cdFx0XHRcdFx0XHRoYXNQYXJlbnQgPyArcGFyZW50SWQgOiBudWxsLFxuXHRcdFx0XHRcdFx0cmVxdWVzdFJlc291cmNlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHR2YWxpZFJlcXVlc3QgPSB0cnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHZhbGlkUmVxdWVzdCkge1xuXHRcdFx0XHRcdHRoaXMucmVxdWVzdHMucHVzaCh0aGlzLmZpbmFsaXplUmVxdWVzdChyZXF1ZXN0UmVzb3VyY2UpKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3RzO1xuXHR9XG5cblx0aW5pdGlhbGl6ZVJlcXVlc3QgKCk6IENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVxdWVzdDoge1xuXHRcdFx0XHRyZXF1ZXN0VHlwZTogJ2NyZWF0ZScsXG5cdFx0XHRcdGl0ZW1zOiB7fSxcblx0XHRcdFx0Y29sdW1uczoge30sXG5cdFx0XHR9LFxuXHRcdFx0Y29sdW1uczogdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKSxcblx0XHRcdGl0ZW1zOiB7fSxcblx0XHRcdGNvbGxlY3Rpb25zOiB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmdldENvbGxlY3Rpb25NYXRjaGVyKCksXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgZXh0ZW5kUmVxdWVzdCAoXG5cdFx0aXRlbVZhbHVlczogSXRlbU1hcDxJbnRlcm5hbENyZWF0ZURlbHRhPixcblx0XHRyZXF1ZXN0UGFyZW50SWQ6IEl0ZW1JZCB8IG51bGwsXG5cdFx0ZGVzdGluYXRpb246IENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0ID0gZGVzdGluYXRpb24ucmVxdWVzdDtcblx0XHRjb25zdCBpdGVtRW50cnlNYXAgPSBkZXN0aW5hdGlvbi5pdGVtcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaXRlbVZhbHVlcykge1xuXHRcdFx0aWYgKHJlcXVlc3QuaXRlbVR5cGUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXF1ZXN0Lml0ZW1UeXBlID0gaXRlbVR5cGUgYXMgSXRlbVR5cGVUeXBlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXRlbUVudHJ5TWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGl0ZW1FbnRyeU1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdFx0cmVxdWVzdC5pdGVtc1tpdGVtVHlwZV0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbVZhbHVlc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0Y29uc3QgaW50ZXJuYWxDcmVhdGVEZWx0YTogSW50ZXJuYWxDcmVhdGVEZWx0YSA9IGl0ZW1WYWx1ZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGludGVybmFsQ3JlYXRlRGVsdGEuZW50cnk7XG5cblx0XHRcdFx0Y29uc3QgY2hpbGRFbnRyaWVzID0gZ2V0UGF0aChcblx0XHRcdFx0XHR0aGlzLmNvbXBpbGF0aW9uLFxuXHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRjb25zdCBpdGVtUmVxdWVzdDogYW55ID0gcmVxdWVzdC5pdGVtc1tpdGVtVHlwZV1baXRlbUVudHJ5Lml0ZW1JZF0gPSB7fTtcblx0XHRcdFx0Y29uc3QgcGFyYW1ldGVycyA9IGdldFBhdGgoXG5cdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi50YWJSZXF1ZXN0UGFyYW1ldGVycyxcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpZiAocmVxdWVzdFBhcmVudElkICE9PSBudWxsKSB7XG5cdFx0XHRcdFx0KHJlcXVlc3QucGFyZW50SWQgYXMge1tpdGVtSWQ6IHN0cmluZ106IEl0ZW1JZH0pW2l0ZW1FbnRyeS5pdGVtSWRdID0gcmVxdWVzdFBhcmVudElkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZGVzdGluYXRpb24uY29sdW1ucy5leHBhbmQoaXRlbUVudHJ5LmNvbHVtbnMpO1xuXG5cdFx0XHRcdC8vIHRvZG9bY2FjaGVdIG5lZWQgdGhpcyA/XG5cdFx0XHRcdC8vIGRlc3RpbmF0aW9uLmNvbGxlY3Rpb25zLmV4cGFuZChpdGVtRW50cnkpO1xuXG5cdFx0XHRcdGl0ZW1FbnRyeU1hcFtpdGVtVHlwZV1baXRlbUlkXSA9IGl0ZW1FbnRyeTtcblxuXHRcdFx0XHRpdGVtUmVxdWVzdC52YWx1ZXMgPSB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXF1ZXN0TG9jYWwoXG5cdFx0XHRcdFx0aW50ZXJuYWxDcmVhdGVEZWx0YS5maWVsZHMsXG5cdFx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRpdGVtUmVxdWVzdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcblxuXHRcdFx0XHRpZiAoY2hpbGRFbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGxpbmtzOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXX0gPSBpdGVtUmVxdWVzdC5saW5rcyA9IHt9O1xuXG5cdFx0XHRcdGZvciAoY29uc3QgY2hpbGRUeXBlIGluIGNoaWxkRW50cmllcykge1xuXHRcdFx0XHRcdGxpbmtzW2NoaWxkVHlwZV0gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGRJZCBpbiBjaGlsZEVudHJpZXNbY2hpbGRUeXBlXSkge1xuXHRcdFx0XHRcdFx0bGlua3NbY2hpbGRUeXBlXS5wdXNoKHBhcnNlSW50KFxuXHRcdFx0XHRcdFx0XHRjaGlsZElkLFxuXHRcdFx0XHRcdFx0XHQxMCxcblx0XHRcdFx0XHRcdCkpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuZXh0ZW5kUmVxdWVzdChcblx0XHRcdFx0XHRjaGlsZEVudHJpZXMsXG5cdFx0XHRcdFx0bnVsbCxcblx0XHRcdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVF1ZXJ5LCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IGdldEZpcnN0UHJvcGVydHkgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgZW51bSBPUEVSQVRPUlMge1xuXHRPUiA9ICdPUicsXG5cdEFORCA9ICdBTkQnXG59XG5cbmV4cG9ydCB0eXBlIE9QRVJBVE9SU19UWVBFID0gJ09SJyB8ICdBTkQnIHwgJ29yJyB8ICdhbmQnIHwgT1BFUkFUT1JTO1xuXG5leHBvcnQgZW51bSBDT01QQVJBVE9SUyB7XG5cdEVRVUFMUyA9ICc9Jyxcblx0Tk9UX0VRVUFMUyA9ICchPScsXG5cdExFU1NfVEhBTiA9ICc8Jyxcblx0TU9SRV9USEFOID0gJz4nLFxuXHRMRVNTX09SX0VRVUFMX1RIQU4gPSAnPD0nLFxuXHRFUVVBTF9PUl9NT1JFX1RIQU4gPSAnPj0nLFxuXHRJTiA9ICdJTidcbn1cblxuZXhwb3J0IHR5cGUgQ09NUEFSQVRPUlNfVFlQRSA9ICc9JyB8ICchPScgfCAnPCcgfCAnPicgfCAnPD0nIHwgJz49JyB8ICdJTicgfCBDT01QQVJBVE9SUztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFF1ZXJ5UGFyc2VyQmFzZTxSZXR1cm5UeXBlIGV4dGVuZHMgYW55PiB7XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgcXVlcnk6IEFwaVF1ZXJ5LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBwYXJzZSAocXVlcnk6IEFwaVF1ZXJ5ID0gdGhpcy5xdWVyeSk6IFJldHVyblR5cGUge1xuXHRcdGlmIChxdWVyeS5saW5rZWRUbyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUxpbmtlZFRvUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LmxpbmtlZFRvLFxuXHRcdFx0XHRxdWVyeS5xdWVyeSxcblx0XHRcdFx0cXVlcnkucmV2ZXJzZSxcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuY3VzdG9tICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlQ3VzdG9tUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LmN1c3RvbSxcblx0XHRcdFx0cXVlcnkucGFyYW1ldGVycyxcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuc2VhcmNoICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU2VhcmNoUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LnNlYXJjaCxcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuY29uZGl0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUNvbXBsZXhRdWVyeShcblx0XHRcdFx0cXVlcnkuY29uZGl0aW9ucyxcblx0XHRcdFx0cXVlcnkub3BlcmF0b3IsXG5cdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5Lml0ZW1UeXBlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlU3ViRmllbGRRdWVyeShcblx0XHRcdFx0cXVlcnkua2V5LFxuXHRcdFx0XHRxdWVyeS5pdGVtVHlwZSxcblx0XHRcdFx0cXVlcnkuZmllbGQsXG5cdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5rZXkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKHR5cGVvZiBxdWVyeS5xdWVyeSA9PT0gJ29iamVjdCcpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucGFyc2VTdWJRdWVyeShcblx0XHRcdFx0XHRxdWVyeS5rZXksXG5cdFx0XHRcdFx0cXVlcnkucXVlcnksXG5cdFx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZVNpbXBsZVF1ZXJ5KFxuXHRcdFx0XHRxdWVyeS5rZXksXG5cdFx0XHRcdHF1ZXJ5LnZhbHVlLFxuXHRcdFx0XHRxdWVyeS5jb21wYXJhdG9yLFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGtleSA9IGdldEZpcnN0UHJvcGVydHkocXVlcnkpO1xuXG5cdFx0aWYgKGtleSA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VFbXB0eVF1ZXJ5KCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmFsdWUgPSBxdWVyeVtrZXldO1xuXG5cdFx0Ly8gdHlwZW9mIG51bGwgaXMgYW4gb2JqZWN0IDp0aGlua2luZzpcblx0XHRpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZS5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0KSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZVN1YlF1ZXJ5KFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyc2VTaW1wbGVRdWVyeShcblx0XHRcdGtleSxcblx0XHRcdHZhbHVlLFxuXHRcdFx0cXVlcnkuY29tcGFyYXRvcixcblx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlRW1wdHlRdWVyeSAoKTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VTdWJRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0c3ViUXVlcnk6IG9iamVjdCxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlU3ViRmllbGRRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGZpZWxkOiBzdHJpbmcsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VTZWFyY2hRdWVyeSAoXG5cdFx0dmFsdWU6IGFueSxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlQ3VzdG9tUXVlcnkgKFxuXHRcdGN1c3RvbTogc3RyaW5nLFxuXHRcdHBhcmFtZXRlcnM6IGFueSxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlU2ltcGxlUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0Y29tcGFyYXRvcjogQ09NUEFSQVRPUlNfVFlQRSxcblx0XHRub3Q/OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUxpbmtlZFRvUXVlcnkgKFxuXHRcdGxpbmtlZFRvOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdHJldmVyc2U6IGJvb2xlYW4sXG5cdFx0bm90OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUNvbXBsZXhRdWVyeSAoXG5cdFx0Y29uZGl0aW9uczogYW55W10sXG5cdFx0b3BlcmF0b3I6IE9QRVJBVE9SU19UWVBFLFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcbn1cbiIsImltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1uLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgQ09NUEFSQVRPUlNfVFlQRSB9IGZyb20gJy4vUXVlcnlQYXJzZXInO1xuaW1wb3J0IHsgT1BFUkFUT1JTX1RZUEUsIFF1ZXJ5UGFyc2VyQmFzZSB9IGZyb20gJy4vUXVlcnlQYXJzZXJCYXNlJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5Q29sdW1uRXh0cmFjdG9yXG5cdGV4dGVuZHMgUXVlcnlQYXJzZXJCYXNlPEFwaVJlcXVlc3RDb2x1bW5bXT4ge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHQpIHtcblx0XHRzdXBlcihxdWVyeSk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VFbXB0eVF1ZXJ5ICgpIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0c3ViUXVlcnk6IG9iamVjdCxcblx0XHRfbm90OiBib29sZWFuID0gZmFsc2UsXG5cdCkge1xuXHRcdHJldHVybiBbe1trZXldOiB0aGlzLnBhcnNlKHN1YlF1ZXJ5KX1dO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU3ViRmllbGRRdWVyeSAoXG5cdFx0X2tleTogc3RyaW5nLFxuXHRcdF9pdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0X2ZpZWxkOiBzdHJpbmcsXG5cdFx0X3F1ZXJ5OiBBcGlRdWVyeSxcblx0XHRfbm90OiBib29sZWFuLFxuXHQpIHtcblx0XHRyZXR1cm4gW107XG5cdFx0Ly8gdG9kb1tjYWNoZV0gV2Ugc2hvdWxkIGV4cGFuZCB0aGUgcmVxdWVzdENvbHVtbnMgd2l0aCB7W2l0ZW1UeXBlXTogdGhpcy5wYXJzZShxdWVyeSl9IGJ1dCBjdXJyZW50bHkgY29sbGVjdGlvbnMgb25seSBhbGxvdyBmZXRjaGluZyBkaXJlY3QgY29sdW1uc1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2VhcmNoUXVlcnkgKFxuXHRcdF92YWx1ZTogYW55LFxuXHRcdF9ub3Q6IGJvb2xlYW4sXG5cdCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUN1c3RvbVF1ZXJ5IChcblx0XHRfY3VzdG9tOiBzdHJpbmcsXG5cdFx0X3BhcmFtZXRlcnM6IGFueSxcblx0XHRfbm90OiBib29sZWFuID0gZmFsc2UsXG5cdCkge1xuXHRcdHJldHVybiBbXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVNpbXBsZVF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRfdmFsdWU6IGFueSxcblx0XHRfY29tcGFyYXRvcj86IENPTVBBUkFUT1JTX1RZUEUsXG5cdFx0X25vdD86IGJvb2xlYW4sXG5cdCkge1xuXHRcdHJldHVybiBba2V5XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUxpbmtlZFRvUXVlcnkgKFxuXHRcdGxpbmtlZFRvOiBhbnksXG5cdFx0X3F1ZXJ5OiBBcGlRdWVyeSA9IHt9IGFzIEFwaVF1ZXJ5LFxuXHRcdF9yZXZlcnNlOiBib29sZWFuID0gZmFsc2UsXG5cdFx0X25vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayhcblx0XHRcdGxpbmtlZFRvLFxuXHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlQ29tcGxleFF1ZXJ5IChcblx0XHRjb25kaXRpb25zOiBhbnlbXSxcblx0XHRfb3BlcmF0b3I/OiBPUEVSQVRPUlNfVFlQRSxcblx0XHRfbm90PzogYm9vbGVhbixcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMucGFyc2VDb25kaXRpb25zKGNvbmRpdGlvbnMpO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZUNvbmRpdGlvbnMgKGNvbmRpdGlvbnM6IGFueVtdKSB7XG5cdFx0cmV0dXJuIGNvbmRpdGlvbnMucmVkdWNlKFxuXHRcdFx0KFxuXHRcdFx0XHRhY2N1bXVsYXRvcixcblx0XHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0KSA9PiBhY2N1bXVsYXRvci5jb25jYXQoXG5cdFx0XHRcdHRoaXMucGFyc2UoY29uZGl0aW9uKSxcblx0XHRcdCksXG5cdFx0XHRbXSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksIFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucywgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVF1ZXJ5LFxuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFF1ZXJ5Q2FsbGJhY2ssXG59IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25DYWNoZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlciB9IGZyb20gJy4uL0NvbGxlY3Rpb25NYXRjaGVyJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IFF1ZXJ5Q29sdW1uRXh0cmFjdG9yIH0gZnJvbSAnLi4vUXVlcnlDb2x1bW5FeHRyYWN0b3InO1xuaW1wb3J0IHsgaW5BcnJheSB9IGZyb20gJy4uL1V0aWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0aW9uSGFuZGxlckJhc2Uge1xuXG5cdHB1YmxpYyBlbnRyaWVzOiBDb2xsZWN0aW9uQ2FjaGU7XG5cblx0cHVibGljIGNvbGxlY3Rpb25DaGFuZ2VzOiB7XG5cdFx0W2NvbGxlY3Rpb25FbnRyeUlkOiBudW1iZXJdOiBJdGVtRW50cnlbXVxuXHR9ID0ge307XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcm90ZWN0ZWQgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcm90ZWN0ZWQgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk6IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0XHR0aGlzLmVudHJpZXMgPSBjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gYW5kIHN0b3JlcyBpdCBpbiB0aGlzIHRyYW5zYWN0aW9uJ3Mge0BsaW5rIENvbGxlY3Rpb25DYWNoZSBDb2xsZWN0aW9uQ2FjaGV9XG5cdCAqL1xuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy50cmFuc2FjdGlvbi5jb3JlLmNvbGxlY3Rpb25FbnRyeUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cblx0XHR0aGlzLmVudHJpZXMuYWRkKGNvbGxlY3Rpb25FbnRyeSk7XG5cblx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDcmVhdGVzIGEge0BsaW5rIENvbGxlY3Rpb25NYXRjaGVyIENvbGxlY3Rpb25NYXRjaGVyfSB3aXRoIHRoZSB0cmFuc2FjdGlvbidzIGNvbGxlY3Rpb25zXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0Q29sbGVjdGlvbk1hdGNoZXIgKCk6IENvbGxlY3Rpb25NYXRjaGVyO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fSB3aXRoIHRoZSBnaXZlbiBvcHRpb25zXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBjb2xsZWN0aW9ucyBsaW5rZWQgdG8gdGhlIHBhc3NlZCBwYXJlbnRzXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdIHwgKCgpID0+IEl0ZW1JZFtdKSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBFeHBhbmRzIHRoZSBpdGVtcyBpbiB0aGUgY29sbGVjdGlvbnMgd2l0aCB0aGUgcGFzc2VkIGNvbHVtbnNcblx0ICovXG5cdHB1YmxpYyBhYnN0cmFjdCBleHBhbmRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRcdG5ld0NvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBFeHRlbmRzIHRoZSBjb2xsZWN0aW9ucycge0BsaW5rIENvbGxlY3Rpb25FbnRyeS5xdWVyeVBhcmFtcyBxdWVyeVBhcmFtc30gYW5kIHtAbGluayBDb2xsZWN0aW9uRW50cnkucXVlcnkgcXVlcmllc30gYW5kIGZldGNoZXMgdGhlIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHdpdGggdGhlIG5ldyBxdWVyaWVzXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZXh0ZW5kQ29sbGVjdGlvbkVudHJpZXM8VCBleHRlbmRzIENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cXVlcnlDYWxsYmFjazogUXVlcnlDYWxsYmFjayxcblx0XHRjb2xsZWN0aW9uczogVCxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFkZHMgdGhlIHBhc3NlZCB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSB0byB0aGUgY29sbGVjdGlvbidzIGNoYW5nZXMgb24gdGhlIHRyYW5zYWN0aW9uLFxuXHQgKiB3aWxsIHNraXAgdGhlIEl0ZW1FbnRyeSBpZiB0aGUgYHNraXBFbnRyeUZpbHRlckZuYCBjYWxsYmFjayByZXR1cm5zIGB0cnVlYFxuXHQgKi9cblx0cHVibGljIGFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHRcdHNraXBFbnRyeUZpbHRlckZuOiAodGVtRW50cnk6IEl0ZW1FbnRyeSkgPT4gYm9vbGVhbixcblx0KTogdm9pZCB7XG5cdFx0aWYgKGl0ZW1FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHRpZiAoY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWRkZWRJdGVtRW50cmllczogSXRlbUVudHJ5W10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNoYW5nZXMuaW5kZXhPZihpdGVtRW50cnkpICE9PSAtMVxuXHRcdFx0XHR8fCBza2lwRW50cnlGaWx0ZXJGbihpdGVtRW50cnkpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNoYW5nZXMucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0YWRkZWRJdGVtRW50cmllcy5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaGFuZGxlQWRkZWRJdGVtRW50cmllc0NhbGxiYWNrKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0YWRkZWRJdGVtRW50cmllcyxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IGhhbmRsZUFkZGVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGFkZGVkRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZDtcblxuXHRwdWJsaWMgcmVtb3ZlSXRlbUVudHJpZXNGcm9tQ29sbGVjdGlvbkNoYW5nZXMgKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5LFxuXHRcdGlkQXJyYXk6IEl0ZW1JZFtdLFxuXHQpIHtcblx0XHRpZiAoaWRBcnJheS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0aWYgKGNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlbW92ZWRJdGVtRW50cmllcyA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5maWx0ZXJBcnJheShcblx0XHRcdGNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkgPT4gIWluQXJyYXkoXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdGlkQXJyYXksXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5oYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjayhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdHJlbW92ZWRJdGVtRW50cmllcyxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IGhhbmRsZVJlbW92ZWRJdGVtRW50cmllc0NhbGxiYWNrPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0cmVtb3ZlZEl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXhwYW5kcyB0aGUgb3B0aW9uJ3Mge0BsaW5rIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMuY29sdW1ucyBjb2x1bW5zfSB3aXRoIHRoZSBjb2x1bW5zIHJlcXVpcmVkIGZvciB0aGUge0BsaW5rIENvbGxlY3Rpb25NYXRjaGVyIENvbGxlY3Rpb25NYXRjaGVyfSB0byBmdW5jdGlvbi5cblx0ICogRGF0YSBmZXRjaGVkIGZvciBhIHBhcmVudCB0cmFuc2FjdGlvbiBtaWdodCBhbHNvIGZpdCBpbiBhIGNoaWxkIHRyYW5zYWN0aW9uLCBzbyB0aG9zZSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucy5xdWVyeUNvbHVtbnMgcXVlcnlDb2x1bW5zfSBzaG91bGQgYWxzbyBiZSB0YWtlbiBpbnRvIGFjY291bnRcblx0ICovXG5cdHByb3RlY3RlZCBleHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5ID0gb3B0aW9ucy5xdWVyeSxcblx0KTogdm9pZCB7XG5cdFx0Ly8gYWxyZWFkeSBoYXZlIGFsbCBjb2x1bW5zLCBzbyBjYW4ndCBleHBhbmQgdGhlbVxuXHRcdGlmIChvcHRpb25zLmNvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBjb2x1bW5FeHRyYWN0b3IgPSBuZXcgUXVlcnlDb2x1bW5FeHRyYWN0b3IoXG5cdFx0XHR0aGlzLmNvbHVtblV0aWwsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHF1ZXJ5LFxuXHRcdCk7XG5cblx0XHRvcHRpb25zLnF1ZXJ5Q29sdW1ucyA9IGNvbHVtbkV4dHJhY3Rvci5wYXJzZSgpO1xuXG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucy5xdWVyeUNvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGFkZENvbGxlY3Rpb25RdWVyeUNvbHVtbnMgPSAodHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUpID0+IHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzID0gdHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGl0ZW1UeXBlKTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMucXVlcnlDb2x1bW5zLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRjb25zdCBhZGRUcmFuc2FjdGlvbkNoaWxkcmVuQ29sbGVjdGlvblF1ZXJ5Q29sdW1ucyA9IChjaGlsZHJlbjogQWJzdHJhY3RDYWNoZVtdKSA9PiB7XG5cdFx0XHRmb3IgKGNvbnN0IHRyYW5zYWN0aW9uIG9mIGNoaWxkcmVuKSB7XG5cdFx0XHRcdGFkZENvbGxlY3Rpb25RdWVyeUNvbHVtbnModHJhbnNhY3Rpb24pO1xuXHRcdFx0XHRhZGRUcmFuc2FjdGlvbkNoaWxkcmVuQ29sbGVjdGlvblF1ZXJ5Q29sdW1ucyh0cmFuc2FjdGlvbi5jaGlsZHJlbik7XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGFkZENvbGxlY3Rpb25RdWVyeUNvbHVtbnModGhpcy50cmFuc2FjdGlvbik7XG5cdFx0YWRkVHJhbnNhY3Rpb25DaGlsZHJlbkNvbGxlY3Rpb25RdWVyeUNvbHVtbnModGhpcy50cmFuc2FjdGlvbi5jaGlsZHJlbik7XG5cblx0XHRvcHRpb25zLmNvbHVtbnMgPSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmdldCgpW2l0ZW1UeXBlXTtcblx0fVxufVxuIiwiaW1wb3J0IHtcblx0Q29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0Q29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxufSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRDb2xsZWN0aW9uTWF0Y2hlcixcblx0Q29sbGVjdGlvblF1ZXJ5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZSxcblx0Q29sdW1uVXRpbCxcblx0aXNGdW5jdGlvbixcblx0UHJvbWlzZUludGVyZmFjZSxcbn0gZnJvbSAnLi4vLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbixcblx0Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXAsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1UeXBlLFxuXHRRdWVyeUNhbGxiYWNrLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLCBRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4uLy4uL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcblxuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4uLy4uL1V0aWwnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkhhbmRsZXJCYXNlIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkhhbmRsZXJCYXNlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9TZXJ2ZXJDYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJJdGVtSGFuZGxlciB9IGZyb20gJy4vU2VydmVySXRlbUhhbmRsZXInO1xuXG5leHBvcnQgY2xhc3MgU2VydmVyQ29sbGVjdGlvbkhhbmRsZXJcblx0ZXh0ZW5kcyBDb2xsZWN0aW9uSGFuZGxlckJhc2Uge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlck1hbmFnZXI6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeTogQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5OiBDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIGl0ZW1IYW5kbGVyOiBTZXJ2ZXJJdGVtSGFuZGxlcixcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuXHRcdGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBTZXJ2ZXJDYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbk1hdGNoZXIgKCk6IENvbGxlY3Rpb25NYXRjaGVyIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkob3B0aW9ucyk7XG5cblx0XHR0aGlzLmV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0cGFyc2VkUXVlcnkub2JqZWN0LFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZSA9IHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdDxJdGVtVHlwZVR5cGU+KG9wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRyZXR1cm4gdGhpcy5mZXRjaENvbGxlY3Rpb25EYXRhKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRwYXJzZWRRdWVyeSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSB8ICgoKSA9PiBJdGVtSWRbXSksXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBwcm9taXNlczoge1twYXJlbnRJZDogc3RyaW5nXTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk+fSA9IHt9O1xuXG5cdFx0aWYgKGlzRnVuY3Rpb248KCkgPT4gSXRlbUlkW10+KHBhcmVudElkQXJyYXkpKSB7XG5cdFx0XHRwYXJlbnRJZEFycmF5ID0gcGFyZW50SWRBcnJheSgpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgcGFyZW50SWQgb2YgcGFyZW50SWRBcnJheSkge1xuXHRcdFx0Y29uc3QgbmV3T3B0aW9ucyA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jbG9uZU9wdGlvbnMoXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpdGVtVHlwZTogcGFyZW50VHlwZSxcblx0XHRcdFx0XHRpdGVtSWQ6IHBhcmVudElkLFxuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHRcdGNvbnN0IHBhcnNlZFF1ZXJ5ID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KG5ld09wdGlvbnMpO1xuXG5cdFx0XHR0aGlzLmV4cGFuZENvbHVtbnNXaXRoUXVlcnlDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bmV3T3B0aW9ucyxcblx0XHRcdFx0cGFyc2VkUXVlcnkub2JqZWN0LFxuXHRcdFx0KTtcblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gc2hvdWxkIHRoaXMgYmUgaW4gYSBsb29wPyBleHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyBjYW4gY2hhbmdlIHRoZSBjb2x1bW5zXG5cdFx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZSA9IHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChuZXdPcHRpb25zLmNvbHVtbnMpO1xuXG5cdFx0XHRwcm9taXNlc1twYXJlbnRJZF0gPSB0aGlzLmZldGNoQ29sbGVjdGlvbkRhdGEoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0bmV3T3B0aW9ucyxcblx0XHRcdFx0cGFyc2VkUXVlcnksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChwcm9taXNlcyk7XG5cdH1cblxuXHRwdWJsaWMgZXh0ZW5kQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0cXVlcnlDYWxsYmFjazogUXVlcnlDYWxsYmFjayxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlUeXBlPiB7XG5cdFx0Y29uc3QgZXh0ZW5kZWRRdWVyeSA9IGNvbGxlY3Rpb25FbnRyeS5leHRlbmRRdWVyeShxdWVyeUNhbGxiYWNrKS5vYmplY3Q7XG5cdFx0Y29uc3QgZnVsbFF1ZXJ5ID0gdGhpcy5xdWVyeVNlcnZpY2UuYWRkQW5kQ29uZGl0aW9uKFxuXHRcdFx0ZXh0ZW5kZWRRdWVyeSxcblx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmNyZWF0ZU5vdEluKFxuXHRcdFx0XHR0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF0ubWFwKFxuXHRcdFx0XHRcdGl0ZW1FbnRyeSA9PiBpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHQpLFxuXHRcdFx0KSxcblx0XHQpO1xuXG5cdFx0dGhpcy5leHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLFxuXHRcdFx0ZXh0ZW5kZWRRdWVyeSxcblx0XHQpO1xuXG5cdFx0bGV0IHByb21pc2U7XG5cblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMubGltaXQgIT09IG51bGwpIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLnJlcXVlc3RTa2VsZXRvbihcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHJlcXVlc3RUeXBlOiAncXVlcnknLFxuXHRcdFx0XHRcdGl0ZW1UeXBlOiBjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sdW1uczoge1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdOiBjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5jb2x1bW5zfSxcblx0XHRcdFx0XHRxdWVyeTogZXh0ZW5kZWRRdWVyeSxcblx0XHRcdFx0XHRsaW1pdDogY29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMubGltaXQsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9taXNlID0gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlci5mZXRjaEJ5UXVlcnkoXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0ZnVsbFF1ZXJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5jb2x1bW5zLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb2xsZWN0aW9uRW50cnkucHJvbWlzZSA9IHByb21pc2U7XG5cblx0XHRwcm9taXNlLnRoZW4oXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdGRlbGV0ZSBjb2xsZWN0aW9uRW50cnkucHJvbWlzZTtcblx0XHRcdH0sXG5cdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0KTtcblxuXHRcdHJldHVybiBwcm9taXNlLnRoZW4oXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kQ29sbGVjdGlvbkVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbGxlY3Rpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0XHRuZXdSZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPiB7XG5cdFx0aWYgKG5ld1JlcXVlc3RDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjb2xsZWN0aW9ucyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyZW50SWRBcnJheTogSXRlbUlkW10gPSBbXTtcblxuXHRcdC8vIFRPRE86IGZpbHRlciBsb2NhbCBpdGVtcz9cblxuXHRcdGZvciAoY29uc3QgcGFyZW50SWQgaW4gY29sbGVjdGlvbnMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGNvbGxlY3Rpb25zW3BhcmVudElkXS5lbnRyeTtcblxuXHRcdFx0cGFyZW50SWRBcnJheS5wdXNoKGNvbGxlY3Rpb25FbnRyeS5wYXJlbnQhLml0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaExpbmtlZEl0ZW1FbnRyaWVzRGF0YShcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0cGFyZW50SWRBcnJheSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG51bGwsXG5cdFx0XHRcdG5ld1JlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRuZXdSZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0XHRcdHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IHBhcmVudElkIG9mIHBhcmVudElkQXJyYXkpIHtcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25zW3BhcmVudElkXS5lbnRyeS5leHBhbmRDb2x1bW5zKGNvbHVtbkV4cGFuc2lvbik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25zO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRDb2xsZWN0aW9uRW50cmllczxUIGV4dGVuZHMgQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHRcdGNvbGxlY3Rpb25zOiBULFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMoY29sbGVjdGlvbnMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyZW50SWRBcnJheTogSXRlbUlkW10gPSBbXTtcblx0XHRsZXQgaXRlbUlkQXJyYXk6IEl0ZW1JZFtdID0gW107XG5cblx0XHRvcHRpb25zLnF1ZXJ5UGFyYW1zID0gcXVlcnlDYWxsYmFjayhvcHRpb25zLnF1ZXJ5UGFyYW1zKTtcblxuXHRcdGZvciAoY29uc3QgcGFyZW50SWQgaW4gY29sbGVjdGlvbnMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGNvbGxlY3Rpb25zW3BhcmVudElkXS5lbnRyeTtcblxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LmV4dGVuZFF1ZXJ5KHF1ZXJ5Q2FsbGJhY2spO1xuXHRcdFx0cGFyZW50SWRBcnJheS5wdXNoKGNvbGxlY3Rpb25FbnRyeS5wYXJlbnQhLml0ZW1JZCk7XG5cdFx0XHRpdGVtSWRBcnJheSA9IGl0ZW1JZEFycmF5LmNvbmNhdChcblx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdXG5cdFx0XHRcdFx0Lm1hcChcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeSA9PiBpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyXG5cdFx0XHQuZmV0Y2hMaW5rZWRJdGVtRW50cmllc0RhdGEoXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdHBhcmVudElkQXJyYXksXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR0aGlzLnF1ZXJ5U2VydmljZS5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KG9wdGlvbnMpLm9iamVjdCxcblx0XHRcdFx0XHR0aGlzLnF1ZXJ5U2VydmljZS5jcmVhdGVOb3RJbihpdGVtSWRBcnJheSksXG5cdFx0XHRcdCksXG5cdFx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgYWRkSXRlbUVudHJpZXNUb0NvbGxlY3Rpb25DaGFuZ2VzPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdHN1cGVyLmFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Ly8gTG9jYWwgSXRlbUVudHJpZXMgZG9uJ3QgYmVsb25nIGluIHJlbW90ZSBjb2xsZWN0aW9uIGNoYW5nZXNcblx0XHRcdGl0ZW1FbnRyeSA9PiBpdGVtRW50cnkuaXNMb2NhbCgpLFxuXHRcdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgaGFuZGxlQWRkZWRJdGVtRW50cmllc0NhbGxiYWNrPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRfY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGFkZGVkRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0aWYgKGFkZGVkRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBPbmx5IHVzZWQgaW4gdGhlIGZyb250ZW5kIHBsYW5uZXJcblx0XHQvLyBjb2xsZWN0aW9uRW50cnkub25BZGRJbml0aWFsKGFkZGVkRW50cmllcyk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgaGFuZGxlUmVtb3ZlZEl0ZW1FbnRyaWVzQ2FsbGJhY2s8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdF9jb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0cmVtb3ZlZEl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRpZiAocmVtb3ZlZEl0ZW1FbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIHRvZG9bY2FjaGVdIE9ubHkgdXNlZCBpbiB0aGUgZnJvbnRlbmQgcGxhbm5lclxuXHRcdC8vIGNvbGxlY3Rpb25FbnRyeS5vblJlbW92ZUluaXRpYWwocmVtb3ZlZEl0ZW1FbnRyaWVzKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXhwYW5kcyB0aGUgY29sdW1ucyBvZiB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb25cblx0ICovXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRuZXdDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlUeXBlPiB7XG5cdFx0Y29uc3Qge21lcmdlZCwgZGlmZmVyZW5jZX0gPSBjb2xsZWN0aW9uRW50cnkuY29sdW1ucy5tZXJnZVJlcXVlc3RDb2x1bW5zKG5ld0NvbHVtbnMpO1xuXG5cdFx0aWYgKGRpZmZlcmVuY2UgIT09IHRydWUgJiYgZGlmZmVyZW5jZS5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbkVudHJ5KTtcblx0XHR9XG5cblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGxldCBwcm9taXNlO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmxpbWl0ICE9PSBudWxsKSB7XG5cdFx0XHRwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZS5yZXF1ZXN0U2tlbGV0b24oXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRyZXF1ZXN0VHlwZTogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRpdGVtVHlwZTogaXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29sdW1uczogbWVyZ2VkLFxuXHRcdFx0XHRcdHF1ZXJ5OiBjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0LFxuXHRcdFx0XHRcdGxpbWl0OiBjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCwgLy8gdG9kb1tjYWNoZV0gYWN0dWFsbHkgaW1wbGVtZW50IGxpbWl0ID8gQ3VycmVudGx5IGRvZW5zJ3QgcmVhbGx5IHdvcmtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlRdWVyeShcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCxcblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkuc3RyaW5nLFxuXHRcdFx0XHRdLFxuXHRcdFx0XHRtZXJnZWQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9taXNlXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG1lcmdlZCxcblx0XHRcdFx0XHRcdHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuZXhwYW5kQ29sdW1ucyhjb2x1bW5FeHBhbnNpb24pO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGNvbHVtbkV4cGFuc2lvbjtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgZGF0YSBmb3IgdGhlIHBhc3NlZCBJdGVtVHlwZS9vcHRpb25zLCB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlIHJlcXVlc3RlZCBDb2xsZWN0aW9uRW50cnkvY29sdW1ucyBhcmUgYWxyZWFkeSBjYWNoZWQuXG5cdCAqIFdpbGwgY3JlYXRlIGEgbmV3IHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fSBpZiB0aGUgQ29sbGVjdGlvbkVudHJ5IGRpZG4ndCBleGlzdCB5ZXRcblx0ICovXG5cdHByaXZhdGUgZmV0Y2hDb2xsZWN0aW9uRGF0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sdW1uU3Vic2V0Q2FjaGU6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0XHRjb2xsZWN0aW9uUXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGxldCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0QnlRdWVyeShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Y29sbGVjdGlvblF1ZXJ5LFxuXHRcdCk7XG5cblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ICE9PSBudWxsICYmIGNvbHVtblN1YnNldENhY2hlLnJ1bihjb2xsZWN0aW9uRW50cnkuY29sdW1ucykpIHtcblx0XHRcdC8vIFRoZXJlIGFscmVhZHkgaXMgYW4gZW50cnkgYW5kIGl0IGNvbnRhaW5zIHRoZSBjb2x1bW5zIHdlIG5lZWQsIHNvIHdlIGNhbiBzYWZlbHkgcmV0dXJuIGl0XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0fVxuXG5cdFx0bGV0IHByb21pc2U7XG5cblx0XHRpZiAob3B0aW9ucy5saW1pdCAhPT0gbnVsbCkge1xuXHRcdFx0cHJvbWlzZSA9IHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdFx0LnJlcXVlc3RTa2VsZXRvbihcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0VHlwZTogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlOiBpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGNvbHVtbnM6IHtbaXRlbVR5cGVdOiBvcHRpb25zLmNvbHVtbnN9LFxuXHRcdFx0XHRcdFx0cXVlcnk6IG9wdGlvbnMucXVlcnksXG5cdFx0XHRcdFx0XHRsaW1pdDogb3B0aW9ucy5saW1pdCxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHQpXG5cdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24ucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlO1xuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9taXNlID0gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlclxuXHRcdFx0XHQuZmV0Y2hCeVF1ZXJ5KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFtcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25RdWVyeS5vYmplY3QsXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uUXVlcnkuc3RyaW5nLFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUucmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByb21pc2Vcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Ly8gV2Ugc2hvdWxkIHJlLWNoZWNrIGlmIGFuIGVudHJ5IGlzIG5vdCBjcmVhdGVkIGluIHRoZSBtZWFudGltZVxuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuZW50cmllcy5nZXRCeVF1ZXJ5KFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uUXVlcnksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkgPT09IG51bGwpIHtcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuY3JlYXRlQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zID0gdGhpcy50cmFuc2FjdGlvbi5jb3JlLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0RnJvbVJlc3BvbnNlKFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hDb2x1bW5zT2JqZWN0KCksXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUucmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpLFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LmV4cGFuZENvbHVtbnMoY29sdW1uRXhwYW5zaW9uKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LCBJdGVtQ2FjaGVGYWN0b3J5LCBJdGVtRW50cnlGYWN0b3J5LCBRdWVyeVBhcnNlckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1ucywgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEsIENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVzcG9uc2VQcm9jZXNzb3IsXG5cdENvbHVtbkV4cGFuc2lvbixcblx0Q29sdW1uU2V0LFxuXHRDb2x1bW5TdWJzZXRDYWNoZSxcblx0Q29sdW1uVXRpbCxcblx0UXVlcnlTZXJ2aWNlLFxuXHRSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0UmVxdWVzdEJ1ZmZlclJlc3BvbnNlLFxufSBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBJdGVtSGFuZGxlckJhc2UgfSBmcm9tICcuLi9JdGVtSGFuZGxlckJhc2UnO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuL1NlcnZlckNhY2hlJztcblxuZXhwb3J0IHR5cGUgU2VydmVySXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+O1xuXG5leHBvcnQgY2xhc3MgU2VydmVySXRlbUhhbmRsZXJcblx0ZXh0ZW5kcyBJdGVtSGFuZGxlckJhc2Uge1xuXG5cdHB1YmxpYyBpdGVtQ2hhbmdlczoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogU2VydmVySXRlbUVudHJ5Q2hhbmdlc1xuXHR9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlck1hbmFnZXI6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHByaXZhdGUgcXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0aXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IFNlcnZlckNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRpdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVJdGVtRW50cnkgKFxuXHRcdGNyZWF0ZVR1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEsXG5cdCk6IEl0ZW1FbnRyeSB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gc3VwZXIuY3JlYXRlSXRlbUVudHJ5KGNyZWF0ZVR1cGxlKTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IGNyZWF0ZVR1cGxlLmZpZWxkcztcblxuXHRcdHJldHVybiBpdGVtRW50cnk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFByb2Nlc3NlcyB1cGRhdGVzIG9uIGEgY2FjaGVkIGVudHJ5XG5cdCAqL1xuXHRwdWJsaWMgcHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRpdGVtRW50cnlDaGFuZ2VzVHVwbGU6IENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YTxJdGVtVHlwZVR5cGU+LFxuXHRcdF9mb3JjZU92ZXJ3cml0ZT86IGJvb2xlYW4sXG5cdFx0X3VwZGF0ZUluaXRpYWw/OiBib29sZWFuLFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtRW50cnlDaGFuZ2VzVHVwbGUuZW50cnk7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5jaGFuZ2VzO1xuXG5cdFx0aWYgKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSB7fTtcblx0XHR9XG5cblx0XHRpZiAoY2hhbmdlcy5leHBhbmRlZENvbHVtbnMgIT09IG51bGwpIHtcblx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zID0gY2hhbmdlcy5leHBhbmRlZENvbHVtbnMubWVyZ2VkO1xuXHRcdH1cblxuXHRcdGNvbnN0IHByZXZpb3VzID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSxcblx0XHRcdHt9LFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0dGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdGNoYW5nZXMuZmllbGRzLFxuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdLFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gdGVzdFxuXHRcdGlmIChjaGFuZ2VzLmZpZWxkcy5pZCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpdGVtRW50cnkuaXRlbUlkID0gY2hhbmdlcy5maWVsZHMuaWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHByZXZpb3VzO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaEl0ZW1FbnRyeURhdGEoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cmllc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRlbnRyeU9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXJcblx0XHRcdC5mZXRjaEJ5UXVlcnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeVxuXHRcdFx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHR0aGlzLnF1ZXJ5U2VydmljZS5hZGRQYXJlbnRDb25kaXRpb24oXG5cdFx0XHRcdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRcdFx0XHRlbnRyeU9wdGlvbnMucGFyZW50LFxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0LnBhcnNlKCksXG5cdFx0XHRcdGVudHJ5T3B0aW9ucy5jb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zdCBpdGVtRW50cmllczogSXRlbUVudHJ5W10gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIHJlc3BvbnNlLmxpbmtzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRpdGVtRW50cmllcy5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW1FbnRyaWVzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeS5jb25zdHJ1Y3Qob3B0aW9ucy5jb2x1bW5zKTtcblx0XHRjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZUludGVyZmFjZTx2b2lkPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuZmV0Y2hJdGVtRW50cnlEYXRhKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyaWVzOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaXRlbUlkcykge1xuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMucHVzaChcblx0XHRcdFx0XHRcdFx0dGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdCkhLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gaXRlbUVudHJpZXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGRhdGEgZm9yIHRoZSBwYXNzZWQgSXRlbVR5cGUvSXRlbUlkL2NvbHVtbnMsIHdpbGwgZG8gbm90aGluZyBpZiB0aGUgcmVxdWVzdGVkIEl0ZW1FbnRyeS9jb2x1bW5zIGFyZSBhbHJlYWR5IGNhY2hlZC5cblx0ICogV2lsbCBjcmVhdGUgYSBuZXcge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IGlmIHRoZSBJdGVtRW50cnkgZGlkbid0IGV4aXN0IHlldFxuXHQgKi9cblx0cHJpdmF0ZSBmZXRjaEl0ZW1FbnRyeURhdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCAmJiBjb2x1bW5TdWJzZXRDYWNoZS5ydW4oaXRlbUVudHJ5LmNvbHVtbnMpKSB7XG5cdFx0XHQvLyBUaGVyZSBhbHJlYWR5IGlzIGFuIGVudHJ5IGFuZCBpdCBjb250YWlucyB0aGUgY29sdW1ucyB3ZSBuZWVkLCBzbyB3ZSBjYW4gc2FmZWx5IHJldHVybiBpdFxuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyXG5cdFx0XHQuZmV0Y2hCeUlkKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZS5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGRhdGEgZm9yIHRoZSBJdGVtRW50cmllcyBsaW5rZWQgdG8gdGhlIHBhcmVudCBJdGVtc1xuXHQgKlxuXHQgKiBAcGFyYW0gY29sdW1ucyBzaG91bGQgY29udGFpbiBhIGRlcml2ZWQgY29sdW1uIHRoYXQgcmVmZXJzIHRvIHRoZSBwYXJlbnRcblx0ICovXG5cdHB1YmxpYyBmZXRjaExpbmtlZEl0ZW1FbnRyaWVzRGF0YSAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRyZXR1cm4gcXVlcnkgPT09IG51bGwgP1xuXHRcdFx0dGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlci5mZXRjaEJ5SWRzKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZEFycmF5LFxuXHRcdFx0XHRjb2x1bW5zLFxuXHRcdFx0KSA6XG5cdFx0XHR0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlRdWVyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHRoaXMucXVlcnlQYXJzZXJGYWN0b3J5XG5cdFx0XHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRsaW5rZWRUbzogcGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdFx0XHRxdWVyeToge2lkOiBwYXJlbnRJZEFycmF5fSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC5wYXJzZSgpLFxuXHRcdFx0XHQvLyBzaG91bGQgY29udGFpbiBhIGRlcml2ZWQgY29sdW1uIHRoYXQgcmVmZXJzIHRvIHRoZSBwYXJlbnRcblx0XHRcdFx0Y29sdW1ucyxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdlbmVyYWwgd2F5IHRvIHByb2Nlc3MgYW4gQVBJIHJlc3BvbnNlLlxuXHQgKiBXaWxsIGNhbGwge0BsaW5rIENoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZCBzZXRJdGVtQ3JlYXRlZH0gaWYgYW4gZW50cnkgZG9lc24ndCBleGlzdCB5ZXQsIGFuZCBvdGhlcndpc2Uge0BsaW5rIENoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZCBzZXRJdGVtVXBkYXRlZH0gaWYgaXQgZG9lcy5cblx0ICovXG5cdHB1YmxpYyBwcm9jZXNzQXBpUmVzcG9uc2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRyZXNwb25zZTogQXBpUmVzcG9uc2VQcm9jZXNzb3IsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbkV4cGFuc2lvbjogQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IHZvaWQge1xuXHRcdC8vIFdlIHNob3VsZCByZS1jaGVjayBpZiBhbiBlbnRyeSBpcyBub3QgY3JlYXRlZCBpbiB0aGUgbWVhbnRpbWVcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGZpZWxkcyA9IHJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChmaWVsZHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBGaWVsZHMgbm90IGZvdW5kIGluIHJlc3BvbnNlIGZvciAke2l0ZW1UeXBlfToke2l0ZW1JZH1gKTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtQ3JlYXRlZChcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdGNvbHVtblNldCxcblx0XHRcdCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5ydW4oaXRlbUVudHJ5LmNvbHVtbnMpLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IG5vb3AsIFJtQ29yZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0Q29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0Q29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDb2x1bW5TZXRGYWN0b3J5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHsgQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMvQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnknO1xuaW1wb3J0IHtcblx0QXV0aEludGVyZmFjZSxcblx0RXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRQcm9taXNlTGlicmFyeUludGVyZmFjZSxcbn0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRBcGlMaW5rVHJlZVR5cGUsXG5cdEVudHJ5UGFyZW50LFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRJdGVtVHlwZSxcblx0UHJvbWlzZUludGVyZmFjZSxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXBpRm9ybWF0dGVyIH0gZnJvbSAnLi4vLi4vQXBpRm9ybWF0dGVyJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VQcm9jZXNzb3IgfSBmcm9tICcuLi8uLi9BcGlSZXNwb25zZVByb2Nlc3Nvcic7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2sgfSBmcm9tICcuLi8uLi9DaGFuZ2VzUHJvY2Vzc29yJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlJztcbmltcG9ydCB7IENvbHVtbkNhY2hlIH0gZnJvbSAnLi4vLi4vQ29sdW1uQ2FjaGUnO1xuaW1wb3J0IHsgQ29sdW1uSGFuZGxlciB9IGZyb20gJy4uLy4uL0NvbHVtbkhhbmRsZXInO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uLy4uL0NvbHVtblV0aWwnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vSXRlbUVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vS2V5U2VydmljZSc7XG5pbXBvcnQgeyBMb2NrU2VydmljZSB9IGZyb20gJy4uLy4uL0xvY2tTZXJ2aWNlJztcbmltcG9ydCB7IFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uLy4uL1F1ZXJ5U2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4uLy4uL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuLi8uLi9UZW1wbGF0ZUNhY2hlJztcbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi8uLi9VdGlsJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuLi9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyIH0gZnJvbSAnLi9TZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlcic7XG5pbXBvcnQgeyBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzLCBTZXJ2ZXJJdGVtSGFuZGxlciB9IGZyb20gJy4vU2VydmVySXRlbUhhbmRsZXInO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogVGhlIHtAbGluayBTZXJ2ZXJDYWNoZSBTZXJ2ZXJDYWNoZX0gaXMgcmVzcG9uc2libGUgZm9yIGtlZXBpbmcgdHJhY2sgb2Yge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gYW5kIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJpZXN9XG4gKiB3aGljaCBhcmUgc2F2ZWQgb24gdGhlIHNlcnZlci5cbiAqXG4gKiBJdCdzIGJhc2ljYWxseSBhIGxvY2FsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkYXRhYmFzZVxuICovXG5leHBvcnQgY2xhc3MgU2VydmVyQ2FjaGVcblx0ZXh0ZW5kcyBBYnN0cmFjdENhY2hlIHtcblxuXHRwdWJsaWMgcmVhZG9ubHkgaXRlbUhhbmRsZXI6IFNlcnZlckl0ZW1IYW5kbGVyO1xuXHRwdWJsaWMgcmVhZG9ubHkgY29sbGVjdGlvbkhhbmRsZXI6IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyO1xuXG5cdHB1YmxpYyBwYXJlbnQ6IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5OiBDaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSxcblx0XHRjb3JlOiBSbUNvcmUsXG5cdFx0Y29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0bG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHRlbXBsYXRlQ2FjaGU6IFRlbXBsYXRlQ2FjaGUsXG5cdFx0aXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0Y29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdGNvbGxlY3Rpb25FbnRyeUZhY3Rvcnk6IENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb3JlLFxuXHRcdFx0Y29sdW1uQ2FjaGUsXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0bG9ja1NlcnZpY2UsXG5cdFx0XHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5pdGVtSGFuZGxlciA9IG5ldyBTZXJ2ZXJJdGVtSGFuZGxlcihcblx0XHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0cXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0aXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdGl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyID0gbmV3IFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyKFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0dGhpcy5pdGVtSGFuZGxlcixcblx0XHRcdHByb21pc2VTZXJ2aWNlLFxuXHRcdFx0cXVlcnlTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRTZXJ2ZXJDYWNoZSAoKTogU2VydmVyQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHByb2Nlc3NSZXNwb25zZSAoXG5cdFx0cmVzcG9uc2U6IEFwaVJlc3BvbnNlUHJvY2Vzc29yLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENoYW5nZXNEZWx0YVJlc3VsdD4ge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY29yZS5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IHJlc3BvbnNlQ29sdW1uc09iamVjdCA9IHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiByZXNwb25zZS5pdGVtcykge1xuXHRcdFx0Y29uc3QgY29sdW1uU2V0ID0gdGhpcy5jb3JlLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0RnJvbVJlc3BvbnNlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zT2JqZWN0LFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb3JlLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uU2V0LnJlcXVlc3QsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uc09iamVjdCxcblx0XHRcdCk7XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbUlkU3RyaW5nIGluIHJlc3BvbnNlLml0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NBcGlSZXNwb25zZShcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0TnVtYmVyKGl0ZW1JZFN0cmluZyksXG5cdFx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0XHRcdGNvbHVtbkV4cGFuc2lvbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBcHBsaWVzIHRoZSBjaGFuZ2VzIG9mIHRoZSBjaGFuZ2VzRGVsdGEgY3JlYXRlZCBieSB0aGUgQVBJIGNhbGwgKHtAbGluayBDaGFuZ2VzUHJvY2Vzc29yIENoYW5nZXNQcm9jZXNzb3J9L3tAbGluayBTb2NrZXRNZXNzYWdlSGFuZGxlciBTb2NrZXRNZXNzYWdlSGFuZGxlcn0sIG9yIG1hbnVhbGx5IHRocm91Z2ggYSBtb2R1bGUgZnVuY3Rpb24pIG9uIGFsbCBjYWNoZXNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tUGFyZW50IChcblx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEsXG5cdFx0aXNDYWxsZWRBZnRlckFwaVNhdmU6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHR0aGlzLml0ZW1IYW5kbGVyLnByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzKGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5SWRdKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldEJ5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdCk7XG5cblx0XHRjb2xsZWN0aW9uTWF0Y2hlclxuXHRcdFx0LnByb2Nlc3NEZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdC5yZW1vdmVGcm9tQW5kQWRkVG9Db2xsZWN0aW9ucygpO1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXNDYWxsZWRBZnRlckFwaVNhdmUsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyB0aGUgZmllbGRzIHJlcXVpcmVkIHRvIHNldCB0aGUgcGFyZW50XG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGlua0ZpZWxkc0J5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnQuaXRlbVR5cGVdW2l0ZW1UeXBlIGFzIHN0cmluZ107XG5cdFx0Y29uc3QgcmVzdWx0OiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+ID0ge307XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50Lml0ZW1UeXBlfSctPicke2l0ZW1UeXBlfSdgKTtcblx0XHR9XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuRElSRUNUKSB7XG5cdFx0XHRyZXN1bHRbbGlua1RyZWVFbnRyeS5maWVsZF0gPSBwYXJlbnQuaXRlbUlkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQuaXRlbXR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRyZXN1bHQuaXRlbSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBnZXRQYXJlbnQgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5LFxuXHQpOiBFbnRyeVBhcmVudE51bGwge1xuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRpZiAoY2hhbmdlcyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoaXRlbUVudHJ5LmNvbHVtbnMubGluayAhPT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBpdGVtRW50cnkuY29sdW1ucy5saW5rLmFwaUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQ6IGNoYW5nZXNbaXRlbUVudHJ5LmNvbHVtbnMubGluay5pZF0sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHJlc3BvbnNlQ29sdW1ucyA9IGl0ZW1FbnRyeS5jb2x1bW5zLnJlc3BvbnNlW2l0ZW1FbnRyeS5pdGVtVHlwZV07XG5cblx0XHRcdGlmIChcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLml0ZW10eXBlICE9PSB1bmRlZmluZWRcblx0XHRcdFx0JiYgcmVzcG9uc2VDb2x1bW5zLml0ZW0gIT09IHVuZGVmaW5lZFxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0aXRlbVR5cGU6IGNoYW5nZXMuaXRlbXR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkOiBjaGFuZ2VzLml0ZW0sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRwdWJsaWMgZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0XHRjb3B5RmllbGRzOiBib29sZWFuID0gdHJ1ZSxcblx0KTogRmllbGRNYXAge1xuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXTtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblxuXHRcdGlmIChcblx0XHRcdGNoYW5nZXMgIT09IHVuZGVmaW5lZFxuXHRcdFx0JiYgaXRlbUVudHJ5ICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdGlmICghY29weUZpZWxkcykge1xuXHRcdFx0XHRyZXR1cm4gY2hhbmdlcztcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRcdGNoYW5nZXMsXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoaXRlbUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gbG9jYWwgZW50cnkgZm91bmRgKTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vIGxvY2FsIGZpZWxkcyBmb3VuZCBmb3IgSXRlbUVudHJ5IHdpdGggSXRlbVR5cGUgJyR7aXRlbUVudHJ5Lml0ZW1UeXBlfSdgKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogT25seSB0YWtlcyB0aGUgbG9jYWwgY2hhbmdlcyBpbnRvIGFjY291bnQsIHVzZWQgZm9yIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIGdldExvY2FsSXRlbUVudHJ5Q2hhbmdlc1R1cGxlIChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHQpOiB7XG5cdFx0ZW50cnk6IEl0ZW1FbnRyeSxcblx0XHRjaGFuZ2VzOiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzXG5cdH0ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZ2V0TG9jYWxJdGVtRW50cnkoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIGdldCBhIGxvY2FsIEl0ZW1FbnRyeSB3aXRoIGVudHJ5SWQgJyR7aXRlbUVudHJ5SWR9JyBidXQgY291bGRuJ3QgZmluZCBpdGApO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRlbnRyeTogaXRlbUVudHJ5LFxuXHRcdFx0Y2hhbmdlczogdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0sXG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uQ2hhbmdlc1JlY3Vyc2l2ZWx5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogSXRlbUVudHJ5W10ge1xuXHRcdGNvbnN0IGVudHJ5ID0gdGhpcy5nZXRMb2NhbENvbGxlY3Rpb25FbnRyeShjb2xsZWN0aW9uRW50cnlJZCk7XG5cdFx0bGV0IGNoYW5nZXMgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeUlkXTtcblxuXHRcdGlmIChlbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNoYW5nZXMgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeUlkXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY2hhbmdlcy5zbGljZSgpO1xuXHRcdH1cblxuXHRcdHRocm93IG5ldyBFcnJvcignTm8gbG9jYWwgY29sbGVjdGlvbiBpdGVtcyBmb3VuZCcpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBJbnZhbGlkYXRlcyB0aGUgY29tcGxldGUgc2VydmVyIGNhY2hlLCBhbGwgaXRlbXMgd2lsbCBiZSByZS1mZXRjaGVkIHdoZW5ldmVyIHRoZXkgYXJlIHJlcXVlc3RlZFxuXHQgKi9cblx0cHVibGljIGludmFsaWRhdGVDYWNoZSAoKTogdm9pZCB7XG5cdFx0Ly8gdGhlIGl0ZW1IYW5kbGVyIGNhY2hlIG9ubHkgY29udGFpbnMgcmVtb3RlIGVudHJpZXNcblx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZm9yRWFjaChcblx0XHRcdGl0ZW1FbnRyeSA9PiBpdGVtRW50cnkucXVldWVSZWxvYWQoKSxcblx0XHQpO1xuXG5cdFx0Ly8gcXVldWVSZWxvYWQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgZm9yIGVhY2ggaW5kaXZpZHVhbCBpdGVtXG5cdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gY29sbGVjdGlvbkVudHJ5LnF1ZXVlUmVsb2FkKCksXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHRoZSBwYXNzZWQgY2hhbmdlcyBmcm9tIHRoZSBjaGlsZCBUcmFuc2FjdGlvbiBpbnRvIHRoaXMgVHJhbnNhY3Rpb24ncyBvd24gY2hhbmdlcyBhbmQgdGhlbiBwcm9wYWdhdGVzXG5cdCAqIHRoZW0gdG8gYWxsIGNoaWxkIFRyYW5zYWN0aW9uc1xuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0Zyb21DaGlsZCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0YnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2s/OiBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUlkQ29udmVyc2lvbk1hcD4ge1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gc2hvdWxkbid0IHRoaXMgZG8gZXZlcnl0aGluZyBmcm9tIFRyYW5zYWN0aW9uQ2FjaGUuc2F2ZSA/XG5cblx0XHRyZXR1cm4gdGhpcy5jaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRcdGJyZWFrVXBCeVBhcmVudCxcblx0XHRcdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHRcdFx0KVxuXHRcdFx0LmV4ZWN1dGUoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQXBwbGllcyBjaGFuZ2VzIHRvIHRoaXMgdHJhbnNhY3Rpb24gYW5kIGl0cyBjaGlsZHJlblxuXHQgKiBEaWZmZXJzIGZyb20ge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YX0gaW4gdGhlIGhhbmRsaW5nIG9mIGRlbGV0ZWQgZW50cmllcyBhbmQgdGhlIGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgY2FsbFxuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0RlbHRhIChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzRGVsdGEuY3JlYXRlZC5sZW5ndGggPT09IDBcblx0XHRcdCYmICFoYXNQcm9wZXJ0aWVzKGNoYW5nZXNEZWx0YS51cGRhdGVkKVxuXHRcdFx0JiYgIWhhc1Byb3BlcnRpZXMoY2hhbmdlc0RlbHRhLmRlbGV0ZWQpXG5cdFx0KSB7XG5cdFx0XHQvLyBlbXB0eSBkZWx0YSwgbm8gbmVlZCB0byBkbyBhbnl0aGluZ1xuXG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKHtcblx0XHRcdFx0Y3JlYXRlZDogW10sXG5cdFx0XHRcdHJvbGxiYWNrOiBub29wLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5mZXRjaFVwZGF0ZWREZXJpdmVkVmFsdWVzRnJvbURlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0Y29uc3Qge3Jlc3VsdCwgaW50ZXJuYWxDaGFuZ2VzRGVsdGEsIHJvbGxiYWNrRnVuY3Rpb25zfSA9IHN1cGVyLl9hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBjaGFuZ2VzRGVsdGEuZGVsZXRlZCkge1xuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgY2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXHRcdFx0XHRcdFx0XHRjb25zdCBvbGRDaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnkuaWRdO1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1EZWxldGVkKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0cm9sbGJhY2tGdW5jdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdFx0XHRyb2xsYmFja0RlbHRhID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHJvbGxiYWNrRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2xkQ2hhbmdlcyxcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdFx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyXG5cdFx0XHRcdFx0XHQucHJvY2Vzc0RlbHRhKGludGVybmFsQ2hhbmdlc0RlbHRhKVxuXHRcdFx0XHRcdFx0LnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuY2hpbGRyZW4pIHtcblx0XHRcdFx0XHRcdGNoaWxkLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQoXG5cdFx0XHRcdFx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0XHR0cnVlLCAvLyB0b2RvW2NhY2hlXSBzaG91bGQgdGhpcyBiZSB0cnVlID9cblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdCk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmdldEJ5RW50cnlJZChpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBpdGVtRW50cnk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBnZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtRW50cnlbJ2l0ZW1JZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkgKGNvbGxlY3Rpb25FbnRyeUlkOiBDb2xsZWN0aW9uRW50cnlbJ2lkJ10pOiBDb2xsZWN0aW9uRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUVudHJ5SWQoY29sbGVjdGlvbkVudHJ5SWQpO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGNoYW5nZXNPYmplY3Q6IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlPixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIGNoYW5nZXNPYmplY3Q7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbGxlY3Rpb25RdWVyeSwgSXRlbUVudHJ5TWFwLCBJdGVtRW50cnlQYXJlbnRJZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuL2NhY2hlL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZSc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtQ2FjaGUge1xuXG5cdHByaXZhdGUgZW50cmllczogSXRlbUVudHJ5TWFwPGFueT4gPSB7fTtcblxuXHRwdWJsaWMgZW50cmllc0J5RW50cnlJZDoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbUVudHJ5XG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGdldEJ5RW50cnlJZCAoaXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIHRoaXMuZW50cmllc0J5RW50cnlJZFtpdGVtRW50cnlJZF07XG5cdH1cblxuXHRzb21lIChjYWxsYmFjazogKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlPikgPT4gYm9vbGVhbikge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGlmIChjYWxsYmFjayhlbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdKSkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Z2V0QnlJdGVtVHlwZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRyZXN1bHQucHVzaChlbnRyaWVzW2l0ZW1JZF0pO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBlbnRyaWVzW2l0ZW1JZF07XG5cblx0XHRcdGlmIChcblx0XHRcdFx0dGhpcy5tYXRjaFF1ZXJ5KFxuXHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldExvY2FsQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXG5cdFx0XHRpZiAoIWl0ZW1FbnRyeS5pc0xvY2FsKCkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLm1hdGNoUXVlcnkoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0cXVlcnksXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldEJ5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBlbnRyaWVzW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChpdGVtRW50cnkpO1xuXG5cdFx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0aWYgKHBhcmVudC5pdGVtVHlwZSA9PT0gcGFyZW50VHlwZSAmJiBwYXJlbnQuaXRlbUlkID09IHBhcmVudElkKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGJhdGNoR2V0TG9jYWxCeVBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkczogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRhZGRpdGlvbmFsUXVlcnk6IGFueSxcblx0KTogSXRlbUVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBJdGVtRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IHBhcmVudElkIG9mIHBhcmVudElkcykge1xuXHRcdFx0cmVzdWx0W3BhcmVudElkXSA9IFtdO1xuXHRcdH1cblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHBhcmVudC5pdGVtVHlwZSAhPT0gcGFyZW50VHlwZSB8fCByZXN1bHRbcGFyZW50Lml0ZW1JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFpdGVtRW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoYWRkaXRpb25hbFF1ZXJ5ID09PSBudWxsIHx8IHRoaXMubWF0Y2hRdWVyeShcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRhZGRpdGlvbmFsUXVlcnksXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJlc3VsdFtwYXJlbnQuaXRlbUlkXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGZvckVhY2ggKGNhbGxiYWNrOiAoaXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGU+KSA9PiB2b2lkKSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0Y2FsbGJhY2soZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0LypcdGZpbHRlciAoY2FsbGJhY2s6IChpdGVtRW50cnk6IEl0ZW1FbnRyeSkgPT4gYm9vbGVhbik6IHZvaWQge1xuXHQgY29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0IGNvbnN0IGZpbHRlcmVkRW50cmllczogSXRlbUVudHJ5TWFwID0ge307XG5cblx0IGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXG5cdCBmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHQgY29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHQgaWYgKGNhbGxiYWNrKGl0ZW1FbnRyeSkpXG5cdCBmaWx0ZXJlZEVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF0gPSBpdGVtRW50cnk7XG5cdCB9XG5cdCB9XG5cblx0IHRoaXMuZW50cmllcyA9IGZpbHRlcmVkRW50cmllcztcblx0IH1cblx0ICovXG5cdHRvQXJyYXkgKCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChlbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0YWRkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoaXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPik6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0aWYgKGVudHJpZXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGVudHJpZXNbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0dGhpcy5lbnRyaWVzQnlFbnRyeUlkW2l0ZW1FbnRyeS5pZF0gPSBpdGVtRW50cnk7XG5cblx0XHRyZXR1cm4gZW50cmllc1tpdGVtVHlwZV1baXRlbUVudHJ5Lml0ZW1JZF0gPSBpdGVtRW50cnk7XG5cdH1cblxuXHRnZXQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogc3RyaW5nIHwgSXRlbUlkLFxuXHQpOiB1bmRlZmluZWQgfCBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuZW50cmllc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMuZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXTtcblx0fVxuXG5cdC8vIHNob3VsZCBiZSBmYXN0XG5cdGNvbnRhaW5zIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBzdHJpbmcgfCBJdGVtSWQsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdICE9PSB1bmRlZmluZWQgJiYgdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdICE9PSB1bmRlZmluZWQ7XG5cdH1cblxuXHR1cGRhdGVJdGVtSWQ8VCBleHRlbmRzIEl0ZW1FbnRyeTxhbnk+PiAoXG5cdFx0aXRlbUVudHJ5OiBULFxuXHRcdG9sZEl0ZW1JZDogc3RyaW5nIHwgSXRlbUlkLFxuXHQpOiBUIHtcblx0XHRjb25zdCBlbnRyeU1hcCA9IHRoaXMuZW50cmllc1tpdGVtRW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0ZGVsZXRlIGVudHJ5TWFwW29sZEl0ZW1JZF07XG5cdFx0cmV0dXJuIGVudHJ5TWFwW2l0ZW1FbnRyeS5pdGVtSWRdID0gaXRlbUVudHJ5O1xuXHR9XG5cblx0Y2xlYXIgKGl0ZW1FbnRyeT86IEl0ZW1FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmVudHJpZXMgPSB7fTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuY2xlYXJCeUl0ZW1JZChcblx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0KTtcblx0fVxuXG5cdGNsZWFyQnlJdGVtSWQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlbGV0ZSBlbnRyaWVzW2l0ZW1JZF07XG5cdH1cblxuXHRtYXRjaFF1ZXJ5IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+LFxuXHRcdHF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IHR1cGxlID0gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZShpdGVtRW50cnkuaWQpO1xuXG5cdFx0cmV0dXJuIHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHQodGhpcy50cmFuc2FjdGlvbiBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKVxuXHRcdFx0XHRcdD8gdHVwbGUuY2hhbmdlc1xuXHRcdFx0XHRcdDogdHVwbGUuY2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChpdGVtRW50cnkpLFxuXHRcdFx0KVxuXHRcdFx0Lm1hdGNoUXVlcnkocXVlcnkub2JqZWN0KSA9PT0gdHJ1ZTsgLy8gVE9ETzogbWF5YmU/XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBTExfUEVSTUlTU0lPTlMgfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgQXV0aEludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9MaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaUxpbmtUcmVlVHlwZSxcblx0QXBpUmVzcG9uc2UsXG5cdEVudHJ5UGFyZW50LFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEZpZWxkTWFwLFxuXHRJdGVtRXJyb3IsXG5cdEl0ZW1JZCxcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0SXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1UeXBlLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtRW50cnlTZXJ2aWNlIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIG1hdGNoUGFyZW50IChcblx0XHRvbGRQYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0XHRuZXdQYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKG9sZFBhcmVudCA9PT0gbnVsbCAmJiBuZXdQYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmIChcblx0XHRcdChvbGRQYXJlbnQgPT09IG51bGwgJiYgbmV3UGFyZW50ICE9PSBudWxsKVxuXHRcdFx0fHwgKG9sZFBhcmVudCAhPT0gbnVsbCAmJiBuZXdQYXJlbnQgPT09IG51bGwpXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gdGhleSBjYW4ndCBiZSBudWxsIGFueW1vcmUgaGVyZSByaWdodCA/XG5cdFx0cmV0dXJuIChcblx0XHRcdG9sZFBhcmVudCEuaXRlbVR5cGUgPT09IG5ld1BhcmVudCEuaXRlbVR5cGVcblx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0XHQmJiBvbGRQYXJlbnQhLml0ZW1JZCA9PSBuZXdQYXJlbnQhLml0ZW1JZFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIGZpZWxkcyByZXF1aXJlZCB0byBzZXQgdGhlIHBhcmVudFxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIE9wcG9zaXRlIG9mIHtAbGluayBJdGVtRW50cnlTZXJ2aWNlLmdldFBhcmVudEJ5RmllbGRzIEl0ZW1FbnRyeVNlcnZpY2UuZ2V0UGFyZW50QnlGaWVsZHN9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0TGlua0ZpZWxkc0J5UGFyZW50PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudCxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnQuaXRlbVR5cGVdW2l0ZW1UeXBlIGFzIHN0cmluZ107XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50Lml0ZW1UeXBlfSctPicke2l0ZW1UeXBlfSdgKTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQ6IFBhcnRpYWw8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4gPSB7fTtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5LnR5cGUgPT09IEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QpIHtcblx0XHRcdHJlc3VsdFtsaW5rVHJlZUVudHJ5LmZpZWxkXSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHJlc3VsdC5pdGVtdHlwZSA9IHBhcmVudC5pdGVtVHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtID0gcGFyZW50Lml0ZW1JZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIGFuIHtAbGluayBFbnRyeVBhcmVudCBFbnRyeVBhcmVudH0gb2JqZWN0IGZyb20gdGhlIGZpZWxkc1xuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIE9wcG9zaXRlIG9mIHtAbGluayBJdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudCBJdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudH1cblx0ICovXG5cdHB1YmxpYyBnZXRQYXJlbnRCeUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBsaW5rVHJlZSA9IHRoaXMubGlua1RyZWVTZXJ2aWNlLmdldCgpO1xuXHRcdGNvbnN0IGxpbmtUcmVlRW50cnkgPSBsaW5rVHJlZVtwYXJlbnRUeXBlXVtpdGVtRW50cnkuaXRlbVR5cGUgYXMgc3RyaW5nXTtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgTm9uIGV4aXN0aW5nIGxpbmsgYmV0d2VlbiAnJHtwYXJlbnRUeXBlfSctPicke2l0ZW1FbnRyeS5pdGVtVHlwZX0nYCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0OiBFbnRyeVBhcmVudCA9IHt9IGFzIEVudHJ5UGFyZW50O1xuXG5cdFx0aWYgKGxpbmtUcmVlRW50cnkudHlwZSA9PT0gQXBpTGlua1RyZWVUeXBlLkRJUkVDVCkge1xuXHRcdFx0cmVzdWx0Lml0ZW1UeXBlID0gcGFyZW50VHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtSWQgPSBmaWVsZHNbbGlua1RyZWVFbnRyeS5maWVsZF07XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIHRvZG9bY2FjaGVdIHdlIGFscmVhZHkga25vdyB0aGUgcGFyZW50VHlwZT9cblx0XHRcdHJlc3VsdC5pdGVtVHlwZSA9IGZpZWxkcy5pdGVtdHlwZTtcblx0XHRcdHJlc3VsdC5pdGVtSWQgPSBmaWVsZHMuaXRlbTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGdldERpc3BsYXlOYW1lPEl0ZW1FbnRyeVR5cGUgZXh0ZW5kcyBJdGVtRW50cnk+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPixcblx0KTogc3RyaW5nIHtcblxuXHRcdHN3aXRjaCAoaXRlbUVudHJ5Lml0ZW1UeXBlKSB7XG5cdFx0XHRjYXNlICdDb250YWN0Jzpcblx0XHRcdFx0cmV0dXJuIGZpZWxkcy50eXBlID09PSAnYmVkcmlqZidcblx0XHRcdFx0XHQ/IGZpZWxkcy5iZWRyaWpmXG5cdFx0XHRcdFx0OiB0aGlzLmdldEZ1bGxOYW1lKFxuXHRcdFx0XHRcdFx0ZmllbGRzLnZvb3JuYWFtLFxuXHRcdFx0XHRcdFx0ZmllbGRzLnR1c3NlbnZvZWdzZWwsXG5cdFx0XHRcdFx0XHRmaWVsZHMubmFhbSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnTWVkZXdlcmtlcic6XG5cdFx0XHRjYXNlICdQZXJzb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRGdWxsTmFtZShcblx0XHRcdFx0XHRmaWVsZHMudm9vcm5hYW0sXG5cdFx0XHRcdFx0ZmllbGRzLnR1c3NlbnZvZWdzZWwsXG5cdFx0XHRcdFx0ZmllbGRzLmFjaHRlcm5hYW0sXG5cdFx0XHRcdCk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmllbGRzW3RoaXMuZ2V0VGl0bGVGaWVsZChpdGVtRW50cnkuaXRlbVR5cGUpXTtcblx0XHR9XG5cdH1cblxuXHRwcm9jZXNzT3B0aW9ucyAob3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UpOiBJdGVtRW50cnlPcHRpb25zIHtcblx0XHRyZXR1cm4gbmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHQvLyB0b2RvOiB0cmFuc2xhdGVcblx0Y3JlYXRlVW5mb3VuZFJlbW90ZUl0ZW1FcnJvciAoKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6ICdUaGUgcmVxdWVzdGVkIGl0ZW0gY291bGQgbm90IGJlIGZvdW5kIC8geW91ciBjdXJyZW50IHBlcm1pc3Npb25zIGFyZSBub3Qgc3VmZmljaWVudCd9O1xuXHR9XG5cblx0Y3JlYXRlVW5mb3VuZExvY2FsSXRlbUVycm9yIChpdGVtVHlwZTogSXRlbVR5cGUpOiBJdGVtRXJyb3Ige1xuXHRcdHJldHVybiB7bWVzc2FnZTogYEEgbG9jYWwgaXRlbSBvZiB0eXBlICR7aXRlbVR5cGV9IGNvdWxkIG5vdCBiZSBmb3VuZGB9O1xuXHR9XG5cblx0Y3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvciAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6IGBBIGxvY2FsIGl0ZW0gb2YgdHlwZSAke2l0ZW1UeXBlfSBub3QgYmUgY3JlYXRlZCwgdGhlIElEIGlzIGFscmVhZHkgaW4gdXNlYH07XG5cdH1cblxuXHRjcmVhdGVMb2NhbENvbnZlcnNpb25NYXAgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRkb0V4dGVuZDogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSxcblx0KTogSXRlbUlkQ29udmVyc2lvbk1hcCB7XG5cdFx0Y29uc3QgYXBpSXRlbUlkID0gYXBpUmVzcG9uc2UubGlua3NbaXRlbVR5cGVdWzBdO1xuXHRcdGNvbnN0IHJlc3VsdDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9O1xuXG5cdFx0cmVzdWx0W2l0ZW1UeXBlXSA9IHt9O1xuXHRcdHJlc3VsdFtpdGVtVHlwZV1bYXBpSXRlbUlkXSA9IGl0ZW1JZDtcblxuXHRcdGlmIChkb0V4dGVuZCkge1xuXHRcdFx0dGhpcy5leHBhbmRMb2NhbENvbnZlcnNpb25NYXAoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdGFwaVJlc3BvbnNlLFxuXHRcdFx0XHRyZXN1bHQsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRleHBhbmRMb2NhbENvbnZlcnNpb25NYXAgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0YXBpUmVzcG9uc2U6IEFwaVJlc3BvbnNlLFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGxpbmtzID0gYXBpUmVzcG9uc2UuaXRlbXNbcGFyZW50VHlwZV1bcGFyZW50SWRdLmxpbmtzO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBsaW5rcykge1xuXHRcdFx0Y29uc3QgaWRBcnJheSA9IGxpbmtzW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Zm9yIChjb25zdCBhcGlJdGVtSWQgb2YgaWRBcnJheSkge1xuXHRcdFx0XHRjb252ZXJzaW9uTWFwW2l0ZW1UeXBlXVthcGlJdGVtSWRdID0gdGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKTtcblxuXHRcdFx0XHR0aGlzLmV4cGFuZExvY2FsQ29udmVyc2lvbk1hcChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0YXBpUmVzcG9uc2UsXG5cdFx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRleHBhbmRDb252ZXJzaW9uTWFwIChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFx0bmV3SXRlbUlkPzogSXRlbUlkLFxuXHQpOiBJdGVtSWQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXHRcdGNvbnN0IGl0ZW1JZCA9IGl0ZW1FbnRyeS5pdGVtSWQ7XG5cblx0XHRsZXQgY29udmVyc2lvbk1hcEVudHJ5O1xuXG5cdFx0aWYgKGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0Y29udmVyc2lvbk1hcEVudHJ5ID0gY29udmVyc2lvbk1hcFtpdGVtVHlwZV07XG5cblx0XHRpZiAoY29udmVyc2lvbk1hcEVudHJ5W2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbnZlcnNpb25NYXBFbnRyeVtpdGVtSWRdO1xuXHRcdH1cblxuXHRcdGlmIChuZXdJdGVtSWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0bmV3SXRlbUlkID0gdGhpcy5rZXlTZXJ2aWNlLmdldExvY2FsSWQoKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVyc2lvbk1hcEVudHJ5W2l0ZW1JZF0gPSBuZXdJdGVtSWQ7XG5cdH1cblxuXHRiYXRjaEV4cGFuZENvbnZlcnNpb25NYXAgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8YW55Pj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogSXRlbUlkQ29udmVyc2lvbk1hcCB7XG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdHRoaXMuZXhwYW5kQ29udmVyc2lvbk1hcChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRjb252ZXJzaW9uTWFwLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29udmVyc2lvbk1hcDtcblx0fVxuXG5cdGdldENvbnZlcnNpb25WYWx1ZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogSXRlbUlkIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAobWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHRnZXRGdWxsTmFtZSAoXG5cdFx0Zmlyc3ROYW1lOiBzdHJpbmcgPSAnJyxcblx0XHRpbmZpeDogc3RyaW5nID0gJycsXG5cdFx0bGFzdE5hbWU6IHN0cmluZyA9ICcnLFxuXHQpOiBzdHJpbmcge1xuXHRcdHJldHVybiBmaXJzdE5hbWVcblx0XHRcdC50cmltKClcblx0XHRcdC5jb25jYXQoXG5cdFx0XHRcdCcgJyxcblx0XHRcdFx0aW5maXgsXG5cdFx0XHQpXG5cdFx0XHQudHJpbSgpXG5cdFx0XHQuY29uY2F0KFxuXHRcdFx0XHQnICcsXG5cdFx0XHRcdGxhc3ROYW1lLFxuXHRcdFx0KVxuXHRcdFx0LnRyaW0oKTtcblx0fVxuXG5cdGdldFRpdGxlRmllbGQgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IHN0cmluZyB7XG5cdFx0c3dpdGNoIChpdGVtVHlwZSkge1xuXHRcdFx0Y2FzZSAnRXhlbXBsYWFyJzpcblx0XHRcdFx0cmV0dXJuICdzZXJpZW51bW1lcic7XG5cdFx0XHRjYXNlICdGYWN0dXVyJzpcblx0XHRcdFx0cmV0dXJuICdudW1tZXInO1xuXHRcdFx0Y2FzZSAnRmlsZXMnOlxuXHRcdFx0XHRyZXR1cm4gJ2ZyaWVuZGx5bmFtZSc7XG5cdFx0XHRjYXNlICdGdW5jdGllJzpcblx0XHRcdGNhc2UgJ1N0YW5kYWFyZGZ1bmN0aWUnOlxuXHRcdFx0XHRyZXR1cm4gJ25hYW1pbnRlcm4nO1xuXHRcdFx0Y2FzZSAnVm9vcnJhYWRtdXRhdGllJzpcblx0XHRcdFx0cmV0dXJuICdvbXNjaHJpanZpbmcnO1xuXHRcdFx0Y2FzZSAnQmFyY29kZSc6XG5cdFx0XHRcdHJldHVybiAnY29kZSc7XG5cdFx0XHRjYXNlICdCZXRhYWxtaWRkZWwnOlxuXHRcdFx0Y2FzZSAnQmV0YWxpbmdzY29uZGl0aWUnOlxuXHRcdFx0Y2FzZSAnQnJpZWZwYXBpZXInOlxuXHRcdFx0Y2FzZSAnVGF4Q2xhc3MnOlxuXHRcdFx0Y2FzZSAnVGF4U2NoZW1hJzpcblx0XHRcdGNhc2UgJ0NvbmRpdGlvbic6XG5cdFx0XHRjYXNlICdGYWN0dXVybW9tZW50Jzpcblx0XHRcdGNhc2UgJ0Z1bmN0aWVncm9lcCc6XG5cdFx0XHRjYXNlICdHcm9vdGJvZWsnOlxuXHRcdFx0Y2FzZSAnSW5odXVyJzpcblx0XHRcdGNhc2UgJ0luaHV1cmdyb2VwJzpcblx0XHRcdGNhc2UgJ0luaHV1cm1hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdNYXRlcmlhYWwnOlxuXHRcdFx0Y2FzZSAnTWF0ZXJpYWFsQ2F0Jzpcblx0XHRcdGNhc2UgJ01lZGV3ZXJrZXJ0YXJpZWYnOlxuXHRcdFx0Y2FzZSAnTm90aXRpZSc6XG5cdFx0XHRjYXNlICdQbGFubmluZ21hdGVyaWFhbCc6XG5cdFx0XHRjYXNlICdQcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ1N0YWZmZWxncm9lcCc6XG5cdFx0XHRjYXNlICdTdWJwcm9qZWN0Jzpcblx0XHRcdGNhc2UgJ1RhYWsnOlxuXHRcdFx0Y2FzZSAnVGFnJzpcblx0XHRcdGNhc2UgJ1RlbXBsYXRlJzpcblx0XHRcdGNhc2UgJ1RpamQnOlxuXHRcdFx0Y2FzZSAnVGl0ZWwnOlxuXHRcdFx0Y2FzZSAnVHlwZSc6XG5cdFx0XHRjYXNlICdWb2VydHVpZyc6XG5cdFx0XHRcdHJldHVybiAnbmFhbSc7XG5cdFx0XHQvLyBjYXNlICdDb250YWN0Jzpcblx0XHRcdC8vIGNhc2UgJ01lZGV3ZXJrZXInOlxuXHRcdFx0Ly8gY2FzZSAnUGVyc29uJzpcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdC8vIG9ubHkgdXNlIGRpc3BsYXluYW1lIGZvciBpdGVtcyB0aGF0IGRvbnQndCBoYXZlIGEgc2ltcGxlLCB3cml0YWJsZSBuYW1lIGZpZWxkXG5cdFx0XHRcdC8vIHRoaXMgZnVuY3Rpb24gaXMgYWxzbyB1c2VkIGZvciB0ZW1wbGF0ZWQgaXRlbXNcblx0XHRcdFx0cmV0dXJuICdkaXNwbGF5bmFtZSc7XG5cdFx0fVxuXHR9XG5cblx0Ly8gVE9ETzogd2UgY2FuIHJlbW92ZSB0aGVzZSBvbmNlIGFsbCBjb2x1bW5zIGFyZSByZXNwZWN0ZWQgZm9yIGxvY2FsIGl0ZW1zIFtSTTQtMTAzNzhdXG5cdHB1YmxpYyBnZXRMb2NhbERlZmF1bHRWYWx1ZXMgKCk6IEZpZWxkTWFwIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0cGVybWlzc2lvbnM6IEFMTF9QRVJNSVNTSU9OUyxcblx0XHRcdGNyZWF0b3I6IHRoaXMuYXV0aEludGVyZmFjZS5nZXRVc2VySWQoKSxcblx0XHRcdGNyZWF0ZWQ6IG1vbWVudCgpLFxuXHRcdH07XG5cdH1cbn1cbiIsImltcG9ydCB7IERVUExJQ0FURV9LRVlXT1JELCBEVVBMSUNBVEVfUFJFRklYLCBORVdfS0VZV09SRCwgTkVXX1BSRUZJWCB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJdGVtSWQsIFN0YXRlS2V5LCBTdGF0ZUtleVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBLZXlTZXJ2aWNlIHtcblx0c2VwYXJhdG9yOiBzdHJpbmcgPSAnOic7XG5cblx0Y29uc3RydWN0b3IgKCkge31cblxuXHRnZXRTaW5nbGVLZXkgKGl0ZW1UeXBlOiBzdHJpbmcsIGl0ZW1JZDogbnVtYmVyIHwgc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gaXRlbVR5cGUgKyB0aGlzLnNlcGFyYXRvciArIGl0ZW1JZDtcblx0fVxuXG5cdGdldENzc0tleSAoLi4uYXJncyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGFyZ3Muam9pbignXycpO1xuXHR9XG5cblx0cGFyc2VTdGF0ZUtleSAoc3RhdGVLZXk6IHN0cmluZyk6IFN0YXRlS2V5IHwgbnVsbCB7XG5cdFx0c3RhdGVLZXkgPSBzdGF0ZUtleS50b1N0cmluZygpO1xuXG5cdFx0aWYgKHN0YXRlS2V5LnN1YnN0cmluZygwLCBORVdfS0VZV09SRC5sZW5ndGgpID09PSBORVdfS0VZV09SRClcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHR5cGU6IFN0YXRlS2V5VHlwZS5OZXcsXG5cdFx0XHRcdHRlbXBsYXRlOiBzdGF0ZUtleS5zdWJzdHJpbmcoTkVXX0tFWVdPUkQubGVuZ3RoKSAvLyBUT0RPOiB0aGlzIGlzIGN1cnJlbnRseSBub3QgYmVpbmcgdXNlZCwgcmVldmFsdWF0ZVxuXHRcdFx0fTtcblxuXHRcdGlmIChzdGF0ZUtleS5zdWJzdHJpbmcoMCwgRFVQTElDQVRFX0tFWVdPUkQubGVuZ3RoKSA9PT0gRFVQTElDQVRFX0tFWVdPUkQpXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0eXBlOiBTdGF0ZUtleVR5cGUuRHVwbGljYXRlLFxuXHRcdFx0XHRpdGVtSWQ6ICtzdGF0ZUtleS5zdWJzdHJpbmcoRFVQTElDQVRFX0tFWVdPUkQubGVuZ3RoKVxuXHRcdFx0fTtcblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0RHVwbGljYXRlU3RhdGVLZXkgKGl0ZW1JZDogc3RyaW5nIHwgbnVtYmVyKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gRFVQTElDQVRFX0tFWVdPUkQgKyBpdGVtSWQ7XG5cdH1cblxuXHRnZXROZXdTdGF0ZUtleSAodGVtcGxhdGVUeXBlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiBORVdfS0VZV09SRCArIHRlbXBsYXRlVHlwZTtcblx0fVxuXG5cdGdldExvY2FsSWQgKCk6IEl0ZW1JZCB7XG5cdFx0cmV0dXJuICsoTkVXX1BSRUZJWCArIHRoaXMuZ2V0UmFuZG9tU3RyaW5nKCkpO1xuXHR9XG5cblx0Z2V0TG9jYWxEdXBsaWNhdGVJZCAoKTogSXRlbUlkIHtcblx0XHRyZXR1cm4gKyhEVVBMSUNBVEVfUFJFRklYICsgdGhpcy5nZXRSYW5kb21TdHJpbmcoKSk7XG5cdH1cblxuXHRnZXRSYW5kb21TdHJpbmcgKCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuICgnJyArIE1hdGgucmFuZG9tKCkpLnNwbGl0KCcuJylbMV0uc3Vic3RyKDAsIDgpO1xuXHR9XG5cblx0Ly8gbm90ZTogdGhlIGNoYW5nZXMgY29tcGlsZXIgdXNlcyB0aGlzXG5cdC8vIG1pZ2h0IGJlIGNhbGxlZCB3aXRoIHVuZGVmaW5lZCAoaXRlbUhhbmRsZXIuY3JlYXRlUmVxdWVzdClcblx0aXNMb2NhbElkIChpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBpdGVtSWQgIT09IHVuZGVmaW5lZCAmJiAodGhpcy5pc05ld0lkKGl0ZW1JZCkgfHwgdGhpcy5pc0R1cGxpY2F0ZUlkKGl0ZW1JZCkpO1xuXHR9XG5cblx0aXNOZXdJZCAoaXRlbUlkOiBJdGVtSWQgfCBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gaXRlbUlkID09PSBORVdfS0VZV09SRCB8fCAoJycgKyBpdGVtSWQpLnN1YnN0cmluZygwLCBORVdfUFJFRklYLmxlbmd0aCkgPT09IE5FV19QUkVGSVg7XG5cdH1cblxuXHRpc0R1cGxpY2F0ZUlkIChpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBpdGVtSWQgPT09IERVUExJQ0FURV9LRVlXT1JEIHx8ICgnJyArIGl0ZW1JZCkuc3Vic3RyaW5nKDAsIERVUExJQ0FURV9QUkVGSVgubGVuZ3RoKSA9PT0gRFVQTElDQVRFX1BSRUZJWDtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1NYXAsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGNyZWF0ZVBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBMb2NrVG9rZW4gPSB7aXNGb3JlaWduOiBmYWxzZSwgaWQ6IG51bWJlciwgdG9rZW46IHN0cmluZ30gfCB7aXNGb3JlaWduOiB0cnVlLCBtZXNzYWdlOiBzdHJpbmd9O1xuXG5leHBvcnQgY2xhc3MgTG9ja1NlcnZpY2Uge1xuXG5cdHByaXZhdGUgbG9ja0l0ZW1zOiBJdGVtTWFwPExvY2tUb2tlbj4gPSB7fTtcblx0cHJpdmF0ZSBwcm9taXNlczogSXRlbU1hcDxQcm9taXNlSW50ZXJmYWNlPExvY2tUb2tlbj4+ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGdldExvY2tzICgpOiBMb2NrU2VydmljZVsnbG9ja0l0ZW1zJ10ge1xuXHRcdHJldHVybiB0aGlzLmxvY2tJdGVtcztcblx0fVxuXG5cdHB1YmxpYyBoYXNMb2NrIChsb2NrVG9rZW5JZDogSXRlbUlkKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbG9ja0l0ZW1zID0gdGhpcy5sb2NrSXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGxvY2tJdGVtcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbG9ja0l0ZW1zW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRjb25zdCBsb2NrSXRlbSA9IGxvY2tJdGVtc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0XHRpZiAoIWxvY2tJdGVtLmlzRm9yZWlnbiAmJiBsb2NrSXRlbS5pZCA9PSBsb2NrVG9rZW5JZCkge1xuXHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0Ly8gc2hvdWxkIGJlIGZhc3QgKHdhdGNoZWQpXG5cdHB1YmxpYyBpc0xvY2tlZCAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGxvY2tJdGVtID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMubG9ja0l0ZW1zLFxuXHRcdCk7XG5cblx0XHRpZiAobG9ja0l0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2NrSXRlbS5pc0ZvcmVpZ247XG5cdH1cblxuXHRwdWJsaWMgZ2V0TWVzc2FnZSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IHVuZGVmaW5lZCB8IHN0cmluZyB7XG5cdFx0Y29uc3QgbG9ja0l0ZW0gPSB0aGlzLmdldFZhbHVlKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0KTtcblxuXHRcdGlmIChsb2NrSXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGlmICghbG9ja0l0ZW0uaXNGb3JlaWduKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdHJldHVybiBsb2NrSXRlbS5tZXNzYWdlO1xuXHR9XG5cblx0Ly8gZG9lcyBub3QgcmVqZWN0IHdoZW4gYSBmb3JlaWduIGxvY2sgaXMgZW5jb3VudGVyZWRcblx0Ly8gaXMgYWxzbyB1c2VkIGJ5IGRlbGV0ZUxvY2tcblx0cHVibGljIGZldGNoQ2FjaGVkTG9jayAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IFByb21pc2VJbnRlcmZhY2U8dW5kZWZpbmVkIHwgTG9ja1Rva2VuPiB7XG5cdFx0Y29uc3QgbG9jayA9IHRoaXMuZ2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHQpO1xuXG5cdFx0aWYgKGxvY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihsb2NrKTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9taXNlID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMucHJvbWlzZXMsXG5cdFx0KTtcblxuXHRcdGlmIChwcm9taXNlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBwcm9taXNlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaExvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IGVycm9ySGFuZGxlciA9IHRoaXMuZXJyb3JIYW5kbGVyO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWRMb2NrKGl0ZW1FbnRyeSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRsb2NrSXRlbSA9PiB7XG5cdFx0XHRcdFx0aWYgKGxvY2tJdGVtICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBsb2NrSXRlbTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0TG9jayhpdGVtRW50cnkpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGxvY2tJdGVtID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gbG9ja0l0ZW0uaXNGb3JlaWduID9cblx0XHRcdFx0XHRcdGVycm9ySGFuZGxlci5yZWplY3QobG9ja0l0ZW0ubWVzc2FnZSkgOlxuXHRcdFx0XHRcdFx0bG9ja0l0ZW0udG9rZW47XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlcXVlc3RMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogUHJvbWlzZUludGVyZmFjZTxMb2NrVG9rZW4+IHtcblx0XHRjb25zdCB7aXRlbVR5cGUsIGl0ZW1JZH0gPSBpdGVtRW50cnk7XG5cblx0XHRjb25zdCBwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LmNyZWF0ZShcblx0XHRcdFx0J0xvY2t0b2tlbicsXG5cdFx0XHRcdHRoaXMua2V5U2VydmljZS5nZXRMb2NhbElkKCksXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpdGVtdHlwZTogaXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbTogaXRlbUlkLFxuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wcm9taXNlc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnNldFZhbHVlKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UuZmV0Y2hPYmplY3QoXG5cdFx0XHRcdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZS5saW5rcy5Mb2NrdG9rZW5bMF0sXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3IgPT4ge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnByb21pc2VzW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXG5cdFx0XHRcdFx0aWYgKGVycm9yLmNvZGUgPT09IDMwMSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRoaXMuc2V0VmFsdWUoXG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdGlzRm9yZWlnbjogdHJ1ZSxcblx0XHRcdFx0XHRcdFx0XHRtZXNzYWdlOiBlcnJvci5tZXNzYWdlLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuc2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRwcm9taXNlLFxuXHRcdFx0dGhpcy5wcm9taXNlcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGRlbGV0ZUxvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5mZXRjaENhY2hlZExvY2soaXRlbUVudHJ5KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNhY2hlZExvY2sgPT4ge1xuXHRcdFx0XHRcdC8vIHVuZGVmaW5lZDogbm90IHJlcXVlc3RlZCB5ZXRcblx0XHRcdFx0XHRpZiAoY2FjaGVkTG9jayA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGNhY2hlZExvY2suaXNGb3JlaWduKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmNsZWFyTG9jayhpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdFx0XHRcdC5kZWxldGUoXG5cdFx0XHRcdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHRcdFx0XHRbY2FjaGVkTG9jay5pZF0sXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdHRoaXMuY2xlYXJMb2NrKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY2xlYXJMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgbG9ja0l0ZW1zID0gdGhpcy5sb2NrSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGlmIChsb2NrSXRlbXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWxldGUgbG9ja0l0ZW1zW2l0ZW1FbnRyeS5pdGVtSWRdO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRWYWx1ZTxUPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRtYXA6IEl0ZW1NYXA8VD4sXG5cdCk6IHVuZGVmaW5lZCB8IFQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0aWYgKG1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwW2l0ZW1UeXBlXVtpdGVtRW50cnkuaXRlbUlkXTtcblx0fVxuXG5cdHByaXZhdGUgc2V0VmFsdWU8VD4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4sXG5cdFx0dmFsdWU6IFQsXG5cdFx0bWFwOiBJdGVtTWFwPFQ+LFxuXHQpOiBUIHtcblx0XHRyZXR1cm4gY3JlYXRlUGF0aChcblx0XHRcdG1hcCxcblx0XHRcdFtcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0e30sXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0SXRlbU1hcCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4vVXRpbCc7XG5cbmNvbnN0IEVNUFRZX0VOVFJZID0ge307XG5cbmV4cG9ydCB0eXBlIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCA9IHtcblx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRpdGVtSWQ6IEl0ZW1JZCxcblx0aXRlbXM6IEFwaVJlcXVlc3RJdGVtTWFwXG59O1xuXG5leHBvcnQgY2xhc3MgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblxuXHRwdWJsaWMgcGFyZW50TWFwOiBhbnkgPSB7fTtcblx0cHVibGljIGRlc3RpbmF0aW9uOiBBcGlSZXF1ZXN0SXRlbU1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHByb2Nlc3MgKCk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCB7XG5cdFx0aWYgKHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdBIFRyYW5zYWN0aW9uQ2FjaGUgcm9vdEl0ZW0gaXMgcmVxdWlyZWQgZm9yIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbicpO1xuXHRcdH1cblxuXHRcdHRoaXMucGFyZW50TWFwID0gdGhpcy5jcmVhdGVQYXJlbnRNYXAoKTtcblxuXHRcdHRoaXMucHJvY2Vzc0l0ZW1zKFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5yb290SXRlbS5pdGVtVHlwZSxcblx0XHRcdFt0aGlzLnRyYW5zYWN0aW9uLnJvb3RJdGVtXSxcblx0XHRcdHt9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0aXRlbVR5cGU6IHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQ6IHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbUlkLFxuXHRcdFx0aXRlbXM6IHRoaXMuZGVzdGluYXRpb24sXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlUGFyZW50TWFwICgpIHtcblx0XHRjb25zdCByZXN1bHQ6IHtcblx0XHRcdFtwYXJlbnRUeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtwYXJlbnRJZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj5cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gPSB7fTtcblxuXHRcdC8vIHRvZG86IGFsc28gaW5jbHVkZSBwYXJlbnQncyBlbnRyaWVzID8gcHJvYmFibHkgbm90Li4uXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblx0XHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHQvLyB3ZSBkb24ndCBjYXJlIGZvciBpdGVtcyB0aGF0IGFyZSBub3QgbGlua2VkIHRvIHRoZSByb290IGl0ZW1cblx0XHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHBhcmVudFR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRcdGNvbnN0IHBhcmVudElkID0gcGFyZW50Lml0ZW1JZDtcblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV0gPSB7fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdW3BhcmVudElkXVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJlc3VsdFtwYXJlbnRUeXBlXVtwYXJlbnRJZF1baXRlbVR5cGVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdW2l0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzSXRlbXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0bGlua0FjY3VtdWxhdG9yOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXX0sXG5cdCkge1xuXHRcdGlmICh0aGlzLmRlc3RpbmF0aW9uW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmRlc3RpbmF0aW9uW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdGlmIChsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGxpbmtBY2N1bXVsYXRvcltpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblxuXHRcdFx0Ly8gZWFjaCBpdGVtIG9ubHkgaGFzIGEgc2luZ2xlIHBhcmVudCwgc28gd2UgY2FuIHNhZmVseSBkbyB0aGlzXG5cdFx0XHRpZiAodGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV1baXRlbUlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdLnB1c2goaXRlbUlkKTtcblxuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV1baXRlbUlkXSA9IHRoaXMucHJvY2Vzc0l0ZW0oaXRlbUVudHJ5KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0KToge3ZhbHVlcz86IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sIGxpbmtzPzoge1tpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW119fSB7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBpdGVtRW50cnkuaXRlbVR5cGU7XG5cdFx0Y29uc3QgaXRlbUlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblx0XHRjb25zdCBjaGlsZEl0ZW1zID0gdGhpcy5nZXRJdGVtc0J5UGFyZW50KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoaWxkQ29sbGVjdGlvbnMgPSB0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0Q29sbGVjdGlvbnNCeVBhcmVudChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmZvcm1hdFJlcXVlc3QoaXRlbUVudHJ5KTtcblx0XHRjb25zdCBsaW5rcyA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZFR5cGUgaW4gY2hpbGRJdGVtcykge1xuXHRcdFx0dGhpcy5wcm9jZXNzSXRlbXMoXG5cdFx0XHRcdGNoaWxkVHlwZSxcblx0XHRcdFx0Y2hpbGRJdGVtc1tjaGlsZFR5cGVdLFxuXHRcdFx0XHRsaW5rcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnkgb2YgY2hpbGRDb2xsZWN0aW9ucykge1xuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLnF1ZXJ5ICE9PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnByb2Nlc3NJdGVtcyhcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBVc2UgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseVxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF0sXG5cdFx0XHRcdGxpbmtzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBoYXNWYWx1ZXMgPSBoYXNQcm9wZXJ0aWVzKHZhbHVlcyk7XG5cdFx0Y29uc3QgaGFzTGlua3MgPSBoYXNQcm9wZXJ0aWVzKGxpbmtzKTtcblxuXHRcdGlmIChoYXNWYWx1ZXMgJiYgaGFzTGlua3MpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHZhbHVlczogdmFsdWVzLFxuXHRcdFx0XHRsaW5rczogbGlua3MsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNWYWx1ZXMpIHtcblx0XHRcdHJldHVybiB7dmFsdWVzOiB2YWx1ZXN9O1xuXHRcdH1cblxuXHRcdGlmIChoYXNMaW5rcykge1xuXHRcdFx0cmV0dXJuIHtsaW5rczogbGlua3N9O1xuXHRcdH1cblxuXHRcdHJldHVybiBFTVBUWV9FTlRSWTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0SXRlbXNCeVBhcmVudCAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0KSB7XG5cdFx0Y29uc3QgbWFwRW50cnkgPSB0aGlzLnBhcmVudE1hcFtwYXJlbnRUeXBlXTtcblxuXHRcdGlmIChtYXBFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXG5cdFx0aWYgKG1hcEVudHJ5W3BhcmVudElkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcEVudHJ5W3BhcmVudElkXTtcblx0fVxufVxuIiwiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzLCBpbkFycmF5IH0gZnJvbSAnLi9VdGlsJztcblxuY29uc3QgTUFZQkUgPSAnbWF5YmUnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlNYXRjaGVyIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRwdWJsaWMgZmllbGRzOiBGaWVsZE1hcCxcblx0XHRwdWJsaWMgcGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsLFxuXHQpIHtcblxuXHR9XG5cblx0cHJpdmF0ZSBjb21wYXJlVmFsdWVzIChcblx0XHR2YWx1ZTogYW55LFxuXHRcdHF1ZXJ5VmFsdWU6IGFueSxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKG1vbWVudC5pc01vbWVudChxdWVyeVZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmNvbXBhcmVNb21lbnRPYmplY3RzKFxuXHRcdFx0XHRxdWVyeVZhbHVlLFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1vbWVudC5pc0R1cmF0aW9uKHF1ZXJ5VmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuY29tcGFyZUR1cmF0aW9ucyhcblx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0cmV0dXJuIHF1ZXJ5VmFsdWUgPT0gdmFsdWU7XG5cdH1cblxuXHRtYXRjaFF1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0aWYgKHF1ZXJ5LnNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LmN1c3RvbSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0Ly8gbGlua2VkVG8gYWxzbyBjb250YWlucyAucXVlcnlcblx0XHRpZiAocXVlcnkubGlua2VkVG8gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubWF0Y2hMaW5rZWRUb1F1ZXJ5KHF1ZXJ5KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkucXVlcnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIE1BWUJFO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5jb25kaXRpb25zICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoQ29tcGxleFF1ZXJ5KHF1ZXJ5KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkua2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHRoaXMuZmllbGRzW3F1ZXJ5LmtleV0sXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMocXVlcnkpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5TWF0Y2hlcjogVW5zdXBwb3J0ZWQgcXVlcnkhIFBhcnNlZD8nKTtcblx0fVxuXG5cdHByaXZhdGUgbWF0Y2hMaW5rZWRUb1F1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0aWYgKHF1ZXJ5LnJldmVyc2UpIHtcblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblx0XHRsZXQgbWF0Y2g7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRtYXRjaCA9IGZhbHNlO1xuXHRcdH0gZWxzZSBpZiAocXVlcnkubGlua2VkVG8gIT09IHBhcmVudC5pdGVtVHlwZSkge1xuXHRcdFx0bWF0Y2ggPSBmYWxzZTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0bWF0Y2ggPSB0aGlzLm1hdGNoU2ltcGxlUXVlcnkoXG5cdFx0XHRcdHBhcmVudC5pdGVtSWQsXG5cdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAobWF0Y2ggPT09IE1BWUJFKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFtYXRjaCA6ICEhbWF0Y2g7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoQ29tcGxleFF1ZXJ5IChxdWVyeTogQXBpUXVlcnkpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0Y29uc3QgY29uZGl0aW9ucyA9IHF1ZXJ5LmNvbmRpdGlvbnM7XG5cblx0XHRsZXQgcmVzdWx0O1xuXHRcdGxldCB0ZXJtaW5hbDtcblxuXHRcdHN3aXRjaCAocXVlcnkub3BlcmF0b3IpIHtcblx0XHRcdGNhc2UgJ0FORCc6XG5cdFx0XHRcdHJlc3VsdCA9IHRydWU7XG5cdFx0XHRcdHRlcm1pbmFsID0gZmFsc2U7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSAnT1InOlxuXHRcdFx0XHRyZXN1bHQgPSBmYWxzZTtcblx0XHRcdFx0dGVybWluYWwgPSB0cnVlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigncXVlcnlNYXRjaGVyOiBVbnN1cHBvcnRlZCBvcGVyYXRvcicpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdGNvbnN0IG1hdGNoID0gdGhpcy5tYXRjaFF1ZXJ5KGNvbmRpdGlvbik7XG5cblx0XHRcdGlmIChtYXRjaCA9PT0gdGVybWluYWwpIHtcblx0XHRcdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICF0ZXJtaW5hbCA6IHRlcm1pbmFsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAobWF0Y2ggPT09IE1BWUJFKSB7XG5cdFx0XHRcdHJlc3VsdCA9IE1BWUJFO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChyZXN1bHQgPT09IE1BWUJFKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFyZXN1bHQgOiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoU2ltcGxlUXVlcnkgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHQpOiBib29sZWFuIHwgJ21heWJlJyB7XG5cdFx0Y29uc3Qga2V5ID0gcXVlcnkua2V5O1xuXHRcdGxldCBxdWVyeVZhbHVlID0gcXVlcnkudmFsdWU7XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMocXVlcnkpKSAvLyBDb3VsZCBiZSBsaW5rZWRUbyBhbiBlbXB0eSBvYmplY3Rcblx0XHR7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHQnUmVxdWlyZWQgZmllbGQnLFxuXHRcdFx0XHRrZXksXG5cdFx0XHRcdCdub3QgZm91bmQgZm9yJyxcblx0XHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdCk7XG5cblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnlWYWx1ZSA9PT0gJ05PVycpIHtcblx0XHRcdHF1ZXJ5VmFsdWUgPSBtb21lbnQoKTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKHF1ZXJ5LmNvbXBhcmF0b3IpIHtcblx0XHRcdGNhc2UgJz0nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlVmFsdWVzKFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICchPSc6XG5cdFx0XHRcdHJldHVybiAhdGhpcy5jb21wYXJlVmFsdWVzKFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICc8Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIDwgcXVlcnlWYWx1ZTtcblx0XHRcdGNhc2UgJzw9Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlIDw9IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICc+Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID4gcXVlcnlWYWx1ZTtcblx0XHRcdGNhc2UgJz49Jzpcblx0XHRcdFx0cmV0dXJuIHZhbHVlID49IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICdJTic6XG5cdFx0XHRcdC8vIE9ubHkgSU4gc3VwcG9ydHMgTk9ULCBhbGwgb3RoZXIgY29tcGFyYXRvcnMgYXJlIGZsaXBwZWQgaW4gdGhlIFF1ZXJ5UGFyc2VyXG5cdFx0XHRcdGNvbnN0IHJlcyA9IGluQXJyYXkoXG5cdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRyZXR1cm4gcXVlcnkubm90ID8gIXJlcyA6IHJlcztcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcigncXVlcnlNYXRjaGVyOiBVbnN1cHBvcnRlZCBjb21wYXJhdG9yOiAnICsgcXVlcnkuY29tcGFyYXRvciArICcgaW4gcXVlcnkgJyArIHF1ZXJ5KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ09NUEFSQVRPUlMsIE9QRVJBVE9SUywgT1BFUkFUT1JTX1RZUEUsIFF1ZXJ5UGFyc2VyQmFzZSB9IGZyb20gJy4vUXVlcnlQYXJzZXJCYXNlJztcblxuZXhwb3J0IGVudW0gQ09OU1RBTlRTIHtcblx0T0JKID0gMCxcblx0U1RSID0gMSxcblx0U0VQID0gJzonXG59XG5cbmNvbnN0IFZBTElEX0NPTVBBUkFUT1JTID0gT2JqZWN0LmtleXMoQ09NUEFSQVRPUlMpXG5cdC5tYXAoXG5cdFx0a2V5ID0+IENPTVBBUkFUT1JTW2tleV0sXG5cdCk7XG5cbmV4cG9ydCB0eXBlIENPTVBBUkFUT1JTX1RZUEUgPSAnPScgfCAnIT0nIHwgJzwnIHwgJz4nIHwgJzw9JyB8ICc+PScgfCAnSU4nIHwgQ09NUEFSQVRPUlM7XG5cbmNvbnN0IE9QUE9TSVRFX0NPTVBBUkFUT1JfTUFQOiB7IFtrZXkgaW4gQ09NUEFSQVRPUlNdOiBDT01QQVJBVE9SUyB9ID0ge1xuXHRbQ09NUEFSQVRPUlMuRVFVQUxTXTogQ09NUEFSQVRPUlMuTk9UX0VRVUFMUyxcblx0W0NPTVBBUkFUT1JTLk5PVF9FUVVBTFNdOiBDT01QQVJBVE9SUy5FUVVBTFMsXG5cdFtDT01QQVJBVE9SUy5NT1JFX1RIQU5dOiBDT01QQVJBVE9SUy5MRVNTX09SX0VRVUFMX1RIQU4sXG5cdFtDT01QQVJBVE9SUy5MRVNTX1RIQU5dOiBDT01QQVJBVE9SUy5FUVVBTF9PUl9NT1JFX1RIQU4sXG5cdFtDT01QQVJBVE9SUy5MRVNTX09SX0VRVUFMX1RIQU5dOiBDT01QQVJBVE9SUy5NT1JFX1RIQU4sXG5cdFtDT01QQVJBVE9SUy5FUVVBTF9PUl9NT1JFX1RIQU5dOiBDT01QQVJBVE9SUy5MRVNTX1RIQU4sXG5cdC8vIEluIHVzZXMgJ25vdDogdHJ1ZScgaW5zdGVhZCBvZiByZXZlcnNpbmcgdGhlIHF1ZXJ5XG5cdFtDT01QQVJBVE9SUy5JTl06IENPTVBBUkFUT1JTLklOLFxufTtcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UGFyc2VyXG5cdGV4dGVuZHMgUXVlcnlQYXJzZXJCYXNlPFtvYmplY3QsIHN0cmluZ10+IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdHByaXZhdGUgcGFyYW1ldGVyczogb2JqZWN0LFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdHF1ZXJ5LFxuXHRcdCk7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VFbXB0eVF1ZXJ5ICgpIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e30sXG5cdFx0XHQne30nLFxuXHRcdF0gYXMgW29iamVjdCwgc3RyaW5nXTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVN1YlF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRzdWJRdWVyeTogb2JqZWN0LFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMucGFyc2Uoc3ViUXVlcnkpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHRxdWVyeTogcGFyc2VkUXVlcnlbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyAnc3ViJyArIENPTlNUQU5UUy5TRVAgKyBrZXkgKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUXVlcnlbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJGaWVsZFF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyA9ICcnLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSA9ICcnLFxuXHRcdGZpZWxkOiBzdHJpbmcgPSAnJyxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGNvbnN0IHBhcnNlZFF1ZXJ5ID0gdGhpcy5wYXJzZShxdWVyeSk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRrZXksXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0cXVlcnk6IHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuXHRcdFx0J1snICsgJ3N1YkZpZWxkJyArIENPTlNUQU5UUy5TRVAgKyBrZXkgKyBDT05TVEFOVFMuU0VQICsgaXRlbVR5cGUgKyBDT05TVEFOVFMuU0VQICsgZmllbGQgKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUXVlcnlbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTZWFyY2hRdWVyeSAoXG5cdFx0dmFsdWU6IGFueSxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0dmFsdWUgPSB0aGlzLmZvcm1hdFZhbHVlKHZhbHVlKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdHNlYXJjaDogdmFsdWVbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyAnc2VhcmNoJyArIENPTlNUQU5UUy5TRVAgKyB2YWx1ZVtDT05TVEFOVFMuU1RSXSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUN1c3RvbVF1ZXJ5IChcblx0XHRjdXN0b206IHN0cmluZyxcblx0XHRwYXJhbWV0ZXJzOiBhbnksXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGlmIChwYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBbXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjdXN0b20sXG5cdFx0XHRcdFx0bm90LFxuXHRcdFx0XHR9LFxuXHRcdFx0XHQnWycgKyBjdXN0b20gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdFx0XTtcblx0XHR9XG5cblx0XHRjb25zdCBwYXJzZWRQYXJhbWV0ZXJzID0gdGhpcy5wYXJzZUN1c3RvbVBhcmFtZXRlcnMocGFyYW1ldGVycyk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRjdXN0b20sXG5cdFx0XHRcdHBhcmFtZXRlcnM6IHBhcnNlZFBhcmFtZXRlcnNbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyBjdXN0b20gKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUGFyYW1ldGVyc1tDT05TVEFOVFMuU1RSXSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUN1c3RvbVBhcmFtZXRlcnMgKHBhcmFtZXRlcnM6IGFueSk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhwYXJhbWV0ZXJzKVxuXHRcdFx0LnNvcnQoKTtcblxuXHRcdGNvbnN0IHF1ZXJ5OiBBcGlRdWVyeSA9IHt9IGFzIEFwaVF1ZXJ5O1xuXHRcdGxldCBzdHJpbmcgPSAnJztcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3Qga2V5ID0ga2V5c1tpXTtcblx0XHRcdGNvbnN0IHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZShwYXJhbWV0ZXJzW2tleV0pO1xuXG5cdFx0XHRxdWVyeVtrZXldID0gdmFsdWVbQ09OU1RBTlRTLk9CSl07XG5cblx0XHRcdGlmIChpID4gMCkge1xuXHRcdFx0XHRzdHJpbmcgKz0gQ09OU1RBTlRTLlNFUDtcblx0XHRcdH1cblxuXHRcdFx0c3RyaW5nICs9IHZhbHVlW0NPTlNUQU5UUy5TVFJdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbXG5cdFx0XHRxdWVyeSxcblx0XHRcdHN0cmluZyxcblx0XHRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2ltcGxlUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0Y29tcGFyYXRvcj86IENPTVBBUkFUT1JTX1RZUEUsXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSk7XG5cblx0XHRpZiAoY29tcGFyYXRvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb21wYXJhdG9yID0gQXJyYXkuaXNBcnJheSh2YWx1ZVtDT05TVEFOVFMuT0JKXSkgPyBDT01QQVJBVE9SUy5JTiA6IENPTVBBUkFUT1JTLkVRVUFMUztcblx0XHR9XG5cblx0XHRpZiAoVkFMSURfQ09NUEFSQVRPUlMuaW5kZXhPZihjb21wYXJhdG9yKSA9PT0gLTEpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgVW5rbm93biBjb21wYXJhdG9yICcke2NvbXBhcmF0b3J9JywgaXQgbWlnaHQgYmUgdGhhdCB0aGUgYmFja2VuZCBzdXBwb3J0cyBpdCBidXQgdGhlIGZyb250ZW5kIGRvZXNuJ3QgIWApO1xuXHRcdH1cblxuXHRcdGlmIChub3QpIHtcblx0XHRcdGNvbXBhcmF0b3IgPSBPUFBPU0lURV9DT01QQVJBVE9SX01BUFtjb21wYXJhdG9yXTtcblx0XHR9XG5cblx0XHQvLyBBbGwgb3RoZXIgY29tcGFyYXRvcnMgY2FuIGJlIGludmVydGVkXG5cdFx0Y29uc3QgaXNOb3RJbiA9IGNvbXBhcmF0b3IgPT09IENPTVBBUkFUT1JTLklOICYmIG5vdDtcblxuXHRcdGNvbnN0IHJlc3VsdDogW29iamVjdCwgc3RyaW5nXSA9IFtcblx0XHRcdHtcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHR2YWx1ZTogdmFsdWVbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdGNvbXBhcmF0b3IsXG5cdFx0XHRcdG5vdDogaXNOb3RJbixcblx0XHRcdH0sXG5cdFx0XHQnWycgKyBjb21wYXJhdG9yICsgQ09OU1RBTlRTLlNFUCArIGtleSArIENPTlNUQU5UUy5TRVAgKyB2YWx1ZVtDT05TVEFOVFMuU1RSXSArICddJyxcblx0XHRdO1xuXG5cdFx0aWYgKGlzTm90SW4pIHtcblx0XHRcdHJlc3VsdFsxXSA9IHJlc3VsdFsxXS5zbGljZShcblx0XHRcdFx0MCxcblx0XHRcdFx0LTEsXG5cdFx0XHQpO1xuXHRcdFx0cmVzdWx0WzFdICs9IENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXSc7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUxpbmtlZFRvUXVlcnkgKFxuXHRcdGxpbmtlZFRvOiBhbnksXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5ID0ge30gYXMgQXBpUXVlcnksXG5cdFx0cmV2ZXJzZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMucGFyc2UocXVlcnkpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0bGlua2VkVG86IGxpbmtlZFRvLFxuXHRcdFx0XHRxdWVyeTogcGFyc2VkUXVlcnlbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdHJldmVyc2U6IHJldmVyc2UsXG5cdFx0XHRcdG5vdDogbm90LFxuXHRcdFx0fSxcblx0XHRcdCdbJyArICdsaW5rZWRUbycgKyBDT05TVEFOVFMuU0VQICsgbGlua2VkVG8gKyBDT05TVEFOVFMuU0VQICsgcGFyc2VkUXVlcnlbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgcmV2ZXJzZSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUNvbXBsZXhRdWVyeSAoXG5cdFx0Y29uZGl0aW9uczogYW55W10sXG5cdFx0b3BlcmF0b3I6IE9QRVJBVE9SU19UWVBFID0gT1BFUkFUT1JTLkFORCxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0b3BlcmF0b3IgPSBvcGVyYXRvci50b1VwcGVyQ2FzZSgpIGFzIE9QRVJBVE9SUztcblxuXHRcdGNvbnN0IHBhcnNlZENvbmRpdGlvbnMgPSB0aGlzLnBhcnNlQ29uZGl0aW9ucyhjb25kaXRpb25zKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGNvbmRpdGlvbnM6IHBhcnNlZENvbmRpdGlvbnNbQ09OU1RBTlRTLk9CSl0sXG5cdFx0XHRcdG9wZXJhdG9yLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgb3BlcmF0b3IgKyBwYXJzZWRDb25kaXRpb25zW0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRdO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZUNvbmRpdGlvbnMgKGNvbmRpdGlvbnM6IGFueVtdKTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0bGV0IHBhcnNlZENvbmRpdGlvbnM6IEFycmF5PFtvYmplY3QsIHN0cmluZ10+ID0gW107XG5cdFx0Y29uc3QgcXVlcnk6IG9iamVjdFtdID0gW107XG5cdFx0bGV0IHN0cmluZyA9ICcnO1xuXG5cdFx0Zm9yIChjb25zdCBjb25kaXRpb24gb2YgY29uZGl0aW9ucykge1xuXHRcdFx0cGFyc2VkQ29uZGl0aW9ucy5wdXNoKHRoaXMucGFyc2UoY29uZGl0aW9uKSk7XG5cdFx0fVxuXG5cdFx0cGFyc2VkQ29uZGl0aW9ucyA9IHBhcnNlZENvbmRpdGlvbnMuc29ydCgoXG5cdFx0XHRhLFxuXHRcdFx0Yixcblx0XHQpID0+IHRoaXMuY29tcGFyZVBhcnNlZFF1ZXJpZXMoXG5cdFx0XHRhLFxuXHRcdFx0Yixcblx0XHQpKTtcblxuXHRcdGZvciAoY29uc3QgcGFyc2VkQ29uZGl0aW9uIG9mIHBhcnNlZENvbmRpdGlvbnMpIHtcblx0XHRcdHF1ZXJ5LnB1c2gocGFyc2VkQ29uZGl0aW9uW0NPTlNUQU5UUy5PQkpdKTtcblx0XHRcdHN0cmluZyArPSBwYXJzZWRDb25kaXRpb25bQ09OU1RBTlRTLlNUUl07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHF1ZXJ5LFxuXHRcdFx0c3RyaW5nLFxuXHRcdF07XG5cdH1cblxuXHRwcml2YXRlIGZvcm1hdFZhbHVlPFQ+ICh2YWx1ZTogVCk6IFtULCBzdHJpbmddIHtcblx0XHRsZXQgcHJvY2Vzc2VkVmFsdWU7XG5cblx0XHRpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5jaGFyQXQoMCkgPT09ICcmJykge1xuXHRcdFx0Y29uc3Qga2V5ID0gdmFsdWUuc3Vic3RyaW5nKDEpO1xuXG5cdFx0XHR2YWx1ZSA9IHRoaXMucGFyYW1ldGVyc1trZXldO1xuXG5cdFx0XHRpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5UGFyc2VyOiBVbmRlZmluZWQgdGVtcGxhdGUgcGFyYW1ldGVyIFxcJycgKyBrZXkgKyAnXFwnJyk7XG5cdFx0XHR9XG5cblx0XHRcdHByb2Nlc3NlZFZhbHVlID0gdGhpcy5wcm9jZXNzVmFsdWUodmFsdWUpO1xuXG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRwcm9jZXNzZWRWYWx1ZSxcblx0XHRcdFx0a2V5ICsgJz4nICsgdmFsdWUsXG5cdFx0XHRdO1xuXHRcdH1cblxuXHRcdHByb2Nlc3NlZFZhbHVlID0gdGhpcy5wcm9jZXNzVmFsdWUodmFsdWUpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHByb2Nlc3NlZFZhbHVlLFxuXHRcdFx0JycgKyBwcm9jZXNzZWRWYWx1ZSxcblx0XHRdO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzVmFsdWU8VD4gKHZhbHVlOiBUW10pOiBUW107XG5cdHByaXZhdGUgcHJvY2Vzc1ZhbHVlICh2YWx1ZTogbW9tZW50Lk1vbWVudCk6IG1vbWVudC5Nb21lbnQ7XG5cdHByaXZhdGUgcHJvY2Vzc1ZhbHVlICh2YWx1ZTogbW9tZW50LkR1cmF0aW9uKTogbW9tZW50LkR1cmF0aW9uO1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZTxUPiAodmFsdWU6IFQpOiBUO1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZTxUPiAodmFsdWU6IFQgfCBUW10gfCBtb21lbnQuTW9tZW50IHwgbW9tZW50LkR1cmF0aW9uKSB7XG5cdFx0Ly8gYWxnb3JpdGhtIGlzIG5vdCBpbXBvcnRhbnQsIGFzIGxvbmcgYXMgYWxsIGFycmF5cyBhcmUgc29ydGVkIHRoZSBzYW1lIHdheVxuXHRcdGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHZhbHVlXG5cdFx0XHRcdC5zbGljZSgpXG5cdFx0XHRcdC5zb3J0KCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1vbWVudC5pc01vbWVudCh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBtb21lbnQodmFsdWUpO1xuXHRcdH1cblxuXHRcdGlmIChtb21lbnQuaXNEdXJhdGlvbih2YWx1ZSkpIHtcblx0XHRcdHJldHVybiBtb21lbnQuZHVyYXRpb24odmFsdWUpO1xuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fVxuXG5cdHByaXZhdGUgY29tcGFyZVBhcnNlZFF1ZXJpZXMgKFxuXHRcdGE6IFtvYmplY3QsIHN0cmluZ10sXG5cdFx0YjogW29iamVjdCwgc3RyaW5nXSxcblx0KSB7XG5cdFx0aWYgKGFbQ09OU1RBTlRTLlNUUl0gPT09IGJbQ09OU1RBTlRTLlNUUl0pIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHJldHVybiBhW0NPTlNUQU5UUy5TVFJdID4gYltDT05TVEFOVFMuU1RSXSA/IDEgOiAtMTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpUXVlcnksIEVudHJ5UGFyZW50TnVsbCwgSXRlbUlkIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ09NUEFSQVRPUlMsIE9QRVJBVE9SUyB9IGZyb20gJy4vUXVlcnlQYXJzZXJCYXNlJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5U2VydmljZSB7XG5cdGNvbnN0cnVjdG9yICgpIHtcblx0fVxuXG5cdGFkZEFuZENvbmRpdGlvbiAoXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGNvbmRpdGlvbjogQXBpUXVlcnksXG5cdCk6IEFwaVF1ZXJ5IHtcblx0XHRpZiAocXVlcnkuY29uZGl0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHF1ZXJ5Lm9wZXJhdG9yID09PSBPUEVSQVRPUlMuT1IpIHtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNvbmRpdGlvbnM6IFtcblx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHRcdF0sXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgYW4gJ2FuZCcgY29uZGl0aW9uXG5cdFx0cmV0dXJuIHtjb25kaXRpb25zOiBxdWVyeS5jb25kaXRpb25zLmNvbmNhdChjb25kaXRpb24pfTtcblx0fVxuXG5cdGFkZE9yQ29uZGl0aW9uIChcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0Y29uZGl0aW9uOiBBcGlRdWVyeSxcblx0KTogQXBpUXVlcnkge1xuXHRcdGlmIChxdWVyeS5vcGVyYXRvciA9PT0gT1BFUkFUT1JTLk9SKSB7XG5cdFx0XHRyZXR1cm4ge2NvbmRpdGlvbnM6IHF1ZXJ5LmNvbmRpdGlvbnMuY29uY2F0KGNvbmRpdGlvbil9O1xuXHRcdH1cblxuXHRcdC8vIHdlIGhhdmUgYW4gJ2FuZCcgY29uZGl0aW9uXG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbmRpdGlvbnM6IFtcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdGNvbmRpdGlvbixcblx0XHRcdF0sXG5cdFx0XHRvcGVyYXRvcjogT1BFUkFUT1JTLk9SLFxuXHRcdH07XG5cdH1cblxuXHRhZGRQYXJlbnRDb25kaXRpb24gKFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KTogQXBpUXVlcnkge1xuXHRcdGxldCBsaW5rZWRUb1F1ZXJ5O1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHF1ZXJ5O1xuXHRcdH1cblxuXHRcdGxpbmtlZFRvUXVlcnkgPSB7XG5cdFx0XHRsaW5rZWRUbzogcGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0cXVlcnk6IHBhcmVudC5pdGVtSWQsXG5cdFx0fTtcblxuXHRcdHJldHVybiBxdWVyeSA9PT0gbnVsbCA/IGxpbmtlZFRvUXVlcnkgOiB0aGlzLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdHF1ZXJ5LFxuXHRcdFx0bGlua2VkVG9RdWVyeSxcblx0XHQpO1xuXHR9XG5cblx0Y3JlYXRlTm90SW4gKGlkQXJyYXk6IEl0ZW1JZFtdKSB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGNvbXBhcmF0b3I6IENPTVBBUkFUT1JTLklOLFxuXHRcdFx0a2V5OiAnaWQnLFxuXHRcdFx0dmFsdWU6IGlkQXJyYXksXG5cdFx0XHRub3Q6IHRydWVcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQsIENvbHVtblV0aWwgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxudHlwZSBSZXF1ZXN0Q29sdW1uTWFwID0ge1tpdGVtVHlwZTogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbnN9O1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB7XG5cdHByaXZhdGUgY29sdW1uczogUmVxdWVzdENvbHVtbk1hcCA9IHt9O1xuXHRwcml2YXRlIGNvbHVtblNldElkTWFwOiB7W2NvbHVtblNldElkOiBudW1iZXJdOiBib29sZWFufSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcblxuXHRcdGlmIChjb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IFtdO1xuXHRcdH1cblxuXHRcdGNvbHVtbnNbaXRlbVR5cGVdID0gdGhpcy5jb2x1bW5VdGlsXG5cdFx0XHQubWVyZ2VSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0Lm1lcmdlZDtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmQ8VCBleHRlbmRzIENvbHVtblNldDxJdGVtVHlwZT4+IChjb2x1bW5TZXQ6IFQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5jb2x1bW5TZXRJZE1hcFtjb2x1bW5TZXQuaWRdKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbHVtblNldC5pdGVtVHlwZTtcblxuXHRcdGlmIChjb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IFtdO1xuXHRcdH1cblxuXHRcdGNvbHVtbnNbaXRlbVR5cGVdID0gdGhpcy5jb2x1bW5VdGlsXG5cdFx0XHQubWVyZ2VSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdGNvbHVtblNldC5yZXF1ZXN0LFxuXHRcdFx0KVxuXHRcdFx0Lm1lcmdlZDtcblxuXHRcdHRoaXMuY29sdW1uU2V0SWRNYXBbY29sdW1uU2V0LmlkXSA9IHRydWU7XG5cdH1cblxuXHRwdWJsaWMgZ2V0ICgpOiBSZXF1ZXN0Q29sdW1uTWFwIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5zO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LCBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25NYXRjaFJlc3VsdCxcblx0RmllbGRNYXAsXG5cdEZ1bmN0aW9uQ2hhbmdlc1Jlc29sdmVTb2NrZXRNZXNzYWdlLFxuXHRJdGVtSWQsXG5cdEl0ZW1UeXBlLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRSZXNwb25zZUNvbHVtbixcblx0U29ja2V0TWVzc2FnZSxcblx0U29ja2V0TWVzc2FnZUNyZWF0ZSxcblx0U29ja2V0TWVzc2FnZURlbGV0ZSxcblx0U29ja2V0TWVzc2FnZUxpbmtUbyxcblx0U29ja2V0TWVzc2FnZVVwZGF0ZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IFJlcXVlc3RCdWZmZXJNYW5hZ2VyIH0gZnJvbSAnLi9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5cbmV4cG9ydCB0eXBlIFNvY2tldENvbGxlY3Rpb25NYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge1tpdGVtSWQ6IG51bWJlcl06IENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGU+fTtcblxuZXhwb3J0IGNsYXNzIFNvY2tldE1lc3NhZ2VIYW5kbGVyIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSByZXF1ZXN0QnVmZmVyTWFuYWdlcjogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5OiBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgb25NZXNzYWdlUmVjZWl2ZWQgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2UpOiBhbnkge1xuXHRcdHN3aXRjaCAobWVzc2FnZS5ib2R5LmV2ZW50VHlwZSkge1xuXHRcdFx0Y2FzZSAndXBkYXRlJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuaGFuZGxlVXBkYXRlKG1lc3NhZ2UpO1xuXHRcdFx0Y2FzZSAnY3JlYXRlJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuaGFuZGxlQ3JlYXRlKG1lc3NhZ2UpO1xuXHRcdFx0Y2FzZSAnZGVsZXRlJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuaGFuZGxlRGVsZXRlKG1lc3NhZ2UpO1xuXHRcdFx0Y2FzZSAnbGlua1RvJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuaGFuZGxlTGlua01vdmUobWVzc2FnZSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBmb3JtYXRNZXNzYWdlVmFsdWVzIChcblx0XHR2YWx1ZXM6IGFueSxcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbltdLFxuXHQpOiBGaWVsZE1hcCB7XG5cdFx0Y29uc3QgcmVzdWx0OiBGaWVsZE1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBjb2x1bW5zKSB7XG5cdFx0XHRyZXN1bHRbY29sdW1uSWRdID0gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVzcG9uc2VWYWx1ZShcblx0XHRcdFx0Y29sdW1uc1tjb2x1bW5JZF0udHlwZSxcblx0XHRcdFx0dmFsdWVzW2NvbHVtbklkXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvbk1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbXM6IHtbaXRlbUlkOiBudW1iZXJdOiBhbnl9LFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uW10sXG5cdCk6IFNvY2tldENvbGxlY3Rpb25NYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3Qgc2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCk7XG5cdFx0Y29uc3QgcmVzdWx0OiBTb2NrZXRDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZT4gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGl0ZW1zKSB7XG5cdFx0XHRjb25zdCBpdGVtID0gaXRlbXNbaXRlbUlkXTtcblx0XHRcdGNvbnN0IHBhcmVudCA9IGl0ZW0ucGFyZW50ICE9PSBudWxsID8gaXRlbS5wYXJlbnQgOiB7fTtcblx0XHRcdGNvbnN0IHZhbHVlcyA9IHRoaXMuZm9ybWF0TWVzc2FnZVZhbHVlcyhcblx0XHRcdFx0aXRlbS52YWx1ZXMsXG5cdFx0XHRcdGNvbHVtbnMsXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXN1bHRbaXRlbUlkXSA9IHNlcnZlckNhY2hlLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlGaXR0aW5nSXRlbShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHZhbHVlcyxcblx0XHRcdFx0cGFyZW50LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRSZXF1ZXN0Q29sdW1uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sbGVjdGlvbk1hcDogU29ja2V0Q29sbGVjdGlvbk1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0XHRjb25zdCBzZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKTtcblx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gY29sbGVjdGlvbk1hcCkge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbnMgPSBjb2xsZWN0aW9uTWFwW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBmaXR0aW5nQ29sbGVjdGlvbnMgPSBjb2xsZWN0aW9ucy5maXR0aW5nO1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGZpdHRpbmdDb2xsZWN0aW9uIG9mIGZpdHRpbmdDb2xsZWN0aW9ucykge1xuXHRcdFx0XHRjb2x1bW5FeHBhbnNpb24uZXhwYW5kKGZpdHRpbmdDb2xsZWN0aW9uLmNvbHVtbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLmV4cGFuZChpdGVtRW50cnkuY29sdW1ucyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbHVtbkV4cGFuc2lvbi5nZXQoKTtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc01lc3NhZ2U8VCBleHRlbmRzIFNvY2tldE1lc3NhZ2VbJ2JvZHknXT4gKFxuXHRcdGJvZHk6IFQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gYm9keS5pdGVtVHlwZTtcblx0XHRjb25zdCByZXF1ZXN0SWRzOiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hcCA9IHRoaXMuY3JlYXRlQ29sbGVjdGlvbk1hcChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Ym9keS5pdGVtc1tpdGVtVHlwZV0sXG5cdFx0XHRib2R5LmNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdCk7XG5cblx0XHRjb25zdCByZXF1ZXN0Q29sdW1ucyA9IHRoaXMuZ2V0UmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25NYXAsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkU3RyaW5nIGluIGNvbGxlY3Rpb25NYXApIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkU3RyaW5nLFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgaXRlbUlkID0gK2l0ZW1JZFN0cmluZztcblxuXHRcdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlcXVlc3RJZHMucHVzaChpdGVtSWQpO1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY29sbGVjdGlvbk1hcFtpdGVtSWRdLmZpdHRpbmcubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0SWRzLnB1c2goaXRlbUlkKTtcblx0XHR9XG5cblx0XHRpZiAocmVxdWVzdElkcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlclxuXHRcdFx0LmZldGNoQnlJZHMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXF1ZXN0SWRzLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZTxUIGV4dGVuZHMgU29ja2V0TWVzc2FnZVsnYm9keSddPiAoXG5cdFx0Ym9keTogVCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBzZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKTtcblx0XHRjb25zdCBpdGVtcyA9IGJvZHkuaXRlbXMuRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZTtcblx0XHRjb25zdCByZXF1ZXN0SWRzOiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gaXRlbXMpIHtcblx0XHRcdGNvbnN0IGZ1bmN0aW9uSWQgPSBpdGVtc1tpdGVtSWRdLnBhcmVudC5pdGVtSWQ7XG5cdFx0XHRjb25zdCBmdW5jdGlvbkVudHJ5ID0gc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdCdGdW5jdGllJyxcblx0XHRcdFx0ZnVuY3Rpb25JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0ZnVuY3Rpb25FbnRyeSA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdHx8IGZ1bmN0aW9uRW50cnkuY29sdW1ucy5yZXNwb25zZS5GdW5jdGllLm5ld2NoYW5nZXMgPT09IHVuZGVmaW5lZFxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXF1ZXN0SWRzLnB1c2goZnVuY3Rpb25JZCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3RJZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXJcblx0XHRcdC5mZXRjaEJ5SWRzKFxuXHRcdFx0XHQnRnVuY3RpZScsXG5cdFx0XHRcdHJlcXVlc3RJZHMsXG5cdFx0XHRcdFsnbmV3Y2hhbmdlcyddLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGJ1ZmZlclJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBpc24ndCB0aGlzIGFscmVhZHkgaGFuZGxlZCBpbiB0aGUgUmVxdWVzdEJ1ZmZlciA/XG5cdFx0XHRcdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdFx0XHRcdGNvbnN0IHJlc3BvbnNlSWRzID0gYnVmZmVyUmVzcG9uc2UucmVzcG9uc2UubGlua3MuRnVuY3RpZTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIHJlc3BvbnNlSWRzKSB7XG5cdFx0XHRcdFx0XHRjb25zdCBpdGVtRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0XHRcdFx0J0Z1bmN0aWUnLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHQpITtcblxuXHRcdFx0XHRcdFx0Y29uc3QgcHJldmlvdXMgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRcdFx0XHRjb25zdCByZXNwb25zZVZhbHVlcyA9IGJ1ZmZlclJlc3BvbnNlLnJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0XHRcdFx0XHQnRnVuY3RpZScsXG5cdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlVmFsdWVzID09PSB1bmRlZmluZWQgfHxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VWYWx1ZXMubmV3Y2hhbmdlcyA9PT0gcHJldmlvdXMubmV3Y2hhbmdlc1xuXHRcdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0e25ld2NoYW5nZXM6IHJlc3BvbnNlVmFsdWVzLm5ld2NoYW5nZXN9LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gc2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LmNhdGNoKFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5ub3RpZnlFcnJvcixcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGlzRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZU1lc3NhZ2UgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2UpOiBtZXNzYWdlIGlzIEZ1bmN0aW9uQ2hhbmdlc1Jlc29sdmVTb2NrZXRNZXNzYWdlIHtcblx0XHRyZXR1cm4gbWVzc2FnZS5ib2R5Lml0ZW1UeXBlID09PSAnRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZSc7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZSAobWVzc2FnZTogRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZVNvY2tldE1lc3NhZ2UpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+O1xuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZSAobWVzc2FnZTogU29ja2V0TWVzc2FnZUNyZWF0ZSk6IFByb21pc2VJbnRlcmZhY2U8bnVsbD47XG5cdHByaXZhdGUgaGFuZGxlQ3JlYXRlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlKTogYW55IHtcblx0XHRjb25zdCBib2R5ID0gbWVzc2FnZS5ib2R5O1xuXG5cdFx0aWYgKHRoaXMuaXNGdW5jdGlvbkNoYW5nZXNSZXNvbHZlTWVzc2FnZShtZXNzYWdlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvY2Vzc0Z1bmN0aW9uQ2hhbmdlc1Jlc29sdmUoYm9keSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5wcm9jZXNzTWVzc2FnZShib2R5KVxuXHRcdFx0LmNhdGNoKHRoaXMuZXJyb3JIYW5kbGVyLm5vdGlmeUVycm9yKTtcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlVXBkYXRlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlVXBkYXRlKTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC5wcm9jZXNzTWVzc2FnZShtZXNzYWdlLmJvZHkpXG5cdFx0XHQuY2F0Y2godGhpcy5lcnJvckhhbmRsZXIubm90aWZ5RXJyb3IpO1xuXHR9XG5cblx0cHJpdmF0ZSBoYW5kbGVEZWxldGUgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2VEZWxldGUpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0SW50ZXJuYWxEZWx0YSgpO1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IGJvZHkgPSBtZXNzYWdlLmJvZHk7XG5cdFx0Y29uc3QgZW50cmllc1RvQmVEZWxldGVkOiBJdGVtRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgYm9keS5pdGVtcykge1xuXHRcdFx0Y29uc3QgY2FjaGVkRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0Ym9keS5pdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGNhY2hlZEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGVudHJpZXNUb0JlRGVsZXRlZC5wdXNoKGNhY2hlZEVudHJ5KTtcblx0XHR9XG5cblx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbXNEZWxldGVkKGVudHJpZXNUb0JlRGVsZXRlZCk7XG5cblx0XHRzZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50KGNoYW5nZXNEZWx0YSk7XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZUxpbmtNb3ZlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlTGlua1RvKTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc01lc3NhZ2UobWVzc2FnZS5ib2R5KVxuXHRcdFx0LmNhdGNoKHRoaXMuZXJyb3JIYW5kbGVyLm5vdGlmeUVycm9yKTtcblx0fVxuXG5cdC8qXHRoYW5kbGVMaW5rTW92ZSAobWVzc2FnZSkge1xuXHQgcHJvY2Vzc01lc3NhZ2UoXG5cdCBtZXNzYWdlLFxuXHQgZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGl0ZW1FbnRyaWVzKSB7XG5cdCAvLyBmaXRzIGluIHRoaXMgY29sbGVjdGlvbiwgdG9kbzogZ2V0IHRoZSBvbGQgY29sbGVjdGlvbiBpdCBiZWxvbmdlZCB0b1xuXHQgY29sbGVjdGlvbi5tb3ZlSXRlbXMoaXRlbUVudHJpZXMsIG51bGwsIHRydWUpO1xuXHQgfSxcblx0IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBpdGVtRW50cmllcykge1xuXHQgLy8gbWF5YmUgZml0c1xuXHQgLy8gdG9kbzogYWxzbyByZW1vdmUgdGhlbSBmcm9tIHRoZSBvbGQgY29sbGVjdGlvblxuXHQgY29sbGVjdGlvbi5leHRlbmQoYW5ndWxhci5pZGVudGl0eSwgZmFsc2UsIGZhbHNlKTtcblx0IH0sXG5cdCBmdW5jdGlvbiAoY29sbGVjdGlvbiwgaWRzKSB7XG5cdCAvLyBub3QgZml0dGluZyBpbiB0aGlzIGNvbGxlY3Rpb24sIHJlbW92ZSBpdCA/XG5cdCBjb2xsZWN0aW9uLnJlbW92ZUl0ZW1zKGlkcywgbnVsbCwgbWVzc2FnZSk7XG5cdCB9XG5cdCApO1xuXHQgfVxuXHQgKi9cbn1cbiIsImltcG9ydCB7XG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0Q2hhbmdlc0RlbHRhLFxuXHRDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRDb2xsZWN0aW9uUXVlcnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZSxcblx0Q29sdW1uU3Vic2V0Q2FjaGUsXG5cdENvbHVtblV0aWwsXG5cdENvbnZlcnNpb25NYXAsXG5cdEVudHJ5UGFyZW50LFxuXHRFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRpc0Z1bmN0aW9uLFxuXHRJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdEl0ZW1JZCxcblx0SXRlbVR5cGUsXG5cdFF1ZXJ5Q2FsbGJhY2ssXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdENvbGxlY3Rpb25NYXRjaGVyLFxuXHRDb2x1bW5IYW5kbGVyLFxuXHRLZXlTZXJ2aWNlLFxuXHRUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLFxufSBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uSGFuZGxlckJhc2UgfSBmcm9tICcuLi9Db2xsZWN0aW9uSGFuZGxlckJhc2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyXG5cdGV4dGVuZHMgQ29sbGVjdGlvbkhhbmRsZXJCYXNlIHtcblxuXHRwdWJsaWMgY29sbGVjdGlvblJlc291cmNlczoge1xuXHRcdFtjb2xsZWN0aW9uRW50cnlJZDogbnVtYmVyXTogQ29sbGVjdGlvblJlc291cmNlW11cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0Y29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcml2YXRlIGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeTogQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5OiBDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBpdGVtSGFuZGxlcjogVHJhbnNhY3Rpb25JdGVtSGFuZGxlcixcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cblx0fVxuXG5cdHB1YmxpYyBnZXRBbGxDb2xsZWN0aW9uc0J5SXRlbVR5cGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHQpOiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uRW50cnlJZCBpbiB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsQ29sbGVjdGlvbkVudHJ5KE51bWJlcihjb2xsZWN0aW9uRW50cnlJZCkpO1xuXG5cdFx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ICE9PSB1bmRlZmluZWQgJiYgY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlID09PSBpdGVtVHlwZSkge1xuXHRcdFx0XHRjb2xsZWN0aW9uRW50cmllcy5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyaWVzO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGlmICghdGhpcy5pc0xvY2FsKG9wdGlvbnMpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdFx0LmNyZWF0ZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBzdXBlci5jcmVhdGVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2FsbHMgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLm9uSXRlbXNDcmVhdGVkIG9uSXRlbXNDcmVhdGVkfSBjYWxsYmFjayB3aGVuZXZlciBhIGNyZWF0ZSByZXF1ZXN0IGlzIGRvbmUgb24ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gdGhhdCBmaXQgaW4gdGhlIGNvbGxlY3Rpb25cblx0ICogQ2FuIGJlIHVzZWQgdG8gdXBkYXRlIG1hcHMgdGhhdCB1c2Uge0BsaW5rIEl0ZW1FbnRyeS5pdGVtSWQgSXRlbUVudHJ5Lml0ZW1JZH1cblx0ICpcblx0ICogQGRlcHJlY2F0ZWRcblx0ICogWW91IHNob3VsZCB1c2UgaXRlbVJlc291cmNlLm9uQ2hhbmdlIGFuZCBjb21wYXJlIHByZXZpb3VzLmlkIHdpdGggZmllbGRzLmlkXG5cdCAqL1xuXHRwdWJsaWMgb25JdGVtRW50cmllc0NyZWF0ZWQgKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5LFxuXHRcdGNvbnZlcnNpb25NYXA6IENvbnZlcnNpb25NYXAsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0aWYgKHJlc291cmNlcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcblx0XHRcdHRyeSB7XG5cdFx0XHRcdHJlc291cmNlLm9wdGlvbnMub25JdGVtc0NyZWF0ZWQoY29udmVyc2lvbk1hcCk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjbGVhckVudHJ5IChlbnRyeTogQ29sbGVjdGlvbkVudHJ5KTogdm9pZCB7XG5cdFx0dGhpcy5lbnRyaWVzLmNsZWFyKGVudHJ5KTtcblxuXHRcdGRlbGV0ZSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbZW50cnkuaWRdO1xuXHRcdGRlbGV0ZSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2VudHJ5LmlkXTtcblx0fVxuXG5cdHB1YmxpYyBhZGRSZXNvdXJjZSAocmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZSk6IHZvaWQge1xuXHRcdGxldCByZXNvdXJjZUFycmF5ID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXTtcblxuXHRcdGlmIChyZXNvdXJjZUFycmF5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlc291cmNlQXJyYXkgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdID0gW107XG5cdFx0fVxuXG5cdFx0cmVzb3VyY2VBcnJheS5wdXNoKHJlc291cmNlKTtcblx0fVxuXG5cdHB1YmxpYyBjbGVhclJlc291cmNlIChyZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlKTogdm9pZCB7XG5cdFx0Y29uc3QgcmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXTtcblx0XHRjb25zdCBpbmRleCA9IHJlc291cmNlcy5pbmRleE9mKHJlc291cmNlKTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHJlc291cmNlcy5zcGxpY2UoXG5cdFx0XHRcdGluZGV4LFxuXHRcdFx0XHQxLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocmVzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0ZGVsZXRlIHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF07XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVcGRhdGVzIHRoZSBwYXJlbnRzIG9mIHRoZSBwYXNzZWQge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30sIHJldHVybnMgYHZvaWRgIGJlY2F1c2UgeW91IHNob3VsZCB1c2UgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLm9uQWRkIG9uQWRkfSBhbmQge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMub25SZW1vdmUgb25SZW1vdmV9IGNhbGxiYWNrc1xuXHQgKi9cblx0cHVibGljIG1vdmVJdGVtczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0c291cmNlQ29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGRlc3RpbmF0aW9uQ29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoc291cmNlQ29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlICE9PSBkZXN0aW5hdGlvbkNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlOiBDYW5ub3QgbW92ZSBpdGVtczogaXRlbVR5cGUgbWlzbWF0Y2gnKTtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBwYXJlbnQgbnVsbCA/XG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWQoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0ZGVzdGluYXRpb25Db2xsZWN0aW9uRW50cnkucGFyZW50ISxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dGhpcy50cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXHR9XG5cblx0cHVibGljIGV4dGVuZENvbGxlY3Rpb25FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5VHlwZT4ge1xuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQudHJhbnNhY3Rpb25cblx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5leHRlbmRDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0cXVlcnlDYWxsYmFjayxcblx0XHRcdCk7XG5cdH1cblxuXHQvLyB0b2RvW2NhY2hlXSBXaGF0IGlzIGNsb25pbmcgYSBjb2xsZWN0aW9uIHN1cHBvc2VkIHRvIGRvID9cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRzb3VyY2VFbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7fSxcblx0KTogQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+IHtcblx0XHRjb25zdCBzb3VyY2VJdGVtRW50cmllcyA9IHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbc291cmNlRW50cnkuaWRdO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5jcmVhdGVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRzb3VyY2VFbnRyeS5pdGVtVHlwZSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jbG9uZU9wdGlvbnMoXG5cdFx0XHRcdHNvdXJjZUVudHJ5Lm9wdGlvbnMsXG5cdFx0XHRcdHBhcmVudCxcblx0XHRcdCksXG5cdFx0KTtcblxuXHRcdGlmIChzb3VyY2VFbnRyeS5wYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdGNvbnN0IHNvdXJjZVBhcmVudCA9IHNvdXJjZUVudHJ5LnBhcmVudDtcblxuXHRcdFx0aWYgKGNvbnZlcnNpb25NYXBbc291cmNlUGFyZW50Lml0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnZlcnNpb25NYXBbc291cmNlUGFyZW50Lml0ZW1UeXBlXSA9IHt9O1xuXHRcdFx0fVxuXG5cdFx0XHRjb252ZXJzaW9uTWFwW3NvdXJjZVBhcmVudC5pdGVtVHlwZV1bc291cmNlUGFyZW50Lml0ZW1JZF0gPSBwYXJlbnQuaXRlbUlkO1xuXHRcdH1cblxuXHRcdHRoaXMuaXRlbUhhbmRsZXIuY2xvbmVJdGVtRW50cmllcyhcblx0XHRcdHNvdXJjZUl0ZW1FbnRyaWVzLFxuXHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uTWF0Y2hlciAoKTogQ29sbGVjdGlvbk1hdGNoZXIge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLFxuXHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5nZXRBbGxDb2xsZWN0aW9uc0J5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRpZiAoIXRoaXMuaXNMb2NhbChvcHRpb25zKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHRcdC5mZXRjaENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZSA9IHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpO1xuXHRcdGNvbnN0IHBhcnNlZFF1ZXJ5ID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KG9wdGlvbnMpO1xuXG5cdFx0dGhpcy5leHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHBhcnNlZFF1ZXJ5Lm9iamVjdCxcblx0XHQpO1xuXG5cdFx0bGV0IGNvbGxlY3Rpb25FbnRyeTtcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRGF0YShcblx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdHBhcnNlZFF1ZXJ5LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdF9jb2xsZWN0aW9uRW50cnkgPT4ge1xuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSA9IF9jb2xsZWN0aW9uRW50cnk7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gY29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSB8ICgoKSA9PiBJdGVtSWRbXSksXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRpZiAoaXNGdW5jdGlvbjwoKSA9PiBJdGVtSWRbXT4ocGFyZW50SWRBcnJheSkpIHtcblx0XHRcdHBhcmVudElkQXJyYXkgPSBwYXJlbnRJZEFycmF5KCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVtb3RlUGFyZW50SWRzOiBJdGVtSWRbXSA9IFtdO1xuXHRcdGNvbnN0IGxvY2FsUGFyZW50SWRzOiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgcGFyZW50SWRBcnJheSkge1xuXHRcdFx0aWYgKHRoaXMua2V5U2VydmljZS5pc0xvY2FsSWQoaXRlbUlkKSkge1xuXHRcdFx0XHRsb2NhbFBhcmVudElkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW1vdGVQYXJlbnRJZHMucHVzaChpdGVtSWQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHtcblx0XHRcdFx0cmVtb3RlOiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdFx0XHQuZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRyZW1vdGVQYXJlbnRJZHMsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0bG9jYWw6IHRoaXMuZmV0Y2hMaW5rZWRMb2NhbENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0bG9jYWxQYXJlbnRJZHMsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KSxcblx0XHRcdH0pXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzdWx0ID0+IHtcblx0XHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdFx0Li4ucmVzdWx0LnJlbW90ZSxcblx0XHRcdFx0XHRcdC4uLnJlc3VsdC5sb2NhbCxcblx0XHRcdFx0XHR9O1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0Y29sbGVjdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRcdG5ld0NvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4ge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZXhwYW5kQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRjb2xsZWN0aW9ucyxcblx0XHRcdFx0bmV3Q29sdW1ucyxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZXh0ZW5kQ29sbGVjdGlvbkVudHJpZXM8VCBleHRlbmRzIENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cXVlcnlDYWxsYmFjazogUXVlcnlDYWxsYmFjayxcblx0XHRjb2xsZWN0aW9uczogVCxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5leHRlbmRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdHF1ZXJ5Q2FsbGJhY2ssXG5cdFx0XHRcdGNvbGxlY3Rpb25zLFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXM8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0c3VwZXIuYWRkSXRlbUVudHJpZXNUb0NvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHQoKSA9PiBmYWxzZSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGlzTG9jYWwgKG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMpOiBib29sZWFuIHtcblx0XHRjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChwYXJlbnQuaXRlbUlkKTtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRuZXdDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlUeXBlPiB7XG5cdFx0Y29uc3Qge2RpZmZlcmVuY2V9ID0gY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMubWVyZ2VSZXF1ZXN0Q29sdW1ucyhuZXdDb2x1bW5zKTtcblxuXHRcdGlmIChkaWZmZXJlbmNlICE9PSB0cnVlICYmIGRpZmZlcmVuY2UubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGU7XG5cblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5IYW5kbGVyXG5cdFx0XHQuZmV0Y2goXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRkaWZmZXJlbmNlLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdFx0XHRcdC5leHBhbmRMb2NhbEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW2NvbGxlY3Rpb25FbnRyeS5pZF0sXG5cdFx0XHRcdFx0XHRcdGRpZmZlcmVuY2UsXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0ZGlmZmVyZW5jZSxcblx0XHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5leHBhbmRDb2x1bW5zKGNvbHVtbkV4cGFuc2lvbik7XG5cblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaGVuIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IGFyZSBhZGRlZCB0byB0aGUgY2hhbmdlcyBvZiBhIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fSBhbGwge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBDb2xsZWN0aW9uUmVzb3VyY2VzfVxuXHQgKiBzaG91bGQgZ2V0IG5ldyB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZXN9IGZvciB0aGUgbmV3bHkgYWRkZWQgZW50cmllc1xuXHQgKi9cblx0cHJvdGVjdGVkIGhhbmRsZUFkZGVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGFkZGVkRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sbGVjdGlvblJlc291cmNlcyA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0Ly8gV2hlbiB0aGVyZSBhcmUgbm8gQ29sbGVjdGlvblJlc291cmNlcyB3ZSBkb24ndCBoYXZlIHRvIG1ha2UgSXRlbVJlc291cmNlc1xuXHRcdGlmIChcblx0XHRcdGFkZGVkRW50cmllcy5sZW5ndGggPT09IDBcblx0XHRcdHx8IGNvbGxlY3Rpb25SZXNvdXJjZXMgPT09IHVuZGVmaW5lZFxuXHRcdFx0fHwgY29sbGVjdGlvblJlc291cmNlcy5sZW5ndGggPT09IDBcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25SZXNvdXJjZSBvZiBjb2xsZWN0aW9uUmVzb3VyY2VzKSB7XG5cdFx0XHRjb25zdCBhZGRlZFJlc291cmNlcyA9IGNvbGxlY3Rpb25SZXNvdXJjZS5hZGRJdGVtUmVzb3VyY2VzKGFkZGVkRW50cmllcyk7XG5cblx0XHRcdGNvbGxlY3Rpb25SZXNvdXJjZS5jYWxsT25BZGQoYWRkZWRSZXNvdXJjZXMpO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogV2hlbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBjaGFuZ2VzIG9mIGEge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IHRoZSB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZXN9IG9mIHRoZSBJdGVtRW50cmllcyBzaG91bGQgYmUgcmVtb3ZlZCBmcm9tIGFsbCB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZXN9XG5cdCAqL1xuXHRwcm90ZWN0ZWQgaGFuZGxlUmVtb3ZlZEl0ZW1FbnRyaWVzQ2FsbGJhY2s8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRyZW1vdmVkSXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25SZXNvdXJjZXMgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbY29sbGVjdGlvbkVudHJ5LmlkXTtcblxuXHRcdGlmIChcblx0XHRcdHJlbW92ZWRJdGVtRW50cmllcy5sZW5ndGggPT09IDBcblx0XHRcdHx8IGNvbGxlY3Rpb25SZXNvdXJjZXMgPT09IHVuZGVmaW5lZFxuXHRcdFx0fHwgY29sbGVjdGlvblJlc291cmNlcy5sZW5ndGggPT09IDBcblx0XHQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25SZXNvdXJjZSBvZiBjb2xsZWN0aW9uUmVzb3VyY2VzKSB7XG5cdFx0XHRjb25zdCByZW1vdmVkUmVzb3VyY2VzID0gY29sbGVjdGlvblJlc291cmNlLnJlbW92ZUl0ZW1SZXNvdXJjZXMocmVtb3ZlZEl0ZW1FbnRyaWVzKTtcblxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlLmNhbGxPblJlbW92ZShyZW1vdmVkUmVzb3VyY2VzKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGZldGNoQ29sbGVjdGlvbkRhdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0Y29sbGVjdGlvblF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0QnlRdWVyeShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Y29sbGVjdGlvblF1ZXJ5LFxuXHRcdCk7XG5cblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ICE9PSBudWxsKSB7XG5cdFx0XHQvLyBUaGVyZSBhbHJlYWR5IGlzIGFuIGVudHJ5IGFuZCBpdCBjb250YWlucyB0aGUgY29sdW1ucyB3ZSBuZWVkLCBzbyB3ZSBjYW4gc2FmZWx5IHJldHVybiBpdFxuXG5cdFx0XHRpZiAoY29sdW1uU3Vic2V0Q2FjaGUucnVuKGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zKSkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmV4cGFuZENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKFxuXHRcdFx0dGhpcy5jcmVhdGVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0KSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJpZXN9IG9mIHdoaWNoIHRoZSBwYXJlbnRzIGFyZSBsb2NhbFxuXHQgKi9cblx0cHJpdmF0ZSBmZXRjaExpbmtlZExvY2FsQ29sbGVjdGlvbkVudHJpZXMgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpIHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeS5jb25zdHJ1Y3Qob3B0aW9ucy5jb2x1bW5zKTtcblx0XHRjb25zdCBwcm9taXNlczoge1twYXJlbnRJZDogc3RyaW5nXTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk+fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZEFycmF5KSB7XG5cdFx0XHRjb25zdCBuZXdPcHRpb25zID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNsb25lT3B0aW9ucyhcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZDogcGFyZW50SWQsXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXG5cdFx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShuZXdPcHRpb25zKTtcblxuXHRcdFx0dGhpcy5leHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG5ld09wdGlvbnMsXG5cdFx0XHRcdHBhcnNlZFF1ZXJ5Lm9iamVjdCxcblx0XHRcdCk7XG5cblx0XHRcdHByb21pc2VzW3BhcmVudElkXSA9IHRoaXMuZmV0Y2hDb2xsZWN0aW9uRGF0YShcblx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRcdG5ld09wdGlvbnMsXG5cdFx0XHRcdHBhcnNlZFF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbChwcm9taXNlcylcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCA9PiB7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHRcdFx0LmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0XHQoKSA9PiBjb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0XHRcdFx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSXRlbUVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbHVtbkV4cGFuc2lvblJlc3VsdCwgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi9JdGVtRW50cnlTZXJ2aWNlJztcblxuZXhwb3J0IHR5cGUgQ2hhbmdlc0RlbHRhUmVzdWx0ID0ge1xuXHRyb2xsYmFjazogKCkgPT4gdm9pZCxcblx0Y3JlYXRlZDogSXRlbUVudHJ5W11cblx0Ly8gdG9kb1tjYWNoZV0gb3RoZXIgc3RhdHVzZXNcbn07XG5cbi8qKlxuICogQHJlbWFya1xuICogV2UgZXhwbGljaXRseSBrZWVwIHRyYWNrIG9mIHRoZSBuZXcgcGFyZW50LCBzbyB3ZSBjYW4gc2V0IGFuIGl0ZW0gdG8gbW92ZWQgaWYgaXQgaXNuJ3QgbnVsbCAoTmVlZGVkIGZvciBsaW5rVG8gcmVxdWVzdClcbiAqL1xuZXhwb3J0IHR5cGUgQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9IHtcblx0ZW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRjaGFuZ2VzOiB7XG5cdFx0ZXhwYW5kZWRDb2x1bW5zOiBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbVR5cGVUeXBlPiB8IG51bGwsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsLFxuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFJdGVtRGVsZXRlRGVsdGEgPSBJdGVtRW50cnlbXTtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENoYW5nZXNEZWx0YUJhc2Uge1xuXG5cdHB1YmxpYyB1cGRhdGVkOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGFcblx0fSA9IHt9O1xuXG5cdHB1YmxpYyBkZWxldGVkOiB7XG5cdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiBDaGFuZ2VzRGVsdGFJdGVtRGVsZXRlRGVsdGFcblx0fSA9IHt9O1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgc2V0SXRlbVVwZGF0ZWQ8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4sXG5cdFx0Y29sdW1uRXhwYW5zaW9uUmVzdWx0OiBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4gfCBudWxsID0gbnVsbCxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCA9IG51bGwsXG5cdCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLnVwZGF0ZWRbZW50cnkuaWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMudXBkYXRlZFtlbnRyeS5pZF0gPSB7XG5cdFx0XHRcdGVudHJ5OiBlbnRyeSxcblx0XHRcdFx0Y2hhbmdlczoge1xuXHRcdFx0XHRcdGZpZWxkczoge30sXG5cdFx0XHRcdFx0ZXhwYW5kZWRDb2x1bW5zOiBudWxsLFxuXHRcdFx0XHRcdHBhcmVudDogcGFyZW50LFxuXHRcdFx0XHR9LFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzRW50cnkgPSB0aGlzLnVwZGF0ZWRbZW50cnkuaWRdO1xuXG5cdFx0aWYgKHBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgcGFyZW50RmllbGRzID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudChcblx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRlbnRyeS5pdGVtVHlwZSxcblx0XHRcdCk7XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gcGFyZW50RmllbGRzKSB7XG5cdFx0XHRcdGZpZWxkc1tjb2x1bW5JZF0gPSBwYXJlbnRGaWVsZHNbY29sdW1uSWRdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZmllbGQgaW4gZmllbGRzKSB7XG5cdFx0XHRjb25zdCBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihcblx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRmaWVsZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChkZXNjICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KFxuXHRcdFx0XHRcdGNoYW5nZXNFbnRyeS5jaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0XHRmaWVsZCxcblx0XHRcdFx0XHRkZXNjLFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2hhbmdlc0VudHJ5LmNoYW5nZXMuZmllbGRzW2ZpZWxkXSA9IGZpZWxkc1tmaWVsZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtbkV4cGFuc2lvblJlc3VsdCAhPT0gbnVsbCkge1xuXHRcdFx0Y2hhbmdlc0VudHJ5LmNoYW5nZXMuZXhwYW5kZWRDb2x1bW5zID0gY29sdW1uRXhwYW5zaW9uUmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBzZXRJdGVtRGVsZXRlZCAoXG5cdFx0ZGVsZXRlZDogSXRlbUVudHJ5LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLnNldEl0ZW1zRGVsZXRlZChcblx0XHRcdFtkZWxldGVkXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHNldEl0ZW1zRGVsZXRlZCAoXG5cdFx0ZGVsZXRlZDogSXRlbUVudHJ5W10sXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGRlbGV0ZWQpIHtcblx0XHRcdGlmICh0aGlzLmRlbGV0ZWRbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuZGVsZXRlZFtpdGVtRW50cnkuaXRlbVR5cGVdID0gW107XG5cblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0Ly8gdG9kb1tjYWNoZV06IGRvIHdlIHJlYWxseSBoYXZlIHRvIGNoZWNrIHRoaXMgPyBkZWxldGluZyBtdWx0aXBsZSB0aW1lcyBkb2Vzbid0IG1hdHRlclxuXHRcdFx0Ly8gdG9kb1tjYWNoZV06IHRoaXMgY291bGQgYWxzbyBiZSBhIG1hcCBvZiBlbnRyeUlkIC0+IGl0ZW1FbnRyeVxuXHRcdFx0aWYgKHRoaXMuZGVsZXRlZFtpdGVtRW50cnkuaXRlbVR5cGVdLmluZGV4T2YoaXRlbUVudHJ5KSA+IC0xKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmRlbGV0ZWRbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnQsIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFCYXNlIH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4vQ29sdW1uU2V0JztcbmltcG9ydCB7IEl0ZW1FbnRyeVNlcnZpY2UgfSBmcm9tICcuL0l0ZW1FbnRyeVNlcnZpY2UnO1xuXG5leHBvcnQgdHlwZSBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRpdGVtSWQ6IEl0ZW1JZCxcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRjb2x1bW5zOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDaGFuZ2VzRGVsdGEgdXNlZCB0byBhcHBseSBjaGFuZ2VzIGZyb20gb3V0c2lkZSBvZiB0aGUgY29yZSB0byBhIHRyYW5zYWN0aW9uXG4gKlxuICogLS0tLS0tLS0tLVxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIEludGVybmFsQ2hhbmdlc0RlbHRhIEludGVybmFsQ2hhbmdlc0RlbHRhfSBhbmQge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgdGhlIENoYW5nZXNEZWx0YVxuICogYXNzdW1lcyAnY3JlYXRlZCcgdmFsdWVzIGhhdmUgbm8gaXRlbUVudHJpZXMgeWV0LlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gY2FsbGluZyB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX1cbiAqL1xuZXhwb3J0IGNsYXNzIENoYW5nZXNEZWx0YVxuXHRleHRlbmRzIENoYW5nZXNEZWx0YUJhc2Uge1xuXG5cdHB1YmxpYyBjcmVhdGVkOiBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGFbXSA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogV2lsbCBjcmVhdGUgYW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IHdoZW4gdGhlIGRlbHRhIGlzIGFwcGxpZWRcblx0ICogRG9lcyBub3QgYWx3YXlzIG1lYW4gdGhlIGl0ZW0gaXMgbG9jYWwsIGp1c3QgdGhhdCBpdCBpc24ndCBjYWNoZWQgeWV0XG5cdCAqXG5cdCAqIC0tLS0tLVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFdoZW4gdGhlIGBwYXJlbnRgIHByb3BlcnR5IGlzIHBhc3NlZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBwcm9wZXIgZmllbGRzIHRvIG1hdGNoIHRoZSBwYXJlbnQsIHRoaXMgYXNzdW1lcyB0aGUgcmVxdWlyZWQgcGFyZW50IGNvbHVtbnMgYXJlIGluIHRoZSBwYXNzZWQgY29sdW1uc1xuXHQgKiBZb3UgY2FuIGVhc2lseSBnZXQgdGhlIHJlcXVpcmVkIGNvbHVtbnMgYnkgYWxzbyBwYXNzaW5nIHRoZSBgcGFyZW50YCB0byB0aGUge0BsaW5rIFRlbXBsYXRlQ2FjaGUuZmV0Y2hUZW1wbGF0ZSB0ZW1wbGF0ZSBmZXRjaENvbGxlY3Rpb25FbnRyeX0gY2FsbFxuXHQgKi9cblx0cHVibGljIHNldEl0ZW1DcmVhdGVkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbCxcblx0KTogdm9pZCB7XG5cdFx0bGV0IHBhcmVudEZpZWxkczogUGFydGlhbDxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiA9IHt9O1xuXG5cdFx0aWYgKHBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0cGFyZW50RmllbGRzID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudChcblx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRjb2x1bW5zLml0ZW1UeXBlLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBwYXJlbnRGaWVsZHMpIHtcblx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHBhcmVudEZpZWxkc1tjb2x1bW5JZF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgZGVmYXVsdFZhbHVlcyA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMb2NhbERlZmF1bHRWYWx1ZXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZGVmYXVsdFZhbHVlcykge1xuXHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IGRlZmF1bHRWYWx1ZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdHRoaXMuY3JlYXRlZC5wdXNoKHtcblx0XHRcdGl0ZW1JZDogaXRlbUlkLFxuXHRcdFx0ZmllbGRzOiBmaWVsZHMsXG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5zLFxuXHRcdH0pO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDb252ZW5pZW5jZSBmdW5jdGlvbiB0byBhc3NpZ24gdGhlIHByb3BlciBwYXJlbnQgZmllbGRzLCB3aWxsIGNhbGwge0BsaW5rIENoYW5nZXNEZWx0YUJhc2Uuc2V0SXRlbVVwZGF0ZWQgc2V0SXRlbVVwZGF0ZWR9IGludGVybmFsbHlcblx0ICovXG5cdHB1YmxpYyBzZXRJdGVtTW92ZWQgKFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0dG86IEVudHJ5UGFyZW50LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0ZW50cnksXG5cdFx0XHR7fSxcblx0XHRcdG51bGwsXG5cdFx0XHR0byxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnQsIEZpZWxkTWFwLCBJdGVtSWRDb252ZXJzaW9uTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUJhc2UgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4vSXRlbUVudHJ5U2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIEludGVybmFsQ3JlYXRlRGVsdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBDaGFuZ2VzRGVsdGEgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb3JlXG4gKlxuICogLS0tLS0tLS0tLVxuICpcbiAqIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4ge0BsaW5rIEludGVybmFsQ2hhbmdlc0RlbHRhIEludGVybmFsQ2hhbmdlc0RlbHRhfSBhbmQge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgdGhlIEludGVybmFsQ2hhbmdlc0RlbHRhXG4gKiBhc3N1bWVzICdjcmVhdGVkJyBlbnRyaWVzIGFyZSBhbHJlYWR5IGV4aXN0aW5nLCBzbyBpdCBoYXMgYSBkaWZmZXJlbnQgZm9ybWF0LlxuICpcbiAqIFVzZSB0aGlzIHdoZW4gY2FsbGluZyB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50IGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnR9IGFuZCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tQ2hpbGQgYXBwbHlDaGFuZ2VzRnJvbUNoaWxkfVxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxDaGFuZ2VzRGVsdGFcblx0ZXh0ZW5kcyBDaGFuZ2VzRGVsdGFCYXNlIHtcblxuXHRwdWJsaWMgY3JlYXRlZDoge1xuXHRcdFtpdGVtRW50cnlJZDogc3RyaW5nXTogSW50ZXJuYWxDcmVhdGVEZWx0YVxuXHR9ID0ge307XG5cblx0cHVibGljIG1vdmVkOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBudW1iZXJdOiB7XG5cdFx0XHRlbnRyeTogSXRlbUVudHJ5LFxuXHRcdFx0dG86IEVudHJ5UGFyZW50XG5cdFx0fVxuXHR9ID0ge307XG5cblx0cHVibGljIGl0ZW1JZENvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0SXRlbUNyZWF0ZWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5jcmVhdGVkW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRlbnRyeTogaXRlbUVudHJ5LFxuXHRcdFx0ZmllbGRzOiBmaWVsZHMsXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAcmVtYXJrXG5cdCAqIFBhcmVudCBmaWVsZHMgYXJlIG5vbi13cml0YWJsZSBzbyB3ZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgbW92ZWQgZW50cmllcyBhbm90aGVyIHdheSAodG8gZG8gYSBsaW5rVG8gcmVxdWVzdClcblx0ICovXG5cdHB1YmxpYyBzZXRJdGVtTW92ZWQgKFxuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0dG86IEVudHJ5UGFyZW50LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLm1vdmVkW2VudHJ5LmlkXSA9IHtcblx0XHRcdGVudHJ5OiBlbnRyeSxcblx0XHRcdHRvOiB0byxcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBEZWZlcnJlZCwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi9BcGlSZXF1ZXN0U2VydmljZSc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvciB9IGZyb20gJy4vQXBpUmVzcG9uc2VQcm9jZXNzb3InO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uIH0gZnJvbSAnLi9SZXF1ZXN0Q29sdW1uRXhwYW5zaW9uJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdEJ1ZmZlclJlc3BvbnNlID0gQXBpUmVzcG9uc2VQcm9jZXNzb3I7XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0QnVmZmVyIHtcblxuXHRwcml2YXRlIGRlZmVycmVkOiBEZWZlcnJlZDxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+ID0gdGhpcy5wcm9taXNlTGlicmFyeS5kZWZlcigpO1xuXHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb246IFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRwcml2YXRlIHNpbmdsZUl0ZW1JZHM6IEl0ZW1JZFtdID0gW107XG5cdHByaXZhdGUgcXVlcmllczoge1txdWVyeVN0cmluZzogc3RyaW5nXTogQXBpUXVlcnl9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgc2VydmVyQ2FjaGU6IFNlcnZlckNhY2hlLFxuXHRcdHByaXZhdGUgaXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zSWQgKFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5zaW5nbGVJdGVtSWRzLmluZGV4T2YoaXRlbUlkKSAhPT0gLTE7XG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnNRdWVyeSAoXG5cdFx0cXVlcnlTdHJpbmc6IHN0cmluZyxcblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMucXVlcmllc1txdWVyeVN0cmluZ10gIT09IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBhZGRTaW5nbGVJdGVtIChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0aWYgKHRoaXMuc2luZ2xlSXRlbUlkcy5pbmRleE9mKGl0ZW1JZCkgPT09IC0xKSB7XG5cdFx0XHR0aGlzLnNpbmdsZUl0ZW1JZHMucHVzaChpdGVtSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBhZGRRdWVyeSAoXG5cdFx0cXVlcnk6IFtvYmplY3QsIHN0cmluZ10sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHR0aGlzLml0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGlmICh0aGlzLnF1ZXJpZXNbcXVlcnlbMV1dID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMucXVlcmllc1txdWVyeVsxXV0gPSBxdWVyeVswXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmx1c2ggKCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgY29uZGl0aW9uczogYW55W10gPSBbXTtcblxuXHRcdGlmICh0aGlzLnNpbmdsZUl0ZW1JZHMubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uZGl0aW9ucy5wdXNoKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0a2V5OiAnaWQnLFxuXHRcdFx0XHRcdGNvbXBhcmF0b3I6ICdJTicsXG5cdFx0XHRcdFx0dmFsdWU6IHRoaXMuc2luZ2xlSXRlbUlkcyxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBxdWVyeVN0cmluZyBpbiB0aGlzLnF1ZXJpZXMpIHtcblx0XHRcdGNvbmRpdGlvbnMucHVzaCh0aGlzLnF1ZXJpZXNbcXVlcnlTdHJpbmddKTtcblx0XHR9XG5cblx0XHRpZiAoY29uZGl0aW9ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVHJpZWQgdG8gZmx1c2ggYSBSZXF1ZXN0QnVmZmVyIHdpdGhvdXQgc2luZ2xlSXRlbXMgb3IgcXVlcmllcycpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5zID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmdldCgpO1xuXG5cdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LnF1ZXJ5KFxuXHRcdFx0XHR0aGlzLml0ZW1UeXBlLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y29uZGl0aW9uczogY29uZGl0aW9ucyxcblx0XHRcdFx0XHRvcGVyYXRvcjogJ09SJyxcblx0XHRcdFx0fSxcblx0XHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdHRoaXMuc2VydmVyQ2FjaGUucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTtcblx0XHRcdFx0XHR0aGlzLmRlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvciA9PiB7XG5cdFx0XHRcdFx0dGhpcy5kZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBnZXRQcm9taXNlICgpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdHJldHVybiB0aGlzLmRlZmVycmVkLnByb21pc2U7XG5cdH1cbn1cbiIsImltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuL0FwaVJlcXVlc3RTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3Nvcic7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IEtleVNlcnZpY2UgfSBmcm9tICcuL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlciwgUmVxdWVzdEJ1ZmZlclJlc3BvbnNlIH0gZnJvbSAnLi9SZXF1ZXN0QnVmZmVyJztcbmltcG9ydCB7IGdldFBhdGggfSBmcm9tICcuL1V0aWwnO1xuXG5jb25zdCBCVUZGRVJfRkxVU0hfVElNRU9VVF9NUzogbnVtYmVyID0gMTUwO1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdEJ1ZmZlck1hbmFnZXIge1xuXG5cdHByaXZhdGUgcGVuZGluZ0J1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn0gPSB7fTtcblx0cHJpdmF0ZSBwZW5kaW5nVHJ1ZUJ1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn0gPSB7fTtcblxuXHRwcml2YXRlIHBlbmRpbmdRdWVyeUJ1ZmZlck1hcDoge1tpdGVtVHlwZTogc3RyaW5nXToge1txdWVyeVN0cmluZzogc3RyaW5nXTogUmVxdWVzdEJ1ZmZlcn19ID0ge307XG5cdHByaXZhdGUgcGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiB7W2xvY2FsSXRlbUlkOiBzdHJpbmddOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPn19ID0ge307XG5cblx0cHJpdmF0ZSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIHNldFNlcnZlckNhY2hlIChzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGUpOiB2b2lkIHtcblx0XHR0aGlzLnNlcnZlckNhY2hlID0gc2VydmVyQ2FjaGU7XG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnNJZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRpZiAoZ2V0UGF0aChcblx0XHRcdHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwLFxuXHRcdFx0W1xuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XSxcblx0XHQpKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ0J1ZmZlck1hcFtpdGVtVHlwZV0uY29udGFpbnNJZChpdGVtSWQpO1xuXHR9XG5cblx0cHVibGljIGNvbnRhaW5zUXVlcnkgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZ2V0UGF0aChcblx0XHRcdHRoaXMucGVuZGluZ1F1ZXJ5QnVmZmVyTWFwLFxuXHRcdFx0W1xuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cXVlcnlTdHJpbmcsXG5cdFx0XHRdLFxuXHRcdCkgIT09IHVuZGVmaW5lZDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEJ5SWRzIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdHRoaXMuZmV0Y2hCeUlkKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ0J1ZmZlck1hcFtpdGVtVHlwZV0uZ2V0UHJvbWlzZSgpO1xuXHR9XG5cblx0cHVibGljIGZldGNoQnlJZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgbG9jYWwgSXRlbUlkIGluIFJlcXVlc3RCdWZmZXJNYW5hZ2VyLmZldGNoQnlJZCwgZm9yIGxvY2FsIEl0ZW1JZHMgeW91IHNob3VsZCB1c2UgUmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeUxvY2FsSWQnKTtcblx0XHR9XG5cblx0XHRsZXQgYnVmZmVyO1xuXG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRidWZmZXIgPSB0aGlzLnBlbmRpbmdUcnVlQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IHRoaXMuY29uc3RydWN0QnVmZmVyKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHRoaXMucGVuZGluZ1RydWVCdWZmZXJNYXAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjb25zb2xlLmxvZyhgRXhpc3RpbmcgJ2NvbHVtbnM6IHRydWUnIFJlcXVlc3RCdWZmZXIgJHtpdGVtVHlwZX0gYXQgJHtwZXJmb3JtYW5jZS5ub3coKX0gYnkgaWRgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0YnVmZmVyID0gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGJ1ZmZlciA9IHRoaXMuY29uc3RydWN0QnVmZmVyKGl0ZW1UeXBlKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGBFeGlzdGluZyBSZXF1ZXN0QnVmZmVyICR7aXRlbVR5cGV9IGF0ICR7cGVyZm9ybWFuY2Uubm93KCl9IGJ5IGlkYCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0YnVmZmVyLmFkZFNpbmdsZUl0ZW0oXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlci5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hCeVF1ZXJ5IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cXVlcnk6IFtvYmplY3QsIHN0cmluZ10sIC8vIHF1ZXJ5UGFyc2VyIHJlc3VsdFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRsZXQgYnVmZmVyID0gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChidWZmZXIgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0YnVmZmVyID0gdGhpcy5jb25zdHJ1Y3RCdWZmZXIoaXRlbVR5cGUpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjb25zb2xlLmxvZyhgRXhpc3RpbmcgUmVxdWVzdEJ1ZmZlciAke2l0ZW1UeXBlfSBhdCAke3BlcmZvcm1hbmNlLm5vdygpfSB3aXRoIHF1ZXJ5YCk7XG5cdFx0fVxuXG5cdFx0YnVmZmVyLmFkZFF1ZXJ5KFxuXHRcdFx0cXVlcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGJ1ZmZlci5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hCeUxvY2FsSWQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCB8IHN0cmluZyA9ICduby1pZCcsXG5cdFx0dGVtcGxhdGVPcHRpb25zPzogYW55LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWRcblx0XHRcdHx8IHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdID09PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdFRlbXBsYXRlQnVmZmVyKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHR0ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV1baXRlbUlkXTtcblx0fVxuXG5cdC8vIHByaXZhdGUgY29uc3RydWN0UXVlcnlCdWZmZXIgKFxuXHQvLyBcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0Ly8gXHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQvLyApOiBSZXF1ZXN0QnVmZmVyIHtcblx0Ly8gXHRpZiAodGhpcy5wZW5kaW5nUXVlcnlCdWZmZXJNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0Ly8gXHRcdHRoaXMucGVuZGluZ1F1ZXJ5QnVmZmVyTWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHQvLyBcdH1cblx0Ly9cblx0Ly8gXHRjb25zdCBidWZmZXIgPSB0aGlzLnBlbmRpbmdRdWVyeUJ1ZmZlck1hcFtpdGVtVHlwZV1bcXVlcnlTdHJpbmddID0gbmV3IFJlcXVlc3RCdWZmZXIoXG5cdC8vIFx0XHR0aGlzLnByb21pc2VMaWJyYXJ5LFxuXHQvLyBcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0Ly8gXHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdC8vIFx0XHR0aGlzLnNlcnZlckNhY2hlLFxuXHQvLyBcdFx0aXRlbVR5cGUsXG5cdC8vIFx0KTtcblx0Ly9cblx0Ly8gXHRjb25zb2xlLmxvZyhgQ3JlYXRpbmcgUmVxdWVzdEJ1ZmZlciAke2l0ZW1UeXBlfSBhdCAke3BlcmZvcm1hbmNlLm5vdygpfWApO1xuXHQvL1xuXHQvLyBcdHdpbmRvdy5zZXRUaW1lb3V0KFxuXHQvLyBcdFx0KCkgPT4ge1xuXHQvLyBcdFx0XHRidWZmZXIuZmx1c2goKTtcblx0Ly9cblx0Ly8gXHRcdFx0Y29uc29sZS5sb2coYFJlbW92aW5nIFJlcXVlc3RCdWZmZXIgJHtpdGVtVHlwZX0gYXQgJHtwZXJmb3JtYW5jZS5ub3coKX1gKTtcblx0Ly9cblx0Ly8gXHRcdFx0ZGVsZXRlIHRoaXMucGVuZGluZ1F1ZXJ5QnVmZmVyTWFwW2l0ZW1UeXBlXVtxdWVyeVN0cmluZ107XG5cdC8vIFx0XHR9LFxuXHQvLyBcdFx0QlVGRkVSX0ZMVVNIX1RJTUVPVVRfTVMsXG5cdC8vIFx0KTtcblx0Ly9cblx0Ly8gXHRyZXR1cm4gYnVmZmVyO1xuXHQvLyB9XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RCdWZmZXIgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRtYXAgPSB0aGlzLnBlbmRpbmdCdWZmZXJNYXAsXG5cdCk6IFJlcXVlc3RCdWZmZXIge1xuXHRcdGNvbnN0IGJ1ZmZlciA9IG1hcFtpdGVtVHlwZV0gPSBuZXcgUmVxdWVzdEJ1ZmZlcihcblx0XHRcdHRoaXMucHJvbWlzZUxpYnJhcnksXG5cdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuc2VydmVyQ2FjaGUsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHQpO1xuXG5cdFx0d2luZG93LnNldFRpbWVvdXQoXG5cdFx0XHQoKSA9PiB7XG5cdFx0XHRcdGJ1ZmZlci5mbHVzaCgpO1xuXG5cdFx0XHRcdGRlbGV0ZSBtYXBbaXRlbVR5cGVdO1xuXHRcdFx0fSxcblx0XHRcdEJVRkZFUl9GTFVTSF9USU1FT1VUX01TLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gYnVmZmVyO1xuXHR9XG5cblx0cHJpdmF0ZSBjb25zdHJ1Y3RUZW1wbGF0ZUJ1ZmZlciAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkIHwgc3RyaW5nLFxuXHRcdHRlbXBsYXRlT3B0aW9ucz86IGFueSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdGlmICh0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZVxuXHRcdFx0LnRlbXBsYXRlKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGVtcGxhdGVPcHRpb25zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzcG9uc2U7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KCk7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQXBpRm9ybWF0dGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3Nvcic7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNDb21waWxhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNQcm9jZXNzb3InO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbk1hdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5FeHBhbnNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uSW5mbyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblNldCc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblN1YnNldENhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlcXVlc3QnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtRW50cnlTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vS2V5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uRXZlbnRIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vTG9ja1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeU1hdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeVBhcnNlcic7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Tb2NrZXRNZXNzYWdlSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL1V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNvbGxlY3Rpb25IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25FdmVudEhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzRGVsdGEnO1xuZXhwb3J0ICogZnJvbSAnLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vUmVxdWVzdEJ1ZmZlcic7XG4iLCJpbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSwgVGVtcGxhdGVGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEVudHJ5UGFyZW50TnVsbCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENvbHVtbkhhbmRsZXIgfSBmcm9tICcuL0NvbHVtbkhhbmRsZXInO1xuaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4vQ29sdW1uVXRpbCc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4vUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUNhY2hlIHtcblxuXHRwdWJsaWMgdGVtcGxhdGVzOiB7XG5cdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiBUZW1wbGF0ZTxhbnk+XG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlckZhY3Rvcnk6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHByaXZhdGUgY29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRwcml2YXRlIHRlbXBsYXRlRmFjdG9yeTogVGVtcGxhdGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdCkge1xuXG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSB7QGxpbmsgVGVtcGxhdGUgdGVtcGxhdGV9XG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVtVHlwZSBUaGUge0BsaW5rIEl0ZW1UeXBlIEl0ZW1UeXBlfSBvZiB0aGUgdGVtcGxhdGUgaXRlbVxuXHQgKiBAcGFyYW0gaXRlbUlkIFVzZWQgZm9yIGNhY2hpbmcsIG11bHRpcGxlIGNvbmN1cnJlbnQgdGVtcGxhdGUgY2FsbHMgZm9yIHRoZSBzYW1lIGl0ZW1JZCB3aWxsIHJldHVybiB0aGUgc2FtZSB0ZW1wbGF0ZVxuXHQgKiBAcGFyYW0gdGVtcGxhdGVPcHRpb25zXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZUNvbHVtbnMgQWRkaXRpb25hbCBjb2x1bW5zIHRvIGJlIGZldGNoZWQsIHdpbGwgYmUgc3RvcmVkIGluIHRoZSB0ZW1wbGF0ZSAtIHdhcm5pbmcgLSB0aGUgVGVtcGxhdGUgd29uJ3QgaGF2ZSB2YWx1ZXMgZm9yIHRob3NlIGNvbHVtbnNcblx0ICogQHBhcmFtIGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZSBBbiBvcHRpb25hbCB7QGxpbmsgRW50cnlQYXJlbnROdWxsIGVudHJ5IHBhcmVudH0gb3Ige0BsaW5rIEl0ZW1UeXBlIHBhcmVudCBpdGVtVHlwZX0sIGlmIHRoZSBwYXJlbnQgaXMgcGFzc2VkIHRoZSB0ZW1wbGF0ZUNvbHVtbnMgd2lsbCBiZSBleHBhbmRlZCB3aXRoIHRoZSBwcm9wZXIgbGluayBjb2x1bW5zIChUaHJvdWdoIHtAbGluayBDb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayBDb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGlua30pXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIGBgYFxuXHQgKiAgY29uc3QgcGFyZW50OiBFbnRyeVBhcmVudCA9IHtcblx0ICogICAgICBpdGVtVHlwZTogJ0Z1bmN0aWUnLFxuXHQgKiAgICAgIGl0ZW1JZDogMTAsXG5cdCAqICB9O1xuXHQgKlxuXHQgKiAgcmV0dXJuIGNvcmUudGVtcGxhdGVDYWNoZVxuXHQgKiAgICAgIC5mZXRjaFRlbXBsYXRlKFxuXHQgKiAgICAgICAgICAnUGxhbm5pbmdwZXJzb25lZWwnLFxuXHQgKiAgICAgICAgICB1bmRlZmluZWQsXG5cdCAqICAgICAgICAgIHt9LFxuXHQgKiAgICAgICAgICB7fSxcblx0ICogICAgICAgICAgcGFyZW50LFxuXHQgKiAgICAgIClcblx0ICogICAgICAudGhlbihcblx0ICogICAgICAgICAgKHRlbXBsYXRlOiBUZW1wbGF0ZTwnUGxhbm5pbmdwZXJzb25lZWwnPikgPT4ge1xuXHQgKiAgICAgICAgICAgICAgY29uc3QgY2hhbmdlc0RlbHRhID0gdHJhbnNhY3Rpb24uY3JlYXRlQ2hhbmdlc0RlbHRhKCk7XG5cdCAqXG5cdCAqICAgICAgICAgICAgICBmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBzZWxlY3RlZEl0ZW1zKSB7XG5cdCAqICAgICAgICAgICAgICAgICAgY2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICBjb3JlLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpLFxuXHQgKiAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5maWVsZHMsXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmNvbHVtbnMsXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHBhcmVudCxcblx0ICogICAgICAgICAgICAgICAgICApO1xuXHQgKiAgICAgICAgICAgICAgfVxuXHQgKlxuXHQgKiAgICAgICAgICAgICAgdHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0ICogICAgICAgICAgKTtcblx0ICogIGBgYFxuXHQgKi9cblx0cHVibGljIGZldGNoVGVtcGxhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZD86IEl0ZW1JZCxcblx0XHR0ZW1wbGF0ZU9wdGlvbnM6IGFueSA9IHt9LFxuXHRcdHRlbXBsYXRlQ29sdW1uczogYW55ID0ge30sXG5cdFx0ZW50cnlQYXJlbnRPclBhcmVudEl0ZW1UeXBlOiBFbnRyeVBhcmVudE51bGwgfCBJdGVtVHlwZSA9IG51bGwsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8VGVtcGxhdGU8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGhhc1RlbXBsYXRlT3B0aW9ucyA9IGhhc1Byb3BlcnRpZXModGVtcGxhdGVPcHRpb25zKTtcblx0XHQvLyB0b2RvW2NhY2hlXSBXZSBhbHdheXMgbmVlZCB0byBmZXRjaCBjb2x1bW5zIG9mIHRoZSBtYWluIEl0ZW1UeXBlXG5cdFx0Ly8gY29uc3QgY29sdW1uSXRlbVR5cGUgPSBnZXRGaXJzdFByb3BlcnR5KHRlbXBsYXRlQ29sdW1ucyk7IC8vIGl0J3MgcG9zc2libGUgdG8gYWRkIGNvbHVtbnMgdG8gbGlua2VkIGl0ZW1zXG5cblx0XHRjb25zdCByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdGlmICh0ZW1wbGF0ZUNvbHVtbnNbaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdFtcblx0XHRcdFx0e2NyZWF0b3I6IFsnZGlzcGxheW5hbWUnXX0sXG5cdFx0XHRcdCdjcmVhdGVkJyxcblx0XHRcdFx0J3Blcm1pc3Npb25zJyxcblx0XHRcdF0sXG5cdFx0KTtcblxuXHRcdGlmIChlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGUgIT09IG51bGwpIHtcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5jb2x1bW5VdGlsLmdldENvbHVtbnNGcm9tTGluayhcblx0XHRcdFx0XHQodHlwZW9mIGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZSA9PT0gJ3N0cmluZycpXG5cdFx0XHRcdFx0XHQ/IGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZVxuXHRcdFx0XHRcdFx0OiBlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGUuaXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0gPSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmdldCgpW2l0ZW1UeXBlXTtcblxuXHRcdGlmICghaGFzVGVtcGxhdGVPcHRpb25zKSB7XG5cdFx0XHRjb25zdCBjYWNoZWRUZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVzW2l0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjYWNoZWRUZW1wbGF0ZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCYmIChcblx0XHRcdFx0XHRpdGVtVHlwZSA9PT0gbnVsbFxuXHRcdFx0XHRcdHx8IHRoaXMuY29sdW1uVXRpbC5yZXNwb25zZUNvbHVtbnNBdmFpbGFibGUoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHRjYWNoZWRUZW1wbGF0ZS5yZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjYWNoZWRUZW1wbGF0ZSBhcyBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbChcblx0XHRcdFx0e1xuXHRcdFx0XHRcdHRlbXBsYXRlOiB0aGlzLnJlcXVlc3RCdWZmZXJGYWN0b3J5LmZldGNoQnlMb2NhbElkKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRhZGRpdGlvbmFsQ29sdW1uczogdGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0XHQ/IHt9XG5cdFx0XHRcdFx0XHQ6IHRoaXMuY29sdW1uSGFuZGxlci5mZXRjaChcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0sXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc29sdmVkID0+IHtcblx0XHRcdFx0XHRjb25zdCB0ZW1wbGF0ZVJlc3BvbnNlID0gcmVzb2x2ZWQudGVtcGxhdGU7XG5cblx0XHRcdFx0XHRjb25zdCB0ZW1wbGF0ZSA9IHRoaXMudGVtcGxhdGVGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0dGVtcGxhdGVSZXNwb25zZSxcblx0XHRcdFx0XHRcdHJlc29sdmVkLmFkZGl0aW9uYWxDb2x1bW5zLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAoIWhhc1RlbXBsYXRlT3B0aW9ucyAmJiB0ZW1wbGF0ZVJlc3BvbnNlLmNhY2hlYWJsZSkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZW1wbGF0ZXNbaXRlbVR5cGVdID0gdGVtcGxhdGU7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRlbXBsYXRlO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5cbmV4cG9ydCBjbGFzcyBBcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAocHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcikge1xuXG5cdH1cblxuXHRjb25zdHJ1Y3QgKHJlc3BvbnNlOiBhbnkpOiBBcGlSZXNwb25zZVByb2Nlc3NvciB7XG5cdFx0cmV0dXJuIG5ldyBBcGlSZXNwb25zZVByb2Nlc3Nvcih0aGlzLmFwaUZvcm1hdHRlciwgcmVzcG9uc2UpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDaGFuZ2VzQ29tcGlsYXRpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKCkge1xuXHR9XG5cblx0Y29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblx0XHRyZXR1cm4gbmV3IENoYW5nZXNDb21waWxhdGlvbihcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25DYWNoZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCk6IENvbGxlY3Rpb25DYWNoZSB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uQ2FjaGUoXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cdFxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSwgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBDb2xsZWN0aW9uRW50cnlPcHRpb25zLCBDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlIH0gZnJvbSAnLi4vbW9kZWxzLyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzLyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5IH0gZnJvbSAnLi9Db2x1bW5TZXRGYWN0b3J5JztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FbnRyeUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0KSB7XG5cdH1cblxuXHRjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRuZXcgQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlciwgU2VydmVyQ2FjaGUsIFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlIHwgU2VydmVyQ2FjaGUsXG5cdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXM6IDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4oaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSkgPT4gQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHQpOiBDb2xsZWN0aW9uTWF0Y2hlciB7XG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uTWF0Y2hlcihcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FZGl0UmVzb3VyY2UsXG5cdENvbGxlY3Rpb25FbnRyeSxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLFxuXHRDb2xsZWN0aW9uVmlld1Jlc291cmNlLFxuXHRFZGl0UmVzb3VyY2UsXG5cdEl0ZW1SZXNvdXJjZSxcblx0TG9jYWxWaWV3UmVzb3VyY2UsXG5cdFJlbW90ZVZpZXdSZXNvdXJjZSxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHB1YmxpYyBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHB1YmxpYyBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHVibGljIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlfSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSwgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBvcHRpb25zSW5zdGFuY2UgPSBuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKTtcblxuXHRcdGlmIChvcHRpb25zSW5zdGFuY2UuZWRpdENvbGxlY3Rpb24pIHtcblx0XHRcdHJldHVybiBuZXcgQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdG9wdGlvbnNJbnN0YW5jZSxcblx0XHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBuZXcgQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcyxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdG9wdGlvbnNJbnN0YW5jZSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtbkV4cGFuc2lvbiB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uSW5mb0ZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtbkluZm9GYWN0b3J5OiBDb2x1bW5JbmZvRmFjdG9yeSxcblx0KSB7XG5cblx0fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sdW1uRXhwYW5zaW9uKFxuXHRcdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uSW5mbyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uLCBSb290Q29sdW1uTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uSW5mb0ZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoKSB7fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGFwaUNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0cGFyZW50OiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4gfCBudWxsXG5cdCk6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDb2x1bW5JbmZvKGFwaUNvbHVtbiwgcGFyZW50KTtcblx0fVxuXG5cdGNvbnN0cnVjdEZyb21Sb290TWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCxcblx0XHRwYXJlbnQ6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB8IG51bGwgPSBudWxsXG5cdCkge1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiByb290Q29sdW1uTWFwKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5NYXBFbnRyeSA9IHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdO1xuXHRcdFx0Y29uc3QgY29sdW1uSW5mbyA9IHRoaXMuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4oY29sdW1uTWFwRW50cnkuYXBpQ29sdW1uLCBwYXJlbnQpO1xuXHRcdFx0Y29uc3QgY2hpbGRDb2x1bW5zID0gdGhpcy5jb25zdHJ1Y3RGcm9tUm9vdE1hcDxJdGVtVHlwZVR5cGU+KGNvbHVtbk1hcEVudHJ5LmNoaWxkcmVuLCBjb2x1bW5JbmZvKTtcblxuXHRcdFx0aWYgKGNoaWxkQ29sdW1ucy5sZW5ndGggPiAwKVxuXHRcdFx0XHRjb2x1bW5JbmZvLnNldENoaWxkcmVuKGNvbHVtbkluZm8uYXBpQ29sdW1uLml0ZW1UeXBlLCBjaGlsZENvbHVtbnMpO1xuXG5cdFx0XHRyZXN1bHQucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5IYW5kbGVyLCBDb2x1bW5JbmZvLCBDb2x1bW5TZXQsIENvbHVtblV0aWwsIGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtbkluZm9GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRJdGVtVHlwZSxcblx0SXRlbVR5cGVNYXAsXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFJvb3RDb2x1bW5NYXAsXG59IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtblNldEZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyLFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcml2YXRlIGNvbHVtbkluZm9GYWN0b3J5OiBDb2x1bW5JbmZvRmFjdG9yeSxcblx0KSB7XG5cdH1cblxuXHRjb25zdHJ1Y3RTdHViPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBjb2x1bW5TZXQgPSBuZXcgQ29sdW1uU2V0KFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRjb2x1bW5TZXQucmVxdWVzdCA9IHJlcXVlc3RDb2x1bW5zO1xuXHRcdGNvbHVtblNldC5yZXF1ZXN0Q29sdW1uc1RydWUgPSByZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZTtcblxuXHRcdHJldHVybiBjb2x1bW5TZXQ7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZVN0dWI8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldCxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbiA9IHRydWUsXG5cdFx0aW5jbHVkZUlkQ29sdW1uOiBib29sZWFuID0gdHJ1ZSxcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBjb2x1bW5TZXQucmVxdWVzdENvbHVtbnNUcnVlID9cblx0XHRcdHRoaXMucHJvY2Vzc1Jlc3BvbnNlQ29sdW1ucyhcblx0XHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHQpIDpcblx0XHRcdHRoaXMucHJvY2Vzc1JlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdFx0aW5jbHVkZUlkQ29sdW1uLFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZz86IGJvb2xlYW4sXG5cdFx0aW5jbHVkZUlkQ29sdW1uPzogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLnJlc29sdmVTdHViKFxuXHRcdFx0dGhpcy5jb25zdHJ1Y3RTdHViKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdGluY2x1ZGVJZENvbHVtbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdEZyb21SZXNwb25zZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbiA9IHRydWUsXG5cdCk6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCBjb2x1bW5TZXQgPSBuZXcgQ29sdW1uU2V0KFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRjb2x1bW5TZXQucmVxdWVzdENvbHVtbnNUcnVlID0gZmFsc2U7XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzUmVzcG9uc2VDb2x1bW5zIChcblx0XHRjb2x1bW5TZXQ6IENvbHVtblNldCxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0IHtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbHVtblNldC5pdGVtVHlwZTtcblx0XHRjb25zdCByb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwID0ge307XG5cdFx0Y29uc3QgcHJvY2Vzc2VkSXRlbVR5cGVNYXA6IEl0ZW1UeXBlTWFwPGJvb2xlYW4+ID0ge307XG5cblx0XHRjb2x1bW5TZXQucmVzcG9uc2UgPSByZXNwb25zZUNvbHVtbnM7XG5cblx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXBGcm9tUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRyb290Q29sdW1uTWFwLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdHByb2Nlc3NlZEl0ZW1UeXBlTWFwLFxuXHRcdCk7XG5cblx0XHR0aGlzLnByb2Nlc3NDb2x1bW5JbmZvKFxuXHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeS5jb25zdHJ1Y3RGcm9tUm9vdE1hcChyb290Q29sdW1uTWFwKSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRjb2x1bW5TZXQucmVxdWVzdCA9IHRoaXMuY29uc3RydWN0UmVxdWVzdENvbHVtbnNGcm9tUm9vdENvbHVtbk1hcChyb290Q29sdW1uTWFwKTtcblxuXHRcdHJldHVybiBjb2x1bW5TZXQ7XG5cdH1cblxuXHRwcml2YXRlIGNvbnN0cnVjdFJlcXVlc3RDb2x1bW5zRnJvbVJvb3RDb2x1bW5NYXAgKFxuXHRcdHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAsXG5cdCk6IEFwaVJlcXVlc3RDb2x1bW5bXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gcm9vdENvbHVtbk1hcCkge1xuXHRcdFx0Y29uc3QgZW50cnkgPSByb290Q29sdW1uTWFwW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKGhhc1Byb3BlcnRpZXMoZW50cnkuY2hpbGRyZW4pKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKHtcblx0XHRcdFx0XHRbY29sdW1uSWRdOiB0aGlzLmNvbnN0cnVjdFJlcXVlc3RDb2x1bW5zRnJvbVJvb3RDb2x1bW5NYXAoZW50cnkuY2hpbGRyZW4pLFxuXHRcdFx0XHR9KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGNvbHVtbklkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRSb290Q29sdW1uTWFwRnJvbVJlc3BvbnNlQ29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRyb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwLFxuXHRcdGVuYWJsZUNhY2hpbmc6IGJvb2xlYW4sXG5cdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXA6IEl0ZW1UeXBlTWFwPGJvb2xlYW4+LFxuXHQpIHtcblx0XHRpZiAocHJvY2Vzc2VkSXRlbVR5cGVNYXBbaXRlbVR5cGVdID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXBbaXRlbVR5cGVdID0gdHJ1ZTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gcmVzcG9uc2VDb2x1bW5zW2l0ZW1UeXBlXSkge1xuXHRcdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW4gPSByZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChlbmFibGVDYWNoaW5nKSB7XG5cdFx0XHRcdHRoaXMuY29sdW1uSGFuZGxlci5zZXRDb2x1bW4oXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW4sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChyb290Q29sdW1uTWFwW2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdID0ge1xuXHRcdFx0XHRcdGFwaUNvbHVtbjogcmVzcG9uc2VDb2x1bW4sXG5cdFx0XHRcdFx0Y2hpbGRyZW46IHt9LFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdCF0aGlzLmNvbHVtblV0aWwuaXNJdGVtQ29sdW1uKFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uLFxuXHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNoaWxkcmVuID0gcmVzcG9uc2VDb2x1bW5zW3Jlc3BvbnNlQ29sdW1uLml0ZW1UeXBlXTtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjaGlsZHJlbiA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdHx8ICFoYXNQcm9wZXJ0aWVzKGNoaWxkcmVuKVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXBGcm9tUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRyb290Q29sdW1uTWFwW2NvbHVtbklkXS5jaGlsZHJlbixcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8vIHdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIHJlcXVlc3Rjb2x1bW5zIGRvZXMgKm5vdCogZXF1YWwgJ3RydWUnLCBhbmQgbWlnaHQgY29udGFpbiBkZXJpdmVkIGNvbHVtbnNcblx0cHJpdmF0ZSBwcm9jZXNzUmVxdWVzdENvbHVtbnMgKFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0LFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuLFxuXHRcdGluY2x1ZGVJZENvbHVtbjogYm9vbGVhbixcblx0KTogQ29sdW1uU2V0IHtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbHVtblNldC5pdGVtVHlwZTtcblx0XHRjb25zdCByb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwID0ge307XG5cblx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRjb2x1bW5TZXQucmVxdWVzdCBhcyBBcGlSZXF1ZXN0Q29sdW1uW10sIC8vIHdlIGNhbiBhc3N1bWUgcmVxdWVzdENvbHVtbnMgaXMgYW4gYXJyYXkgaGVyZVxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRyb290Q29sdW1uTWFwLFxuXHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHQpO1xuXG5cdFx0aWYgKGluY2x1ZGVJZENvbHVtbikge1xuXHRcdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwKFxuXHRcdFx0XHRbJ2lkJ10sXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXAsXG5cdFx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGNvbHVtblNldC5yZXNwb25zZSA9IHt9O1xuXG5cdFx0dGhpcy5wcm9jZXNzQ29sdW1uSW5mbyhcblx0XHRcdGNvbHVtblNldCxcblx0XHRcdHRoaXMuY29sdW1uSW5mb0ZhY3RvcnkuY29uc3RydWN0RnJvbVJvb3RNYXAocm9vdENvbHVtbk1hcCksXG5cdFx0XHRpdGVtVHlwZSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGNvbHVtblNldDtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc0NvbHVtbkluZm8gKFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0LFxuXHRcdGNvbHVtbkluZm9PYmplY3RzOiBDb2x1bW5JbmZvW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCByZXNwb25zZSA9IGNvbHVtblNldC5yZXNwb25zZTtcblxuXHRcdGlmIChyZXNwb25zZVtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzcG9uc2VbaXRlbVR5cGVdID0ge307XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JbmZvIG9mIGNvbHVtbkluZm9PYmplY3RzKSB7XG5cdFx0XHRyZXNwb25zZVtpdGVtVHlwZV1bY29sdW1uSW5mby5pZF0gPSBjb2x1bW5JbmZvLmFwaUNvbHVtbjtcblx0XHRcdGNvbHVtblNldC5ncm91cENvbHVtbkluZm8oY29sdW1uSW5mbyk7XG5cblx0XHRcdGlmICghY29sdW1uSW5mby5pc0xlYWYpIHtcblx0XHRcdFx0dGhpcy5wcm9jZXNzQ29sdW1uSW5mbyhcblx0XHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHRcdFx0Y29sdW1uSW5mby5jaGlsZHJlbixcblx0XHRcdFx0XHRjb2x1bW5JbmZvLml0ZW1UeXBlLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZXhwYW5kUm9vdENvbHVtbk1hcCAoXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbixcblx0KTogdm9pZCB7XG5cdFx0Zm9yIChjb25zdCByZXF1ZXN0Q29sdW1uIG9mIHJlcXVlc3RDb2x1bW5zKSB7XG5cdFx0XHRjb25zdCB7aWQ6IGNvbHVtbklkLCBjaGlsZHJlbn0gPSB0aGlzLmNvbHVtblV0aWwucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXG5cdFx0XHRsZXQgcmVzcG9uc2VDb2x1bW47XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW4gPSByZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdW2NvbHVtbklkXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdCdObyBhcGkgY29sdW1uIGZvciByZXF1ZXN0IGNvbHVtbicsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0J2ZvciBpdGVtVHlwZScsXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChlbmFibGVDYWNoaW5nKSB7XG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uID0gdGhpcy5jb2x1bW5IYW5kbGVyLnNldENvbHVtbihcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cm9vdENvbHVtbk1hcFtjb2x1bW5JZF0gPSB7XG5cdFx0XHRcdFx0YXBpQ29sdW1uOiByZXNwb25zZUNvbHVtbixcblx0XHRcdFx0XHRjaGlsZHJlbjoge30sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChjaGlsZHJlbi5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcChcblx0XHRcdFx0Y2hpbGRyZW4sXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdLmNoaWxkcmVuLFxuXHRcdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblN1YnNldENhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoKSB7fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IENvbHVtblN1YnNldENhY2hlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPihyZXF1ZXN0Q29sdW1ucyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ3JlYXRlQ29tcGlsYXRpb24sIENyZWF0ZVJlcXVlc3QsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZXF1ZXN0RmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHQpIHtcblxuXHR9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29tcGlsYXRpb246IENyZWF0ZUNvbXBpbGF0aW9uLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrdXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdCk6IENyZWF0ZVJlcXVlc3Q8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDcmVhdGVSZXF1ZXN0KFxuXHRcdFx0dGhpcy5hcGlGb3JtYXR0ZXIsXG5cdFx0XHR0aGlzLmtleVNlcnZpY2UsXG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29tcGlsYXRpb24sXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGJyZWFrdXBCeVBhcmVudCxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgUXVlcnlNYXRjaGVyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5cbmV4cG9ydCBjbGFzcyBJdGVtQ2FjaGVGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpOiBJdGVtQ2FjaGUge1xuXHRcdHJldHVybiBuZXcgSXRlbUNhY2hlKFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxuXHRcbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ29sdW1uU2V0LCBJdGVtRW50cnlTZXJ2aWNlLCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5LCBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEF1dGhJbnRlcmZhY2UsIEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIEl0ZW1FbnRyeUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXV0aEludGVyZmFjZTogQXV0aEludGVyZmFjZSxcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHVibGljIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0cHVibGljIGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHVibGljIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHVibGljIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y29sdW1uSW5mbzogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IEl0ZW1FbnRyeShcblx0XHRcdHRoaXMsXG5cdFx0XHRjb2x1bW5JbmZvLml0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0Y29sdW1uSW5mbyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIENvbHVtblV0aWwsIExvY2tTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7XG5cdEVkaXRSZXNvdXJjZSxcblx0SXRlbUVudHJ5LFxuXHRJdGVtUmVzb3VyY2UsXG5cdEl0ZW1SZXNvdXJjZU9wdGlvbnMsXG5cdExvY2FsVmlld1Jlc291cmNlLFxuXHRSZW1vdGVWaWV3UmVzb3VyY2UsXG59IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtT3B0aW9uc0ludGVyZmFjZSwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFJlc291cmNlQ29uc3RydWN0b3I8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUsIFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4gPSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPikgPT4gVDtcblxuZXhwb3J0IGNsYXNzIEl0ZW1SZXNvdXJjZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIGxvY2tTZXJ2aWNlOiBMb2NrU2VydmljZSxcblx0XHRwdWJsaWMgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwdWJsaWMgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwdWJsaWMgbGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGdldENvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IFJlc291cmNlQ29uc3RydWN0b3I8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldENvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7cmVtb3RlOiB0cnVlfSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogUmVzb3VyY2VDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0Q29uc3RydWN0b3I8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogUmVzb3VyY2VDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXRDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBSZXNvdXJjZUNvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSwgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBvcHRpb25zSW5zdGFuY2UgPSBuZXcgSXRlbVJlc291cmNlT3B0aW9ucyhvcHRpb25zKTtcblxuXHRcdHJldHVybiAoXG5cdFx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdCkgPT4ge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0V2l0aE9wdGlvbnM8SXRlbVR5cGVUeXBlPihcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRvcHRpb25zSW5zdGFuY2UsXG5cdFx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0KTtcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpOiBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KTogTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCk6IFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLmNvbnN0cnVjdFdpdGhPcHRpb25zKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0bmV3IEl0ZW1SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGlzTmV3LFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGNvbnN0cnVjdFdpdGhPcHRpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtUmVzb3VyY2VPcHRpb25zLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGlzTmV3OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblx0XHRpZiAob3B0aW9ucy5lZGl0KSB7XG5cdFx0XHRyZXR1cm4gbmV3IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdGlzTmV3LFxuXHRcdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdGlvbnMucmVtb3RlKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdGlzTmV3LFxuXHRcdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRpc05ldyxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdENvbHVtbkNhY2hlLFxuXHRDb2x1bW5IYW5kbGVyLFxuXHRDb2x1bW5VdGlsLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRLZXlTZXJ2aWNlLFxuXHRMb2NrU2VydmljZSxcblx0UXVlcnlTZXJ2aWNlLFxufSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4uL2NsYXNzZXMvUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuaW1wb3J0IHsgVGVtcGxhdGVDYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQgeyBSbUNvcmUgfSBmcm9tICcuLi9jb3JlJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uU2V0RmFjdG9yeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRJdGVtQ2FjaGVGYWN0b3J5LFxuXHRJdGVtRW50cnlGYWN0b3J5LFxuXHRJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRRdWVyeVBhcnNlckZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxufSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0QXV0aEludGVyZmFjZSxcblx0RXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRQcm9taXNlTGlicmFyeUludGVyZmFjZSxcbn0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi9DaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeSB7XG5cblx0cHJpdmF0ZSByZWFkb25seSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGU7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29yZTogUm1Db3JlLFxuXHRcdHByaXZhdGUgY29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlLFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlck1hbmFnZXI6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIGF1dGhJbnRlcmZhY2U6IEF1dGhJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdHByaXZhdGUgY2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk6IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LFxuXHRcdHByaXZhdGUgbG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdHByaXZhdGUgbW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTogTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBpdGVtUmVzb3VyY2VGYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHByaXZhdGUgdGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZSxcblx0XHRwcml2YXRlIGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRwcml2YXRlIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uRW50cnlGYWN0b3J5OiBDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRwcml2YXRlIGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblx0XHR0aGlzLnNlcnZlckNhY2hlID0gbmV3IFNlcnZlckNhY2hlKFxuXHRcdFx0dGhpcy5jaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSxcblx0XHRcdHRoaXMuY29yZSxcblx0XHRcdHRoaXMuY29sdW1uQ2FjaGUsXG5cdFx0XHR0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRoaXMuYXV0aEludGVyZmFjZSxcblx0XHRcdHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdHRoaXMubG9ja1NlcnZpY2UsXG5cdFx0XHR0aGlzLm1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0aGlzLml0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0aGlzLnRlbXBsYXRlQ2FjaGUsXG5cdFx0XHR0aGlzLml0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLmVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdHRoaXMucHJvbWlzZVNlcnZpY2UsXG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlcixcblx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbHVtbkhhbmRsZXIsXG5cdFx0XHR0aGlzLmNvbHVtblNldEZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uVXRpbCxcblx0XHRcdHRoaXMuaXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZSxcblx0XHRcdHRoaXMua2V5U2VydmljZSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcy5xdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0XHR0aGlzLnF1ZXJ5U2VydmljZSxcblx0XHRcdHRoaXMubGlua1RyZWVTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogVG9kb1tjYWNoZV0gU3RvcmUgYSBtYXAgb2YgYWxsIHRyYW5zYWN0aW9ucyBieSB0cmFuc2FjdGlvbiBpZCA/XG5cdCAqL1xuXHRwdWJsaWMgZ2V0QnlJZCAoaWQ6IHN0cmluZyk6IFRyYW5zYWN0aW9uQ2FjaGUgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGZpbmRDaGlsZCA9IChjaGlsZHJlbjogVHJhbnNhY3Rpb25DYWNoZVtdKSA9PiB7XG5cdFx0XHRmb3IgKGNvbnN0IHRyYW5zYWN0aW9uIG9mIGNoaWxkcmVuKSB7XG5cdFx0XHRcdGlmICh0cmFuc2FjdGlvbi5pZCA9PT0gaWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJhbnNhY3Rpb247XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBjaGlsZFJlc3VsdCA9IGZpbmRDaGlsZCh0cmFuc2FjdGlvbi5jaGlsZHJlbik7XG5cblx0XHRcdFx0aWYgKGNoaWxkUmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gY2hpbGRSZXN1bHQ7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9O1xuXG5cdFx0cmV0dXJuIGZpbmRDaGlsZCh0aGlzLnNlcnZlckNhY2hlLmNoaWxkcmVuKTtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKGlkPzogc3RyaW5nKTogVHJhbnNhY3Rpb25DYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMuc2VydmVyQ2FjaGUuY3JlYXRlQ2hpbGQoaWQpO1xuXHR9XG5cblx0LypAaW50ZXJuYWwqL1xuXHRwdWJsaWMgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZTtcblx0fVxufVxuIiwiaW1wb3J0IHsgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZXhwb3J0IGNsYXNzIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbiB7XG5cdFx0cmV0dXJuIG5ldyBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24odHJhbnNhY3Rpb24pO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIFF1ZXJ5TWF0Y2hlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeU1hdGNoZXJGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXJcblx0KSB7XG5cblx0fVxuXG5cdGNvbnN0cnVjdCAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBmaWVsZHM6IEZpZWxkTWFwLCBwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCk6IFF1ZXJ5TWF0Y2hlciB7XG5cdFx0cmV0dXJuIG5ldyBRdWVyeU1hdGNoZXIoXG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0ZmllbGRzLFxuXHRcdFx0cGFyZW50XG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgUXVlcnlQYXJzZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5IH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUXVlcnlQYXJzZXJGYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKCkge1xuXHR9XG5cblx0Y29uc3RydWN0IChxdWVyeTogQXBpUXVlcnksIHBhcmFtZXRlcnM/OiBhbnkpOiBRdWVyeVBhcnNlciB7XG5cdFx0cmV0dXJuIG5ldyBRdWVyeVBhcnNlcihxdWVyeSwgcGFyYW1ldGVycyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblV0aWwsIFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbFxuXHQpIHtcblx0fVxuXG5cdGNvbnN0cnVjdCAoKTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB7XG5cdFx0cmV0dXJuIG5ldyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uKFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uVXRpbCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uU2V0RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBUZW1wbGF0ZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZSwgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZUZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHVibGljIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXNwb25zZTogQXBpUmVzcG9uc2UsXG5cdFx0YWRkaXRpb25hbENvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFRlbXBsYXRlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgVGVtcGxhdGU8SXRlbVR5cGVUeXBlPihcblx0XHRcdHRoaXMsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0YWRkaXRpb25hbENvbHVtbnMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vY2xhc3Nlcy9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi9jbGFzc2VzL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcblxuZXhwb3J0IGNsYXNzIENoYW5nZXNEZWx0YUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0ICgpOiBDaGFuZ2VzRGVsdGEge1xuXHRcdHJldHVybiBuZXcgQ2hhbmdlc0RlbHRhKFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxuXHQvKkBpbnRlcm5hbCovXG5cdHB1YmxpYyBjb25zdHJ1Y3RJbnRlcm5hbERlbHRhICgpOiBJbnRlcm5hbENoYW5nZXNEZWx0YSB7XG5cdFx0cmV0dXJuIG5ldyBJbnRlcm5hbENoYW5nZXNEZWx0YShcblx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZSxcblx0XHQpO1xuXHR9XG5cbn1cbiIsImltcG9ydCB7XG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRDaGFuZ2VzUHJvY2Vzc29yLFxuXHRDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG59IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5IH0gZnJvbSAnLi9DaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5JztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHsgQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4vQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSc7XG5pbXBvcnQgeyBDcmVhdGVSZXF1ZXN0RmFjdG9yeSB9IGZyb20gJy4vQ3JlYXRlUmVxdWVzdEZhY3RvcnknO1xuaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5JztcblxuZXhwb3J0IGNsYXNzIENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTogQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjcmVhdGVSZXF1ZXN0RmFjdG9yeTogQ3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0YnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2s/OiBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdCk6IENoYW5nZXNQcm9jZXNzb3Ige1xuXHRcdHJldHVybiBuZXcgQ2hhbmdlc1Byb2Nlc3Nvcihcblx0XHRcdHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLmNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRcdFx0dGhpcy5lcnJvckhhbmRsZXIsXG5cdFx0XHR0aGlzLnByb21pc2VTZXJ2aWNlLFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0YnJlYWtVcEJ5UGFyZW50LFxuXHRcdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHRcdCk7XG5cdH1cbn1cbiIsImV4cG9ydCAqIGZyb20gJy4vQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25DYWNoZUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uRW50cnlGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkV4cGFuc2lvbkZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5JbmZvRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblNldEZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5TdWJzZXRDYWNoZUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9DcmVhdGVSZXF1ZXN0RmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1DYWNoZUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtRW50cnlGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbVJlc291cmNlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1RyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5TWF0Y2hlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9RdWVyeVBhcnNlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9SZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1RlbXBsYXRlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSc7XG4iLCJpbXBvcnQge1xuXHRBcGlGb3JtYXR0ZXIsXG5cdEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlLFxuXHRDb2x1bW5DYWNoZSxcblx0Q29sdW1uSGFuZGxlcixcblx0Q29sdW1uVXRpbCxcblx0SXRlbUVudHJ5U2VydmljZSxcblx0S2V5U2VydmljZSxcblx0TG9ja1NlcnZpY2UsXG5cdFF1ZXJ5U2VydmljZSxcblx0U29ja2V0TWVzc2FnZUhhbmRsZXIsXG59IGZyb20gJy4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4vY2xhc3Nlcy9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5pbXBvcnQgeyBUZW1wbGF0ZUNhY2hlIH0gZnJvbSAnLi9jbGFzc2VzL1RlbXBsYXRlQ2FjaGUnO1xuaW1wb3J0IHtcblx0QXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5LFxuXHRDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtbkluZm9GYWN0b3J5LFxuXHRDb2x1bW5TZXRGYWN0b3J5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdENyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRJdGVtQ2FjaGVGYWN0b3J5LFxuXHRJdGVtRW50cnlGYWN0b3J5LFxuXHRJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRRdWVyeVBhcnNlckZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRUZW1wbGF0ZUZhY3RvcnksXG5cdFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LFxufSBmcm9tICcuL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBDaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSB9IGZyb20gJy4vZmFjdG9yaWVzL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5JztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RTZXJ2aWNlSW50ZXJmYWNlLFxuXHRBdXRoSW50ZXJmYWNlLFxuXHRFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxufSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBSbUNvcmUge1xuXHR2ZXJzaW9uOiBzdHJpbmcgPSAnMi4wLjEnO1xuXHRub29wID0gbm9vcDtcblxuXHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcjtcblx0YXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlO1xuXHRhcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnk6IEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeTtcblx0Y2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTogQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTtcblx0Y2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk6IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5O1xuXHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5O1xuXHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5OiBDb2xsZWN0aW9uRW50cnlGYWN0b3J5O1xuXHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlO1xuXHRjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk6IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTtcblx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeTtcblx0Y29sbGVjdGlvblJlc291cmNlU2VydmljZTogQ29sbGVjdGlvblJlc291cmNlU2VydmljZTtcblx0Y29sdW1uQ2FjaGU6IENvbHVtbkNhY2hlO1xuXHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5O1xuXHRjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyO1xuXHRjb2x1bW5JbmZvRmFjdG9yeTogQ29sdW1uSW5mb0ZhY3Rvcnk7XG5cdGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3Rvcnk7XG5cdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5O1xuXHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsO1xuXHRjcmVhdGVSZXF1ZXN0RmFjdG9yeTogQ3JlYXRlUmVxdWVzdEZhY3Rvcnk7XG5cdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3Rvcnk7XG5cdGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3Rvcnk7XG5cdGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2U7XG5cdGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3Rvcnk7XG5cdGtleVNlcnZpY2U6IEtleVNlcnZpY2U7XG5cdHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5OiBUcmFuc2FjdGlvbkNhY2hlRmFjdG9yeTtcblx0bG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlO1xuXHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5O1xuXHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5O1xuXHRxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeTtcblx0cXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2U7XG5cdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTtcblx0c29ja2V0TWVzc2FnZUhhbmRsZXI6IFNvY2tldE1lc3NhZ2VIYW5kbGVyO1xuXHR0ZW1wbGF0ZUZhY3Rvcnk6IFRlbXBsYXRlRmFjdG9yeTtcblx0Y2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeTtcblx0dGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0X2FwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZUludGVyZmFjZSxcblx0XHRhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJvbWlzZUxpYnJhcnk6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblx0XHQvLyBDcmVhdGUgdmFyaWFibGVzIGZvciBlYWNoIHNlcnZpY2UgaW4gb3JkZXIgdG8gZ2V0IGEgVHlwZVNjcmlwdCBlcnJvciB3aGVuIGEgZGVwZW5kZW5jeSBoYXNuJ3QgYmVlblxuXHRcdC8vIGluaXRpYWxpemVkIHlldC5cblx0XHRjb25zdCBrZXlTZXJ2aWNlID0gbmV3IEtleVNlcnZpY2UoKTtcblxuXHRcdGNvbnN0IGl0ZW1FbnRyeVNlcnZpY2UgPSBuZXcgSXRlbUVudHJ5U2VydmljZShcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0bGlua1RyZWVTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGFGYWN0b3J5ID0gbmV3IENoYW5nZXNEZWx0YUZhY3RvcnkoXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBhcGlGb3JtYXR0ZXIgPSBuZXcgQXBpRm9ybWF0dGVyKCk7XG5cblx0XHRjb25zdCBhcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkgPSBuZXcgQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5KGFwaUZvcm1hdHRlcik7XG5cdFx0Y29uc3QgYXBpUmVxdWVzdFNlcnZpY2UgPSBuZXcgQXBpUmVxdWVzdFNlcnZpY2UoXG5cdFx0XHRfYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRhcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlckZhY3RvcnkgPSBuZXcgUXVlcnlNYXRjaGVyRmFjdG9yeShhcGlGb3JtYXR0ZXIpO1xuXHRcdGNvbnN0IHF1ZXJ5UGFyc2VyRmFjdG9yeSA9IG5ldyBRdWVyeVBhcnNlckZhY3RvcnkoKTtcblx0XHRjb25zdCBxdWVyeVNlcnZpY2UgPSBuZXcgUXVlcnlTZXJ2aWNlKCk7XG5cblx0XHRjb25zdCBjb2x1bW5VdGlsID0gbmV3IENvbHVtblV0aWwoXG5cdFx0XHRsaW5rVHJlZVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbHVtbkNhY2hlID0gbmV3IENvbHVtbkNhY2hlKGNvbHVtblV0aWwpO1xuXHRcdGNvbnN0IGNvbHVtbkhhbmRsZXIgPSBuZXcgQ29sdW1uSGFuZGxlcihcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRjb2x1bW5DYWNoZSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0KTtcblx0XHRjb25zdCBjb2x1bW5JbmZvRmFjdG9yeSA9IG5ldyBDb2x1bW5JbmZvRmFjdG9yeSgpO1xuXHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSBuZXcgQ29sdW1uRXhwYW5zaW9uRmFjdG9yeShjb2x1bW5JbmZvRmFjdG9yeSk7XG5cblx0XHRjb25zdCBjb2x1bW5TZXRGYWN0b3J5ID0gbmV3IENvbHVtblNldEZhY3RvcnkoXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGNvbHVtbkluZm9GYWN0b3J5LFxuXHRcdCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5ID0gbmV3IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSgpO1xuXG5cdFx0Y29uc3QgbG9ja1NlcnZpY2UgPSBuZXcgTG9ja1NlcnZpY2UoXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHQpO1xuXHRcdGNvbnN0IHRlbXBsYXRlRmFjdG9yeSA9IG5ldyBUZW1wbGF0ZUZhY3RvcnkoXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHQpO1xuXHRcdGNvbnN0IGl0ZW1DYWNoZUZhY3RvcnkgPSBuZXcgSXRlbUNhY2hlRmFjdG9yeShxdWVyeU1hdGNoZXJGYWN0b3J5KTtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VGYWN0b3J5ID0gbmV3IEl0ZW1SZXNvdXJjZUZhY3RvcnkoXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRsb2NrU2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRsaW5rVHJlZVNlcnZpY2UsXG5cdFx0KTtcblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5ID0gbmV3IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkoXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0aXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdGNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0KTtcblx0XHRjb25zdCBpdGVtRW50cnlGYWN0b3J5ID0gbmV3IEl0ZW1FbnRyeUZhY3RvcnkoXG5cdFx0XHRhdXRoSW50ZXJmYWNlLFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0aXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5U2VydmljZSA9IG5ldyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlKFxuXHRcdFx0cXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlID0gbmV3IENvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UoKTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeUZhY3RvcnkgPSBuZXcgQ29sbGVjdGlvbkVudHJ5RmFjdG9yeShcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkNhY2hlRmFjdG9yeSA9IG5ldyBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5KFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5ID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeShxdWVyeU1hdGNoZXJGYWN0b3J5KTtcblxuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5ID0gbmV3IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5KGNvbHVtblV0aWwpO1xuXG5cdFx0Y29uc3QgY3JlYXRlUmVxdWVzdEZhY3RvcnkgPSBuZXcgQ3JlYXRlUmVxdWVzdEZhY3RvcnkoXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgPSBuZXcgQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSgpO1xuXG5cdFx0Y29uc3QgY2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkgPSBuZXcgQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkoXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNyZWF0ZVJlcXVlc3RGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gbmV3IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkoKTtcblxuXHRcdGNvbnN0IHJlcXVlc3RCdWZmZXJNYW5hZ2VyID0gbmV3IFJlcXVlc3RCdWZmZXJNYW5hZ2VyKFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHQpO1xuXG5cdFx0Y29uc3QgdGVtcGxhdGVDYWNoZSA9IG5ldyBUZW1wbGF0ZUNhY2hlKFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0dGVtcGxhdGVGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0KTtcblxuXHRcdGNvbnN0IHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5ID0gbmV3IFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5KFxuXHRcdFx0dGhpcyxcblx0XHRcdGNvbHVtbkNhY2hlLFxuXHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRhdXRoSW50ZXJmYWNlLFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LFxuXHRcdFx0bG9ja1NlcnZpY2UsXG5cdFx0XHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0ZW1wbGF0ZUNhY2hlLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRpdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIuc2V0U2VydmVyQ2FjaGUoXG5cdFx0XHR0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpLFxuXHRcdCk7XG5cblx0XHRjb25zdCBzb2NrZXRNZXNzYWdlSGFuZGxlciA9IG5ldyBTb2NrZXRNZXNzYWdlSGFuZGxlcihcblx0XHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0dGhpcy5hcGlGb3JtYXR0ZXIgPSBhcGlGb3JtYXR0ZXI7XG5cdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSA9IGFwaVJlcXVlc3RTZXJ2aWNlO1xuXHRcdHRoaXMuYXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5ID0gYXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5O1xuXHRcdHRoaXMuY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSA9IGNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk7XG5cdFx0dGhpcy5jaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSA9IGNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5O1xuXHRcdHRoaXMuY29sbGVjdGlvbkNhY2hlRmFjdG9yeSA9IGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlGYWN0b3J5ID0gY29sbGVjdGlvbkVudHJ5RmFjdG9yeTtcblx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UgPSBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlO1xuXHRcdHRoaXMuY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5ID0gY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5O1xuXHRcdHRoaXMuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSA9IGNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlID0gY29sbGVjdGlvblJlc291cmNlU2VydmljZTtcblx0XHR0aGlzLmNvbHVtbkNhY2hlID0gY29sdW1uQ2FjaGU7XG5cdFx0dGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5ID0gY29sdW1uRXhwYW5zaW9uRmFjdG9yeTtcblx0XHR0aGlzLmNvbHVtbkhhbmRsZXIgPSBjb2x1bW5IYW5kbGVyO1xuXHRcdHRoaXMuY29sdW1uSW5mb0ZhY3RvcnkgPSBjb2x1bW5JbmZvRmFjdG9yeTtcblx0XHR0aGlzLmNvbHVtblNldEZhY3RvcnkgPSBjb2x1bW5TZXRGYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5ID0gY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uVXRpbCA9IGNvbHVtblV0aWw7XG5cdFx0dGhpcy5jcmVhdGVSZXF1ZXN0RmFjdG9yeSA9IGNyZWF0ZVJlcXVlc3RGYWN0b3J5O1xuXHRcdHRoaXMuaXRlbUNhY2hlRmFjdG9yeSA9IGl0ZW1DYWNoZUZhY3Rvcnk7XG5cdFx0dGhpcy5pdGVtRW50cnlGYWN0b3J5ID0gaXRlbUVudHJ5RmFjdG9yeTtcblx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UgPSBpdGVtRW50cnlTZXJ2aWNlO1xuXHRcdHRoaXMuaXRlbVJlc291cmNlRmFjdG9yeSA9IGl0ZW1SZXNvdXJjZUZhY3Rvcnk7XG5cdFx0dGhpcy5rZXlTZXJ2aWNlID0ga2V5U2VydmljZTtcblx0XHR0aGlzLnRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5ID0gdHJhbnNhY3Rpb25DYWNoZUZhY3Rvcnk7XG5cdFx0dGhpcy5sb2NrU2VydmljZSA9IGxvY2tTZXJ2aWNlO1xuXHRcdHRoaXMubW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSA9IG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk7XG5cdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5ID0gcXVlcnlNYXRjaGVyRmFjdG9yeTtcblx0XHR0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeSA9IHF1ZXJ5UGFyc2VyRmFjdG9yeTtcblx0XHR0aGlzLnF1ZXJ5U2VydmljZSA9IHF1ZXJ5U2VydmljZTtcblx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5ID0gcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk7XG5cdFx0dGhpcy5zb2NrZXRNZXNzYWdlSGFuZGxlciA9IHNvY2tldE1lc3NhZ2VIYW5kbGVyO1xuXHRcdHRoaXMudGVtcGxhdGVGYWN0b3J5ID0gdGVtcGxhdGVGYWN0b3J5O1xuXHRcdHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeSA9IGNoYW5nZXNEZWx0YUZhY3Rvcnk7XG5cdFx0dGhpcy50ZW1wbGF0ZUNhY2hlID0gdGVtcGxhdGVDYWNoZTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9vcCAoKSB7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpZGVudGl0eSAodmFsdWUpIHtcblx0cmV0dXJuIHZhbHVlO1xufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9jb3JlJztcbmV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzJztcbmV4cG9ydCAqIGZyb20gJy4vbW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL2NsYXNzZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9mYWN0b3JpZXMnO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG4iXSwic291cmNlUm9vdCI6IiJ9
|
|
9692
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9SbUNvcmUvd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovL1JtQ29yZS93ZWJwYWNrL2Jvb3RzdHJhcCIsIndlYnBhY2s6Ly9SbUNvcmUvZXh0ZXJuYWwgXCJtb21lbnRcIiIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9VdGlsLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0FwaUZvcm1hdHRlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9BcGlSZXF1ZXN0U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9BcGlSZXNwb25zZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DaGFuZ2VzQ29tcGlsYXRpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ2hhbmdlc1Byb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0l0ZW1FbnRyeU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9JdGVtUmVzb3VyY2VPcHRpb25zLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvSXRlbUVudHJ5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvSXRlbVJlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvRWRpdFJlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvQ29sbGVjdGlvbkVudHJ5T3B0aW9ucy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL0NvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uRW50cnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uUmVzb3VyY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9Db2xsZWN0aW9uVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvQ29sbGVjdGlvbkVkaXRSZXNvdXJjZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvbW9kZWxzL1RlbXBsYXRlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvUmVtb3RlVmlld1Jlc291cmNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9tb2RlbHMvTG9jYWxWaWV3UmVzb3VyY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL21vZGVscy9pbmRleC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvdHlwZXMvSXRlbVR5cGVzQ29sbGVjdGlvbi50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvdHlwZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvSXRlbUhhbmRsZXJCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uTWF0Y2hlckJhc2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sbGVjdGlvbk1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkV2ZW50SGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25DYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvQ29sdW1uRXhwYW5zaW9uLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbHVtbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NvbnN0YW50cy50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5JbmZvLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NvbHVtblNldC50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5TdWJzZXRDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9Db2x1bW5VdGlsLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NyZWF0ZVJlcXVlc3QudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlQYXJzZXJCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1F1ZXJ5Q29sdW1uRXh0cmFjdG9yLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL0NvbGxlY3Rpb25IYW5kbGVyQmFzZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9jYWNoZS9zZXJ2ZXIvU2VydmVyQ29sbGVjdGlvbkhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9JdGVtQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvSXRlbUVudHJ5U2VydmljZS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9LZXlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0xvY2tTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL01vZHVsZUNoYW5nZXNDb21waWxhdGlvbi50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9RdWVyeU1hdGNoZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlQYXJzZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvUXVlcnlTZXJ2aWNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RDb2x1bW5FeHBhbnNpb24udHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvU29ja2V0TWVzc2FnZUhhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlci50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9DaGFuZ2VzRGVsdGFCYXNlLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL0NoYW5nZXNEZWx0YS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9JbnRlcm5hbENoYW5nZXNEZWx0YS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvY2xhc3Nlcy9SZXF1ZXN0QnVmZmVyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1JlcXVlc3RCdWZmZXJNYW5hZ2VyLnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL2luZGV4LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9jbGFzc2VzL1RlbXBsYXRlQ2FjaGUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9BcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9DaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sbGVjdGlvbkNhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbGxlY3Rpb25FbnRyeUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Db2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sdW1uRXhwYW5zaW9uRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtbkluZm9GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ29sdW1uU2V0RmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NvbHVtblN1YnNldENhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NyZWF0ZVJlcXVlc3RGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvSXRlbUNhY2hlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0l0ZW1FbnRyeUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9JdGVtUmVzb3VyY2VGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2ZhY3Rvcmllcy9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvUXVlcnlNYXRjaGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1F1ZXJ5UGFyc2VyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL1JlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvVGVtcGxhdGVGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeS50cyIsIndlYnBhY2s6Ly9SbUNvcmUvLi9zcmMvZmFjdG9yaWVzL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LnRzIiwid2VicGFjazovL1JtQ29yZS8uL3NyYy9mYWN0b3JpZXMvaW5kZXgudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2NvcmUudHMiLCJ3ZWJwYWNrOi8vUm1Db3JlLy4vc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLENBQUM7QUFDRCxPO0FDVkE7QUFDQTs7QUFFQTtBQUNBOztBQUVB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Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ3BWc0I7QUFDSztBQUNIO0FBRUM7QUFDRTtBQUNKIiwiZmlsZSI6InJtLWNvcmUuanMiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoXCJtb21lbnRcIikpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW1wibW9tZW50XCJdLCBmYWN0b3J5KTtcblx0ZWxzZSBpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpXG5cdFx0ZXhwb3J0c1tcIlJtQ29yZVwiXSA9IGZhY3RvcnkocmVxdWlyZShcIm1vbWVudFwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wiUm1Db3JlXCJdID0gZmFjdG9yeShyb290W1wibW9tZW50XCJdKTtcbn0pKHdpbmRvdywgZnVuY3Rpb24oX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV9fMF9fKSB7XG5yZXR1cm4gIiwiIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuIFx0dmFyIGluc3RhbGxlZE1vZHVsZXMgPSB7fTtcblxuIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbiBcdGZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblxuIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbiBcdFx0aWYoaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0pIHtcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcbiBcdFx0fVxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0aTogbW9kdWxlSWQsXG4gXHRcdFx0bDogZmFsc2UsXG4gXHRcdFx0ZXhwb3J0czoge31cbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubCA9IHRydWU7XG5cbiBcdFx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcbiBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuIFx0fVxuXG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlcyBvYmplY3QgKF9fd2VicGFja19tb2R1bGVzX18pXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLm0gPSBtb2R1bGVzO1xuXG4gXHQvLyBleHBvc2UgdGhlIG1vZHVsZSBjYWNoZVxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5jID0gaW5zdGFsbGVkTW9kdWxlcztcblxuIFx0Ly8gZGVmaW5lIGdldHRlciBmdW5jdGlvbiBmb3IgaGFybW9ueSBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSBmdW5jdGlvbihleHBvcnRzLCBuYW1lLCBnZXR0ZXIpIHtcbiBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBuYW1lLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZ2V0dGVyIH0pO1xuIFx0XHR9XG4gXHR9O1xuXG4gXHQvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSBmdW5jdGlvbihleHBvcnRzKSB7XG4gXHRcdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuIFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuIFx0XHR9XG4gXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG4gXHR9O1xuXG4gXHQvLyBjcmVhdGUgYSBmYWtlIG5hbWVzcGFjZSBvYmplY3RcbiBcdC8vIG1vZGUgJiAxOiB2YWx1ZSBpcyBhIG1vZHVsZSBpZCwgcmVxdWlyZSBpdFxuIFx0Ly8gbW9kZSAmIDI6IG1lcmdlIGFsbCBwcm9wZXJ0aWVzIG9mIHZhbHVlIGludG8gdGhlIG5zXG4gXHQvLyBtb2RlICYgNDogcmV0dXJuIHZhbHVlIHdoZW4gYWxyZWFkeSBucyBvYmplY3RcbiBcdC8vIG1vZGUgJiA4fDE6IGJlaGF2ZSBsaWtlIHJlcXVpcmVcbiBcdF9fd2VicGFja19yZXF1aXJlX18udCA9IGZ1bmN0aW9uKHZhbHVlLCBtb2RlKSB7XG4gXHRcdGlmKG1vZGUgJiAxKSB2YWx1ZSA9IF9fd2VicGFja19yZXF1aXJlX18odmFsdWUpO1xuIFx0XHRpZihtb2RlICYgOCkgcmV0dXJuIHZhbHVlO1xuIFx0XHRpZigobW9kZSAmIDQpICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYgdmFsdWUuX19lc01vZHVsZSkgcmV0dXJuIHZhbHVlO1xuIFx0XHR2YXIgbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuIFx0XHRfX3dlYnBhY2tfcmVxdWlyZV9fLnIobnMpO1xuIFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkobnMsICdkZWZhdWx0JywgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdmFsdWUgfSk7XG4gXHRcdGlmKG1vZGUgJiAyICYmIHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgZm9yKHZhciBrZXkgaW4gdmFsdWUpIF9fd2VicGFja19yZXF1aXJlX18uZChucywga2V5LCBmdW5jdGlvbihrZXkpIHsgcmV0dXJuIHZhbHVlW2tleV07IH0uYmluZChudWxsLCBrZXkpKTtcbiBcdFx0cmV0dXJuIG5zO1xuIFx0fTtcblxuIFx0Ly8gZ2V0RGVmYXVsdEV4cG9ydCBmdW5jdGlvbiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG5vbi1oYXJtb255IG1vZHVsZXNcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuIFx0XHR2YXIgZ2V0dGVyID0gbW9kdWxlICYmIG1vZHVsZS5fX2VzTW9kdWxlID9cbiBcdFx0XHRmdW5jdGlvbiBnZXREZWZhdWx0KCkgeyByZXR1cm4gbW9kdWxlWydkZWZhdWx0J107IH0gOlxuIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4gXHRcdF9fd2VicGFja19yZXF1aXJlX18uZChnZXR0ZXIsICdhJywgZ2V0dGVyKTtcbiBcdFx0cmV0dXJuIGdldHRlcjtcbiBcdH07XG5cbiBcdC8vIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbFxuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuXG4gXHQvLyBMb2FkIGVudHJ5IG1vZHVsZSBhbmQgcmV0dXJuIGV4cG9ydHNcbiBcdHJldHVybiBfX3dlYnBhY2tfcmVxdWlyZV9fKF9fd2VicGFja19yZXF1aXJlX18ucyA9IDEpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFX18wX187IiwiZXhwb3J0IGZ1bmN0aW9uIGluc3RhbnRpYXRlT3B0aW9ucyAoXG5cdG9wdGlvbnM6IHtba2V5OiBzdHJpbmddOiBhbnl9LFxuXHR2YWx1ZXM6IG9iamVjdCxcbik6IHZvaWQge1xuXHRmb3IgKGNvbnN0IGtleSBpbiB2YWx1ZXMpIHtcblx0XHRpZiAoIShrZXkgaW4gb3B0aW9ucykpIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGlmICh2YWx1ZXNba2V5XSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb250aW51ZTtcblx0XHR9XG5cblx0XHRvcHRpb25zW2tleV0gPSB2YWx1ZXNba2V5XTtcblx0fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2hhbGxvd01lcmdlIChcblx0b2JqZWN0LFxuXHRkZWZhdWx0cyxcbikge1xuXHRpZiAob2JqZWN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gZGVmYXVsdHM7XG5cdH1cblxuXHRjb25zdCByZXN1bHQgPSB7fTtcblxuXHRmb3IgKGNvbnN0IGtleSBpbiBkZWZhdWx0cykge1xuXHRcdHJlc3VsdFtrZXldID0gb2JqZWN0W2tleV0gPT09IHVuZGVmaW5lZCA/XG5cdFx0XHRkZWZhdWx0c1trZXldIDogb2JqZWN0W2tleV07XG5cdH1cblxuXHRyZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzUHJvcGVydGllcyAob2JqZWN0KSB7XG5cdC8vIEB0cy1pZ25vcmVcblx0Zm9yIChjb25zdCBrZXkgaW4gb2JqZWN0KSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGaXJzdFByb3BlcnR5IChvYmplY3QpIHtcblx0aWYgKHR5cGVvZiBvYmplY3QgIT09ICdvYmplY3QnKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHRmb3IgKGNvbnN0IGtleSBpbiBvYmplY3QpIHtcblx0XHRyZXR1cm4ga2V5O1xuXHR9XG5cblx0cmV0dXJuIG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbkFycmF5IChcblx0bmVlZGxlLFxuXHRoYXlzdGFjayxcbikge1xuXHRmb3IgKGNvbnN0IGhheSBvZiBoYXlzdGFjaykge1xuXHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0aWYgKG5lZWRsZSA9PSBoYXkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbHRlckFycmF5PFQ+IChcblx0c291cmNlOiBUW10sXG5cdGNhbGxiYWNrOiAoZWxlbTogVCkgPT4gYm9vbGVhbixcbik6IGJvb2xlYW4ge1xuXHRjb25zdCBmaWx0ZXJlZDogVFtdID0gW107XG5cblx0Zm9yIChjb25zdCBzcmMgb2Ygc291cmNlKSB7XG5cdFx0aWYgKGNhbGxiYWNrKHNyYykpIHtcblx0XHRcdGZpbHRlcmVkLnB1c2goc3JjKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoZmlsdGVyZWQubGVuZ3RoID09PSBzb3VyY2UubGVuZ3RoKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9XG5cblx0ZW1wdHlBcnJheShzb3VyY2UpO1xuXG5cdGZvciAoY29uc3QgZmlsdGVyIG9mIGZpbHRlcmVkKSB7XG5cdFx0c291cmNlLnB1c2goZmlsdGVyKTtcblx0fVxuXG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZW1wdHlBcnJheSAoYXJyYXkpOiB2b2lkIHtcblx0YXJyYXkuc3BsaWNlKDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aEV4aXN0cyAoXG5cdHNvdXJjZSxcblx0cGF0aCxcbikge1xuXHRpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3VuZGVmaW5lZCcpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRmb3IgKGNvbnN0IHAgb2YgcGF0aCkge1xuXHRcdGlmICh0eXBlb2Ygc291cmNlW3BdID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHNvdXJjZSA9IHNvdXJjZVtwXTtcblx0fVxuXG5cdHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUGF0aDxUPiAoXG5cdG9iamVjdDogYW55LFxuXHRwYXRoOiBBcnJheTxudW1iZXIgfCBzdHJpbmc+LFxuXHRkZWZhdWx0czogYW55W10sXG4pOiBUIHtcblx0Zm9yIChsZXQgaSA9IDA7IGkgPCBwYXRoLmxlbmd0aDsgaSsrKSB7XG5cdFx0Y29uc3QgdmFsdWUgPSBwYXRoW2ldO1xuXG5cdFx0aWYgKG9iamVjdFt2YWx1ZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b2JqZWN0W3ZhbHVlXSA9IGRlZmF1bHRzW2ldO1xuXHRcdH1cblxuXHRcdG9iamVjdCA9IG9iamVjdFt2YWx1ZV07XG5cdH1cblxuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGF0aCAoXG5cdG9iamVjdDoge30sXG5cdHBhdGg6IEFycmF5PG51bWJlciB8IHN0cmluZz4sXG5cdGNyZWF0ZTogYm9vbGVhbiA9IGZhbHNlLFxuKTogYW55IHtcblx0aWYgKG9iamVjdCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGZvciAoY29uc3QgcCBvZiBwYXRoKSB7XG5cdFx0b2JqZWN0ID0gb2JqZWN0W3BdOyAvLyB3b24ndCBhbHRlciB0aGUgY2FsbGVyJ3MgdmFyXG5cblx0XHRpZiAob2JqZWN0ID09PSB1bmRlZmluZWQgJiYgIWNyZWF0ZSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gb2JqZWN0O1xufVxuXG4vLyBUYWtlbiBmcm9tIEFuZ3VsYXJKUywgYWRkZWQgY29tbWVudHMgdG8gaWdub3JlIFR5cGVTY3JpcHQgZXJyb3JzXG5mdW5jdGlvbiBiYXNlRXh0ZW5kIChcblx0ZHN0LFxuXHRvYmpzLFxuXHRkZWVwLFxuKSB7XG5cdGZvciAobGV0IGkgPSAwLCBpaSA9IG9ianMubGVuZ3RoOyBpIDwgaWk7ICsraSkge1xuXHRcdGNvbnN0IG9iaiA9IG9ianNbaV07XG5cblx0XHRpZiAoIWlzT2JqZWN0KG9iaikgJiYgIWlzRnVuY3Rpb24ob2JqKSkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXG5cdFx0Y29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKG9iaik7XG5cblx0XHRmb3IgKGxldCBqID0gMCwgamogPSBrZXlzLmxlbmd0aDsgaiA8IGpqOyBqKyspIHtcblx0XHRcdGNvbnN0IGtleSA9IGtleXNbal07XG5cdFx0XHRjb25zdCBzcmMgPSBvYmpba2V5XTtcblxuXHRcdFx0aWYgKGRlZXAgJiYgaXNPYmplY3Qoc3JjKSkge1xuXHRcdFx0XHRpZiAoaXNEYXRlKHNyYykpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IG5ldyBEYXRlKHNyYy52YWx1ZU9mKCkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGlzUmVnRXhwKHNyYykpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IG5ldyBSZWdFeHAoc3JjKTtcblx0XHRcdFx0fSBlbHNlIGlmIChzcmMubm9kZU5hbWUpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IHNyYy5jbG9uZU5vZGUodHJ1ZSk7XG5cdFx0XHRcdH0gZWxzZSBpZiAoaXNFbGVtZW50KHNyYykpIHtcblx0XHRcdFx0XHRkc3Rba2V5XSA9IHNyYy5jbG9uZSgpO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmICghaXNPYmplY3QoZHN0W2tleV0pKSB7XG5cdFx0XHRcdFx0XHRkc3Rba2V5XSA9IGlzQXJyYXkoc3JjKSA/IFtdIDoge307XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0YmFzZUV4dGVuZChcblx0XHRcdFx0XHRcdGRzdFtrZXldLFxuXHRcdFx0XHRcdFx0W3NyY10sXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRzdFtrZXldID0gc3JjO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHJldHVybiBkc3Q7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleHRlbmQgKFxuXHRkc3QsXG5cdC4uLmFyZ3Ncbikge1xuXHRyZXR1cm4gYmFzZUV4dGVuZChcblx0XHRkc3QsXG5cdFx0YXJncyxcblx0XHRmYWxzZSxcblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlIChcblx0ZHN0LFxuXHQuLi5hcmdzXG4pIHtcblx0cmV0dXJuIGJhc2VFeHRlbmQoXG5cdFx0ZHN0LFxuXHRcdGFyZ3MsXG5cdFx0dHJ1ZSxcblx0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzT2JqZWN0ICh2YWx1ZSkge1xuXHQvLyBodHRwOi8vanNwZXJmLmNvbS9pc29iamVjdDRcblx0cmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JsYW5rT2JqZWN0ICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhT2JqZWN0LmdldFByb3RvdHlwZU9mKHZhbHVlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRGF0ZSAodmFsdWUpIHtcblx0cmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbmV4cG9ydCBjb25zdCBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb248VD4gKHZhbHVlOiBhbnkpOiB2YWx1ZSBpcyBUIHtcblx0cmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUmVnRXhwICh2YWx1ZSkge1xuXHRyZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0VsZW1lbnQgKG5vZGUpIHtcblx0cmV0dXJuICEhKG5vZGUgJiZcblx0XHQoXG5cdFx0XHRub2RlLm5vZGVOYW1lICAvLyBXZSBhcmUgYSBkaXJlY3QgZWxlbWVudC5cblx0XHRcdHx8IChub2RlLnByb3AgJiYgbm9kZS5hdHRyICYmIG5vZGUuZmluZClcblx0XHQpXG5cdCk7ICAvLyBXZSBoYXZlIGFuIG9uIGFuZCBmaW5kIG1ldGhvZCBwYXJ0IG9mIGpRdWVyeSBBUEkuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dpbmRvdyAob2JqKSB7XG5cdHJldHVybiBvYmogJiYgb2JqLndpbmRvdyA9PT0gb2JqO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZpbmVkICh2YWx1ZSkge1xuXHRyZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVxdWFscyAoXG5cdG8xLFxuXHRvMixcbikge1xuXHRpZiAobzEgPT09IG8yKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH1cblxuXHRpZiAobzEgPT09IG51bGwgfHwgbzIgPT09IG51bGwpIHtcblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHQvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG5cdGlmIChvMSAhPT0gbzEgJiYgbzIgIT09IG8yKSB7XG5cdFx0cmV0dXJuIHRydWU7XG5cdH0gLy8gTmFOID09PSBOYU5cblxuXHRjb25zdCB0MSA9IHR5cGVvZiBvMTtcblx0Y29uc3QgdDIgPSB0eXBlb2YgbzI7XG5cblx0bGV0IGxlbmd0aDtcblx0bGV0IGtleTtcblx0bGV0IGtleVNldDtcblxuXHRpZiAodDEgPT09IHQyICYmIHQxID09PSAnb2JqZWN0Jykge1xuXHRcdGlmIChpc0FycmF5KG8xKSkge1xuXHRcdFx0aWYgKCFpc0FycmF5KG8yKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdGxlbmd0aCA9IG8xLmxlbmd0aDtcblxuXHRcdFx0aWYgKG8xLmxlbmd0aCA9PT0gbzIubGVuZ3RoKSB7XG5cdFx0XHRcdGZvciAoa2V5ID0gMDsga2V5IDwgbGVuZ3RoOyBrZXkrKykge1xuXHRcdFx0XHRcdGlmICghZXF1YWxzKFxuXHRcdFx0XHRcdFx0bzFba2V5XSxcblx0XHRcdFx0XHRcdG8yW2tleV0sXG5cdFx0XHRcdFx0KSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNEYXRlKG8xKSkge1xuXHRcdFx0aWYgKCFpc0RhdGUobzIpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHNpbXBsZUNvbXBhcmUoXG5cdFx0XHRcdG8xLmdldFRpbWUoKSxcblx0XHRcdFx0bzIuZ2V0VGltZSgpLFxuXHRcdFx0KTtcblx0XHR9IGVsc2UgaWYgKGlzUmVnRXhwKG8xKSkge1xuXHRcdFx0aWYgKCFpc1JlZ0V4cChvMikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gbzEudG9TdHJpbmcoKSA9PT0gbzIudG9TdHJpbmcoKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0aWYgKGlzV2luZG93KG8xKSB8fCBpc1dpbmRvdyhvMikgfHwgaXNBcnJheShvMikgfHwgaXNEYXRlKG8yKSB8fCBpc1JlZ0V4cChvMikpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRrZXlTZXQgPSBjcmVhdGVNYXAoKTtcblx0XHRcdGZvciAoa2V5IGluIG8xKSB7XG5cdFx0XHRcdGlmIChpc0Z1bmN0aW9uKG8xW2tleV0pKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoIWVxdWFscyhcblx0XHRcdFx0XHRvMVtrZXldLFxuXHRcdFx0XHRcdG8yW2tleV0sXG5cdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRrZXlTZXRba2V5XSA9IHRydWU7XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoa2V5IGluIG8yKSB7XG5cdFx0XHRcdGlmICghKGtleSBpbiBrZXlTZXQpICYmIGlzRGVmaW5lZChvMltrZXldKSAmJiAhaXNGdW5jdGlvbihvMltrZXldKSkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZU1hcCAoKSB7XG5cdHJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG5mdW5jdGlvbiBzaW1wbGVDb21wYXJlIChcblx0YSxcblx0Yixcbikge1xuXHRyZXR1cm4gYSA9PT0gYiB8fCAoYSAhPT0gYSAmJiBiICE9PSBiKTtcbn1cblxuZnVuY3Rpb24gaXNWYWxpZE9iamVjdE1heERlcHRoIChtYXhEZXB0aCkge1xuXHRyZXR1cm4gaXNOdW1iZXIobWF4RGVwdGgpICYmIG1heERlcHRoID4gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvcHkgKFxuXHRzb3VyY2UsXG5cdGRlc3RpbmF0aW9uPyxcblx0bWF4RGVwdGg/LFxuKSB7XG5cdGNvbnN0IHN0YWNrU291cmNlID0gW107XG5cdGNvbnN0IHN0YWNrRGVzdCA9IFtdO1xuXG5cdG1heERlcHRoID0gaXNWYWxpZE9iamVjdE1heERlcHRoKG1heERlcHRoKSA/IG1heERlcHRoIDogTmFOO1xuXG5cdGlmIChkZXN0aW5hdGlvbikge1xuXHRcdGlmIChzb3VyY2UgPT09IGRlc3RpbmF0aW9uKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0NhblxcJ3QgY29weSEgU291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgaWRlbnRpY2FsLicpO1xuXHRcdH1cblxuXHRcdC8vIEVtcHR5IHRoZSBkZXN0aW5hdGlvbiBvYmplY3Rcblx0XHRpZiAoaXNBcnJheShkZXN0aW5hdGlvbikpIHtcblx0XHRcdGRlc3RpbmF0aW9uLmxlbmd0aCA9IDA7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIGRlc3RpbmF0aW9uKSB7XG5cdFx0XHRcdGRlbGV0ZSBkZXN0aW5hdGlvbltrZXldO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHRzdGFja1NvdXJjZS5wdXNoKHNvdXJjZSk7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHN0YWNrRGVzdC5wdXNoKGRlc3RpbmF0aW9uKTtcblxuXHRcdHJldHVybiBjb3B5UmVjdXJzZShcblx0XHRcdHNvdXJjZSxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdFx0bWF4RGVwdGgsXG5cdFx0KTtcblx0fVxuXG5cdHJldHVybiBjb3B5RWxlbWVudChcblx0XHRzb3VyY2UsXG5cdFx0bWF4RGVwdGgsXG5cdCk7XG5cblx0ZnVuY3Rpb24gY29weVJlY3Vyc2UgKFxuXHRcdF9zb3VyY2UsXG5cdFx0X2Rlc3RpbmF0aW9uLFxuXHRcdF9tYXhEZXB0aCxcblx0KSB7XG5cdFx0X21heERlcHRoLS07XG5cblx0XHRpZiAoX21heERlcHRoIDwgMCkge1xuXHRcdFx0cmV0dXJuICcuLi4nO1xuXHRcdH1cblxuXHRcdGlmIChpc0FycmF5KF9zb3VyY2UpKSB7XG5cdFx0XHRmb3IgKGxldCBpID0gMCwgaWkgPSBfc291cmNlLmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcblx0XHRcdFx0X2Rlc3RpbmF0aW9uLnB1c2goY29weUVsZW1lbnQoXG5cdFx0XHRcdFx0X3NvdXJjZVtpXSxcblx0XHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHRcdCkpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAoaXNCbGFua09iamVjdChfc291cmNlKSkge1xuXHRcdFx0Ly8gY3JlYXRlTWFwKCkgZmFzdCBwYXRoIC0tLSBTYWZlIHRvIGF2b2lkIGhhc093blByb3BlcnR5IGNoZWNrIGJlY2F1c2UgcHJvdG90eXBlIGNoYWluIGlzIGVtcHR5XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBfc291cmNlKSB7XG5cdFx0XHRcdF9kZXN0aW5hdGlvbltrZXldID0gY29weUVsZW1lbnQoXG5cdFx0XHRcdFx0X3NvdXJjZVtrZXldLFxuXHRcdFx0XHRcdF9tYXhEZXB0aCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKF9zb3VyY2UgJiYgdHlwZW9mIF9zb3VyY2UuaGFzT3duUHJvcGVydHkgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdC8vIFNsb3cgcGF0aCwgd2hpY2ggbXVzdCByZWx5IG9uIGhhc093blByb3BlcnR5XG5cdFx0XHRmb3IgKGNvbnN0IGtleSBpbiBfc291cmNlKSB7XG5cdFx0XHRcdGlmIChfc291cmNlLmhhc093blByb3BlcnR5KGtleSkpIHtcblx0XHRcdFx0XHRfZGVzdGluYXRpb25ba2V5XSA9IGNvcHlFbGVtZW50KFxuXHRcdFx0XHRcdFx0X3NvdXJjZVtrZXldLFxuXHRcdFx0XHRcdFx0X21heERlcHRoLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gU2xvd2VzdCBwYXRoIC0tLSBoYXNPd25Qcm9wZXJ0eSBjYW4ndCBiZSBjYWxsZWQgYXMgYSBtZXRob2Rcblx0XHRcdGZvciAoY29uc3Qga2V5IGluIF9zb3VyY2UpIHtcblx0XHRcdFx0aWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChcblx0XHRcdFx0XHRfc291cmNlLFxuXHRcdFx0XHRcdGtleSxcblx0XHRcdFx0KSkge1xuXHRcdFx0XHRcdF9kZXN0aW5hdGlvbltrZXldID0gY29weUVsZW1lbnQoXG5cdFx0XHRcdFx0XHRfc291cmNlW2tleV0sXG5cdFx0XHRcdFx0XHRfbWF4RGVwdGgsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBfZGVzdGluYXRpb247XG5cdH1cblxuXHRmdW5jdGlvbiBjb3B5RWxlbWVudCAoXG5cdFx0X3NvdXJjZSxcblx0XHRfbWF4RGVwdGggPSA1LFxuXHQpIHtcblx0XHQvLyBTaW1wbGUgdmFsdWVzXG5cdFx0aWYgKCFpc09iamVjdChfc291cmNlKSkge1xuXHRcdFx0cmV0dXJuIF9zb3VyY2U7XG5cdFx0fVxuXG5cdFx0Ly8gQWxyZWFkeSBjb3BpZWQgdmFsdWVzXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdGNvbnN0IGluZGV4ID0gc3RhY2tTb3VyY2UuaW5kZXhPZihfc291cmNlKTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHJldHVybiBzdGFja0Rlc3RbaW5kZXhdO1xuXHRcdH1cblxuXHRcdGlmIChpc1dpbmRvdyhfc291cmNlKSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGNvcHkhIE1ha2luZyBjb3BpZXMgb2YgV2luZG93IGluc3RhbmNlcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuXHRcdH1cblxuXHRcdGxldCBuZWVkc1JlY3Vyc2UgPSBmYWxzZTtcblx0XHRsZXQgX2Rlc3RpbmF0aW9uID0gY29weVR5cGUoX3NvdXJjZSk7XG5cblx0XHRpZiAoX2Rlc3RpbmF0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdF9kZXN0aW5hdGlvbiA9IGlzQXJyYXkoX3NvdXJjZSkgPyBbXSA6IE9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKF9zb3VyY2UpKTtcblx0XHRcdG5lZWRzUmVjdXJzZSA9IHRydWU7XG5cdFx0fVxuXG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHN0YWNrU291cmNlLnB1c2goX3NvdXJjZSk7XG5cdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdHN0YWNrRGVzdC5wdXNoKF9kZXN0aW5hdGlvbik7XG5cblx0XHRyZXR1cm4gbmVlZHNSZWN1cnNlXG5cdFx0XHQ/IGNvcHlSZWN1cnNlKFxuXHRcdFx0XHRfc291cmNlLFxuXHRcdFx0XHRfZGVzdGluYXRpb24sXG5cdFx0XHRcdF9tYXhEZXB0aCxcblx0XHRcdClcblx0XHRcdDogX2Rlc3RpbmF0aW9uO1xuXHR9XG5cblx0ZnVuY3Rpb24gY29weVR5cGUgKF9zb3VyY2UpIHtcblx0XHRzd2l0Y2ggKHRvU3RyaW5nLmNhbGwoX3NvdXJjZSkpIHtcblx0XHRcdGNhc2UgJ1tvYmplY3QgSW50OEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IEludDE2QXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgSW50MzJBcnJheV0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBGbG9hdDMyQXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgRmxvYXQ2NEFycmF5XSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IFVpbnQ4QXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgVWludDE2QXJyYXldJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgVWludDMyQXJyYXldJzpcblx0XHRcdFx0cmV0dXJuIG5ldyBfc291cmNlLmNvbnN0cnVjdG9yKFxuXHRcdFx0XHRcdGNvcHlFbGVtZW50KF9zb3VyY2UuYnVmZmVyKSxcblx0XHRcdFx0XHRfc291cmNlLmJ5dGVPZmZzZXQsXG5cdFx0XHRcdFx0X3NvdXJjZS5sZW5ndGgsXG5cdFx0XHRcdCk7XG5cblx0XHRcdGNhc2UgJ1tvYmplY3QgQXJyYXlCdWZmZXJdJzpcblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMFxuXHRcdFx0XHRpZiAoIV9zb3VyY2Uuc2xpY2UpIHtcblx0XHRcdFx0XHQvLyBJZiB3ZSdyZSBpbiB0aGlzIGNhc2Ugd2Uga25vdyB0aGUgZW52aXJvbm1lbnQgc3VwcG9ydHMgQXJyYXlCdWZmZXJcblx0XHRcdFx0XHQvKiBlc2xpbnQtZGlzYWJsZSBuby11bmRlZiAqL1xuXHRcdFx0XHRcdGNvbnN0IGNvcGllZCA9IG5ldyBBcnJheUJ1ZmZlcihfc291cmNlLmJ5dGVMZW5ndGgpO1xuXHRcdFx0XHRcdG5ldyBVaW50OEFycmF5KGNvcGllZCkuc2V0KG5ldyBVaW50OEFycmF5KF9zb3VyY2UpKTtcblx0XHRcdFx0XHQvKiBlc2xpbnQtZW5hYmxlICovXG5cdFx0XHRcdFx0cmV0dXJuIGNvcGllZDtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gX3NvdXJjZS5zbGljZSgwKTtcblxuXHRcdFx0Y2FzZSAnW29iamVjdCBCb29sZWFuXSc6XG5cdFx0XHRjYXNlICdbb2JqZWN0IE51bWJlcl0nOlxuXHRcdFx0Y2FzZSAnW29iamVjdCBTdHJpbmddJzpcblx0XHRcdGNhc2UgJ1tvYmplY3QgRGF0ZV0nOlxuXHRcdFx0XHRyZXR1cm4gbmV3IF9zb3VyY2UuY29uc3RydWN0b3IoX3NvdXJjZS52YWx1ZU9mKCkpO1xuXG5cdFx0XHRjYXNlICdbb2JqZWN0IFJlZ0V4cF0nOlxuXHRcdFx0XHRjb25zdCByZSA9IG5ldyBSZWdFeHAoXG5cdFx0XHRcdFx0X3NvdXJjZS5fc291cmNlLFxuXHRcdFx0XHRcdF9zb3VyY2UudG9TdHJpbmcoKVxuXHRcdFx0XHRcdFx0Lm1hdGNoKC9bXi9dKiQvKVswXSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRyZS5sYXN0SW5kZXggPSBfc291cmNlLmxhc3RJbmRleDtcblxuXHRcdFx0XHRyZXR1cm4gcmU7XG5cblx0XHRcdGNhc2UgJ1tvYmplY3QgQmxvYl0nOlxuXHRcdFx0XHRyZXR1cm4gbmV3IF9zb3VyY2UuY29uc3RydWN0b3IoXG5cdFx0XHRcdFx0W19zb3VyY2VdLFxuXHRcdFx0XHRcdHt0eXBlOiBfc291cmNlLnR5cGV9LFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChpc0Z1bmN0aW9uKF9zb3VyY2UuY2xvbmVOb2RlKSkge1xuXHRcdFx0cmV0dXJuIF9zb3VyY2UuY2xvbmVOb2RlKHRydWUpO1xuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IENvbHVtbkluZm8gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW4gfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGNvcHksIGVxdWFscyB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBBcGlGb3JtYXR0ZXIge1xuXG5cdE1PTUVOVF9JTlZBTElEID0gJ0ludmFsaWQgZGF0ZSc7XG5cdFNFUlZFUl9EQVRFVElNRV9GT1JNQVQgPSAnWVlZWS1NTS1ERFtUXUhIOm1tOnNzWic7XG5cdFNFUlZFUl9USU1FX0ZPUk1BVCA9ICdISDptbTpzcyc7XG5cdFNFUlZFUl9EQVRFX0ZPUk1BVCA9ICdZWVlZLU1NLUREJztcblxuXHRjb25zdHJ1Y3RvciAoKSB7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyBpZiBhIGNvbHVtbiB0eXBlIGlzIGFuICdleHBlbnNpdmUnIHR5cGUsIG1lYW5pbmcgdGhhdCB0aGUgYWN0aW9uIHRvIGZvcm1hdCB0aGUgZmllbGQgdGFrZXMgc2lnbmlmaWNhbnQgQ1BVIHRpbWVcblx0ICpcblx0ICogLS0tLVxuXHQgKiBAcmVtYXJrc1xuXHQgKiBDdXJyZW50bHkgb25seSB1c2VkIGZvciBNb21lbnQgb2JqZWN0c1xuXHQgKi9cblx0cHVibGljIGlzRXhwZW5zaXZlRm9ybWF0IChjb2x1bW5UeXBlOiBzdHJpbmcpIHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE92ZXJ3cml0ZXMgdGhlIHZhbHVlcyBpbiAnY2hhbmdlcycgaWYgdGhlIHZhbHVlcyBpbiAnaW5pdGlhbCcgYW5kICdjaGFuZ2VzJyBhcmUgdGhlIHNhbWUgKGxlYXZpbmcgdXNlciBjaGFuZ2VzIGludGFjdClcblx0ICovXG5cdHB1YmxpYyBtZXJnZUNvcHlGaWVsZHM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpbml0aWFsOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNoYW5nZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0bmV3SW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uLnBhdGg7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0bmV3SW5pdGlhbFtjb2x1bW5QYXRoXSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCYmIChcblx0XHRcdFx0XHRjb2x1bW5QYXRoID09PSAnaWQnIHx8XG5cdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5QYXRoXSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdFx0dGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRcdFx0Y29sdW1uLmFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5QYXRoXSxcblx0XHRcdFx0XHRcdGluaXRpYWxbY29sdW1uUGF0aF0sXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0dGhpcy5sYXp5Q2xvbmUoXG5cdFx0XHRcdFx0Y29sdW1uLmFwaUNvbHVtbixcblx0XHRcdFx0XHRuZXdJbml0aWFsLFxuXHRcdFx0XHRcdGNoYW5nZXMsXG5cdFx0XHRcdFx0Y29sdW1uUGF0aCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhbmdlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2xvbmVzIHRoZSBmaWVsZHMgZnJvbSBgc291cmNlYCB0byBgZGVzdGluYXRpb25gLCBjYWxscyB7QGxpbmsgQXBpRm9ybWF0dGVyLmlzRXhwZW5zaXZlRm9ybWF0IGlzRXhwZW5zaXZlRm9ybWF0fSB0byBkZXRlcm1pbmUgaWYgdmFsdWVzIHNob3VsZCBpbW1lZGlhdGVseSBiZSBjbG9uZWQsIG9yIHRoZSBnZXR0ZXIgc2hvdWxkIGJlIGNsb25lZFxuXHQgKi9cblx0cHVibGljIGxhenlDbG9uZSAoXG5cdFx0YXBpQ29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRzb3VyY2U6IG9iamVjdCxcblx0XHRkZXN0aW5hdGlvbjogb2JqZWN0LFxuXHRcdGtleTogc3RyaW5nLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChhcGlDb2x1bW4udHlwZSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0XHRcdGtleSxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdGVudW1lcmFibGU6IHRydWUsXG5cdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0ZGVsZXRlIGRlc3RpbmF0aW9uW2tleV07XG5cblx0XHRcdFx0XHRcdHJldHVybiBkZXN0aW5hdGlvbltrZXldID0gdGhpcy5jbG9uZShcblx0XHRcdFx0XHRcdFx0YXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0XHRcdHNvdXJjZVtrZXldLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGVzdGluYXRpb25ba2V5XSA9IHRoaXMuY2xvbmUoXG5cdFx0XHRcdGFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRzb3VyY2Vba2V5XSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpbml0aWFsOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdG1vZGlmaWVkOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88YW55Pj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IHJlc3VsdDoge1tjb2x1bW5JZDogc3RyaW5nXTogYW55fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cdFx0XHRjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW4uYXBpQ29sdW1uO1xuXHRcdFx0Y29uc3QgY29sdW1uVHlwZSA9IGFwaUNvbHVtbi50eXBlO1xuXG5cdFx0XHRpZiAoYXBpQ29sdW1uLnJlYWRPbmx5KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIXRoaXMuY29tcGFyZUZpZWxkcyhcblx0XHRcdFx0Y29sdW1uVHlwZSxcblx0XHRcdFx0aW5pdGlhbFtjb2x1bW5JZF0sXG5cdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IHRoaXMuZm9ybWF0UmVxdWVzdFZhbHVlKFxuXHRcdFx0XHRcdGNvbHVtblR5cGUsXG5cdFx0XHRcdFx0bW9kaWZpZWRbY29sdW1uSWRdLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVxdWVzdExvY2FsPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88YW55Pj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IHJlc3VsdDoge1tjb2x1bW5JZDogc3RyaW5nXTogYW55fSA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cdFx0XHRjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW4uYXBpQ29sdW1uO1xuXG5cdFx0XHRpZiAoYXBpQ29sdW1uLnJlYWRPbmx5KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHRbY29sdW1uSWRdID0gdGhpcy5mb3JtYXRSZXF1ZXN0VmFsdWUoXG5cdFx0XHRcdGFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRmaWVsZHNbY29sdW1uSWRdLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHVibGljIGhhc0NoYW5nZXMgKFxuXHRcdGluaXRpYWw6IEZpZWxkTWFwLFxuXHRcdG1vZGlmaWVkOiBGaWVsZE1hcCxcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHRcdGluY2x1ZGVSZWFkT25seUNvbHVtbnM6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogYm9vbGVhbiB7XG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cdFx0XHRjb25zdCBhcGlDb2x1bW4gPSBjb2x1bW4uYXBpQ29sdW1uO1xuXG5cdFx0XHRpZiAoIWluY2x1ZGVSZWFkT25seUNvbHVtbnMgJiYgYXBpQ29sdW1uLnJlYWRPbmx5KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4uYXBpQ29sdW1uLnR5cGUpKSB7XG5cdFx0XHRcdGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuXHRcdFx0XHRcdG1vZGlmaWVkLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIElmIHRoZSBtb21lbnQgZ2V0dGVyIGhhc24ndCBiZWVuIHRyaWdnZXJlZCBvciBvdmVyd3JpdHRlbiB5ZXQsIHdlIGNhbiBhc3N1bWUgdGhlcmUgYXJlIG5vIGNoYW5nZXNcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdGRlc2MgIT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIGRlc2MudmFsdWUgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHRcdCYmIGRlc2MuZ2V0ICE9PSB1bmRlZmluZWRcblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRcdGFwaUNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aW5pdGlhbDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRtb2RpZmllZDogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQ6IG9iamVjdFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cblx0XHRcdGlmIChhcGlDb2x1bW4ucmVhZE9ubHkpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghdGhpcy5jb21wYXJlRmllbGRzKFxuXHRcdFx0XHRhcGlDb2x1bW4udHlwZSxcblx0XHRcdFx0aW5pdGlhbFtjb2x1bW5JZF0sXG5cdFx0XHRcdG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdCkpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0b2xkVmFsdWU6IGluaXRpYWxbY29sdW1uSWRdLFxuXHRcdFx0XHRcdFx0bmV3VmFsdWU6IG1vZGlmaWVkW2NvbHVtbklkXSxcblx0XHRcdFx0XHRcdGNvbHVtbjogY29sdW1uLmFwaUNvbHVtbixcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgY29weUZpZWxkczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHNvdXJjZTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPGFueT4+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5QYXRoID0gY29sdW1uLnBhdGg7XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IXNvdXJjZS5oYXNPd25Qcm9wZXJ0eShjb2x1bW5QYXRoKVxuXHRcdFx0XHR8fCAoXG5cdFx0XHRcdFx0Ly8gcHJldmVudCB0cmlnZ2VyaW5nIGdldHRlciBmb3IgZXhwZW5zaXZlIGZvcm1hdHNcblx0XHRcdFx0XHQhdGhpcy5pc0V4cGVuc2l2ZUZvcm1hdChjb2x1bW4uYXBpQ29sdW1uLnR5cGUpXG5cdFx0XHRcdFx0JiYgc291cmNlW2NvbHVtblBhdGhdID09PSB1bmRlZmluZWRcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmxhenlDbG9uZShcblx0XHRcdFx0Y29sdW1uLmFwaUNvbHVtbixcblx0XHRcdFx0c291cmNlLFxuXHRcdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdFx0Y29sdW1uUGF0aCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRlc3RpbmF0aW9uO1xuXHR9XG5cblx0cHVibGljIHNoYWxsb3dDb3B5RmllbGRzIChcblx0XHRzaGFsbG93U291cmNlOiBGaWVsZE1hcCxcblx0XHRkZWVwU291cmNlOiBGaWVsZE1hcCxcblx0XHRkZXN0aW5hdGlvbjogRmllbGRNYXAsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxhbnk+Pixcblx0KTogRmllbGRNYXAge1xuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdGNvbnN0IGNvbHVtblBhdGggPSBjb2x1bW4ucGF0aDtcblxuXHRcdFx0ZGVzdGluYXRpb25bY29sdW1uUGF0aF0gPSBzaGFsbG93U291cmNlW2NvbHVtblBhdGhdICE9PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRzaGFsbG93U291cmNlW2NvbHVtblBhdGhdIDpcblx0XHRcdFx0dGhpcy5jbG9uZShcblx0XHRcdFx0XHRjb2x1bW4uYXBpQ29sdW1uLnR5cGUsXG5cdFx0XHRcdFx0ZGVlcFNvdXJjZVtjb2x1bW5QYXRoXSxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHRwdWJsaWMgc2V0RGVmYXVsdFZhbHVlcyAoXG5cdFx0ZGVzdGluYXRpb246IEZpZWxkTWFwLFxuXHRcdGNvbHVtbnM6IEFycmF5PENvbHVtbkluZm88YW55Pj4sXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW4uaWRdID0gdGhpcy5nZXREZWZhdWx0VmFsdWUoY29sdW1uLmFwaUNvbHVtbi50eXBlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVzdGluYXRpb247XG5cdH1cblxuXHRwdWJsaWMgY29tcGFyZUZpZWxkcyAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdGZpcnN0PzogYW55LFxuXHRcdHNlY29uZD86IGFueSxcblx0KTogYm9vbGVhbiB7XG5cdFx0aWYgKGZpcnN0ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBzZWNvbmQgPT09IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAoc2Vjb25kID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNvbXBhcmVNb21lbnRPYmplY3RzKFxuXHRcdFx0XHRcdGZpcnN0LFxuXHRcdFx0XHRcdHNlY29uZCxcblx0XHRcdFx0KTtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29tcGFyZUR1cmF0aW9ucyhcblx0XHRcdFx0XHRmaXJzdCxcblx0XHRcdFx0XHRzZWNvbmQsXG5cdFx0XHRcdCk7XG5cdFx0XHRjYXNlICdpZCc6IC8vIGlkIHR5cGVzXG5cdFx0XHRjYXNlICdpdGVtJzpcblx0XHRcdGNhc2UgJ2xpbmsnOlxuXHRcdFx0Y2FzZSAnY2hpbGQnOlxuXHRcdFx0Y2FzZSAnc2libGluZyc6XG5cdFx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG5cdFx0XHRcdHJldHVybiBmaXJzdCA9PSBzZWNvbmQ7IC8vIHVzZSBub24tc3RyaWN0IGNvbXBhcmlzb25cblx0XHRcdGNhc2UgJ2N1cnJlbnQnOlxuXHRcdFx0Y2FzZSAnZGltZW5zaW9uJzpcblx0XHRcdGNhc2UgJ2Rpc3RhbmNlJzpcblx0XHRcdGNhc2UgJ2RvdWJsZSc6IC8vIGZsb2F0aW5nIHBvaW50IHR5cGVzXG5cdFx0XHRjYXNlICdmaWxlc2l6ZSc6XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0Y2FzZSAncG93ZXInOlxuXHRcdFx0Y2FzZSAncXVhbnRpdHknOlxuXHRcdFx0Y2FzZSAndm9sdW1lJzpcblx0XHRcdGNhc2UgJ3dlaWdodCc6XG5cdFx0XHRjYXNlICdjb29yZGluYXRlJzpcblx0XHRcdGNhc2UgJ3ByaWNlJzpcblx0XHRcdGNhc2UgJ3BlcmNlbnRhZ2UnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb21wYXJlRmxvYXRzKFxuXHRcdFx0XHRcdGZpcnN0LFxuXHRcdFx0XHRcdHNlY29uZCxcblx0XHRcdFx0KTtcblx0XHRcdGNhc2UgJ2ludCc6IC8vIGludGVnZXIgdHlwZXNcblx0XHRcdGNhc2UgJ2Jvb2wnOiAvLyBib29sZWFuIHR5cGVzXG5cdFx0XHRjYXNlICdlbnVtJzpcblx0XHRcdGNhc2UgJ2VtYWlsJzogLy8gc3RyaW5nIHR5cGVzXG5cdFx0XHRjYXNlICdwaG9uZSc6XG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRjYXNlICdjb2xvcic6XG5cdFx0XHRjYXNlICdvcmRlcic6XG5cdFx0XHRcdHJldHVybiBmaXJzdCA9PT0gc2Vjb25kO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGVxdWFscyhcblx0XHRcdFx0XHRmaXJzdCxcblx0XHRcdFx0XHRzZWNvbmQsXG5cdFx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNvbXBhcmVGbG9hdHMgKFxuXHRcdGE6IG51bWJlcixcblx0XHRiOiBudW1iZXIsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGFic0EgPSBNYXRoLmFicyhhKTtcblx0XHRjb25zdCBhYnNCID0gTWF0aC5hYnMoYik7XG5cdFx0Y29uc3QgZGlmZiA9IE1hdGguYWJzKGEgLSBiKTtcblxuXHRcdGNvbnN0IEVQU0lMT04gPSAxLjE5ZS0wNztcblxuXHRcdC8vIHNob3J0Y3V0LCBoYW5kbGVzIGluZmluaXRpZXNcblx0XHRpZiAoYSA9PT0gYikge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSBlbHNlIGlmIChhID09PSAwIHx8IGIgPT09IDAgfHwgZGlmZiA8IE51bWJlci5NSU5fVkFMVUUpIHtcblx0XHRcdC8vIGEgb3IgYiBpcyB6ZXJvIG9yIGJvdGggYXJlIGV4dHJlbWVseSBjbG9zZSB0byBpdFxuXHRcdFx0Ly8gcmVsYXRpdmUgZXJyb3IgaXMgbGVzcyBtZWFuaW5nZnVsIGhlcmVcblx0XHRcdHJldHVybiBkaWZmIDwgKEVQU0lMT04gKiBOdW1iZXIuTUlOX1ZBTFVFKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gdXNlIHJlbGF0aXZlIGVycm9yXG5cdFx0XHRyZXR1cm4gZGlmZiAvIE1hdGgubWluKFxuXHRcdFx0XHQoYWJzQSArIGFic0IpLFxuXHRcdFx0XHROdW1iZXIuTUFYX1ZBTFVFLFxuXHRcdFx0KSA8IEVQU0lMT047XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNvbXBhcmVNb21lbnRPYmplY3RzIChcblx0XHRmaXJzdDogbW9tZW50Lk1vbWVudCxcblx0XHRzZWNvbmQ6IG1vbWVudC5Nb21lbnQsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmICghZmlyc3QuaXNWYWxpZCgpKSB7XG5cdFx0XHRyZXR1cm4gIXNlY29uZC5pc1ZhbGlkKCk7XG5cdFx0fVxuXG5cdFx0aWYgKCFzZWNvbmQuaXNWYWxpZCgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fSAvLyBmaXJzdCBJUyB2YWxpZFxuXG5cdFx0cmV0dXJuIGZpcnN0LmlzU2FtZShzZWNvbmQpO1xuXHR9XG5cblx0cHVibGljIGNvbXBhcmVEdXJhdGlvbnMgKFxuXHRcdGZpcnN0OiBtb21lbnQuRHVyYXRpb24sXG5cdFx0c2Vjb25kOiBtb21lbnQuRHVyYXRpb24sXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBmaXJzdC5hc01pbGxpc2Vjb25kcygpID09PSBzZWNvbmQuYXNNaWxsaXNlY29uZHMoKTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXNwb25zZVZhbHVlIChcblx0XHRjb2x1bW5UeXBlOiBzdHJpbmcsXG5cdFx0dmFsdWU6IGFueSxcblx0KSB7XG5cdFx0c3dpdGNoIChjb2x1bW5UeXBlKSB7XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkYXRlJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVzcG9uc2VEYXRlKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVzcG9uc2VDb2xvcih2YWx1ZSk7XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlc3BvbnNlRHVyYXRpb24odmFsdWUpO1xuXHRcdFx0Y2FzZSAnanNvbic6XG5cdFx0XHRcdHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmIHZhbHVlICE9PSAnJyA/IEpTT04ucGFyc2UodmFsdWUpIDogdmFsdWU7XG5cdFx0XHRjYXNlICdudW1iZXInOlxuXHRcdFx0XHRyZXR1cm4gdmFsdWUgPT09IDAgPyBudWxsIDogdmFsdWU7XG5cdFx0XHRjYXNlICdmaWxlc2l6ZSc6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSAvIDEwMDAwMDA7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3RWYWx1ZSAoXG5cdFx0Y29sdW1uVHlwZTogc3RyaW5nLFxuXHRcdHZhbHVlOiBhbnksXG5cdCkge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5mb3JtYXRSZXF1ZXN0RGF0ZVRpbWUodmFsdWUpO1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmZvcm1hdFJlcXVlc3REYXRlKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVxdWVzdENvbG9yKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZm9ybWF0UmVxdWVzdER1cmF0aW9uKHZhbHVlKTtcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA9PT0gMCA/IG51bGwgOiB2YWx1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZm9ybWF0UmVzcG9uc2VEYXRlICh2YWx1ZTogbnVsbCB8IGFueSk6IG1vbWVudC5Nb21lbnQge1xuXHRcdHJldHVybiB2YWx1ZSA9PT0gbnVsbCA/IG1vbWVudC5pbnZhbGlkKCkgOiBtb21lbnQodmFsdWUpO1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlc3BvbnNlRHVyYXRpb24gKHZhbHVlOiBudWxsIHwgbnVtYmVyKTogbW9tZW50LkR1cmF0aW9uIHtcblx0XHRyZXR1cm4gbW9tZW50LmR1cmF0aW9uKFxuXHRcdFx0dmFsdWUgPT09IG51bGwgPyAwIDogdmFsdWUsXG5cdFx0XHQnc2Vjb25kcycsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXNwb25zZUNvbG9yICh2YWx1ZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gdmFsdWUuY2hhckF0KDApID09PSAnIycgPyB2YWx1ZSA6ICcjJyArIHZhbHVlO1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3REYXRlVGltZSAodmFsdWU6IG1vbWVudC5Nb21lbnQpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRyZXR1cm4gdmFsdWUuaXNWYWxpZCgpID8gdmFsdWUuZm9ybWF0KHRoaXMuU0VSVkVSX0RBVEVUSU1FX0ZPUk1BVCkgOiBudWxsO1xuXHR9XG5cblx0cHVibGljIGZvcm1hdFJlcXVlc3REYXRlICh2YWx1ZTogbW9tZW50Lk1vbWVudCk6IHN0cmluZyB8IG51bGwge1xuXHRcdHJldHVybiB2YWx1ZS5pc1ZhbGlkKCkgPyB2YWx1ZS5mb3JtYXQodGhpcy5TRVJWRVJfREFURV9GT1JNQVQpIDogbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0RHVyYXRpb24gKHZhbHVlOiBtb21lbnQuRHVyYXRpb24pOiBudW1iZXIge1xuXHRcdHJldHVybiB2YWx1ZS5hc1NlY29uZHMoKTtcblx0fVxuXG5cdHB1YmxpYyBmb3JtYXRSZXF1ZXN0Q29sb3IgKHZhbHVlOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdHJldHVybiB2YWx1ZS5jaGFyQXQoMCkgPT09ICcjJyA/IHZhbHVlLnN1YnN0cmluZygxKSA6IHZhbHVlO1xuXHR9XG5cblx0cHVibGljIGdldERlZmF1bHRWYWx1ZSAoY29sdW1uVHlwZTogc3RyaW5nKTogYW55IHtcblx0XHRzd2l0Y2ggKGNvbHVtblR5cGUpIHtcblx0XHRcdGNhc2UgJ2ludCc6XG5cdFx0XHRjYXNlICdkb3VibGUnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdvcmRlcic6XG5cdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0Y2FzZSAnaXRlbSc6XG5cdFx0XHRjYXNlICdsaW5rJzpcblx0XHRcdGNhc2UgJ2NoaWxkJzpcblx0XHRcdGNhc2UgJ3NpYmxpbmcnOlxuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdGNhc2UgJ2Jvb2wnOlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRjYXNlICdlbnVtJzpcblx0XHRcdFx0cmV0dXJuICcwJztcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRcdHJldHVybiBtb21lbnQuaW52YWxpZCgpO1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gbW9tZW50LmR1cmF0aW9uKCk7XG5cdFx0XHRjYXNlICd0ZXh0Jzpcblx0XHRcdGNhc2UgJ2xvbmd0ZXh0Jzpcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0Y2FzZSAnY29sb3InOlxuXHRcdFx0XHRyZXR1cm4gJyMwMDAwMDAnO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuICcnO1xuXHRcdFx0Ly8gXHRcdFx0XHRcdGVtYWlsXG5cdFx0XHQvLyBcdFx0XHRcdFx0dXJsXG5cdFx0XHQvLyBcdFx0XHRcdFx0aHRtbFxuXHRcdFx0Ly8gXHRcdFx0XHRcdGpzb25cblx0XHRcdC8vIFx0XHRcdFx0XHRkYXRhXG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGlzRGVmYXVsdFZhbHVlIChcblx0XHRjb2x1bW5UeXBlOiBzdHJpbmcsXG5cdFx0dmFsdWU6IGFueSxcblx0KTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29tcGFyZUZpZWxkcyhcblx0XHRcdGNvbHVtblR5cGUsXG5cdFx0XHR2YWx1ZSxcblx0XHRcdHRoaXMuZ2V0RGVmYXVsdFZhbHVlKGNvbHVtblR5cGUpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmUgKFxuXHRcdGNvbHVtblR5cGU6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHQpOiBhbnkge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jbG9uZUR1cmF0aW9uKHZhbHVlKTtcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0XHRyZXR1cm4gbW9tZW50KHZhbHVlKTtcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0XHRyZXR1cm4gY29weSh2YWx1ZSk7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gdmFsdWU7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGdldENsb25lRnVuY3Rpb24gKGNvbHVtblR5cGU6IHN0cmluZykge1xuXHRcdHN3aXRjaCAoY29sdW1uVHlwZSkge1xuXHRcdFx0Y2FzZSAnZHVyYXRpb24nOlxuXHRcdFx0XHRyZXR1cm4gdGhpcy5jbG9uZUR1cmF0aW9uO1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmNsb25lRGF0ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiB0aGlzLmlkZW50aXR5O1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBjbG9uZUR1cmF0aW9uIChkdXJhdGlvbjogbW9tZW50LkR1cmF0aW9uKSB7XG5cdFx0cmV0dXJuIG1vbWVudC5kdXJhdGlvbihkdXJhdGlvbik7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVEYXRlIChkYXRlOiBtb21lbnQuTW9tZW50KTogbW9tZW50Lk1vbWVudCB7XG5cdFx0cmV0dXJuIGRhdGUuY2xvbmUoKTtcblx0fVxuXG5cdHB1YmxpYyBpZGVudGl0eTxUPiAoaW5wdXQ6IFQpOiBUIHtcblx0XHRyZXR1cm4gaW5wdXQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW5NYXAsIEFwaVJlcXVlc3RJdGVtTWFwLCBBcGlSZXF1ZXN0TGltaXQsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2Vcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQXBpUmVxdWVzdFNlcnZpY2Uge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBleHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZUludGVyZmFjZSxcblx0XHRwcml2YXRlIGFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeTogQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5XG5cdCkge1xuXG5cdH1cblxuXHR0ZW1wbGF0ZSAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBwYXJhbXM6IGFueSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLnRlbXBsYXRlKGl0ZW1UeXBlLCBwYXJhbXMpKTtcblx0fVxuXG5cdGNyZWF0ZSAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBpdGVtSWQ6IEl0ZW1JZCwgdmFsdWVzOiBhbnksIHBhcmVudFR5cGU/OiBJdGVtVHlwZSwgcGFyZW50SWQ/OiBJdGVtSWQpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS5jcmVhdGUoaXRlbVR5cGUsIGl0ZW1JZCwgdmFsdWVzLCBwYXJlbnRUeXBlLCBwYXJlbnRJZCkpO1xuXHR9XG5cblx0ZGVsZXRlIChpdGVtVHlwZTogSXRlbVR5cGUsIGl0ZW1JZHM6IEl0ZW1JZFtdKTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UuZGVsZXRlKGl0ZW1UeXBlLCBpdGVtSWRzKSk7XG5cdH1cblxuXHR1cGRhdGVJdGVtcyAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBpdGVtczogQXBpUmVxdWVzdEl0ZW1NYXAsIGNvbHVtbnM6IGFueSk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRyZXR1cm4gdGhpcy5wcm9jZXNzUmVzcG9uc2UodGhpcy5leHRlcm5hbEFwaVJlcXVlc3RTZXJ2aWNlLnVwZGF0ZUl0ZW1zKGl0ZW1UeXBlLCBpdGVtcywgY29sdW1ucykpO1xuXHR9XG5cblx0cmVxdWVzdFNrZWxldG9uIChwYXJhbXM6IGFueSwgcmVxdWVzdENhbmNlbGVyPzogUHJvbWlzZUludGVyZmFjZTxhbnk+KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UucmVxdWVzdFNrZWxldG9uKHBhcmFtcywgcmVxdWVzdENhbmNlbGVyKSk7XG5cdH1cblxuXHRtb3ZlSXRlbXMgKHBhcmVudFR5cGU6IEl0ZW1UeXBlLCBwYXJlbnRJZDogSXRlbUlkLCBpdGVtczoge1tpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW119KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UubW92ZUl0ZW1zKHBhcmVudFR5cGUsIHBhcmVudElkLCBpdGVtcykpO1xuXHR9XG5cblx0Y29sdW1ucyAoaXRlbVR5cGU6IEl0ZW1UeXBlLCBjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBwYXJhbXM/OiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3BvbnNlKHRoaXMuZXh0ZXJuYWxBcGlSZXF1ZXN0U2VydmljZS5jb2x1bW5zKGl0ZW1UeXBlLCBjb2x1bW5zLCBwYXJhbXMpKTtcblx0fVxuXG5cdHF1ZXJ5IChpdGVtVHlwZTogSXRlbVR5cGUsIHF1ZXJ5OiBhbnksIGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5NYXAsIGxpbWl0PzogQXBpUmVxdWVzdExpbWl0KTogUHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZVByb2Nlc3Nvcj4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZSh0aGlzLmV4dGVybmFsQXBpUmVxdWVzdFNlcnZpY2UucXVlcnkoaXRlbVR5cGUsIHF1ZXJ5LCBjb2x1bW5zLCBsaW1pdCkpO1xuXHR9XG5cblx0cHJvY2Vzc1Jlc3BvbnNlIChyZXF1ZXN0OiBhbnkpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0cmV0dXJuIHJlcXVlc3QudGhlbigocmVzcG9uc2U6IGFueSkgPT4gdGhpcy5hcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkuY29uc3RydWN0KHJlc3BvbnNlKSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgRmllbGRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUsIEl0ZW1UeXBlTWFwLCBSZXNwb25zZUNvbHVtbiB9IGZyb20gJy4uL3R5cGVzJztcblxuLy8gdG9kb1tjYWNoZV0gZXh0ZW5kIGJhc2UgY2xhc3MgcGVyIHJlcXVlc3QgKGRlbGV0ZSBoYXMgZGlmZmVyZW50IHN0cnVjdHVyZSlcbmV4cG9ydCBjbGFzcyBBcGlSZXNwb25zZVByb2Nlc3NvciB7XG5cblx0Y29sdW1uczogSXRlbVR5cGVNYXA8UmVzcG9uc2VDb2x1bW5bXT47XG5cdGxpbmtzOiBJdGVtVHlwZU1hcDxJdGVtSWRbXT47XG5cdGNhY2hlYWJsZTogYm9vbGVhbjtcblx0bWFwOiBhbnk7XG5cblx0aXRlbXM6IGFueTtcblxuXHRjb2x1bW5JbmRleE1hcDoge1xuXHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0W2NvbHVtbklkOiBzdHJpbmddOiBudW1iZXJcblx0XHR9XG5cdH0gPSB7fTtcblxuXHRjb2x1bW5NYXA6IGFueSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgYXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0cHVibGljIHJlc3BvbnNlOiBhbnksXG5cdCkge1xuXHRcdHRoaXMuY29sdW1ucyA9IHJlc3BvbnNlLmNvbHVtbnM7XG5cdFx0dGhpcy5pdGVtcyA9IHJlc3BvbnNlLml0ZW1zO1xuXHRcdHRoaXMubGlua3MgPSByZXNwb25zZS5saW5rcztcblx0XHR0aGlzLmNhY2hlYWJsZSA9IHJlc3BvbnNlLmNhY2hlYWJsZTtcblx0XHR0aGlzLm1hcCA9IHJlc3BvbnNlLm1hcDtcblxuXHRcdHRoaXMuY3JlYXRlQ29sdW1uTWFwcygpO1xuXHR9XG5cblx0cHJpdmF0ZSBjcmVhdGVDb2x1bW5NYXBzICgpIHtcblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHRoaXMuY29sdW1ucykge1xuXHRcdFx0dGhpcy5jb2x1bW5JbmRleE1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHRcdHRoaXMuY29sdW1uTWFwW2l0ZW1UeXBlXSA9IHt9O1xuXG5cdFx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sdW1uc1tpdGVtVHlwZV0ubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zW2l0ZW1UeXBlXVtpXTtcblxuXHRcdFx0XHR0aGlzLmNvbHVtbkluZGV4TWFwW2l0ZW1UeXBlXVtjb2x1bW4uaWRdID0gaTtcblx0XHRcdFx0dGhpcy5jb2x1bW5NYXBbaXRlbVR5cGVdW2NvbHVtbi5pZF0gPSBjb2x1bW47XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZldGNoQ29sdW1uT2JqZWN0IChpdGVtVHlwZTogSXRlbVR5cGUpOiBSZXNwb25zZUNvbHVtbiB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uTWFwW2l0ZW1UeXBlXTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaFZhbHVlIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y29sdW1uSWQ6IHN0cmluZyxcblx0KSB7XG5cdFx0aWYgKHRoaXMuaXRlbXNbaXRlbVR5cGVdW2l0ZW1JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLmNvbHVtbk1hcFtpdGVtVHlwZV1bY29sdW1uSWRdO1xuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5jb2x1bW5JbmRleE1hcFtpdGVtVHlwZV1bY29sdW1uSWRdO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlc3BvbnNlVmFsdWUoXG5cdFx0XHRjb2x1bW4udHlwZSxcblx0XHRcdHRoaXMuaXRlbXNbaXRlbVR5cGVdW2l0ZW1JZF0uZGF0YVtpbmRleF0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaENvbHVtbkFycmF5IChpdGVtVHlwZTogSXRlbVR5cGUpOiBSZXNwb25zZUNvbHVtbltdIHtcblx0XHRjb25zdCByZXN1bHQ6IFJlc3BvbnNlQ29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgYXBpQ29sdW1uIG9mIHRoaXMuY29sdW1uc1tpdGVtVHlwZV0pIHtcblx0XHRcdHJlc3VsdC5wdXNoKGFwaUNvbHVtbik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaERlcml2ZWRPYmplY3QgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRyb290Q29sdW1uczogUmVzcG9uc2VDb2x1bW5bXSxcblx0KSB7XG5cdFx0Y29uc3QgcmVzdWx0ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiByb290Q29sdW1ucykge1xuXHRcdFx0dGhpcy5mZXRjaERlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdHRoaXMuZmV0Y2hWYWx1ZShcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0Y29sdW1uLmlkLFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRjb2x1bW4sXG5cdFx0XHRcdHJlc3VsdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaERlcml2ZWRWYWx1ZXMgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0Y29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRkZXN0aW5hdGlvbjogYW55LFxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGNoaWxkQ29sdW1uIG9mIGNvbHVtbi5jaGlsZHJlbikge1xuXHRcdFx0bGV0IGNoaWxkVmFsdWU7XG5cblx0XHRcdGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuXHRcdFx0XHRjaGlsZFZhbHVlID0gbnVsbDtcblx0XHRcdFx0ZGVzdGluYXRpb25bY2hpbGRDb2x1bW4ucGF0aF0gPSB0aGlzLmFwaUZvcm1hdHRlci5nZXREZWZhdWx0VmFsdWUoY2hpbGRDb2x1bW4uYXBpQ29sdW1uLnR5cGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2hpbGRWYWx1ZSA9IHRoaXMuZmV0Y2hWYWx1ZShcblx0XHRcdFx0XHRjb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdFx0dmFsdWUsXG5cdFx0XHRcdFx0Y2hpbGRDb2x1bW4uaWQsXG5cdFx0XHRcdCk7XG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NoaWxkQ29sdW1uLnBhdGhdID0gY2hpbGRWYWx1ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNoaWxkQ29sdW1uLmlzTGVhZikge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5mZXRjaERlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdGNoaWxkVmFsdWUsXG5cdFx0XHRcdGNoaWxkQ29sdW1uLFxuXHRcdFx0XHRkZXN0aW5hdGlvbixcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZldGNoT2JqZWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0XHRpbmNsdWRlTGlua3M6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKHRoaXMuaXRlbXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXRlbSA9IHRoaXMuaXRlbXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRpZiAoaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGRhdGEgPSB0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdLmRhdGE7XG5cdFx0Y29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcblxuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5zW2l0ZW1UeXBlXVtpXTtcblxuXHRcdFx0aWYgKHRoaXMuYXBpRm9ybWF0dGVyLmlzRXhwZW5zaXZlRm9ybWF0KGNvbHVtbi50eXBlKSkge1xuXHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0cmVzdWx0LFxuXHRcdFx0XHRcdGNvbHVtbi5pZCxcblx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRlbnVtZXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlLFxuXHRcdFx0XHRcdFx0c2V0OlxuXHRcdFx0XHRcdFx0XHR2YWx1ZSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0ZGVsZXRlIHJlc3VsdFtjb2x1bW4uaWRdO1xuXG5cdFx0XHRcdFx0XHRcdFx0cmVzdWx0W2NvbHVtbi5pZF0gPSB2YWx1ZTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdGdldDogKCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRkZWxldGUgcmVzdWx0W2NvbHVtbi5pZF07XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdFtjb2x1bW4uaWRdID0gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVzcG9uc2VWYWx1ZShcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW4udHlwZSxcblx0XHRcdFx0XHRcdFx0XHRkYXRhW2ldLFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0W2NvbHVtbi5pZF0gPSB0aGlzLmFwaUZvcm1hdHRlci5mb3JtYXRSZXNwb25zZVZhbHVlKFxuXHRcdFx0XHRcdGNvbHVtbi50eXBlLFxuXHRcdFx0XHRcdGRhdGFbaV0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGluY2x1ZGVMaW5rcykge1xuXHRcdFx0Y29uc3QgbGlua3MgPSB0aGlzLml0ZW1zW2l0ZW1UeXBlXVtpdGVtSWRdLmxpbmtzO1xuXHRcdFx0cmVzdWx0Ll9fbGlua3MgPSB7fTtcblxuXHRcdFx0Zm9yIChjb25zdCBsaW5rVHlwZSBpbiBsaW5rcykge1xuXHRcdFx0XHRyZXN1bHQuX19saW5rc1tsaW5rVHlwZV0gPVxuXHRcdFx0XHRcdHRoaXMuZmV0Y2hPYmplY3RBcnJheShcblx0XHRcdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHRcdFx0aW5jbHVkZUxpbmtzLFxuXHRcdFx0XHRcdFx0bGlua3NbbGlua1R5cGVdLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaE9iamVjdEFycmF5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpbmNsdWRlTGlua3M/OiBib29sZWFuLFxuXHRcdGlkQXJyYXk/OiBJdGVtSWRbXSB8IG51bGwsXG5cdCk6IEFycmF5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCByZXN1bHQ6IGFueVtdID0gW107XG5cblx0XHRpZiAoaWRBcnJheSA9PT0gbnVsbCkge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gdGhpcy5pdGVtc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0cmVzdWx0LnB1c2godGhpcy5mZXRjaE9iamVjdChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0aW5jbHVkZUxpbmtzLFxuXHRcdFx0XHQpKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHR9XG5cblx0XHRpZiAoaWRBcnJheSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZEFycmF5ID0gdGhpcy5saW5rc1tpdGVtVHlwZV07XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaWRBcnJheSkge1xuXHRcdFx0cmVzdWx0LnB1c2godGhpcy5mZXRjaE9iamVjdChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0aW5jbHVkZUxpbmtzLFxuXHRcdFx0KSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaENvbHVtbnNPYmplY3QgKCk6IHtbaXRlbVR5cGU6IHN0cmluZ106IFJlc3BvbnNlQ29sdW1ufSB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uTWFwO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnQsIEl0ZW1FbnRyeU1hcCwgSXRlbU1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEludGVybmFsQ3JlYXRlRGVsdGEgfSBmcm9tICcuL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcblxuaW1wb3J0IHsgY3JlYXRlUGF0aCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCB0eXBlIENyZWF0ZUNvbXBpbGF0aW9uID0ge1xuXHRbcGFyZW50VHlwZTogc3RyaW5nXToge1xuXHRcdFtwYXJlbnRJZDogbnVtYmVyXTogSXRlbU1hcDxJbnRlcm5hbENyZWF0ZURlbHRhPlxuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBEZWxldGVDb21waWxhdGlvbiA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGU+PlxufTtcblxuZXhwb3J0IHR5cGUgVXBkYXRlQ29tcGlsYXRpb24gPSBJdGVtRW50cnlNYXA8SXRlbVR5cGU+O1xuXG5leHBvcnQgdHlwZSBNb3ZlQ29tcGlsYXRpb24gPSB7XG5cdFtwYXJlbnRUeXBlOiBzdHJpbmddOiB7XG5cdFx0W3BhcmVudElkOiBudW1iZXJdOiBJdGVtRW50cnlbXVxuXHR9XG59O1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblxuXHRjb21waWxhdGlvbjoge1xuXHRcdGNyZWF0ZTogQ3JlYXRlQ29tcGlsYXRpb24sXG5cdFx0ZGVsZXRlOiBEZWxldGVDb21waWxhdGlvbixcblx0XHR1cGRhdGU6IFVwZGF0ZUNvbXBpbGF0aW9uLFxuXHRcdG1vdmU6IE1vdmVDb21waWxhdGlvblxuXHR9ID0ge1xuXHRcdGNyZWF0ZToge30sXG5cdFx0ZGVsZXRlOiB7fSxcblx0XHR1cGRhdGU6IHt9LFxuXHRcdG1vdmU6IHt9LFxuXHR9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHR0aGlzLnByb2Nlc3NEZWx0YSgpO1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzRGVsdGEgKCk6IHZvaWQge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0RGVsdGEoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGNvbnN0IGVudHJpZXNUb0JlRGVsZXRlZCA9IGNoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXTtcblxuXHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgZW50cmllc1RvQmVEZWxldGVkKSB7XG5cdFx0XHRcdGlmIChpdGVtRW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmFkZERlbGV0ZUVudHJ5KFxuXHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGNoYW5nZXNEZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5hZGRDcmVhdGVFbnRyeSh0dXBsZSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuYWRkVXBkYXRlRW50cnkodHVwbGUuZW50cnkpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gY2hhbmdlc0RlbHRhLm1vdmVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGNoYW5nZXNEZWx0YS5tb3ZlZFtpdGVtRW50cnlJZF07XG5cblx0XHRcdHRoaXMuYWRkTW92ZUVudHJ5KFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0dHVwbGUudG8sXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVmYXVsdFBhcmVudCAoKTogRW50cnlQYXJlbnQge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpdGVtVHlwZTogJ1ZvaWQnLFxuXHRcdFx0aXRlbUlkOiAwLFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIGFkZE1vdmVFbnRyeSAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnksXG5cdFx0bmV3UGFyZW50OiBFbnRyeVBhcmVudCxcblx0KTogdm9pZCB7XG5cdFx0Y3JlYXRlUGF0aDxJdGVtRW50cnlbXT4oXG5cdFx0XHR0aGlzLmNvbXBpbGF0aW9uLm1vdmUsXG5cdFx0XHRbXG5cdFx0XHRcdG5ld1BhcmVudC5pdGVtVHlwZSxcblx0XHRcdFx0bmV3UGFyZW50Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRbXSxcblx0XHRcdF0sXG5cdFx0KVxuXHRcdFx0LnB1c2goaXRlbUVudHJ5KTtcblx0fVxuXG5cdHByaXZhdGUgYWRkRGVsZXRlRW50cnkgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlPixcblx0KTogdm9pZCB7XG5cdFx0Y3JlYXRlUGF0aDxJdGVtRW50cnlbXT4oXG5cdFx0XHR0aGlzLmNvbXBpbGF0aW9uLmRlbGV0ZSxcblx0XHRcdFtcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XSxcblx0XHRcdFtcblx0XHRcdFx0W10sXG5cdFx0XHRdLFxuXHRcdClcblx0XHRcdC5wdXNoKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGRVcGRhdGVFbnRyeSAoaXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGU+KTogdm9pZCB7XG5cdFx0Y3JlYXRlUGF0aChcblx0XHRcdHRoaXMuY29tcGlsYXRpb24udXBkYXRlLFxuXHRcdFx0W1xuXHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHR7fSxcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhZGRDcmVhdGVFbnRyeSAoY3JlYXRlRGVsdGE6IEludGVybmFsQ3JlYXRlRGVsdGEpOiB2b2lkIHtcblx0XHRsZXQgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoY3JlYXRlRGVsdGEuZW50cnkpO1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0cGFyZW50ID0gdGhpcy5nZXREZWZhdWx0UGFyZW50KCk7XG5cdFx0fVxuXG5cdFx0Y3JlYXRlUGF0aChcblx0XHRcdHRoaXMuY29tcGlsYXRpb24uY3JlYXRlLFxuXHRcdFx0W1xuXHRcdFx0XHRwYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdHBhcmVudC5pdGVtSWQsXG5cdFx0XHRcdGNyZWF0ZURlbHRhLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRjcmVhdGVEZWx0YS5lbnRyeS5pdGVtSWQsXG5cdFx0XHRdLFxuXHRcdFx0W1xuXHRcdFx0XHR7fSxcblx0XHRcdFx0e30sXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRjcmVhdGVEZWx0YSxcblx0XHRcdF0sXG5cdFx0KTtcblx0fVxuXG59XG4iLCJpbXBvcnQge1xuXHRBcGlSZXF1ZXN0U2VydmljZSxcblx0Q2hhbmdlc0NvbXBpbGF0aW9uLFxuXHRDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRDb2x1bW5JbmZvLFxuXHREZWxldGVDb21waWxhdGlvbixcblx0aGFzUHJvcGVydGllcyxcblx0SXRlbUVudHJ5U2VydmljZSxcblx0TW92ZUNvbXBpbGF0aW9uLFxuXHRTZXJ2ZXJDYWNoZSxcblx0VXBkYXRlQ29tcGlsYXRpb24sXG59IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHtcblx0Q2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxufSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0TW92ZUl0ZW1zLFxuXHRBcGlSZXNwb25zZSxcblx0Q3JlYXRlUmVxdWVzdEVudHJ5LFxuXHRGaWVsZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRJdGVtVHlwZSxcblx0UHJvbWlzZUludGVyZmFjZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmltcG9ydCB7IGdldFBhdGgsIGluQXJyYXkgfSBmcm9tICcuL1V0aWwnO1xuXG5leHBvcnQgdHlwZSBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2sgPSAoY29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCkgPT4gdm9pZDtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEV4ZWN1dGVzIHRoZSBjaGFuZ2VzIGZyb20gYSBzcGVjaWZpYyB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn0gYW5kIHJldHVybnMgYSB7QGxpbmsgQ2hhbmdlc0RlbHRhIENoYW5nZXNEZWx0YX1cbiAqL1xuZXhwb3J0IGNsYXNzIENoYW5nZXNQcm9jZXNzb3Ige1xuXG5cdHByaXZhdGUgaXRlbUlkQ29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9O1xuXHRwcml2YXRlIHNlcnZlckNhY2hlOiBTZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0U2VydmVyQ2FjaGUoKTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTogQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjcmVhdGVSZXF1ZXN0RmFjdG9yeTogQ3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0cHJpdmF0ZSBicmVha1VwQnlQYXJlbnQ/OiBib29sZWFuLFxuXHRcdHByaXZhdGUgb25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpIHtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXhlY3V0ZXMgdGhlIHJlcXVlc3RzIGluIHRoZSBvcmRlciBvZjpcblx0ICogMS4gY3JlYXRlXG5cdCAqIDIuIG1vdmVcblx0ICogMy4gZGVsZXRlXG5cdCAqIDQuIHVwZGF0ZVxuXHQgKi9cblx0cHVibGljIGV4ZWN1dGUgKCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUlkQ29udmVyc2lvbk1hcD4ge1xuXHRcdGNvbnN0IGNoYW5nZXNDb21waWxhdGlvbiA9IHRoaXMuY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb21waWxhdGlvbiA9IGNoYW5nZXNDb21waWxhdGlvbi5jb21waWxhdGlvbjtcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZXhlY3V0ZUNyZWF0ZVJlcXVlc3RzKGNoYW5nZXNDb21waWxhdGlvbilcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB0aGlzLmV4ZWN1dGVNb3ZlUmVxdWVzdHMoY29tcGlsYXRpb24ubW92ZSksXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB0aGlzLmV4ZWN1dGVVcGRhdGVSZXF1ZXN0cyhjb21waWxhdGlvbi51cGRhdGUpLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcy5leGVjdXRlRGVsZXRlUmVxdWVzdHMoY29tcGlsYXRpb24uZGVsZXRlKSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYnVpbGRNb3ZlUmVxdWVzdCAoY29tcGlsYXRpb25FbnRyaWVzOiBJdGVtRW50cnlbXSk6IEFwaVJlcXVlc3RNb3ZlSXRlbXMge1xuXHRcdGNvbnN0IHJlc3VsdDogQXBpUmVxdWVzdE1vdmVJdGVtcyA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgY29tcGlsYXRpb25FbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblxuXHRcdFx0aWYgKHJlc3VsdFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXN1bHRbaXRlbVR5cGVdID0gW107XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdFtpdGVtVHlwZV0ucHVzaChpdGVtRW50cnkuaXRlbUlkKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRNYXBWYWx1ZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogSXRlbUlkIHwgdW5kZWZpbmVkIHtcblx0XHRpZiAobWFwID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0aWYgKG1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlQ3JlYXRlUmVxdWVzdHMgKFxuXHRcdGNoYW5nZXNDb21waWxhdGlvbjogQ2hhbmdlc0NvbXBpbGF0aW9uLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPGFueVtdPiB7XG5cdFx0Y29uc3QgcmVxdWVzdHMgPSB0aGlzLmNyZWF0ZVJlcXVlc3RGYWN0b3J5XG5cdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHRjaGFuZ2VzQ29tcGlsYXRpb24uY29tcGlsYXRpb24uY3JlYXRlLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLFxuXHRcdFx0XHR0aGlzLmJyZWFrVXBCeVBhcmVudCxcblx0XHRcdClcblx0XHRcdC5ydW4oKTtcblxuXHRcdGNvbnN0IHJlc3BvbnNlczogQXJyYXk8UHJvbWlzZUludGVyZmFjZTxhbnk+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCByZXF1ZXN0IG9mIHJlcXVlc3RzKSB7XG5cdFx0XHRyZXNwb25zZXMucHVzaChcblx0XHRcdFx0dGhpc1xuXHRcdFx0XHRcdC5leGVjdXRlQ3JlYXRlUmVxdWVzdChyZXF1ZXN0KVxuXHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0cmVzdWx0ID0+IHtcblx0XHRcdFx0XHRcdFx0aWYgKHRoaXMub25BZnRlckNyZWF0ZUNhbGxiYWNrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLm9uQWZ0ZXJDcmVhdGVDYWxsYmFjayh0aGlzLml0ZW1JZENvbnZlcnNpb25NYXApO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdDtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlc3BvbnNlcyk7XG5cdH1cblxuXHQvLyB0b2RvW2NhY2hlXSB0ZXN0IGNyZWF0ZSByZXF1ZXN0c1xuXHRwcml2YXRlIGV4ZWN1dGVDcmVhdGVSZXF1ZXN0IChcblx0XHRyZXF1ZXN0UmVzb3VyY2U6IENyZWF0ZVJlcXVlc3RFbnRyeTxhbnk+LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5hcGlSZXF1ZXN0U2VydmljZS5yZXF1ZXN0U2tlbGV0b24ocmVxdWVzdFJlc291cmNlLnJlcXVlc3QpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdFx0XHRcdGNvbnN0IHJlc3BvbnNlTWFwID0gcmVzcG9uc2UubWFwO1xuXHRcdFx0XHRcdGNvbnN0IHJlc3BvbnNlQ29sdW1ucyA9IHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpO1xuXHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyaWVzID0gcmVxdWVzdFJlc291cmNlLml0ZW1zO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpdGVtRW50cmllcykge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdHJlcXVlc3RSZXNvdXJjZS5yZXF1ZXN0LmNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtRW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gaXRlbUVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdFx0XHRcdFx0XHRcdGNvbnN0IG5ld0l0ZW1JZCA9IHRoaXMuZ2V0TWFwVmFsdWUoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0cGFyc2VJbnQoXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdFx0XHQxMCxcblx0XHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlTWFwLFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGlmIChuZXdJdGVtSWQgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0XHRcdFx0XHRcdCdDcmVhdGUgZmFpbGVkIScsXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8gd2UncmUgc3VyZSB0aGUgZW50cnkgZXhpc3RzLCBiZWNhdXNlIG90aGVyd2lzZSB5b3UgY291bGRuJ3Qgc2F2ZSBpdCBpbiB0aGUgZmlyc3QgcGxhY2Vcblx0XHRcdFx0XHRcdFx0Y29uc3QgbG9jYWxJdGVtRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdFx0KSE7XG5cblx0XHRcdFx0XHRcdFx0bG9jYWxJdGVtRW50cnkuaXRlbUlkID0gbmV3SXRlbUlkO1xuXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbbG9jYWxJdGVtRW50cnkuaWRdID0gdGhpcy50cmFuc2FjdGlvbi5nZXRDaGFuZ2VzRnJvbUl0ZW1DaGFuZ2VzKFxuXHRcdFx0XHRcdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbbG9jYWxJdGVtRW50cnkuaWRdXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmFkZChsb2NhbEl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmNsZWFyQnlJdGVtSWQoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0TnVtYmVyKGl0ZW1JZCksXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5wcm9jZXNzQXBpUmVzcG9uc2UoXG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHROdW1iZXIobmV3SXRlbUlkKSxcblx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnkuY29sdW1ucyxcblx0XHRcdFx0XHRcdFx0XHRjb2x1bW5FeHBhbnNpb24sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gZXh0ZW5kIGNvbnZlcnNpb24gbWFwXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiByZXNwb25zZU1hcCkge1xuXHRcdFx0XHRcdFx0aWYgKHRoaXMuaXRlbUlkQ29udmVyc2lvbk1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1JZENvbnZlcnNpb25NYXBbaXRlbVR5cGVdID0ge307XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIHJlc3BvbnNlTWFwW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1JZENvbnZlcnNpb25NYXBbaXRlbVR5cGVdW2l0ZW1JZF0gPSByZXNwb25zZU1hcFtpdGVtVHlwZV1baXRlbUlkXTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy50b0FycmF5KCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeSBvZiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0XHRcdFx0Y29uc3QgcGFyZW50ID0gY29sbGVjdGlvbkVudHJ5LnBhcmVudDtcblxuXHRcdFx0XHRcdFx0aWYgKHBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBuZXdQYXJlbnRJZCA9IHRoaXMuZ2V0TWFwVmFsdWUoXG5cdFx0XHRcdFx0XHRcdFx0cGFyZW50Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdHBhcmVudC5pdGVtSWQsXG5cdFx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdFx0aWYgKG5ld1BhcmVudElkICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0XHRwYXJlbnQuaXRlbUlkID0gbmV3UGFyZW50SWQ7XG5cblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkoXG5cdFx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkub3B0aW9ucyxcblx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGNvbnN0IHVwZGF0ZWRDb2x1bW5zOiB7W2NvbHVtbklkOiBzdHJpbmddOiBDb2x1bW5JbmZvPGFueT59ID1cblx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LmdldFVwZGF0ZWRJdGVtQ29sdW1ucyh0aGlzLml0ZW1JZENvbnZlcnNpb25NYXApO1xuXG5cdFx0XHRcdFx0XHRpZiAoIWhhc1Byb3BlcnRpZXModXBkYXRlZENvbHVtbnMpKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAodXBkYXRlZENvbHVtbnMuaWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLm9uSXRlbUVudHJpZXNDcmVhdGVkKFxuXHRcdFx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1JZENvbnZlcnNpb25NYXBbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLnNlcnZlckNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGV4ZWN1dGVVcGRhdGVSZXF1ZXN0cyAoXG5cdFx0Y29tcGlsYXRpb246IFVwZGF0ZUNvbXBpbGF0aW9uLFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0czogQXJyYXk8UHJvbWlzZUludGVyZmFjZTxBcGlSZXNwb25zZT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNvbXBpbGF0aW9uKSB7XG5cdFx0XHRyZXF1ZXN0cy5wdXNoKFxuXHRcdFx0XHR0aGlzLmV4ZWN1dGVVcGRhdGVSZXF1ZXN0KFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGNvbXBpbGF0aW9uW2l0ZW1UeXBlXSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlcXVlc3RzKTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZVVwZGF0ZVJlcXVlc3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiB7W2l0ZW1JZDogbnVtYmVyXTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT59LFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0OiB7W2l0ZW1UeXBlOiBzdHJpbmddOiB7W2l0ZW1JZDogbnVtYmVyXTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPn19ID0ge307XG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbnMgPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gdmVyaWZ5IGlmIHdlIHNob3VsZCBjYWxsIGdldENvbGxlY3Rpb25NYXRjaGVyIG9uIFNlcnZlckNhY2hlIG9yIFRyYW5zYWN0aW9uQ2FjaGVcblx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuZ2V0Q29sbGVjdGlvbk1hdGNoZXIoKTtcblxuXHRcdHJlcXVlc3RbaXRlbVR5cGVdID0ge307XG5cblx0XHQvLyB3ZSBuZWVkIHRvIGRvIHRoZSBmb3JtYXRSZXF1ZXN0IGNhbGwgaGVyZSAoZmllbGRzIG1pZ2h0IGhhdmUgYmVlbiB1cGRhdGVkKVxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtRW50cmllc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgaXRlbVJlcXVlc3Q6IGFueSA9IHJlcXVlc3RbaXRlbVR5cGVdW2l0ZW1JZF0gPSB7fTtcblx0XHRcdGNvbnN0IHBhcmFtZXRlcnMgPSBnZXRQYXRoKFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRdLFxuXHRcdFx0KTtcblxuXHRcdFx0aXRlbVJlcXVlc3QudmFsdWVzID0gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5mb3JtYXRSZXF1ZXN0KGl0ZW1FbnRyeSk7XG5cblx0XHRcdGlmIChwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0aXRlbVJlcXVlc3QucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG5cdFx0XHR9XG5cblx0XHRcdHJlcXVlc3RDb2x1bW5zLmV4cGFuZChpdGVtRW50cnkuY29sdW1ucyk7XG5cblx0XHRcdC8vIHRvZG9bY2FjaGVdIHRlc3Rcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyLmV4cGFuZChcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0uY2hhbmdlcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zID0gY29sbGVjdGlvbk1hdGNoZXIuZ2V0Q29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zKCk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb24gb2YgY29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zKSB7XG5cdFx0XHRyZXF1ZXN0Q29sdW1ucy5leHBhbmQoY29sbGVjdGlvbi5jb2x1bW5zKTtcblx0XHR9XG5cblx0XHRjb25zdCBhcGlSZXF1ZXN0Q29sdW1ucyA9IHJlcXVlc3RDb2x1bW5zLmdldCgpO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC51cGRhdGVJdGVtcyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHJlcXVlc3QsXG5cdFx0XHRcdGFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHRoaXMuc2VydmVyQ2FjaGUucHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZXhlY3V0ZURlbGV0ZVJlcXVlc3RzIChcblx0XHRjb21waWxhdGlvbjogRGVsZXRlQ29tcGlsYXRpb24sXG5cdCkge1xuXHRcdGNvbnN0IHJlcXVlc3RzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPHZvaWQ+PiA9IFtdO1xuXG5cdFx0Ly8gY2xlYXJpbmcgbm90IG5lY2Vzc2FyeVxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY29tcGlsYXRpb24pIHtcblx0XHRcdHJlcXVlc3RzLnB1c2goXG5cdFx0XHRcdHRoaXMuZXhlY3V0ZURlbGV0ZVJlcXVlc3QoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0Y29tcGlsYXRpb25baXRlbVR5cGVdLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocmVxdWVzdHMpO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlRGVsZXRlUmVxdWVzdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC5kZWxldGUoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtRW50cmllcy5tYXAoXG5cdFx0XHRcdFx0ZW50cnkgPT4gZW50cnkuaXRlbUlkLFxuXHRcdFx0XHQpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0SW50ZXJuYWxEZWx0YSgpO1xuXG5cdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VJZEFycmF5ID0gcmVzcG9uc2UuaXRlbXM7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXNUb0JlRGVsZXRlZDogSXRlbUVudHJ5W10gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdCFpbkFycmF5KFxuXHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VJZEFycmF5LFxuXHRcdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0Y29uc29sZS53YXJuKFxuXHRcdFx0XHRcdFx0XHRcdCdEZWxldGUgZmFpbGVkIScsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpdGVtRW50cmllc1RvQmVEZWxldGVkLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbXNEZWxldGVkKGl0ZW1FbnRyaWVzVG9CZURlbGV0ZWQpO1xuXG5cdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlTW92ZVJlcXVlc3RzIChcblx0XHRjb21waWxhdGlvbjogTW92ZUNvbXBpbGF0aW9uLFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0czogQXJyYXk8UHJvbWlzZUludGVyZmFjZTx2b2lkPj4gPSBbXTtcblxuXHRcdGNvbnN0IGV4ZWN1dGVNb3ZlUmVxdWVzdCA9IChcblx0XHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdFx0cGFyZW50SWQ6IEl0ZW1JZCxcblx0XHQpID0+IHtcblx0XHRcdC8vIG9ubHkgdGhlIHBhcmVudCBpZCBjb3VsZCBoYXZlIGJlZW4gdXBkYXRlZFxuXHRcdFx0Y29uc3QgY29tcGlsYXRpb25FbnRyaWVzID0gY29tcGlsYXRpb25bcGFyZW50VHlwZV1bcGFyZW50SWRdO1xuXHRcdFx0Y29uc3QgbmV3UGFyZW50SWQgPSB0aGlzLmdldE1hcFZhbHVlKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZCxcblx0XHRcdCk7XG5cblx0XHRcdHJlcXVlc3RzLnB1c2goXG5cdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdFx0XHQubW92ZUl0ZW1zKFxuXHRcdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRcdG5ld1BhcmVudElkICE9PSB1bmRlZmluZWQgPyBuZXdQYXJlbnRJZCA6IHBhcmVudElkLFxuXHRcdFx0XHRcdFx0dGhpcy5idWlsZE1vdmVSZXF1ZXN0KGNvbXBpbGF0aW9uRW50cmllcyksXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC50aGVuKFxuXHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0SW50ZXJuYWxEZWx0YSgpO1xuXG5cdFx0XHRcdFx0XHRcdC8vIHRvZG9bY2FjaGVdIHdoeSBkb24ndCB3ZSB1c2UgdGhlIHJlc3BvbnNlID9cblx0XHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgY29tcGlsYXRpb25FbnRyaWVzKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldExpbmtGaWVsZHNCeVBhcmVudChcblx0XHRcdFx0XHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlOiBwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1JZDogbmV3UGFyZW50SWQgIT09IHVuZGVmaW5lZCA/IG5ld1BhcmVudElkIDogcGFyZW50SWQsXG5cdFx0XHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdHRoaXMuc2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChcblx0XHRcdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fTtcblxuXHRcdGZvciAoY29uc3QgcGFyZW50VHlwZSBpbiBjb21waWxhdGlvbikge1xuXHRcdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBpbiBjb21waWxhdGlvbltwYXJlbnRUeXBlXSkge1xuXHRcdFx0XHRleGVjdXRlTW92ZVJlcXVlc3QoXG5cdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHQrcGFyZW50SWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlcXVlc3RzKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgaW5zdGFudGlhdGVPcHRpb25zIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1uTWFwLCBBcGlSZXF1ZXN0Q29sdW1ucywgRW50cnlQYXJlbnROdWxsIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBJdGVtRW50cnlPcHRpb25zSW50ZXJmYWNlID0gUGFydGlhbDxJdGVtRW50cnlPcHRpb25zPjtcblxuZXhwb3J0IGNsYXNzIEl0ZW1FbnRyeU9wdGlvbnMge1xuXHRwdWJsaWMgY29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMgPSB0cnVlO1xuXHRwdWJsaWMgcGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsO1xuXHRwdWJsaWMgdGVtcGxhdGVPcHRpb25zOiBhbnkgPSB7fTsgLy8gVE9ET1xuXHRwdWJsaWMgdGVtcGxhdGVDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uTWFwID0ge307XG5cblx0Y29uc3RydWN0b3IgKHZhbHVlczogSXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZSkge1xuXHRcdGluc3RhbnRpYXRlT3B0aW9ucyhcblx0XHRcdHRoaXMsXG5cdFx0XHR2YWx1ZXMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgaW5zdGFudGlhdGVPcHRpb25zIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBPbkNoYW5nZUZ1bmN0aW9uIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlIH0gZnJvbSAnLi9JdGVtUmVzb3VyY2UnO1xuXG5leHBvcnQgdHlwZSBJdGVtUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZVR5cGUgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55PiA9IEl0ZW1SZXNvdXJjZTxhbnk+PiA9IFBhcnRpYWw8SXRlbVJlc291cmNlT3B0aW9uczxJdGVtUmVzb3VyY2VUeXBlPj47XG5cbmV4cG9ydCBjbGFzcyBJdGVtUmVzb3VyY2VPcHRpb25zPEl0ZW1SZXNvdXJjZVR5cGUgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55PiA9IEl0ZW1SZXNvdXJjZTxhbnk+PiB7XG5cdHB1YmxpYyBlZGl0OiBib29sZWFuID0gZmFsc2U7XG5cdHB1YmxpYyByZW1vdGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0cHVibGljIG9uQ2hhbmdlOiBPbkNoYW5nZUZ1bmN0aW9uPEl0ZW1SZXNvdXJjZVR5cGU+ID0gbm9vcDtcblxuXHRjb25zdHJ1Y3RvciAodmFsdWVzOiBJdGVtUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1SZXNvdXJjZVR5cGU+KSB7XG5cdFx0aW5zdGFudGlhdGVPcHRpb25zKHRoaXMsIHZhbHVlcyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5sZXQgY3VycmVudElkID0gMDtcblxuZXhwb3J0IGNsYXNzIEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4ge1xuXG5cdHB1YmxpYyBpZDogbnVtYmVyID0gKytjdXJyZW50SWQ7XG5cdHB1YmxpYyByZWxvYWRRdWV1ZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBmYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHB1YmxpYyBpdGVtSWQ6IEl0ZW1JZCxcblx0XHRwdWJsaWMgY29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHR9XG5cblx0cHVibGljIHF1ZXVlUmVsb2FkICgpOiB0aGlzIHtcblx0XHR0aGlzLnJlbG9hZFF1ZXVlZCA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBpc0xvY2FsICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5mYWN0b3J5LmtleVNlcnZpY2UuaXNMb2NhbElkKHRoaXMuaXRlbUlkKTtcblx0fVxuXG5cdHB1YmxpYyBpc0xvY2thYmxlICgpOiBib29sZWFuIHtcblx0XHRpZiAodGhpcy5pc0xvY2FsKCkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKHRoaXMuaXRlbVR5cGUpIHtcblx0XHRcdGNhc2UgJ1Byb2plY3QnOlxuXHRcdFx0Y2FzZSAnTWF0ZXJpYWFsJzpcblx0XHRcdGNhc2UgJ0NvbnRhY3QnOlxuXHRcdFx0Y2FzZSAnTWVkZXdlcmtlcic6XG5cdFx0XHRjYXNlICdWb2VydHVpZyc6XG5cdFx0XHRjYXNlICdUZW1wbGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyB0b0pTT04gKCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRpZDogdGhpcy5pZCxcblx0XHRcdGNvbHVtbnM6IHRoaXMuY29sdW1ucyxcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBjcmVhdGVQYXRoLCBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBJdGVtUmVzb3VyY2VGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlT3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBGaWVsZE1hcCwgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cblx0cHVibGljIGNvbHVtbnM6IHtbY29sdW1uSWQ6IHN0cmluZ106IFJlc3BvbnNlQ29sdW1ufTtcblx0cHVibGljIGZpZWxkczogUmVhZG9ubHk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj47XG5cdHB1YmxpYyBpbml0aWFsOiBSZWFkb25seTxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PjtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCByZWFkb25seSBmYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdHB1YmxpYyByZWFkb25seSBlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cHVibGljIHJlYWRvbmx5IG9wdGlvbnM6IEl0ZW1SZXNvdXJjZU9wdGlvbnM8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdHByb3RlY3RlZCByZWFkb25seSBfaXNOZXc6IGJvb2xlYW4sXG5cdFx0cHJvdGVjdGVkIHJlYWRvbmx5IHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHR0aGlzLmNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLnJlc3BvbnNlW2VudHJ5LmNvbHVtbnMuaXRlbVR5cGVdO1xuXHRcdHRoaXMuaW5pdGlhbCA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmluaXRpYWw7XG5cblx0XHR0aGlzLm9uQ29uc3RydWN0KCk7XG5cdH1cblxuXHQvLyBVc2VkIGZvciByZXNvdXJjZSBjbGVhcmluZyB0ZXN0c1xuXHRwdWJsaWMgb25Db25zdHJ1Y3QgKCk6IHZvaWQge1xuXG5cdH1cblxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICogVXNlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhIHRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhfSBpbnN0ZWFkXG5cdCAqL1xuXHRwdWJsaWMgY2FsbE9uQ2hhbmdlIChwcmV2aW91czogRmllbGRNYXA8SXRlbVR5cGVUeXBlPik6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbVJlc291cmNlc1t0aGlzLmVudHJ5LmlkXTtcblxuXHRcdGlmIChyZXNvdXJjZXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Zm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcblx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRyZXNvdXJjZS5vcHRpb25zLm9uQ2hhbmdlKFxuXHRcdFx0XHRcdFx0cmVzb3VyY2UsXG5cdFx0XHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0XHRcdGNvbHVtbklkID0+IHRoaXMuY29tcGFyZUl0ZW1GaWVsZChcblx0XHRcdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdHRoaXMuZmFjdG9yeS5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVXRpbGl0eSBmdW5jdGlvbiB0byBlYXNpbHkgY2hlY2sgaWYgYSBmaWVsZCBpcyBjaGFuZ2VkLlxuXHQgKiBXaWxsIHJldHVybiBgZmFsc2VgIGlmIHRoZSBmaWVsZCBpcyBjaGFuZ2VkXG5cdCAqXG5cdCAqIEBleGFtcGxlXG5cdCAqIG9uQ2hhbmdlOiAoXG5cdCAqICAgICBpdGVtUmVzb3VyY2UsXG5cdCAqICAgICBwcmV2aW91cyxcblx0ICogICAgIGNvbXBhcmVJdGVtRmllbGRcblx0ICogKSB7XG5cdCAqICAgICBpZiAoIWNvbXBhcmVJdGVtRmllbGQoJ2NvbHVtbklkJykpIHtcblx0ICogICAgICAgICBwcm9jZXNzSXRlbShpdGVtUmVzb3VyY2UpO1xuXHQgKiAgICAgfVxuXHQgKiB9XG5cdCAqL1xuXHRwdWJsaWMgY29tcGFyZUl0ZW1GaWVsZCAoXG5cdFx0Y29sdW1uSWQ6IGtleW9mIEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cHJldmlvdXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGNvbHVtbiA9IHRoaXMuY29sdW1uc1tjb2x1bW5JZF07XG5cblx0XHRpZiAoY29sdW1uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignTWlzc2luZyBjb2x1bW4gaW4gSXRlbVJlc291cmNlLmNvbXBhcmVJdGVtRmllbGQnKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5mYWN0b3J5LmFwaUZvcm1hdHRlci5jb21wYXJlRmllbGRzKFxuXHRcdFx0Y29sdW1uLnR5cGUsXG5cdFx0XHR0aGlzLmZpZWxkc1tjb2x1bW5JZF0sXG5cdFx0XHRwcmV2aW91c1tjb2x1bW5JZF0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBoYXNDaGFuZ2VzICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnRyYW5zYWN0aW9uXG5cdFx0XHQuaXRlbUhhbmRsZXJcblx0XHRcdC5kZXRlY3RFbnRyeUNoYW5nZXModGhpcy5lbnRyeS5pZCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0VHJhbnNhY3Rpb25QYXJhbWV0ZXJzIChcblx0XHRwYXJhbWV0ZXJzOiBhbnksXG5cdCk6IHZvaWQge1xuXHRcdGNyZWF0ZVBhdGgoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLnRhYlJlcXVlc3RQYXJhbWV0ZXJzLFxuXHRcdFx0W1xuXHRcdFx0XHR0aGlzLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHR0aGlzLmVudHJ5Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRwYXJhbWV0ZXJzLFxuXHRcdFx0XSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiAnaXNOZXcnIG1lYW5zIHRoYXQgdGhlIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBpcyBhIGxvY2FsIGl0ZW0gYW5kIHRoYXQgdGhpcyByZXNvdXJjZSB3YXMgY3JlYXRlZCB3aGVuIHRoZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gd2FzIGZpcnN0IGNyZWF0ZWRcblx0ICovXG5cdHB1YmxpYyBpc05ldyAoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuX2lzTmV3O1xuXHR9XG5cblx0cHVibGljIGlzTG9jYWwgKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmVudHJ5LmlzTG9jYWwoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyB0aGUgcmVmZXJlbmNlIHRvIHRoZSB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX0gZnJvbSB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0sIHNvIHRoYXQgdGhlIE9uQ2hhbmdlIGNhbGxiYWNrIHdvbid0IGJlIGNhbGxlZCBhbnltb3JlLlxuXHQgKlxuXHQgKiBXYXJuaW5nOlxuXHQgKiBUaGlzIGRvZXNuJ3QgcmV2ZXJ0IGFueSBjaGFuZ2VzIG1hZGUgdG8gdGhlIGl0ZW0sIGluIG9yZGVyIHRvIHJldmVydCB0aGUgY2hhbmdlcyB5b3Ugc2hvdWxkIHVzZSB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5jbGVhckl0ZW1FbnRyeSBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmNsZWFySXRlbUVudHJ5fVxuXHQgKi9cblx0cHVibGljIGNsZWFyUmVzb3VyY2UgKCk6IHZvaWQge1xuXHRcdHRoaXMudHJhbnNhY3Rpb24uY2xlYXJJdGVtUmVzb3VyY2UodGhpcyk7XG5cdH1cblxuXHRwdWJsaWMgdG9KU09OICgpIHtcblx0XHRjb25zdCBjb2x1bW5JZHM6IHN0cmluZ1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHRoaXMuY29sdW1ucykge1xuXHRcdFx0Y29sdW1uSWRzLnB1c2goY29sdW1uSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb2x1bW5zOiBjb2x1bW5JZHMsXG5cdFx0XHRmaWVsZHM6IHRoaXMuZmllbGRzLFxuXHRcdFx0ZW50cnk6IHRoaXMuZW50cnksXG5cdFx0fTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGNvbHVtblBhdGgsIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBwYXRoIGNvdWxkbid0IGJlIHRyYXZlcnNlZFxuXHQgKlxuXHQgKiBAcGFyYW0gY29sdW1uUGF0aCBDYW4gZWl0aGVyIGJlIGFuIGFycmF5IG9mIGNvbHVtbklkcyAoWydjb2x1bW4nLCAnY29sdW1uMiddKSBvciBhIGNvbmZpZyBjb2x1bW4gc3RyaW5nICgnY29sdW1uPmNvbHVtbjInKVxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZTxUIGV4dGVuZHMgYW55ID0gYW55PiAoY29sdW1uUGF0aDogc3RyaW5nW10gfCBzdHJpbmcpOiBUIHwgdW5kZWZpbmVkIHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5nZXREZXJpdmVkVmFsdWUoXG5cdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0Y29sdW1uUGF0aCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBUcmF2ZXJzZXMgdGhlIGNvbHVtbiBwYXRoIGFuZCByZXR1cm5zIHRoZSBmaWVsZHMgb2YgdGhlIGRlcml2ZWQgaXRlbSwgcmV0dXJucyB1bmRlZmluZWQgaWYgdGhlIGl0ZW0gaXNuJ3QgZm91bmRcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogQXNzdW1lcyB0aGUgZGVyaXZlZCBpdGVtJ3MgdmFsdWVzIGFyZSBhbHJlYWR5IGNhY2hlZFxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZXMgKFxuXHRcdGNvbHVtblBhdGg6IHN0cmluZ1tdLFxuXHQpOiBSZWFkb25seTxGaWVsZE1hcD4gfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmdldERlcml2ZWRWYWx1ZXMoXG5cdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0Y29sdW1uUGF0aCxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEl0ZW1SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtUmVzb3VyY2UsIEl0ZW1SZXNvdXJjZU9wdGlvbnMgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRmllbGRNYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PlxuXHRleHRlbmRzIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+IHtcblxuXHRmaWVsZHM6IFJlYWRvbmx5PEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0ZmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRlbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbVJlc291cmNlT3B0aW9uczxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4sXG5cdFx0aXNOZXc6IGJvb2xlYW4sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0ZmFjdG9yeSxcblx0XHRcdGVudHJ5LFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdGlzTmV3LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblxuXHRcdHRoaXMuZmllbGRzID0gdHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmNoYW5nZXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgSXRlbVJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtRW50cnksIEl0ZW1SZXNvdXJjZSwgSXRlbVJlc291cmNlT3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBGaWVsZE1hcCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+XG5cdGV4dGVuZHMgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXG5cdHByb3RlY3RlZCBsb2NhbENvcGllczogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRwdWJsaWMgZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRmYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdGVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtUmVzb3VyY2VPcHRpb25zLFxuXHRcdGlzTmV3OiBib29sZWFuLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGZhY3RvcnksXG5cdFx0XHRlbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRpc05ldyxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cblx0XHR0aGlzLmZpZWxkcyA9IHRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5jaGFuZ2VzO1xuXHR9XG5cblx0cHVibGljIGlzTmV3ICgpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5faXNOZXc7XG5cdH1cblxuXHRwdWJsaWMgY29weUZpZWxkcyAoZGVzdGluYXRpb246IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4gPSB7fSk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZW50cnk7XG5cblx0XHR0aGlzLmZhY3RvcnkuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHR0aGlzLmZpZWxkcyxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0cmV0dXJuIGRlc3RpbmF0aW9uO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVcGRhdGVzIHRoZSBmaWVsZHMgb2YgdGhlIGl0ZW0gYW5kIGNhbGxzIG9uQ2hhbmdlLCB3aGVuIHVwZGF0aW5nIG1hbnkgZmllbGRzIG9mIG1hbnkgaXRlbXMgaXQncyBiZXR0ZXIgdG8gY3JlYXRlIGEge0BsaW5rIENoYW5nZXNEZWx0YSBDaGFuZ2VzRGVsdGF9IHlvdXJzZWxmIHNvIGFsbCBjaGFuZ2VzIGNhbiBiZSBhcHBsaWVkIGF0IG9uY2Vcblx0ICovXG5cdHB1YmxpYyBzZXRGaWVsZHMgKFxuXHRcdHZhbHVlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTx0aGlzPiB7XG5cdFx0Y29uc3QgY29sdW1ucyA9IHRoaXMuY29sdW1ucztcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdmFsdWVzKSB7XG5cdFx0XHRjb25zdCBjb2x1bW4gPSBjb2x1bW5zW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKGNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0XHQnc2V0RmllbGRzOiBubyBjb2x1bW4gZm91bmQgZm9yJyxcblx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLnRyYW5zYWN0aW9uLmNyZWF0ZUNoYW5nZXNEZWx0YSgpO1xuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0dGhpcy5lbnRyeSxcblx0XHRcdHZhbHVlcyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdC5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4gdGhpcyxcblx0XHRcdFx0dGhpcy5mYWN0b3J5LmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0Ly8gdG9kb1tjYWNoZV0gU2hvdWxkIHlvdSBzdGlsbCBiZSBhYmxlIHRvIGRvIHRoaXMgPyBFdmVyeXRoaW5nIHNob3VsZCBoYXBwZW4gaW4gYSB0cmFuc2FjdGlvblxuXHQvLyBwdWJsaWMgc2F2ZSAocGFyYW1ldGVycz86IGFueSk6IFByb21pc2VJbnRlcmZhY2U8dGhpcz4ge1xuXHQvLyBjb25zdCBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5O1xuXHQvLyBjb25zdCBpdGVtRW50cnkgPSB0aGlzLmVudHJ5O1xuXHQvLyBjb25zdCBwYXJhbWV0ZXJNYXAgPSB7fTtcblx0Ly9cblx0Ly8gaWYgKHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCkge1xuXHQvLyBcdGNyZWF0ZVBhdGgoXG5cdC8vIFx0XHRwYXJhbWV0ZXJNYXAsXG5cdC8vIFx0XHRbXG5cdC8vIFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0Ly8gXHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0Ly8gXHRcdF0sXG5cdC8vIFx0XHRbXG5cdC8vIFx0XHRcdHt9LFxuXHQvLyBcdFx0XHRwYXJhbWV0ZXJzLFxuXHQvLyBcdFx0XSxcblx0Ly8gXHQpO1xuXHQvLyB9XG5cdC8vXG5cdC8vIHJldHVybiAoXG5cdC8vIFx0aXRlbUVudHJ5LmlzTG9ja2FibGUoKSA/XG5cdC8vIFx0XHRmYWN0b3J5LmxvY2tTZXJ2aWNlLmZldGNoTG9jayhpdGVtRW50cnkpIDpcblx0Ly8gXHRcdGZhY3RvcnkucHJvbWlzZVNlcnZpY2Uud2hlbigpXG5cdC8vICkudGhlbihcblx0Ly8gXHQoKSA9PiB7XG5cdC8vIFx0XHQvLyBhZGRUb0NvbGxlY3Rpb25zIGlzIGNhbGxlZCBpbiBjaGFuZ2VzUHJvY2Vzc29yXG5cdC8vIFx0XHRyZXR1cm4gdGhpcy5jaGFuZ2VzUHJvY2Vzc29yLmV4ZWN1dGUoXG5cdC8vIFx0XHRcdFtpdGVtRW50cnldLFxuXHQvLyBcdFx0XHRbXSxcblx0Ly8gXHRcdFx0cGFyYW1ldGVyTWFwLFxuXHQvLyBcdFx0KTtcblx0Ly8gXHR9LFxuXHQvLyBcdGZhY3RvcnkuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0Ly8gKVxuXHQvLyBcdC50aGVuKFxuXHQvLyBcdFx0KCkgPT4ge1xuXHQvLyBcdFx0XHRyZXR1cm4gdGhpcztcblx0Ly8gXHRcdH0sXG5cdC8vIFx0XHRmYWN0b3J5LmVycm9ySGFuZGxlci5yZWplY3QsXG5cdC8vIFx0KTtcblx0Ly8gfVxufVxuIiwiaW1wb3J0IHsgaW5zdGFudGlhdGVPcHRpb25zIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlRdWVyeSwgQXBpUmVxdWVzdENvbHVtbnMsIEFwaVJlcXVlc3RMaW1pdCwgRW50cnlQYXJlbnROdWxsIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uRW50cnlPcHRpb25zSW50ZXJmYWNlID0gUGFydGlhbDxDb2xsZWN0aW9uRW50cnlPcHRpb25zPjtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMge1xuXHRjb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyA9IFtdO1xuXHRxdWVyeTogQXBpUXVlcnkgfCBudWxsID0gbnVsbDtcblx0cXVlcnlQYXJhbXM6IGFueSA9IHt9OyAvLyBUT0RPXG5cdHF1ZXJ5Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMgPSBbXTtcblx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsO1xuXHRkZWZlclJlcXVlc3Q6IGJvb2xlYW4gPSBmYWxzZTtcblx0bGltaXQ6IEFwaVJlcXVlc3RMaW1pdCB8IG51bGwgPSBudWxsO1xuXHRlbnRyeUtleTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cblx0Y29uc3RydWN0b3IgKHZhbHVlczogQ29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZSkge1xuXHRcdGluc3RhbnRpYXRlT3B0aW9ucyhcblx0XHRcdHRoaXMsXG5cdFx0XHR2YWx1ZXMsXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgaW5zdGFudGlhdGVPcHRpb25zIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBub29wIH0gZnJvbSAnLi4vY29yZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIENvbGxlY3Rpb25SZXNvdXJjZSwgSXRlbUVudHJ5LCBJdGVtUmVzb3VyY2UgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQ29udmVyc2lvbk1hcCwgSXRlbVR5cGUsIE9uQ2hhbmdlRnVuY3Rpb24gfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvdXJjZUNhbGxiYWNrPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IChcblx0aXRlbVJlc291cmNlczogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+LFxuXHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb3VyY2VPbkFkZENhbGxiYWNrPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IChcblx0aXRlbVJlc291cmNlczogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+LFxuXHRjb2xsZWN0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRpc0luaXRpYWxDYWxsOiBib29sZWFuLFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUmVzb3VyY2VJbml0aWFsQ2FsbGJhY2s8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0gKFxuXHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBPbkl0ZW1zQ3JlYXRlZENhbGxiYWNrID0gKGNvbnZlcnNpb25NYXA6IENvbnZlcnNpb25NYXApID0+IHZvaWQ7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0gUGFydGlhbDxDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZT4+O1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4ge1xuXHRlZGl0SXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcblx0cmVtb3RlSXRlbXM6IGJvb2xlYW4gPSBmYWxzZTtcblx0ZWRpdENvbGxlY3Rpb246IGJvb2xlYW4gPSBmYWxzZTtcblx0ZW5hYmxlU2F2ZTogYm9vbGVhbiA9IHRydWU7XG5cblx0LyoqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFlvdSBzaG91bGQgdXNlIGl0ZW1SZXNvdXJjZS5vbkNoYW5nZSBhbmQgY29tcGFyZSBwcmV2aW91cy5pZCB3aXRoIGZpZWxkcy5pZFxuXHQgKi9cblx0b25JdGVtc0NyZWF0ZWQ6IE9uSXRlbXNDcmVhdGVkQ2FsbGJhY2sgPSBub29wO1xuXHRvbkNoYW5nZTogT25DaGFuZ2VGdW5jdGlvbiA9IG5vb3A7XG5cdG9uQWRkOiBDb2xsZWN0aW9uUmVzb3VyY2VPbkFkZENhbGxiYWNrPEl0ZW1UeXBlVHlwZT4gPSBub29wO1xuXHRvblJlbW92ZTogQ29sbGVjdGlvblJlc291cmNlQ2FsbGJhY2s8SXRlbVR5cGVUeXBlPiA9IG5vb3A7XG5cdG9uQWRkSW5pdGlhbDogQ29sbGVjdGlvblJlc291cmNlSW5pdGlhbENhbGxiYWNrPEl0ZW1UeXBlVHlwZT4gPSBub29wO1xuXHRvblJlbW92ZUluaXRpYWw6IENvbGxlY3Rpb25SZXNvdXJjZUluaXRpYWxDYWxsYmFjazxJdGVtVHlwZVR5cGU+ID0gbm9vcDtcblx0cmVzb3VyY2VLZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXHRjdXN0b206IGFueSA9IG51bGw7XG5cblx0Y29uc3RydWN0b3IgKHZhbHVlczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+KSB7XG5cdFx0aW5zdGFudGlhdGVPcHRpb25zKFxuXHRcdFx0dGhpcyxcblx0XHRcdHZhbHVlcyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLCBDb2x1bW5FeHBhbnNpb24sIENvbHVtbkluZm8sIENvbHVtblNldCwgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uU2V0RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVF1ZXJ5LFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0Q29sbGVjdGlvblF1ZXJ5LFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEl0ZW1JZCxcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFF1ZXJ5Q2FsbGJhY2ssXG59IGZyb20gJy4uL3R5cGVzJztcblxubGV0IGN1cnJlbnRJZCA9IDA7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblxuXHRwdWJsaWMgaWQ6IG51bWJlciA9IGN1cnJlbnRJZCsrO1xuXHRwdWJsaWMgcGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsO1xuXHRwdWJsaWMgcXVlcnk6IENvbGxlY3Rpb25RdWVyeTtcblx0cHVibGljIGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+O1xuXHRwdWJsaWMgcmVsb2FkUXVldWVkOiBib29sZWFuID0gZmFsc2U7XG5cdHB1YmxpYyBwcm9taXNlOiBQcm9taXNlSW50ZXJmYWNlPHRoaXM+O1xuXG5cdC8vIHByaXZhdGUgdGVtcGxhdGVDb2x1bW5zOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB8IG51bGwgPSBudWxsO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRwdWJsaWMgb3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KSB7XG5cdFx0dGhpcy5wYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcblx0XHR0aGlzLnF1ZXJ5ID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KG9wdGlvbnMpO1xuXHRcdHRoaXMuY29sdW1ucyA9IHRoaXMuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3RTdHViKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBpc0xvY2FsICgpOiBib29sZWFuIHtcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChwYXJlbnQuaXRlbUlkKTtcblx0fVxuXG5cdHB1YmxpYyBtYXRjaFBhcmVudCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyA9PSB0byBjb21wYXJlIGl0ZW1JZHNcblx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdHJldHVybiBwYXJlbnQuaXRlbVR5cGUgPT09IGl0ZW1UeXBlICYmIHBhcmVudC5pdGVtSWQgPT0gaXRlbUlkO1xuXHR9XG5cblx0cHVibGljIGV4dGVuZFF1ZXJ5IChjYWxsYmFjaz86IFF1ZXJ5Q2FsbGJhY2spOiBBcGlRdWVyeSB7XG5cdFx0Y29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucztcblxuXHRcdGlmIChjYWxsYmFjayA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5xdWVyeTtcblx0XHR9XG5cblx0XHRvcHRpb25zLnF1ZXJ5UGFyYW1zID0gY2FsbGJhY2sob3B0aW9ucy5xdWVyeVBhcmFtcyk7XG5cblx0XHRyZXR1cm4gdGhpcy5xdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblx0fVxuXG5cdHB1YmxpYyBxdWV1ZVJlbG9hZCAoKTogdm9pZCB7XG5cdFx0dGhpcy5yZWxvYWRRdWV1ZWQgPSB0cnVlO1xuXHR9XG5cblx0cHVibGljIGV4cGFuZENvbHVtbnMgKGNvbHVtbkV4cGFuc2lvbjogQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZT4pOiB2b2lkIHtcblx0XHRjb25zdCBleHBhbnNpb25SZXN1bHQgPSBjb2x1bW5FeHBhbnNpb24ucnVuKHRoaXMuY29sdW1ucyk7XG5cblx0XHRpZiAoZXhwYW5zaW9uUmVzdWx0ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5jb2x1bW5zID0gZXhwYW5zaW9uUmVzdWx0Lm1lcmdlZDtcblx0XHQvLyB0aGlzLnRlbXBsYXRlQ29sdW1ucyA9IG51bGw7XG5cdFx0dGhpcy5vcHRpb25zLmNvbHVtbnMgPSB0aGlzLmNvbHVtbnMucmVxdWVzdDtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRSZXF1ZXN0Q29sdW1ucyAocmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogdm9pZCB7XG5cdFx0dGhpcy5jb2x1bW5zLmV4cGFuZFJlcXVlc3RDb2x1bW5zKHJlcXVlc3RDb2x1bW5zKTtcblx0XHR0aGlzLm9wdGlvbnMuY29sdW1ucyA9IHRoaXMuY29sdW1ucy5yZXF1ZXN0O1xuXHR9XG5cblx0cHVibGljIGdldFVwZGF0ZWRJdGVtQ29sdW1ucyAoXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KToge1tjb2x1bW5JZDogc3RyaW5nXTogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+fSB7XG5cdFx0Y29uc3QgaXRlbUNvbHVtbnMgPSB0aGlzLmNvbHVtbnMuaXRlbTtcblx0XHRjb25zdCByZXN1bHQ6IHtbY29sdW1uSWQ6IHN0cmluZ106IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPn0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGl0ZW1Db2x1bW5zKSB7XG5cdFx0XHRpZiAoY29udmVyc2lvbk1hcFtjb2x1bW4uYXBpQ29sdW1uLml0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJlc3VsdFtjb2x1bW4uaWRdID0gY29sdW1uO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvLyB0b2RvW2NhY2hlXVxuXHQvLyBnZXRBZGRlZEl0ZW1zIChyZXR1cm5JdGVtSWRzOiB0cnVlKTogSXRlbUlkW107XG5cdC8vIGdldEFkZGVkSXRlbXMgKHJldHVybkl0ZW1JZHM/OiBib29sZWFuKTogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+O1xuXHQvLyBnZXRBZGRlZEl0ZW1zIChyZXR1cm5JdGVtSWRzOiBib29sZWFuID0gZmFsc2UpIHtcblx0Ly8gXHRjb25zdCBpbml0aWFsID0gdGhpcy5pbml0aWFsO1xuXHQvLyBcdGNvbnN0IG1vZGlmaWVkID0gdGhpcy5pdGVtcztcblx0Ly8gXHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHwgSXRlbUlkPiA9IFtdO1xuXHQvL1xuXHQvLyBcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIG1vZGlmaWVkKSB7XG5cdC8vIFx0XHRpZiAoaW5pdGlhbC5pbmRleE9mKGl0ZW1FbnRyeSkgPT09IC0xKSB7XG5cdC8vIFx0XHRcdHJlc3VsdC5wdXNoKHJldHVybkl0ZW1JZHMgPyBpdGVtRW50cnkuaXRlbUlkIDogaXRlbUVudHJ5KTtcblx0Ly8gXHRcdH1cblx0Ly8gXHR9XG5cdC8vXG5cdC8vIFx0cmV0dXJuIHJlc3VsdDtcblx0Ly8gfVxuXHQvL1xuXHQvLyBnZXRSZW1vdmVkSXRlbXMgKHJldHVybkl0ZW1JZHM6IHRydWUpOiBJdGVtSWRbXTtcblx0Ly8gZ2V0UmVtb3ZlZEl0ZW1zIChyZXR1cm5JdGVtSWRzPzogYm9vbGVhbik6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pjtcblx0Ly8gZ2V0UmVtb3ZlZEl0ZW1zIChyZXR1cm5JdGVtSWRzOiBib29sZWFuID0gZmFsc2UpIHtcblx0Ly8gXHRjb25zdCBpbml0aWFsID0gdGhpcy5pbml0aWFsO1xuXHQvLyBcdGNvbnN0IG1vZGlmaWVkID0gdGhpcy5pdGVtcztcblx0Ly8gXHRjb25zdCByZXN1bHQ6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+IHwgSXRlbUlkPiA9IFtdO1xuXHQvL1xuXHQvLyBcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGluaXRpYWwpIHtcblx0Ly8gXHRcdGlmIChtb2RpZmllZC5pbmRleE9mKGl0ZW1FbnRyeSkgPT09IC0xKSB7XG5cdC8vIFx0XHRcdHJlc3VsdC5wdXNoKHJldHVybkl0ZW1JZHMgPyBpdGVtRW50cnkuaXRlbUlkIDogaXRlbUVudHJ5KTtcblx0Ly8gXHRcdH1cblx0Ly8gXHR9XG5cdC8vXG5cdC8vIFx0cmV0dXJuIHJlc3VsdDtcblx0Ly8gfVxuXHQvL1xuXHQvLyBnZXRVcGRhdGVkSXRlbXMgKCk6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdC8vIFx0Y29uc3QgbW9kaWZpZWQgPSB0aGlzLml0ZW1zO1xuXHQvLyBcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdC8vXG5cdC8vIFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgbW9kaWZpZWQpIHtcblx0Ly8gXHRcdGlmICghaXRlbUVudHJ5LmlzTG9jYWwoKSAmJiBpdGVtRW50cnkuaGFzQ2hhbmdlcygpKSB7XG5cdC8vIFx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1FbnRyeSk7XG5cdC8vIFx0XHR9XG5cdC8vIFx0fVxuXHQvL1xuXHQvLyBcdHJldHVybiByZXN1bHQ7XG5cdC8vIH1cblxuXHQvLyB0b2RvW2NhY2hlXSBUaGlzIGlzIHVzZWQgaW4gdGhlIGZyb250ZW5kIGluIHRoZSBwbGFubmVyLCBidXQgSSB0aGluayB3ZSBzaG91bGQgZml4IHRoYXQgaW4gdGhlIGZyb250ZW5kIHNvbWUgb3RoZXIgd2F5XG5cdC8vIHB1YmxpYyBvbkFkZEluaXRpYWwgKGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pOiB2b2lkIHtcblx0Ly8gXHRmb3IgKGNvbnN0IHJlc291cmNlIG9mIHRoaXMucmVzb3VyY2VzKSB7XG5cdC8vIFx0XHR0cnkge1xuXHQvLyBcdFx0XHRyZXNvdXJjZS5vcHRpb25zLm9uQWRkSW5pdGlhbChcblx0Ly8gXHRcdFx0XHRpdGVtRW50cmllcyxcblx0Ly8gXHRcdFx0XHR0aGlzLFxuXHQvLyBcdFx0XHQpO1xuXHQvLyBcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0Ly8gXHRcdFx0dGhpcy5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0Ly8gXHRcdH1cblx0Ly8gXHR9XG5cdC8vIH1cblx0Ly9cblx0Ly8gcHVibGljIG9uUmVtb3ZlSW5pdGlhbCAoaXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pik6IHZvaWQge1xuXHQvLyBcdGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgdGhpcy5yZXNvdXJjZXMpIHtcblx0Ly8gXHRcdHRyeSB7XG5cdC8vIFx0XHRcdHJlc291cmNlLm9wdGlvbnMub25SZW1vdmVJbml0aWFsKFxuXHQvLyBcdFx0XHRcdGl0ZW1FbnRyaWVzLFxuXHQvLyBcdFx0XHRcdHRoaXMsXG5cdC8vIFx0XHRcdCk7XG5cdC8vIFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHQvLyBcdFx0XHR0aGlzLmV4Y2VwdGlvbkhhbmRsZXIoZXJyb3IpO1xuXHQvLyBcdFx0fVxuXHQvLyBcdH1cblx0Ly8gfVxufVxuIiwiaW1wb3J0IHsgZmlsdGVyQXJyYXkgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsIEl0ZW1FbnRyeSwgSXRlbVJlc291cmNlLCBMb2NhbFZpZXdSZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRGaWVsZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtUmVzb3VyY2VJdGVtSWRNYXAsXG5cdEl0ZW1UeXBlLFxuXHRPbkNoYW5nZUZ1bmN0aW9uLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRRdWVyeUNhbGxiYWNrLFxuXHRSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnksIFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiA9IExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblxuXHRwdWJsaWMgaXRlbXM6IFRbXTtcblx0cHVibGljIGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA7XG5cdHByb3RlY3RlZCBpdGVtSWRNYXA6IEl0ZW1SZXNvdXJjZUl0ZW1JZE1hcDxUPiA9IHt9O1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgb25DaGFuZ2U6IE9uQ2hhbmdlRnVuY3Rpb247XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgZmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRwdWJsaWMgZW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHB1YmxpYyBvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cHVibGljIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpIHtcblx0XHR0aGlzLml0ZW1zID0gW107XG5cdFx0dGhpcy5pdGVtSWRNYXAgPSB7fTtcblx0XHR0aGlzLmNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLnJlc3BvbnNlO1xuXG5cdFx0Ly8gdGhpcyBhbGxvd3MgdXMgdG8gdXBkYXRlIHRoZSBvbkNoYW5nZSBmdW5jdGlvbiBpbiB0aGUgb3B0aW9uc1xuXHRcdHRoaXMub25DaGFuZ2UgPSAoXG5cdFx0XHRpdGVtUmVzb3VyY2U6IEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdFx0cHJldmlvdXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0KSA9PiB7XG5cdFx0XHRpZiAoXG5cdFx0XHRcdCFpdGVtUmVzb3VyY2UuY29tcGFyZUl0ZW1GaWVsZChcblx0XHRcdFx0XHQnaWQnLFxuXHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHQpXG5cdFx0XHQpIHtcblx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gY2hlY2sgaWYgcHJldmlvdXMuaWQgbWF0Y2hlcyB3aXRoIElEcyBpbiB0aGUgbWFwXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1JZE1hcFtwcmV2aW91cy5pZF07XG5cdFx0XHRcdHRoaXMuaXRlbUlkTWFwW2l0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWRdID0gaXRlbVJlc291cmNlIGFzIFQ7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMub3B0aW9ucy5vbkNoYW5nZShcblx0XHRcdFx0aXRlbVJlc291cmNlLFxuXHRcdFx0XHRwcmV2aW91cyxcblx0XHRcdFx0Y29sdW1uSWQgPT4gaXRlbVJlc291cmNlLmNvbXBhcmVJdGVtRmllbGQoXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH07XG5cblx0XHR0aGlzLmFkZEl0ZW1SZXNvdXJjZXMoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmNvbGxlY3Rpb25DaGFuZ2VzW3RoaXMuZW50cnkuaWRdLFxuXHRcdFx0dHJ1ZSxcblx0XHQpO1xuXG5cdFx0dGhpcy5vbkNvbnN0cnVjdCgpO1xuXHR9XG5cblx0Ly8gVXNlZCBmb3IgcmVzb3VyY2UgY2xlYXJpbmcgdGVzdHNcblx0cHVibGljIG9uQ29uc3RydWN0ICgpOiB2b2lkIHtcblxuXHR9XG5cblx0cHVibGljIGdldElkQXJyYXkgKCk6IEl0ZW1JZFtdIHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtcy5tYXAoXG5cdFx0XHRpdGVtUmVzb3VyY2UgPT4gaXRlbVJlc291cmNlLmVudHJ5Lml0ZW1JZCxcblx0XHQpO1xuXHR9XG5cblx0Ly8gdG9kb1t0eXBlXSBJdGVtcyBjYW4gYmUgdW5kZWZpbmVkLCBidXQgdGhpcyBnaXZlcyBhIGxvdCBvZiBlcnJvcnMgZnJvbnRlbmRcblx0cHVibGljIGdldEl0ZW1CeUlkIChpdGVtSWQ6IG51bWJlcik6IFQge1xuXHRcdHJldHVybiB0aGlzLml0ZW1JZE1hcFtpdGVtSWRdO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1SZXNvdXJjZXMgKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0X2lzSW5pdGlhbENhbGw6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogVFtdIHsgLy8gc2hvdWxkIGJlIGZhc3Rcblx0XHRpZiAoaXRlbUVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgbG9jYWxJdGVtRW50cmllcyA9IHRoaXMuaXRlbXMubWFwKFxuXHRcdFx0aXRlbVJlc291cmNlID0+IGl0ZW1SZXNvdXJjZS5lbnRyeSxcblx0XHQpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gbG9vayBpbiBpdGVtSWRNYXAgPyB3ZSBvbmx5IHdhbnQgdG8gYWRkIHJlc291cmNlcyBpZiB0aGVyZSBpcyBub25lIHlldFxuXHRcdGl0ZW1FbnRyaWVzID0gaXRlbUVudHJpZXMuZmlsdGVyKFxuXHRcdFx0aXRlbUVudHJ5ID0+IGxvY2FsSXRlbUVudHJpZXMuaW5kZXhPZihpdGVtRW50cnkpID09PSAtMSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgaXRlbVJlc291cmNlcyA9IHRoaXMudHJhbnNhY3Rpb24uY3JlYXRlSXRlbVJlc291cmNlcyhcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0e1xuXHRcdFx0XHRyZW1vdGU6IHRoaXMub3B0aW9ucy5yZW1vdGVJdGVtcyxcblx0XHRcdFx0ZWRpdDogdGhpcy5vcHRpb25zLmVkaXRJdGVtcyxcblx0XHRcdFx0b25DaGFuZ2U6IHRoaXMub25DaGFuZ2UsXG5cdFx0XHR9LFxuXHRcdCkgYXMgVFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0Y29uc3QgaXRlbUlkID0gaXRlbVJlc291cmNlLmVudHJ5Lml0ZW1JZDtcblxuXHRcdFx0aWYgKHRoaXMuaXRlbUlkTWFwW2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0FkZGVkIGEgcmVzb3VyY2Ugb2YgYW4gZW50cnkgdGhhdCB3YXMgYWxyZWFkeSBpbiB0aGUgY29sbGVjdGlvbiAhJyk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuaXRlbXMucHVzaChpdGVtUmVzb3VyY2UpO1xuXHRcdFx0dGhpcy5pdGVtSWRNYXBbaXRlbUlkXSA9IGl0ZW1SZXNvdXJjZTtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBJdCB3b3VsZCBiZSBuaWNlIHRvIGNhbGwgJ29uQWRkJyBhbHNvIHdpdGggdGhlIGluaXRpYWwgc2V0IG9mIHJlc291cmNlcywgYnV0IHRoYXQgaXMgYSBsb3Qgb2Ygd29yayB0byBpbXBsZW1lbnQgZnJvbnRlbmRcblx0XHQvLyB0aGlzLmNhbGxPbkFkZChcblx0XHQvLyBcdGl0ZW1SZXNvdXJjZXMsXG5cdFx0Ly8gXHRpc0luaXRpYWxDYWxsLFxuXHRcdC8vICk7XG5cblx0XHRyZXR1cm4gaXRlbVJlc291cmNlcztcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGUge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2VzfSB0aGF0IHdoZXJlIHJlbW92ZWQgZnJvbSB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBjb2xsZWN0aW9ufS5cblx0ICogRmlsdGVycyBvbiB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX0ue0BsaW5rIEl0ZW1FbnRyeSBlbnRyeX0gPT09IHtAbGluayBJdGVtRW50cnkgZW50cnl9XG5cdCAqL1xuXHRwdWJsaWMgcmVtb3ZlSXRlbVJlc291cmNlcyAoaXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pik6IFRbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBUW10gPSBbXTtcblxuXHRcdGZpbHRlckFycmF5KFxuXHRcdFx0dGhpcy5pdGVtcyxcblx0XHRcdGl0ZW1SZXNvdXJjZSA9PiB7XG5cdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRcdFx0aWYgKGl0ZW1SZXNvdXJjZS5lbnRyeSA9PT0gaXRlbUVudHJ5KSB7XG5cdFx0XHRcdFx0XHRpdGVtUmVzb3VyY2UuY2xlYXJSZXNvdXJjZSgpO1xuXHRcdFx0XHRcdFx0cmVzdWx0LnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1JZE1hcFtpdGVtRW50cnkuaXRlbUlkXTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBjYWxsT25BZGQgKFxuXHRcdGl0ZW1SZXNvdXJjZXM6IFRbXSxcblx0XHRpc0luaXRpYWxDYWxsOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdHRyeSB7XG5cdFx0XHR0aGlzLm9wdGlvbnMub25BZGQoXG5cdFx0XHRcdGl0ZW1SZXNvdXJjZXMsXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdGlzSW5pdGlhbENhbGwsXG5cdFx0XHQpO1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHR0aGlzLmZhY3RvcnkuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGNhbGxPblJlbW92ZSAoaXRlbVJlc291cmNlczogVFtdKTogdm9pZCB7XG5cdFx0dHJ5IHtcblx0XHRcdHRoaXMub3B0aW9ucy5vblJlbW92ZShcblx0XHRcdFx0aXRlbVJlc291cmNlcyxcblx0XHRcdFx0dGhpcyxcblx0XHRcdCk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHRoaXMuZmFjdG9yeS5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgZm9yRWFjaCAoY2FsbGJhY2s6IChpdGVtUmVzb3VyY2U6IFQpID0+IHZvaWQpOiB2b2lkIHtcblx0XHRjb25zdCBpdGVtUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIGl0ZW1SZXNvdXJjZXMpIHtcblx0XHRcdGNhbGxiYWNrKGl0ZW1SZXNvdXJjZSk7XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGZpbHRlciAoY2FsbGJhY2s6IChpdGVtUmVzb3VyY2U6IFQpID0+IGJvb2xlYW4pOiBUW10ge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXHRcdGNvbnN0IHJlc3VsdDogVFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtUmVzb3VyY2VzKSB7XG5cdFx0XHRpZiAoY2FsbGJhY2soaXRlbVJlc291cmNlKSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtUmVzb3VyY2UpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZmlyc3QgKGNhbGxiYWNrOiAoaXRlbVJlc291cmNlOiBUKSA9PiBib29sZWFuKTogVCB8IG51bGwge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0aWYgKGNhbGxiYWNrKGl0ZW1SZXNvdXJjZSkpIHtcblx0XHRcdFx0cmV0dXJuIGl0ZW1SZXNvdXJjZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBzb21lIChjYWxsYmFjazogKGl0ZW1SZXNvdXJjZTogVCkgPT4gYm9vbGVhbik6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLmZpcnN0KGNhbGxiYWNrKSAhPT0gbnVsbDtcblx0fVxuXG5cdHB1YmxpYyBncm91cEJ5IChhcmd1bWVudDogc3RyaW5nIHwgKChpdGVtUmVzb3VyY2U6IFQpID0+IHN0cmluZyB8IG51bGwpKToge1trZXk6IHN0cmluZ106IFRbXX0ge1xuXHRcdGNvbnN0IGl0ZW1zUmVzb3VyY2VzID0gdGhpcy5pdGVtcztcblx0XHRjb25zdCByZXN1bHQ6IHtba2V5OiBzdHJpbmddOiBUW119ID0ge307XG5cblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnc3RyaW5nJykge1xuXHRcdFx0aWYgKHRoaXMuZW50cnkuY29sdW1ucy5yZXNwb25zZVt0aGlzLmVudHJ5Lml0ZW1UeXBlXVthcmd1bWVudF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFRyeWluZyB0byBncm91cCBvbiBhIGNvbHVtbiBub3QgcmVxdWVzdGVkIGJ5IHRoaXMgY29sbGVjdGlvbiEgKGNvbHVtbiAnJHthcmd1bWVudH0nKWApO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtc1Jlc291cmNlcykge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGl0ZW1SZXNvdXJjZS5maWVsZHNbYXJndW1lbnRdO1xuXG5cdFx0XHRcdGlmIChyZXN1bHRbdmFsdWVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbdmFsdWVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXN1bHRbdmFsdWVdLnB1c2goaXRlbVJlc291cmNlKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGFyZ3VtZW50ID09PSAnZnVuY3Rpb24nKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiBpdGVtc1Jlc291cmNlcykge1xuXHRcdFx0XHRjb25zdCB2YWx1ZSA9IGFyZ3VtZW50KGl0ZW1SZXNvdXJjZSk7XG5cblx0XHRcdFx0aWYgKHZhbHVlID09PSBudWxsKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0W3ZhbHVlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmVzdWx0W3ZhbHVlXSA9IFtdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0W3ZhbHVlXS5wdXNoKGl0ZW1SZXNvdXJjZSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBtYXA8VT4gKGFyZ3VtZW50OiBzdHJpbmcgfCAoKGl0ZW1SZXNvdXJjZTogVCkgPT4gVSkpOiBVW10ge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXHRcdGNvbnN0IGxlbmd0aCA9IGl0ZW1SZXNvdXJjZXMubGVuZ3RoO1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBBcnJheShsZW5ndGgpO1xuXG5cdFx0aWYgKHR5cGVvZiBhcmd1bWVudCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gaXRlbVJlc291cmNlc1tpXS5maWVsZHNbYXJndW1lbnRdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgYXJndW1lbnQgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0cmVzdWx0W2ldID0gYXJndW1lbnQoaXRlbVJlc291cmNlc1tpXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyByZWR1Y2U8VT4gKFxuXHRcdGNhbGxiYWNrOiAoXG5cdFx0XHRpdGVtUmVzb3VyY2U6IFQsXG5cdFx0XHR2YWx1ZTogVSxcblx0XHQpID0+IFUsXG5cdFx0dmFsdWU6IFUsXG5cdCk6IFUge1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZXMgPSB0aGlzLml0ZW1zO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcykge1xuXHRcdFx0dmFsdWUgPSBjYWxsYmFjayhcblx0XHRcdFx0aXRlbVJlc291cmNlLFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHZhbHVlO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIG5ldyBpdGVtcyBhbmQgYWRkcyB0aGVtIHRvIHRoZSBjb2xsZWN0aW9uXG5cdCAqXG5cdCAqIEByZW1hcmtzXG5cdCAqIC0gVXNlZCB0byByZXR1cm4ge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2VzfSwgYnV0IHlvdSBzaG91bGQgdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2Uub25BZGQgb25BZGQpIGluc3RlYWRcblx0ICovXG5cdHB1YmxpYyBleHRlbmQgKFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnRyYW5zYWN0aW9uXG5cdFx0XHQuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5leHRlbmRDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdHRoaXMuZW50cnksXG5cdFx0XHRcdHF1ZXJ5Q2FsbGJhY2ssXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIHRoZSByZWZlcmVuY2UgdG8gdGhlIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlfSBmcm9tIHRoZSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX1cblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogLSBEb2Vzbid0IHJldmVydCBjaGFuZ2VzIG9uIHRoZSBpdGVtcyB0aGVtc2VsdmVzXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJSZXNvdXJjZSAoY2xlYXJJdGVtczogYm9vbGVhbiA9IHRydWUpOiB2b2lkIHtcblx0XHRpZiAoY2xlYXJJdGVtcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgdGhpcy5pdGVtcykge1xuXHRcdFx0XHRpdGVtUmVzb3VyY2UuY2xlYXJSZXNvdXJjZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNhY3Rpb24uY2xlYXJDb2xsZWN0aW9uUmVzb3VyY2UodGhpcyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uRW50cnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZSxcblx0Q29sbGVjdGlvblJlc291cmNlT3B0aW9ucyxcblx0SXRlbVJlc291cmNlLFxuXHRMb2NhbFZpZXdSZXNvdXJjZSxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueSwgVCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+ID0gTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj5cblx0ZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2UgPEl0ZW1UeXBlVHlwZSwgVD4ge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+LFxuXHRcdHRyYW5zYWN0aW9uQ2FjaGU6IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHR0cmFuc2FjdGlvbkNhY2hlLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vY2xhc3Nlcy9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVudHJ5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsXG5cdEl0ZW1FbnRyeSxcblx0SXRlbVJlc291cmNlLFxuXHRMb2NhbFZpZXdSZXNvdXJjZSxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueSwgVCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+ID0gTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj5cblx0ZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2UgPEl0ZW1UeXBlVHlwZSwgVD4ge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRmYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+LFxuXHRcdHRyYW5zYWN0aW9uQ2FjaGU6IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0ZmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHR0cmFuc2FjdGlvbkNhY2hlLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICogVXNlIHtAbGluayBDaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkIENoYW5nZXNEZWx0YS5zZXRJdGVtTW92ZWR9XG5cdCAqL1xuXHRwdWJsaWMgbW92ZUl0ZW1zIChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGRlc3RpbmF0aW9uUmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5vcHRpb25zLmVuYWJsZVNhdmUpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignY29sbGVjdGlvblJlc291cmNlU2VydmljZTogQ2Fubm90IG1vdmUgaXRlbXM6IHNhdmluZyBlbmFibGVkJyk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXNcblx0XHRcdC50cmFuc2FjdGlvblxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQubW92ZUl0ZW1zKFxuXHRcdFx0XHR0aGlzLmVudHJ5LFxuXHRcdFx0XHRkZXN0aW5hdGlvblJlc291cmNlLmVudHJ5LFxuXHRcdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgcmVtb3ZlSXRlbXMgKFxuXHRcdGlkQXJyYXk6IEl0ZW1JZFtdLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmZhY3RvcnkuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCByZW1vdmVkSXRlbUVudHJpZXM6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1SZXNvdXJjZSBvZiB0aGlzLml0ZW1zKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBpdGVtUmVzb3VyY2UuZW50cnk7XG5cblx0XHRcdGlmIChpZEFycmF5LmluZGV4T2YoaXRlbUVudHJ5Lml0ZW1JZCkgPT09IC0xKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZW1vdmVkSXRlbUVudHJpZXMucHVzaChpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdGNoYW5nZXNEZWx0YS5zZXRJdGVtc0RlbGV0ZWQocmVtb3ZlZEl0ZW1FbnRyaWVzKTtcblxuXHRcdHRoaXMudHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0fVxuXG5cdHB1YmxpYyByZW1vdmVJdGVtIChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMucmVtb3ZlSXRlbXMoXG5cdFx0XHRbaXRlbUlkXSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1zIChcblx0XHR2YWx1ZXNBcnJheTogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0Ly8gd2lsbCBjcmVhdGUgYW5kIGFwcGx5IGEgQ2hhbmdlc0RlbHRhXG5cdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXJcblx0XHRcdC5jcmVhdGVJdGVtcyhcblx0XHRcdFx0dGhpcy5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0dmFsdWVzQXJyYXksXG5cdFx0XHRcdHRoaXMuZW50cnkucGFyZW50LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBhZGRJdGVtIChcblx0XHR2YWx1ZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0cmV0dXJuIHRoaXMuYWRkSXRlbXMoXG5cdFx0XHRbdmFsdWVzXSxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5TZXQgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRlbXBsYXRlRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBBcGlSZXNwb25zZSwgRmllbGRNYXAsIEl0ZW1UeXBlLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+O1xuXHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA7XG5cdGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+OyAvLyBUT0RPOiByZW5hbWUgdG8gY29sdW1uU2V0XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdGZhY3Rvcnk6IFRlbXBsYXRlRmFjdG9yeSxcblx0XHRwdWJsaWMgaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRwdWJsaWMgcmVzcG9uc2U6IEFwaVJlc3BvbnNlLFxuXHRcdGFkZGl0aW9uYWxDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpIHtcblx0XHR0aGlzLmZpZWxkcyA9IHJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZS5saW5rc1tpdGVtVHlwZV1bMF0sXG5cdFx0KSE7XG5cblx0XHR0aGlzLnJlc3BvbnNlQ29sdW1ucyA9IGZhY3RvcnkuY29sdW1uVXRpbC5tZXJnZVJlc3BvbnNlQ29sdW1ucyhcblx0XHRcdHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpLFxuXHRcdFx0YWRkaXRpb25hbENvbHVtbnMsXG5cdFx0KS5tZXJnZWQ7XG5cblx0XHR0aGlzLmNvbHVtbnMgPSBmYWN0b3J5LmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0RnJvbVJlc3BvbnNlKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR0aGlzLnJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEl0ZW1SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtUmVzb3VyY2VPcHRpb25zLCBWaWV3UmVzb3VyY2UgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+XG5cdGV4dGVuZHMgVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRmYWN0b3J5OiBJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdGVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtUmVzb3VyY2VPcHRpb25zPFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pixcblx0XHRpc05ldzogYm9vbGVhbixcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRmYWN0b3J5LFxuXHRcdFx0ZW50cnksXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0aXNOZXcsXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXG5cdFx0dGhpcy5maWVsZHMgPSB0aGlzLnRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5pbml0aWFsO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEl0ZW1SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtUmVzb3VyY2VPcHRpb25zLCBWaWV3UmVzb3VyY2UgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT5cblx0ZXh0ZW5kcyBWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdGZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1SZXNvdXJjZU9wdGlvbnMsXG5cdFx0aXNOZXc6IGJvb2xlYW4sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0ZmFjdG9yeSxcblx0XHRcdGVudHJ5LFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdGlzTmV3LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblxuXHRcdHRoaXMuZmllbGRzID0gdHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbZW50cnkuaWRdLmNoYW5nZXM7XG5cdH1cbn1cbiIsIi8vIHNob3VsZCBiZSBvcmRlcmVkIGJ5IGRlcGVuZGVuY3khXG5leHBvcnQgKiBmcm9tICcuL0l0ZW1FbnRyeU9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtUmVzb3VyY2VPcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbUVudHJ5JztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbVJlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vVmlld1Jlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vRWRpdFJlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uRW50cnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uVmlld1Jlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkVkaXRSZXNvdXJjZSc7XG5leHBvcnQgKiBmcm9tICcuL1RlbXBsYXRlJztcbmV4cG9ydCAqIGZyb20gJy4vUmVtb3RlVmlld1Jlc291cmNlJztcbmV4cG9ydCAqIGZyb20gJy4vTG9jYWxWaWV3UmVzb3VyY2UnO1xuIiwiaW1wb3J0IHsgQXBpUmVzcG9uc2VQcm9jZXNzb3IsIENvbGxlY3Rpb25NYXRjaGVyLCBDb2x1bW5TZXQsIFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FbnRyeSxcblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZSxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLFxuXHRJdGVtRW50cnksXG5cdEl0ZW1FbnRyeU9wdGlvbnNJbnRlcmZhY2UsXG5cdEl0ZW1SZXNvdXJjZSxcblx0SXRlbVJlc291cmNlT3B0aW9uc0ludGVyZmFjZSxcbn0gZnJvbSAnLi4vbW9kZWxzJztcblxuZXhwb3J0IHR5cGUgRW50cnlQYXJlbnQgPSB7aXRlbVR5cGU6IHN0cmluZywgaXRlbUlkOiBudW1iZXJ9O1xuXG5leHBvcnQgdHlwZSBFbnRyeVBhcmVudE51bGwgPSBFbnRyeVBhcmVudCB8IG51bGw7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBVc2VkIGZvciBmaWVsZHMgdGhhdCBiZWxvbmcgdG8gYSBzcGVjaWZpYyBpdGVtVHlwZVxuICovXG5leHBvcnQgdHlwZSBGaWVsZE1hcDxfSXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRba2V5OiBzdHJpbmddOiBhbnlcbn07XG5cbmV4cG9ydCB0eXBlIEl0ZW1PcHRpb25zSW50ZXJmYWNlID0gSXRlbUVudHJ5T3B0aW9uc0ludGVyZmFjZSAmIEl0ZW1SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U7XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiA9XG5cdENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2Vcblx0JiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IHtcblx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZTtcblx0b3B0aW9uczoge2VudHJ5OiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLCByZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaW5rQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+XG5cdGV4dGVuZHMgQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlPiB7XG5cdGxpbmtGaWVsZDogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBPbkNoYW5nZUZ1bmN0aW9uPEl0ZW1SZXNvdXJjZVR5cGUgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55PiA9IEl0ZW1SZXNvdXJjZTxhbnk+PiA9IChcblx0aXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2VUeXBlLFxuXHRwcmV2aW91czogRmllbGRNYXA8SXRlbVJlc291cmNlVHlwZVsnZW50cnknXVsnaXRlbVR5cGUnXT4sXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyAndHJ1ZScgaWYgdGhlIGZpZWxkIGNoYW5nZWRcblx0ICovXG5cdGNvbXBhcmVGaWVsZDogKGZpZWxkOiBrZXlvZiBGaWVsZE1hcDxJdGVtUmVzb3VyY2VUeXBlWydlbnRyeSddWydpdGVtVHlwZSddPikgPT4gYm9vbGVhbixcbikgPT4gdm9pZDtcblxuZXhwb3J0IGNvbnN0IGVudW0gU3RhdGVLZXlUeXBlIHtcblx0TmV3ID0gJ25ldycsXG5cdER1cGxpY2F0ZSA9ICdkdXBsaWNhdGUnXG59XG5cbmV4cG9ydCB0eXBlIFN0YXRlS2V5ID0ge3R5cGU6IFN0YXRlS2V5VHlwZSwgdGVtcGxhdGU/OiBzdHJpbmcsIGl0ZW1JZD86IG51bWJlcn07XG5cbmV4cG9ydCB0eXBlIFNvY2tldE1lc3NhZ2VUeXBlID0gJ2V2ZW50JyB8ICdub3RpZmljYXRpb24nO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldE1lc3NhZ2Uge1xuXHRoZWFkZXI6IHtcblx0XHRkb21haW46IHN0cmluZyxcblx0XHRhY2NvdW50OiBzdHJpbmcsXG5cdFx0c2VuZGVyOiB7XG5cdFx0XHRkaXNwbGF5bmFtZTogc3RyaW5nLFxuXHRcdFx0aXRlbVR5cGU6ICdNZWRld2Vya2VyJyxcblx0XHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdFx0YXV0aG9yaXplZDogYm9vbGVhbixcblx0XHRcdHNlc3Npb246IHN0cmluZ1xuXHRcdH0sXG5cdFx0bWVzc2FnZUlkOiB7XG5cdFx0XHRJZDogc3RyaW5nLFxuXHRcdFx0c2VxdWVuY2U6IG51bWJlcixcblx0XHRcdGJhdGNoOiBudW1iZXIsXG5cdFx0XHRyZXF1ZXN0OiBudW1iZXJcblx0XHR9LFxuXHRcdHNlbnQ6IHN0cmluZyxcblx0XHRmb3JjZUV2YWx1YXRlOiBib29sZWFuXG5cdH07XG5cdGJvZHk6IGFueTtcblx0bWVzc2FnZVR5cGU6IFNvY2tldE1lc3NhZ2VUeXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldE1lc3NhZ2VDcmVhdGVcblx0ZXh0ZW5kcyBTb2NrZXRNZXNzYWdlIHtcblxuXHRib2R5OiB7XG5cdFx0ZXZlbnRUeXBlOiAnY3JlYXRlJyxcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1zOiB7XG5cdFx0XHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRcdFx0W2l0ZW1JZDogbnVtYmVyXToge1xuXHRcdFx0XHRcdHBhcmVudDogbnVsbCB8IEVudHJ5UGFyZW50LFxuXHRcdFx0XHRcdHZhbHVlczogRmllbGRNYXBcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb2NrZXRNZXNzYWdlVXBkYXRlXG5cdGV4dGVuZHMgU29ja2V0TWVzc2FnZSB7XG5cblx0Ym9keToge1xuXHRcdGV2ZW50VHlwZTogJ3VwZGF0ZScsXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtczoge1xuXHRcdFx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0XHRcdFtpdGVtSWQ6IG51bWJlcl06IHtcblx0XHRcdFx0XHRwYXJlbnQ6IG51bGwgfCBFbnRyeVBhcmVudCxcblx0XHRcdFx0XHR2YWx1ZXM6IEZpZWxkTWFwXG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU29ja2V0TWVzc2FnZUxpbmtUb1xuXHRleHRlbmRzIFNvY2tldE1lc3NhZ2Uge1xuXG5cdGJvZHk6IHtcblx0XHRldmVudFR5cGU6ICdsaW5rdG8nLFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXBcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbXM6IHtcblx0XHRcdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFx0XHRbaXRlbUlkOiBudW1iZXJdOiB7XG5cdFx0XHRcdFx0cGFyZW50OiBudWxsIHwgRW50cnlQYXJlbnQsXG5cdFx0XHRcdFx0dmFsdWVzOiBGaWVsZE1hcFxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvY2tldE1lc3NhZ2VEZWxldGVcblx0ZXh0ZW5kcyBTb2NrZXRNZXNzYWdlIHtcblxuXHRib2R5OiB7XG5cdFx0ZXZlbnRUeXBlOiAnZGVsZXRlJyxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbXM6IEl0ZW1JZFtdXG5cdH07XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZVNvY2tldE1lc3NhZ2Vcblx0ZXh0ZW5kcyBTb2NrZXRNZXNzYWdlIHtcblx0Ym9keToge1xuXHRcdGl0ZW1UeXBlOiAnRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZScsXG5cdFx0W2tleTogc3RyaW5nXTogYW55XG5cdH07XG59XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW0gcmVzb3VyY2VcblxuZXhwb3J0IHR5cGUgSXRlbVJlc291cmNlSXRlbUlkTWFwPFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55PiA9IEl0ZW1SZXNvdXJjZTxhbnk+PiA9IHtcblx0W2l0ZW1JZDogbnVtYmVyXTogVFxufTtcblxuZXhwb3J0IHR5cGUgSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwPFQgZXh0ZW5kcyBJdGVtUmVzb3VyY2U8YW55PiA9IEl0ZW1SZXNvdXJjZTxhbnk+PiA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBUW11cbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEl0ZW0gRW50cnlcblxuZXhwb3J0IHR5cGUgSXRlbUlkID0gbnVtYmVyO1xuXG5leHBvcnQgdHlwZSBJdGVtVHlwZSA9IHN0cmluZztcblxuZXhwb3J0IHR5cGUgSXRlbU1hcDxUPiA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiB7XG5cdFx0W2l0ZW1JZDogc3RyaW5nXTogVFxuXHR9XG59O1xuXG5leHBvcnQgdHlwZSBJdGVtRW50cnlNYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0gSXRlbU1hcDxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj47XG5cbmV4cG9ydCB0eXBlIEl0ZW1FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHtcblx0W3BhcmVudElkOiBudW1iZXJdOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj47XG59O1xuXG5leHBvcnQgdHlwZSBDb252ZXJzaW9uTWFwID0ge1xuXHRbaXRlbUlkOiBudW1iZXJdOiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBJdGVtSWRDb252ZXJzaW9uTWFwID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IENvbnZlcnNpb25NYXBcbn07XG5cbmV4cG9ydCB0eXBlIENyZWF0ZVJlcXVlc3RQYXJhbWV0ZXJNYXA8VCA9IGFueT4gPSBJdGVtTWFwPFQ+O1xuXG5leHBvcnQgdHlwZSBJdGVtRXJyb3IgPSB7bWVzc2FnZTogc3RyaW5nfTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ29sbGVjdGlvbiBFbnRyeVxuXG5leHBvcnQgdHlwZSBRdWVyeVBhcmFtcyA9IGFueTsgLy8gVE9ET1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uUXVlcnkgPSB7b2JqZWN0OiBvYmplY3QsIHN0cmluZzogc3RyaW5nfTtcblxuZXhwb3J0IHR5cGUgUXVlcnlDYWxsYmFjayA9IChxdWVyeVBhcmFtczogUXVlcnlQYXJhbXMpID0+IFF1ZXJ5UGFyYW1zO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdFtwYXJlbnRJZDogbnVtYmVyXTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT5cbn07XG5cbmV4cG9ydCB0eXBlIENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPFQgZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2U8YW55PiA9IENvbGxlY3Rpb25SZXNvdXJjZTxhbnk+PiA9IHtcblx0W3BhcmVudElkOiBudW1iZXJdOiBUXG59O1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+ID0ge1xuXHRmaXR0aW5nOiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdG5vdGZpdHRpbmc6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0bWF5YmU6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PlxufTtcblxuZXhwb3J0IGludGVyZmFjZSBFeHRlbmRlZENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT5cblx0ZXh0ZW5kcyBDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlPiB7XG5cdGNvbGxlY3Rpb246IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdyb3VwZWRFeHRlbmRlZENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4ge1xuXHRbY29sbGVjdGlvbklkOiBudW1iZXJdOiBFeHRlbmRlZENvbGxlY3Rpb25NYXRjaFJlc3VsdDxJdGVtVHlwZVR5cGU+O1xufVxuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDb2x1bW5zXG5cbmV4cG9ydCB0eXBlIFJlc3BvbnNlQ29sdW1uID0gYW55OyAvLyBUT0RPXG5cbmV4cG9ydCB0eXBlIFJlc3BvbnNlQ29sdW1uTWFwID0ge1xuXHRbY29sdW1uSWQ6IHN0cmluZ106IFJlc3BvbnNlQ29sdW1uXG59O1xuXG5leHBvcnQgdHlwZSBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IFJlc3BvbnNlQ29sdW1uTWFwXG59O1xuXG5leHBvcnQgdHlwZSBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0ge1xuXHRtZXJnZWQ6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxuXHRkaWZmZXJlbmNlOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPlxufTtcblxuZXhwb3J0IHR5cGUgUm9vdENvbHVtbk1hcCA9IHtbY29sdW1uSWQ6IHN0cmluZ106IHthcGlDb2x1bW46IFJlc3BvbnNlQ29sdW1uLCBjaGlsZHJlbjogUm9vdENvbHVtbk1hcH19O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBBcGkgcmVmZXJlbmNlXG5cbmV4cG9ydCB0eXBlIEFwaVJlc3BvbnNlID0gQXBpUmVzcG9uc2VQcm9jZXNzb3I7IC8vIFRPRE9cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQXBpIHRlbXBsYXRlIHJlc3BvbnNlXG5leHBvcnQgdHlwZSBUZW1wbGF0ZUl0ZW1SZXNvdXJjZU1hcDxUIGV4dGVuZHMgSXRlbVJlc291cmNlPGFueT4+ID0ge1xuXHRtYWluOiBUO1xuXHRsaW5rZWQ6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcFxufTtcblxuZXhwb3J0IHR5cGUgSXRlbVR5cGVNYXA8VCA9IGFueT4gPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXTogVDtcbn07XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFwaSByZXF1ZXN0XG5cbmV4cG9ydCB0eXBlIEFwaVF1ZXJ5ID0gYW55OyAvLyBUT0RPXG5cbmV4cG9ydCB0eXBlIEFwaVJlcXVlc3RJdGVtVmFsdWVzID0ge1xuXHR2YWx1ZXM/OiBhbnksXG5cdGxpbmtzPzoge1xuXHRcdFtpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW11cblx0fVxufTtcblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdEl0ZW1NYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFtpdGVtSWQ6IG51bWJlcl06IEFwaVJlcXVlc3RJdGVtVmFsdWVzXG5cdH07XG59O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0Q29sdW1uID0gc3RyaW5nIHwge1tjb2x1bW5JZDogc3RyaW5nXTogQXBpUmVxdWVzdENvbHVtbltdfTtcblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdENvbHVtbnMgPSBBcGlSZXF1ZXN0Q29sdW1uW10gfCB0cnVlO1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0Q29sdW1uTWFwID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IEFwaVJlcXVlc3RDb2x1bW5zXG59O1xuXG5leHBvcnQgdHlwZSBBcGlSZXF1ZXN0TGltaXQgPSB7XG5cdGZpZWxkOiBzdHJpbmcsXG5cdGxpbWl0OiBudW1iZXIsXG5cdG9mZnNldD86IG51bWJlcixcblx0b3JkZXI/OiAnZGVzYycgfCAnYXNjJ1xufTtcblxuZXhwb3J0IHR5cGUgQXBpUmVxdWVzdE1vdmVJdGVtcyA9IHtcblx0W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtSWRbXVxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQ3JlYXRlIHJlcXVlc3RcblxuZXhwb3J0IHR5cGUgQ3JlYXRlUmVxdWVzdEVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHtcblx0cmVxdWVzdDoge1xuXHRcdHJlcXVlc3RUeXBlOiAnY3JlYXRlJyxcblx0XHRpdGVtVHlwZT86IEl0ZW1UeXBlVHlwZSxcblx0XHRwYXJlbnRUeXBlPzogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWQ/OiB7W2l0ZW1JZDogc3RyaW5nXTogSXRlbUlkfSxcblx0XHRpdGVtczogQXBpUmVxdWVzdEl0ZW1NYXAsXG5cdFx0Y29sdW1uczogQXBpUmVxdWVzdENvbHVtbk1hcFxuXHR9LFxuXHRjb2x1bW5zOiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLFxuXHRpdGVtczogSXRlbUVudHJ5TWFwPEl0ZW1UeXBlVHlwZT4sXG5cdGNvbGxlY3Rpb25zOiBDb2xsZWN0aW9uTWF0Y2hlclxufTtcblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGVudW0gQXBpTGlua1RyZWVUeXBlIHtcblx0SVRFTVRBQkxFID0gJ2l0ZW10YWJsZScsXG5cdERJUkVDVCA9ICdkaXJlY3QnXG59XG5cbmV4cG9ydCB0eXBlIEFwaUxpbmtUcmVlRW50cnkgPSB7XG5cdHR5cGU6IEFwaUxpbmtUcmVlVHlwZS5JVEVNVEFCTEVcbn0gfCB7XG5cdHR5cGU6IEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QsXG5cdGZpZWxkOiBzdHJpbmdcbn07XG5cbmV4cG9ydCB0eXBlIEFwaUxpbmtUcmVlID0ge1xuXHRbaXRlbVR5cGU6IHN0cmluZ106IHtcblx0XHRbY2hpbGRUeXBlOiBzdHJpbmddOiBBcGlMaW5rVHJlZUVudHJ5XG5cdH1cbn07XG4iLCJleHBvcnQgKiBmcm9tICcuL0l0ZW1UeXBlc0NvbGxlY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9Qcm9taXNlSW50ZXJmYWNlJztcbiIsImltcG9ydCB7IEl0ZW1DYWNoZUZhY3RvcnksIEl0ZW1FbnRyeUZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5LCBJdGVtRW50cnlPcHRpb25zIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uL0FwaUZvcm1hdHRlcic7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEgfSBmcm9tICcuLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhQmFzZSwgQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhIH0gZnJvbSAnLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi4vQ29sdW1uSW5mbyc7XG5pbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vQ29sdW1uVXRpbCc7XG5pbXBvcnQgeyBJdGVtQ2FjaGUgfSBmcm9tICcuLi9JdGVtQ2FjaGUnO1xuaW1wb3J0IHsgaGFzUHJvcGVydGllcyB9IGZyb20gJy4uL1V0aWwnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzIH0gZnJvbSAnLi9zZXJ2ZXIvU2VydmVySXRlbUhhbmRsZXInO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzIH0gZnJvbSAnLi90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkl0ZW1IYW5kbGVyJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEl0ZW1IYW5kbGVyQmFzZSB7XG5cblx0cHVibGljIHJlYWRvbmx5IGVudHJpZXM6IEl0ZW1DYWNoZTtcblx0cHVibGljIGFic3RyYWN0IGl0ZW1DaGFuZ2VzOiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzIHwgVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzO1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJvdGVjdGVkIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHByb3RlY3RlZCBpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJvdGVjdGVkIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0XHR0aGlzLmVudHJpZXMgPSBpdGVtQ2FjaGVGYWN0b3J5LmNvbnN0cnVjdCh0aGlzLnRyYW5zYWN0aW9uKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgSXRlbUVudHJpZXMgZm9yIHRoZSBnaXZlbiBxdWVyeSwgZG9lcyBub3QgbG9vayBpbiB0aGUgY2FjaGUsIHNpbmNlIHdlIGRvbid0IGtub3cgd2hpY2ggSXRlbUlkcyBiZWxvbmcgdG8gdGhlIHF1ZXJ5ICFcblx0ICpcblx0ICogdG9kbzogV2UgY291bGQgc3RvcmUgY29sbGVjdGlvbnMgYnkgdGhlaXIgcXVlcnkgc3RyaW5nLCBhbmQgdGhlbiBzZWUgaWYgdGhlIHF1ZXJ5IGlzIGFscmVhZHkgY2FjaGVkXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZmV0Y2hJdGVtRW50cmllc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRlbnRyeU9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIEl0ZW1FbnRyaWVzIGZvciB0aGUgZ2l2ZW4gSXRlbUlkc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGZldGNoSXRlbUVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYW4gSXRlbUVudHJ5IHdpdGggdGhlIGdpdmVuIGl0ZW1JZFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGZldGNoSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFByb2Nlc3NlcyB0aGUgcGFzc2VkIHtAbGluayBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGEgdXBkYXRlIGRlbHRhfSBvbiB0aGUgdHJhbnNhY3Rpb24sIGlmIHRoZXJlIGFyZSBubyB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5pdGVtQ2hhbmdlcyBpdGVtQ2hhbmdlc30gdGhlIG5ldyB2YWx1ZXMgd2lsbCBub3QgYmUgcHJvY2Vzc2VkXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgcHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXMgKFxuXHRcdGl0ZW1FbnRyeUNoYW5nZXNUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhLFxuXHQpOiB2b2lkO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVHJhdmVyc2VzIHRoZSBjb2x1bW4gcGF0aCBhbmQgcmV0dXJucyB0aGUgZmllbGRzIG9mIHRoZSBkZXJpdmVkIGl0ZW0sIHJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBpdGVtIGlzbid0IGZvdW5kXG5cdCAqXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIEFzc3VtZXMgdGhlIGRlcml2ZWQgaXRlbSdzIHZhbHVlcyBhcmUgYWxyZWFkeSBjYWNoZWRcblx0ICovXG5cdHB1YmxpYyBnZXREZXJpdmVkVmFsdWVzIChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRjb2x1bW5QYXRoOiBzdHJpbmdbXSxcblx0KTogUmVhZG9ubHk8RmllbGRNYXA+IHwgdW5kZWZpbmVkIHtcblx0XHRsZXQgZGVyaXZlZEl0ZW1FbnRyeTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkID0gaXRlbUVudHJ5O1xuXHRcdGxldCBmaWVsZHMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdKTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgb2YgY29sdW1uUGF0aCkge1xuXHRcdFx0Y29uc3QgY29sdW1uID0gZGVyaXZlZEl0ZW1FbnRyeS5jb2x1bW5zLnJlc3BvbnNlW2Rlcml2ZWRJdGVtRW50cnkuaXRlbVR5cGVdW2NvbHVtbklkXTtcblxuXHRcdFx0aWYgKGNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgQ29sdW1uICcke2NvbHVtbklkfScgbm90IGZvdW5kIG9uIGVudHJ5IGluIEl0ZW1SZXNvdXJjZS5nZXREZXJpdmVkVmFsdWVgKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNvbHVtbi5pdGVtVHlwZSA9PT0gbnVsbCkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoYENvbHVtbiAnJHtjb2x1bW5JZH0nIGRvZXNuJ3QgaGF2ZSBjaGlsZHJlbiBpbiBJdGVtUmVzb3VyY2UuZ2V0RGVyaXZlZFZhbHVlYCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGl0ZW1JZCA9IGZpZWxkc1tjb2x1bW5JZF07XG5cblx0XHRcdGlmIChpdGVtSWQgPT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHRcdH1cblxuXHRcdFx0ZGVyaXZlZEl0ZW1FbnRyeSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZChcblx0XHRcdFx0Y29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoZGVyaXZlZEl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihgRGVyaXZlZCBpdGVtRW50cnkgJHtjb2x1bW4uaXRlbVR5cGV9OiR7aXRlbUlkfSBjb3VsZG4ndCBiZSBmb3VuZGApO1xuXHRcdFx0fVxuXG5cdFx0XHRmaWVsZHMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdGRlcml2ZWRJdGVtRW50cnkuaWQsXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZmllbGRzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgY29sdW1uUGF0aCwgb3IgdW5kZWZpbmVkIHdoZW4gdGhlIHBhdGggY291bGRuJ3QgYmUgdHJhdmVyc2VkXG5cdCAqXG5cdCAqIEBwYXJhbSBpdGVtRW50cnkgVGhlIHJvb3QgZW50cnkgdG8gc3RhcnQgdGhlIHBhdGggZnJvbVxuXHQgKiBAcGFyYW0gY29sdW1uUGF0aCBDYW4gZWl0aGVyIGJlIGFuIGFycmF5IG9mIGNvbHVtbklkcyAoWydjb2x1bW4nLCAnY29sdW1uMiddKSBvciBhIGNvbmZpZyBjb2x1bW4gc3RyaW5nICgnY29sdW1uPmNvbHVtbjInKVxuXHQgKi9cblx0cHVibGljIGdldERlcml2ZWRWYWx1ZTxUIGV4dGVuZHMgYW55ID0gYW55PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y29sdW1uUGF0aDogc3RyaW5nW10gfCBzdHJpbmcsXG5cdCk6IFQgfCB1bmRlZmluZWQge1xuXHRcdGlmICh0eXBlb2YgY29sdW1uUGF0aCA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGNvbHVtblBhdGggPSB0aGlzLmNvbHVtblV0aWwucGFyc2VDb25maWdDb2x1bW4oY29sdW1uUGF0aCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmllbGRzID0gdGhpcy5nZXREZXJpdmVkVmFsdWVzKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0Y29sdW1uUGF0aC5zbGljZShcblx0XHRcdFx0MCxcblx0XHRcdFx0LTEsXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHRpZiAoZmllbGRzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGZpZWxkc1tjb2x1bW5QYXRoW2NvbHVtblBhdGgubGVuZ3RoIC0gMV1dO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDbGVhcnMgdGhlIGVudHJ5IGZyb20gdGhpcyB0cmFuc2FjdGlvbiwgcmVtb3ZpbmcgaXQgZnJvbSB0aGUge0BsaW5rIEl0ZW1DYWNoZSBJdGVtQ2FjaGV9IGFuZCByZW1vdmluZyBhbGwgY2hhbmdlc1xuXHQgKi9cblx0cHVibGljIGNsZWFySXRlbUVudHJ5IChlbnRyeTogSXRlbUVudHJ5KTogdm9pZCB7XG5cdFx0dGhpcy5lbnRyaWVzLmNsZWFyKGVudHJ5KTtcblx0XHRkZWxldGUgdGhpcy5pdGVtQ2hhbmdlc1tlbnRyeS5pZF07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IGZyb20gdGhlIHBhc3NlZCB7QGxpbmsgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhIENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YX0gYW5kIHN0b3JlcyBpdCBpbiB0aGlzIHRyYW5zYWN0aW9uJ3Mge0BsaW5rIEl0ZW1DYWNoZSBJdGVtQ2FjaGV9XG5cdCAqL1xuXHRwcm90ZWN0ZWQgY3JlYXRlSXRlbUVudHJ5IChcblx0XHRjcmVhdGVUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhLFxuXHQpOiBJdGVtRW50cnkge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUVudHJ5RmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRjcmVhdGVUdXBsZS5pdGVtSWQsXG5cdFx0XHRjcmVhdGVUdXBsZS5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHR0aGlzLmVudHJpZXMuYWRkKGl0ZW1FbnRyeSk7XG5cblx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZWN1cnNpdmVseSBmZXRjaGVzIGRlcml2ZWQgdmFsdWVzIGFzIHNlcGFyYXRlIHJlcXVlc3RzLCBpbnN0ZWFkIG9mIGFzIGNvbHVtbnMgb2YgYSBwcmltYXJ5IGl0ZW1cblx0ICogQ2FuIGJlIHVzZWQgd2hlbiBkZXJpdmVkIHZhbHVlcyBvZiBhIGxvY2FsIGl0ZW0gaGF2ZSB0byBiZSBmZXRjaGVkLCBzaW5jZSBhIGxvY2FsIGl0ZW0gY2FuJ3QgYmUgdXNlZCBhcyByb290IGl0ZW0gb2YgYSBxdWVyeVxuXHQgKi9cblx0cHVibGljIGZldGNoRGVyaXZlZFZhbHVlc0J5Q29sdW1uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRyb290Q29sdW1uOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y2hhbmdlc0RlbHRhPzogQ2hhbmdlc0RlbHRhQmFzZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkIHwgQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgY2hpbGRDb2x1bW5zID0gcm9vdENvbHVtbi5jaGlsZHJlbjtcblxuXHRcdGlmIChjaGlsZENvbHVtbnMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgZmlyc3RDaGlsZCA9IGNoaWxkQ29sdW1uc1swXTtcblxuXHRcdGlmIChjaGlsZENvbHVtbnMubGVuZ3RoID09PSAxICYmIGZpcnN0Q2hpbGQuYXBpQ29sdW1uLnR5cGUgPT09ICdpZCcpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgWW91IHNob3VsZCB1c2UgZmllbGRzW2NvbHVtbklkXSBpbnN0ZWFkIG9mIGRlcml2ZWRbJ2NvbHVtbklkPmlkJ10gdG8gZ2V0IHRoZSBpZCBvZiBhIGRlcml2ZWQgaXRlbWApO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW1JZE1hcDoge1tpdGVtSWQ6IHN0cmluZ106IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pn0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBpdGVtSWQgPSB0aGlzLmdldEl0ZW1JZEJ5Q29sdW1uKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdHJvb3RDb2x1bW4sXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChpdGVtSWQgPT09IG51bGwpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChpdGVtSWRNYXBbaXRlbUlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGl0ZW1JZE1hcFtpdGVtSWRdID0gW107XG5cdFx0XHR9XG5cblx0XHRcdGl0ZW1JZE1hcFtpdGVtSWRdLnB1c2goaXRlbUVudHJ5KTtcblx0XHR9XG5cblx0XHRpZiAoIWhhc1Byb3BlcnRpZXMoaXRlbUlkTWFwKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW1JZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtSWRNYXApIHtcblx0XHRcdGl0ZW1JZHMucHVzaCgraXRlbUlkKTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2x1bW5JZHM6IHN0cmluZ1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjaGlsZENvbHVtbnMpIHtcblx0XHRcdGNvbHVtbklkcy5wdXNoKGNvbHVtbi5pZCk7XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gY2hlY2sgaWYgd2UgaGF2ZSB0aGVzZSB2YWx1ZXMgY2FjaGVkIGFscmVhZHlcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hJdGVtRW50cmllcyhcblx0XHRcdFx0cm9vdENvbHVtbi5pdGVtVHlwZSEsXG5cdFx0XHRcdGl0ZW1JZHMsXG5cdFx0XHRcdG5ldyBJdGVtRW50cnlPcHRpb25zKHtjb2x1bW5zOiBjb2x1bW5JZHN9KSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdFx0XHRcdGNoaWxkQ29sdW1ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlc29sdmVEZXJpdmVkVmFsdWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGNoYW5nZXNEZWx0YT86IENoYW5nZXNEZWx0YUJhc2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8YW55Pj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcblx0XHRcdHByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuZmV0Y2hEZXJpdmVkVmFsdWVzQnlDb2x1bW4oXG5cdFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IGl0ZW1FbnRyaWVzLFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gY29sdW1uLCB3aWxsIGxvb2sgaW50byB0aGUgY3VycmVudCBkZWx0YSBiZWZvcmUgYXR0ZW1wdGluZyB0byByZWFkIGl0ZW1DaGFuZ2VzXG5cdCAqL1xuXHRwcm90ZWN0ZWQgZ2V0SXRlbUlkQnlDb2x1bW48SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGNvbHVtbjogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+LFxuXHRcdGNoYW5nZXNEZWx0YT86IENoYW5nZXNEZWx0YUJhc2UsXG5cdCk6IEl0ZW1JZCB7XG5cdFx0aWYgKGNvbHVtbi5sZXZlbCA9PT0gMCkge1xuXHRcdFx0aWYgKGNoYW5nZXNEZWx0YSAhPT0gdW5kZWZpbmVkICYmIGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeS5pZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXS5jaGFuZ2VzLmZpZWxkc1tjb2x1bW4ucGF0aF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdKVtjb2x1bW4ucGF0aF07XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gY2hlY2sgaWYgdGhlIHZhbHVlIG9mIHRoZSBkZXJpdmVkIGl0ZW0gaXMgdXBkYXRlZCBpbiB0aGlzIGRlbHRhID9cblx0XHQvLyBpZiAoY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0Ly8gXHRyZXR1cm4gY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXS5jaGFuZ2VzLmRlcml2ZWRbY29sdW1uLnBhdGhdO1xuXHRcdC8vIH1cblxuXHRcdC8vIHRvZG9bY2FjaGVdIGRlcml2ZWQgdmFsdWVzIGNvdWxkIGFsc28gYmUgY2hhbmdlZCBpbiB0aGlzIGRlbHRhLCBzaG91bGRuJ3Qgd2UgZ2V0IHRoZSBkZXJpdmVkIGl0ZW1FbnRyeSBhbmQgY2FsbCBnZXRJdGVtSWRCeUNvbHVtbiA/XG5cdFx0cmV0dXJuIHRoaXMuZ2V0RGVyaXZlZFZhbHVlKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0Y29sdW1uLnBhdGgsXG5cdFx0KSE7XG5cdH1cbn1cbiIsImltcG9ydCB7XG5cdENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0SXRlbUNhY2hlRmFjdG9yeSxcblx0SXRlbUVudHJ5RmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSwgSXRlbUVudHJ5T3B0aW9ucywgSXRlbVJlc291cmNlLCBUZW1wbGF0ZSB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRBcGlRdWVyeSxcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdENvbHVtbkV4cGFuc2lvblJlc3VsdCxcblx0RW50cnlQYXJlbnROdWxsLFxuXHRGaWVsZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRJdGVtVHlwZSxcblx0SXRlbVR5cGVNYXAsXG5cdFByb21pc2VJbnRlcmZhY2UsXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSwgQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUJhc2UsIENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YSwgQ2hhbmdlc0RlbHRhUmVzdWx0IH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQge1xuXHRBcGlGb3JtYXR0ZXIsXG5cdENvbHVtbkhhbmRsZXIsXG5cdENvbHVtbkluZm8sXG5cdENvbHVtblNldCxcblx0Q29sdW1uU3Vic2V0Q2FjaGUsXG5cdENvbHVtblV0aWwsXG5cdGhhc1Byb3BlcnRpZXMsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdEtleVNlcnZpY2UsXG5cdFNlcnZlckNhY2hlLFxufSBmcm9tICcuLi8uLi9pbmRleCc7XG5pbXBvcnQgeyBUZW1wbGF0ZUNhY2hlIH0gZnJvbSAnLi4vLi4vVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQgeyBJdGVtSGFuZGxlckJhc2UgfSBmcm9tICcuLi9JdGVtSGFuZGxlckJhc2UnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdGluaXRpYWw6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdGNoYW5nZXM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBJbiBhIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9ufSBvbmx5IGxvY2FsIGl0ZW1zIGNhbiBiZSBzdG9yZWQsIHNvIGFsbCBlbnRyaWVzIGluIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmVudHJpZXMgdGhpcy5lbnRyaWVzfSBhcmUgbG9jYWxcbiAqIElmIGEgbm9uLWxvY2FsIGVudHJ5IGlzIHJlcXVlc3RlZCBpdCBzaG91bGQgYmUgcGFzc2VkIG9uIHRvIHRoZSB7QGxpbmsgU2VydmVySXRlbUhhbmRsZXIgU2VydmVySXRlbUhhbmRsZXJ9IHdoaWNoIHdpbGwgZmV0Y2hDb2xsZWN0aW9uRW50cnkgdGhlIGVudHJ5IGZyb20gdGhlIHNlcnZlclxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25JdGVtSGFuZGxlclxuXHRleHRlbmRzIEl0ZW1IYW5kbGVyQmFzZSB7XG5cblx0Ly8gdG9kb1tjYWNoZV0gc2hvdWxkIHRoaXMgYmUge1tpdGVtVHlwZTogc3RyaW5nXToge1tpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbUVudHJ5fX0gZm9yIHF1aWNrIGxvb2t1cCA/XG5cdHB1YmxpYyBkZWxldGVkSXRlbXM6IEl0ZW1UeXBlTWFwPEl0ZW1FbnRyeVtdPiA9IHt9O1xuXG5cdHB1YmxpYyBpdGVtQ2hhbmdlczoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogVHJhbnNhY3Rpb25JdGVtRW50cnlDaGFuZ2VzXG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgaXRlbVJlc291cmNlczoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogSXRlbVJlc291cmNlW11cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgdGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZSxcblx0XHRwcml2YXRlIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyLFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0YXBpRm9ybWF0dGVyOiBBcGlGb3JtYXR0ZXIsXG5cdFx0aXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRpdGVtQ2FjaGVGYWN0b3J5OiBJdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0aXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdHByb21pc2VTZXJ2aWNlLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlSXRlbUVudHJ5IChcblx0XHRjcmVhdGVUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhLFxuXHQpOiBJdGVtRW50cnkge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHN1cGVyLmNyZWF0ZUl0ZW1FbnRyeShjcmVhdGVUdXBsZSk7XG5cdFx0Y29uc3QgZGVmYXVsdExvY2FsQ2hhbmdlcyA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMb2NhbERlZmF1bHRWYWx1ZXMoKTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZGVmYXVsdExvY2FsQ2hhbmdlcykge1xuXHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzW2NvbHVtbklkXSA9IGRlZmF1bHRMb2NhbENoYW5nZXNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0Y3JlYXRlVHVwbGUuZmllbGRzLFxuXHRcdFx0e30sXG5cdFx0XHRjcmVhdGVUdXBsZS5jb2x1bW5zLm1haW4sXG5cdFx0KTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdGluaXRpYWw6IGNyZWF0ZVR1cGxlLmZpZWxkcyxcblx0XHRcdGNoYW5nZXM6IGNoYW5nZXMsXG5cdFx0fTtcblxuXHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXS5pbml0aWFsLmlkID0gaXRlbUVudHJ5Lml0ZW1JZDtcblx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0uY2hhbmdlcy5pZCA9IGl0ZW1FbnRyeS5pdGVtSWQ7XG5cblx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHRoZSBsb2NhbCB7QGxpbmsgRmllbGRNYXAgY2hhbmdlc30gb2YgdGhlIHtAbGluayBJdGVtRW50cnkgZW50cnl9IG9uIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSB0cmFuc2FjdGlvbn0gaW4gYSBmb3JtYXR0ZWQgd2F5IHRoZSBBUEkgYWNjZXB0c1xuXHQgKi9cblx0cHVibGljIGZvcm1hdFJlcXVlc3Q8SXRlbUVudHJ5VHlwZSBleHRlbmRzIEl0ZW1FbnRyeT4gKFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHQpOiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiB7XG5cdFx0Y29uc3QgbWFpbkNvbHVtbnMgPSBlbnRyeS5jb2x1bW5zLm1haW47XG5cblx0XHRpZiAoZW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVxdWVzdExvY2FsKFxuXHRcdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5jaGFuZ2VzLFxuXHRcdFx0XHRtYWluQ29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlcXVlc3QoXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXS5pbml0aWFsLFxuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tlbnRyeS5pZF0uY2hhbmdlcyxcblx0XHRcdG1haW5Db2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSBuZXcge0BsaW5rIFRlbXBsYXRlIHRlbXBsYXRlfSBhbmQgY3JlYXRlcyBuZXcge0BsaW5rIEl0ZW1FbnRyeSBpdGVtRW50cmllc30gd2l0aCB0aGUgcGFzc2VkIHZhbHVlc1xuXHQgKi9cblx0cHVibGljIGNyZWF0ZUl0ZW1zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHR2YWx1ZXNBcnJheTogQXJyYXk8RmllbGRNYXA8SXRlbVR5cGVUeXBlPj4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0cmV0dXJuIHRoaXMudGVtcGxhdGVDYWNoZVxuXHRcdFx0LmZldGNoVGVtcGxhdGUoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR1bmRlZmluZWQsXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0cGFyZW50LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCh0ZW1wbGF0ZTogVGVtcGxhdGU8SXRlbVR5cGVUeXBlPikgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgdmFsdWVzIG9mIHZhbHVlc0FycmF5KSB7XG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbUNyZWF0ZWQoXG5cdFx0XHRcdFx0XHRcdHRoaXMua2V5U2VydmljZS5nZXRMb2NhbElkKCksXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHQuLi50ZW1wbGF0ZS5maWVsZHMsXG5cdFx0XHRcdFx0XHRcdFx0Li4udmFsdWVzLFxuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0ZW1wbGF0ZS5jb2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY2xlYXJJdGVtRW50cnkgKGVudHJ5OiBJdGVtRW50cnkpOiB2b2lkIHtcblx0XHRzdXBlci5jbGVhckl0ZW1FbnRyeShlbnRyeSk7XG5cblx0XHRkZWxldGUgdGhpcy5pdGVtUmVzb3VyY2VzW2VudHJ5LmlkXTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogU3RvcmVzIGFtIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfSBvbiB0aGUgdHJhbnNhY3Rpb24sIHVzZWQgdG8gY2FsbCB7QGxpbmsgSXRlbVJlc291cmNlLm9wdGlvbnMub25DaGFuZ2UgdGhlIG9uQ2hhbmdlIGNhbGxiYWNrfVxuXHQgKi9cblx0cHVibGljIGFkZFJlc291cmNlIChyZXNvdXJjZTogSXRlbVJlc291cmNlKTogdm9pZCB7XG5cdFx0bGV0IHJlc291cmNlQXJyYXkgPSB0aGlzLml0ZW1SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXG5cdFx0aWYgKHJlc291cmNlQXJyYXkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzb3VyY2VBcnJheSA9IHRoaXMuaXRlbVJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF0gPSBbXTtcblx0XHR9XG5cblx0XHRyZXNvdXJjZUFycmF5LnB1c2gocmVzb3VyY2UpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIGEgcmVzb3VyY2UgZnJvbSB0aGUgdHJhbnNhY3Rpb24sIHByZXZlbnRpbmcgdGhlIHtAbGluayBJdGVtUmVzb3VyY2Uub3B0aW9ucy5vbkNoYW5nZSB0aGUgb25DaGFuZ2UgY2FsbGJhY2t9IGZyb20gYmVpbmcgY2FsbGVkLlxuXHQgKiBZb3Ugc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSByZXNvdXJjZSBpcyBubyBsb25nZXIgbmVlZGVkXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJSZXNvdXJjZSAocmVzb3VyY2U6IEl0ZW1SZXNvdXJjZSk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMuaXRlbVJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF07XG5cblx0XHQvLyBJdCBjYW4gYmUgdGhhdCBhbiBpdGVtIHdhcyBhbHJlYWR5IG1hcmtlZCBmb3IgZGVsZXRpb24sIGFuZCBhbGwgcmVzb3VyY2VzIGFyZSBhbHJlYWR5IGRlbGV0ZWRcblx0XHRpZiAocmVzb3VyY2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBpbmRleCA9IHJlc291cmNlcy5pbmRleE9mKHJlc291cmNlKTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHJlc291cmNlcy5zcGxpY2UoXG5cdFx0XHRcdGluZGV4LFxuXHRcdFx0XHQxLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocmVzb3VyY2VzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0ZGVsZXRlIHRoaXMuaXRlbVJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF07XG5cdFx0fVxuXHR9XG5cblx0cHVibGljIGRldGVjdENoYW5nZXMgKCk6IGJvb2xlYW4ge1xuXHRcdC8vIGlmIGFuIGVudHJ5IGlzIGluIHRoaXMgdHJhbnNhY3Rpb24ncyBjYWNoZSBpdCdzIGEgbG9jYWwgb25lLCB3aGljaCBjb3VudHMgYXMgYSBjaGFuZ2Vcblx0XHRmb3IgKGNvbnN0IF9pdGVtRW50cnlJZCBpbiB0aGlzLmVudHJpZXMuZW50cmllc0J5RW50cnlJZCkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiB0aGlzLml0ZW1DaGFuZ2VzKSB7XG5cdFx0XHRjb25zdCBoYXNDaGFuZ2VzID0gdGhpcy5kZXRlY3RFbnRyeUNoYW5nZXMoTnVtYmVyKGl0ZW1FbnRyeUlkKSk7XG5cblx0XHRcdGlmIChoYXNDaGFuZ2VzKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2hlY2tzIGlmIHRoZSB0cmFuc2FjdGlvbiBoYXMgY2hhbmdlcyBmb3IgdGhlIHBhc3NlZCB7QGxpbmsgSXRlbUVudHJ5LmlkIEl0ZW1FbnRyeUlkfVxuXHQgKlxuXHQgKiAtLS0tLVxuXHQgKiBAcmVtYXJrc1xuXHQgKiBDb21wYXJlcyBldmVyeSBmaWVsZCAob2YgdGhlIGVudHJ5KSBpbiB7QGxpbmsgVHJhbnNhY3Rpb25JdGVtSGFuZGxlci5pdGVtQ2hhbmdlcyBpdGVtQ2hhbmdlc30gd2l0aCB0aGUgaW5pdGlhbCBmaWVsZHMsIGJlY2F1c2UgZmllbGRzIGFyZSBjb3BpZWQgb3ZlciB3aGVuIGNyZWF0aW5nIGEgcmVzb3VyY2UgaGF2aW5nIHNvbWV0aGluZyBpbiBpdGVtQ2hhbmdlcyBkb2Vzbid0IGFjdHVhbGx5IG1lYW4gdGhhdCB0aGVyZSBhcmUgY2hhbmdlcyAoanVzdCB0aGF0IGEgcmVzb3VyY2UgaGFzIGJlZW4gbWFkZSlcblx0ICovXG5cdHB1YmxpYyBkZXRlY3RFbnRyeUNoYW5nZXMgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pOiBib29sZWFuIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLnRyYW5zYWN0aW9uLmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKSE7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdO1xuXG5cdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmhhc0NoYW5nZXMoXG5cdFx0XHRjaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRjaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdFx0dHJ1ZSwgLy8gQWxzbyB0YWtlIGludG8gYWNjb3VudCBtb3Zlc1xuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFByb2Nlc3NlcyBvbiBhIGNhY2hlZCBlbnRyeSwgaWYgdGhlcmUgYXJlIG5vIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzIGl0ZW1DaGFuZ2VzfSB0aGUgbmV3IHZhbHVlcyB3aWxsIG5vdCBiZSBwcm9jZXNzZWQsIHVubGVzcyBmb3JjZU92ZXJ3cml0ZSBpcyBzZXRcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeUNoYW5nZXNUdXBsZSBUaGUgY2hhbmdlcyB0dXBsZVxuXHQgKiBAcGFyYW0gZm9yY2VPdmVyd3JpdGUgSW5zdGVhZCBvZiBjYWxsaW5nIHtAbGluayBBcGlGb3JtYXR0ZXIubWVyZ2VDb3B5RmllbGRzIG1lcmdlQ29weUZpZWxkc30sIHtAbGluayBBcGlGb3JtYXR0ZXIuY29weUZpZWxkcyBjb3B5RmllbGRzfSB3aWxsIGJlIHVzZWQgKGJlY2F1c2UgQVBJIHZhbHVlcyBhcmUgYWx3YXlzIHJpZ2h0KVxuXHQgKiBAcGFyYW0gdXBkYXRlSW5pdGlhbCBTaG91bGQgYmUgYHRydWVgIGlmIGNhbGxlZCBieSBhcHBseUNoYW5nZXNGcm9tUGFyZW50XG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIFRoZSBwcmV2aW91cyBjaGFuZ2VzIHtAbGluayBGaWVsZE1hcCBGaWVsZE1hcH1cblx0ICovXG5cdHB1YmxpYyBwcm9jZXNzSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGl0ZW1FbnRyeUNoYW5nZXNUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Zm9yY2VPdmVyd3JpdGU6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHR1cGRhdGVJbml0aWFsOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGl0ZW1FbnRyeUNoYW5nZXNUdXBsZS5lbnRyeTtcblx0XHRjb25zdCBjaGFuZ2VzID0gaXRlbUVudHJ5Q2hhbmdlc1R1cGxlLmNoYW5nZXM7XG5cblx0XHQvLyBJZiB3ZSBkb24ndCBoYXZlIHRoZXNlIGl0ZW1zIGNhY2hlZCAgd2UgZG9uJ3QgbmVlZCB0byBtZXJnZS9jb3B5IGFueXRoaW5nXG5cdFx0aWYgKHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRpZiAoIWZvcmNlT3ZlcndyaXRlKSB7XG5cdFx0XHRcdHJldHVybiB7fTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gdGVzdCB0aGlzXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSB7XG5cdFx0XHRcdGNoYW5nZXM6IHt9LFxuXHRcdFx0XHRpbml0aWFsOiB7fSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZXMuZXhwYW5kZWRDb2x1bW5zICE9PSBudWxsKSB7XG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucyA9IGNoYW5nZXMuZXhwYW5kZWRDb2x1bW5zLm1lcmdlZDtcblx0XHR9XG5cblx0XHRjb25zdCBsb2NhbENoYW5nZXMgPSB0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRjb25zdCBwcmV2aW91cyA9IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdHt9LFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0Y29uc3QgaGFzVXBkYXRlZEZpZWxkcyA9IHRoaXMuYXBpRm9ybWF0dGVyLmhhc0NoYW5nZXMoXG5cdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHQpO1xuXG5cdFx0aWYgKGZvcmNlT3ZlcndyaXRlKSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5tZXJnZUNvcHlGaWVsZHMoXG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0Y2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmICh1cGRhdGVJbml0aWFsKSB7XG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0bG9jYWxDaGFuZ2VzLmluaXRpYWwsXG5cdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChjaGFuZ2VzLmZpZWxkcy5kaXNwbGF5bmFtZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb25zdCBuZXdEaXNwbGF5TmFtZSA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXREaXNwbGF5TmFtZShcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChuZXdEaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLmRpc3BsYXluYW1lID0gbmV3RGlzcGxheU5hbWU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGhhc1VwZGF0ZWRGaWVsZHMpIHtcblx0XHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMuaXRlbVJlc291cmNlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0XHRpZiAocmVzb3VyY2VzICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Zm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0cmVzb3VyY2Uub3B0aW9ucy5vbkNoYW5nZShcblx0XHRcdFx0XHRcdFx0cmVzb3VyY2UsXG5cdFx0XHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHRcdFx0XHRjb2x1bW5JZCA9PiByZXNvdXJjZS5jb21wYXJlSXRlbUZpZWxkKFxuXHRcdFx0XHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHRcdFx0XHRcdHByZXZpb3VzLFxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdFx0dGhpcy5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcHJldmlvdXM7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9LFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogKFxuXHRcdFx0c291cmNlRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdCkgPT4gdm9pZCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHQvLyB0aGUgdGhlIGl0ZW1zIG1pZ2h0IHJlZmVyZW5jZSBlYWNoIG90aGVyLCBzbyB1cGRhdGUgdGhlIGNvbnZlcnNpb24gbWFwIGZpcnN0XG5cdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmJhdGNoRXhwYW5kQ29udmVyc2lvbk1hcChcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdHRoaXMuY2xvbmVJdGVtRW50cnkoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2ssXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRzb3VyY2VFbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0bmV3RmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+ID0ge30sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9LFxuXHRcdG1vZGlmeUZpZWxkc0NhbGxiYWNrPzogKFxuXHRcdFx0c291cmNlRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdCkgPT4gdm9pZCxcblx0KTogSXRlbUlkIHtcblx0XHRjb25zdCBzb3VyY2VFbnRyeUNoYW5nZXNUdXBsZSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0TG9jYWxJdGVtRW50cnlDaGFuZ2VzVHVwbGUoXG5cdFx0XHRzb3VyY2VFbnRyeS5pZCxcblx0XHQpO1xuXG5cdFx0Y29uc3QgbmV3SXRlbUlkID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmV4cGFuZENvbnZlcnNpb25NYXAoXG5cdFx0XHRzb3VyY2VFbnRyeSxcblx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0KTtcblxuXHRcdGNvbnN0IHNvdXJjZVBhcmVudCA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KHNvdXJjZUVudHJ5KTtcblx0XHRsZXQgbmV3UGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsO1xuXG5cdFx0aWYgKHNvdXJjZVBhcmVudCAhPT0gbnVsbCkge1xuXHRcdFx0Y29uc3QgbmV3UGFyZW50SWQgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0Q29udmVyc2lvblZhbHVlKFxuXHRcdFx0XHRzb3VyY2VQYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdHNvdXJjZVBhcmVudC5pdGVtSWQsXG5cdFx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0XHQpO1xuXG5cdFx0XHRuZXdQYXJlbnQgPSB7XG5cdFx0XHRcdGl0ZW1UeXBlOiBzb3VyY2VQYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZDogbmV3UGFyZW50SWQgfHwgc291cmNlUGFyZW50Lml0ZW1JZCxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29waWVkRmllbGRzID0gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdHNvdXJjZUVudHJ5Q2hhbmdlc1R1cGxlLmNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdHt9LFxuXHRcdFx0c291cmNlRW50cnkuY29sdW1ucy5tYWluLFxuXHRcdCk7XG5cblx0XHRjb25zdCB1cGRhdGVkSXRlbVZhbHVlcyA9IHRoaXMudXBkYXRlSXRlbVZhbHVlcyhcblx0XHRcdGNvcGllZEZpZWxkcyxcblx0XHRcdG5ld1BhcmVudCxcblx0XHRcdHNvdXJjZUVudHJ5LmNvbHVtbnMuaXRlbSxcblx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdXBkYXRlZEl0ZW1WYWx1ZXMpIHtcblx0XHRcdGNvcGllZEZpZWxkc1tjb2x1bW5JZF0gPSB1cGRhdGVkSXRlbVZhbHVlc1tjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBuZXdGaWVsZHMpIHtcblx0XHRcdGNvcGllZEZpZWxkc1tjb2x1bW5JZF0gPSBuZXdGaWVsZHNbY29sdW1uSWRdO1xuXHRcdH1cblxuXHRcdGlmIChtb2RpZnlGaWVsZHNDYWxsYmFjayAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjayhcblx0XHRcdFx0c291cmNlRW50cnksXG5cdFx0XHRcdGNvcGllZEZpZWxkcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0bmV3SXRlbUlkLFxuXHRcdFx0bmV3RmllbGRzLFxuXHRcdFx0c291cmNlRW50cnkuY29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIG5ld0l0ZW1JZDtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEl0ZW1FbnRyaWVzQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGVudHJ5T3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdC5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdGVudHJ5T3B0aW9ucyxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRpZiAoIXRoaXMua2V5U2VydmljZS5pc0xvY2FsSWQoaXRlbUlkKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0Lml0ZW1IYW5kbGVyXG5cdFx0XHRcdC5mZXRjaEl0ZW1FbnRyeShcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBjYWNoZWRFbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0aWYgKGNhY2hlZEVudHJ5ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLnBhcmVudCBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoXG5cdFx0XHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdoZW4gZXhwYW5kaW5nIGl0ZW1zIHdpdGggbmV3IGRhdGEgKHdoaWNoIGFyZW4ndCB0ZWNobmljYWxseSBjaGFuZ2VzKSBpdCBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgdHJhbnNhY3Rpb24gdGhlIGl0ZW0gbGl2ZXMgb25cblx0XHRcdC8vIFdlIGRvIHRoZSBzYW1lIChidXQgZmFzdGVyKSBieSBza2lwcGluZyBzdHJhaWdodCB0byB0aGUgc2VydmVyIGNhY2hlIGZvciByZW1vdGUgaXRlbXNcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uLnBhcmVudC5pdGVtSGFuZGxlci5mZXRjaEl0ZW1FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoTG9jYWxJdGVtRW50cnlEYXRhKFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGl0ZW1FbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHRcdC5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4gaXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIGEgdGVtcGxhdGUgYW5kIGNyZWF0ZXMgYSBuZXcge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9LCB3aWxsIGVycm9yIGlmIHRoZSBJdGVtRW50cnkgd2l0aCB0aGUgZ2l2ZW4gSXRlbUlkIGFscmVhZHkgZXhpc3RzXG5cdCAqL1xuXHRwdWJsaWMgZmV0Y2hOZXdJdGVtRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0aWYgKFxuXHRcdFx0dGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCkgIT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZUV4aXN0aW5nTG9jYWxJdGVtRXJyb3IoaXRlbVR5cGUpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy50ZW1wbGF0ZUNhY2hlXG5cdFx0XHQuZmV0Y2hUZW1wbGF0ZShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0b3B0aW9ucy50ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHRcdG9wdGlvbnMudGVtcGxhdGVDb2x1bW5zLFxuXHRcdFx0XHRvcHRpb25zLnBhcmVudCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHR0ZW1wbGF0ZSA9PiB7XG5cdFx0XHRcdFx0Ly8gSXQgY291bGQgYmUgdGhhdCBmb3Igd2hhdGV2ZXIgcmVhc29uICdmZXRjaE5ld0l0ZW0nIGlzIGNhbGxlZCBhIHNlY29uZCB0aW1lIHdoaWxlIGxvYWRpbmdcblx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHR0aGlzLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0KSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy5lcnJvckhhbmRsZXIucmVqZWN0KFxuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UuY3JlYXRlRXhpc3RpbmdMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdFx0XHRcdHRoaXMucmVzb2x2ZUxvY2FsKFxuXHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRvcHRpb25zLnBhcmVudCxcblx0XHRcdFx0XHRcdHRlbXBsYXRlLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgcmVtb3RlSXRlbUlkczogSXRlbUlkW10gPSBbXTtcblx0XHRjb25zdCBsb2NhbEl0ZW1JZHM6IEl0ZW1JZFtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBpdGVtSWRzKSB7XG5cdFx0XHRpZiAodGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpKSB7XG5cdFx0XHRcdGxvY2FsSXRlbUlkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZW1vdGVJdGVtSWRzLnB1c2goaXRlbUlkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbCh7XG5cdFx0XHRcdHJlbW90ZTogdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHRcdFx0Lml0ZW1IYW5kbGVyXG5cdFx0XHRcdFx0LmZldGNoSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdHJlbW90ZUl0ZW1JZHMsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdGxvY2FsOiB0aGlzLmZldGNoTG9jYWxJdGVtRW50cmllcyhcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRsb2NhbEl0ZW1JZHMsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KSxcblx0XHRcdH0pXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzdWx0ID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0LnJlbW90ZS5jb25jYXQocmVzdWx0LmxvY2FsKTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHQvLyB0b2RvW2NhY2hlXSBtb3ZlIHRvIFRyYW5zYWN0aW9uQ2FjaGUgP1xuXHRwdWJsaWMgZmV0Y2hUaXRsZSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHN0cmluZz4ge1xuXHRcdGNvbnN0IHRpdGxlRmllbGQgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0VGl0bGVGaWVsZChpdGVtVHlwZSk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoSXRlbUVudHJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRuZXcgSXRlbUVudHJ5T3B0aW9ucyh7XG5cdFx0XHRcdFx0Y29sdW1uczogW3RpdGxlRmllbGRdLFxuXHRcdFx0XHR9KSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRpdGVtRW50cnkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLnRyYW5zYWN0aW9uLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaWQsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGNoYW5nZXNbdGl0bGVGaWVsZF07XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgcmVzb2x2ZUxvY2FsSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5TdWJzZXRDYWNoZTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKGNvbHVtblN1YnNldENhY2hlLnJ1bihpdGVtRW50cnkuY29sdW1ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oaXRlbUVudHJ5KTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2x1bW5EaWZmZXJlbmNlID0gdGhpcy5nZXRDb2x1bW5EaWZmZXJlbmNlKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0b3B0aW9ucy5jb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5IYW5kbGVyXG5cdFx0XHQuZmV0Y2goXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uRGlmZmVyZW5jZSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmV4cGFuZExvY2FsSXRlbUVudHJpZXMoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRbaXRlbUVudHJ5XSxcblx0XHRcdFx0XHRcdGNvbHVtbkRpZmZlcmVuY2UsXG5cdFx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IGl0ZW1FbnRyeSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0Q29sdW1uRGlmZmVyZW5jZSAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IEFwaVJlcXVlc3RDb2x1bW5zIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucy5yZXF1ZXN0LFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KS5kaWZmZXJlbmNlO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlTG9jYWw8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnROdWxsLFxuXHRcdHRlbXBsYXRlOiBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBpdGVtSWRDb252ZXJzaW9uID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZUxvY2FsQ29udmVyc2lvbk1hcChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0dHJ1ZSxcblx0XHRcdHRlbXBsYXRlLnJlc3BvbnNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCB1cGRhdGVkSXRlbVZhbHVlcyA9IHRoaXMudXBkYXRlSXRlbVZhbHVlcyhcblx0XHRcdHRlbXBsYXRlLmZpZWxkcyxcblx0XHRcdHBhcmVudCxcblx0XHRcdHRlbXBsYXRlLmNvbHVtbnMuaXRlbSxcblx0XHRcdGl0ZW1JZENvbnZlcnNpb24sXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gdXBkYXRlZEl0ZW1WYWx1ZXMpIHtcblx0XHRcdHRlbXBsYXRlLmZpZWxkc1tjb2x1bW5JZF0gPSB1cGRhdGVkSXRlbVZhbHVlc1tjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0aXRlbUlkLFxuXHRcdFx0dGVtcGxhdGUuZmllbGRzLFxuXHRcdFx0dGVtcGxhdGUuY29sdW1ucyxcblx0XHRcdHBhcmVudCxcblx0XHQpO1xuXG5cdFx0dGhpcy5jcmVhdGVMb2NhbEVudHJpZXMoXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHRcdHRlbXBsYXRlLFxuXHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUxvY2FsRW50cmllcyAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0bG9jYWxQYXJlbnRJZDogSXRlbUlkLFxuXHRcdHRlbXBsYXRlOiBUZW1wbGF0ZTxJdGVtVHlwZT4sXG5cdFx0aXRlbUlkQ29udmVyc2lvbjogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0XHRmaWx0ZXJJdGVtRW50cnk6IDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHQpID0+IGJvb2xlYW4gPSAoKSA9PiB0cnVlLCAvLyByZXR1cm4gdHJ1ZSB0byBpbmNsdWRlIGl0ZW1cblx0XHRtb2RpZnlGaWVsZHNDYWxsYmFjaz86IDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRcdGl0ZW1JZENvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFx0KSA9PiB2b2lkLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBhcGlSZXNwb25zZSA9IHRlbXBsYXRlLnJlc3BvbnNlO1xuXHRcdGNvbnN0IGNvbHVtblNldE1hcDoge1tpdGVtVHlwZTogc3RyaW5nXTogQ29sdW1uU2V0PEl0ZW1UeXBlPn0gPSB7fTtcblxuXHRcdGNvbnN0IGNyZWF0ZUVudHJpZXMgPSAoXG5cdFx0XHRfcGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0XHRfbG9jYWxQYXJlbnRJZDogSXRlbUlkLFxuXHRcdFx0YXBpUGFyZW50SWQ6IEl0ZW1JZCxcblx0XHQpID0+IHtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHtcblx0XHRcdFx0aXRlbVR5cGU6IF9wYXJlbnRUeXBlLFxuXHRcdFx0XHRpdGVtSWQ6IF9sb2NhbFBhcmVudElkLFxuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3QgbGlua3MgPSBhcGlSZXNwb25zZS5pdGVtc1tfcGFyZW50VHlwZV1bYXBpUGFyZW50SWRdLmxpbmtzO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGxpbmtzKSB7XG5cdFx0XHRcdGlmICghbGlua3MuaGFzT3duUHJvcGVydHkoaXRlbVR5cGUpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY29sdW1uU2V0TWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29sdW1uU2V0TWFwW2l0ZW1UeXBlXSA9IHRoaXMuY29sdW1uU2V0RmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZS5yZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGZvciAoY29uc3QgYXBpSXRlbUlkIG9mIGxpbmtzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdGNvbnN0IGZpZWxkcyA9IGFwaVJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRhcGlJdGVtSWQsXG5cdFx0XHRcdFx0KSE7XG5cblx0XHRcdFx0XHRpZiAoIWZpbHRlckl0ZW1FbnRyeShcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdCkpIHtcblx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGxvY2FsSXRlbUlkID0gaXRlbUlkQ29udmVyc2lvbltpdGVtVHlwZV1bYXBpSXRlbUlkXTtcblxuXHRcdFx0XHRcdGNvbnN0IHVwZGF0ZWRJdGVtVmFsdWVzID0gdGhpcy51cGRhdGVJdGVtVmFsdWVzKFxuXHRcdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRcdFx0Y29sdW1uU2V0TWFwW2l0ZW1UeXBlXS5pdGVtLFxuXHRcdFx0XHRcdFx0aXRlbUlkQ29udmVyc2lvbixcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiB1cGRhdGVkSXRlbVZhbHVlcykge1xuXHRcdFx0XHRcdFx0ZmllbGRzW2NvbHVtbklkXSA9IHVwZGF0ZWRJdGVtVmFsdWVzW2NvbHVtbklkXTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAobW9kaWZ5RmllbGRzQ2FsbGJhY2sgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0bW9kaWZ5RmllbGRzQ2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdFx0XHRcdGl0ZW1JZENvbnZlcnNpb24sXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIHRvZG9bY2FjaGVdIHRlc3QgcGFyZW50RmllbGRzLCBzaW5jZSB3ZSBkb24ndCBoYXZlIGNvbHVtbnMgZm9yIGl0XG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0XHRcdFx0bG9jYWxJdGVtSWQsXG5cdFx0XHRcdFx0XHRmaWVsZHMsXG5cdFx0XHRcdFx0XHRjb2x1bW5TZXRNYXBbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdFx0cGFyZW50LFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjcmVhdGVFbnRyaWVzKFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRsb2NhbEl0ZW1JZCxcblx0XHRcdFx0XHRcdGFwaUl0ZW1JZCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblxuXHRcdGNyZWF0ZUVudHJpZXMoXG5cdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0bG9jYWxQYXJlbnRJZCxcblx0XHRcdGFwaVJlc3BvbnNlLmxpbmtzW3BhcmVudFR5cGVdWzBdLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kTG9jYWxJdGVtRW50cmllczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhQmFzZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4+IHtcblx0XHRpZiAoaXRlbUVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGl0ZW1FbnRyaWVzKTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGV4cGFuc2lvblJlc3VsdCA9IGNvbHVtbkV4cGFuc2lvbi5ydW4oaXRlbUVudHJ5LmNvbHVtbnMpO1xuXG5cdFx0XHRpZiAoZXhwYW5zaW9uUmVzdWx0ID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZExvY2FsSXRlbUVudHJ5KFxuXHRcdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0ZXhwYW5zaW9uUmVzdWx0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXNvbHZlRGVyaXZlZFZhbHVlcyhcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uLmFnZ3JlZ2F0ZVJvb3RDb2x1bW5zKCksXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyB1cGRhdGVJdGVtVmFsdWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0XHRpdGVtQ29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+Pixcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIGl0ZW1Db2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblx0XHRcdGNvbnN0IGFwaUNvbHVtbiA9IGNvbHVtbi5hcGlDb2x1bW47XG5cblx0XHRcdC8vIFRPRE86IHdlIGNhbiByZWNvbnNpZGVyIHRoaXMgb25jZSBhbGwgY29sdW1ucyBhcmUgcmVzcGVjdGVkIGZvciBsb2NhbCBpdGVtcyBbUk00LTEwMzc4XVxuXHRcdFx0bGV0IG5ld1ZhbHVlO1xuXG5cdFx0XHRpZiAoYXBpQ29sdW1uLnR5cGUgPT09ICdsaW5rJyAmJiBjaGFuZ2VzW2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmIChwYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0XHRuZXdWYWx1ZSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdG5ld1ZhbHVlID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldENvbnZlcnNpb25WYWx1ZShcblx0XHRcdFx0XHRhcGlDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5JZF0sXG5cdFx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG5ld1ZhbHVlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IG5ld1ZhbHVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGRhdGEgZm9yIHRoZSBwYXNzZWQgSXRlbVR5cGUvSXRlbUlkL2NvbHVtbnMsIGlzIGFibGUgdG8gZmV0Y2hDb2xsZWN0aW9uRW50cnkgbm9uLWxvY2FsIGRlcml2ZWQgdmFsdWVzLlxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIEFzc3VtZXMgdGhlIHRoZSBJdGVtRW50cnkgd2l0aCB0aGUgZ2l2ZW4gSXRlbVR5cGUtSXRlbUlkIGlzIGFscmVhZHkgY2FjaGVkXG5cdCAqL1xuXHRwdWJsaWMgZmV0Y2hMb2NhbEl0ZW1FbnRyeURhdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1FbnRyeU9wdGlvbnMsXG5cdCkge1xuXHRcdGNvbnN0IGNhY2hlZEVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRpZiAoY2FjaGVkRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLmNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvcihpdGVtVHlwZSksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlc29sdmVMb2NhbEl0ZW1FbnRyeShcblx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdGNhY2hlZEVudHJ5LFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMb2NhbEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZSA9IHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LmNvbnN0cnVjdChvcHRpb25zLmNvbHVtbnMpO1xuXHRcdGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlSW50ZXJmYWNlPGFueT4+ID0gW107XG5cblx0XHRjb25zdCBpdGVtSWRzT25QYXJlbnRUcmFuc2FjdGlvbjogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdGNvbnN0IGNhY2hlZEVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChjYWNoZWRFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLnBhcmVudCBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdChcblx0XHRcdFx0XHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZS5jcmVhdGVVbmZvdW5kTG9jYWxJdGVtRXJyb3IoaXRlbVR5cGUpLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXaGVuIGV4cGFuZGluZyBpdGVtcyB3aXRoIG5ldyBkYXRhICh3aGljaCBhcmVuJ3QgdGVjaG5pY2FsbHkgY2hhbmdlcykgaXQgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhlIHRyYW5zYWN0aW9uIHRoZSBpdGVtIGxpdmVzIG9uXG5cdFx0XHRcdC8vIFdlIGRvIHRoZSBzYW1lIChidXQgZmFzdGVyKSBieSBza2lwcGluZyBzdHJhaWdodCB0byB0aGUgc2VydmVyIGNhY2hlIGZvciByZW1vdGUgaXRlbXNcblx0XHRcdFx0aXRlbUlkc09uUGFyZW50VHJhbnNhY3Rpb24ucHVzaChpdGVtSWQpO1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLmZldGNoTG9jYWxJdGVtRW50cnlEYXRhKFxuXHRcdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1JZHNPblBhcmVudFRyYW5zYWN0aW9uLmxlbmd0aCA+IDApIHtcblx0XHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLnBhcmVudCBpbnN0YW5jZW9mIFNlcnZlckNhY2hlKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVHJpZWQgbG9va2luZyBmb3IgbG9jYWwgZW50cmllcyBvbiB0aGUgc2VydmVyQ2FjaGUnKTtcblx0XHRcdH1cblxuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0KHRoaXMudHJhbnNhY3Rpb24ucGFyZW50IGFzIFRyYW5zYWN0aW9uQ2FjaGUpLml0ZW1IYW5kbGVyLmZldGNoTG9jYWxJdGVtRW50cmllcyhcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWRzT25QYXJlbnRUcmFuc2FjdGlvbixcblx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbChwcm9taXNlcylcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHRcdC5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4gaXRlbUlkcy5tYXAoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUlkID0+IHRoaXMudHJhbnNhY3Rpb24uZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZChcblx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0XHRcdCkhLFxuXHRcdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRMb2NhbEl0ZW1FbnRyeTxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGFCYXNlLFxuXHRcdGVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGNvbHVtbkV4cGFuc2lvblJlc3VsdDogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBtYWluQ29sdW1ucyA9IGNvbHVtbkV4cGFuc2lvblJlc3VsdC5kaWZmZXJlbmNlLm1haW47XG5cblx0XHRlbnRyeS5jb2x1bW5zID0gY29sdW1uRXhwYW5zaW9uUmVzdWx0Lm1lcmdlZDtcblxuXHRcdGlmIChtYWluQ29sdW1ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmdldExvY2FsVmFsdWVzKFxuXHRcdFx0ZW50cnksXG5cdFx0XHRtYWluQ29sdW1ucyxcblx0XHQpO1xuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHZhbHVlcykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRlbnRyeSxcblx0XHRcdHZhbHVlcyxcblx0XHRcdGNvbHVtbkV4cGFuc2lvblJlc3VsdCxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRMb2NhbFZhbHVlczxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeVR5cGUsXG5cdFx0Y29sdW1uczogQXJyYXk8Q29sdW1uSW5mbzxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+IHtcblx0XHRjb25zdCBwYXJlbnQgPSB0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChlbnRyeSk7XG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1DaGFuZ2VzW2VudHJ5LmlkXSk7XG5cdFx0Y29uc3QgcmVzdWx0OiBGaWVsZE1hcDxJdGVtRW50cnlUeXBlWydpdGVtVHlwZSddPiA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0Y29uc3QgY29sdW1uSWQgPSBjb2x1bW4uaWQ7XG5cblx0XHRcdC8vIHBhcmVudCBjb2x1bW5zIG1pZ2h0IGFsc28gYmUgaW5jbHVkZWQgaW4gdGhlIGRpZmZlcmVuY2Vcblx0XHRcdGlmIChjaGFuZ2VzW2NvbHVtbklkXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBjb2x1bW5UeXBlID0gY29sdW1uLmFwaUNvbHVtbi50eXBlO1xuXG5cdFx0XHRyZXN1bHRbY29sdW1uSWRdID0gY29sdW1uVHlwZSA9PT0gJ2xpbmsnICYmIHBhcmVudCAhPT0gbnVsbCA/XG5cdFx0XHRcdHBhcmVudC5pdGVtSWQgOlxuXHRcdFx0XHR0aGlzLmFwaUZvcm1hdHRlci5nZXREZWZhdWx0VmFsdWUoY29sdW1uVHlwZSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxufVxuIiwiaW1wb3J0IHsgUm1Db3JlIH0gZnJvbSAnLi4vLi4vY29yZSc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0SXRlbUNhY2hlRmFjdG9yeSxcblx0SXRlbUVudHJ5RmFjdG9yeSxcblx0SXRlbVJlc291cmNlRmFjdG9yeSxcblx0TW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0UXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0UXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQge1xuXHRBdXRoSW50ZXJmYWNlLFxuXHRFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7IEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1JZENvbnZlcnNpb25NYXAsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXBpRm9ybWF0dGVyIH0gZnJvbSAnLi4vQXBpRm9ybWF0dGVyJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4uL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgT25BZnRlckNyZWF0ZUNhbGxiYWNrIH0gZnJvbSAnLi4vQ2hhbmdlc1Byb2Nlc3Nvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9Db2xsZWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sdW1uQ2FjaGUgfSBmcm9tICcuLi9Db2x1bW5DYWNoZSc7XG5pbXBvcnQgeyBDb2x1bW5IYW5kbGVyIH0gZnJvbSAnLi4vQ29sdW1uSGFuZGxlcic7XG5pbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi4vQ29sdW1uSW5mbyc7XG5pbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vQ29sdW1uVXRpbCc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4uL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IEl0ZW1DYWNoZSB9IGZyb20gJy4uL0l0ZW1DYWNoZSc7XG5pbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vSXRlbUVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vS2V5U2VydmljZSc7XG5pbXBvcnQgeyBMb2NrU2VydmljZSB9IGZyb20gJy4uL0xvY2tTZXJ2aWNlJztcbmltcG9ydCB7IFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uL1F1ZXJ5U2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4uL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuLi9UZW1wbGF0ZUNhY2hlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgU2VydmVyQ29sbGVjdGlvbkhhbmRsZXIgfSBmcm9tICcuL3NlcnZlci9TZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlcic7XG5pbXBvcnQgeyBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzLCBTZXJ2ZXJJdGVtSGFuZGxlciB9IGZyb20gJy4vc2VydmVyL1NlcnZlckl0ZW1IYW5kbGVyJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlciB9IGZyb20gJy4vdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMsIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIgfSBmcm9tICcuL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uSXRlbUhhbmRsZXInO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDYWNoZSB7XG5cblx0cHVibGljIGNoaWxkcmVuOiBUcmFuc2FjdGlvbkNhY2hlW10gPSBbXTtcblxuXHRwdWJsaWMgcmVhZG9ubHkgaXRlbUhhbmRsZXI6IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIgfCBTZXJ2ZXJJdGVtSGFuZGxlcjtcblx0cHVibGljIHJlYWRvbmx5IGNvbGxlY3Rpb25IYW5kbGVyOiBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyIHwgU2VydmVyQ29sbGVjdGlvbkhhbmRsZXI7XG5cblx0cHVibGljIHBhcmVudDogQWJzdHJhY3RDYWNoZSB8IG51bGw7XG5cblx0cHJvdGVjdGVkIGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgY29yZTogUm1Db3JlLFxuXHRcdHByb3RlY3RlZCBjb2x1bW5DYWNoZTogQ29sdW1uQ2FjaGUsXG5cdFx0cHJvdGVjdGVkIHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRwcm90ZWN0ZWQgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCBjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBsb2NrU2VydmljZTogTG9ja1NlcnZpY2UsXG5cdFx0cHJvdGVjdGVkIG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHRlbXBsYXRlQ2FjaGU6IFRlbXBsYXRlQ2FjaGUsXG5cdFx0cHJvdGVjdGVkIGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk6IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByb3RlY3RlZCBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJvdGVjdGVkIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRwcm90ZWN0ZWQgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgY29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRwcm90ZWN0ZWQgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJvdGVjdGVkIGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0cHJvdGVjdGVkIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJvdGVjdGVkIGNvbGxlY3Rpb25FbnRyeUZhY3Rvcnk6IENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJvdGVjdGVkIGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCBxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgcXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2UsXG5cdFx0cHJvdGVjdGVkIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHByb3RlY3RlZCBsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlQ2hpbGQgKGlkPzogc3RyaW5nKTogVHJhbnNhY3Rpb25DYWNoZSB7XG5cdFx0Y29uc3QgdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb25DYWNoZShcblx0XHRcdHRoaXMuY29yZSxcblx0XHRcdHRoaXMuY29sdW1uQ2FjaGUsXG5cdFx0XHR0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRoaXMuYXV0aEludGVyZmFjZSxcblx0XHRcdHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdHRoaXMubG9ja1NlcnZpY2UsXG5cdFx0XHR0aGlzLm1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0aGlzLml0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHR0aGlzLnRlbXBsYXRlQ2FjaGUsXG5cdFx0XHR0aGlzLml0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLmVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdHRoaXMucHJvbWlzZVNlcnZpY2UsXG5cdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2x1bW5IYW5kbGVyLFxuXHRcdFx0dGhpcy5jb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbHVtblV0aWwsXG5cdFx0XHR0aGlzLml0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0XHR0aGlzLmtleVNlcnZpY2UsXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRoaXMucXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UsXG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlcixcblx0XHRcdHRoaXMubGlua1RyZWVTZXJ2aWNlLFxuXHRcdFx0dGhpcyxcblx0XHRcdGlkLFxuXHRcdCk7XG5cblx0XHR0aGlzLmNoaWxkcmVuLnB1c2godHJhbnNhY3Rpb24pO1xuXG5cdFx0cmV0dXJuIHRyYW5zYWN0aW9uO1xuXHR9XG5cblx0cHVibGljIG9uQ2hpbGREZXN0cm95IChjYWNoZTogVHJhbnNhY3Rpb25DYWNoZSk6IHZvaWQge1xuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKGNhY2hlKTtcblxuXHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdHRoaXMuY2hpbGRyZW4uc3BsaWNlKFxuXHRcdFx0XHRpbmRleCxcblx0XHRcdFx0MSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzIENvbGxlY3Rpb25DYWNoZX0gb2YgdGhlIHRyYW5zYWN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q3VycmVudENvbGxlY3Rpb25FbnRyeUNhY2hlICgpOiBDb2xsZWN0aW9uQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhlIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmVudHJpZXMgSXRlbUNhY2hlfSBvZiB0aGUgdHJhbnNhY3Rpb25cblx0ICovXG5cdHB1YmxpYyBnZXRDdXJyZW50SXRlbUVudHJ5Q2FjaGUgKCk6IEl0ZW1DYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcztcblx0fVxuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRTZXJ2ZXJDYWNoZSAoKTogU2VydmVyQ2FjaGU7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExvY2FsSXRlbUVudHJ5IChpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddKTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRMb2NhbEl0ZW1FbnRyeUJ5SXRlbUlkIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtRW50cnlbJ2l0ZW1JZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQ7XG5cblx0cHVibGljIGFic3RyYWN0IGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQXBwbGllcyBjaGFuZ2VzIGZyb20gYSBjaGlsZCB0cmFuc2FjdGlvbiB0byBhIHBhcmVudFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGFwcGx5Q2hhbmdlc0Zyb21DaGlsZCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0YnJlYWtVcEJ5UGFyZW50PzogYm9vbGVhbixcblx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2s/OiBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUlkQ29udmVyc2lvbk1hcD47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDYWxsZWQgYnkgYSBwYXJlbnQgdHJhbnNhY3Rpb24sIHByb3BhZ2F0ZXMgY2hhbmdlcyBkb3dud2FyZHMgdG8gYWxsIGNoaWxkIGNhY2hlc1xuXHQgKlxuXHQgKiBAcmVtYXJrc1xuXHQgKiAtIFNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIGNvcmVcblx0ICpcblx0ICogdG9kb1tjYWNoZV0gU2hvdWxkIHdlIHJlZmV0Y2ggZGVyaXZlZCB2YWx1ZXMganVzdCBsaWtlIGluIGFwcGx5Q2hhbmdlc0RlbHRhID9cblx0ICpcblx0ICogQGludGVybmFsXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCAoXG5cdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGE6IEludGVybmFsQ2hhbmdlc0RlbHRhLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlOiBib29sZWFuLFxuXHQpOiB2b2lkO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRQYXJlbnQgKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5LFxuXHRcdGZyb21Jbml0aWFsPzogYm9vbGVhbixcblx0KTogRW50cnlQYXJlbnROdWxsO1xuXG5cdHB1YmxpYyBhYnN0cmFjdCBnZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHRcdGNvcHlGaWVsZHM/OiBib29sZWFuLFxuXHQpOiBGaWVsZE1hcDtcblxuXHRwdWJsaWMgYWJzdHJhY3QgZ2V0TG9jYWxJdGVtRW50cnlDaGFuZ2VzVHVwbGUgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQmVjYXVzZSB0aGUgYGl0ZW1DaGFuZ2VzYCBvYmplY3QgZGlmZmVycyBiZXR3ZWVuIHRoZSB7QGxpbmsgU2VydmVySXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgU2VydmVySXRlbUhhbmRsZXJ9IGFuZCB0aGUge0BsaW5rIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMgVHJhbnNhY3Rpb25JdGVtSGFuZGxlcn0gd2UgbmVlZCBhIGZ1bmN0aW9uIHRvIG5vcm1hbGlzZSB0aG9zZSB2YWx1ZXNcblx0ICpcblx0ICogQHJlbWFya3Ncblx0ICogLSBTaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBjb3JlXG5cdCAqXG5cdCAqIEBpbnRlcm5hbFxuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRjaGFuZ2VzT2JqZWN0OiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZT4gfCBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlPixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgYWJzdHJhY3QgYXBwbHlDaGFuZ2VzRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENoYW5nZXNEZWx0YVJlc3VsdD47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDYWxsZWQgYnkgYXBwbHlDaGFuZ2VzRGVsdGEgZnJvbSBTZXJ2ZXJDYWNoZSBhbmQgVHJhbnNhY3Rpb25DYWNoZS4gQXBwbGllcyBjcmVhdGVzLCB1cGRhdGVzIGFuZCBtb3ZlcywgZG9lc24ndCBhcHBseSBkZWxldGVzXG5cdCAqXG5cdCAqIEBwcml2YXRlXG5cdCAqL1xuXHRwcm90ZWN0ZWQgX2FwcGx5Q2hhbmdlc0RlbHRhIChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0KToge1xuXHRcdHJlc3VsdDogQ2hhbmdlc0RlbHRhUmVzdWx0LFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRyb2xsYmFja0Z1bmN0aW9uczogQXJyYXk8KGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhKSA9PiB2b2lkPixcblx0fSB7XG5cdFx0Ly8gV2UgaGF2ZSB0byBjb252ZXJ0IHRoZSBDaGFuZ2VzRGVsdGEgdG8gYW4gSW50ZXJuYWxDaGFuZ2VzRGVsdGEgaW4gb3JkZXIgdG8gcGFzcyBpdCB0byB0aGUgQ29sbGVjdGlvbk1hdGNoZXIgYW5kIGNoaWxkIFRyYW5zYWN0aW9uc1xuXHRcdGNvbnN0IGludGVybmFsQ2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblxuXHRcdGNvbnN0IGNyZWF0ZWRFbnRyaWVzOiBDaGFuZ2VzRGVsdGFSZXN1bHRbJ2NyZWF0ZWQnXSA9IFtdO1xuXHRcdGNvbnN0IHJvbGxiYWNrRnVuY3Rpb25zOiBBcnJheTwoY2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEpID0+IHZvaWQ+ID0gW107XG5cblx0XHQvLyBXZSBvbmx5IGNyZWF0ZSBuZXcgZW50cmllcyBvbiB0aGUgZGlyZWN0IHRyYW5zYWN0aW9uLCBub3Qgb24gdGhlIGNoaWxkcmVuXG5cdFx0Zm9yIChjb25zdCB0dXBsZSBvZiBjaGFuZ2VzRGVsdGEuY3JlYXRlZCkge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtSGFuZGxlci5jcmVhdGVJdGVtRW50cnkodHVwbGUpO1xuXG5cdFx0XHRjcmVhdGVkRW50cmllcy5wdXNoKGl0ZW1FbnRyeSk7XG5cblx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1DcmVhdGVkKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdHRoaXMuZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlcyh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0pLFxuXHRcdFx0KTtcblxuXHRcdFx0cm9sbGJhY2tGdW5jdGlvbnMucHVzaChcblx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiByb2xsYmFja0RlbHRhLnNldEl0ZW1EZWxldGVkKGl0ZW1FbnRyeSksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gY2hhbmdlc0RlbHRhLnVwZGF0ZWQpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRjb25zdCBwcmV2aW91cyA9IHRoaXMuaXRlbUhhbmRsZXIucHJvY2Vzc0l0ZW1FbnRyeUNoYW5nZXMoXG5cdFx0XHRcdHR1cGxlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0KTtcblxuXHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHR0dXBsZS5jaGFuZ2VzLmZpZWxkcyxcblx0XHRcdFx0dHVwbGUuY2hhbmdlcy5leHBhbmRlZENvbHVtbnMsXG5cdFx0XHQpO1xuXG5cdFx0XHRyb2xsYmFja0Z1bmN0aW9ucy5wdXNoKFxuXHRcdFx0XHRyb2xsYmFja0RlbHRhID0+IHJvbGxiYWNrRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0cHJldmlvdXMsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAodHVwbGUuY2hhbmdlcy5wYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkKFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMucGFyZW50LFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBXaGVuIHJvbGxpbmcgYmFjayBhIGRlbHRhIHdlIGNhbGwgYHNldEl0ZW1VcGRhdGVkYCB0byByZXN0b3JlIGRlbGV0aW9uc1xuXHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIgaW5zdGFuY2VvZiBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyKSB7XG5cdFx0XHRcdGNvbnN0IGRlbGV0ZWRFbnRyaWVzID0gdGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbdHVwbGUuZW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0XHRcdGlmIChkZWxldGVkRW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBpbmRleCA9IGRlbGV0ZWRFbnRyaWVzLmluZGV4T2YodHVwbGUuZW50cnkpO1xuXG5cdFx0XHRcdGlmIChpbmRleCA+IC0xKSB7XG5cdFx0XHRcdFx0ZGVsZXRlZEVudHJpZXMuc3BsaWNlKFxuXHRcdFx0XHRcdFx0aW5kZXgsXG5cdFx0XHRcdFx0XHQxLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0cmVzdWx0OiB7XG5cdFx0XHRcdGNyZWF0ZWQ6IGNyZWF0ZWRFbnRyaWVzLFxuXHRcdFx0XHRyb2xsYmFjazogKCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJvbGxiYWNrRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGZuIG9mIHJvbGxiYWNrRnVuY3Rpb25zKSB7XG5cdFx0XHRcdFx0XHRmbihyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5hcHBseUNoYW5nZXNEZWx0YShyb2xsYmFja0RlbHRhKTtcblx0XHRcdFx0fSxcblx0XHRcdH0sXG5cdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEVuc3VyZXMgdGhhdCBmb3IgYWxsIHVwZGF0ZWQgaXRlbXMgaW4gdGhlIGRlbHRhIHRoZSByZXF1aXJlZCBkZXJpdmVkIHZhbHVlcyBhcmUgcHJlc2VudFxuXHQgKi9cblx0cHJvdGVjdGVkIGZldGNoVXBkYXRlZERlcml2ZWRWYWx1ZXNGcm9tRGVsdGEgKFxuXHRcdGNoYW5nZXNEZWx0YTogQ2hhbmdlc0RlbHRhLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeVtdW10+IHtcblx0XHRjb25zdCBkZXJpdmVkUHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8SXRlbUVudHJ5W10+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBjaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBjaGFuZ2VzRGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF07XG5cdFx0XHRjb25zdCBjaGFuZ2VkUm9vdENvbHVtbnM6IENvbHVtbkluZm9bXSA9IFtdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiB0dXBsZS5lbnRyeS5jb2x1bW5zLnJvb3QpIHtcblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMuZmllbGRzLmhhc093blByb3BlcnR5KGNvbHVtbi5pZClcblx0XHRcdFx0XHQmJiB0dXBsZS5jaGFuZ2VzLmZpZWxkc1tjb2x1bW4uaWRdICE9PSB0aGlzLmdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXModGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1t0dXBsZS5lbnRyeS5pZF0pW2NvbHVtbi5pZF1cblx0XHRcdFx0KSB7XG5cdFx0XHRcdFx0Y2hhbmdlZFJvb3RDb2x1bW5zLnB1c2goY29sdW1uKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoY2hhbmdlZFJvb3RDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0ZGVyaXZlZFByb21pc2VzLnB1c2goXG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIucmVzb2x2ZURlcml2ZWRWYWx1ZXMoXG5cdFx0XHRcdFx0W3R1cGxlLmVudHJ5XSxcblx0XHRcdFx0XHRjaGFuZ2VkUm9vdENvbHVtbnMsXG5cdFx0XHRcdFx0Ly8gV2UgcGFzcyB0aGUgZGVsdGEgc28gdGhlIG5ldyByb290Q29sdW1uJ3MgdmFsdWVzIGFyZSByZWFkXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGUgbmV3IGRlcml2ZWQgdmFsdWVzIGV4aXN0IGJlZm9yZSBjYWxsaW5nIG9uQ2hhbmdlLCBzaW5jZSB0aGUgb25DaGFuZ2UgZnVuY3Rpb24gbWlnaHQgdXNlIHRoZSBuZXcgdmFsdWVzXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKGRlcml2ZWRQcm9taXNlcyk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFic3RyYWN0Q2FjaGUsIEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uLyc7XG5pbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzLyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5leHBvcnQgdHlwZSBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBJdGVtVHlwZT4gPSB7XG5cdFtpdGVtSWQ6IG51bWJlcl06IHtcblx0XHRpdGVtOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRpc01hdGNoOiBib29sZWFuIHwgJ21heWJlJ1xuXHR9XG59O1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbk1hdGNoZXJCYXNlIHtcblxuXHRwcm90ZWN0ZWQgbWFwOiB7XG5cdFx0W2NvbGxlY3Rpb25FbnRyeUlkOiBudW1iZXJdOiB7XG5cdFx0XHRjb2xsZWN0aW9uOiBDb2xsZWN0aW9uRW50cnlcblx0XHRcdG1hdGNoZXM6IENvbGxlY3Rpb25NYXRjaGVyTWF0Y2hlc1xuXHRcdH1cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcm90ZWN0ZWQgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdFx0cHJpdmF0ZSBnZXRDb2xsZWN0aW9uRW50cmllczogKGl0ZW1UeXBlOiBJdGVtVHlwZSkgPT4gQ29sbGVjdGlvbkVudHJ5W10sXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGV4cGFuZDxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4sXG5cdCk6IHRoaXMge1xuXHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlciA9IHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRmaWVsZHMsXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudChpdGVtRW50cnkpLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gdGhpcy5fZXhwYW5kKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IHF1ZXJ5TWF0Y2hlci5tYXRjaFF1ZXJ5KGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QpLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgcHJvY2Vzc0RlbHRhIChpbnRlcm5hbENoYW5nZXNEZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEpOiB0aGlzIHtcblx0XHQvLyB3ZSBkbyBkZWxldGluZyBmaXJzdCBiZWNhdXNlIGl0J3MgdGhlIGxlYXN0IGV4cGVuc2l2ZSBvcGVyYXRpb25cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGNvbnN0IGVudHJpZXNUb0JlRGVsZXRlZCA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBlbnRyaWVzVG9CZURlbGV0ZWQpIHtcblx0XHRcdFx0dGhpcy5fZXhwYW5kKFxuXHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHQvLyBDb2xsZWN0aW9ucyBjYW4gbmV2ZXIgY29udGFpbiBkZWxldGVkIGl0ZW1zIHRvIHRoZXkncmUgYWx3YXlzIG5vdCBmaXR0aW5nXG5cdFx0XHRcdFx0KCkgPT4gZmFsc2UsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLmNyZWF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRjb25zdCBxdWVyeU1hdGNoZXIgPSB0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHR0dXBsZS5lbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0dHVwbGUuZmllbGRzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudCh0dXBsZS5lbnRyeSksXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWQpIHtcblx0XHRcdGNvbnN0IG1vdmVkID0gaW50ZXJuYWxDaGFuZ2VzRGVsdGEubW92ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdG1vdmVkLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gY29sbGVjdGlvbkVudHJ5Lm1hdGNoUGFyZW50KFxuXHRcdFx0XHRcdG1vdmVkLnRvLml0ZW1UeXBlLFxuXHRcdFx0XHRcdG1vdmVkLnRvLml0ZW1JZCxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRjb25zdCBjaGFuZ2VzID0ge307XG5cdFx0XHRjb25zdCBjYWNoZWRDaGFuZ2VzID0gdGhpcy50cmFuc2FjdGlvbi5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHROdW1iZXIoaXRlbUVudHJ5SWQpLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IGNvcHlDaGFuZ2UgPSAoXG5cdFx0XHRcdGZpZWxkczogRmllbGRNYXAsXG5cdFx0XHRcdGNvbHVtbklkOiBzdHJpbmcsXG5cdFx0XHQpID0+IHtcblx0XHRcdFx0Y29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG5cdFx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGlmIChkZXNjICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoXG5cdFx0XHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdFx0XHRkZXNjLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Y2hhbmdlc1tjb2x1bW5JZF0gPSBmaWVsZHNbY29sdW1uSWRdO1xuXHRcdFx0XHR9XG5cdFx0XHR9O1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIGNhY2hlZENoYW5nZXMpIHtcblx0XHRcdFx0Y29weUNoYW5nZShcblx0XHRcdFx0XHRjYWNoZWRDaGFuZ2VzLFxuXHRcdFx0XHRcdGNvbHVtbklkLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHR1cGxlLmNoYW5nZXMuZmllbGRzKSB7XG5cdFx0XHRcdGNvcHlDaGFuZ2UoXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdFx0Y29sdW1uSWQsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHF1ZXJ5TWF0Y2hlciA9IHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdHR1cGxlLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLmdldFBhcmVudCh0dXBsZS5lbnRyeSksXG5cdFx0XHQpO1xuXG5cdFx0XHR0aGlzLl9leHBhbmQoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPT4gcXVlcnlNYXRjaGVyLm1hdGNoUXVlcnkoY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhc0ZpdHRpbmdJdGVtcyAobWF0Y2hlczogQ29sbGVjdGlvbk1hdGNoZXJNYXRjaGVzKSB7XG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbWF0Y2hlcykge1xuXHRcdFx0aWYgKG1hdGNoZXNbaXRlbUlkXS5pc01hdGNoID09PSB0cnVlKSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHByb3RlY3RlZCBfZXhwYW5kIChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0XHRtYXRjaEZ1bmN0aW9uOiAoY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnkpID0+IGJvb2xlYW4gfCAnbWF5YmUnLFxuXHQpOiB0aGlzIHtcblx0XHRjb25zdCBtYXAgPSB0aGlzLm1hcDtcblx0XHRjb25zdCBpdGVtSWQgPSBpdGVtRW50cnkuaXRlbUlkO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSB0aGlzLmdldENvbGxlY3Rpb25FbnRyaWVzKGl0ZW1FbnRyeS5pdGVtVHlwZSk7XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeSBvZiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5SWQgPSBjb2xsZWN0aW9uRW50cnkuaWQ7XG5cdFx0XHRsZXQgbWF0Y2hlcztcblxuXHRcdFx0aWYgKG1hcFtjb2xsZWN0aW9uRW50cnlJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRtYXBbY29sbGVjdGlvbkVudHJ5SWRdID0ge1xuXHRcdFx0XHRcdGNvbGxlY3Rpb246IGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRtYXRjaGVzOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlcyA9IG1hcFtjb2xsZWN0aW9uRW50cnlJZF0ubWF0Y2hlcztcblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV0gV2UgY291bGQgb3B0aW1pc2Ugc29tZSB0aGluZ3MgaGVyZSBieSBjaGVja2luZyBpZiB0cmFuc2FjdGlvbi5jb2xsZWN0aW9uQ2hhbmdlcyBhbHJlYWR5IGNvbnRhaW5zIGl0ZW1FbnRyeSwgaWYgdGhhdCdzIHRoZSBjYXNlIHdlIGRvbid0IGhhdmUgdG8gbWF0Y2ggYXQgYWxsXG5cdFx0XHQvLyBDdXJyZW50bHkgYWxyZWFkeSBleGlzdGluZyBlbnRyaWVzIGFyZSBmaWx0ZXJlZCBpbiBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMgKGNoYW5nZXMuaW5kZXhPZihpdGVtRW50cnkpICE9PSAtMSlcblx0XHRcdGlmIChtYXRjaGVzW2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bWF0Y2hlc1tpdGVtSWRdID0ge1xuXHRcdFx0XHRpdGVtOiBpdGVtRW50cnksXG5cdFx0XHRcdGlzTWF0Y2g6IG1hdGNoRnVuY3Rpb24oY29sbGVjdGlvbkVudHJ5KSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckJhc2UgfSBmcm9tICcuL0NvbGxlY3Rpb25NYXRjaGVyQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlclxuXHRleHRlbmRzIENvbGxlY3Rpb25NYXRjaGVyQmFzZSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdFx0Z2V0Q29sbGVjdGlvbkVudHJpZXM6IChpdGVtVHlwZTogSXRlbVR5cGUpID0+IENvbGxlY3Rpb25FbnRyeVtdLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdGdldENvbGxlY3Rpb25FbnRyaWVzLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zICgpOiBDb2xsZWN0aW9uRW50cnlbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBDb2xsZWN0aW9uRW50cnlbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uSWQgaW4gdGhpcy5tYXApIHtcblx0XHRcdGNvbnN0IG1hcEVudHJ5ID0gdGhpcy5tYXBbY29sbGVjdGlvbklkXTtcblxuXHRcdFx0aWYgKHRoaXMuaGFzRml0dGluZ0l0ZW1zKG1hcEVudHJ5Lm1hdGNoZXMpKSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKG1hcEVudHJ5LmNvbGxlY3Rpb24pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk1hdGNoZXIgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXMgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlckJhc2UnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vQWJzdHJhY3RDYWNoZSc7XG5cbmV4cG9ydCB0eXBlIEdyb3VwZWRDb2xsZWN0aW9uTWF0Y2hlclJlc3VsdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7XG5cdGZpdHRpbmc6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0bm90Rml0dGluZzogSXRlbUlkW10sXG5cdG1heWJlOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj5cbn07XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBQcm9jZXNzZXMgYSBkZWx0YSBhbmQgYWRkcyB0aGUgaXRlbXMgdG8gdGhlIHJpZ2h0IGNvbGxlY3Rpb25zLCB0aGlzIGlzIHRoZSBPTkxZIGNsYXNzIHRoYXQgc2hvdWxkIGNoYW5nZSBjb2xsZWN0aW9uIGl0ZW1zXG4gKlxuICogLS0tLS0tXG4gKlxuICogQHJlbWFya1xuICogVGhlIENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IgaXMgYWxsb3dlZCB0byBkaXJlY3RseSBhY2Nlc3MvbW9kaWZ5IHRoZSB0cmFuc2FjdGlvbiBiZWNhdXNlIGl0J3MgT05MWSBjYWxsZWQgZnJvbSBhcHBseUNoYW5nZXNGcm9tUGFyZW50XG4gKi9cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yXG5cdGV4dGVuZHMgQ29sbGVjdGlvbk1hdGNoZXIge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHRcdGdldENvbGxlY3Rpb25FbnRyaWVzOiAoaXRlbVR5cGU6IEl0ZW1UeXBlKSA9PiBDb2xsZWN0aW9uRW50cnlbXSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRnZXRDb2xsZWN0aW9uRW50cmllcyxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIHJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zICgpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25JZCBpbiB0aGlzLm1hcCkge1xuXHRcdFx0Y29uc3QgbWFwRW50cnkgPSB0aGlzLm1hcFtjb2xsZWN0aW9uSWRdO1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gbWFwRW50cnkuY29sbGVjdGlvbjtcblx0XHRcdGNvbnN0IGdyb3VwZWRJdGVtRW50cmllcyA9IHRoaXMuZ3JvdXBJdGVtRW50cmllcyhtYXBFbnRyeS5tYXRjaGVzKTtcblxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5yZW1vdmVJdGVtRW50cmllc0Zyb21Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHRncm91cGVkSXRlbUVudHJpZXMubm90Rml0dGluZyxcblx0XHRcdCk7XG5cblx0XHRcdHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuYWRkSXRlbUVudHJpZXNUb0NvbGxlY3Rpb25DaGFuZ2VzKFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdGdyb3VwZWRJdGVtRW50cmllcy5maXR0aW5nLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGdyb3VwZWRJdGVtRW50cmllcy5tYXliZS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdFx0XHQucXVlcnkoXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0LFxuXHRcdFx0XHRcdFx0e1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdOiBbJ2lkJ119LFxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRcdFx0Ly8gV2Ugbm93IGV4YWN0bHkga25vdyB3aGljaCBvZiB0aGUgbWF5YmUgaXRlbXMgZml0XG5cblx0XHRcdFx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHRcdFx0XHRcdGdyb3VwZWRJdGVtRW50cmllcy5tYXliZS5maWx0ZXIoXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnkgPT4gcmVzcG9uc2UubGlua3NbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXS5pbmRleE9mKGl0ZW1FbnRyeS5pdGVtSWQpID4gLTEsXG5cdFx0XHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdyb3VwSXRlbUVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRtYXRjaGVzOiBDb2xsZWN0aW9uTWF0Y2hlck1hdGNoZXM8SXRlbVR5cGVUeXBlPixcblx0KTogR3JvdXBlZENvbGxlY3Rpb25NYXRjaGVyUmVzdWx0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGZpdHRpbmc6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRcdGNvbnN0IG5vdEZpdHRpbmc6IEl0ZW1JZFtdID0gW107XG5cdFx0Y29uc3QgbWF5YmU6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gbWF0Y2hlcykge1xuXHRcdFx0Y29uc3QgbWF0Y2ggPSBtYXRjaGVzW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBtYXRjaC5pdGVtO1xuXHRcdFx0Y29uc3QgaXNNYXRjaCA9IG1hdGNoLmlzTWF0Y2g7XG5cblx0XHRcdGlmIChpc01hdGNoID09PSB0cnVlKSB7XG5cdFx0XHRcdGZpdHRpbmcucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fSBlbHNlIGlmIChpc01hdGNoID09PSBmYWxzZSkge1xuXHRcdFx0XHRub3RGaXR0aW5nLnB1c2goaXRlbUVudHJ5Lml0ZW1JZCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXliZS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGZpdHRpbmc6IGZpdHRpbmcsXG5cdFx0XHRub3RGaXR0aW5nOiBub3RGaXR0aW5nLFxuXHRcdFx0bWF5YmU6IG1heWJlLFxuXHRcdH07XG5cdH1cblxufVxuIiwiaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgSXRlbUlkQ29udmVyc2lvbk1hcCwgUHJvbWlzZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5leHBvcnQgdHlwZSBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24gPSAnYWx3YXlzJyB8ICdvbkNsb3NlJyB8ICdza2lwT25DbG9zZSc7XG5cbmV4cG9ydCB0eXBlIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGUgPSB7XG5cdG9uQmVmb3JlU2F2ZTogKHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlKSA9PiBhbnksXG5cdG9uU2F2ZVN1Y2Nlc3M6IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpID0+IGFueVxufTtcblxudHlwZSBDYWxsYmFja01hcDxUIGV4dGVuZHMga2V5b2YgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZT4gPSB7XG5cdFtrZXk6IHN0cmluZ106IHtcblx0XHRjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVtUXSxcblx0XHRjb25kaXRpb246IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvblxuXHR9XG59O1xuXG5jb25zdCBERUZBVUxUX1BSSU9SSVRZID0gMTAwO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25FdmVudEhhbmRsZXIge1xuXHRwcml2YXRlIGNhbGxiYWNrczoge1xuXHRcdFtUIGluIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGVdOiBBcnJheTxbXG5cdFx0XHRudW1iZXIsXG5cdFx0XHRDYWxsYmFja01hcDxUPlxuXHRcdF0+XG5cdH0gPSB7XG5cdFx0b25CZWZvcmVTYXZlOiBbXSxcblx0XHRvblNhdmVTdWNjZXNzOiBbXSxcblx0fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIHJlZ2lzdGVyQ2FsbGJhY2s8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHR0eXBlOiBULFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdLFxuXHRcdGNvbmRpdGlvbjogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrQ29uZGl0aW9uID0gJ2Fsd2F5cycsXG5cdFx0cHJpb3JpdHk6IG51bWJlciA9IERFRkFVTFRfUFJJT1JJVFksXG5cdCk6ICgpID0+IHZvaWQge1xuXHRcdHRoaXMuZ2V0UHJpb3JpdHlMZXZlbChcblx0XHRcdHR5cGUsXG5cdFx0XHRwcmlvcml0eSxcblx0XHQpW2tleV0gPSB7XG5cdFx0XHRjYWxsYmFjayxcblx0XHRcdGNvbmRpdGlvbixcblx0XHR9O1xuXG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGRlbGV0ZSB0aGlzLmdldFByaW9yaXR5TGV2ZWwoXG5cdFx0XHRcdHR5cGUsXG5cdFx0XHRcdHByaW9yaXR5LFxuXHRcdFx0KVtrZXldO1xuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgZXhlY3V0ZUNhbGxiYWNrczxUIGV4dGVuZHMga2V5b2YgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZT4gKFxuXHRcdHR5cGU6IFQsXG5cdFx0ZXhlY3V0ZTogKGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdKSA9PiBhbnksXG5cdFx0Y2xvc2VUYWI6IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8YW55PiB7XG5cdFx0Y29uc3QgcHJpb3JpdHlMZXZlbHMgPSB0aGlzLmNhbGxiYWNrc1t0eXBlXTtcblx0XHRjb25zdCBjb25kaXRpb246IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvbiA9IGNsb3NlVGFiID8gJ29uQ2xvc2UnIDogJ3NraXBPbkNsb3NlJztcblxuXHRcdGxldCBjaGFpbiA9IHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXG5cdFx0Zm9yIChjb25zdCBwcmlvcml0eUxldmVsIG9mIHByaW9yaXR5TGV2ZWxzKSB7XG5cdFx0XHRjaGFpbiA9IGNoYWluLnRoZW4oXG5cdFx0XHRcdHRoaXMuZXhlY3V0ZUNhbGxiYWNrc1ByaW9yaXR5TGV2ZWwoXG5cdFx0XHRcdFx0cHJpb3JpdHlMZXZlbFsxXSBhcyBDYWxsYmFja01hcDxUPixcblx0XHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHRcdFx0ZXhlY3V0ZSxcblx0XHRcdFx0KSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gY2hhaW47XG5cdH1cblxuXHRwcml2YXRlIGdldFByaW9yaXR5TGV2ZWw8VCBleHRlbmRzIGtleW9mIFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGU+IChcblx0XHR0eXBlOiBULFxuXHRcdGRlc3RpbmF0aW9uUHJpb3JpdHk6IG51bWJlcixcblx0KTogQ2FsbGJhY2tNYXA8VD4ge1xuXHRcdGNvbnN0IHByaW9yaXR5TGV2ZWxzID0gdGhpcy5jYWxsYmFja3NbdHlwZV07XG5cdFx0bGV0IG5ld1ByaW9yaXR5TGV2ZWw7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHByaW9yaXR5TGV2ZWxzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRjb25zdCBwcmlvcml0eUxldmVsID0gcHJpb3JpdHlMZXZlbHNbaV07XG5cblx0XHRcdGlmIChwcmlvcml0eUxldmVsWzBdIDwgZGVzdGluYXRpb25Qcmlvcml0eSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHByaW9yaXR5TGV2ZWxbMF0gPT09IGRlc3RpbmF0aW9uUHJpb3JpdHkpIHtcblx0XHRcdFx0cmV0dXJuIHByaW9yaXR5TGV2ZWxbMV0gYXMgQ2FsbGJhY2tNYXA8VD47XG5cdFx0XHR9XG5cblx0XHRcdG5ld1ByaW9yaXR5TGV2ZWwgPSB7fTtcblxuXHRcdFx0cHJpb3JpdHlMZXZlbHMuc3BsaWNlKFxuXHRcdFx0XHRpLFxuXHRcdFx0XHQwLFxuXHRcdFx0XHRbXG5cdFx0XHRcdFx0ZGVzdGluYXRpb25Qcmlvcml0eSxcblx0XHRcdFx0XHRuZXdQcmlvcml0eUxldmVsLFxuXHRcdFx0XHRdLFxuXHRcdFx0KTtcblxuXHRcdFx0cmV0dXJuIG5ld1ByaW9yaXR5TGV2ZWw7XG5cdFx0fVxuXG5cdFx0bmV3UHJpb3JpdHlMZXZlbCA9IHt9O1xuXG5cdFx0cHJpb3JpdHlMZXZlbHMucHVzaChbXG5cdFx0XHRkZXN0aW5hdGlvblByaW9yaXR5LFxuXHRcdFx0bmV3UHJpb3JpdHlMZXZlbCxcblx0XHRdKTtcblxuXHRcdHJldHVybiBuZXdQcmlvcml0eUxldmVsO1xuXHR9XG5cblx0cHJpdmF0ZSBleGVjdXRlQ2FsbGJhY2tzUHJpb3JpdHlMZXZlbDxUIGV4dGVuZHMga2V5b2YgVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZT4gKFxuXHRcdGNhbGxiYWNrczogQ2FsbGJhY2tNYXA8VD4sXG5cdFx0Y29uZGl0aW9uOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFx0ZXhlY3V0ZTogKGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlW1RdKSA9PiBhbnksXG5cdCk6ICgpID0+IFByb21pc2VJbnRlcmZhY2U8YW55PiB7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdGNvbnN0IHJlc3VsdDoge1trZXk6IHN0cmluZ106IGFueX0gPSB7fTtcblxuXHRcdFx0Zm9yIChjb25zdCBrZXkgaW4gY2FsbGJhY2tzKSB7XG5cdFx0XHRcdGNvbnN0IGNhbGxiYWNrRW50cnkgPSBjYWxsYmFja3Nba2V5XTtcblxuXHRcdFx0XHRpZiAoY2FsbGJhY2tFbnRyeS5jb25kaXRpb24gIT09IGNvbmRpdGlvbiAmJiBjYWxsYmFja0VudHJ5LmNvbmRpdGlvbiAhPT0gJ2Fsd2F5cycpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0cmVzdWx0W2tleV0gPSBleGVjdXRlKGNhbGxiYWNrRW50cnkuY2FsbGJhY2spO1xuXHRcdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHRcdHRoaXMuZXhjZXB0aW9uSGFuZGxlcihlcnJvcik7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2UuYWxsKHJlc3VsdCk7XG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgbm9vcCwgUm1Db3JlIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0SXRlbUNhY2hlRmFjdG9yeSxcblx0SXRlbUVudHJ5RmFjdG9yeSxcblx0SXRlbVJlc291cmNlRmFjdG9yeSxcblx0TW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0UXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0UXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMvQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQge1xuXHRBdXRoSW50ZXJmYWNlLFxuXHRFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxufSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25FZGl0UmVzb3VyY2UsXG5cdENvbGxlY3Rpb25FbnRyeSxcblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0Q29sbGVjdGlvblJlc291cmNlLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlLFxuXHRDb2xsZWN0aW9uVmlld1Jlc291cmNlLFxuXHRFZGl0UmVzb3VyY2UsXG5cdEl0ZW1FbnRyeSxcblx0SXRlbUVudHJ5T3B0aW9ucyxcblx0SXRlbVJlc291cmNlLFxuXHRMb2NhbFZpZXdSZXNvdXJjZSxcblx0UmVtb3RlVmlld1Jlc291cmNlLFxufSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpTGlua1RyZWVUeXBlLFxuXHRBcGlRdWVyeSxcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdENvbGxlY3Rpb25EZWZpbml0aW9uLFxuXHRDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcCxcblx0Q29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRDb252ZXJzaW9uTWFwLFxuXHRDcmVhdGVSZXF1ZXN0UGFyYW1ldGVyTWFwLFxuXHRFbnRyeVBhcmVudE51bGwsXG5cdEZpZWxkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXAsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0TGlua0NvbGxlY3Rpb25EZWZpbml0aW9uLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRTdGF0ZUtleVR5cGUsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YSB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFSZXN1bHQgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGFCYXNlJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9Db2xsZWN0aW9uRW50cnlTZXJ2aWNlJztcbmltcG9ydCB7IENvbHVtbkhhbmRsZXIgfSBmcm9tICcuLi8uLi9Db2x1bW5IYW5kbGVyJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi8uLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENvbHVtbkNhY2hlLFxuXHRoYXNQcm9wZXJ0aWVzLFxuXHRMb2NrU2VydmljZSxcblx0TW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uUmVzdWx0LFxuXHRPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja1R5cGUsXG5cdFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIsXG5cdFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlcyxcblx0VHJhbnNhY3Rpb25JdGVtSGFuZGxlcixcbn0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi8uLi9JbnRlcm5hbENoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vSXRlbUVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vS2V5U2VydmljZSc7XG5pbXBvcnQgeyBRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9RdWVyeVNlcnZpY2UnO1xuaW1wb3J0IHsgVGVtcGxhdGVDYWNoZSB9IGZyb20gJy4uLy4uL1RlbXBsYXRlQ2FjaGUnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4uL0Fic3RyYWN0Q2FjaGUnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3NvciB9IGZyb20gJy4uL0NvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3InO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuLi9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25FdmVudEhhbmRsZXIgfSBmcm9tICcuL1RyYW5zYWN0aW9uRXZlbnRIYW5kbGVyJztcblxudHlwZSBFZGl0UmVzb3VyY2VMaW5rczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gPSB7bWFpbjogRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4sIGxpbmtlZDogSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwfTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZSBUcmFuc2FjdGlvbkNhY2hlfSBpcyByZXNwb25zaWJsZSBmb3Iga2VlcGluZyB0cmFjayBvZiBuZXdseSBjcmVhdGVkIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9XG4gKiBhbmQge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cmllc30sIGFuZCB0aGUgY2hhbmdlcyBvZiBleGlzdGluZyBJdGVtRW50cmllcyBhbmQgQ29sbGVjdGlvbkVudHJpZXMuXG4gKlxuICogVGhlIFRyYW5zYWN0aW9uQ2FjaGUgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2VzfSwgd2hpY2ggaXMgYSBjb21iaW5hdGlvbiBvZiBhbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gYW5kIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uJ3MgY2hhbmdlcyBvbiB0aGlzIEl0ZW1FbnRyeVxuICovXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25DYWNoZVxuXHRleHRlbmRzIEFic3RyYWN0Q2FjaGUge1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogU3RvcmVzIHRoZSAncm9vdCcge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9LCB0aGlzIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBjYW4gYmUgdXNlZCBhcyByZXF1ZXN0IHBhcmVudCB0byBzdG9yZSB0aGUgd2hvbGUgdHJhbnNhY3Rpb24gYXQgb25jZVxuXHQgKi9cblx0cHVibGljIHJvb3RJdGVtOiBJdGVtRW50cnk8YW55PiB8IHVuZGVmaW5lZDtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFN0b3JlcyBhZGRpdGlvbmFsIHJlcXVlc3QgcGFyYW1ldGVycyBmb3Igd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgc3RvcmVkIHRvIHRoZSBzZXJ2ZXJcblx0ICovXG5cdHB1YmxpYyB0YWJSZXF1ZXN0UGFyYW1ldGVycyA9IHt9O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSXMgdHJ1ZSB3aGlsZSB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0gaXMgYXBwbHlpbmcgY2hhbmdlcyB0byB0aGUgcGFyZW50IChjYW4gZWl0aGVyIGJlIHRocm91Z2ggYSBtZXJnZSBvciBhbiBBcGkgc2F2ZSlcblx0ICovXG5cdHB1YmxpYyBpc1NhdmluZzogYm9vbGVhbiA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSXMgdHJ1ZSB3aGVuIHRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIGhhczpcblx0ICogLSBOZXdseSBjcmVhdGVkIGl0ZW1zXG5cdCAqIC0gUmVtb3ZlZCBpdGVtcyAoZnJvbSBjb2xsZWN0aW9ucylcblx0ICogLSBDaGFuZ2VzIG9uIGV4aXN0aW5nIGl0ZW1zXG5cdCAqL1xuXHRwdWJsaWMgaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVGhlIHRyYW5zYWN0aW9uJ3MgcGFyZW50XG5cdCAqL1xuXHRwdWJsaWMgcmVhZG9ubHkgcGFyZW50OiBBYnN0cmFjdENhY2hlO1xuXG5cdHB1YmxpYyByZWFkb25seSBpdGVtSGFuZGxlcjogVHJhbnNhY3Rpb25JdGVtSGFuZGxlcjtcblx0cHVibGljIHJlYWRvbmx5IGNvbGxlY3Rpb25IYW5kbGVyOiBUcmFuc2FjdGlvbkNvbGxlY3Rpb25IYW5kbGVyO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgZXZlbnRIYW5kbGVyOiBUcmFuc2FjdGlvbkV2ZW50SGFuZGxlcjtcblxuXHRwcml2YXRlIGNoYW5nZXNJbnRlcnZhbDogbnVsbCB8IG51bWJlciA9IG51bGw7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdGNvcmU6IFJtQ29yZSxcblx0XHRjb2x1bW5DYWNoZTogQ29sdW1uQ2FjaGUsXG5cdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXI6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdGF1dGhJbnRlcmZhY2U6IEF1dGhJbnRlcmZhY2UsXG5cdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRsb2NrU2VydmljZTogTG9ja1NlcnZpY2UsXG5cdFx0bW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTogTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0dGVtcGxhdGVDYWNoZTogVGVtcGxhdGVDYWNoZSxcblx0XHRpdGVtQ2FjaGVGYWN0b3J5OiBJdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk6IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0ZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0ZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0YXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0Y29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRjb2x1bW5TZXRGYWN0b3J5OiBDb2x1bW5TZXRGYWN0b3J5LFxuXHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0aXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeSxcblx0XHRpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHRcdGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0Y29sbGVjdGlvbkVudHJ5RmFjdG9yeTogQ29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeTogUXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuXHRcdGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHRcdHBhcmVudDogQWJzdHJhY3RDYWNoZSxcblx0XHQvKipcblx0XHQgKiBAZGVzY3JpcHRpb25cblx0XHQgKiBGb3IgZGVidWdnaW5nIHB1cnBvc2VzXG5cdFx0ICovXG5cdFx0cHVibGljIGlkPzogc3RyaW5nLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGNvcmUsXG5cdFx0XHRjb2x1bW5DYWNoZSxcblx0XHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0YXV0aEludGVyZmFjZSxcblx0XHRcdGNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0XHRsb2NrU2VydmljZSxcblx0XHRcdG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0aXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRcdHRlbXBsYXRlQ2FjaGUsXG5cdFx0XHRpdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdGV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHRwcm9taXNlU2VydmljZSxcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbHVtbkhhbmRsZXIsXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlTZXJ2aWNlLFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0bGlua1RyZWVTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHR0aGlzLnBhcmVudCA9IHBhcmVudDtcblxuXHRcdHRoaXMuaXRlbUhhbmRsZXIgPSBuZXcgVHJhbnNhY3Rpb25JdGVtSGFuZGxlcihcblx0XHRcdGNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0dGVtcGxhdGVDYWNoZSxcblx0XHRcdGNvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5IYW5kbGVyLFxuXHRcdFx0Y29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0aXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdGl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cblx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyID0gbmV3IFRyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXIoXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0Y29sdW1uSGFuZGxlcixcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXG5cdFx0dGhpcy5ldmVudEhhbmRsZXIgPSBuZXcgVHJhbnNhY3Rpb25FdmVudEhhbmRsZXIoXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0cHJvbWlzZVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBkZXN0cm95ICgpOiB2b2lkIHtcblx0XHR0aGlzLnBhcmVudC5vbkNoaWxkRGVzdHJveSh0aGlzKTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDaGFuZ2VzRGVsdGEgKCk6IENoYW5nZXNEZWx0YSB7XG5cdFx0cmV0dXJuIHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHRoZSBwYXNzZWQgY2hhbmdlcyBmcm9tIHRoZSBwYXJlbnQgVHJhbnNhY3Rpb24gaW50byB0aGlzIFRyYW5zYWN0aW9uJ3Mgb3duIGNoYW5nZXMgYW5kIHRoZW4gcHJvcGFnYXRlc1xuXHQgKiB0aGVtIHRvIGFsbCBjaGlsZCBUcmFuc2FjdGlvbnMsIHRoaXMgYXNzdW1lcyB0aGF0IGFuIGFjdGlvbiBpcyBhbHJlYWR5IGhhbmRsZWQgaW4gYSBwYXJlbnQsIHNvIGl0IGRvZXMndCBoYW5kbGUgY3JlYXRlZCBlbnRyaWVzXG5cdCAqIGFuZCByZW1vdmVzIGVudHJpZXMgdGhhdCB3ZXJlIGluIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtcyBkZWxldGVkSXRlbXN9IHNpbmNlIHRoZXkgYXJlIGFscmVhZHkgZGVsZXRlZFxuXHQgKlxuXHQgKiAtLS0tLS0tLS0tLS0tLS0tLS1cblx0ICpcblx0ICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNGcm9tUGFyZW50fSBhbmQge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGlzIHRoYXQgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCBhc3N1bWVzXG5cdCAqIHRoZSBjaGFuZ2UgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQsIGFuZCBhcHBseUNoYW5nZXNEZWx0YSB3aWxsIHByb2Nlc3MgdGhlIGNoYW5nZXMgb25jZSB5b3Ugc2F2ZSB0aGUgdHJhbnNhY3Rpb25cblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqIFVzZSB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YSBhcHBseUNoYW5nZXNEZWx0YX0gaWYgeW91IHdhbnQgdG8gYXBwbHkgY2hhbmdlcyBmcm9tIG91dHNpZGUgdGhlIGNvcmVcblx0ICpcblx0ICogQHBhcmFtIGludGVybmFsQ2hhbmdlc0RlbHRhIENoYW5nZXMgdG8gYmUgYXBwbGllZFxuXHQgKiBAcGFyYW0gaXNDYWxsZWRBZnRlckFwaVNhdmUgSWYgJ2lzQ2FsbGVkQWZ0ZXJBcGlTYXZlJyBpcyB0cnVlIGxvY2FsIGNoYW5nZXMgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4gKGluc3RlYWQgb2Ygb25seSB3aGVuIHRoZXJlIGFyZSBubyBjaGFuZ2VzKVxuXHQgKi9cblx0cHVibGljIGFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgKFxuXHRcdGludGVybmFsQ2hhbmdlc0RlbHRhOiBJbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRpc0NhbGxlZEFmdGVyQXBpU2F2ZTogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiB2b2lkIHtcblx0XHQvLyBXZSBkb24ndCBuZWVkIHRvIHByb2Nlc3MgY3JlYXRlZCBpdGVtcywgYmVzaWRlcyBjaGVja2luZyBpZiB0aGV5IGZpdCBpbiBjb2xsZWN0aW9uc1xuXHRcdC8vIGNyZWF0aW5nIGVudHJpZXMgaXMgYWxyZWFkeSBkb25lIGJ5IGBhcHBseUNoYW5nZXNEZWx0YWAgb24gYSBwYXJlbnQgdHJhbnNhY3Rpb25cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5wcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0dHVwbGUsXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlLFxuXHRcdFx0XHR0cnVlLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1SZXNvdXJjZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRpZiAodGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXggPSB0aGlzLml0ZW1IYW5kbGVyLmRlbGV0ZWRJdGVtc1tpdGVtRW50cnkuaXRlbVR5cGVdLmluZGV4T2YoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRcdGlmIChpbmRleCAhPT0gLTEpIHtcblx0XHRcdFx0XHRcdC8vIGlmIGFuIGl0ZW0gaXMgZGVsZXRlZCBvbiBhbm90aGVyIGNhY2hlIHdlIHNob3VsZG4ndCBhdHRlbXB0IGFub3RoZXIgcmVxdWVzdCwgc28gd2UgcmVtb3ZlIGl0IGZyb20gdGhlIHRvLWJlLWRlbGV0ZWQgYXJyYXlcblx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0uc3BsaWNlKFxuXHRcdFx0XHRcdFx0XHRpbmRleCxcblx0XHRcdFx0XHRcdFx0MSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5nZXRBbGxDb2xsZWN0aW9uc0J5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdCk7XG5cblx0XHRjb2xsZWN0aW9uTWF0Y2hlclxuXHRcdFx0LnByb2Nlc3NEZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdC5yZW1vdmVGcm9tQW5kQWRkVG9Db2xsZWN0aW9ucygpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gd2UgY291bGQgYXBwbHkgdGhlIGNoYW5nZXMgdG8gY2hpbGRyZW4gd2hpbGUgdGhlIHByb21pc2UgaXMgcnVubmluZ1xuXHRcdGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuXHRcdFx0Y2hpbGQuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChpbnRlcm5hbENoYW5nZXNEZWx0YSk7XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gZG8gd2Ugd2FudCB0aGlzPyBNYXliZSBhZnRlciBtZXJnaW5nIHRoZSBzZXJ2ZXIgY2hhbmdlcyB0aGVyZSdzIG5vIGNoYW5nZXMgYW55bW9yZVxuXHRcdHRoaXMuaGFzQ2hhbmdlcyA9IGZhbHNlO1xuXHRcdHRoaXMuZGV0ZWN0Q2hhbmdlcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBcHBsaWVzIGNoYW5nZXMgdG8gdGhpcyB0cmFuc2FjdGlvbiBhbmQgaXRzIGNoaWxkcmVuXG5cdCAqXG5cdCAqIC0tLS0tLS0tLS0tLS0tLS0tLVxuXHQgKlxuXHQgKiBUaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnR9IGFuZCB7QGxpbmsgVHJhbnNhY3Rpb25DYWNoZS5hcHBseUNoYW5nZXNEZWx0YX0gaXMgdGhhdCBhcHBseUNoYW5nZXNGcm9tUGFyZW50IGFzc3VtZXNcblx0ICogdGhlIGNoYW5nZSBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCwgYW5kIGFwcGx5Q2hhbmdlc0RlbHRhIHdpbGwgcHJvY2VzcyB0aGUgY2hhbmdlcyBpdHNlbGYgKHJlc3VsdCB2cyBjYXVzZSlcblx0ICpcblx0ICogLS0tLS0tLS0tLS0tLS0tLS0tXG5cdCAqXG5cdCAqIERpZmZlcnMgZnJvbSB7QGxpbmsgU2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGEgU2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGluIHRoZSBoYW5kbGluZyBvZiBkZWxldGVkIGVudHJpZXMgYW5kIHRoZSBhcHBseUNoYW5nZXNGcm9tUGFyZW50IGNhbGxcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNEZWx0YSAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0aWYgKFxuXHRcdFx0Y2hhbmdlc0RlbHRhLmNyZWF0ZWQubGVuZ3RoID09PSAwXG5cdFx0XHQmJiAhaGFzUHJvcGVydGllcyhjaGFuZ2VzRGVsdGEudXBkYXRlZClcblx0XHRcdCYmICFoYXNQcm9wZXJ0aWVzKGNoYW5nZXNEZWx0YS5kZWxldGVkKVxuXHRcdCkge1xuXHRcdFx0Ly8gZW1wdHkgZGVsdGEsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmdcblxuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbih7XG5cdFx0XHRcdGNyZWF0ZWQ6IFtdLFxuXHRcdFx0XHRyb2xsYmFjazogbm9vcCxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hVcGRhdGVkRGVyaXZlZFZhbHVlc0Zyb21EZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHtyZXN1bHQsIGludGVybmFsQ2hhbmdlc0RlbHRhLCByb2xsYmFja0Z1bmN0aW9uc30gPSBzdXBlci5fYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblxuXHRcdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgY2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5jbGVhcihpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdGNvbnN0IG9sZENoYW5nZXMgPSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRcdFx0XHRcdFx0ZGVsZXRlIGNoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeS5pZF07XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cdFx0XHRcdFx0XHRcdGRlbGV0ZSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1SZXNvdXJjZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRcdFx0XHRpZiAodGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gY2hlY2sgaWYgaXQncyBhbHJlYWR5IGluIHRoZSBhcnJheSA/XG5cdFx0XHRcdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV0ucHVzaChpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdGludGVybmFsQ2hhbmdlc0RlbHRhLnNldEl0ZW1EZWxldGVkKGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0XHRcdFx0cm9sbGJhY2tGdW5jdGlvbnMucHVzaChcblx0XHRcdFx0XHRcdFx0XHRyb2xsYmFja0RlbHRhID0+IHtcblx0XHRcdFx0XHRcdFx0XHRcdHJvbGxiYWNrRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdFx0XHRcdFx0b2xkQ2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGNvbGxlY3Rpb25NYXRjaGVyID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IoXG5cdFx0XHRcdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0XHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdFx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuXHRcdFx0XHRcdFx0Y2hpbGQuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChpbnRlcm5hbENoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gZG8gd2Ugd2FudCB0aGlzPyBNYXliZSBhZnRlciBtZXJnaW5nIHRoZSBzZXJ2ZXIgY2hhbmdlcyB0aGVyZSdzIG5vIGNoYW5nZXMgYW55bW9yZSwgY291bGQgYmUgYSBwZXJmb3JtYW5jZSB0aGluZ3lcblx0XHRcdFx0XHR0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTtcblx0XHRcdFx0XHR0aGlzLmRldGVjdENoYW5nZXMoKTtcblxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldFNlcnZlckNhY2hlICgpOiBTZXJ2ZXJDYWNoZSB7XG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldFNlcnZlckNhY2hlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIGVudHJ5J3MgcGFyZW50IGZyb20gdGhlIGNsb3Nlc3QgdHJhbnNhY3Rpb25cblx0ICpcblx0ICogQHBhcmFtIGl0ZW1FbnRyeSBUaGUgZW50cnkgdG8gZ2V0IHRoZSBwYXJlbnQgZnJvbVxuXHQgKiBAcGFyYW0gZnJvbUluaXRpYWwgSWYgYHRydWVgIHRoZSBwYXJlbnQgdmFsdWVzIHdpbGwgYmUgcmVhZCBmcm9tIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1FbnRyeUNoYW5nZXMuaW5pdGlhbCBpbml0aWFsfSAoVXNlZnVsIGZvciB3aGVuIHlvdSd2ZSBtb3ZlZCBhbiBlbnRyeSlcblx0ICovXG5cdC8vIHRvZG9bY2FjaGVdIHJlbmFtZSB0byBnZXRJdGVtUGFyZW50IG9yIGdldFBhcmVudE9iamVjdD9cblx0cHVibGljIGdldFBhcmVudCAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnksXG5cdFx0ZnJvbUluaXRpYWw6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogRW50cnlQYXJlbnROdWxsIHtcblx0XHRjb25zdCBjaGFuZ2VzVHVwbGUgPSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF07XG5cblx0XHRpZiAoY2hhbmdlc1R1cGxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnN0IGZpZWxkcyA9IGNoYW5nZXNUdXBsZVtmcm9tSW5pdGlhbCA/ICdpbml0aWFsJyA6ICdjaGFuZ2VzJ107XG5cblx0XHRcdGlmIChpdGVtRW50cnkuY29sdW1ucy5saW5rICE9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0aXRlbVR5cGU6IGl0ZW1FbnRyeS5jb2x1bW5zLmxpbmsuYXBpQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1JZDogZmllbGRzW2l0ZW1FbnRyeS5jb2x1bW5zLmxpbmsuaWRdLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZXNwb25zZUNvbHVtbnMgPSBpdGVtRW50cnkuY29sdW1ucy5yZXNwb25zZVtpdGVtRW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucy5pdGVtdHlwZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCYmIHJlc3BvbnNlQ29sdW1ucy5pdGVtICE9PSB1bmRlZmluZWRcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBmaWVsZHMuaXRlbXR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkOiBmaWVsZHMuaXRlbSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuZ2V0UGFyZW50KFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0ZnJvbUluaXRpYWwsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVHJhdmVyc2VzIHRoZSB0cmFuc2FjdGlvbiBjaGFpbiBhbmQgcmV0dXJucyB0aGUgY2hhbmdlcyBvZiB0aGUgaXRlbSBvbiB0aGUgZmlyc3QgdHJhbnNhY3Rpb25cblx0ICpcblx0ICogQHBhcmFtIGNvcHlGaWVsZHMgSWYgc2V0LCB3aWxsIGNhbGwge0BsaW5rIEFwaUZvcm1hdHRlci5jb3B5RmllbGRzIEFwaUZvcm1hdHRlci5jb3B5RmllbGRzfSwgb3RoZXJ3aXNlIGp1c3QgcmV0dXJucyB0aGUgb2JqZWN0XG5cdCAqL1xuXHRwdWJsaWMgZ2V0SXRlbUNoYW5nZXNSZWN1cnNpdmVseSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0XHRjb3B5RmllbGRzOiBib29sZWFuID0gdHJ1ZSxcblx0KTogRmllbGRNYXAge1xuXHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXTtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblxuXHRcdGlmIChcblx0XHRcdGNoYW5nZXMgIT09IHVuZGVmaW5lZFxuXHRcdFx0JiYgaXRlbUVudHJ5ICE9PSB1bmRlZmluZWRcblx0XHQpIHtcblx0XHRcdGlmICghY29weUZpZWxkcykge1xuXHRcdFx0XHRyZXR1cm4gY2hhbmdlcy5jaGFuZ2VzO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5hcGlGb3JtYXR0ZXIuY29weUZpZWxkcyhcblx0XHRcdFx0Y2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRpdGVtRW50cnlJZCxcblx0XHRcdGNvcHlGaWVsZHMsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyB0aGUge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2V9IGZyb20gdGhlIHRyYW5zYWN0aW9uLCBwcmV2ZW50aW5nIHRoZSB7QGxpbmsgSXRlbVJlc291cmNlLm9wdGlvbnMub25DaGFuZ2UgdGhlIG9uQ2hhbmdlIGNhbGxiYWNrfSBmcm9tIGJlaW5nIGNhbGxlZC5cblx0ICogWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZFxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIERvZXMgbm90IHJlbW92ZSBjaGFuZ2VzXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJJdGVtUmVzb3VyY2UgKHJlc291cmNlOiBJdGVtUmVzb3VyY2UpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlci5jbGVhclJlc291cmNlKHJlc291cmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyB0aGUge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBDb2xsZWN0aW9uUmVzb3VyY2V9IGZyb20gdGhlIHRyYW5zYWN0aW9uLCBwcmV2ZW50aW5nIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLm9wdGlvbnMub25BZGQgb25BZGR9IGFuZCB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlLm9wdGlvbnMub25SZW1vdmUgb25SZW1vdmV9IGNhbGxiYWNrcyBmcm9tIGJlaW5nIGNhbGxlZC5cblx0ICogWW91IHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gd2hlbiB0aGUgcmVzb3VyY2UgaXMgbm8gbG9uZ2VyIG5lZWRlZFxuXHQgKlxuXHQgKiBAcmVtYXJrXG5cdCAqIERvZXMgbm90IHJlbW92ZSBjaGFuZ2VzXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJDb2xsZWN0aW9uUmVzb3VyY2UgKHJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2UpOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jbGVhclJlc291cmNlKHJlc291cmNlKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB3aGV0aGVyIG9yIG5vdCB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUucm9vdEl0ZW0gcm9vdEl0ZW19IGlzIHVzZXMgbG9ja3Ncblx0ICovXG5cdHB1YmxpYyBpc0xvY2thYmxlICgpOiBib29sZWFuIHtcblx0XHRpZiAodGhpcy5yb290SXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucm9vdEl0ZW0uaXNMb2NrYWJsZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBEaXNhYmxlcyB0aGUgdHJhbnNhY3Rpb24ncyBjaGFuZ2VzIHdhdGNoZXIsIHRoZSB0cmFuc2FjdGlvbiB3aWxsIG5vIGxvbmdlciBhdXRvbWF0aWNhbGx5IGRldGVjdCBjaGFuZ2VzIG9uIGl0ZW1zXG5cdCAqL1xuXHRwdWJsaWMgZGlzYWJsZUNoYW5nZXNXYXRjaGVyICgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5jaGFuZ2VzSW50ZXJ2YWwgPT09IG51bGwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjbGVhckludGVydmFsKHRoaXMuY2hhbmdlc0ludGVydmFsKTtcblx0XHR0aGlzLmNoYW5nZXNJbnRlcnZhbCA9IG51bGw7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEVuYWJsZXMgdGhlIHRyYW5zYWN0aW9uJ3MgY2hhbmdlcyB3YXRjaGVyLCB0aGUgdHJhbnNhY3Rpb24gd2lsbCBub3cgYXV0b21hdGljYWxseSBkZXRlY3QgY2hhbmdlcyBvbiBpdGVtc1xuXHQgKi9cblx0cHVibGljIGVuYWJsZUNoYW5nZXNXYXRjaGVyICgpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5jaGFuZ2VzSW50ZXJ2YWwgIT09IG51bGwpIHtcblx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0J0NoYW5nZXMgd2F0Y2hlciBhbHJlYWR5IHJ1bm5pbmchJyxcblx0XHRcdFx0dGhpcyxcblx0XHRcdCk7XG5cdFx0XHR0aGlzLmRpc2FibGVDaGFuZ2VzV2F0Y2hlcigpO1xuXHRcdH1cblxuXHRcdHRoaXMuY2hhbmdlc0ludGVydmFsID0gd2luZG93LnNldEludGVydmFsKFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRpZiAoIXRoaXMuZGV0ZWN0Q2hhbmdlcygpKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dGhpcy5kaXNhYmxlQ2hhbmdlc1dhdGNoZXIoKTtcblxuXHRcdFx0XHRpZiAodGhpcy5pc0xvY2thYmxlKCkpIHtcblx0XHRcdFx0XHR0aGlzLmxvY2tTZXJ2aWNlLmZldGNoTG9jayh0aGlzLnJvb3RJdGVtISk7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHQzMDAwLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFNhdmVzIHRoZSB0cmFuc2FjdGlvbiwgdGhpcyBoYXMgYSBkaWZmZXJlbnQgZWZmZWN0IGRlcGVuZGluZyBvbiB0aGUgdHJhbnNhY3Rpb24ncyBwYXJlbnQuXG5cdCAqXG5cdCAqIC0gSWYgdGhlIHBhcmVudCBpcyBhbm90aGVyIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IGl0IHdpbGwgbWVyZ2UgdGhlIGNoYW5nZXMgb2YgdGhlIGNoaWxkIHRyYW5zYWN0aW9uIGluIHRoZSB0aGUgcGFyZW50IHRyYW5zYWN0aW9uXG5cdCAqIC0gSWYgdGhlIHBhcmVudCBpcyB0aGUge0BsaW5rIFNlcnZlckNhY2hlIFNlcnZlckNhY2hlfSBpdCB3aWxsIHNhdmUgdGhlIGNoYW5nZXMgdG8gdGhlIEFQaVxuXHQgKi9cblx0cHVibGljIHNhdmUgKFxuXHRcdGNsb3NlVGFiID0gZmFsc2UsXG5cdFx0cGFyYW1ldGVyczogQ3JlYXRlUmVxdWVzdFBhcmFtZXRlck1hcCA9IHt9LFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy5pc1NhdmluZykge1xuXHRcdFx0cmV0dXJuIHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCgpO1xuXHRcdH1cblxuXHRcdHRoaXMuaXNTYXZpbmcgPSB0cnVlO1xuXG5cdFx0dGhpcy5kZXRlY3RDaGFuZ2VzKCk7XG5cdFx0dGhpcy5kaXNhYmxlQ2hhbmdlc1dhdGNoZXIoKTtcblxuXHRcdGxldCBpdGVtSWRDb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdHRoaXMuaXNMb2NrYWJsZSgpXG5cdFx0XHRcdD8gdGhpcy5sb2NrU2VydmljZS5mZXRjaExvY2sodGhpcy5yb290SXRlbSEpXG5cdFx0XHRcdDogdGhpcy5wcm9taXNlU2VydmljZS53aGVuKClcblx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5leGVjdXRlQ2FsbGJhY2tzKFxuXHRcdFx0XHRcdFx0J29uQmVmb3JlU2F2ZScsXG5cdFx0XHRcdFx0XHRjYWxsYmFjayA9PiBjYWxsYmFjayh0aGlzKSxcblx0XHRcdFx0XHRcdGNsb3NlVGFiLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0dGhpcy50YWJSZXF1ZXN0UGFyYW1ldGVycyA9IHtcblx0XHRcdFx0XHRcdC4uLnRoaXMudGFiUmVxdWVzdFBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0XHQuLi5wYXJhbWV0ZXJzLFxuXHRcdFx0XHRcdH07XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5wYXJlbnQuYXBwbHlDaGFuZ2VzRnJvbUNoaWxkKFxuXHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdGJyZWFrVXBCeVBhcmVudCxcblx0XHRcdFx0XHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdF9pdGVtSWRDb252ZXJzaW9uTWFwID0+IHtcblx0XHRcdFx0XHRpdGVtSWRDb252ZXJzaW9uTWFwID0gX2l0ZW1JZENvbnZlcnNpb25NYXA7XG5cblx0XHRcdFx0XHR0aGlzLnRhYlJlcXVlc3RQYXJhbWV0ZXJzID0ge307XG5cblx0XHRcdFx0XHRpZiAodGhpcy5pc0xvY2thYmxlKCkpIHtcblx0XHRcdFx0XHRcdHRoaXMubG9ja1NlcnZpY2UuY2xlYXJMb2NrKHRoaXMucm9vdEl0ZW0hKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5leGVjdXRlQ2FsbGJhY2tzKFxuXHRcdFx0XHRcdFx0J29uU2F2ZVN1Y2Nlc3MnLFxuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPT4gY2FsbGJhY2soXG5cdFx0XHRcdFx0XHRcdHRoaXMsXG5cdFx0XHRcdFx0XHRcdGl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdFx0Y2xvc2VUYWIsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRpZiAoIWNsb3NlVGFiKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmVuYWJsZUNoYW5nZXNXYXRjaGVyKCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0dGhpcy5pc1NhdmluZyA9IGZhbHNlO1xuXG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW1JZENvbnZlcnNpb25NYXA7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC5jYXRjaChcblx0XHRcdFx0ZXJyb3IgPT4ge1xuXHRcdFx0XHRcdHRoaXMuaXNTYXZpbmcgPSBmYWxzZTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBkZXRlY3RDaGFuZ2VzICgpOiBib29sZWFuIHtcblx0XHRpZiAodGhpcy5oYXNDaGFuZ2VzKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5pdGVtSGFuZGxlci5kZXRlY3RDaGFuZ2VzKCkpIHtcblx0XHRcdHJldHVybiB0aGlzLmhhc0NoYW5nZXMgPSB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmhhc0NoYW5nZXMgPSBmYWxzZTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmVtb3ZlcyBhbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gdGhyb3VnaCBhbiB7QGxpbmsgSXRlbVJlc291cmNlIEl0ZW1SZXNvdXJjZX0gZnJvbSB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0gd2hpY2ggbWVhbnMgdGhhdCBjaGFuZ2VzIG9uIHRoaXMgZW50cnkgd2lsbCBubyBsb25nZXIgYmUgdHJhY2tlZC5cblx0ICovXG5cdHB1YmxpYyBjbGVhckl0ZW0gKGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPGFueT4pOiB2b2lkIHtcblx0XHR0aGlzLmNsZWFySXRlbUVudHJ5KGl0ZW1SZXNvdXJjZS5lbnRyeSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJlbW92ZXMgYW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IGZyb20gdGhlIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIFRyYW5zYWN0aW9uQ2FjaGV9IHdoaWNoIG1lYW5zIHRoYXQgY2hhbmdlcyBvbiB0aGlzIGVudHJ5IHdpbGwgbm8gbG9uZ2VyIGJlIHRyYWNrZWQuXG5cdCAqL1xuXHRwdWJsaWMgY2xlYXJJdGVtRW50cnkgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiB2b2lkIHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlci5jbGVhckl0ZW1FbnRyeShpdGVtRW50cnkpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBSZW1vdmVzIGEge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IHRocm91Z2ggYSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlIENvbGxlY3Rpb25SZXNvdXJjZX0gZnJvbSB0aGUge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgVHJhbnNhY3Rpb25DYWNoZX0gd2hpY2ggbWVhbnMgdGhhdCBjaGFuZ2VzIG9uIHRoaXMgY29sbGVjdGlvbiB3aWxsIG5vIGxvbmdlciBiZSB0cmFja2VkLlxuXHQgKi9cblx0cHVibGljIGNsZWFyQ29sbGVjdGlvbiAoY29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8YW55Pik6IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmNsZWFyRW50cnkoY29sbGVjdGlvblJlc291cmNlLmVudHJ5KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQWRkcyBhIGNhbGxiYWNrIHRoYXQgd2lsbCBmaXJlIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgc2F2ZWQsIHJlamVjdGluZyB0aGlzIGNhbGxiYWNrIHdpbGwgcHJldmVudCB0aGUgdHJhbnNhY3Rpb24gZnJvbSBzYXZpbmdcblx0ICovXG5cdHB1YmxpYyBvbkJlZm9yZVNhdmUgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGNhbGxiYWNrOiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tUeXBlWydvbkJlZm9yZVNhdmUnXSxcblx0XHRjb25kaXRpb24/OiBUcmFuc2FjdGlvbkNhY2hlQ2FsbGJhY2tDb25kaXRpb24sXG5cdFx0cHJpb3JpdHk/OiBudW1iZXIsXG5cdCk6ICgpID0+IHZvaWQge1xuXHRcdHJldHVybiB0aGlzLmV2ZW50SGFuZGxlci5yZWdpc3RlckNhbGxiYWNrKFxuXHRcdFx0J29uQmVmb3JlU2F2ZScsXG5cdFx0XHRrZXksXG5cdFx0XHRjYWxsYmFjayxcblx0XHRcdGNvbmRpdGlvbixcblx0XHRcdHByaW9yaXR5LFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFkZHMgYSBjYWxsYmFjayB0aGF0IHdpbGwgZmlyZSB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBzYXZlZCBzdWNjZXNzZnVsbHlcblx0ICovXG5cdHB1YmxpYyBvblNhdmVTdWNjZXNzIChcblx0XHRrZXk6IHN0cmluZyxcblx0XHRjYWxsYmFjazogVHJhbnNhY3Rpb25DYWNoZUNhbGxiYWNrVHlwZVsnb25TYXZlU3VjY2VzcyddLFxuXHRcdGNvbmRpdGlvbj86IFRyYW5zYWN0aW9uQ2FjaGVDYWxsYmFja0NvbmRpdGlvbixcblx0XHRwcmlvcml0eT86IG51bWJlcixcblx0KTogKCkgPT4gdm9pZCB7XG5cdFx0cmV0dXJuIHRoaXMuZXZlbnRIYW5kbGVyLnJlZ2lzdGVyQ2FsbGJhY2soXG5cdFx0XHQnb25TYXZlU3VjY2VzcycsXG5cdFx0XHRrZXksXG5cdFx0XHRjYWxsYmFjayxcblx0XHRcdGNvbmRpdGlvbixcblx0XHRcdHByaW9yaXR5LFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgYSB7QGxpbmsgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uUmVzdWx0IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdH0gZm9yIHRoZSB0cmFuc2FjdGlvblxuXHQgKi9cblx0cHVibGljIGdldE1vZHVsZUNoYW5nZXMgKCk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvblJlc3VsdCB7XG5cdFx0aWYgKHRoaXMucm9vdEl0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdObyByb290IGl0ZW0gZm9yIHRyYW5zYWN0aW9uIGNhY2hlICcgKyB0aGlzKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5tb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5XG5cdFx0XHQuY29uc3RydWN0KHRoaXMpXG5cdFx0XHQucHJvY2VzcygpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBVcGRhdGVzIHRoZSBwYXNzZWQgbWFwIHdpdGggdGhlIG5ldyB7QGxpbmsgQ29udmVyc2lvbk1hcCBDY29udmVyc2lvbk1hcH0gdmFsdWVzXG5cdCAqL1xuXHRwdWJsaWMgdXBkYXRlSXRlbUlkTWFwIChcblx0XHRjb2xsZWN0aW9uTWFwOiB7W2l0ZW1JZDogbnVtYmVyXTogYW55fSxcblx0XHRjb252ZXJzaW9uTWFwOiBDb252ZXJzaW9uTWFwLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAoY29udmVyc2lvbk1hcCA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBvbGRJZCBpbiBjb252ZXJzaW9uTWFwKSB7XG5cdFx0XHRjb25zdCBuZXdJZCA9IGNvbnZlcnNpb25NYXBbb2xkSWRdO1xuXG5cdFx0XHRpZiAoY29sbGVjdGlvbk1hcFtvbGRJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29sbGVjdGlvbk1hcFtuZXdJZF0gPSBjb2xsZWN0aW9uTWFwW29sZElkXTtcblx0XHRcdGRlbGV0ZSBjb2xsZWN0aW9uTWFwW29sZElkXTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZX0sXG5cdFx0Y29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCxcblx0KTogQ29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY2xvbmVDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvblJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDbG9uZXMgdGhlIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fSBhbmQgYWxsIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IGluIGl0LCBhbmQgc2V0cyB0aGUgcGFyZW50IG9mIHRoZSBuZXcgZW50cmllcy5cblx0ICogUmV0dXJucyBhIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlfSBvZiB0aGUgbmV3bHkgY2xvbmVkIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fVxuXHQgKi9cblx0cHVibGljIGNsb25lQ29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZTogQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpIHtcblx0XHRjb25zdCBwYXJlbnQgPSBvcHRpb25zLnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwgfHwgcGFyZW50ID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignUGFyZW50IHJlcXVpcmVkIGZvciBjbG9uZUNvbGxlY3Rpb24nKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2UoXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmNsb25lQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRjb2xsZWN0aW9uUmVzb3VyY2UuZW50cnksXG5cdFx0XHRcdHBhcmVudCxcblx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdCksXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY2xvbmVJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVJlc291cmNlOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNsb25lSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7cmVtb3RlOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNsb25lSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBDbG9uZXMgdGhlIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBhbmQgcmV0dXJucyBhIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfSBvZiB0aGUgbmV3bHkgY2xvbmVkIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fVxuXHQgKi9cblx0cHVibGljIGNsb25lSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1SZXNvdXJjZTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdCkge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdHRoaXMuaXRlbUhhbmRsZXIuY2xvbmVJdGVtRW50cnkoXG5cdFx0XHRjaGFuZ2VzRGVsdGEsXG5cdFx0XHRpdGVtUmVzb3VyY2UuZW50cnksXG5cdFx0KTtcblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGNoYW5nZXNEZWx0YVJlc3VsdCA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gY2hhbmdlc0RlbHRhUmVzdWx0LmNyZWF0ZWRbMF07XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2UoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0QWxsTGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldEFsbExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldEFsbExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRBbGxMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldEFsbExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldEFsbExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQucXVlcnkoXG5cdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0e1tsaW5rVHlwZV06IFsnaWQnXX0sXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmdldExpbmtDb2xsZWN0aW9ucyhcblx0XHRcdFx0XHRcdGxpbmtUeXBlLFxuXHRcdFx0XHRcdFx0cmVzcG9uc2UubGlua3NbbGlua1R5cGVdLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zRnJvbURlZjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRsaW5rSWRBcnJheTogSXRlbUlkW10sXG5cdFx0ZGVmaW5pdGlvbjogTGlua0NvbGxlY3Rpb25EZWZpbml0aW9uPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5mZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRsaW5rVHlwZSxcblx0XHRcdFx0bGlua0lkQXJyYXksXG5cdFx0XHRcdGRlZmluaXRpb24uaXRlbVR5cGUsXG5cdFx0XHRcdGRlZmluaXRpb24ub3B0aW9ucy5lbnRyeSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoY29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2VzKFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJpZXMsXG5cdFx0XHRcdFx0XHRkZWZpbml0aW9uLm9wdGlvbnMucmVzb3VyY2UsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRsaW5rSWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+Pj47XG5cblx0cHVibGljIGdldExpbmtDb2xsZWN0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGxpbmtUeXBlOiBJdGVtVHlwZSxcblx0XHRsaW5rSWRBcnJheTogSXRlbUlkW10sXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4+O1xuXG5cdHB1YmxpYyBnZXRMaW5rQ29sbGVjdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rVHlwZTogSXRlbVR5cGUsXG5cdFx0bGlua0lkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+PjtcblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua1R5cGU6IEl0ZW1UeXBlLFxuXHRcdGxpbmtJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCkge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZmV0Y2hMaW5rZWRDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0bGlua1R5cGUsXG5cdFx0XHRcdGxpbmtJZEFycmF5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0bmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+KSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlcyhcblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyaWVzLFxuXHRcdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25Gcm9tRGVmPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0ZGVmaW5pdGlvbjogQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGRlZmluaXRpb24uaXRlbVR5cGUsXG5cdFx0XHRcdGRlZmluaXRpb24ub3B0aW9ucy5lbnRyeSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRlbnRyeSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY3JlYXRlQ29sbGVjdGlvblJlc291cmNlKFxuXHRcdFx0XHRcdFx0ZW50cnksXG5cdFx0XHRcdFx0XHRkZWZpbml0aW9uLm9wdGlvbnMucmVzb3VyY2UsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlLCBlZGl0SXRlbXM6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRDb2xsZWN0aW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldENvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdENvbGxlY3Rpb246IHRydWUsIHJlbW90ZUl0ZW1zOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldENvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldENvbGxlY3Rpb248SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbkhhbmRsZXJcblx0XHRcdC5mZXRjaENvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdGVudHJ5ID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2UoXG5cdFx0XHRcdFx0XHRlbnRyeSxcblx0XHRcdFx0XHRcdG5ldyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbkRlZjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbk9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGl0ZW1UeXBlOiBpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnM6IHtcblx0XHRcdFx0ZW50cnk6IG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpLCAvLyB3ZSBuZWVkIHRoZSBkZWZhdWx0IGNvbHVtbiB2YWx1ZVxuXHRcdFx0XHRyZXNvdXJjZTogbmV3IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgZ2V0TGlua0NvbGxlY3Rpb25zRGVmPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRsaW5rRmllbGQ6IHN0cmluZyxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBMaW5rQ29sbGVjdGlvbkRlZmluaXRpb248SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGl0ZW1UeXBlOiBpdGVtVHlwZSxcblx0XHRcdGxpbmtGaWVsZDogbGlua0ZpZWxkLFxuXHRcdFx0b3B0aW9uczoge1xuXHRcdFx0XHRlbnRyeTogbmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyksIC8vIHdlIG5lZWQgdGhlIGRlZmF1bHQgY29sdW1uIHZhbHVlXG5cdFx0XHRcdHJlc291cmNlOiBuZXcgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdH0sXG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBnZXRJdGVtQnlTdGF0ZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0c3RhdGVLZXk6IEl0ZW1JZCB8IHN0cmluZyxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbUJ5U3RhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHN0YXRlS2V5OiBJdGVtSWQgfCBzdHJpbmcsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7cmVtb3RlOiB0cnVlfSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbUJ5U3RhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHN0YXRlS2V5OiBJdGVtSWQgfCBzdHJpbmcsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlcHJlY2F0ZWRcblx0ICogVXNlIGdldEl0ZW1CeUlkL2dldE5ld1Jlc291cmNlV2l0aElkXG5cdCAqXG5cdCAqIEByZW1hcmtzXG5cdCAqIHN0YXRlS2V5IGNhbiBiZSBhIGtleXdvcmQgb3IgYSBsb2NhbCBpZCAoaW4gY2FzZSBvZiBhIHJlZnJlc2gpXG5cdCAqL1xuXHRwdWJsaWMgZ2V0SXRlbUJ5U3RhdGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHN0YXRlS2V5OiBJdGVtSWQgfCBzdHJpbmcsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSB7fSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpIHtcblx0XHRjb25zdCBwYXJzZWRTdGF0ZUtleSA9IHRoaXMua2V5U2VydmljZS5wYXJzZVN0YXRlS2V5KHN0YXRlS2V5IGFzIHN0cmluZyk7XG5cblx0XHRpZiAocGFyc2VkU3RhdGVLZXkgPT09IG51bGwpIHtcblx0XHRcdGNvbnN0IGl0ZW1JZCA9IHN0YXRlS2V5IGFzIEl0ZW1JZDtcblxuXHRcdFx0aWYgKFxuXHRcdFx0XHQhdGhpcy5rZXlTZXJ2aWNlLmlzTG9jYWxJZChpdGVtSWQpXG5cdFx0XHRcdHx8IHRoaXMuaXRlbUhhbmRsZXIuZW50cmllc1xuXHRcdFx0XHRcdC5jb250YWlucyhcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5nZXRJdGVtQnlJZChcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0XHRpc1Jvb3QsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChwYXJzZWRTdGF0ZUtleS50eXBlID09PSBTdGF0ZUtleVR5cGUuRHVwbGljYXRlKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5nZXREdXBsaWNhdGVCeUlkKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cGFyc2VkU3RhdGVLZXkuaXRlbUlkIGFzIEl0ZW1JZCxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdGlzUm9vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0TmV3UmVzb3VyY2UoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRmYWxzZSxcblx0XHRcdGlzUm9vdCxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldER1cGxpY2F0ZUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGR1cGxpY2F0ZUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0cmV0dXJuTGlua3M6IHRydWUsXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2VMaW5rczxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0RHVwbGljYXRlQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0ZHVwbGljYXRlSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRyZXR1cm5MaW5rcz86IGJvb2xlYW4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldER1cGxpY2F0ZUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGR1cGxpY2F0ZUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgPSB7fSxcblx0XHRyZXR1cm5MaW5rcz86IGJvb2xlYW4sXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2VMaW5rczxJdGVtVHlwZVR5cGU+IHwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRpZiAob3B0aW9ucy50ZW1wbGF0ZU9wdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b3B0aW9ucy50ZW1wbGF0ZU9wdGlvbnMgPSB7fTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy50ZW1wbGF0ZU9wdGlvbnMuaXRlbSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvcHRpb25zLnRlbXBsYXRlT3B0aW9ucy5pdGVtID0gZHVwbGljYXRlSWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0TmV3UmVzb3VyY2VXaXRoSWQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHRoaXMua2V5U2VydmljZS5nZXRMb2NhbER1cGxpY2F0ZUlkKCksXG5cdFx0XHRvcHRpb25zIGFzIEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHRcdFx0cmV0dXJuTGlua3MsXG5cdFx0XHRpc1Jvb3QsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXROZXdSZXNvdXJjZVdpdGhJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0cmV0dXJuTGlua3M6IHRydWUsXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2VMaW5rczxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2VXaXRoSWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzPzogYm9vbGVhbixcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2VXaXRoSWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzOiBib29sZWFuID0gZmFsc2UsXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2VMaW5rczxJdGVtVHlwZVR5cGU+IHwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblxuXHRcdG9wdGlvbnMuZWRpdCA9IHRydWU7XG5cblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoTmV3SXRlbUVudHJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRuZXcgSXRlbUVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRkZWx0YVJlc3VsdCA9PiB7XG5cdFx0XHRcdFx0bGV0IG1haW5FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4gfCB1bmRlZmluZWQ7XG5cdFx0XHRcdFx0Y29uc3QgbGlua2VkRW50cmllc01hcDogSXRlbVR5cGVNYXA8SXRlbUVudHJ5W10+ID0ge307XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBkZWx0YVJlc3VsdC5jcmVhdGVkKSB7XG5cdFx0XHRcdFx0XHRpZiAoXG5cdFx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSA9PT0gaXRlbVR5cGVcblx0XHRcdFx0XHRcdFx0JiYgaXRlbUVudHJ5Lml0ZW1JZCA9PT0gaXRlbUlkXG5cdFx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdFx0bWFpbkVudHJ5ID0gaXRlbUVudHJ5O1xuXG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRpZiAobGlua2VkRW50cmllc01hcFtpdGVtRW50cnkuaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0bGlua2VkRW50cmllc01hcFtpdGVtRW50cnkuaXRlbVR5cGVdID0gW107XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdGxpbmtlZEVudHJpZXNNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG1haW5FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1RoZSBJdGVtRW50cnkgd2l0aCB0aGUgcmVxdWVzdGVkIEl0ZW1JZCB3YXMgbm90IGluIHRoZSB0ZW1wbGF0ZSByZXNwb25zZScpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IG1haW4gPSB0aGlzLmNyZWF0ZUl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHRcdFx0bWFpbkVudHJ5LFxuXHRcdFx0XHRcdFx0b3B0aW9ucyBhcyBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0XHRcdFx0XHRcdGlzUm9vdCxcblx0XHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGlmICghcmV0dXJuTGlua3MpIHtcblx0XHRcdFx0XHRcdHJldHVybiBtYWluO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGNvbnN0IGxpbmtlZCA9IHRoaXMucHJvY2Vzc0xpbmtlZEl0ZW1zKFxuXHRcdFx0XHRcdFx0bGlua2VkRW50cmllc01hcCxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRtYWluOiBtYWluLFxuXHRcdFx0XHRcdFx0bGlua2VkOiBsaW5rZWQsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXROZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0cmV0dXJuTGlua3M6IHRydWUsXG5cdFx0aXNSb290PzogYm9vbGVhbixcblx0KTogUHJvbWlzZUludGVyZmFjZTxFZGl0UmVzb3VyY2VMaW5rczxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0TmV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHJldHVybkxpbmtzPzogYm9vbGVhbixcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSBuZXcgSXRlbUVudHJ5IGFuZCByZXNvdXJjZVxuXHQgKi9cblx0cHVibGljIGdldE5ld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSA9IHt9LFxuXHRcdHJldHVybkxpbmtzPzogYm9vbGVhbixcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEVkaXRSZXNvdXJjZUxpbmtzPEl0ZW1UeXBlVHlwZT4gfCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzLmdldE5ld1Jlc291cmNlV2l0aElkKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHR0aGlzLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpLFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHJldHVybkxpbmtzLFxuXHRcdFx0aXNSb290LFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0SXRlbXNCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7ZWRpdDogdHJ1ZX0sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbXNCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7cmVtb3RlOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRJdGVtc0J5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIG11bHRpcGxlIGl0ZW1zIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBjaGFuZ2VzIG9mIHRoZSBjdXJyZW50IHtAbGluayBUcmFuc2FjdGlvbkNhY2hlIHRyYW5zYWN0aW9ufVxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1zQnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlID0ge30sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgZW50cnlPcHRpb25zID0gbmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyk7XG5cblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdGVudHJ5T3B0aW9ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoaXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+PikgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUl0ZW1SZXNvdXJjZXMoXG5cdFx0XHRcdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBnZXRJdGVtc0J5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHVibGljIGdldEl0ZW1zQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkczogSXRlbUlkW10sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7cmVtb3RlOiB0cnVlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxBcnJheTxSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4+O1xuXG5cdHB1YmxpYyBnZXRJdGVtc0J5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZHM6IEl0ZW1JZFtdLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgbXVsdGlwbGUgaXRlbXMgd2l0aCB0aGVpciByZXNwZWN0aXZlIGNoYW5nZXMgb2YgdGhlIGN1cnJlbnQge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgdHJhbnNhY3Rpb259XG5cdCAqL1xuXHRwdWJsaWMgZ2V0SXRlbXNCeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSA9IHt9LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj4ge1xuXG5cdFx0cmV0dXJuIHRoaXMuaXRlbUhhbmRsZXJcblx0XHRcdC5mZXRjaEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkcyxcblx0XHRcdFx0bmV3IEl0ZW1FbnRyeU9wdGlvbnMob3B0aW9ucyksXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4pID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2VzKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJpZXMsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0SXRlbUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXRJdGVtQnlJZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7cmVtb3RlOiB0cnVlfSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0SXRlbUJ5SWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBpdGVtIHdpdGggdGhlIGNoYW5nZXMgb2YgdGhlIGN1cnJlbnQge0BsaW5rIFRyYW5zYWN0aW9uQ2FjaGUgdHJhbnNhY3Rpb259XG5cdCAqXG5cdCAqIEBwYXJhbSBpc1Jvb3QgU2V0cyB0aGUgaXRlbSBhcyB0aGUgcm9vdCBpdGVtIG9mIHRoZSB0cmFuc2FjdGlvblxuXHQgKi9cblx0cHVibGljIGdldEl0ZW1CeUlkPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSA9IHt9LFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoSXRlbUVudHJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRuZXcgSXRlbUVudHJ5T3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoaXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPikgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLmNyZWF0ZUl0ZW1SZXNvdXJjZShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0XHRpc1Jvb3QsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB0aGUgdGl0bGUgb2YgYW4gaXRlbSwgZG9lcyBub3QgY3JlYXRlIGFuIHtAbGluayBJdGVtUmVzb3VyY2UgSXRlbVJlc291cmNlfVxuXHQgKi9cblx0cHVibGljIGZldGNoVGl0bGUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlci5mZXRjaFRpdGxlKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogTWVyZ2VzIHRoZSBwYXNzZWQgY2hpbGQgVHJhbnNhY3Rpb24gaW50byB0aGlzIHRyYW5zYWN0aW9uIGFuZCB0aGVuIHByb3BhZ2F0ZXMgdGhlbSB0byB0aGUgb3RoZXIgY2hpbGQgdHJhbnNhY3Rpb25zXG5cdCAqL1xuXHRwdWJsaWMgYXBwbHlDaGFuZ2VzRnJvbUNoaWxkIChcblx0XHRjaGlsZFRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdF9icmVha1VwQnlQYXJlbnQ/OiBib29sZWFuLFxuXHRcdF9vbkFmdGVyQ3JlYXRlQ2FsbGJhY2s/OiBPbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8SXRlbUlkQ29udmVyc2lvbk1hcD4ge1xuXHRcdGNvbnN0IGxpbmtUcmVlID0gdGhpcy5saW5rVHJlZVNlcnZpY2UuZ2V0KCk7XG5cdFx0Y29uc3QgaW50ZXJuYWxDaGFuZ2VzRGVsdGEgPSBjaGlsZFRyYW5zYWN0aW9uLmdldERlbHRhKCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIGludGVybmFsQ2hhbmdlc0RlbHRhLm1vdmVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLm1vdmVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0Ly8gQml0IG9mIGEgaGFjaywgYnV0IHdoZW4gbWVyZ2luZyB0cmFuc2FjdGlvbnMgd2Ugd2FudCB0byBoYW5kbGUgbW92ZXMgYXMgdXBkYXRlc1xuXHRcdFx0Ly8gV2Ugb25seSB3YW50IHRoZSBtb3ZlcyBpbiB0aGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gZG8gYSBsaW5rVG8gcmVxdWVzdCB3aGVuIHNhdmluZyB0byB0aGUgQVBJXG5cdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtVXBkYXRlZChcblx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHR0dXBsZS50byxcblx0XHRcdCk7XG5cblx0XHRcdGRlbGV0ZSBpbnRlcm5hbENoYW5nZXNEZWx0YS5tb3ZlZFtpdGVtRW50cnlJZF07XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnlJZCBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS51cGRhdGVkKSB7XG5cdFx0XHRjb25zdCB0dXBsZSA9IGludGVybmFsQ2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5SWRdO1xuXG5cdFx0XHRpZiAodGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXSA9IGNoaWxkVHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbdHVwbGUuZW50cnkuaWRdO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5wcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyhcblx0XHRcdFx0XHR0dXBsZSxcblx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuY3JlYXRlZCkge1xuXHRcdFx0Y29uc3QgdHVwbGUgPSBpbnRlcm5hbENoYW5nZXNEZWx0YS5jcmVhdGVkW2l0ZW1FbnRyeUlkXTtcblxuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmFkZCh0dXBsZS5lbnRyeSk7XG5cdFx0XHRjaGlsZFRyYW5zYWN0aW9uLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIodHVwbGUuZW50cnkpO1xuXG5cdFx0XHRjb25zdCBsb2NhbENoYW5nZXMgPSB0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeUlkXSA9IGNoaWxkVHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbdHVwbGUuZW50cnkuaWRdO1xuXHRcdFx0Y29uc3QgbmV3RGlzcGxheU5hbWUgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0RGlzcGxheU5hbWUoXG5cdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRsb2NhbENoYW5nZXMuY2hhbmdlcyxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChuZXdEaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGxvY2FsQ2hhbmdlcy5jaGFuZ2VzLmRpc3BsYXluYW1lID0gbmV3RGlzcGxheU5hbWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0aGlzLnJvb3RJdGVtICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29uc3QgbGlua05vZGUgPSBsaW5rVHJlZVt0aGlzLnJvb3RJdGVtLml0ZW1UeXBlXVt0dXBsZS5lbnRyeS5pdGVtVHlwZV07XG5cblx0XHRcdFx0aWYgKGxpbmtOb2RlICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRpZiAobGlua05vZGUudHlwZSA9PT0gQXBpTGlua1RyZWVUeXBlLklURU1UQUJMRSkge1xuXHRcdFx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMuaXRlbXR5cGUgPSB0aGlzLnJvb3RJdGVtLml0ZW1UeXBlO1xuXHRcdFx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXMuaXRlbSA9IHRoaXMucm9vdEl0ZW0uaXRlbUlkO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAobGlua05vZGUudHlwZSA9PT0gQXBpTGlua1RyZWVUeXBlLkRJUkVDVCkge1xuXHRcdFx0XHRcdFx0bG9jYWxDaGFuZ2VzLmNoYW5nZXNbbGlua05vZGUuZmllbGRdID0gdGhpcy5yb290SXRlbS5pdGVtSWQ7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cdFx0XHRpZiAodGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbVR5cGVdID0gW107XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGludGVybmFsQ2hhbmdlc0RlbHRhLmRlbGV0ZWRbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdC8vIGlmIGFuIGl0ZW1FbnRyeSB3YXMgYSBsb2NhbCBlbnRyeSBvbiBhIGNoaWxkIHRyYW5zYWN0aW9uLCBpdCdzIGltcG9zc2libGUgdGhhdCBpdCBpcyBvbiB0aGlzIHRyYW5zYWN0aW9uXG5cdFx0XHRcdGlmIChpdGVtRW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5kZWxldGVkSXRlbXNbaXRlbVR5cGVdLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmhhc0NoYW5nZXMgPSB0cnVlO1xuXG5cdFx0cmV0dXJuIHRoaXMuZXhwYW5kSXRlbXNGcm9tRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IGNvbGxlY3Rpb25NYXRjaGVyID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IoXG5cdFx0XHRcdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0XHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0XHRcdFx0dGhpcyxcblx0XHRcdFx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdFx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuXHRcdFx0XHRcdFx0aWYgKGNoaWxkID09PSBjaGlsZFRyYW5zYWN0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KGludGVybmFsQ2hhbmdlc0RlbHRhKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEuaXRlbUlkQ29udmVyc2lvbk1hcDtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgYW4gYWxyZWFkeSBjYWNoZWQge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cnl9IGFuZCB0aGUgY2hhbmdlcyBvZiB0aGlzIHNwZWNpZmljIHRyYW5zYWN0aW9uIGZvciB0aGF0IGVudHJ5XG5cdCAqL1xuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlDaGFuZ2VzVHVwbGUgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdCk6IHtcblx0XHRlbnRyeTogSXRlbUVudHJ5LFxuXHRcdGNoYW5nZXM6IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlc1xuXHR9IHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblxuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byBnZXQgYSBsb2NhbCBJdGVtRW50cnkgd2l0aCBlbnRyeUlkICcke2l0ZW1FbnRyeUlkfScgYnV0IGNvdWxkbid0IGZpbmQgaXRgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZW50cnk6IGl0ZW1FbnRyeSxcblx0XHRcdGNoYW5nZXM6IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgYW4gSXRlbUVudHJ5IGZyb20gdGhlIGNhY2hlLCBkb2Vzbid0IGRvIGEgQVBJIHJlcXVlc3QsIHVzZWQgZm9yIHNhdmluZ1xuXHQgKi9cblx0cHVibGljIGdldExvY2FsSXRlbUVudHJ5IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5nZXRCeUVudHJ5SWQoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBhcmVudC5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgYW4gSXRlbUVudHJ5IGZyb20gdGhlIGNhY2hlIGJ5IEl0ZW1JZFxuXHQgKi9cblx0cHVibGljIGdldExvY2FsSXRlbUVudHJ5QnlJdGVtSWQgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1FbnRyeVsnaXRlbUlkJ10sXG5cdCk6IEl0ZW1FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBpdGVtRW50cnk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldExvY2FsSXRlbUVudHJ5QnlJdGVtSWQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIGFuIENvbGxlY3Rpb25FbnRyeSBmcm9tIHRoZSBjYWNoZSwgZG9lc24ndCBkbyBhIEFQSSByZXF1ZXN0LCB1c2VkIGZvciBzYXZpbmdcblx0ICovXG5cdHB1YmxpYyBnZXRMb2NhbENvbGxlY3Rpb25FbnRyeSAoY29sbGVjdGlvbkVudHJ5SWQ6IENvbGxlY3Rpb25FbnRyeVsnaWQnXSk6IENvbGxlY3Rpb25FbnRyeSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldEJ5RW50cnlJZChjb2xsZWN0aW9uRW50cnlJZCk7XG5cblx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGFyZW50LmdldExvY2FsQ29sbGVjdGlvbkVudHJ5KGNvbGxlY3Rpb25FbnRyeUlkKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogUmV0dXJucyB0aGUgY29tcGxldGUge0BsaW5rIEludGVybmFsQ2hhbmdlc0RlbHRhIEludGVybmFsQ2hhbmdlc0RlbHRhfSBvZiB0aGUgVHJhbnNhY3Rpb25DYWNoZSwgdGhpcyBvbmx5IHRha2VzIGludG8gYWNjb3VudCB0aGUgZW5kIHJlc3VsdCAoaW5pdGlhbCBpcyBjb21wYXJlZCB0byBjaGFuZ2VzKSwgc28gY2hhbmdpbmcgc29tZXRoaW5nIGFuZCByZXZlcnRpbmcgaXRcblx0ICogd29uJ3QgYmUgaW5jbHVkZWRcblx0ICovXG5cdHB1YmxpYyBnZXREZWx0YSAoKTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEge1xuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3RJbnRlcm5hbERlbHRhKCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeUlkIGluIHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXMpIHtcblx0XHRcdGNvbnN0IHR1cGxlID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZShOdW1iZXIoaXRlbUVudHJ5SWQpKTtcblxuXHRcdFx0Ly8gQW4gaXRlbSBjYW4gYmUgdXNlZCBieSBhIDJuZCsgbGV2ZWwgY2hpbGQgVHJhbnNhY3Rpb25DYWNoZSwgaXQgd2lsbCBiZSBsb2NhbCB0aGFuIGJ1dCBpdCBzaG91bGQgb25seSBjb3VudCBhcyBhIGNyZWF0ZVxuXHRcdFx0Ly8gb24gdGhlIHRyYW5zYWN0aW9uIHRoYXQgYWN0dWFsbHkgY3JlYXRlZCB0aGUgZW50cnlcblx0XHRcdGlmIChcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmNvbnRhaW5zKFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0KVxuXHRcdFx0XHQmJiB0dXBsZS5lbnRyeS5pc0xvY2FsKClcblx0XHRcdCkge1xuXHRcdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbUNyZWF0ZWQoXG5cdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBuZXdQYXJlbnQgPSB0aGlzLmdldFBhcmVudChcblx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAobmV3UGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRcdGNvbnN0IG9sZFBhcmVudCA9IHRoaXMuZ2V0UGFyZW50KFxuXHRcdFx0XHRcdHR1cGxlLmVudHJ5LFxuXHRcdFx0XHRcdHRydWUsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdCF0aGlzLml0ZW1FbnRyeVNlcnZpY2UubWF0Y2hQYXJlbnQoXG5cdFx0XHRcdFx0XHRvbGRQYXJlbnQsXG5cdFx0XHRcdFx0XHRuZXdQYXJlbnQsXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHQpIHtcblx0XHRcdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkKFxuXHRcdFx0XHRcdFx0dHVwbGUuZW50cnksXG5cdFx0XHRcdFx0XHRuZXdQYXJlbnQsXG5cdFx0XHRcdFx0KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdC8vIGhhc0NoYW5nZXMgb25seSB0YWtlcyB3cml0YWJsZSBjb2x1bW5zIGludG8gYWNjb3VudCBieSBkZWZhdWx0LCBzbyBqdXN0IG1vdmluZyBzb21ldGhpbmcgZG9lc24ndCBjb3VudCBhcyBhbiB1cGRhdGVcblx0XHRcdFx0IXRoaXMuYXBpRm9ybWF0dGVyLmhhc0NoYW5nZXMoXG5cdFx0XHRcdFx0dHVwbGUuY2hhbmdlcy5pbml0aWFsLFxuXHRcdFx0XHRcdHR1cGxlLmNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0XHR0dXBsZS5lbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHR0dXBsZS5lbnRyeSxcblx0XHRcdFx0dHVwbGUuY2hhbmdlcy5jaGFuZ2VzLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zKSB7XG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbXNEZWxldGVkKHRoaXMuaXRlbUhhbmRsZXIuZGVsZXRlZEl0ZW1zW2l0ZW1UeXBlXSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNoYW5nZXNEZWx0YTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpOiBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHRcdGlzUm9vdD86IGJvb2xlYW4sXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpOiBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0XHRpc1Jvb3Q/OiBib29sZWFuLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KTogTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPjtcblxuXHQvLyB0b2RvW2NhY2hlXSBtb3ZlIHRvIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXJcblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0aXNSb290OiBib29sZWFuID0gZmFsc2UsXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpIHtcblx0XHRpZiAoaXNSb290KSB7XG5cdFx0XHR0aGlzLnJvb3RJdGVtID0gaXRlbUVudHJ5O1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLml0ZW1IYW5kbGVyLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID0ge1xuXHRcdFx0XHRpbml0aWFsOiB0aGlzLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoaXRlbUVudHJ5LmlkKSxcblx0XHRcdFx0Y2hhbmdlczogdGhpcy5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KGl0ZW1FbnRyeS5pZCksXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc291cmNlID0gdGhpcy5pdGVtUmVzb3VyY2VGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXNOZXcsXG5cdFx0KTtcblxuXHRcdHRoaXMuaXRlbUhhbmRsZXIuYWRkUmVzb3VyY2UocmVzb3VyY2UpO1xuXG5cdFx0cmV0dXJuIHJlc291cmNlO1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHQpOiBBcnJheTxFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUl0ZW1SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdCk6IEFycmF5PFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY3JlYXRlSXRlbVJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdCk6IEFycmF5PExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVJdGVtUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSxcblx0KTogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBjb25zdHJ1Y3RvciA9IHRoaXMuaXRlbVJlc291cmNlRmFjdG9yeS5nZXRDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHRoaXMsXG5cdFx0KTtcblxuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0aWYgKHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdFx0XHRpbml0aWFsOiB0aGlzLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaWQsXG5cdFx0XHRcdFx0XHR0cnVlLFxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0Y2hhbmdlczogdGhpcy5nZXRJdGVtQ2hhbmdlc1JlY3Vyc2l2ZWx5KFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LmlkLFxuXHRcdFx0XHRcdFx0dHJ1ZSxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZXNvdXJjZSA9IGNvbnN0cnVjdG9yKGl0ZW1FbnRyeSk7XG5cblx0XHRcdHJlc3VsdC5wdXNoKHJlc291cmNlKTtcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIuYWRkUmVzb3VyY2UocmVzb3VyY2UpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgcHJvY2Vzc0xpbmtlZEl0ZW1zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua2VkRW50cmllczogSXRlbVR5cGVNYXA8SXRlbUVudHJ5W10+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge2VkaXQ6IHRydWV9LFxuXHQpOiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXA8RWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBwcm9jZXNzTGlua2VkSXRlbXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRsaW5rZWRFbnRyaWVzOiBJdGVtVHlwZU1hcDxJdGVtRW50cnlbXT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UgJiB7cmVtb3RlOiB0cnVlfSxcblx0KTogSXRlbVJlc291cmNlc0l0ZW1UeXBlTWFwPFJlbW90ZVZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgcHJvY2Vzc0xpbmtlZEl0ZW1zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0bGlua2VkRW50cmllczogSXRlbVR5cGVNYXA8SXRlbUVudHJ5W10+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpOiBJdGVtUmVzb3VyY2VzSXRlbVR5cGVNYXA8TG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIHByb2Nlc3NMaW5rZWRJdGVtcyAoXG5cdFx0bGlua2VkRW50cmllczogSXRlbVR5cGVNYXA8SXRlbUVudHJ5W10+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHQpIHtcblx0XHRjb25zdCByZXN1bHQ6IEl0ZW1SZXNvdXJjZXNJdGVtVHlwZU1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBsaW5rZWRFbnRyaWVzKSB7XG5cdFx0XHRyZXN1bHRbaXRlbVR5cGVdID0gdGhpcy5jcmVhdGVJdGVtUmVzb3VyY2VzKFxuXHRcdFx0XHRsaW5rZWRFbnRyaWVzW2l0ZW1UeXBlXSxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyaWVzOiBDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHJpdmF0ZSBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+Pj47XG5cblx0cHJpdmF0ZSBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJpZXM6IENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcDxDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+PjtcblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPixcblx0KTogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA8Q29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSwgSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4+PiB7XG5cdFx0Y29uc3QgcmVzdWx0OiB7W3BhcmVudElkOiBzdHJpbmddOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPn0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgcGFyZW50SWQgaW4gY29sbGVjdGlvbkVudHJpZXMpIHtcblx0XHRcdHJlc3VsdFtwYXJlbnRJZF0gPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZShcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJpZXNbcGFyZW50SWRdLFxuXHRcdFx0XHRyZXNvdXJjZU9wdGlvbnMsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWUsIGVkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgY3JlYXRlQ29sbGVjdGlvblJlc291cmNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRyZXNvdXJjZU9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZSwgZWRpdENvbGxlY3Rpb246IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRJdGVtczogdHJ1ZX0sXG5cdCk6IENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7cmVtb3RlSXRlbXM6IHRydWV9LFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdHJlc291cmNlT3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cmVzb3VyY2VPcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGUsIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cblx0XHRpZiAodGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXSA9IFtdO1xuXG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlciA9IG5ldyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yKFxuXHRcdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdCgpID0+IFtjb2xsZWN0aW9uRW50cnldLFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgdHJhbnNhY3Rpb25zOiBBYnN0cmFjdENhY2hlW10gPSB0aGlzLmdldFRyYW5zYWN0aW9uQ2hhaW4oKTtcblxuXHRcdFx0Zm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiB0cmFuc2FjdGlvbnMpIHtcblx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXMgPSB0cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5lbnRyaWVzLmdldEJ5SXRlbVR5cGUoY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlKTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXMgPSB0aGlzLmdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaWQsXG5cdFx0XHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29sbGVjdGlvbk1hdGNoZXIuZXhwYW5kKFxuXHRcdFx0XHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0XHRcdFx0Y2hhbmdlcyxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyLnJlbW92ZUZyb21BbmRBZGRUb0NvbGxlY3Rpb25zKCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb3VyY2UgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0cmVzb3VyY2VPcHRpb25zLFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlci5hZGRSZXNvdXJjZShyZXNvdXJjZSk7XG5cblx0XHRyZXR1cm4gcmVzb3VyY2U7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFJldHVybnMgdGhpcyB0cmFuc2FjdGlvbiBhbmQgYWxsIHBhcmVudHNcblx0ICovXG5cdHB1YmxpYyBnZXRUcmFuc2FjdGlvbkNoYWluICgpOiBBYnN0cmFjdENhY2hlW10ge1xuXHRcdGNvbnN0IHRyYW5zYWN0aW9uczogQWJzdHJhY3RDYWNoZVtdID0gW107XG5cdFx0bGV0IHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlID0gdGhpcztcblxuXHRcdGRvIHtcblx0XHRcdHRyYW5zYWN0aW9ucy5wdXNoKHRyYW5zYWN0aW9uKTtcblxuXHRcdFx0Ly8gQHRzLWlnbm9yZSB3aGlsZSBsb29wIHdpbGwgYnJlYWtcblx0XHRcdHRyYW5zYWN0aW9uID0gdHJhbnNhY3Rpb24ucGFyZW50O1xuXHRcdH0gd2hpbGUgKHRyYW5zYWN0aW9uICE9PSBudWxsKTtcblxuXHRcdHJldHVybiB0cmFuc2FjdGlvbnM7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYWxsIHJlcXVpcmVkIGNvbHVtbnMgdG8gbWF0Y2gvZml0IGluIGNvbGxlY3Rpb25zXG5cdCAqL1xuXHRwcml2YXRlIGV4cGFuZEl0ZW1zRnJvbURlbHRhIChkZWx0YTogSW50ZXJuYWxDaGFuZ2VzRGVsdGEpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1FbnRyeVtdW10+IHtcblx0XHRjb25zdCBpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBJdGVtRW50cnlbXX0gPSB7fTtcblx0XHRjb25zdCBjb2x1bW5zUGVySXRlbVR5cGVNYXA6IHtbaXRlbVR5cGU6IHN0cmluZ106IEFwaVJlcXVlc3RDb2x1bW5zfSA9IHt9O1xuXG5cdFx0Y29uc3QgYWRkRW50cnkgPVxuXHRcdFx0aXRlbUVudHJ5ID0+IHtcblx0XHRcdFx0aWYgKGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXBbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0aXRlbUVudHJpZXNQZXJJdGVtVHlwZU1hcFtpdGVtRW50cnkuaXRlbVR5cGVdID0gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpdGVtRW50cmllc1Blckl0ZW1UeXBlTWFwW2l0ZW1FbnRyeS5pdGVtVHlwZV0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gZGVsdGEuY3JlYXRlZCkge1xuXHRcdFx0YWRkRW50cnkoZGVsdGEuY3JlYXRlZFtpdGVtRW50cnlJZF0uZW50cnkpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gZGVsdGEudXBkYXRlZCkge1xuXHRcdFx0YWRkRW50cnkoZGVsdGEudXBkYXRlZFtpdGVtRW50cnlJZF0uZW50cnkpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gaXRlbUVudHJpZXNQZXJJdGVtVHlwZU1hcCkge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmdldEFsbENvbGxlY3Rpb25zQnlJdGVtVHlwZShpdGVtVHlwZSk7XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cblx0XHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNvbGxlY3Rpb25FbnRyaWVzKSB7XG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5leHBhbmQoY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb2x1bW5zUGVySXRlbVR5cGVNYXBbaXRlbVR5cGVdID0gY29sdW1uRXhwYW5zaW9uLmdldCgpW2l0ZW1UeXBlXTtcblx0XHR9XG5cblx0XHRjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZUludGVyZmFjZTxJdGVtRW50cnlbXT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGNvbHVtbnNQZXJJdGVtVHlwZU1hcCkge1xuXHRcdFx0cHJvbWlzZXMucHVzaChcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5leHBhbmRMb2NhbEl0ZW1FbnRyaWVzKFxuXHRcdFx0XHRcdGRlbHRhLFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW1FbnRyaWVzUGVySXRlbVR5cGVNYXBbaXRlbVR5cGVdLFxuXHRcdFx0XHRcdGNvbHVtbnNQZXJJdGVtVHlwZU1hcFtpdGVtVHlwZV0sXG5cdFx0XHRcdFx0dGhpcy5jb2x1bW5DYWNoZVxuXHRcdFx0XHRcdFx0LnJldHJpZXZlKFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0Y29sdW1uc1Blckl0ZW1UeXBlTWFwW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdClcblx0XHRcdFx0XHRcdC5jYWNoZWQsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLmFsbChwcm9taXNlcyk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q2hhbmdlc0Zyb21JdGVtQ2hhbmdlczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gKFxuXHRcdGNoYW5nZXNPYmplY3Q6IFRyYW5zYWN0aW9uSXRlbUVudHJ5Q2hhbmdlczxJdGVtVHlwZVR5cGU+LFxuXHQpOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gY2hhbmdlc09iamVjdC5jaGFuZ2VzO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgQ29sbGVjdGlvblJlc291cmNlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENvbGxlY3Rpb25NYXRjaFJlc3VsdCwgQ29sbGVjdGlvblF1ZXJ5LCBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4vY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcblxuZW51bSBDT05TVEFOVFMge1xuXHRNQVlCRSA9ICdtYXliZSdcbn1cblxudHlwZSBDb2xsZWN0aW9uRW50cnlNYXAgPSB7XG5cdFtpdGVtVHlwZTogc3RyaW5nXToge1xuXHRcdFtjb2xsZWN0aW9uRW50cnlJZDogbnVtYmVyXTogQ29sbGVjdGlvbkVudHJ5PGFueT5cblx0fVxufTtcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25DYWNoZSB7XG5cdHByaXZhdGUgZW50cmllczogQ29sbGVjdGlvbkVudHJ5TWFwID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBnZXRCeUVudHJ5SWQgKGNvbGxlY3Rpb25FbnRyeUlkOiBDb2xsZWN0aW9uRW50cnlbJ2lkJ10pOiBDb2xsZWN0aW9uRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gdGhpcy5lbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdW2NvbGxlY3Rpb25FbnRyeUlkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnRhaW5zIChjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBlbnRyaWVzW2NvbGxlY3Rpb25FbnRyeS5pZF0gIT09IHVuZGVmaW5lZDtcblx0fVxuXG5cdHNvbWUgKGNhbGxiYWNrOiAoZW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+KSA9PiBib29sZWFuKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGlmIChjYWxsYmFjayhlbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGZvckVhY2ggKGNhbGxiYWNrOiAoZW50cnk6IENvbGxlY3Rpb25FbnRyeTxhbnk+KSA9PiB2b2lkKTogdm9pZCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNhbGxiYWNrKGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvKlx0ZmlsdGVyIChjYWxsYmFjazogKGVudHJ5OiBDb2xsZWN0aW9uRW50cnkpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0IGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdCBjb25zdCBmaWx0ZXJlZEVudHJpZXM6IENvbGxlY3Rpb25FbnRyeU1hcCAgPSB7fTtcblxuXHQgZm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdCBmaWx0ZXJlZEVudHJpZXNbaXRlbVR5cGVdID0ge307XG5cblx0IGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHQgY29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF07XG5cblx0IGlmIChjYWxsYmFjayhjb2xsZWN0aW9uRW50cnkpKVxuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXVtlbnRyeUlkXSA9IGNvbGxlY3Rpb25FbnRyeTtcblx0IH1cblx0IH1cblxuXHQgdGhpcy5lbnRyaWVzID0gZmlsdGVyZWRFbnRyaWVzO1xuXHQgfVxuXHQgKi9cblx0dG9BcnJheSAoKSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCByZXN1bHQ6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxhbnk+PiA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtVHlwZV1bZW50cnlJZF0pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRhZGQ8VCBleHRlbmRzIENvbGxlY3Rpb25FbnRyeTxhbnk+PiAoY29sbGVjdGlvbkVudHJ5OiBUKTogVCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGlmIChlbnRyaWVzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbnRyaWVzW2l0ZW1UeXBlXVtjb2xsZWN0aW9uRW50cnkuaWRdID0gY29sbGVjdGlvbkVudHJ5O1xuXHR9XG5cblx0Y2xlYXIgKGNvbGxlY3Rpb25FbnRyeT86IENvbGxlY3Rpb25FbnRyeTxhbnk+KTogYm9vbGVhbiB7XG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLmVudHJpZXMgPSB7fTtcblxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLmNvbnRhaW5zKGNvbGxlY3Rpb25FbnRyeSkpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVsZXRlIHRoaXMuZW50cmllc1tjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGVdW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cdH1cblxuXHRnZXRCeUl0ZW1UeXBlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoaXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRyZXN1bHQucHVzaChlbnRyaWVzW2VudHJ5SWRdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0bWF0Y2hQYXJlbnQgKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PGFueT4sXG5cdFx0aXRlbVR5cGU6IHN0cmluZyxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KSB7XG5cdFx0Y29uc3QgcGFyZW50ID0gY29sbGVjdGlvbkVudHJ5LnBhcmVudDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHQvLyA9PSB0byBjb21wYXJlIGl0ZW1JZHNcblx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdHJldHVybiBwYXJlbnQuaXRlbVR5cGUgPT09IGl0ZW1UeXBlICYmIHBhcmVudC5pdGVtSWQgPT0gaXRlbUlkO1xuXHR9XG5cblx0Ly8gVE9ETzogdGhpbmsgb2YgYmV0dGVyIG5hbWVcblx0Z2V0QnlQYXJlbnQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZDogSXRlbUlkLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHwgbnVsbCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0aWYgKHRoaXMubWF0Y2hQYXJlbnQoXG5cdFx0XHRcdGVudHJpZXNbZW50cnlJZF0sXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdHBhcmVudElkLFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXR1cm4gZW50cmllc1tlbnRyeUlkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldENvbGxlY3Rpb25zQnlQYXJlbnQgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uRW50cnk8YW55Pj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbaXRlbVR5cGVdW2VudHJ5SWRdO1xuXG5cdFx0XHRcdGlmICh0aGlzLm1hdGNoUGFyZW50KFxuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdHBhcmVudElkLFxuXHRcdFx0XHQpKSB7XG5cdFx0XHRcdFx0cmVzdWx0LnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cmllc30gd2hpY2ggY29udGFpbiB0aGUgaXRlbSB3aXRoIHRoZSBwYXNzZWQgSXRlbVR5cGUvSXRlbUlkXG5cdCAqL1xuXHRnZXRCeUNvbnRhaW5pbmdJdGVtPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbZW50cnlJZF07XG5cdFx0XHRjb25zdCBpdGVtcyA9IHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXTtcblxuXHRcdFx0aWYgKGl0ZW1zID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0aXRlbXMuc29tZShcblx0XHRcdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0XHRcdGl0ZW1FbnRyeSA9PiBpdGVtRW50cnkuaXRlbUlkID09IGl0ZW1JZCxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJlc3VsdC5wdXNoKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2hlY2tzIGlmIHRoZSBwYXNzZWQgZmllbGRzIHdvdWxkIGZpdCBpbiB0aGUgY29sbGVjdGlvbnMgdXNpbmcgdGhlIHtAbGluayBRdWVyeU1hdGNoZXIgUXVlcnlNYXRjaGVyfVxuXHQgKi9cblx0Z2V0QnlGaXR0aW5nSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0ZmllbGRzOiBGaWVsZE1hcCxcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlPiA9IHtcblx0XHRcdGZpdHRpbmc6IFtdLFxuXHRcdFx0bm90Zml0dGluZzogW10sXG5cdFx0XHRtYXliZTogW10sXG5cdFx0fTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Ly8gY29uc29sZS50aW1lKCdnZXRCeUZpdHRpbmdJdGVtJyk7XG5cblx0XHRjb25zdCBxdWVyeU1hdGNoZXIgPSB0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRmaWVsZHMsXG5cdFx0XHRwYXJlbnQsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgZW50cnlJZCBpbiBlbnRyaWVzKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBlbnRyaWVzW2VudHJ5SWRdO1xuXHRcdFx0Y29uc3QgbWF0Y2hSZXN1bHQgPSBxdWVyeU1hdGNoZXIubWF0Y2hRdWVyeShjb2xsZWN0aW9uRW50cnkucXVlcnkub2JqZWN0KTtcblxuXHRcdFx0Ly8gdG9kb1tjYWNoZV06IG1heWJlP1xuXHRcdFx0aWYgKG1hdGNoUmVzdWx0ID09PSB0cnVlKSB7XG5cdFx0XHRcdHJlc3VsdC5maXR0aW5nLnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH0gZWxzZSBpZiAobWF0Y2hSZXN1bHQgPT09IENPTlNUQU5UUy5NQVlCRSkge1xuXHRcdFx0XHRyZXN1bHQubWF5YmUucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0Lm5vdGZpdHRpbmcucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIGNvbnNvbGUudGltZUVuZCgnZ2V0QnlGaXR0aW5nSXRlbScpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldEJ5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHwgbnVsbCB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGVudHJ5SWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gZW50cmllc1tlbnRyeUlkXTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5zdHJpbmcgPT09IHF1ZXJ5LnN0cmluZykge1xuXHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0Z2V0QnlLZXk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGVudHJ5S2V5OiBzdHJpbmcsXG5cdCk6IEFycmF5PENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IGVudHJpZXNbZW50cnlJZF07XG5cblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5lbnRyeUtleSA9PT0gZW50cnlLZXkpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goY29sbGVjdGlvbkVudHJ5KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Ly8gdG9kb1tjYWNoZV0gcmVtb3ZlIHRoaXMsIHlvdSBzaG91bGQgZ2V0IGEgbmV3IHJlc291cmNlLi4uXG5cdC8qKlxuXHQgKiBAZGVwcmVjYXRlZFxuXHQgKi9cblx0cHVibGljIGdldFJlc291cmNlQnlLZXk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHJlc291cmNlS2V5OiBzdHJpbmcsXG5cdCk6IEFycmF5PENvbGxlY3Rpb25SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQgfHwgISh0aGlzLnRyYW5zYWN0aW9uIGluc3RhbmNlb2YgVHJhbnNhY3Rpb25DYWNoZSkpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBlbnRyeUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMudHJhbnNhY3Rpb24uY29sbGVjdGlvbkhhbmRsZXIuY29sbGVjdGlvblJlc291cmNlc1tlbnRyeUlkXTtcblxuXHRcdFx0Zm9yIChjb25zdCByZXNvdXJjZSBvZiByZXNvdXJjZXMpIHtcblx0XHRcdFx0aWYgKHJlc291cmNlLm9wdGlvbnMucmVzb3VyY2VLZXkgPT09IHJlc291cmNlS2V5KSB7XG5cdFx0XHRcdFx0cmVzdWx0LnB1c2gocmVzb3VyY2UpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxufVxuIiwiaW1wb3J0ICogYXMgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgUXVlcnlQYXJzZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsIEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uT3B0aW9uc0ludGVyZmFjZSwgQ29sbGVjdGlvblF1ZXJ5LCBFbnRyeVBhcmVudE51bGwsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlIHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVVbmZvdW5kTG9jYWxDb2xsZWN0aW9uRXJyb3IgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IHttZXNzYWdlOiBzdHJpbmd9IHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6IGBBIGxvY2FsIGNvbGxlY3Rpb24gb2YgdHlwZSAke2l0ZW1UeXBlfSBjb3VsZCBub3QgYmUgZm91bmRgfTtcblx0fVxuXG5cdC8vIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhlIGNvbHVtbnMgcHJvcGVydHksIGl0IHdpbGwgYmUgcmVwbGFjZWQgaW4gd2hlbiBjb2x1bW5zIGFyZSBleHBhbmRlZFxuXHRjbG9uZU9wdGlvbnMgKFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCkge1xuXHRcdGNvbnN0IHJlc3VsdCA9IG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpOyAvLyBkb2VzIGEgc2hhbGxvdyBjb3B5XG5cblx0XHRyZXN1bHQucXVlcnlQYXJhbXMgPSB0aGlzLmNsb25lUXVlcnlQYXJhbXMob3B0aW9ucy5xdWVyeVBhcmFtcyk7XG5cdFx0cmVzdWx0LnBhcmVudCA9IHBhcmVudDtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcm9jZXNzT3B0aW9uczxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKG9wdGlvbnM6IENvbGxlY3Rpb25PcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4pOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zIHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHRjbG9uZVF1ZXJ5UGFyYW1zPFQgZXh0ZW5kcyBvYmplY3Q+IChwYXJhbWV0ZXJzOiBUKTogVCB7XG5cdFx0Y29uc3QgcmVzdWx0OiBhbnkgPSB7fTtcblxuXHRcdGZvciAoY29uc3Qga2V5IGluIHBhcmFtZXRlcnMpIHtcblx0XHRcdGNvbnN0IHZhbHVlID0gcGFyYW1ldGVyc1trZXldO1xuXHRcdFx0bGV0IGNsb25lO1xuXG5cdFx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdFx0Y2xvbmUgPSB2YWx1ZS5zbGljZSgpO1xuXHRcdFx0fS8vIHdlJ3JlIG9ubHkgdXNpbmcgcHJpbWl0aXZlIGFycmF5c1xuXHRcdFx0ZWxzZSBpZiAobW9tZW50LmlzTW9tZW50KHZhbHVlKSkge1xuXHRcdFx0XHRjbG9uZSA9IHZhbHVlLmNsb25lKCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjbG9uZSA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXN1bHRba2V5XSA9IGNsb25lO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRjcmVhdGVRdWVyeSAob3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyk6IENvbGxlY3Rpb25RdWVyeSB7XG5cdFx0Y29uc3QgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG5cblx0XHRsZXQgcXVlcnk7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRxdWVyeSA9IG9wdGlvbnMucXVlcnk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnN0IGxpbmtlZFRvUXVlcnkgPSB7XG5cdFx0XHRcdGxpbmtlZFRvOiBwYXJlbnQuaXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5OiB7aWQ6ICcmcGFyZW50SWQnfSxcblx0XHRcdH07XG5cdFx0XHRvcHRpb25zLnF1ZXJ5UGFyYW1zLnBhcmVudElkID0gcGFyZW50Lml0ZW1JZDtcblxuXHRcdFx0cXVlcnkgPSBvcHRpb25zLnF1ZXJ5ID09PSBudWxsID9cblx0XHRcdFx0bGlua2VkVG9RdWVyeSA6XG5cdFx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdFx0XHRvcHRpb25zLnF1ZXJ5LFxuXHRcdFx0XHRcdGxpbmtlZFRvUXVlcnksXG5cdFx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeVxuXHRcdFx0LmNvbnN0cnVjdChcblx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdG9wdGlvbnMucXVlcnlQYXJhbXMsXG5cdFx0XHQpXG5cdFx0XHQucGFyc2UoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRvYmplY3Q6IHBhcnNlZFF1ZXJ5WzBdLFxuXHRcdFx0c3RyaW5nOiBwYXJzZWRRdWVyeVsxXSxcblx0XHR9O1xuXHR9XG5cblx0Z2V0SWRBcnJheSAoXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxhbnk+Pixcblx0XHRhY2N1bXVsYXRvcjogSXRlbUlkW10gPSBbXSxcblx0KTogSXRlbUlkW10ge1xuXHRcdGlmIChhY2N1bXVsYXRvciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRhY2N1bXVsYXRvciA9IFtdO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRhY2N1bXVsYXRvci5wdXNoKGl0ZW1FbnRyeS5pdGVtSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2N1bXVsYXRvcjtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmlsdGVycyBhbiBhcnJheSBvZiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSBhY2NvcmRpbmcgdG8gdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLlxuXHQgKiBEb2VzIGFuIGluLXBsYWNlIHJlcGxhY2VtZW50IG9mIHRoZSBpdGVtcyBpbiB0aGUgYXJyYXkgdGhhdCBkbyBtYXRjaCB0aGUgY29uZGl0aW9uIChrZWVwaW5nIHRoZSBhcnJheSByZWZlcmVuY2UpXG5cdCAqXG5cdCAqIEByZXR1cm5zIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgZmFpbGVkIHRoZSBjb25kaXRpb25cblx0ICovXG5cdGZpbHRlckFycmF5PFQgZXh0ZW5kcyBJdGVtRW50cnk8YW55PiA9IEl0ZW1FbnRyeTxhbnk+PiAoXG5cdFx0aXRlbUVudHJpZXM6IFRbXSxcblx0XHRjYWxsYmFjazogKGl0ZW1FbnRyeTogVCkgPT4gYm9vbGVhbixcblx0KTogVFtdIHtcblx0XHRjb25zdCBmaWx0ZXJlZEVudHJpZXM6IFRbXSA9IFtdO1xuXHRcdGNvbnN0IHJlbW92ZWRFbnRyaWVzOiBUW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHQoY2FsbGJhY2soaXRlbUVudHJ5KSA/IGZpbHRlcmVkRW50cmllcyA6IHJlbW92ZWRFbnRyaWVzKS5wdXNoKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlbW92ZWRFbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHJlbW92ZWRFbnRyaWVzO1xuXHRcdH1cblxuXHRcdGl0ZW1FbnRyaWVzLmxlbmd0aCA9IGZpbHRlcmVkRW50cmllcy5sZW5ndGg7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1FbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRpdGVtRW50cmllc1tpXSA9IGZpbHRlcmVkRW50cmllc1tpXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVtb3ZlZEVudHJpZXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsIENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsIEl0ZW1SZXNvdXJjZSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvblJlc291cmNlU2VydmljZSB7XG5cblx0cHJvY2Vzc09wdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT5cblx0KTogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uczxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMob3B0aW9ucyk7XG5cdH1cblxuXHRnZXRJZEFycmF5IChpdGVtUmVzb3VyY2VzOiBBcnJheTxJdGVtUmVzb3VyY2U8YW55Pj4pOiBJdGVtSWRbXSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtUmVzb3VyY2Ugb2YgaXRlbVJlc291cmNlcylcblx0XHRcdHJlc3VsdC5wdXNoKGl0ZW1SZXNvdXJjZS5lbnRyeS5pdGVtSWQpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG59XG4iLCJpbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1uLCBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uLCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uQ2FjaGUge1xuXHRjYWNoZTogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHt9O1xuXHRhbGxDb2x1bW5zOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBib29sZWFufSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0c2V0Q29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHQpOiBSZXNwb25zZUNvbHVtbiB7XG5cdFx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXG5cdFx0aWYgKGNhY2hlW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjYWNoZVtpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRjb25zdCBlbnRyeSA9IGNhY2hlW2l0ZW1UeXBlXTtcblx0XHRjb25zdCBjb2x1bW5JZCA9IHJlc3BvbnNlQ29sdW1uLmlkO1xuXG5cdFx0aWYgKGVudHJ5W2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyeVtjb2x1bW5JZF0gPSByZXNwb25zZUNvbHVtbjtcblx0XHR9XG5cblx0XHRyZXR1cm4gZW50cnlbY29sdW1uSWRdO1xuXHR9XG5cblx0c2V0Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdGNvbnN0IHJlc3VsdDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCByZXNwb25zZVR5cGUgaW4gcmVzcG9uc2VDb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5zID0gcmVzcG9uc2VDb2x1bW5zW3Jlc3BvbnNlVHlwZV07XG5cblx0XHRcdHJlc3VsdFtyZXNwb25zZVR5cGVdID0ge307XG5cblx0XHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gY29sdW1ucykge1xuXHRcdFx0XHRyZXN1bHRbcmVzcG9uc2VUeXBlXVtjb2x1bW5JZF0gPSB0aGlzLnNldENvbHVtbihcblx0XHRcdFx0XHRyZXNwb25zZVR5cGUsXG5cdFx0XHRcdFx0Y29sdW1uc1tjb2x1bW5JZF0sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHR0aGlzLmFsbENvbHVtbnNbaXRlbVR5cGVdID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cmV0cmlldmUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IHtjYWNoZWQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsIG1pc3Npbmc6IEFwaVJlcXVlc3RDb2x1bW5zfSB7XG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRpZiAodGhpcy5jb250YWluc0FsbChpdGVtVHlwZSkpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRjYWNoZWQ6IHRoaXMuZ2V0Q29sdW1ucyhpdGVtVHlwZSksXG5cdFx0XHRcdFx0bWlzc2luZzogW10sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdGNhY2hlZDoge30sXG5cdFx0XHRcdG1pc3Npbmc6IHRydWUsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3BvbnNlQWNjdW11bGF0b3IgPSB7fTtcblx0XHRjb25zdCByZXF1ZXN0QWNjdW11bGF0b3I6IFJlc3BvbnNlQ29sdW1uW10gPSBbXTtcblxuXHRcdHRoaXMucmV0cmlldmVDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlcXVlc3RBY2N1bXVsYXRvcixcblx0XHRcdHJlc3BvbnNlQWNjdW11bGF0b3IsXG5cdFx0KTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRjYWNoZWQ6IHJlc3BvbnNlQWNjdW11bGF0b3IsXG5cdFx0XHRtaXNzaW5nOiByZXF1ZXN0QWNjdW11bGF0b3IsXG5cdFx0fTtcblx0fVxuXG5cdGNvbnRhaW5zQWxsIChpdGVtVHlwZTogSXRlbVR5cGUpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5hbGxDb2x1bW5zW2l0ZW1UeXBlXSA9PT0gdHJ1ZTtcblx0fVxuXG5cdGdldENvbHVtbnMgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdGNvbnN0IGNhY2hlID0gdGhpcy5jYWNoZTtcblxuXHRcdHJldHVybiB7W2l0ZW1UeXBlXTogY2FjaGVbaXRlbVR5cGVdID09PSB1bmRlZmluZWQgPyBbXSA6IGNhY2hlW2l0ZW1UeXBlXX07XG5cdH1cblxuXHRwcml2YXRlIHJldHJpZXZlQ29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdFx0cmVxdWVzdEFjY3VtdWxhdG9yOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdFx0cmVzcG9uc2VBY2N1bXVsYXRvcjogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogdm9pZCB7XG5cdFx0Ly8gYWx3YXlzIHJldHJpZXZlIHRoZSBpZCBjb2x1bW5cblx0XHR0aGlzLnJldHJpZXZlQ29sdW1uKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHQnaWQnLFxuXHRcdFx0cmVxdWVzdEFjY3VtdWxhdG9yLFxuXHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcixcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCByZXF1ZXN0Q29sdW1uIG9mIHJlcXVlc3RDb2x1bW5zKSB7XG5cdFx0XHR0aGlzLnJldHJpZXZlQ29sdW1uKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVxdWVzdENvbHVtbixcblx0XHRcdFx0cmVxdWVzdEFjY3VtdWxhdG9yLFxuXHRcdFx0XHRyZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIHJldHJpZXZlQ29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbixcblx0XHRyZXF1ZXN0QWNjdW11bGF0b3I6IFJlc3BvbnNlQ29sdW1uW10sXG5cdFx0cmVzcG9uc2VBY2N1bXVsYXRvcjogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogdm9pZCB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5jb2x1bW5VdGlsLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbiA9IHRoaXMuZ2V0Q29sdW1uKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2x1bW4uaWQsXG5cdFx0KTtcblxuXHRcdGlmIChyZXNwb25zZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXF1ZXN0QWNjdW11bGF0b3IucHVzaChyZXF1ZXN0Q29sdW1uKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAocmVzcG9uc2VBY2N1bXVsYXRvcltpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVzcG9uc2VBY2N1bXVsYXRvcltpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRyZXNwb25zZUFjY3VtdWxhdG9yW2l0ZW1UeXBlXVtjb2x1bW4uaWRdID0gcmVzcG9uc2VDb2x1bW47XG5cblx0XHRpZiAoY29sdW1uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IG1pc3NpbmdEZXJpdmVkOiBSZXNwb25zZUNvbHVtbltdID0gW107XG5cblx0XHR0aGlzLnJldHJpZXZlQ29sdW1ucyhcblx0XHRcdHJlc3BvbnNlQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0Y29sdW1uLmNoaWxkcmVuLFxuXHRcdFx0bWlzc2luZ0Rlcml2ZWQsXG5cdFx0XHRyZXNwb25zZUFjY3VtdWxhdG9yLFxuXHRcdCk7XG5cblx0XHRpZiAobWlzc2luZ0Rlcml2ZWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmVxdWVzdEFjY3VtdWxhdG9yLnB1c2goe1tjb2x1bW4uaWRdOiBtaXNzaW5nRGVyaXZlZH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBnZXRDb2x1bW4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRjb2x1bW5JZDogc3RyaW5nLFxuXHQpOiBSZXNwb25zZUNvbHVtbiB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlW2l0ZW1UeXBlXTtcblxuXHRcdGlmIChjYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNhY2hlW2NvbHVtbklkXTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uSW5mbywgQ29sdW1uU2V0IH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQge1xuXHRBcGlSZXF1ZXN0Q29sdW1uLFxuXHRBcGlSZXF1ZXN0Q29sdW1ucyxcblx0Q29sdW1uRXhwYW5zaW9uUmVzdWx0LFxuXHRJdGVtVHlwZSxcblx0UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0Um9vdENvbHVtbk1hcCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBnZXRGaXJzdFByb3BlcnR5IH0gZnJvbSAnLi9VdGlsJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIEEgQ29sdW1uRXhwYW5zaW9uIGlzIHVzZWQgdG8gbWFrZSBzdXJlIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgaGF2ZSB0aGUgc2FtZSB7QGxpbmsgQ29sdW1uU2V0IENvbHVtblNldH0gKG1hdGNoZWQgb24ge0BsaW5rIENvbHVtblNldC5pZCBDb2x1bW5TZXQuaWR9KSB3aWxsIGFsbCBnZXQgdGhlIHNhbWUgbmV3IGV4cGFuZGVkIENvbHVtblNldFxuICovXG5leHBvcnQgY2xhc3MgQ29sdW1uRXhwYW5zaW9uPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cblx0ZXhwYW5zaW9uTWFwOiB7W2NvbHVtblNldElkOiBzdHJpbmddOiBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbVR5cGVUeXBlPiB8IG51bGx9ID0ge307XG5cdGV4cGFuc2lvbk1hcFNpemU6IG51bWJlciA9IDA7XG5cdHJlcXVlc3RDb2x1bW5zVHJ1ZTogYm9vbGVhbjtcblx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5JbmZvRmFjdG9yeTogQ29sdW1uSW5mb0ZhY3RvcnksXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHB1YmxpYyByZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCkge1xuXHRcdGlmIChyZXF1ZXN0Q29sdW1ucyA9PT0gdHJ1ZSkge1xuXHRcdFx0Ly8gcmVxdWVzdENvbHVtbnMgc2hvdWxkIGFsd2F5cyBiZSBhbiBhcnJheSwgd2hlbiBpdCBpcyB0cnVlIGRlcml2ZWQgY29sdW1uIGluZm9ybWF0aW9uIHdpbGwgYmUgbG9zdFxuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUgPSB0cnVlO1xuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1ucyA9IFtdO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHJlc3BvbnNlQ29sdW1uc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1ucy5wdXNoKGNvbHVtbklkKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUgPSBmYWxzZTtcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbnMgPSByZXF1ZXN0Q29sdW1ucztcblx0XHR9XG5cdH1cblxuXHRydW4gKGNvbHVtblNldDogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4pOiBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbVR5cGVUeXBlPiB8IG51bGwge1xuXHRcdGNvbnN0IGV4cGFuc2lvbk1hcCA9IHRoaXMuZXhwYW5zaW9uTWFwO1xuXHRcdGNvbnN0IGNvbHVtblNldElkID0gY29sdW1uU2V0LmlkO1xuXG5cdFx0aWYgKGV4cGFuc2lvbk1hcFtjb2x1bW5TZXRJZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGV4cGFuc2lvbk1hcFtjb2x1bW5TZXRJZF07XG5cdFx0fVxuXG5cdFx0dGhpcy5leHBhbnNpb25NYXBTaXplKys7XG5cblx0XHRyZXR1cm4gZXhwYW5zaW9uTWFwW2NvbHVtblNldElkXSA9IGNvbHVtblNldC5pc1N1cGVyc2V0T2YodGhpcy5yZXF1ZXN0Q29sdW1ucykgP1xuXHRcdFx0bnVsbCA6XG5cdFx0XHRjb2x1bW5TZXQuZXhwYW5kKFxuXHRcdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZSxcblx0XHRcdFx0dGhpcy5yZXNwb25zZUNvbHVtbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0YWdncmVnYXRlUm9vdENvbHVtbnMgKCk6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IGV4cGFuc2lvbk1hcCA9IHRoaXMuZXhwYW5zaW9uTWFwO1xuXG5cdFx0aWYgKHRoaXMuZXhwYW5zaW9uTWFwU2l6ZSA9PT0gMSkge1xuXHRcdFx0Y29uc3QgZXhwYW5zaW9uUmVzdWx0ID0gZXhwYW5zaW9uTWFwW2dldEZpcnN0UHJvcGVydHkoZXhwYW5zaW9uTWFwKSBhcyBzdHJpbmddO1xuXG5cdFx0XHRyZXR1cm4gZXhwYW5zaW9uUmVzdWx0ICE9PSBudWxsID8gZXhwYW5zaW9uUmVzdWx0LmRpZmZlcmVuY2Uucm9vdCA6IFtdO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uU2V0SWQgaW4gZXhwYW5zaW9uTWFwKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSBleHBhbnNpb25NYXBbY29sdW1uU2V0SWRdO1xuXG5cdFx0XHRpZiAoY29sdW1uRXhwYW5zaW9uID09PSBudWxsKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5kaWZmZXJlbmNlLnJvb3QsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmNvbHVtbkluZm9GYWN0b3J5LmNvbnN0cnVjdEZyb21Sb290TWFwKHJvb3RDb2x1bW5NYXApO1xuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRSb290Q29sdW1uTWFwIChcblx0XHRjb2x1bW5zOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGRlc3RpbmF0aW9uOiBSb290Q29sdW1uTWFwLFxuXHQpIHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRjb25zdCBjb2x1bW5JZCA9IGNvbHVtbi5pZDtcblxuXHRcdFx0aWYgKGRlc3RpbmF0aW9uW2NvbHVtbklkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbklkXSA9IHtcblx0XHRcdFx0XHRhcGlDb2x1bW46IGNvbHVtbi5hcGlDb2x1bW4sXG5cdFx0XHRcdFx0Y2hpbGRyZW46IHt9LFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRcdGNvbHVtbi5jaGlsZHJlbixcblx0XHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSWRdLmNoaWxkcmVuLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlLCBDb2x1bW5DYWNoZSwgQ29sdW1uVXRpbCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlLCBSZXNwb25zZUNvbHVtbiwgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtbkhhbmRsZXIge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwcml2YXRlIGNhY2hlOiBDb2x1bW5DYWNoZSxcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdCkge1xuXHR9XG5cblx0c2V0Q29sdW1uIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHQpOiBSZXNwb25zZUNvbHVtbiB7XG5cdFx0cmV0dXJuIHRoaXMuY2FjaGUuc2V0Q29sdW1uKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXNwb25zZUNvbHVtbixcblx0XHQpO1xuXHR9XG5cblx0c2V0Q29sdW1ucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAge1xuXHRcdHJldHVybiB0aGlzLmNhY2hlLnNldENvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdCk7XG5cdH1cblxuXHRmZXRjaEl0ZW1UeXBlVHJhbnNsYXRpb25zIChpdGVtVHlwZXM6IEl0ZW1UeXBlW10pOiBQcm9taXNlSW50ZXJmYWNlPHtbaXRlbVR5cGU6IHN0cmluZ106IHN0cmluZ30+IHtcblx0XHRjb25zdCBwcm9taXNlczoge1tpdGVtVHlwZTogc3RyaW5nXTogUHJvbWlzZUludGVyZmFjZTxSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwPn0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgb2YgaXRlbVR5cGVzKSB7XG5cdFx0XHRwcm9taXNlc1tpdGVtVHlwZV0gPSB0aGlzLmZldGNoKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0WydpZCddLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHJlc3VsdDoge1tpdGVtVHlwZTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiByZXNwb25zZSkge1xuXHRcdFx0XHRcdFx0cmVzdWx0W2l0ZW1UeXBlXSA9IHJlc3BvbnNlW2l0ZW1UeXBlXVtpdGVtVHlwZV0uaWQubmFtZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cmVxdWVzdCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHBhcmFtcyA9IHtmaWx0ZXI6IGZhbHNlfSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwPiB7XG5cdFx0cmV0dXJuIHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UuY29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0e1tpdGVtVHlwZV06IGNvbHVtbnN9LFxuXHRcdFx0cGFyYW1zLFxuXHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRjb2x1bW5SZXNvdXJjZSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuY2FjaGUuc2V0Q29sdW1ucyhcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0Y29sdW1ucyxcblx0XHRcdFx0XHRcdGNvbHVtblJlc291cmNlLmZldGNoQ29sdW1uc09iamVjdCgpLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHRmZXRjaCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRwYXJhbXM/OiBhbnksXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcD4ge1xuXHRcdGNvbnN0IGNvbHVtblJlc291cmNlID0gdGhpcy5jYWNoZS5yZXRyaWV2ZShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KTtcblxuXHRcdGlmIChjb2x1bW5SZXNvdXJjZS5taXNzaW5nICE9PSB0cnVlICYmIGNvbHVtblJlc291cmNlLm1pc3NpbmcubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbHVtblJlc291cmNlLmNhY2hlZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Y29sdW1uUmVzb3VyY2UubWlzc2luZyxcblx0XHRcdHBhcmFtcyxcblx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zID0+IHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRcdFx0Y29sdW1uUmVzb3VyY2UuY2FjaGVkLFxuXHRcdFx0XHRcdCkubWVyZ2VkO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0fVxuXG5cdGZldGNoQWxsIChpdGVtVHlwZTogSXRlbVR5cGUpOiBQcm9taXNlSW50ZXJmYWNlPFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXA+IHtcblx0XHRpZiAodGhpcy5jYWNoZS5jb250YWluc0FsbChpdGVtVHlwZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4odGhpcy5jYWNoZS5nZXRDb2x1bW5zKGl0ZW1UeXBlKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0dHJ1ZSxcblx0XHQpO1xuXHR9XG59XG4iLCJleHBvcnQgY29uc3QgQUxMX1BFUk1JU1NJT05TID0gJzcnO1xuXG5leHBvcnQgY29uc3QgQ09MVU1OX1NFUEVSQVRPUiA9ICc+JztcbmV4cG9ydCBjb25zdCBSRU5ERVJfQVNfU0VQRVJBVE9SID0gJzonO1xuXG5leHBvcnQgY29uc3QgTkVXX1BSRUZJWDogc3RyaW5nID0gJy0xJztcbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVfUFJFRklYOiBzdHJpbmcgPSAnLTInO1xuXG5leHBvcnQgY29uc3QgTkVXX0tFWVdPUkQ6IHN0cmluZyA9ICduZXctJztcbmV4cG9ydCBjb25zdCBEVVBMSUNBVEVfS0VZV09SRDogc3RyaW5nID0gJ2R1cC0nO1xuIiwiaW1wb3J0IHsgQ09MVU1OX1NFUEVSQVRPUiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW4gfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cdGlkOiBzdHJpbmc7XG5cdGxldmVsOiBudW1iZXI7XG5cdHBhdGg6IHN0cmluZztcblx0dGFpbFBhdGg6IHN0cmluZztcblx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSB8IG51bGwgPSBudWxsO1xuXHRjaGlsZHJlbjogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRpc0xlYWY6IGJvb2xlYW4gPSB0cnVlO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRyZWFkb25seSBhcGlDb2x1bW46IFJlc3BvbnNlQ29sdW1uLFxuXHRcdHJlYWRvbmx5IHBhcmVudDogQ29sdW1uSW5mbzxJdGVtVHlwZT4gfCBudWxsID0gbnVsbFxuXHQpIHtcblx0XHRjb25zdCBjb2x1bW5JZCA9IGFwaUNvbHVtbi5pZDtcblxuXHRcdHRoaXMuaWQgPSBjb2x1bW5JZDtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHRoaXMubGV2ZWwgPSAwO1xuXHRcdFx0dGhpcy5wYXRoID0gY29sdW1uSWQ7XG5cdFx0XHR0aGlzLnRhaWxQYXRoID0gJyc7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMubGV2ZWwgPSBwYXJlbnQubGV2ZWwgKyAxO1xuXHRcdFx0dGhpcy5wYXRoID0gcGFyZW50LnBhdGggKyBDT0xVTU5fU0VQRVJBVE9SICsgY29sdW1uSWQ7XG5cdFx0XHR0aGlzLnRhaWxQYXRoID0gcGFyZW50LmxldmVsID09PSAwID9cblx0XHRcdFx0Y29sdW1uSWQgOlxuXHRcdFx0XHRwYXJlbnQudGFpbFBhdGggKyBDT0xVTU5fU0VQRVJBVE9SICsgY29sdW1uSWQ7XG5cdFx0fVxuXHR9XG5cblx0c2V0Q2hpbGRyZW4gKGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsIGNoaWxkcmVuOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+KTogdGhpcyB7XG5cdFx0dGhpcy5pdGVtVHlwZSA9IGl0ZW1UeXBlO1xuXHRcdHRoaXMuY2hpbGRyZW4gPSBjaGlsZHJlbjtcblx0XHR0aGlzLmlzTGVhZiA9IGZhbHNlO1xuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtbkluZm8sIENvbHVtblV0aWwsIFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uU2V0RmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgQ29sdW1uRXhwYW5zaW9uUmVzdWx0LCBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuY29uc3QgZW1wdHlPYmplY3QgPSB7fTtcbmxldCBjdXJyZW50SWQgPSAwO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiB7XG5cdGlkID0gKytjdXJyZW50SWQ7XG5cblx0cmVxdWVzdDogQXBpUmVxdWVzdENvbHVtbnM7XG5cdHJlcXVlc3RDb2x1bW5zVHJ1ZTogYm9vbGVhbjtcblx0cmVzcG9uc2U6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSBlbXB0eU9iamVjdDtcblxuXHRsaW5rOiBDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4gfCBudWxsID0gbnVsbDtcblx0bWFpbjogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRkZXJpdmVkOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdHJvb3Q6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0bGVhZjogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRmb3JtYXR0ZWQ6IHttYWluOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+LCBkZXJpdmVkOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+fSA9IHtcblx0XHRtYWluOiBbXSxcblx0XHRkZXJpdmVkOiBbXSxcblx0fTtcblx0ZmlsdGVyZWQ6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0Y3VzdG9tOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cdHNlYXJjaGFibGU6IEFycmF5PENvbHVtbkluZm88SXRlbVR5cGVUeXBlPj4gPSBbXTtcblx0aXRlbTogQXJyYXk8Q29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXHRub3RJdGVtOiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcml2YXRlIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHVibGljIGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGdyb3VwQ29sdW1uSW5mbyAoY29sdW1uSW5mbzogQ29sdW1uSW5mbyk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbHVtblV0aWwgPSB0aGlzLmNvbHVtblV0aWw7XG5cdFx0Y29uc3QgcmVzcG9uc2VDb2x1bW4gPSBjb2x1bW5JbmZvLmFwaUNvbHVtbjtcblx0XHRjb25zdCBpc0Rlcml2ZWQgPSBjb2x1bW5JbmZvLnBhcmVudCAhPT0gbnVsbDtcblxuXHRcdGlmIChpc0Rlcml2ZWQpIHtcblx0XHRcdHRoaXMuZGVyaXZlZC5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLm1haW4ucHVzaChjb2x1bW5JbmZvKTtcblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1uLnR5cGUgPT09ICdsaW5rJykge1xuXHRcdFx0XHR0aGlzLmxpbmsgPSBjb2x1bW5JbmZvO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyB3ZSBjb3VsZCBwb3NzaWJseSBhZGQgZGVyaXZlZCBjb2x1bW5zIHRvICdub3RJdGVtJ1xuXHRcdFx0dGhpc1tjb2x1bW5VdGlsLmlzSXRlbUNvbHVtbihyZXNwb25zZUNvbHVtbikgPyAnaXRlbScgOiAnbm90SXRlbSddLnB1c2goY29sdW1uSW5mbyk7XG5cblx0XHRcdGlmICghY29sdW1uSW5mby5pc0xlYWYpIHtcblx0XHRcdFx0dGhpcy5yb290LnB1c2goY29sdW1uSW5mbyk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtblV0aWwuaXNGb3JtYXR0ZWRDb2x1bW4ocmVzcG9uc2VDb2x1bW4pKSB7XG5cdFx0XHR0aGlzLmZvcm1hdHRlZFtpc0Rlcml2ZWQgPyAnZGVyaXZlZCcgOiAnbWFpbiddLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtblV0aWwuaXNGaWx0ZXJlZENvbHVtbihyZXNwb25zZUNvbHVtbikpIHtcblx0XHRcdHRoaXMuZmlsdGVyZWQucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uVXRpbC5pc1NlYXJjaGFibGVDb2x1bW4ocmVzcG9uc2VDb2x1bW4pKSB7XG5cdFx0XHR0aGlzLnNlYXJjaGFibGUucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uVXRpbC5pc0N1c3RvbUNvbHVtbihyZXNwb25zZUNvbHVtbikpIHtcblx0XHRcdHRoaXMuY3VzdG9tLnB1c2goY29sdW1uSW5mbyk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtbkluZm8uaXNMZWFmKSB7XG5cdFx0XHR0aGlzLmxlYWYucHVzaChjb2x1bW5JbmZvKTtcblx0XHR9XG5cdH1cblxuXHR0b0pTT04gKCkge1xuXHRcdGNvbnN0IHBhcnNlQ29sdW1ucyA9IChjb2x1bW5zOiBDb2x1bW5JbmZvW10pID0+IGNvbHVtbnMubWFwKFxuXHRcdFx0YyA9PiBjLmlkKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRtYWluOiBwYXJzZUNvbHVtbnModGhpcy5tYWluKSxcblx0XHRcdGRlcml2ZWQ6IHBhcnNlQ29sdW1ucyh0aGlzLmRlcml2ZWQpLFxuXHRcdH07XG5cdH1cblxuXHRleHBhbmRSZXF1ZXN0Q29sdW1ucyAoY29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMpOiB2b2lkIHtcblx0XHRjb25zdCBtZXJnZWRSZXF1ZXN0Q29sdW1ucyA9IHRoaXMuY29sdW1uVXRpbC5tZXJnZVJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0dGhpcy5yZXF1ZXN0LFxuXHRcdFx0Y29sdW1ucyxcblx0XHQpLm1lcmdlZDtcblxuXHRcdHRoaXMucmVxdWVzdCA9IG1lcmdlZFJlcXVlc3RDb2x1bW5zO1xuXHRcdHRoaXMucmVxdWVzdENvbHVtbnNUcnVlID0gbWVyZ2VkUmVxdWVzdENvbHVtbnMgPT09IHRydWU7XG5cdH1cblxuXHRpc1N1cGVyc2V0T2YgKGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogYm9vbGVhbiB7XG5cdFx0aWYgKGNvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdHJldHVybiB0aGlzLnJlcXVlc3RDb2x1bW5zVHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCBjb2x1bW5VdGlsID0gdGhpcy5jb2x1bW5VdGlsO1xuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5zID0gdGhpcy5yZXF1ZXN0O1xuXG5cdFx0aWYgKHJlcXVlc3RDb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gIWNvbHVtblV0aWwuY29udGFpbnNEZXJpdmVkQ29sdW1ucyhjb2x1bW5zKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRpZiAoIWNvbHVtblV0aWwuY29udGFpbnNDb2x1bW4oXG5cdFx0XHRcdGNvbHVtbixcblx0XHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0TWVyZ2VkQ29sdW1uU2V0IChcblx0XHRtZXJnZWRSZXF1ZXN0Q29sdW1uczogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0LFxuXHRcdG1lcmdlZFJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRyZXF1ZXN0Q29sdW1uc1RydWU6IGJvb2xlYW4sXG5cdCk6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+IHtcblx0XHRjb25zdCByZXN1bHQgPSB0aGlzLmNvbHVtblNldEZhY3RvcnkuY29uc3RydWN0PEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHR0aGlzLml0ZW1UeXBlLFxuXHRcdFx0bWVyZ2VkUmVxdWVzdENvbHVtbnMubWVyZ2VkLFxuXHRcdFx0bWVyZ2VkUmVzcG9uc2VDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXN1bHQucmVxdWVzdENvbHVtbnNUcnVlID0gdGhpcy5yZXF1ZXN0Q29sdW1uc1RydWUgfHwgcmVxdWVzdENvbHVtbnNUcnVlO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdG1lcmdlUmVxdWVzdENvbHVtbnMgKHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyk6IFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uVXRpbC5tZXJnZVJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0dGhpcy5yZXF1ZXN0LFxuXHRcdFx0cmVxdWVzdENvbHVtbnMsXG5cdFx0KTtcblx0fVxuXG5cdG1lcmdlUmVzcG9uc2VDb2x1bW5zIChyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXApOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwIHtcblx0XHRyZXR1cm4gdGhpcy5jb2x1bW5VdGlsLm1lcmdlUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0dGhpcy5yZXNwb25zZSxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHQpLm1lcmdlZDtcblx0fVxuXG5cdG1lcmdlIChjb2x1bW5TZXQ6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLmdldE1lcmdlZENvbHVtblNldChcblx0XHRcdHRoaXMubWVyZ2VSZXF1ZXN0Q29sdW1ucyhjb2x1bW5TZXQucmVxdWVzdCksXG5cdFx0XHR0aGlzLm1lcmdlUmVzcG9uc2VDb2x1bW5zKGNvbHVtblNldC5yZXNwb25zZSksXG5cdFx0XHRjb2x1bW5TZXQucmVxdWVzdENvbHVtbnNUcnVlLFxuXHRcdCk7XG5cdH1cblxuXHRleHBhbmQgKFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRyZXF1ZXN0Q29sdW1uc1RydWU6IGJvb2xlYW4sXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBDb2x1bW5FeHBhbnNpb25SZXN1bHQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgbWVyZ2VkUmVxdWVzdENvbHVtbnMgPSB0aGlzLm1lcmdlUmVxdWVzdENvbHVtbnMocmVxdWVzdENvbHVtbnMpO1xuXHRcdGNvbnN0IG1lcmdlZFJlc3BvbnNlQ29sdW1ucyA9IHRoaXMubWVyZ2VSZXNwb25zZUNvbHVtbnMocmVzcG9uc2VDb2x1bW5zKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHRtZXJnZWQ6IHRoaXMuZ2V0TWVyZ2VkQ29sdW1uU2V0KFxuXHRcdFx0XHRtZXJnZWRSZXF1ZXN0Q29sdW1ucyxcblx0XHRcdFx0bWVyZ2VkUmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1uc1RydWUsXG5cdFx0XHQpLFxuXHRcdFx0ZGlmZmVyZW5jZTogdGhpcy5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdDxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHR0aGlzLml0ZW1UeXBlLFxuXHRcdFx0XHRtZXJnZWRSZXF1ZXN0Q29sdW1ucy5kaWZmZXJlbmNlLFxuXHRcdFx0XHRtZXJnZWRSZXNwb25zZUNvbHVtbnMsIC8vIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBsb29rIHVwIHRoZSBwYXJlbnQgb2YgZGVyaXZlZCBjb2x1bW5zXG5cdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRmYWxzZVxuXHRcdFx0KVxuXHRcdH07XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblNldCB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IHtcblx0cHJpdmF0ZSBjYWNoZToge1tjb2x1bW5TZXRJZDogbnVtYmVyXTogYm9vbGVhbn0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHVibGljIHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uc1xuXHQpIHtcblxuXHR9XG5cblx0cnVuIChjb2x1bW5TZXQ6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+KTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgY2FjaGUgPSB0aGlzLmNhY2hlO1xuXHRcdGNvbnN0IGNvbHVtblNldElkID0gY29sdW1uU2V0LmlkO1xuXG5cdFx0aWYgKGNhY2hlW2NvbHVtblNldElkXSAhPT0gdW5kZWZpbmVkKVxuXHRcdFx0cmV0dXJuIGNhY2hlW2NvbHVtblNldElkXTtcblxuXHRcdHJldHVybiBjYWNoZVtjb2x1bW5TZXRJZF0gPSBjb2x1bW5TZXQuaXNTdXBlcnNldE9mKHRoaXMucmVxdWVzdENvbHVtbnMpO1xuXHR9XG59XG4iLCJpbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgQ09MVU1OX1NFUEVSQVRPUiwgUkVOREVSX0FTX1NFUEVSQVRPUiB9IGZyb20gJy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzL0xpbmtUcmVlU2VydmljZUludGVyZmFjZSc7XG5pbXBvcnQge1xuXHRBcGlMaW5rVHJlZVR5cGUsXG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRJdGVtVHlwZSxcblx0UmVzcG9uc2VDb2x1bW4sXG5cdFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFJlc3BvbnNlQ29sdW1uTWFwLFxufSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IGV4dGVuZCwgaXNEZWZpbmVkIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0PFQgZXh0ZW5kcyBBcGlSZXF1ZXN0Q29sdW1ucyA9IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRVIGV4dGVuZHMgQXBpUmVxdWVzdENvbHVtbnMgPSBBcGlSZXF1ZXN0Q29sdW1ucz4gPSB7bWVyZ2VkOiBULCBkaWZmZXJlbmNlOiBVfTtcblxuZXhwb3J0IGNsYXNzIENvbHVtblV0aWwge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGxpbmtUcmVlU2VydmljZTogTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlLFxuXHQpIHtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ2hlY2tzIHRoZSB7QGxpbmsgQXBpTGlua1RyZWUgTGlua1RyZWV9IGFuZCByZXR1cm5zIHRoZSBsaW5rIGNvbHVtbklkcyBmb3IgdGhlIGdpdmVuIEl0ZW1UeXBlXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogLSBGb3Ige0BsaW5rIEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QgZGlyZWN0IGxpbmtzfSBpdCB3aWxsIGJlIGEgY29sdW1uSWRcblx0ICogLSBGb3Ige0BsaW5rIEFwaUxpbmtUcmVlVHlwZS5JVEVNVEFCTEUgaXRlbXRhYmxlIGxpbmtzfSBpdCB3aWxsIGJlICdpdGVtdHlwZScgYW5kICdpdGVtJ1xuXHQgKi9cblx0cHVibGljIGdldENvbHVtbnNGcm9tTGluayAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHQpOiBBcGlSZXF1ZXN0Q29sdW1uW10ge1xuXHRcdGNvbnN0IGxpbmtUcmVlID0gdGhpcy5saW5rVHJlZVNlcnZpY2UuZ2V0KCk7XG5cdFx0Y29uc3QgbGlua1RyZWVFbnRyeSA9IGxpbmtUcmVlW3BhcmVudFR5cGVdW2l0ZW1UeXBlXTtcblx0XHRjb25zdCByZXN1bHQ6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0c3dpdGNoIChsaW5rVHJlZUVudHJ5LnR5cGUpIHtcblx0XHRcdGNhc2UgQXBpTGlua1RyZWVUeXBlLkRJUkVDVDpcblx0XHRcdFx0cmVzdWx0LnB1c2gobGlua1RyZWVFbnRyeS5maWVsZCk7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0Y2FzZSBBcGlMaW5rVHJlZVR5cGUuSVRFTVRBQkxFOlxuXHRcdFx0XHRyZXN1bHQucHVzaCgnaXRlbXR5cGUnKTtcblx0XHRcdFx0cmVzdWx0LnB1c2goJ2l0ZW0nKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldENvbHVtblBhdGggKFxuXHRcdGNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uW10sXG5cdFx0cmVuZGVyQXM6IG51bGwgfCBzdHJpbmcsXG5cdCkge1xuXHRcdGxldCBzZXBhcmF0b3IgPSAnJztcblx0XHRsZXQgcmVzdWx0ID0gJyc7XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG5cdFx0XHRyZXN1bHQgKz0gc2VwYXJhdG9yICsgY29sdW1uLmlkO1xuXHRcdFx0c2VwYXJhdG9yID0gQ09MVU1OX1NFUEVSQVRPUjtcblx0XHR9XG5cblx0XHRpZiAocmVuZGVyQXMgIT09IG51bGwpIHtcblx0XHRcdHJlc3VsdCArPSBSRU5ERVJfQVNfU0VQRVJBVE9SICsgcmVuZGVyQXM7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGdldERhdGVGb3JtYXRPcHRpb25zIChjb2x1bW5UeXBlPzogJ2RhdGV0aW1lJykge1xuXHRcdGNvbnN0IG5vdyA9IG1vbWVudCgpO1xuXG5cdFx0Y29uc3QgZm9ybWF0cyA9IHtcblx0XHRcdCdKLU0tWSc6IG5vdy5mb3JtYXQoJ0RELU1NLVlZWVknKSxcblx0XHRcdCdKLU0nOiBub3cuZm9ybWF0KCdERC1NTScpLFxuXHRcdFx0J2orRitZJzogbm93LmZvcm1hdCgnRCBNTU0gWVlZWScpLFxuXHRcdFx0J0QraitGK1knOiBub3cuZm9ybWF0KCdkZGRkIEQgTU1NIFlZWVknKSxcblx0XHRcdCdGJzogbm93LmZvcm1hdCgnTU1NJyksXG5cdFx0XHQnZic6IG5vdy5mb3JtYXQoJ01NTU0nKSxcblx0XHRcdCdEJzogbm93LmZvcm1hdCgnZGRkZCcpLFxuXHRcdFx0J2QnOiBub3cuZm9ybWF0KCdkZGQnKSxcblx0XHR9O1xuXG5cdFx0aWYgKGNvbHVtblR5cGUgPT09ICdkYXRldGltZScpIHtcblx0XHRcdGV4dGVuZChcblx0XHRcdFx0Zm9ybWF0cyxcblx0XHRcdFx0e1xuXHRcdFx0XHRcdCdKLU0tWStIOmknOiBub3cuZm9ybWF0KCdERC1NTS1ZWVlZIEhIOm1tJyksXG5cdFx0XHRcdFx0J0otTStIOmknOiBub3cuZm9ybWF0KCdERC1NTSBISDptbScpLFxuXHRcdFx0XHRcdCdqK0YrWStIOmknOiBub3cuZm9ybWF0KCdERCBNTU1NIFkgSEg6bW0nKSxcblx0XHRcdFx0XHQnRCtqK0YrWStIOmknOiBub3cuZm9ybWF0KCdkZGRkIEREIE1NTSBZIEhIOm1tJyksXG5cdFx0XHRcdFx0J0g6aSc6IG5vdy5mb3JtYXQoJ0hIOm1tJyksXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBmb3JtYXRzO1xuXHR9XG5cblx0aXNTdHJpbmdDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRjYXNlICdwaG9uZSc6XG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRjYXNlICd0ZXh0cmVwbGFjZSc6XG5cdFx0XHRcdC8vIGNhc2UgJ2h0bWwnOiAvLyBUT0RPOiBzb3J0IG9uIGZpbHRlcmVkIHZhbHVlXG5cdFx0XHRcdC8vIGNhc2UgJ2VudW0nOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc0Zsb2F0Q29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZG91YmxlJzogLy8gZmxvYXRpbmcgcG9pbnQgdHlwZXNcblx0XHRcdGNhc2UgJ3ZvbHVtZSc6XG5cdFx0XHRjYXNlICd3ZWlnaHQnOlxuXHRcdFx0Y2FzZSAnZGlzdGFuY2UnOlxuXHRcdFx0Y2FzZSAnZGltZW5zaW9uJzpcblx0XHRcdGNhc2UgJ3Bvd2VyJzpcblx0XHRcdGNhc2UgJ2N1cnJlbnQnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzSW50Q29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnaW50JzogLy8gaW50ZWdlciB0eXBlc1xuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ3F1YW50aXR5Jzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNOdW1iZXJDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5pc0Zsb2F0Q29sdW1uKGNvbHVtbikgfHwgdGhpcy5pc0ludENvbHVtbihjb2x1bW4pO1xuXHR9XG5cblx0aXNDdXN0b21Db2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRyZXR1cm4gY29sdW1uLmZpZWxkdHlwZSA9PT0gJ2N1c3RvbWZpZWxkJztcblx0fVxuXG5cdGlzSXRlbUNvbHVtbiAoXG5cdFx0Y29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRpbmNsdWRlSWQgPSB0cnVlLFxuXHQpOiBib29sZWFuIHtcblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdpZCc6XG5cdFx0XHRcdHJldHVybiBpbmNsdWRlSWQ7XG5cdFx0XHRjYXNlICdpdGVtJzpcblx0XHRcdGNhc2UgJ2NoaWxkJzpcblx0XHRcdGNhc2UgJ3NpYmxpbmcnOlxuXHRcdFx0Y2FzZSAnbGluayc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzRGF0ZUNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RhdGV0aW1lJzpcblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRpc1JlbmRlcmVkQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzRmlsdGVyZWRDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHQvLyB1Z2x5IGhhY2sgOi0oXG5cdFx0aWYgKGNvbHVtbi5pZCA9PT0gJ3N0YWZmZWwnKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uLmdlbmVyYXRvciAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRzd2l0Y2ggKGNvbHVtbi50eXBlKSB7XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdGNhc2UgJ2VudW0nOlxuXHRcdFx0Y2FzZSAnY291bnRyeSc6XG5cdFx0XHRjYXNlICd2b2x1bWUnOlxuXHRcdFx0Y2FzZSAnd2VpZ2h0Jzpcblx0XHRcdGNhc2UgJ2Rpc3RhbmNlJzpcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICdxdWFudGl0eSc6XG5cdFx0XHRjYXNlICdlbWFpbCc6XG5cdFx0XHRjYXNlICd1cmwnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdGNhc2UgJ2h0bWwnOlxuXHRcdFx0Y2FzZSAndGV4dHJlcGxhY2UnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAncGVyY2VudGFnZSc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGlzRm9ybWF0dGVkQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0Y2FzZSAnbnVtYmVyJzpcblx0XHRcdGNhc2UgJ2ZpbGVzaXplJzpcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0aXNTZWxlY3RhYmxlQ29sdW1uIChjb2x1bW46IFJlc3BvbnNlQ29sdW1uKTogYm9vbGVhbiB7XG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnYmxvYic6XG5cdFx0XHRjYXNlICdjb29yZGluYXRlJzpcblx0XHRcdGNhc2UgJ2ZvcmNldXBkYXRlJzpcblx0XHRcdGNhc2UgJ2lkJzpcblx0XHRcdGNhc2UgJ2pzb24nOlxuXHRcdFx0Y2FzZSAnb3JkZXInOlxuXHRcdFx0Y2FzZSAncGFyZW50aWQnOlxuXHRcdFx0Y2FzZSAncGFyZW50dHlwZSc6XG5cdFx0XHRjYXNlICdwYXNzd29yZCc6XG5cdFx0XHRjYXNlICd0b2tlbic6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGhhc0xvY2F0aW9uUHJvcGVydHkgKFxuXHRcdGNvbHVtbjogUmVzcG9uc2VDb2x1bW4sXG5cdFx0bG9jYXRpb246IG51bWJlcixcblx0KTogYm9vbGVhbiB7XG5cdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWJpdHdpc2Vcblx0XHRyZXR1cm4gKGxvY2F0aW9uICYgY29sdW1uLmxvY2F0aW9uKSAhPT0gMDtcblx0fVxuXG5cdGlzRWRpdGFibGVDb2x1bW4gKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBib29sZWFuIHtcblx0XHRpZiAoY29sdW1uLnJlYWRPbmx5KSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChjb2x1bW4udHlwZSkge1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGlzU2VhcmNoYWJsZUNvbHVtbiAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IGJvb2xlYW4ge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2VtYWlsJzpcblx0XHRcdGNhc2UgJ3Bob25lJzpcblx0XHRcdGNhc2UgJ3RleHQnOlxuXHRcdFx0Y2FzZSAnbG9uZ3RleHQnOlxuXHRcdFx0Y2FzZSAnaHRtbCc6XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdGdldERlZmF1bHRXZWlnaHQgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4pOiBudW1iZXIge1xuXHRcdC8vIFx0XHRcdGNvbnNvbGUubG9nKCdnZXREZWZhdWx0V2VpZ2h0JywgY29sdW1uKTtcblxuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RvdWJsZSc6XG5cdFx0XHRjYXNlICdwcmljZSc6XG5cdFx0XHRjYXNlICdib29sJzpcblx0XHRcdGNhc2UgJ2ludCc6XG5cdFx0XHRjYXNlICdwZXJjZW50YWdlJzpcblx0XHRcdGNhc2UgJ2NvbG9yJzpcblx0XHRcdGNhc2UgJ251bWJlcic6XG5cdFx0XHRjYXNlICdwb3dlcic6XG5cdFx0XHRjYXNlICdjdXJyZW50Jzpcblx0XHRcdFx0cmV0dXJuIDAuNTtcblxuXHRcdFx0Y2FzZSAndXJsJzpcblx0XHRcdGNhc2UgJ2VudW0nOlxuXHRcdFx0Y2FzZSAnZW1haWwnOlxuXHRcdFx0Y2FzZSAndGV4dCc6XG5cdFx0XHRjYXNlICdpdGVtJzpcblx0XHRcdGNhc2UgJ2xpbmsnOlxuXHRcdFx0XHRyZXR1cm4gMS41O1xuXG5cdFx0XHRjYXNlICdsb25ndGV4dCc6XG5cdFx0XHRjYXNlICdodG1sJzpcblx0XHRcdGNhc2UgJ3RleHRyZXBsYWNlJzpcblx0XHRcdFx0cmV0dXJuIDI7XG5cblx0XHRcdGNhc2UgJ2RhdGUnOlxuXHRcdFx0Y2FzZSAnZGF0ZXRpbWUnOlxuXHRcdFx0Y2FzZSAndGltZSc6XG5cdFx0XHRjYXNlICdkdXJhdGlvbic6XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIDE7XG5cdFx0fVxuXHR9XG5cblx0Z2V0Q29tcGFyYXRvcnMgKGNvbHVtbjogUmVzcG9uc2VDb2x1bW4gJiB7dHlwZTogJ2RpbWVuc2lvbicgfCAnd2VpZ2h0JyB8ICdwcmljZSd9KTogWyc9JywgJz4nLCAnPCddO1xuXHRnZXRDb21wYXJhdG9ycyAoY29sdW1uOiBSZXNwb25zZUNvbHVtbiAmIHt0eXBlOiAnZGF0ZScgfCAnZGF0ZXRpbWUnIHwgJ3RpbWUnIHwgJ2R1cmF0aW9uJ30pOiBbJz4nLCAnPCddO1xuXHRnZXRDb21wYXJhdG9ycyAoY29sdW1uOiBSZXNwb25zZUNvbHVtbik6IFsnPScsICchPSddO1xuXHRnZXRDb21wYXJhdG9ycyAoY29sdW1uOiBSZXNwb25zZUNvbHVtbikge1xuXHRcdHN3aXRjaCAoY29sdW1uLnR5cGUpIHtcblx0XHRcdGNhc2UgJ2RpbWVuc2lvbic6XG5cdFx0XHRjYXNlICd3ZWlnaHQnOlxuXHRcdFx0Y2FzZSAncHJpY2UnOlxuXHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdCc9Jyxcblx0XHRcdFx0XHQnPicsXG5cdFx0XHRcdFx0JzwnLFxuXHRcdFx0XHRdO1xuXHRcdFx0Y2FzZSAnZGF0ZSc6XG5cdFx0XHRjYXNlICdkYXRldGltZSc6XG5cdFx0XHRjYXNlICd0aW1lJzpcblx0XHRcdGNhc2UgJ2R1cmF0aW9uJzpcblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQnPicsXG5cdFx0XHRcdFx0JzwnLFxuXHRcdFx0XHRdO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0XHQnPScsXG5cdFx0XHRcdFx0JyE9Jyxcblx0XHRcdFx0XTtcblx0XHR9XG5cdH1cblxuXHRjb250YWluc0NvbHVtbiAoXG5cdFx0cmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbixcblx0XHRkZXN0aW5hdGlvbjogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblx0XHRjb25zdCBjb2x1bW5JbmRleCA9IHRoaXMuZmluZFJlcXVlc3RDb2x1bW4oXG5cdFx0XHRjb2x1bW4uaWQsXG5cdFx0XHRkZXN0aW5hdGlvbixcblx0XHQpO1xuXG5cdFx0aWYgKGNvbHVtbkluZGV4ID09PSAtMSkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmIChjb2x1bW4uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAodHlwZW9mIGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNoaWxkQ29sdW1uIG9mIGNvbHVtbi5jaGlsZHJlbikge1xuXHRcdFx0Ly8gQHRzLWlnbm9yZVxuXHRcdFx0aWYgKCF0aGlzLmNvbnRhaW5zQ29sdW1uKFxuXHRcdFx0XHRjaGlsZENvbHVtbixcblx0XHRcdFx0ZGVzdGluYXRpb25bY29sdW1uSW5kZXhdW2NvbHVtbi5pZF0sXG5cdFx0XHQpKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGNvbnRhaW5zRGVyaXZlZENvbHVtbnMgKHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10pOiBib29sZWFuIHtcblx0XHRmb3IgKGNvbnN0IGNvbHVtbiBvZiByZXF1ZXN0Q29sdW1ucykge1xuXHRcdFx0aWYgKHRoaXMucGFyc2VSZXF1ZXN0Q29sdW1uKGNvbHVtbikuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cblxuXHRyZXNwb25zZUNvbHVtbnNBdmFpbGFibGUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHJlc3BvbnNlQ29sdW1uTWFwOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBib29sZWFuIHtcblx0XHRmb3IgKGNvbnN0IHJlcXVlc3RDb2x1bW4gb2YgcmVxdWVzdENvbHVtbnMpIHtcblx0XHRcdGNvbnN0IHBhcnNlZENvbHVtbiA9IHRoaXMucGFyc2VSZXF1ZXN0Q29sdW1uKHJlcXVlc3RDb2x1bW4pO1xuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSBwYXJzZWRDb2x1bW4uY2hpbGRyZW47XG5cdFx0XHRjb25zdCByZXNwb25zZUNvbHVtbnMgPSByZXNwb25zZUNvbHVtbk1hcFtpdGVtVHlwZV07XG5cdFx0XHRsZXQgcmVzcG9uc2VDb2x1bW47XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbnMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3BvbnNlQ29sdW1uID0gcmVzcG9uc2VDb2x1bW5zW3BhcnNlZENvbHVtbi5pZF07XG5cblx0XHRcdGlmIChyZXNwb25zZUNvbHVtbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKFxuXHRcdFx0XHRjaGlsZHJlbi5sZW5ndGggPiAwICYmXG5cdFx0XHRcdCF0aGlzLnJlc3BvbnNlQ29sdW1uc0F2YWlsYWJsZShcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbi5pdGVtVHlwZSxcblx0XHRcdFx0XHRjaGlsZHJlbixcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbk1hcCxcblx0XHRcdFx0KVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGNvcHlSZXF1ZXN0Q29sdW1ucyAoY29sdW1uczogdHJ1ZSk6IHRydWU7XG5cdGNvcHlSZXF1ZXN0Q29sdW1ucyAoY29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdKTogQXBpUmVxdWVzdENvbHVtbltdO1xuXHRjb3B5UmVxdWVzdENvbHVtbnMgKGNvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogQXBpUmVxdWVzdENvbHVtbnMge1xuXHRcdGlmIChjb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRjb25zdCByZXN1bHQ6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29sdW1ucykge1xuXHRcdFx0cmVzdWx0LnB1c2godGhpcy5jb3B5UmVxdWVzdENvbHVtbihjb2x1bW4pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Y29weVJlcXVlc3RDb2x1bW4gKHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4pOiBBcGlSZXF1ZXN0Q29sdW1uIHtcblx0XHRjb25zdCBjb2x1bW4gPSB0aGlzLnBhcnNlUmVxdWVzdENvbHVtbihyZXF1ZXN0Q29sdW1uKTtcblxuXHRcdGlmIChjb2x1bW4uY2hpbGRyZW4ubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gY29sdW1uLmlkO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNoaWxkcmVuOiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY2hpbGRDb2x1bW4gb2YgY29sdW1uLmNoaWxkcmVuKSB7XG5cdFx0XHRjaGlsZHJlbi5wdXNoKHRoaXMuY29weVJlcXVlc3RDb2x1bW4oY2hpbGRDb2x1bW4pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1tjb2x1bW4uaWRdOiBjaGlsZHJlbn07XG5cdH1cblxuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogdHJ1ZSxcblx0XHRzZWNvbmQ6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQ8dHJ1ZSwgW10+O1xuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHNlY29uZDogdHJ1ZSxcblx0KTogUmVxdWVzdENvbHVtbk1lcmdlUmVzdWx0PHRydWUsIHRydWU+O1xuXHRtZXJnZVJlcXVlc3RDb2x1bW5zIChcblx0XHRmaXJzdDogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdHNlY29uZDogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOlxuXHRcdFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdDxBcGlSZXF1ZXN0Q29sdW1uW10sIEFwaVJlcXVlc3RDb2x1bW5bXT47XG5cdG1lcmdlUmVxdWVzdENvbHVtbnMgKFxuXHRcdGZpcnN0OiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0XHRzZWNvbmQ6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBSZXF1ZXN0Q29sdW1uTWVyZ2VSZXN1bHQ7XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBNZXJnZXMgdGhlIHBhc3NlZCBjb2x1bW5zIGFuZCByZXR1cm5zIHRoZSBtZXJnZWQgc2V0IGFuZCB0aGUgZGlmZmVyZW5jZS5cblx0ICpcblx0ICogQHJldHVybnNcblx0ICogLSBNZXJnZWQ6IFRoZSBtZXJnZWQgc2V0IG9mIGNvbHVtbnNcblx0ICogLSBEaWZmZXJlbmNlOiBDb2x1bW5zIHRoYXQgYXJlIGluIHNlY29uZCwgYnV0IG5vdCBpbiBmaXJzdFxuXHQgKi9cblx0bWVyZ2VSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Zmlyc3Q6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHNlY29uZDogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFJlcXVlc3RDb2x1bW5NZXJnZVJlc3VsdCB7XG5cdFx0aWYgKGZpcnN0ID09PSB0cnVlKSAvLyA9PT0gb3BlcmF0b3IgbmVlZGVkIGhlcmVcblx0XHR7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtZXJnZWQ6IHRydWUsXG5cdFx0XHRcdGRpZmZlcmVuY2U6IFtdLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoc2Vjb25kID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRtZXJnZWQ6IHRydWUsXG5cdFx0XHRcdGRpZmZlcmVuY2U6IHRydWUsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdGNvbnN0IG1lcmdlZCA9IHRoaXMuY29weVJlcXVlc3RDb2x1bW5zKGZpcnN0KTtcblx0XHRjb25zdCBkaWZmZXJlbmNlOiBBcGlSZXF1ZXN0Q29sdW1uW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uIG9mIHNlY29uZCkge1xuXHRcdFx0Y29uc3QgYWRkZWRDb2x1bW4gPSB0aGlzLm1lcmdlUmVxdWVzdENvbHVtbihcblx0XHRcdFx0Y29sdW1uLFxuXHRcdFx0XHRtZXJnZWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoYWRkZWRDb2x1bW4gIT09IG51bGwpIHtcblx0XHRcdFx0ZGlmZmVyZW5jZS5wdXNoKGFkZGVkQ29sdW1uKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVyZ2VkOiBtZXJnZWQsXG5cdFx0XHRkaWZmZXJlbmNlOiBkaWZmZXJlbmNlLFxuXHRcdH07XG5cdH1cblxuXHRtZXJnZVJlcXVlc3RDb2x1bW4gKFxuXHRcdHJlcXVlc3RDb2x1bW46IEFwaVJlcXVlc3RDb2x1bW4sXG5cdFx0ZGVzdGluYXRpb246IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KSB7XG5cdFx0Y29uc3QgY29sdW1uID0gdGhpcy5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cdFx0Y29uc3QgY29sdW1uSW5kZXggPSB0aGlzLmZpbmRSZXF1ZXN0Q29sdW1uKFxuXHRcdFx0Y29sdW1uLmlkLFxuXHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0KTtcblxuXHRcdGlmIChjb2x1bW5JbmRleCA9PT0gLTEpIHtcblx0XHRcdGRlc3RpbmF0aW9uLnB1c2gocmVxdWVzdENvbHVtbik7XG5cdFx0XHRyZXR1cm4gcmVxdWVzdENvbHVtbjtcblx0XHR9XG5cblx0XHRpZiAoY29sdW1uLmNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0aWYgKHR5cGVvZiBkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPSB7XG5cdFx0XHRcdFtjb2x1bW4uaWRdOiBbXSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgYWRkZWRDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjaGlsZENvbHVtbiBvZiBjb2x1bW4uY2hpbGRyZW4pIHtcblx0XHRcdGNvbnN0IGFkZGVkQ29sdW1uID0gdGhpcy5tZXJnZVJlcXVlc3RDb2x1bW4oXG5cdFx0XHRcdGNoaWxkQ29sdW1uLFxuXHRcdFx0XHQvLyBAdHMtaWdub3JlXG5cdFx0XHRcdGRlc3RpbmF0aW9uW2NvbHVtbkluZGV4XVtjb2x1bW4uaWRdLFxuXHRcdFx0KTtcblxuXHRcdFx0aWYgKGFkZGVkQ29sdW1uICE9PSBudWxsKSB7XG5cdFx0XHRcdGFkZGVkQ29sdW1ucy5wdXNoKGFkZGVkQ29sdW1uKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoYWRkZWRDb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtbY29sdW1uLmlkXTogYWRkZWRDb2x1bW5zfTtcblx0fVxuXG5cdGdldFJlcXVlc3RDb2x1bW5JZCAocmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbik6IHN0cmluZyB7XG5cdFx0aWYgKHR5cGVvZiByZXF1ZXN0Q29sdW1uID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHJlcXVlc3RDb2x1bW47XG5cdFx0fVxuXG5cdFx0bGV0IGNvbHVtbklkO1xuXG5cdFx0Zm9yIChjb2x1bW5JZCBpbiByZXF1ZXN0Q29sdW1uKSB7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbHVtbklkIGFzIHN0cmluZztcblx0fVxuXG5cdHBhcnNlUmVxdWVzdENvbHVtbiAocmVxdWVzdENvbHVtbjogQXBpUmVxdWVzdENvbHVtbik6IHtpZDogc3RyaW5nLCBjaGlsZHJlbjogQXBpUmVxdWVzdENvbHVtbltdfSB7XG5cdFx0aWYgKHR5cGVvZiByZXF1ZXN0Q29sdW1uID09PSAnc3RyaW5nJykge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0aWQ6IHJlcXVlc3RDb2x1bW4sXG5cdFx0XHRcdGNoaWxkcmVuOiBbXSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0bGV0IGNvbHVtbklkO1xuXG5cdFx0Zm9yIChjb2x1bW5JZCBpbiByZXF1ZXN0Q29sdW1uKSB7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBjb2x1bW5JZCBhcyBzdHJpbmcsXG5cdFx0XHRjaGlsZHJlbjogcmVxdWVzdENvbHVtbltjb2x1bW5JZCBhcyBzdHJpbmddLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0d28gc2V0cyBvZiB7QGxpbmsgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwc30uXG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIC0gTWVyZ2VkOiBUaGUgbWVyZ2VkIHNldCBvZiBjb2x1bW5zXG5cdCAqIC0gRGlmZmVyZW5jZTogQ29sdW1ucyB0aGF0IGFyZSBpbiBzZWNvbmQsIGJ1dCBub3QgaW4gZmlyc3Rcblx0ICovXG5cdG1lcmdlUmVzcG9uc2VDb2x1bW5zIChcblx0XHRmaXJzdDogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRzZWNvbmQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdCk6IHttZXJnZWQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsIGRpZmZlcmVuY2U6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXB9IHtcblx0XHRjb25zdCBtZXJnZWQ6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgPSB7fTtcblx0XHRjb25zdCBkaWZmZXJlbmNlOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGZpcnN0KSB7XG5cdFx0XHRpZiAoc2Vjb25kW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdG1lcmdlZFtpdGVtVHlwZV0gPSBmaXJzdFtpdGVtVHlwZV07XG5cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IG1lcmdlUmVzdWx0ID0gdGhpcy5tZXJnZVJlc3BvbnNlQ29sdW1uTWFwKFxuXHRcdFx0XHRmaXJzdFtpdGVtVHlwZV0sXG5cdFx0XHRcdHNlY29uZFtpdGVtVHlwZV0sXG5cdFx0XHQpO1xuXG5cdFx0XHRtZXJnZWRbaXRlbVR5cGVdID0gbWVyZ2VSZXN1bHQubWVyZ2VkO1xuXHRcdFx0ZGlmZmVyZW5jZVtpdGVtVHlwZV0gPSBtZXJnZVJlc3VsdC5kaWZmZXJlbmNlO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gc2Vjb25kKSB7XG5cdFx0XHRpZiAoZmlyc3RbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0bWVyZ2VkW2l0ZW1UeXBlXSA9IHNlY29uZFtpdGVtVHlwZV07XG5cdFx0XHRcdGRpZmZlcmVuY2VbaXRlbVR5cGVdID0gc2Vjb25kW2l0ZW1UeXBlXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bWVyZ2VkOiBtZXJnZWQsXG5cdFx0XHRkaWZmZXJlbmNlOiBkaWZmZXJlbmNlLFxuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0d28gc2V0cyBvZiB7QGxpbmsgUmVzcG9uc2VDb2x1bW5NYXAgcmVzcG9uc2UgY29sdW1uc30uXG5cdCAqXG5cdCAqIEByZXR1cm5zXG5cdCAqIC0gTWVyZ2VkOiBUaGUgbWVyZ2VkIHNldCBvZiBjb2x1bW5zXG5cdCAqIC0gRGlmZmVyZW5jZTogQ29sdW1ucyB0aGF0IGFyZSBpbiBzZWNvbmQsIGJ1dCBub3QgaW4gZmlyc3Rcblx0ICovXG5cdG1lcmdlUmVzcG9uc2VDb2x1bW5NYXAgKFxuXHRcdGZpcnN0OiBSZXNwb25zZUNvbHVtbk1hcCxcblx0XHRzZWNvbmQ6IFJlc3BvbnNlQ29sdW1uTWFwLFxuXHQpOiB7bWVyZ2VkOiBSZXNwb25zZUNvbHVtbk1hcCwgZGlmZmVyZW5jZTogUmVzcG9uc2VDb2x1bW5NYXB9IHtcblx0XHRjb25zdCBtZXJnZWQ6IFJlc3BvbnNlQ29sdW1uTWFwID0ge307XG5cdFx0Y29uc3QgZGlmZmVyZW5jZTogUmVzcG9uc2VDb2x1bW5NYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gZmlyc3QpIHtcblx0XHRcdG1lcmdlZFtjb2x1bW5JZF0gPSBmaXJzdFtjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBzZWNvbmQpIHtcblx0XHRcdGlmIChpc0RlZmluZWQoZmlyc3RbY29sdW1uSWRdKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bWVyZ2VkW2NvbHVtbklkXSA9IHNlY29uZFtjb2x1bW5JZF07XG5cdFx0XHRkaWZmZXJlbmNlW2NvbHVtbklkXSA9IHNlY29uZFtjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG1lcmdlZDogbWVyZ2VkLFxuXHRcdFx0ZGlmZmVyZW5jZTogZGlmZmVyZW5jZSxcblx0XHR9O1xuXHR9XG5cblx0aXNMb2NhbENvbHVtbklkIChjb2x1bW5JZDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGNvbHVtbklkLnN1YnN0cmluZyhcblx0XHRcdDAsXG5cdFx0XHQyLFxuXHRcdCkgPT09ICdfXyc7XG5cdH1cblxuXHRwcm9jZXNzQ29uZmlnQ29sdW1ucyAoY29uZmlnQ29sdW1uczogc3RyaW5nW10pOiBBcGlSZXF1ZXN0Q29sdW1uW10ge1xuXHRcdGNvbnN0IHJlcXVlc3Q6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW4gb2YgY29uZmlnQ29sdW1ucykge1xuXHRcdFx0aWYgKHRoaXMuaXNMb2NhbENvbHVtbklkKGNvbHVtbikpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMucHJvY2Vzc0NvbmZpZ0NvbHVtbihcblx0XHRcdFx0dGhpcy5wYXJzZUNvbmZpZ0NvbHVtbihjb2x1bW4pLFxuXHRcdFx0XHRyZXF1ZXN0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVxdWVzdDtcblx0fVxuXG5cdHBhcnNlQ29uZmlnQ29sdW1uIChjb25maWdDb2x1bW46IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHRyZXR1cm4gY29uZmlnQ29sdW1uLnNwbGl0KFJFTkRFUl9BU19TRVBFUkFUT1IpWzBdLnNwbGl0KENPTFVNTl9TRVBFUkFUT1IpO1xuXHR9XG5cblx0cHJvY2Vzc0NvbmZpZ0NvbHVtbiAoXG5cdFx0cGFyc2VkQ29uZmlnQ29sdW1uOiBzdHJpbmdbXSxcblx0XHRkZXN0aW5hdGlvbjogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpIHtcblx0XHRjb25zdCBjb2x1bW5JZCA9IHBhcnNlZENvbmZpZ0NvbHVtblswXTtcblx0XHRjb25zdCBpc0xlYWYgPSBwYXJzZWRDb25maWdDb2x1bW4ubGVuZ3RoID09PSAxO1xuXHRcdGxldCBjb2x1bW5JbmRleCA9IHRoaXMuZmluZFJlcXVlc3RDb2x1bW4oXG5cdFx0XHRjb2x1bW5JZCxcblx0XHRcdGRlc3RpbmF0aW9uLFxuXHRcdCk7XG5cblx0XHRpZiAoaXNMZWFmKSB7XG5cdFx0XHRpZiAoY29sdW1uSW5kZXggPT09IC0xKSB7XG5cdFx0XHRcdGRlc3RpbmF0aW9uLnB1c2goY29sdW1uSWQpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKGNvbHVtbkluZGV4ID09PSAtMSkge1xuXHRcdFx0Y29sdW1uSW5kZXggPSBkZXN0aW5hdGlvbi5wdXNoKHtbY29sdW1uSWRdOiBbXX0pIC0gMTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF0gPSB7W2NvbHVtbklkXTogW119O1xuXHRcdH1cblxuXHRcdC8vIEB0cy1pZ25vcmVcblx0XHR0aGlzLnByb2Nlc3NDb25maWdDb2x1bW4oXG5cdFx0XHRwYXJzZWRDb25maWdDb2x1bW4uc2xpY2UoMSksXG5cdFx0XHRkZXN0aW5hdGlvbltjb2x1bW5JbmRleF1bY29sdW1uSWRdLFxuXHRcdCk7XG5cdH1cblxuXHRmaW5kUmVxdWVzdENvbHVtbiAoXG5cdFx0Y29sdW1uSWQ6IHN0cmluZyxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHQpOiBudW1iZXIge1xuXHRcdGZvciAobGV0IGkgPSAwOyBpIDwgcmVxdWVzdENvbHVtbnMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGNvbHVtbiA9IHJlcXVlc3RDb2x1bW5zW2ldO1xuXG5cdFx0XHRpZiAodGhpcy5nZXRSZXF1ZXN0Q29sdW1uSWQoY29sdW1uKSA9PT0gY29sdW1uSWQpIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIC0xO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlGb3JtYXR0ZXIsIENyZWF0ZUNvbXBpbGF0aW9uLCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDcmVhdGVSZXF1ZXN0RW50cnksIEl0ZW1JZCwgSXRlbU1hcCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEludGVybmFsQ3JlYXRlRGVsdGEgfSBmcm9tICcuL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcblxuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vVXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBDcmVhdGVSZXF1ZXN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiB7XG5cblx0cmVxdWVzdHM6IEFycmF5PENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGU+PiA9IFtdO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbXBpbGF0aW9uOiBDcmVhdGVDb21waWxhdGlvbixcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdHByaXZhdGUgYnJlYWt1cEJ5UGFyZW50ID0gZmFsc2UsXG5cdCkge1xuXHR9XG5cblx0ZmluYWxpemVSZXF1ZXN0IChyZXF1ZXN0UmVzb3VyY2U6IENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGU+KSB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJpZXMgPSByZXF1ZXN0UmVzb3VyY2UuY29sbGVjdGlvbnMuZ2V0Q29sbGVjdGlvbnNXaXRoRml0dGluZ0l0ZW1zKCk7XG5cdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gcmVxdWVzdFJlc291cmNlLmNvbHVtbnM7XG5cblx0XHRmb3IgKGNvbnN0IGNvbGxlY3Rpb25FbnRyeSBvZiBjb2xsZWN0aW9uRW50cmllcykge1xuXHRcdFx0Y29sdW1uRXhwYW5zaW9uLmV4cGFuZChjb2xsZWN0aW9uRW50cnkuY29sdW1ucyk7XG5cdFx0fVxuXG5cdFx0cmVxdWVzdFJlc291cmNlLnJlcXVlc3QuY29sdW1ucyA9IGNvbHVtbkV4cGFuc2lvbi5nZXQoKTtcblxuXHRcdHJldHVybiByZXF1ZXN0UmVzb3VyY2U7XG5cdH1cblxuXHRzZXRSZXF1ZXN0UGFyZW50IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0RW50cnk6IENyZWF0ZVJlcXVlc3RFbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHQpIHtcblx0XHRjb25zdCByZXF1ZXN0ID0gcmVxdWVzdEVudHJ5LnJlcXVlc3Q7XG5cblx0XHRpZiAocGFyZW50VHlwZSA9PT0gJ1ZvaWQnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmVxdWVzdC5wYXJlbnRUeXBlID0gcGFyZW50VHlwZTtcblx0XHRyZXF1ZXN0LnBhcmVudElkID0ge307XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBydW4gKCkge1xuXHRcdGNvbnN0IGNvbXBpbGF0aW9uID0gdGhpcy5jb21waWxhdGlvbjtcblxuXHRcdGlmICh0aGlzLmJyZWFrdXBCeVBhcmVudCkge1xuXHRcdFx0Zm9yIChjb25zdCBwYXJlbnRUeXBlIGluIGNvbXBpbGF0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHBhcmVudE1hcCA9IGNvbXBpbGF0aW9uW3BhcmVudFR5cGVdO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgcGFyZW50SWQgaW4gcGFyZW50TWFwKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMua2V5U2VydmljZS5pc0xvY2FsSWQocGFyZW50SWQpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRjb25zdCByZXF1ZXN0UmVzb3VyY2UgPSB0aGlzLmluaXRpYWxpemVSZXF1ZXN0KCk7XG5cblx0XHRcdFx0XHR0aGlzLmV4dGVuZFJlcXVlc3QoXG5cdFx0XHRcdFx0XHRwYXJlbnRNYXBbcGFyZW50SWRdLFxuXHRcdFx0XHRcdFx0dGhpcy5zZXRSZXF1ZXN0UGFyZW50KFxuXHRcdFx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdFx0XHRyZXF1ZXN0UmVzb3VyY2UsXG5cdFx0XHRcdFx0XHQpID8gK3BhcmVudElkIDogbnVsbCxcblx0XHRcdFx0XHRcdHJlcXVlc3RSZXNvdXJjZSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0dGhpcy5yZXF1ZXN0cy5wdXNoKHRoaXMuZmluYWxpemVSZXF1ZXN0KHJlcXVlc3RSZXNvdXJjZSkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdGZvciAoY29uc3QgcGFyZW50VHlwZSBpbiBjb21waWxhdGlvbikge1xuXHRcdFx0XHRjb25zdCBwYXJlbnRNYXAgPSBjb21waWxhdGlvbltwYXJlbnRUeXBlXTtcblx0XHRcdFx0Y29uc3QgcmVxdWVzdFJlc291cmNlID0gdGhpcy5pbml0aWFsaXplUmVxdWVzdCgpO1xuXHRcdFx0XHRjb25zdCBoYXNQYXJlbnQgPSB0aGlzLnNldFJlcXVlc3RQYXJlbnQoXG5cdFx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0XHRyZXF1ZXN0UmVzb3VyY2UsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0bGV0IHZhbGlkUmVxdWVzdCA9IGZhbHNlO1xuXG5cdFx0XHRcdGZvciAoY29uc3QgcGFyZW50SWQgaW4gcGFyZW50TWFwKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMua2V5U2VydmljZS5pc0xvY2FsSWQocGFyZW50SWQpKSB7XG5cdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR0aGlzLmV4dGVuZFJlcXVlc3QoXG5cdFx0XHRcdFx0XHRwYXJlbnRNYXBbcGFyZW50SWRdLFxuXHRcdFx0XHRcdFx0aGFzUGFyZW50ID8gK3BhcmVudElkIDogbnVsbCxcblx0XHRcdFx0XHRcdHJlcXVlc3RSZXNvdXJjZSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0dmFsaWRSZXF1ZXN0ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICh2YWxpZFJlcXVlc3QpIHtcblx0XHRcdFx0XHR0aGlzLnJlcXVlc3RzLnB1c2godGhpcy5maW5hbGl6ZVJlcXVlc3QocmVxdWVzdFJlc291cmNlKSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0cztcblx0fVxuXG5cdGluaXRpYWxpemVSZXF1ZXN0ICgpOiBDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHJlcXVlc3Q6IHtcblx0XHRcdFx0cmVxdWVzdFR5cGU6ICdjcmVhdGUnLFxuXHRcdFx0XHRpdGVtczoge30sXG5cdFx0XHRcdGNvbHVtbnM6IHt9LFxuXHRcdFx0fSxcblx0XHRcdGNvbHVtbnM6IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCksXG5cdFx0XHRpdGVtczoge30sXG5cdFx0XHRjb2xsZWN0aW9uczogdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5nZXRDb2xsZWN0aW9uTWF0Y2hlcigpLFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIGV4dGVuZFJlcXVlc3QgKFxuXHRcdGl0ZW1WYWx1ZXM6IEl0ZW1NYXA8SW50ZXJuYWxDcmVhdGVEZWx0YT4sXG5cdFx0cmVxdWVzdFBhcmVudElkOiBJdGVtSWQgfCBudWxsLFxuXHRcdGRlc3RpbmF0aW9uOiBDcmVhdGVSZXF1ZXN0RW50cnk8SXRlbVR5cGVUeXBlPixcblx0KSB7XG5cdFx0Y29uc3QgcmVxdWVzdCA9IGRlc3RpbmF0aW9uLnJlcXVlc3Q7XG5cdFx0Y29uc3QgaXRlbUVudHJ5TWFwID0gZGVzdGluYXRpb24uaXRlbXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGl0ZW1WYWx1ZXMpIHtcblx0XHRcdGlmIChyZXF1ZXN0Lml0ZW1UeXBlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVxdWVzdC5pdGVtVHlwZSA9IGl0ZW1UeXBlIGFzIEl0ZW1UeXBlVHlwZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGl0ZW1FbnRyeU1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRpdGVtRW50cnlNYXBbaXRlbVR5cGVdID0ge307XG5cdFx0XHRcdHJlcXVlc3QuaXRlbXNbaXRlbVR5cGVdID0ge307XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGl0ZW1WYWx1ZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNvbnN0IGludGVybmFsQ3JlYXRlRGVsdGE6IEludGVybmFsQ3JlYXRlRGVsdGEgPSBpdGVtVmFsdWVzW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHRcdFx0XHRjb25zdCBpdGVtRW50cnkgPSBpbnRlcm5hbENyZWF0ZURlbHRhLmVudHJ5O1xuXG5cdFx0XHRcdGNvbnN0IGNoaWxkRW50cmllcyA9IGdldFBhdGgoXG5cdFx0XHRcdFx0dGhpcy5jb21waWxhdGlvbixcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeS5pdGVtSWQsXG5cdFx0XHRcdFx0XSxcblx0XHRcdFx0KTtcblx0XHRcdFx0Y29uc3QgaXRlbVJlcXVlc3Q6IGFueSA9IHJlcXVlc3QuaXRlbXNbaXRlbVR5cGVdW2l0ZW1FbnRyeS5pdGVtSWRdID0ge307XG5cdFx0XHRcdGNvbnN0IHBhcmFtZXRlcnMgPSBnZXRQYXRoKFxuXHRcdFx0XHRcdHRoaXMudHJhbnNhY3Rpb24udGFiUmVxdWVzdFBhcmFtZXRlcnMsXG5cdFx0XHRcdFx0W1xuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRcdF0sXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aWYgKHJlcXVlc3RQYXJlbnRJZCAhPT0gbnVsbCkge1xuXHRcdFx0XHRcdChyZXF1ZXN0LnBhcmVudElkIGFzIHtbaXRlbUlkOiBzdHJpbmddOiBJdGVtSWR9KVtpdGVtRW50cnkuaXRlbUlkXSA9IHJlcXVlc3RQYXJlbnRJZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGRlc3RpbmF0aW9uLmNvbHVtbnMuZXhwYW5kKGl0ZW1FbnRyeS5jb2x1bW5zKTtcblxuXHRcdFx0XHQvLyB0b2RvW2NhY2hlXSBuZWVkIHRoaXMgP1xuXHRcdFx0XHQvLyBkZXN0aW5hdGlvbi5jb2xsZWN0aW9ucy5leHBhbmQoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRpdGVtRW50cnlNYXBbaXRlbVR5cGVdW2l0ZW1JZF0gPSBpdGVtRW50cnk7XG5cblx0XHRcdFx0aXRlbVJlcXVlc3QudmFsdWVzID0gdGhpcy5hcGlGb3JtYXR0ZXIuZm9ybWF0UmVxdWVzdExvY2FsKFxuXHRcdFx0XHRcdGludGVybmFsQ3JlYXRlRGVsdGEuZmllbGRzLFxuXHRcdFx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0aXRlbVJlcXVlc3QucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG5cblx0XHRcdFx0aWYgKGNoaWxkRW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBsaW5rczoge1tpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW119ID0gaXRlbVJlcXVlc3QubGlua3MgPSB7fTtcblxuXHRcdFx0XHRmb3IgKGNvbnN0IGNoaWxkVHlwZSBpbiBjaGlsZEVudHJpZXMpIHtcblx0XHRcdFx0XHRsaW5rc1tjaGlsZFR5cGVdID0gW107XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGNoaWxkSWQgaW4gY2hpbGRFbnRyaWVzW2NoaWxkVHlwZV0pIHtcblx0XHRcdFx0XHRcdGxpbmtzW2NoaWxkVHlwZV0ucHVzaChwYXJzZUludChcblx0XHRcdFx0XHRcdFx0Y2hpbGRJZCxcblx0XHRcdFx0XHRcdFx0MTAsXG5cdFx0XHRcdFx0XHQpKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR0aGlzLmV4dGVuZFJlcXVlc3QoXG5cdFx0XHRcdFx0Y2hpbGRFbnRyaWVzLFxuXHRcdFx0XHRcdG51bGwsXG5cdFx0XHRcdFx0ZGVzdGluYXRpb24sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgeyBBcGlRdWVyeSwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBnZXRGaXJzdFByb3BlcnR5IH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGVudW0gT1BFUkFUT1JTIHtcblx0T1IgPSAnT1InLFxuXHRBTkQgPSAnQU5EJ1xufVxuXG5leHBvcnQgdHlwZSBPUEVSQVRPUlNfVFlQRSA9ICdPUicgfCAnQU5EJyB8ICdvcicgfCAnYW5kJyB8IE9QRVJBVE9SUztcblxuZXhwb3J0IGVudW0gQ09NUEFSQVRPUlMge1xuXHRFUVVBTFMgPSAnPScsXG5cdE5PVF9FUVVBTFMgPSAnIT0nLFxuXHRMRVNTX1RIQU4gPSAnPCcsXG5cdE1PUkVfVEhBTiA9ICc+Jyxcblx0TEVTU19PUl9FUVVBTF9USEFOID0gJzw9Jyxcblx0RVFVQUxfT1JfTU9SRV9USEFOID0gJz49Jyxcblx0SU4gPSAnSU4nXG59XG5cbmV4cG9ydCB0eXBlIENPTVBBUkFUT1JTX1RZUEUgPSAnPScgfCAnIT0nIHwgJzwnIHwgJz4nIHwgJzw9JyB8ICc+PScgfCAnSU4nIHwgQ09NUEFSQVRPUlM7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBRdWVyeVBhcnNlckJhc2U8UmV0dXJuVHlwZSBleHRlbmRzIGFueT4ge1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIHF1ZXJ5OiBBcGlRdWVyeSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgcGFyc2UgKHF1ZXJ5OiBBcGlRdWVyeSA9IHRoaXMucXVlcnkpOiBSZXR1cm5UeXBlIHtcblx0XHRpZiAocXVlcnkubGlua2VkVG8gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VMaW5rZWRUb1F1ZXJ5KFxuXHRcdFx0XHRxdWVyeS5saW5rZWRUbyxcblx0XHRcdFx0cXVlcnkucXVlcnksXG5cdFx0XHRcdHF1ZXJ5LnJldmVyc2UsXG5cdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LmN1c3RvbSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZUN1c3RvbVF1ZXJ5KFxuXHRcdFx0XHRxdWVyeS5jdXN0b20sXG5cdFx0XHRcdHF1ZXJ5LnBhcmFtZXRlcnMsXG5cdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LnNlYXJjaCAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZVNlYXJjaFF1ZXJ5KFxuXHRcdFx0XHRxdWVyeS5zZWFyY2gsXG5cdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LmNvbmRpdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VDb21wbGV4UXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LmNvbmRpdGlvbnMsXG5cdFx0XHRcdHF1ZXJ5Lm9wZXJhdG9yLFxuXHRcdFx0XHRxdWVyeS5ub3QsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5pdGVtVHlwZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wYXJzZVN1YkZpZWxkUXVlcnkoXG5cdFx0XHRcdHF1ZXJ5LmtleSxcblx0XHRcdFx0cXVlcnkuaXRlbVR5cGUsXG5cdFx0XHRcdHF1ZXJ5LmZpZWxkLFxuXHRcdFx0XHRxdWVyeS5xdWVyeSxcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkua2V5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdGlmICh0eXBlb2YgcXVlcnkucXVlcnkgPT09ICdvYmplY3QnKSB7XG5cdFx0XHRcdHJldHVybiB0aGlzLnBhcnNlU3ViUXVlcnkoXG5cdFx0XHRcdFx0cXVlcnkua2V5LFxuXHRcdFx0XHRcdHF1ZXJ5LnF1ZXJ5LFxuXHRcdFx0XHRcdHF1ZXJ5Lm5vdCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VTaW1wbGVRdWVyeShcblx0XHRcdFx0cXVlcnkua2V5LFxuXHRcdFx0XHRxdWVyeS52YWx1ZSxcblx0XHRcdFx0cXVlcnkuY29tcGFyYXRvcixcblx0XHRcdFx0cXVlcnkubm90LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBrZXkgPSBnZXRGaXJzdFByb3BlcnR5KHF1ZXJ5KTtcblxuXHRcdGlmIChrZXkgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiB0aGlzLnBhcnNlRW1wdHlRdWVyeSgpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHZhbHVlID0gcXVlcnlba2V5XTtcblxuXHRcdC8vIHR5cGVvZiBudWxsIGlzIGFuIG9iamVjdCA6dGhpbmtpbmc6XG5cdFx0aWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUuY29uc3RydWN0b3IgPT09IE9iamVjdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucGFyc2VTdWJRdWVyeShcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnBhcnNlU2ltcGxlUXVlcnkoXG5cdFx0XHRrZXksXG5cdFx0XHR2YWx1ZSxcblx0XHRcdHF1ZXJ5LmNvbXBhcmF0b3IsXG5cdFx0XHRxdWVyeS5ub3QsXG5cdFx0KTtcblx0fVxuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUVtcHR5UXVlcnkgKCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlU3ViUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdHN1YlF1ZXJ5OiBvYmplY3QsXG5cdFx0bm90OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZVN1YkZpZWxkUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRmaWVsZDogc3RyaW5nLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG5cblx0cHJvdGVjdGVkIGFic3RyYWN0IHBhcnNlU2VhcmNoUXVlcnkgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0bm90OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZUN1c3RvbVF1ZXJ5IChcblx0XHRjdXN0b206IHN0cmluZyxcblx0XHRwYXJhbWV0ZXJzOiBhbnksXG5cdFx0bm90OiBib29sZWFuLFxuXHQpOiBSZXR1cm5UeXBlO1xuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBwYXJzZVNpbXBsZVF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHRcdGNvbXBhcmF0b3I6IENPTVBBUkFUT1JTX1RZUEUsXG5cdFx0bm90PzogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VMaW5rZWRUb1F1ZXJ5IChcblx0XHRsaW5rZWRUbzogYW55LFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRyZXZlcnNlOiBib29sZWFuLFxuXHRcdG5vdDogYm9vbGVhbixcblx0KTogUmV0dXJuVHlwZTtcblxuXHRwcm90ZWN0ZWQgYWJzdHJhY3QgcGFyc2VDb21wbGV4UXVlcnkgKFxuXHRcdGNvbmRpdGlvbnM6IGFueVtdLFxuXHRcdG9wZXJhdG9yOiBPUEVSQVRPUlNfVFlQRSxcblx0XHRub3Q6IGJvb2xlYW4sXG5cdCk6IFJldHVyblR5cGU7XG59XG4iLCJpbXBvcnQgeyBBcGlRdWVyeSwgQXBpUmVxdWVzdENvbHVtbiwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IENPTVBBUkFUT1JTX1RZUEUgfSBmcm9tICcuL1F1ZXJ5UGFyc2VyJztcbmltcG9ydCB7IE9QRVJBVE9SU19UWVBFLCBRdWVyeVBhcnNlckJhc2UgfSBmcm9tICcuL1F1ZXJ5UGFyc2VyQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeUNvbHVtbkV4dHJhY3RvclxuXHRleHRlbmRzIFF1ZXJ5UGFyc2VyQmFzZTxBcGlSZXF1ZXN0Q29sdW1uW10+IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgaXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0KSB7XG5cdFx0c3VwZXIocXVlcnkpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlRW1wdHlRdWVyeSAoKSB7XG5cdFx0cmV0dXJuIFtdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU3ViUXVlcnkgKFxuXHRcdGtleTogc3RyaW5nLFxuXHRcdHN1YlF1ZXJ5OiBvYmplY3QsXG5cdFx0X25vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpIHtcblx0XHRyZXR1cm4gW3tba2V5XTogdGhpcy5wYXJzZShzdWJRdWVyeSl9XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVN1YkZpZWxkUXVlcnkgKFxuXHRcdF9rZXk6IHN0cmluZyxcblx0XHRfaXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdF9maWVsZDogc3RyaW5nLFxuXHRcdF9xdWVyeTogQXBpUXVlcnksXG5cdFx0X25vdDogYm9vbGVhbixcblx0KSB7XG5cdFx0cmV0dXJuIFtdO1xuXHRcdC8vIHRvZG9bY2FjaGVdIFdlIHNob3VsZCBleHBhbmQgdGhlIHJlcXVlc3RDb2x1bW5zIHdpdGgge1tpdGVtVHlwZV06IHRoaXMucGFyc2UocXVlcnkpfSBidXQgY3VycmVudGx5IGNvbGxlY3Rpb25zIG9ubHkgYWxsb3cgZmV0Y2hpbmcgZGlyZWN0IGNvbHVtbnNcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVNlYXJjaFF1ZXJ5IChcblx0XHRfdmFsdWU6IGFueSxcblx0XHRfbm90OiBib29sZWFuLFxuXHQpIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDdXN0b21RdWVyeSAoXG5cdFx0X2N1c3RvbTogc3RyaW5nLFxuXHRcdF9wYXJhbWV0ZXJzOiBhbnksXG5cdFx0X25vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpIHtcblx0XHRyZXR1cm4gW107XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTaW1wbGVRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0X3ZhbHVlOiBhbnksXG5cdFx0X2NvbXBhcmF0b3I/OiBDT01QQVJBVE9SU19UWVBFLFxuXHRcdF9ub3Q/OiBib29sZWFuLFxuXHQpIHtcblx0XHRyZXR1cm4gW2tleV07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VMaW5rZWRUb1F1ZXJ5IChcblx0XHRsaW5rZWRUbzogYW55LFxuXHRcdF9xdWVyeTogQXBpUXVlcnkgPSB7fSBhcyBBcGlRdWVyeSxcblx0XHRfcmV2ZXJzZTogYm9vbGVhbiA9IGZhbHNlLFxuXHRcdF9ub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KSB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uVXRpbC5nZXRDb2x1bW5zRnJvbUxpbmsoXG5cdFx0XHRsaW5rZWRUbyxcblx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0KTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZUNvbXBsZXhRdWVyeSAoXG5cdFx0Y29uZGl0aW9uczogYW55W10sXG5cdFx0X29wZXJhdG9yPzogT1BFUkFUT1JTX1RZUEUsXG5cdFx0X25vdD86IGJvb2xlYW4sXG5cdCkge1xuXHRcdHJldHVybiB0aGlzLnBhcnNlQ29uZGl0aW9ucyhjb25kaXRpb25zKTtcblx0fVxuXG5cdHByaXZhdGUgcGFyc2VDb25kaXRpb25zIChjb25kaXRpb25zOiBhbnlbXSkge1xuXHRcdHJldHVybiBjb25kaXRpb25zLnJlZHVjZShcblx0XHRcdChcblx0XHRcdFx0YWNjdW11bGF0b3IsXG5cdFx0XHRcdGNvbmRpdGlvbixcblx0XHRcdCkgPT4gYWNjdW11bGF0b3IuY29uY2F0KFxuXHRcdFx0XHR0aGlzLnBhcnNlKGNvbmRpdGlvbiksXG5cdFx0XHQpLFxuXHRcdFx0W10sXG5cdFx0KTtcblx0fVxuXG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LCBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsIEl0ZW1FbnRyeSB9IGZyb20gJy4uLy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRBcGlRdWVyeSxcblx0QXBpUmVxdWVzdENvbHVtbixcblx0Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXAsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1UeXBlLFxuXHRQcm9taXNlSW50ZXJmYWNlLFxuXHRRdWVyeUNhbGxiYWNrLFxufSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9Db2xsZWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbk1hdGNoZXIgfSBmcm9tICcuLi9Db2xsZWN0aW9uTWF0Y2hlcic7XG5pbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vQ29sdW1uVXRpbCc7XG5pbXBvcnQgeyBRdWVyeUNvbHVtbkV4dHJhY3RvciB9IGZyb20gJy4uL1F1ZXJ5Q29sdW1uRXh0cmFjdG9yJztcbmltcG9ydCB7IGluQXJyYXkgfSBmcm9tICcuLi9VdGlsJztcbmltcG9ydCB7IEFic3RyYWN0Q2FjaGUgfSBmcm9tICcuL0Fic3RyYWN0Q2FjaGUnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvbkhhbmRsZXJCYXNlIHtcblxuXHRwdWJsaWMgZW50cmllczogQ29sbGVjdGlvbkNhY2hlO1xuXG5cdHB1YmxpYyBjb2xsZWN0aW9uQ2hhbmdlczoge1xuXHRcdFtjb2xsZWN0aW9uRW50cnlJZDogbnVtYmVyXTogSXRlbUVudHJ5W11cblx0fSA9IHt9O1xuXG5cdHByb3RlY3RlZCBjb25zdHJ1Y3RvciAoXG5cdFx0cHJvdGVjdGVkIGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0cHJvdGVjdGVkIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJvdGVjdGVkIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5OiBDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdHByb3RlY3RlZCB0cmFuc2FjdGlvbjogQWJzdHJhY3RDYWNoZSxcblx0KSB7XG5cdFx0dGhpcy5lbnRyaWVzID0gY29sbGVjdGlvbkNhY2hlRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHR0aGlzLnRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIENvbGxlY3Rpb25FbnRyeSBDb2xsZWN0aW9uRW50cnl9IGFuZCBzdG9yZXMgaXQgaW4gdGhpcyB0cmFuc2FjdGlvbidzIHtAbGluayBDb2xsZWN0aW9uQ2FjaGUgQ29sbGVjdGlvbkNhY2hlfVxuXHQgKi9cblx0cHVibGljIGNyZWF0ZUNvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMudHJhbnNhY3Rpb24uY29yZS5jb2xsZWN0aW9uRW50cnlGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHQpO1xuXG5cdFx0dGhpcy5lbnRyaWVzLmFkZChjb2xsZWN0aW9uRW50cnkpO1xuXG5cdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQ3JlYXRlcyBhIHtAbGluayBDb2xsZWN0aW9uTWF0Y2hlciBDb2xsZWN0aW9uTWF0Y2hlcn0gd2l0aCB0aGUgdHJhbnNhY3Rpb24ncyBjb2xsZWN0aW9uc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGdldENvbGxlY3Rpb25NYXRjaGVyICgpOiBDb2xsZWN0aW9uTWF0Y2hlcjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgYSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGZldGNoQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PjtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgY29sbGVjdGlvbnMgbGlua2VkIHRvIHRoZSBwYXNzZWQgcGFyZW50c1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSB8ICgoKSA9PiBJdGVtSWRbXSksXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXhwYW5kcyB0aGUgaXRlbXMgaW4gdGhlIGNvbGxlY3Rpb25zIHdpdGggdGhlIHBhc3NlZCBjb2x1bW5zXG5cdCAqL1xuXHRwdWJsaWMgYWJzdHJhY3QgZXhwYW5kQ29sbGVjdGlvbkVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbGxlY3Rpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0XHRuZXdDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+O1xuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRXh0ZW5kcyB0aGUgY29sbGVjdGlvbnMnIHtAbGluayBDb2xsZWN0aW9uRW50cnkucXVlcnlQYXJhbXMgcXVlcnlQYXJhbXN9IGFuZCB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5LnF1ZXJ5IHF1ZXJpZXN9IGFuZCBmZXRjaGVzIHRoZSB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSB3aXRoIHRoZSBuZXcgcXVlcmllc1xuXHQgKi9cblx0cHVibGljIGFic3RyYWN0IGV4dGVuZENvbGxlY3Rpb25FbnRyaWVzPFQgZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdFx0Y29sbGVjdGlvbnM6IFQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD47XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBBZGRzIHRoZSBwYXNzZWQge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gdG8gdGhlIGNvbGxlY3Rpb24ncyBjaGFuZ2VzIG9uIHRoZSB0cmFuc2FjdGlvbixcblx0ICogd2lsbCBza2lwIHRoZSBJdGVtRW50cnkgaWYgdGhlIGBza2lwRW50cnlGaWx0ZXJGbmAgY2FsbGJhY2sgcmV0dXJucyBgdHJ1ZWBcblx0ICovXG5cdHB1YmxpYyBhZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXM8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0XHRza2lwRW50cnlGaWx0ZXJGbjogKHRlbUVudHJ5OiBJdGVtRW50cnkpID0+IGJvb2xlYW4sXG5cdCk6IHZvaWQge1xuXHRcdGlmIChpdGVtRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdO1xuXG5cdFx0aWYgKGNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGFkZGVkSXRlbUVudHJpZXM6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpdGVtRW50cmllcykge1xuXHRcdFx0aWYgKFxuXHRcdFx0XHRjaGFuZ2VzLmluZGV4T2YoaXRlbUVudHJ5KSAhPT0gLTFcblx0XHRcdFx0fHwgc2tpcEVudHJ5RmlsdGVyRm4oaXRlbUVudHJ5KVxuXHRcdFx0KSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRjaGFuZ2VzLnB1c2goaXRlbUVudHJ5KTtcblx0XHRcdGFkZGVkSXRlbUVudHJpZXMucHVzaChpdGVtRW50cnkpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmhhbmRsZUFkZGVkSXRlbUVudHJpZXNDYWxsYmFjayhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdGFkZGVkSXRlbUVudHJpZXMsXG5cdFx0KTtcblx0fVxuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBoYW5kbGVBZGRlZEl0ZW1FbnRyaWVzQ2FsbGJhY2s8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRhZGRlZEVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQ7XG5cblx0cHVibGljIHJlbW92ZUl0ZW1FbnRyaWVzRnJvbUNvbGxlY3Rpb25DaGFuZ2VzIChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeSxcblx0XHRpZEFycmF5OiBJdGVtSWRbXSxcblx0KSB7XG5cdFx0aWYgKGlkQXJyYXkubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlcyA9IHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXTtcblxuXHRcdGlmIChjaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCByZW1vdmVkSXRlbUVudHJpZXMgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuZmlsdGVyQXJyYXkoXG5cdFx0XHRjaGFuZ2VzLFxuXHRcdFx0aXRlbUVudHJ5ID0+ICFpbkFycmF5KFxuXHRcdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdFx0XHRpZEFycmF5LFxuXHRcdFx0KSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuaGFuZGxlUmVtb3ZlZEl0ZW1FbnRyaWVzQ2FsbGJhY2soXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRyZW1vdmVkSXRlbUVudHJpZXMsXG5cdFx0KTtcblx0fVxuXG5cdHByb3RlY3RlZCBhYnN0cmFjdCBoYW5kbGVSZW1vdmVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHJlbW92ZWRJdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZDtcblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEV4cGFuZHMgdGhlIG9wdGlvbidzIHtAbGluayBDb2xsZWN0aW9uRW50cnlPcHRpb25zLmNvbHVtbnMgY29sdW1uc30gd2l0aCB0aGUgY29sdW1ucyByZXF1aXJlZCBmb3IgdGhlIHtAbGluayBDb2xsZWN0aW9uTWF0Y2hlciBDb2xsZWN0aW9uTWF0Y2hlcn0gdG8gZnVuY3Rpb24uXG5cdCAqIERhdGEgZmV0Y2hlZCBmb3IgYSBwYXJlbnQgdHJhbnNhY3Rpb24gbWlnaHQgYWxzbyBmaXQgaW4gYSBjaGlsZCB0cmFuc2FjdGlvbiwgc28gdGhvc2Uge0BsaW5rIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMucXVlcnlDb2x1bW5zIHF1ZXJ5Q29sdW1uc30gc2hvdWxkIGFsc28gYmUgdGFrZW4gaW50byBhY2NvdW50XG5cdCAqL1xuXHRwcm90ZWN0ZWQgZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSA9IG9wdGlvbnMucXVlcnksXG5cdCk6IHZvaWQge1xuXHRcdC8vIGFscmVhZHkgaGF2ZSBhbGwgY29sdW1ucywgc28gY2FuJ3QgZXhwYW5kIHRoZW1cblx0XHRpZiAob3B0aW9ucy5jb2x1bW5zID09PSB0cnVlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgY29sdW1uRXh0cmFjdG9yID0gbmV3IFF1ZXJ5Q29sdW1uRXh0cmFjdG9yKFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRxdWVyeSxcblx0XHQpO1xuXG5cdFx0b3B0aW9ucy5xdWVyeUNvbHVtbnMgPSBjb2x1bW5FeHRyYWN0b3IucGFyc2UoKTtcblxuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5FeHBhbnNpb24gPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMuY29sdW1ucyxcblx0XHQpO1xuXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMucXVlcnlDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRjb25zdCBhZGRDb2xsZWN0aW9uUXVlcnlDb2x1bW5zID0gKHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlKSA9PiB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllcyA9IHRyYW5zYWN0aW9uLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlJdGVtVHlwZShpdGVtVHlwZSk7XG5cblx0XHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNvbGxlY3Rpb25FbnRyaWVzKSB7XG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLnF1ZXJ5Q29sdW1ucyxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0Y29uc3QgYWRkVHJhbnNhY3Rpb25DaGlsZHJlbkNvbGxlY3Rpb25RdWVyeUNvbHVtbnMgPSAoY2hpbGRyZW46IEFic3RyYWN0Q2FjaGVbXSkgPT4ge1xuXHRcdFx0Zm9yIChjb25zdCB0cmFuc2FjdGlvbiBvZiBjaGlsZHJlbikge1xuXHRcdFx0XHRhZGRDb2xsZWN0aW9uUXVlcnlDb2x1bW5zKHRyYW5zYWN0aW9uKTtcblx0XHRcdFx0YWRkVHJhbnNhY3Rpb25DaGlsZHJlbkNvbGxlY3Rpb25RdWVyeUNvbHVtbnModHJhbnNhY3Rpb24uY2hpbGRyZW4pO1xuXHRcdFx0fVxuXHRcdH07XG5cblx0XHRhZGRDb2xsZWN0aW9uUXVlcnlDb2x1bW5zKHRoaXMudHJhbnNhY3Rpb24pO1xuXHRcdGFkZFRyYW5zYWN0aW9uQ2hpbGRyZW5Db2xsZWN0aW9uUXVlcnlDb2x1bW5zKHRoaXMudHJhbnNhY3Rpb24uY2hpbGRyZW4pO1xuXG5cdFx0b3B0aW9ucy5jb2x1bW5zID0gcmVxdWVzdENvbHVtbkV4cGFuc2lvbi5nZXQoKVtpdGVtVHlwZV07XG5cdH1cbn1cbiIsImltcG9ydCB7XG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcbn0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRBcGlSZXF1ZXN0U2VydmljZSxcblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0Q29sbGVjdGlvbk1hdGNoZXIsXG5cdENvbGxlY3Rpb25RdWVyeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGUsXG5cdENvbHVtblV0aWwsXG5cdGlzRnVuY3Rpb24sXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uLy4uLy4uL2luZGV4JztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbGxlY3Rpb25FbnRyeSwgSXRlbUVudHJ5IH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzJztcbmltcG9ydCB7XG5cdEFwaVJlcXVlc3RDb2x1bW4sXG5cdENvbGxlY3Rpb25FbnRyeVBhcmVudElkTWFwLFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0SXRlbUlkLFxuXHRJdGVtVHlwZSxcblx0UXVlcnlDYWxsYmFjayxcbn0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5U2VydmljZSwgUXVlcnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlck1hbmFnZXIgfSBmcm9tICcuLi8uLi9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5cbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuLi8uLi9VdGlsJztcbmltcG9ydCB7IENvbGxlY3Rpb25IYW5kbGVyQmFzZSB9IGZyb20gJy4uL0NvbGxlY3Rpb25IYW5kbGVyQmFzZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL1NlcnZlckl0ZW1IYW5kbGVyJztcblxuZXhwb3J0IGNsYXNzIFNlcnZlckNvbGxlY3Rpb25IYW5kbGVyXG5cdGV4dGVuZHMgQ29sbGVjdGlvbkhhbmRsZXJCYXNlIHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRwcml2YXRlIHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk6IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBpdGVtSGFuZGxlcjogU2VydmVySXRlbUhhbmRsZXIsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZSxcblx0XHRjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByb3RlY3RlZCB0cmFuc2FjdGlvbjogU2VydmVyQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldENvbGxlY3Rpb25NYXRjaGVyICgpOiBDb2xsZWN0aW9uTWF0Y2hlciB7XG5cdFx0cmV0dXJuIHRoaXMuY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24sXG5cdFx0XHRpdGVtVHlwZSA9PiB0aGlzLmVudHJpZXMuZ2V0QnlJdGVtVHlwZShpdGVtVHlwZSksXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IHBhcnNlZFF1ZXJ5ID0gdGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLmNyZWF0ZVF1ZXJ5KG9wdGlvbnMpO1xuXG5cdFx0dGhpcy5leHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdHBhcnNlZFF1ZXJ5Lm9iamVjdCxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeS5jb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlPihvcHRpb25zLmNvbHVtbnMpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZmV0Y2hDb2xsZWN0aW9uRGF0YShcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0cGFyc2VkUXVlcnksXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10gfCAoKCkgPT4gSXRlbUlkW10pLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IHtbcGFyZW50SWQ6IHN0cmluZ106IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5Pn0gPSB7fTtcblxuXHRcdGlmIChpc0Z1bmN0aW9uPCgpID0+IEl0ZW1JZFtdPihwYXJlbnRJZEFycmF5KSkge1xuXHRcdFx0cGFyZW50SWRBcnJheSA9IHBhcmVudElkQXJyYXkoKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHBhcmVudElkIG9mIHBhcmVudElkQXJyYXkpIHtcblx0XHRcdGNvbnN0IG5ld09wdGlvbnMgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY2xvbmVPcHRpb25zKFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aXRlbVR5cGU6IHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkOiBwYXJlbnRJZCxcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdFx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShuZXdPcHRpb25zKTtcblxuXHRcdFx0dGhpcy5leHBhbmRDb2x1bW5zV2l0aFF1ZXJ5Q29sdW1ucyhcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdG5ld09wdGlvbnMsXG5cdFx0XHRcdHBhcnNlZFF1ZXJ5Lm9iamVjdCxcblx0XHRcdCk7XG5cblx0XHRcdC8vIHRvZG9bY2FjaGVdIHNob3VsZCB0aGlzIGJlIGluIGEgbG9vcD8gZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMgY2FuIGNoYW5nZSB0aGUgY29sdW1uc1xuXHRcdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeS5jb25zdHJ1Y3QobmV3T3B0aW9ucy5jb2x1bW5zKTtcblxuXHRcdFx0cHJvbWlzZXNbcGFyZW50SWRdID0gdGhpcy5mZXRjaENvbGxlY3Rpb25EYXRhKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRcdG5ld09wdGlvbnMsXG5cdFx0XHRcdHBhcnNlZFF1ZXJ5LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS5hbGwocHJvbWlzZXMpO1xuXHR9XG5cblx0cHVibGljIGV4dGVuZENvbGxlY3Rpb25FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5VHlwZT4ge1xuXHRcdGNvbnN0IGV4dGVuZGVkUXVlcnkgPSBjb2xsZWN0aW9uRW50cnkuZXh0ZW5kUXVlcnkocXVlcnlDYWxsYmFjaykub2JqZWN0O1xuXHRcdGNvbnN0IGZ1bGxRdWVyeSA9IHRoaXMucXVlcnlTZXJ2aWNlLmFkZEFuZENvbmRpdGlvbihcblx0XHRcdGV4dGVuZGVkUXVlcnksXG5cdFx0XHR0aGlzLnF1ZXJ5U2VydmljZS5jcmVhdGVOb3RJbihcblx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdLm1hcChcblx0XHRcdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0KSxcblx0XHRcdCksXG5cdFx0KTtcblxuXHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRjb2xsZWN0aW9uRW50cnkub3B0aW9ucyxcblx0XHRcdGV4dGVuZGVkUXVlcnksXG5cdFx0KTtcblxuXHRcdGxldCBwcm9taXNlO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmxpbWl0ICE9PSBudWxsKSB7XG5cdFx0XHRwcm9taXNlID0gdGhpcy5hcGlSZXF1ZXN0U2VydmljZS5yZXF1ZXN0U2tlbGV0b24oXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRyZXF1ZXN0VHlwZTogJ3F1ZXJ5Jyxcblx0XHRcdFx0XHRpdGVtVHlwZTogY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlLFxuXHRcdFx0XHRcdGNvbHVtbnM6IHtbY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlXTogY29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMuY29sdW1uc30sXG5cdFx0XHRcdFx0cXVlcnk6IGV4dGVuZGVkUXVlcnksXG5cdFx0XHRcdFx0bGltaXQ6IGNvbGxlY3Rpb25FbnRyeS5vcHRpb25zLmxpbWl0LFxuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvbWlzZSA9IHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeVF1ZXJ5KFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRcdGZ1bGxRdWVyeSxcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMuY29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29sbGVjdGlvbkVudHJ5LnByb21pc2UgPSBwcm9taXNlO1xuXG5cdFx0cHJvbWlzZS50aGVuKFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRkZWxldGUgY29sbGVjdGlvbkVudHJ5LnByb21pc2U7XG5cdFx0XHR9LFxuXHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gcHJvbWlzZS50aGVuKFxuXHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRyZXR1cm4gY29sbGVjdGlvbkVudHJ5O1xuXHRcdFx0fSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGV4cGFuZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRjb2xsZWN0aW9uczogQ29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXAsXG5cdFx0bmV3UmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5bXSxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4ge1xuXHRcdGlmIChuZXdSZXF1ZXN0Q29sdW1ucy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oY29sbGVjdGlvbnMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdID0gW107XG5cblx0XHQvLyBUT0RPOiBmaWx0ZXIgbG9jYWwgaXRlbXM/XG5cblx0XHRmb3IgKGNvbnN0IHBhcmVudElkIGluIGNvbGxlY3Rpb25zKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBjb2xsZWN0aW9uc1twYXJlbnRJZF0uZW50cnk7XG5cblx0XHRcdHBhcmVudElkQXJyYXkucHVzaChjb2xsZWN0aW9uRW50cnkucGFyZW50IS5pdGVtSWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyXG5cdFx0XHQuZmV0Y2hMaW5rZWRJdGVtRW50cmllc0RhdGEoXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdHBhcmVudElkQXJyYXksXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRudWxsLFxuXHRcdFx0XHRuZXdSZXF1ZXN0Q29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0bmV3UmVxdWVzdENvbHVtbnMsXG5cdFx0XHRcdFx0XHRyZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZEFycmF5KSB7XG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uc1twYXJlbnRJZF0uZW50cnkuZXhwYW5kQ29sdW1ucyhjb2x1bW5FeHBhbnNpb24pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBjb2xsZWN0aW9ucztcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZXh0ZW5kQ29sbGVjdGlvbkVudHJpZXM8VCBleHRlbmRzIENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0cXVlcnlDYWxsYmFjazogUXVlcnlDYWxsYmFjayxcblx0XHRjb2xsZWN0aW9uczogVCxcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKGNvbGxlY3Rpb25zKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdID0gW107XG5cdFx0bGV0IGl0ZW1JZEFycmF5OiBJdGVtSWRbXSA9IFtdO1xuXG5cdFx0b3B0aW9ucy5xdWVyeVBhcmFtcyA9IHF1ZXJ5Q2FsbGJhY2sob3B0aW9ucy5xdWVyeVBhcmFtcyk7XG5cblx0XHRmb3IgKGNvbnN0IHBhcmVudElkIGluIGNvbGxlY3Rpb25zKSB7XG5cdFx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSBjb2xsZWN0aW9uc1twYXJlbnRJZF0uZW50cnk7XG5cblx0XHRcdGNvbGxlY3Rpb25FbnRyeS5leHRlbmRRdWVyeShxdWVyeUNhbGxiYWNrKTtcblx0XHRcdHBhcmVudElkQXJyYXkucHVzaChjb2xsZWN0aW9uRW50cnkucGFyZW50IS5pdGVtSWQpO1xuXHRcdFx0aXRlbUlkQXJyYXkgPSBpdGVtSWRBcnJheS5jb25jYXQoXG5cdFx0XHRcdHRoaXMuY29sbGVjdGlvbkNoYW5nZXNbY29sbGVjdGlvbkVudHJ5LmlkXVxuXHRcdFx0XHRcdC5tYXAoXG5cdFx0XHRcdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdFx0XHQpLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5pdGVtSGFuZGxlclxuXHRcdFx0LmZldGNoTGlua2VkSXRlbUVudHJpZXNEYXRhKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRwYXJlbnRJZEFycmF5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuYWRkQW5kQ29uZGl0aW9uKFxuXHRcdFx0XHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKS5vYmplY3QsXG5cdFx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuY3JlYXRlTm90SW4oaXRlbUlkQXJyYXkpLFxuXHRcdFx0XHQpLFxuXHRcdFx0XHRvcHRpb25zLmNvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlczxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdGl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRzdXBlci5hZGRJdGVtRW50cmllc1RvQ29sbGVjdGlvbkNoYW5nZXMoXG5cdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRpdGVtRW50cmllcyxcblx0XHRcdC8vIExvY2FsIEl0ZW1FbnRyaWVzIGRvbid0IGJlbG9uZyBpbiByZW1vdGUgY29sbGVjdGlvbiBjaGFuZ2VzXG5cdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5LmlzTG9jYWwoKSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhbmRsZUFkZGVkSXRlbUVudHJpZXNDYWxsYmFjazxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0X2NvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRhZGRlZEVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdGlmIChhZGRlZEVudHJpZXMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gT25seSB1c2VkIGluIHRoZSBmcm9udGVuZCBwbGFubmVyXG5cdFx0Ly8gY29sbGVjdGlvbkVudHJ5Lm9uQWRkSW5pdGlhbChhZGRlZEVudHJpZXMpO1xuXHR9XG5cblx0cHJvdGVjdGVkIGhhbmRsZVJlbW92ZWRJdGVtRW50cmllc0NhbGxiYWNrPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRfY29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnlUeXBlLFxuXHRcdHJlbW92ZWRJdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0aWYgKHJlbW92ZWRJdGVtRW50cmllcy5sZW5ndGggPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyB0b2RvW2NhY2hlXSBPbmx5IHVzZWQgaW4gdGhlIGZyb250ZW5kIHBsYW5uZXJcblx0XHQvLyBjb2xsZWN0aW9uRW50cnkub25SZW1vdmVJbml0aWFsKHJlbW92ZWRJdGVtRW50cmllcyk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEV4cGFuZHMgdGhlIGNvbHVtbnMgb2YgdGhlIGl0ZW1zIGluIHRoZSBjb2xsZWN0aW9uXG5cdCAqL1xuXHRwdWJsaWMgZXhwYW5kQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0bmV3Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5VHlwZT4ge1xuXHRcdGNvbnN0IHttZXJnZWQsIGRpZmZlcmVuY2V9ID0gY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMubWVyZ2VSZXF1ZXN0Q29sdW1ucyhuZXdDb2x1bW5zKTtcblxuXHRcdGlmIChkaWZmZXJlbmNlICE9PSB0cnVlICYmIGRpZmZlcmVuY2UubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNvbGxlY3Rpb25FbnRyeSk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBjb2xsZWN0aW9uRW50cnkuaXRlbVR5cGU7XG5cblx0XHRsZXQgcHJvbWlzZTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5saW1pdCAhPT0gbnVsbCkge1xuXHRcdFx0cHJvbWlzZSA9IHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UucmVxdWVzdFNrZWxldG9uKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0cmVxdWVzdFR5cGU6ICdxdWVyeScsXG5cdFx0XHRcdFx0aXRlbVR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGNvbHVtbnM6IG1lcmdlZCxcblx0XHRcdFx0XHRxdWVyeTogY29sbGVjdGlvbkVudHJ5LnF1ZXJ5Lm9iamVjdCxcblx0XHRcdFx0XHRsaW1pdDogY29sbGVjdGlvbkVudHJ5Lm9wdGlvbnMubGltaXQsIC8vIHRvZG9bY2FjaGVdIGFjdHVhbGx5IGltcGxlbWVudCBsaW1pdCA/IEN1cnJlbnRseSBkb2Vucyd0IHJlYWxseSB3b3JrXG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRwcm9taXNlID0gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlci5mZXRjaEJ5UXVlcnkoXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0W1xuXHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5xdWVyeS5vYmplY3QsXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LnF1ZXJ5LnN0cmluZyxcblx0XHRcdFx0XSxcblx0XHRcdFx0bWVyZ2VkLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcHJvbWlzZVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3BvbnNlID0+IHtcblx0XHRcdFx0XHRjb25zdCBjb2x1bW5FeHBhbnNpb24gPSB0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRtZXJnZWQsXG5cdFx0XHRcdFx0XHRyZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKSxcblx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LmV4cGFuZENvbHVtbnMoY29sdW1uRXhwYW5zaW9uKTtcblxuXHRcdFx0XHRcdHJldHVybiBjb2x1bW5FeHBhbnNpb247XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEZldGNoZXMgdGhlIGRhdGEgZm9yIHRoZSBwYXNzZWQgSXRlbVR5cGUvb3B0aW9ucywgd2lsbCBkbyBub3RoaW5nIGlmIHRoZSByZXF1ZXN0ZWQgQ29sbGVjdGlvbkVudHJ5L2NvbHVtbnMgYXJlIGFscmVhZHkgY2FjaGVkLlxuXHQgKiBXaWxsIGNyZWF0ZSBhIG5ldyB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gaWYgdGhlIENvbGxlY3Rpb25FbnRyeSBkaWRuJ3QgZXhpc3QgeWV0XG5cdCAqL1xuXHRwcml2YXRlIGZldGNoQ29sbGVjdGlvbkRhdGE8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbHVtblN1YnNldENhY2hlOiBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdFx0Y29sbGVjdGlvblF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRsZXQgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldEJ5UXVlcnkoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25RdWVyeSxcblx0XHQpO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gbnVsbCAmJiBjb2x1bW5TdWJzZXRDYWNoZS5ydW4oY29sbGVjdGlvbkVudHJ5LmNvbHVtbnMpKSB7XG5cdFx0XHQvLyBUaGVyZSBhbHJlYWR5IGlzIGFuIGVudHJ5IGFuZCBpdCBjb250YWlucyB0aGUgY29sdW1ucyB3ZSBuZWVkLCBzbyB3ZSBjYW4gc2FmZWx5IHJldHVybiBpdFxuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjb2xsZWN0aW9uRW50cnkpO1xuXHRcdH1cblxuXHRcdGxldCBwcm9taXNlO1xuXG5cdFx0aWYgKG9wdGlvbnMubGltaXQgIT09IG51bGwpIHtcblx0XHRcdHByb21pc2UgPSB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHRcdC5yZXF1ZXN0U2tlbGV0b24oXG5cdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0cmVxdWVzdFR5cGU6ICdxdWVyeScsXG5cdFx0XHRcdFx0XHRpdGVtVHlwZTogaXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRjb2x1bW5zOiB7W2l0ZW1UeXBlXTogb3B0aW9ucy5jb2x1bW5zfSxcblx0XHRcdFx0XHRcdHF1ZXJ5OiBvcHRpb25zLnF1ZXJ5LFxuXHRcdFx0XHRcdFx0bGltaXQ6IG9wdGlvbnMubGltaXQsXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0KVxuXHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0XHR0aGlzLnRyYW5zYWN0aW9uLnByb2Nlc3NSZXNwb25zZShyZXNwb25zZSk7XG5cblx0XHRcdFx0XHRcdHJldHVybiByZXNwb25zZTtcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0KTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvbWlzZSA9IHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXJcblx0XHRcdFx0LmZldGNoQnlRdWVyeShcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRbXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uUXVlcnkub2JqZWN0LFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvblF1ZXJ5LnN0cmluZyxcblx0XHRcdFx0XHRdLFxuXHRcdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcm9taXNlXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdC8vIFdlIHNob3VsZCByZS1jaGVjayBpZiBhbiBlbnRyeSBpcyBub3QgY3JlYXRlZCBpbiB0aGUgbWVhbnRpbWVcblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmVudHJpZXMuZ2V0QnlRdWVyeShcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0Y29sbGVjdGlvblF1ZXJ5LFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRpZiAoY29sbGVjdGlvbkVudHJ5ID09PSBudWxsKSB7XG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25FbnRyeShcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuY29sdW1ucyA9IHRoaXMudHJhbnNhY3Rpb24uY29yZS5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdEZyb21SZXNwb25zZShcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlLmZldGNoQ29sdW1uc09iamVjdCgpLFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLnJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKSxcblx0XHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5leHBhbmRDb2x1bW5zKGNvbHVtbkV4cGFuc2lvbik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSwgSXRlbUNhY2hlRmFjdG9yeSwgSXRlbUVudHJ5RmFjdG9yeSwgUXVlcnlQYXJzZXJGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSwgSXRlbUVudHJ5T3B0aW9ucyB9IGZyb20gJy4uLy4uLy4uL21vZGVscyc7XG5pbXBvcnQgeyBBcGlRdWVyeSwgQXBpUmVxdWVzdENvbHVtbnMsIEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhLCBDaGFuZ2VzRGVsdGFJdGVtQ3JlYXRlRGVsdGEgfSBmcm9tICcuLi8uLi9DaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQge1xuXHRBcGlGb3JtYXR0ZXIsXG5cdEFwaVJlc3BvbnNlUHJvY2Vzc29yLFxuXHRDb2x1bW5FeHBhbnNpb24sXG5cdENvbHVtblNldCxcblx0Q29sdW1uU3Vic2V0Q2FjaGUsXG5cdENvbHVtblV0aWwsXG5cdFF1ZXJ5U2VydmljZSxcblx0UmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFJlcXVlc3RCdWZmZXJSZXNwb25zZSxcbn0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgSXRlbUhhbmRsZXJCYXNlIH0gZnJvbSAnLi4vSXRlbUhhbmRsZXJCYXNlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9TZXJ2ZXJDYWNoZSc7XG5cbmV4cG9ydCB0eXBlIFNlcnZlckl0ZW1FbnRyeUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+ID0gRmllbGRNYXA8SXRlbVR5cGVUeXBlPjtcblxuZXhwb3J0IGNsYXNzIFNlcnZlckl0ZW1IYW5kbGVyXG5cdGV4dGVuZHMgSXRlbUhhbmRsZXJCYXNlIHtcblxuXHRwdWJsaWMgaXRlbUNoYW5nZXM6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IFNlcnZlckl0ZW1FbnRyeUNoYW5nZXNcblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHJlcXVlc3RCdWZmZXJNYW5hZ2VyOiBSZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRwcml2YXRlIHF1ZXJ5UGFyc2VyRmFjdG9yeTogUXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgcXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0Y29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0cHJvdGVjdGVkIHRyYW5zYWN0aW9uOiBTZXJ2ZXJDYWNoZSxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0aXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdHByb21pc2VTZXJ2aWNlLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0aXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlSXRlbUVudHJ5IChcblx0XHRjcmVhdGVUdXBsZTogQ2hhbmdlc0RlbHRhSXRlbUNyZWF0ZURlbHRhLFxuXHQpOiBJdGVtRW50cnkge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHN1cGVyLmNyZWF0ZUl0ZW1FbnRyeShjcmVhdGVUdXBsZSk7XG5cblx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPSBjcmVhdGVUdXBsZS5maWVsZHM7XG5cblx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBQcm9jZXNzZXMgdXBkYXRlcyBvbiBhIGNhY2hlZCBlbnRyeVxuXHQgKi9cblx0cHVibGljIHByb2Nlc3NJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlID0gYW55PiAoXG5cdFx0aXRlbUVudHJ5Q2hhbmdlc1R1cGxlOiBDaGFuZ2VzRGVsdGFJdGVtVXBkYXRlRGVsdGE8SXRlbVR5cGVUeXBlPixcblx0XHRfZm9yY2VPdmVyd3JpdGU/OiBib29sZWFuLFxuXHRcdF91cGRhdGVJbml0aWFsPzogYm9vbGVhbixcblx0KTogRmllbGRNYXA8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gaXRlbUVudHJ5Q2hhbmdlc1R1cGxlLmVudHJ5O1xuXHRcdGNvbnN0IGNoYW5nZXMgPSBpdGVtRW50cnlDaGFuZ2VzVHVwbGUuY2hhbmdlcztcblxuXHRcdGlmICh0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdID0ge307XG5cdFx0fVxuXG5cdFx0aWYgKGNoYW5nZXMuZXhwYW5kZWRDb2x1bW5zICE9PSBudWxsKSB7XG5cdFx0XHRpdGVtRW50cnkuY29sdW1ucyA9IGNoYW5nZXMuZXhwYW5kZWRDb2x1bW5zLm1lcmdlZDtcblx0XHR9XG5cblx0XHRjb25zdCBwcmV2aW91cyA9IHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHR0aGlzLml0ZW1DaGFuZ2VzW2l0ZW1FbnRyeS5pZF0sXG5cdFx0XHR7fSxcblx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0KTtcblxuXHRcdHRoaXMuYXBpRm9ybWF0dGVyLmNvcHlGaWVsZHMoXG5cdFx0XHRjaGFuZ2VzLmZpZWxkcyxcblx0XHRcdHRoaXMuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXSxcblx0XHRcdGl0ZW1FbnRyeS5jb2x1bW5zLm1haW4sXG5cdFx0KTtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHRlc3Rcblx0XHRpZiAoY2hhbmdlcy5maWVsZHMuaWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCA9IGNoYW5nZXMuZmllbGRzLmlkO1xuXHRcdH1cblxuXHRcdHJldHVybiBwcmV2aW91cztcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0b3B0aW9uczogSXRlbUVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hJdGVtRW50cnlEYXRhKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHR0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeS5jb25zdHJ1Y3Qob3B0aW9ucy5jb2x1bW5zKSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHQoKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoSXRlbUVudHJpZXNCeVF1ZXJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0ZW50cnlPcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdHJldHVybiB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyXG5cdFx0XHQuZmV0Y2hCeVF1ZXJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0dGhpcy5xdWVyeVBhcnNlckZhY3Rvcnlcblx0XHRcdFx0XHQuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0dGhpcy5xdWVyeVNlcnZpY2UuYWRkUGFyZW50Q29uZGl0aW9uKFxuXHRcdFx0XHRcdFx0XHRxdWVyeSxcblx0XHRcdFx0XHRcdFx0ZW50cnlPcHRpb25zLnBhcmVudCxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdFx0KVxuXHRcdFx0XHRcdC5wYXJzZSgpLFxuXHRcdFx0XHRlbnRyeU9wdGlvbnMuY29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJpZXM6IEl0ZW1FbnRyeVtdID0gW107XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiByZXNwb25zZS5saW5rc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHQpO1xuXG5cdFx0XHRcdFx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdFx0aXRlbUVudHJpZXMucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBpdGVtRW50cmllcztcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEl0ZW1FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRvcHRpb25zOiBJdGVtRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+Pj4ge1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2VJbnRlcmZhY2U8dm9pZD4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiBpdGVtSWRzKSB7XG5cdFx0XHRwcm9taXNlcy5wdXNoKFxuXHRcdFx0XHR0aGlzLmZldGNoSXRlbUVudHJ5RGF0YShcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUsXG5cdFx0XHRcdCksXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKHByb21pc2VzKVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRjb25zdCBpdGVtRW50cmllczogSXRlbUVudHJ5W10gPSBbXTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGl0ZW1JZHMpIHtcblx0XHRcdFx0XHRcdGl0ZW1FbnRyaWVzLnB1c2goXG5cdFx0XHRcdFx0XHRcdHRoaXMuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0XHQpISxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGl0ZW1FbnRyaWVzO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBkYXRhIGZvciB0aGUgcGFzc2VkIEl0ZW1UeXBlL0l0ZW1JZC9jb2x1bW5zLCB3aWxsIGRvIG5vdGhpbmcgaWYgdGhlIHJlcXVlc3RlZCBJdGVtRW50cnkvY29sdW1ucyBhcmUgYWxyZWFkeSBjYWNoZWQuXG5cdCAqIFdpbGwgY3JlYXRlIGEgbmV3IHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJ5fSBpZiB0aGUgSXRlbUVudHJ5IGRpZG4ndCBleGlzdCB5ZXRcblx0ICovXG5cdHByaXZhdGUgZmV0Y2hJdGVtRW50cnlEYXRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPixcblx0KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRpZiAoaXRlbUVudHJ5ICE9PSB1bmRlZmluZWQgJiYgY29sdW1uU3Vic2V0Q2FjaGUucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKSkge1xuXHRcdFx0Ly8gVGhlcmUgYWxyZWFkeSBpcyBhbiBlbnRyeSBhbmQgaXQgY29udGFpbnMgdGhlIGNvbHVtbnMgd2UgbmVlZCwgc28gd2UgY2FuIHNhZmVseSByZXR1cm4gaXRcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4oKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlclxuXHRcdFx0LmZldGNoQnlJZChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGUucmVxdWVzdENvbHVtbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBGZXRjaGVzIHRoZSBkYXRhIGZvciB0aGUgSXRlbUVudHJpZXMgbGlua2VkIHRvIHRoZSBwYXJlbnQgSXRlbXNcblx0ICpcblx0ICogQHBhcmFtIGNvbHVtbnMgc2hvdWxkIGNvbnRhaW4gYSBkZXJpdmVkIGNvbHVtbiB0aGF0IHJlZmVycyB0byB0aGUgcGFyZW50XG5cdCAqL1xuXHRwdWJsaWMgZmV0Y2hMaW5rZWRJdGVtRW50cmllc0RhdGEgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkQXJyYXk6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0Y29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHF1ZXJ5ID09PSBudWxsID9cblx0XHRcdHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeUlkcyhcblx0XHRcdFx0cGFyZW50VHlwZSxcblx0XHRcdFx0cGFyZW50SWRBcnJheSxcblx0XHRcdFx0Y29sdW1ucyxcblx0XHRcdCkgOlxuXHRcdFx0dGhpcy5yZXF1ZXN0QnVmZmVyTWFuYWdlci5mZXRjaEJ5UXVlcnkoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeVxuXHRcdFx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHR0aGlzLnF1ZXJ5U2VydmljZS5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRcdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRcdFx0XHR7XG5cdFx0XHRcdFx0XHRcdFx0bGlua2VkVG86IHBhcmVudFR5cGUsXG5cdFx0XHRcdFx0XHRcdFx0cXVlcnk6IHtpZDogcGFyZW50SWRBcnJheX0sXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdClcblx0XHRcdFx0XHQucGFyc2UoKSxcblx0XHRcdFx0Ly8gc2hvdWxkIGNvbnRhaW4gYSBkZXJpdmVkIGNvbHVtbiB0aGF0IHJlZmVycyB0byB0aGUgcGFyZW50XG5cdFx0XHRcdGNvbHVtbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZW5lcmFsIHdheSB0byBwcm9jZXNzIGFuIEFQSSByZXNwb25zZS5cblx0ICogV2lsbCBjYWxsIHtAbGluayBDaGFuZ2VzRGVsdGEuc2V0SXRlbUNyZWF0ZWQgc2V0SXRlbUNyZWF0ZWR9IGlmIGFuIGVudHJ5IGRvZXNuJ3QgZXhpc3QgeWV0LCBhbmQgb3RoZXJ3aXNlIHtAbGluayBDaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQgc2V0SXRlbVVwZGF0ZWR9IGlmIGl0IGRvZXMuXG5cdCAqL1xuXHRwdWJsaWMgcHJvY2Vzc0FwaVJlc3BvbnNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0cmVzcG9uc2U6IEFwaVJlc3BvbnNlUHJvY2Vzc29yLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0Y29sdW1uU2V0OiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPixcblx0XHRjb2x1bW5FeHBhbnNpb246IENvbHVtbkV4cGFuc2lvbjxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHQvLyBXZSBzaG91bGQgcmUtY2hlY2sgaWYgYW4gZW50cnkgaXMgbm90IGNyZWF0ZWQgaW4gdGhlIG1lYW50aW1lXG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRjb25zdCBmaWVsZHMgPSByZXNwb25zZS5mZXRjaE9iamVjdChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRpZiAoZmllbGRzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgRmllbGRzIG5vdCBmb3VuZCBpbiByZXNwb25zZSBmb3IgJHtpdGVtVHlwZX06JHtpdGVtSWR9YCk7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbUNyZWF0ZWQoXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0ZmllbGRzLFxuXHRcdFx0XHRjb2x1bW5FeHBhbnNpb24ucnVuKGl0ZW1FbnRyeS5jb2x1bW5zKSxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgeyBub29wLCBSbUNvcmUgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7XG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uU2V0RmFjdG9yeSxcblx0Q29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRJdGVtQ2FjaGVGYWN0b3J5LFxuXHRJdGVtRW50cnlGYWN0b3J5LFxuXHRJdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRRdWVyeVBhcnNlckZhY3RvcnksXG5cdFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxufSBmcm9tICcuLi8uLi8uLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5JztcbmltcG9ydCB7XG5cdEF1dGhJbnRlcmZhY2UsXG5cdEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0RXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0UHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG59IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vLi4vaW50ZXJmYWNlcy9MaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpTGlua1RyZWVUeXBlLFxuXHRFbnRyeVBhcmVudCxcblx0RW50cnlQYXJlbnROdWxsLFxuXHRGaWVsZE1hcCxcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0SXRlbVR5cGUsXG5cdFByb21pc2VJbnRlcmZhY2UsXG59IGZyb20gJy4uLy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEFwaUZvcm1hdHRlciB9IGZyb20gJy4uLy4uL0FwaUZvcm1hdHRlcic7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4uLy4uL0FwaVJlcXVlc3RTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi4vLi4vQXBpUmVzcG9uc2VQcm9jZXNzb3InO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc0RlbHRhJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4uLy4uL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgT25BZnRlckNyZWF0ZUNhbGxiYWNrIH0gZnJvbSAnLi4vLi4vQ2hhbmdlc1Byb2Nlc3Nvcic7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vQ29sbGVjdGlvbkVudHJ5U2VydmljZSc7XG5pbXBvcnQgeyBDb2x1bW5DYWNoZSB9IGZyb20gJy4uLy4uL0NvbHVtbkNhY2hlJztcbmltcG9ydCB7IENvbHVtbkhhbmRsZXIgfSBmcm9tICcuLi8uLi9Db2x1bW5IYW5kbGVyJztcbmltcG9ydCB7IENvbHVtblV0aWwgfSBmcm9tICcuLi8uLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IEludGVybmFsQ2hhbmdlc0RlbHRhIH0gZnJvbSAnLi4vLi4vSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4uLy4uL0l0ZW1FbnRyeVNlcnZpY2UnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uLy4uL0tleVNlcnZpY2UnO1xuaW1wb3J0IHsgTG9ja1NlcnZpY2UgfSBmcm9tICcuLi8uLi9Mb2NrU2VydmljZSc7XG5pbXBvcnQgeyBRdWVyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9RdWVyeVNlcnZpY2UnO1xuaW1wb3J0IHsgUmVxdWVzdEJ1ZmZlck1hbmFnZXIgfSBmcm9tICcuLi8uLi9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5pbXBvcnQgeyBUZW1wbGF0ZUNhY2hlIH0gZnJvbSAnLi4vLi4vVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vVXRpbCc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi4vQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uTWF0Y2hlckNhY2hlUHJvY2Vzc29yIH0gZnJvbSAnLi4vQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcic7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBTZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlciB9IGZyb20gJy4vU2VydmVyQ29sbGVjdGlvbkhhbmRsZXInO1xuaW1wb3J0IHsgU2VydmVySXRlbUVudHJ5Q2hhbmdlcywgU2VydmVySXRlbUhhbmRsZXIgfSBmcm9tICcuL1NlcnZlckl0ZW1IYW5kbGVyJztcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoZSB7QGxpbmsgU2VydmVyQ2FjaGUgU2VydmVyQ2FjaGV9IGlzIHJlc3BvbnNpYmxlIGZvciBrZWVwaW5nIHRyYWNrIG9mIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IGFuZCB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyaWVzfVxuICogd2hpY2ggYXJlIHNhdmVkIG9uIHRoZSBzZXJ2ZXIuXG4gKlxuICogSXQncyBiYXNpY2FsbHkgYSBsb2NhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGF0YWJhc2VcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZlckNhY2hlXG5cdGV4dGVuZHMgQWJzdHJhY3RDYWNoZSB7XG5cblx0cHVibGljIHJlYWRvbmx5IGl0ZW1IYW5kbGVyOiBTZXJ2ZXJJdGVtSGFuZGxlcjtcblx0cHVibGljIHJlYWRvbmx5IGNvbGxlY3Rpb25IYW5kbGVyOiBTZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlcjtcblxuXHRwdWJsaWMgcGFyZW50OiBudWxsID0gbnVsbDtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeTogQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnksXG5cdFx0Y29yZTogUm1Db3JlLFxuXHRcdGNvbHVtbkNhY2hlOiBDb2x1bW5DYWNoZSxcblx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcjogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0YXV0aEludGVyZmFjZTogQXV0aEludGVyZmFjZSxcblx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdGxvY2tTZXJ2aWNlOiBMb2NrU2VydmljZSxcblx0XHRtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnk6IENvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0aXRlbVJlc291cmNlRmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHR0ZW1wbGF0ZUNhY2hlOiBUZW1wbGF0ZUNhY2hlLFxuXHRcdGl0ZW1DYWNoZUZhY3Rvcnk6IEl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeTogQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyLFxuXHRcdGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0Y29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRpdGVtRW50cnlGYWN0b3J5OiBJdGVtRW50cnlGYWN0b3J5LFxuXHRcdGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0a2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRjb2xsZWN0aW9uRW50cnlGYWN0b3J5OiBDb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0Y29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5OiBDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0cXVlcnlQYXJzZXJGYWN0b3J5OiBRdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0cXVlcnlTZXJ2aWNlOiBRdWVyeVNlcnZpY2UsXG5cdFx0bGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29yZSxcblx0XHRcdGNvbHVtbkNhY2hlLFxuXHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRhdXRoSW50ZXJmYWNlLFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRcdGxvY2tTZXJ2aWNlLFxuXHRcdFx0bW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnksXG5cdFx0XHRpdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0dGVtcGxhdGVDYWNoZSxcblx0XHRcdGl0ZW1DYWNoZUZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdHByb21pc2VTZXJ2aWNlLFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29sdW1uSGFuZGxlcixcblx0XHRcdGNvbHVtblNldEZhY3RvcnksXG5cdFx0XHRjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0aXRlbUVudHJ5RmFjdG9yeSxcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0XHRxdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0XHRxdWVyeVNlcnZpY2UsXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRsaW5rVHJlZVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdHRoaXMuaXRlbUhhbmRsZXIgPSBuZXcgU2VydmVySXRlbUhhbmRsZXIoXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHByb21pc2VTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRpdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcyxcblx0XHQpO1xuXG5cdFx0dGhpcy5jb2xsZWN0aW9uSGFuZGxlciA9IG5ldyBTZXJ2ZXJDb2xsZWN0aW9uSGFuZGxlcihcblx0XHRcdGNvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRcdHJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMuaXRlbUhhbmRsZXIsXG5cdFx0XHRwcm9taXNlU2VydmljZSxcblx0XHRcdHF1ZXJ5U2VydmljZSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHR0aGlzLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0U2VydmVyQ2FjaGUgKCk6IFNlcnZlckNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBwcm9jZXNzUmVzcG9uc2UgKFxuXHRcdHJlc3BvbnNlOiBBcGlSZXNwb25zZVByb2Nlc3Nvcixcblx0KTogUHJvbWlzZUludGVyZmFjZTxDaGFuZ2VzRGVsdGFSZXN1bHQ+IHtcblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNvcmUuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRjb25zdCByZXNwb25zZUNvbHVtbnNPYmplY3QgPSByZXNwb25zZS5mZXRjaENvbHVtbnNPYmplY3QoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gcmVzcG9uc2UuaXRlbXMpIHtcblx0XHRcdGNvbnN0IGNvbHVtblNldCA9IHRoaXMuY29yZS5jb2x1bW5TZXRGYWN0b3J5LmNvbnN0cnVjdEZyb21SZXNwb25zZShcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uc09iamVjdCxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29yZS5jb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbHVtblNldC5yZXF1ZXN0LFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnNPYmplY3QsXG5cdFx0XHQpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZFN0cmluZyBpbiByZXNwb25zZS5pdGVtc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0dGhpcy5pdGVtSGFuZGxlci5wcm9jZXNzQXBpUmVzcG9uc2UoXG5cdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdHJlc3BvbnNlLFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdE51bWJlcihpdGVtSWRTdHJpbmcpLFxuXHRcdFx0XHRcdGNvbHVtblNldCxcblx0XHRcdFx0XHRjb2x1bW5FeHBhbnNpb24sXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogQXBwbGllcyB0aGUgY2hhbmdlcyBvZiB0aGUgY2hhbmdlc0RlbHRhIGNyZWF0ZWQgYnkgdGhlIEFQSSBjYWxsICh7QGxpbmsgQ2hhbmdlc1Byb2Nlc3NvciBDaGFuZ2VzUHJvY2Vzc29yfS97QGxpbmsgU29ja2V0TWVzc2FnZUhhbmRsZXIgU29ja2V0TWVzc2FnZUhhbmRsZXJ9LCBvciBtYW51YWxseSB0aHJvdWdoIGEgbW9kdWxlIGZ1bmN0aW9uKSBvbiBhbGwgY2FjaGVzXG5cdCAqL1xuXHRwdWJsaWMgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudCAoXG5cdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGE6IEludGVybmFsQ2hhbmdlc0RlbHRhLFxuXHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlOiBib29sZWFuID0gZmFsc2UsXG5cdCk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5SWQgaW4gaW50ZXJuYWxDaGFuZ2VzRGVsdGEudXBkYXRlZCkge1xuXHRcdFx0dGhpcy5pdGVtSGFuZGxlci5wcm9jZXNzSXRlbUVudHJ5Q2hhbmdlcyhpbnRlcm5hbENoYW5nZXNEZWx0YS51cGRhdGVkW2l0ZW1FbnRyeUlkXSk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBpbnRlcm5hbENoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRkZWxldGUgdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25NYXRjaGVyID0gbmV3IENvbGxlY3Rpb25NYXRjaGVyQ2FjaGVQcm9jZXNzb3IoXG5cdFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5nZXRCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXG5cdFx0Y29sbGVjdGlvbk1hdGNoZXJcblx0XHRcdC5wcm9jZXNzRGVsdGEoaW50ZXJuYWxDaGFuZ2VzRGVsdGEpXG5cdFx0XHQucmVtb3ZlRnJvbUFuZEFkZFRvQ29sbGVjdGlvbnMoKTtcblxuXHRcdGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5jaGlsZHJlbikge1xuXHRcdFx0Y2hpbGQuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChcblx0XHRcdFx0aW50ZXJuYWxDaGFuZ2VzRGVsdGEsXG5cdFx0XHRcdGlzQ2FsbGVkQWZ0ZXJBcGlTYXZlLFxuXHRcdFx0KTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEdldHMgdGhlIGZpZWxkcyByZXF1aXJlZCB0byBzZXQgdGhlIHBhcmVudFxuXHQgKi9cblx0cHVibGljIGdldExpbmtGaWVsZHNCeVBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnQsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0KTogUGFydGlhbDxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgbGlua1RyZWUgPSB0aGlzLmxpbmtUcmVlU2VydmljZS5nZXQoKTtcblx0XHRjb25zdCBsaW5rVHJlZUVudHJ5ID0gbGlua1RyZWVbcGFyZW50Lml0ZW1UeXBlXVtpdGVtVHlwZSBhcyBzdHJpbmddO1xuXHRcdGNvbnN0IHJlc3VsdDogUGFydGlhbDxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiA9IHt9O1xuXG5cdFx0aWYgKGxpbmtUcmVlRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBOb24gZXhpc3RpbmcgbGluayBiZXR3ZWVuICcke3BhcmVudC5pdGVtVHlwZX0nLT4nJHtpdGVtVHlwZX0nYCk7XG5cdFx0fVxuXG5cdFx0aWYgKGxpbmtUcmVlRW50cnkudHlwZSA9PT0gQXBpTGlua1RyZWVUeXBlLkRJUkVDVCkge1xuXHRcdFx0cmVzdWx0W2xpbmtUcmVlRW50cnkuZmllbGRdID0gcGFyZW50Lml0ZW1JZDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cmVzdWx0Lml0ZW10eXBlID0gcGFyZW50Lml0ZW1UeXBlO1xuXHRcdFx0cmVzdWx0Lml0ZW0gPSBwYXJlbnQuaXRlbUlkO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0UGFyZW50IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeSxcblx0KTogRW50cnlQYXJlbnROdWxsIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnkuaWRdO1xuXG5cdFx0aWYgKGNoYW5nZXMgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGl0ZW1FbnRyeS5jb2x1bW5zLmxpbmsgIT09IG51bGwpIHtcblx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRpdGVtVHlwZTogaXRlbUVudHJ5LmNvbHVtbnMubGluay5hcGlDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdFx0aXRlbUlkOiBjaGFuZ2VzW2l0ZW1FbnRyeS5jb2x1bW5zLmxpbmsuaWRdLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCByZXNwb25zZUNvbHVtbnMgPSBpdGVtRW50cnkuY29sdW1ucy5yZXNwb25zZVtpdGVtRW50cnkuaXRlbVR5cGVdO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucy5pdGVtdHlwZSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCYmIHJlc3BvbnNlQ29sdW1ucy5pdGVtICE9PSB1bmRlZmluZWRcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRcdGl0ZW1UeXBlOiBjaGFuZ2VzLml0ZW10eXBlLFxuXHRcdFx0XHRcdGl0ZW1JZDogY2hhbmdlcy5pdGVtLFxuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBudWxsO1xuXHR9XG5cblx0cHVibGljIGdldEl0ZW1DaGFuZ2VzUmVjdXJzaXZlbHkgKFxuXHRcdGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10sXG5cdFx0Y29weUZpZWxkczogYm9vbGVhbiA9IHRydWUsXG5cdCk6IEZpZWxkTWFwIHtcblx0XHRjb25zdCBjaGFuZ2VzID0gdGhpcy5pdGVtSGFuZGxlci5pdGVtQ2hhbmdlc1tpdGVtRW50cnlJZF07XG5cdFx0Y29uc3QgaXRlbUVudHJ5ID0gdGhpcy5nZXRMb2NhbEl0ZW1FbnRyeShpdGVtRW50cnlJZCk7XG5cblx0XHRpZiAoXG5cdFx0XHRjaGFuZ2VzICE9PSB1bmRlZmluZWRcblx0XHRcdCYmIGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkXG5cdFx0KSB7XG5cdFx0XHRpZiAoIWNvcHlGaWVsZHMpIHtcblx0XHRcdFx0cmV0dXJuIGNoYW5nZXM7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5jb3B5RmllbGRzKFxuXHRcdFx0XHRjaGFuZ2VzLFxuXHRcdFx0XHR7fSxcblx0XHRcdFx0aXRlbUVudHJ5LmNvbHVtbnMubWFpbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKGl0ZW1FbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vIGxvY2FsIGVudHJ5IGZvdW5kYCk7XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKGBObyBsb2NhbCBmaWVsZHMgZm91bmQgZm9yIEl0ZW1FbnRyeSB3aXRoIEl0ZW1UeXBlICcke2l0ZW1FbnRyeS5pdGVtVHlwZX0nYCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE9ubHkgdGFrZXMgdGhlIGxvY2FsIGNoYW5nZXMgaW50byBhY2NvdW50LCB1c2VkIGZvciBzYXZpbmdcblx0ICovXG5cdHB1YmxpYyBnZXRMb2NhbEl0ZW1FbnRyeUNoYW5nZXNUdXBsZSAoXG5cdFx0aXRlbUVudHJ5SWQ6IEl0ZW1FbnRyeVsnaWQnXSxcblx0KToge1xuXHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0Y2hhbmdlczogU2VydmVySXRlbUVudHJ5Q2hhbmdlc1xuXHR9IHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLmdldExvY2FsSXRlbUVudHJ5KGl0ZW1FbnRyeUlkKTtcblxuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBUcmllZCB0byBnZXQgYSBsb2NhbCBJdGVtRW50cnkgd2l0aCBlbnRyeUlkICcke2l0ZW1FbnRyeUlkfScgYnV0IGNvdWxkbid0IGZpbmQgaXRgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0ZW50cnk6IGl0ZW1FbnRyeSxcblx0XHRcdGNoYW5nZXM6IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5SWRdLFxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbkNoYW5nZXNSZWN1cnNpdmVseSAoY29sbGVjdGlvbkVudHJ5SWQ6IENvbGxlY3Rpb25FbnRyeVsnaWQnXSk6IEl0ZW1FbnRyeVtdIHtcblx0XHRjb25zdCBlbnRyeSA9IHRoaXMuZ2V0TG9jYWxDb2xsZWN0aW9uRW50cnkoY29sbGVjdGlvbkVudHJ5SWQpO1xuXHRcdGxldCBjaGFuZ2VzID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnlJZF07XG5cblx0XHRpZiAoZW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aWYgKGNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjaGFuZ2VzID0gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnlJZF0gPSBbXTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNoYW5nZXMuc2xpY2UoKTtcblx0XHR9XG5cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ05vIGxvY2FsIGNvbGxlY3Rpb24gaXRlbXMgZm91bmQnKTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogSW52YWxpZGF0ZXMgdGhlIGNvbXBsZXRlIHNlcnZlciBjYWNoZSwgYWxsIGl0ZW1zIHdpbGwgYmUgcmUtZmV0Y2hlZCB3aGVuZXZlciB0aGV5IGFyZSByZXF1ZXN0ZWRcblx0ICovXG5cdHB1YmxpYyBpbnZhbGlkYXRlQ2FjaGUgKCk6IHZvaWQge1xuXHRcdC8vIHRoZSBpdGVtSGFuZGxlciBjYWNoZSBvbmx5IGNvbnRhaW5zIHJlbW90ZSBlbnRyaWVzXG5cdFx0dGhpcy5pdGVtSGFuZGxlci5lbnRyaWVzLmZvckVhY2goXG5cdFx0XHRpdGVtRW50cnkgPT4gaXRlbUVudHJ5LnF1ZXVlUmVsb2FkKCksXG5cdFx0KTtcblxuXHRcdC8vIHF1ZXVlUmVsb2FkIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGZvciBlYWNoIGluZGl2aWR1YWwgaXRlbVxuXHRcdHRoaXMuY29sbGVjdGlvbkhhbmRsZXIuZW50cmllcy5mb3JFYWNoKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5ID0+IGNvbGxlY3Rpb25FbnRyeS5xdWV1ZVJlbG9hZCgpLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIE1lcmdlcyB0aGUgcGFzc2VkIGNoYW5nZXMgZnJvbSB0aGUgY2hpbGQgVHJhbnNhY3Rpb24gaW50byB0aGlzIFRyYW5zYWN0aW9uJ3Mgb3duIGNoYW5nZXMgYW5kIHRoZW4gcHJvcGFnYXRlc1xuXHQgKiB0aGVtIHRvIGFsbCBjaGlsZCBUcmFuc2FjdGlvbnNcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNGcm9tQ2hpbGQgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGJyZWFrVXBCeVBhcmVudD86IGJvb2xlYW4sXG5cdFx0b25BZnRlckNyZWF0ZUNhbGxiYWNrPzogT25BZnRlckNyZWF0ZUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEl0ZW1JZENvbnZlcnNpb25NYXA+IHtcblxuXHRcdC8vIHRvZG9bY2FjaGVdIHNob3VsZG4ndCB0aGlzIGRvIGV2ZXJ5dGhpbmcgZnJvbSBUcmFuc2FjdGlvbkNhY2hlLnNhdmUgP1xuXG5cdFx0cmV0dXJuIHRoaXMuY2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnlcblx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0XHRcdClcblx0XHRcdC5leGVjdXRlKCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIEFwcGxpZXMgY2hhbmdlcyB0byB0aGlzIHRyYW5zYWN0aW9uIGFuZCBpdHMgY2hpbGRyZW5cblx0ICogRGlmZmVycyBmcm9tIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhIFRyYW5zYWN0aW9uQ2FjaGUuYXBwbHlDaGFuZ2VzRGVsdGF9IGluIHRoZSBoYW5kbGluZyBvZiBkZWxldGVkIGVudHJpZXMgYW5kIHRoZSBhcHBseUNoYW5nZXNGcm9tUGFyZW50IGNhbGxcblx0ICovXG5cdHB1YmxpYyBhcHBseUNoYW5nZXNEZWx0YSAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0aWYgKFxuXHRcdFx0Y2hhbmdlc0RlbHRhLmNyZWF0ZWQubGVuZ3RoID09PSAwXG5cdFx0XHQmJiAhaGFzUHJvcGVydGllcyhjaGFuZ2VzRGVsdGEudXBkYXRlZClcblx0XHRcdCYmICFoYXNQcm9wZXJ0aWVzKGNoYW5nZXNEZWx0YS5kZWxldGVkKVxuXHRcdCkge1xuXHRcdFx0Ly8gZW1wdHkgZGVsdGEsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmdcblxuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbih7XG5cdFx0XHRcdGNyZWF0ZWQ6IFtdLFxuXHRcdFx0XHRyb2xsYmFjazogbm9vcCxcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQuZmV0Y2hVcGRhdGVkRGVyaXZlZFZhbHVlc0Zyb21EZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHtyZXN1bHQsIGludGVybmFsQ2hhbmdlc0RlbHRhLCByb2xsYmFja0Z1bmN0aW9uc30gPSBzdXBlci5fYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblxuXHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gY2hhbmdlc0RlbHRhLmRlbGV0ZWQpIHtcblx0XHRcdFx0XHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGNoYW5nZXNEZWx0YS5kZWxldGVkW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRcdFx0XHR0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuY2xlYXIoaXRlbUVudHJ5KTtcblx0XHRcdFx0XHRcdFx0Y29uc3Qgb2xkQ2hhbmdlcyA9IHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRcdFx0XHRkZWxldGUgY2hhbmdlc0RlbHRhLnVwZGF0ZWRbaXRlbUVudHJ5LmlkXTtcblx0XHRcdFx0XHRcdFx0ZGVsZXRlIHRoaXMuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YS5zZXRJdGVtRGVsZXRlZChpdGVtRW50cnkpO1xuXG5cdFx0XHRcdFx0XHRcdHJvbGxiYWNrRnVuY3Rpb25zLnB1c2goXG5cdFx0XHRcdFx0XHRcdFx0cm9sbGJhY2tEZWx0YSA9PiB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyb2xsYmFja0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdFx0XHRcdG9sZENoYW5nZXMsXG5cdFx0XHRcdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Y29uc3QgY29sbGVjdGlvbk1hdGNoZXIgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJDYWNoZVByb2Nlc3Nvcihcblx0XHRcdFx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRcdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHRcdFx0XHR0aGlzLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUgPT4gdGhpcy5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldEJ5SXRlbVR5cGUoaXRlbVR5cGUpLFxuXHRcdFx0XHRcdCk7XG5cblx0XHRcdFx0XHRjb2xsZWN0aW9uTWF0Y2hlclxuXHRcdFx0XHRcdFx0LnByb2Nlc3NEZWx0YShpbnRlcm5hbENoYW5nZXNEZWx0YSlcblx0XHRcdFx0XHRcdC5yZW1vdmVGcm9tQW5kQWRkVG9Db2xsZWN0aW9ucygpO1xuXG5cdFx0XHRcdFx0Zm9yIChjb25zdCBjaGlsZCBvZiB0aGlzLmNoaWxkcmVuKSB7XG5cdFx0XHRcdFx0XHRjaGlsZC5hcHBseUNoYW5nZXNGcm9tUGFyZW50KFxuXHRcdFx0XHRcdFx0XHRpbnRlcm5hbENoYW5nZXNEZWx0YSxcblx0XHRcdFx0XHRcdFx0dHJ1ZSwgLy8gdG9kb1tjYWNoZV0gc2hvdWxkIHRoaXMgYmUgdHJ1ZSA/XG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsSXRlbUVudHJ5IChcblx0XHRpdGVtRW50cnlJZDogSXRlbUVudHJ5WydpZCddLFxuXHQpOiBJdGVtRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHRoaXMuaXRlbUhhbmRsZXIuZW50cmllcy5nZXRCeUVudHJ5SWQoaXRlbUVudHJ5SWQpO1xuXG5cdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gaXRlbUVudHJ5O1xuXHRcdH1cblxuXHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdH1cblxuXHRwdWJsaWMgZ2V0TG9jYWxJdGVtRW50cnlCeUl0ZW1JZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUVudHJ5WydpdGVtSWQnXSxcblx0KTogSXRlbUVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpdGVtRW50cnkgPSB0aGlzLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0KTtcblxuXHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGl0ZW1FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldExvY2FsQ29sbGVjdGlvbkVudHJ5IChjb2xsZWN0aW9uRW50cnlJZDogQ29sbGVjdGlvbkVudHJ5WydpZCddKTogQ29sbGVjdGlvbkVudHJ5IHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnkgPSB0aGlzLmNvbGxlY3Rpb25IYW5kbGVyLmVudHJpZXMuZ2V0QnlFbnRyeUlkKGNvbGxlY3Rpb25FbnRyeUlkKTtcblxuXHRcdGlmIChjb2xsZWN0aW9uRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGdldENoYW5nZXNGcm9tSXRlbUNoYW5nZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGUgPSBhbnk+IChcblx0XHRjaGFuZ2VzT2JqZWN0OiBTZXJ2ZXJJdGVtRW50cnlDaGFuZ2VzPEl0ZW1UeXBlVHlwZT4sXG5cdCk6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBjaGFuZ2VzT2JqZWN0O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uUXVlcnksIEl0ZW1FbnRyeU1hcCwgSXRlbUVudHJ5UGFyZW50SWRNYXAsIEl0ZW1JZCwgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuXG5leHBvcnQgY2xhc3MgSXRlbUNhY2hlIHtcblxuXHRwcml2YXRlIGVudHJpZXM6IEl0ZW1FbnRyeU1hcDxhbnk+ID0ge307XG5cblx0cHVibGljIGVudHJpZXNCeUVudHJ5SWQ6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IEl0ZW1FbnRyeVxuXHR9ID0ge307XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRwcml2YXRlIHRyYW5zYWN0aW9uOiBBYnN0cmFjdENhY2hlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBnZXRCeUVudHJ5SWQgKGl0ZW1FbnRyeUlkOiBJdGVtRW50cnlbJ2lkJ10pOiBJdGVtRW50cnkgfCB1bmRlZmluZWQge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXNCeUVudHJ5SWRbaXRlbUVudHJ5SWRdO1xuXHR9XG5cblx0c29tZSAoY2FsbGJhY2s6IChpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZT4pID0+IGJvb2xlYW4pIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBlbnRyaWVzKSB7XG5cdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBlbnRyaWVzW2l0ZW1UeXBlXSkge1xuXHRcdFx0XHRpZiAoY2FsbGJhY2soZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSkpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdGdldEJ5SXRlbVR5cGU8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChpdGVtVHlwZTogSXRlbVR5cGVUeXBlKSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtSWRdKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0Z2V0QnlRdWVyeTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cXVlcnk6IENvbGxlY3Rpb25RdWVyeSxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdHRoaXMubWF0Y2hRdWVyeShcblx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRMb2NhbEJ5UXVlcnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHF1ZXJ5OiBDb2xsZWN0aW9uUXVlcnksXG5cdCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbUlkXTtcblxuXHRcdFx0aWYgKCFpdGVtRW50cnkuaXNMb2NhbCgpKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAodGhpcy5tYXRjaFF1ZXJ5KFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRnZXRCeVBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0KSB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllc1tpdGVtVHlwZV07XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxJdGVtRW50cnk8SXRlbVR5cGVUeXBlPj4gPSBbXTtcblxuXHRcdGlmIChlbnRyaWVzID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiByZXN1bHQ7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllcykge1xuXHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gZW50cmllc1tpdGVtSWRdO1xuXHRcdFx0Y29uc3QgcGFyZW50ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KTtcblxuXHRcdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRcdGlmIChwYXJlbnQuaXRlbVR5cGUgPT09IHBhcmVudFR5cGUgJiYgcGFyZW50Lml0ZW1JZCA9PSBwYXJlbnRJZCkge1xuXHRcdFx0XHRyZXN1bHQucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRiYXRjaEdldExvY2FsQnlQYXJlbnQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZHM6IEl0ZW1JZFtdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0YWRkaXRpb25hbFF1ZXJ5OiBhbnksXG5cdCk6IEl0ZW1FbnRyeVBhcmVudElkTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXHRcdGNvbnN0IHJlc3VsdDogSXRlbUVudHJ5UGFyZW50SWRNYXA8SXRlbVR5cGVUeXBlPiA9IHt9O1xuXG5cdFx0Zm9yIChjb25zdCBwYXJlbnRJZCBvZiBwYXJlbnRJZHMpIHtcblx0XHRcdHJlc3VsdFtwYXJlbnRJZF0gPSBbXTtcblx0XHR9XG5cblx0XHRpZiAoZW50cmllcyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbUlkXTtcblx0XHRcdGNvbnN0IHBhcmVudCA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KGl0ZW1FbnRyeSk7XG5cblx0XHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChwYXJlbnQuaXRlbVR5cGUgIT09IHBhcmVudFR5cGUgfHwgcmVzdWx0W3BhcmVudC5pdGVtSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdGlmICghaXRlbUVudHJ5LmlzTG9jYWwoKSkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGFkZGl0aW9uYWxRdWVyeSA9PT0gbnVsbCB8fCB0aGlzLm1hdGNoUXVlcnkoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0YWRkaXRpb25hbFF1ZXJ5LFxuXHRcdFx0KSkge1xuXHRcdFx0XHRyZXN1bHRbcGFyZW50Lml0ZW1JZF0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRmb3JFYWNoIChjYWxsYmFjazogKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlPikgPT4gdm9pZCkge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGVudHJpZXNbaXRlbVR5cGVdKSB7XG5cdFx0XHRcdGNhbGxiYWNrKGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8qXHRmaWx0ZXIgKGNhbGxiYWNrOiAoaXRlbUVudHJ5OiBJdGVtRW50cnkpID0+IGJvb2xlYW4pOiB2b2lkIHtcblx0IGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXM7XG5cdCBjb25zdCBmaWx0ZXJlZEVudHJpZXM6IEl0ZW1FbnRyeU1hcCA9IHt9O1xuXG5cdCBmb3IgKGNvbnN0IGl0ZW1UeXBlIGluIGVudHJpZXMpIHtcblx0IGZpbHRlcmVkRW50cmllc1tpdGVtVHlwZV0gPSB7fTtcblxuXHQgZm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0IGNvbnN0IGl0ZW1FbnRyeSA9IGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0IGlmIChjYWxsYmFjayhpdGVtRW50cnkpKVxuXHQgZmlsdGVyZWRFbnRyaWVzW2l0ZW1UeXBlXVtpdGVtSWRdID0gaXRlbUVudHJ5O1xuXHQgfVxuXHQgfVxuXG5cdCB0aGlzLmVudHJpZXMgPSBmaWx0ZXJlZEVudHJpZXM7XG5cdCB9XG5cdCAqL1xuXHR0b0FycmF5ICgpIHtcblx0XHRjb25zdCBlbnRyaWVzID0gdGhpcy5lbnRyaWVzO1xuXHRcdGNvbnN0IHJlc3VsdDogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlPj4gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gZW50cmllcykge1xuXHRcdFx0Zm9yIChjb25zdCBpdGVtSWQgaW4gZW50cmllc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdGFkZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4pOiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPiB7XG5cdFx0Y29uc3QgZW50cmllcyA9IHRoaXMuZW50cmllcztcblx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGlmIChlbnRyaWVzW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRlbnRyaWVzW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdHRoaXMuZW50cmllc0J5RW50cnlJZFtpdGVtRW50cnkuaWRdID0gaXRlbUVudHJ5O1xuXG5cdFx0cmV0dXJuIGVudHJpZXNbaXRlbVR5cGVdW2l0ZW1FbnRyeS5pdGVtSWRdID0gaXRlbUVudHJ5O1xuXHR9XG5cblx0Z2V0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0KTogdW5kZWZpbmVkIHwgSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiB0aGlzLmVudHJpZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cdH1cblxuXHQvLyBzaG91bGQgYmUgZmFzdFxuXHRjb250YWlucyAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogc3RyaW5nIHwgSXRlbUlkLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5lbnRyaWVzW2l0ZW1UeXBlXSAhPT0gdW5kZWZpbmVkICYmIHRoaXMuZW50cmllc1tpdGVtVHlwZV1baXRlbUlkXSAhPT0gdW5kZWZpbmVkO1xuXHR9XG5cblx0dXBkYXRlSXRlbUlkPFQgZXh0ZW5kcyBJdGVtRW50cnk8YW55Pj4gKFxuXHRcdGl0ZW1FbnRyeTogVCxcblx0XHRvbGRJdGVtSWQ6IHN0cmluZyB8IEl0ZW1JZCxcblx0KTogVCB7XG5cdFx0Y29uc3QgZW50cnlNYXAgPSB0aGlzLmVudHJpZXNbaXRlbUVudHJ5Lml0ZW1UeXBlXTtcblxuXHRcdGRlbGV0ZSBlbnRyeU1hcFtvbGRJdGVtSWRdO1xuXHRcdHJldHVybiBlbnRyeU1hcFtpdGVtRW50cnkuaXRlbUlkXSA9IGl0ZW1FbnRyeTtcblx0fVxuXG5cdGNsZWFyIChpdGVtRW50cnk/OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGlmIChpdGVtRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5lbnRyaWVzID0ge307XG5cblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmNsZWFyQnlJdGVtSWQoXG5cdFx0XHRpdGVtRW50cnkuaXRlbVR5cGUsXG5cdFx0XHRpdGVtRW50cnkuaXRlbUlkLFxuXHRcdCk7XG5cdH1cblxuXHRjbGVhckJ5SXRlbUlkIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGVudHJpZXMgPSB0aGlzLmVudHJpZXNbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGVudHJpZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHJldHVybiBkZWxldGUgZW50cmllc1tpdGVtSWRdO1xuXHR9XG5cblx0bWF0Y2hRdWVyeSAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRxdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpOiBib29sZWFuIHtcblx0XHRjb25zdCB0dXBsZSA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0TG9jYWxJdGVtRW50cnlDaGFuZ2VzVHVwbGUoaXRlbUVudHJ5LmlkKTtcblxuXHRcdHJldHVybiB0aGlzLnF1ZXJ5TWF0Y2hlckZhY3Rvcnlcblx0XHRcdC5jb25zdHJ1Y3QoXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0KHRoaXMudHJhbnNhY3Rpb24gaW5zdGFuY2VvZiBTZXJ2ZXJDYWNoZSlcblx0XHRcdFx0XHQ/IHR1cGxlLmNoYW5nZXNcblx0XHRcdFx0XHQ6IHR1cGxlLmNoYW5nZXMuY2hhbmdlcyxcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5nZXRQYXJlbnQoaXRlbUVudHJ5KSxcblx0XHRcdClcblx0XHRcdC5tYXRjaFF1ZXJ5KHF1ZXJ5Lm9iamVjdCkgPT09IHRydWU7IC8vIFRPRE86IG1heWJlP1xuXHR9XG59XG4iLCJpbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcblxuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQUxMX1BFUk1JU1NJT05TIH0gZnJvbSAnLi4vY29uc3RhbnRzJztcbmltcG9ydCB7IEF1dGhJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7IEl0ZW1FbnRyeSwgSXRlbUVudHJ5T3B0aW9ucyB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRBcGlMaW5rVHJlZVR5cGUsXG5cdEFwaVJlc3BvbnNlLFxuXHRFbnRyeVBhcmVudCxcblx0RW50cnlQYXJlbnROdWxsLFxuXHRGaWVsZE1hcCxcblx0SXRlbUVycm9yLFxuXHRJdGVtSWQsXG5cdEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRJdGVtVHlwZSxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgSXRlbUVudHJ5U2VydmljZSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgYXV0aEludGVyZmFjZTogQXV0aEludGVyZmFjZSxcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBtYXRjaFBhcmVudCAoXG5cdFx0b2xkUGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdFx0bmV3UGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChvbGRQYXJlbnQgPT09IG51bGwgJiYgbmV3UGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoXG5cdFx0XHQob2xkUGFyZW50ID09PSBudWxsICYmIG5ld1BhcmVudCAhPT0gbnVsbClcblx0XHRcdHx8IChvbGRQYXJlbnQgIT09IG51bGwgJiYgbmV3UGFyZW50ID09PSBudWxsKVxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIHRvZG9bY2FjaGVdIHRoZXkgY2FuJ3QgYmUgbnVsbCBhbnltb3JlIGhlcmUgcmlnaHQgP1xuXHRcdHJldHVybiAoXG5cdFx0XHRvbGRQYXJlbnQhLml0ZW1UeXBlID09PSBuZXdQYXJlbnQhLml0ZW1UeXBlXG5cdFx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdFx0JiYgb2xkUGFyZW50IS5pdGVtSWQgPT0gbmV3UGFyZW50IS5pdGVtSWRcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBHZXRzIHRoZSBmaWVsZHMgcmVxdWlyZWQgdG8gc2V0IHRoZSBwYXJlbnRcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBPcHBvc2l0ZSBvZiB7QGxpbmsgSXRlbUVudHJ5U2VydmljZS5nZXRQYXJlbnRCeUZpZWxkcyBJdGVtRW50cnlTZXJ2aWNlLmdldFBhcmVudEJ5RmllbGRzfVxuXHQgKi9cblx0cHVibGljIGdldExpbmtGaWVsZHNCeVBhcmVudDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdHBhcmVudDogRW50cnlQYXJlbnQsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0KTogUGFydGlhbDxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgbGlua1RyZWUgPSB0aGlzLmxpbmtUcmVlU2VydmljZS5nZXQoKTtcblx0XHRjb25zdCBsaW5rVHJlZUVudHJ5ID0gbGlua1RyZWVbcGFyZW50Lml0ZW1UeXBlXVtpdGVtVHlwZSBhcyBzdHJpbmddO1xuXG5cdFx0aWYgKGxpbmtUcmVlRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKGBOb24gZXhpc3RpbmcgbGluayBiZXR3ZWVuICcke3BhcmVudC5pdGVtVHlwZX0nLT4nJHtpdGVtVHlwZX0nYCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzdWx0OiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+ID0ge307XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeS50eXBlID09PSBBcGlMaW5rVHJlZVR5cGUuRElSRUNUKSB7XG5cdFx0XHRyZXN1bHRbbGlua1RyZWVFbnRyeS5maWVsZF0gPSBwYXJlbnQuaXRlbUlkO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQuaXRlbXR5cGUgPSBwYXJlbnQuaXRlbVR5cGU7XG5cdFx0XHRyZXN1bHQuaXRlbSA9IHBhcmVudC5pdGVtSWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogR2V0cyBhbiB7QGxpbmsgRW50cnlQYXJlbnQgRW50cnlQYXJlbnR9IG9iamVjdCBmcm9tIHRoZSBmaWVsZHNcblx0ICpcblx0ICogQHJlbWFya1xuXHQgKiBPcHBvc2l0ZSBvZiB7QGxpbmsgSXRlbUVudHJ5U2VydmljZS5nZXRMaW5rRmllbGRzQnlQYXJlbnQgSXRlbUVudHJ5U2VydmljZS5nZXRMaW5rRmllbGRzQnlQYXJlbnR9XG5cdCAqL1xuXHRwdWJsaWMgZ2V0UGFyZW50QnlGaWVsZHM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0KTogUGFydGlhbDxGaWVsZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgbGlua1RyZWUgPSB0aGlzLmxpbmtUcmVlU2VydmljZS5nZXQoKTtcblx0XHRjb25zdCBsaW5rVHJlZUVudHJ5ID0gbGlua1RyZWVbcGFyZW50VHlwZV1baXRlbUVudHJ5Lml0ZW1UeXBlIGFzIHN0cmluZ107XG5cblx0XHRpZiAobGlua1RyZWVFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYE5vbiBleGlzdGluZyBsaW5rIGJldHdlZW4gJyR7cGFyZW50VHlwZX0nLT4nJHtpdGVtRW50cnkuaXRlbVR5cGV9J2ApO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc3VsdDogRW50cnlQYXJlbnQgPSB7fSBhcyBFbnRyeVBhcmVudDtcblxuXHRcdGlmIChsaW5rVHJlZUVudHJ5LnR5cGUgPT09IEFwaUxpbmtUcmVlVHlwZS5ESVJFQ1QpIHtcblx0XHRcdHJlc3VsdC5pdGVtVHlwZSA9IHBhcmVudFR5cGU7XG5cdFx0XHRyZXN1bHQuaXRlbUlkID0gZmllbGRzW2xpbmtUcmVlRW50cnkuZmllbGRdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyB0b2RvW2NhY2hlXSB3ZSBhbHJlYWR5IGtub3cgdGhlIHBhcmVudFR5cGU/XG5cdFx0XHRyZXN1bHQuaXRlbVR5cGUgPSBmaWVsZHMuaXRlbXR5cGU7XG5cdFx0XHRyZXN1bHQuaXRlbUlkID0gZmllbGRzLml0ZW07XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHB1YmxpYyBnZXREaXNwbGF5TmFtZTxJdGVtRW50cnlUeXBlIGV4dGVuZHMgSXRlbUVudHJ5PiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnlUeXBlLFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbUVudHJ5VHlwZVsnaXRlbVR5cGUnXT4sXG5cdCk6IHN0cmluZyB7XG5cblx0XHRzd2l0Y2ggKGl0ZW1FbnRyeS5pdGVtVHlwZSkge1xuXHRcdFx0Y2FzZSAnQ29udGFjdCc6XG5cdFx0XHRcdHJldHVybiBmaWVsZHMudHlwZSA9PT0gJ2JlZHJpamYnXG5cdFx0XHRcdFx0PyBmaWVsZHMuYmVkcmlqZlxuXHRcdFx0XHRcdDogdGhpcy5nZXRGdWxsTmFtZShcblx0XHRcdFx0XHRcdGZpZWxkcy52b29ybmFhbSxcblx0XHRcdFx0XHRcdGZpZWxkcy50dXNzZW52b2Vnc2VsLFxuXHRcdFx0XHRcdFx0ZmllbGRzLm5hYW0sXG5cdFx0XHRcdFx0KTtcblx0XHRcdGNhc2UgJ01lZGV3ZXJrZXInOlxuXHRcdFx0Y2FzZSAnUGVyc29uJzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuZ2V0RnVsbE5hbWUoXG5cdFx0XHRcdFx0ZmllbGRzLnZvb3JuYWFtLFxuXHRcdFx0XHRcdGZpZWxkcy50dXNzZW52b2Vnc2VsLFxuXHRcdFx0XHRcdGZpZWxkcy5hY2h0ZXJuYWFtLFxuXHRcdFx0XHQpO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIGZpZWxkc1t0aGlzLmdldFRpdGxlRmllbGQoaXRlbUVudHJ5Lml0ZW1UeXBlKV07XG5cdFx0fVxuXHR9XG5cblx0cHJvY2Vzc09wdGlvbnMgKG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlKTogSXRlbUVudHJ5T3B0aW9ucyB7XG5cdFx0cmV0dXJuIG5ldyBJdGVtRW50cnlPcHRpb25zKG9wdGlvbnMpO1xuXHR9XG5cblx0Ly8gdG9kbzogdHJhbnNsYXRlXG5cdGNyZWF0ZVVuZm91bmRSZW1vdGVJdGVtRXJyb3IgKCk6IEl0ZW1FcnJvciB7XG5cdFx0cmV0dXJuIHttZXNzYWdlOiAnVGhlIHJlcXVlc3RlZCBpdGVtIGNvdWxkIG5vdCBiZSBmb3VuZCAvIHlvdXIgY3VycmVudCBwZXJtaXNzaW9ucyBhcmUgbm90IHN1ZmZpY2llbnQnfTtcblx0fVxuXG5cdGNyZWF0ZVVuZm91bmRMb2NhbEl0ZW1FcnJvciAoaXRlbVR5cGU6IEl0ZW1UeXBlKTogSXRlbUVycm9yIHtcblx0XHRyZXR1cm4ge21lc3NhZ2U6IGBBIGxvY2FsIGl0ZW0gb2YgdHlwZSAke2l0ZW1UeXBlfSBjb3VsZCBub3QgYmUgZm91bmRgfTtcblx0fVxuXG5cdGNyZWF0ZUV4aXN0aW5nTG9jYWxJdGVtRXJyb3IgKGl0ZW1UeXBlOiBJdGVtVHlwZSk6IEl0ZW1FcnJvciB7XG5cdFx0cmV0dXJuIHttZXNzYWdlOiBgQSBsb2NhbCBpdGVtIG9mIHR5cGUgJHtpdGVtVHlwZX0gbm90IGJlIGNyZWF0ZWQsIHRoZSBJRCBpcyBhbHJlYWR5IGluIHVzZWB9O1xuXHR9XG5cblx0Y3JlYXRlTG9jYWxDb252ZXJzaW9uTWFwIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0ZG9FeHRlbmQ6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRhcGlSZXNwb25zZTogQXBpUmVzcG9uc2UsXG5cdCk6IEl0ZW1JZENvbnZlcnNpb25NYXAge1xuXHRcdGNvbnN0IGFwaUl0ZW1JZCA9IGFwaVJlc3BvbnNlLmxpbmtzW2l0ZW1UeXBlXVswXTtcblx0XHRjb25zdCByZXN1bHQ6IEl0ZW1JZENvbnZlcnNpb25NYXAgPSB7fTtcblxuXHRcdHJlc3VsdFtpdGVtVHlwZV0gPSB7fTtcblx0XHRyZXN1bHRbaXRlbVR5cGVdW2FwaUl0ZW1JZF0gPSBpdGVtSWQ7XG5cblx0XHRpZiAoZG9FeHRlbmQpIHtcblx0XHRcdHRoaXMuZXhwYW5kTG9jYWxDb252ZXJzaW9uTWFwKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0YXBpSXRlbUlkLFxuXHRcdFx0XHRhcGlSZXNwb25zZSxcblx0XHRcdFx0cmVzdWx0LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0ZXhwYW5kTG9jYWxDb252ZXJzaW9uTWFwIChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZDogSXRlbUlkLFxuXHRcdGFwaVJlc3BvbnNlOiBBcGlSZXNwb25zZSxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBsaW5rcyA9IGFwaVJlc3BvbnNlLml0ZW1zW3BhcmVudFR5cGVdW3BhcmVudElkXS5saW5rcztcblxuXHRcdGZvciAoY29uc3QgaXRlbVR5cGUgaW4gbGlua3MpIHtcblx0XHRcdGNvbnN0IGlkQXJyYXkgPSBsaW5rc1tpdGVtVHlwZV07XG5cblx0XHRcdGlmIChjb252ZXJzaW9uTWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdID0ge307XG5cdFx0XHR9XG5cblx0XHRcdGZvciAoY29uc3QgYXBpSXRlbUlkIG9mIGlkQXJyYXkpIHtcblx0XHRcdFx0Y29udmVyc2lvbk1hcFtpdGVtVHlwZV1bYXBpSXRlbUlkXSA9IHRoaXMua2V5U2VydmljZS5nZXRMb2NhbElkKCk7XG5cblx0XHRcdFx0dGhpcy5leHBhbmRMb2NhbENvbnZlcnNpb25NYXAoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0YXBpSXRlbUlkLFxuXHRcdFx0XHRcdGFwaVJlc3BvbnNlLFxuXHRcdFx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0ZXhwYW5kQ29udmVyc2lvbk1hcCAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pixcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwLFxuXHRcdG5ld0l0ZW1JZD86IEl0ZW1JZCxcblx0KTogSXRlbUlkIHtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblx0XHRjb25zdCBpdGVtSWQgPSBpdGVtRW50cnkuaXRlbUlkO1xuXG5cdFx0bGV0IGNvbnZlcnNpb25NYXBFbnRyeTtcblxuXHRcdGlmIChjb252ZXJzaW9uTWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRjb252ZXJzaW9uTWFwW2l0ZW1UeXBlXSA9IHt9O1xuXHRcdH1cblxuXHRcdGNvbnZlcnNpb25NYXBFbnRyeSA9IGNvbnZlcnNpb25NYXBbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGNvbnZlcnNpb25NYXBFbnRyeVtpdGVtSWRdICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBjb252ZXJzaW9uTWFwRW50cnlbaXRlbUlkXTtcblx0XHR9XG5cblx0XHRpZiAobmV3SXRlbUlkID09PSB1bmRlZmluZWQpIHtcblx0XHRcdG5ld0l0ZW1JZCA9IHRoaXMua2V5U2VydmljZS5nZXRMb2NhbElkKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnZlcnNpb25NYXBFbnRyeVtpdGVtSWRdID0gbmV3SXRlbUlkO1xuXHR9XG5cblx0YmF0Y2hFeHBhbmRDb252ZXJzaW9uTWFwIChcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PGFueT4+LFxuXHRcdGNvbnZlcnNpb25NYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IEl0ZW1JZENvbnZlcnNpb25NYXAge1xuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHR0aGlzLmV4cGFuZENvbnZlcnNpb25NYXAoXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0Y29udmVyc2lvbk1hcCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGNvbnZlcnNpb25NYXA7XG5cdH1cblxuXHRnZXRDb252ZXJzaW9uVmFsdWUgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRtYXA6IEl0ZW1JZENvbnZlcnNpb25NYXAsXG5cdCk6IEl0ZW1JZCB8IHVuZGVmaW5lZCB7XG5cdFx0aWYgKG1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHR9XG5cblx0Z2V0RnVsbE5hbWUgKFxuXHRcdGZpcnN0TmFtZTogc3RyaW5nID0gJycsXG5cdFx0aW5maXg6IHN0cmluZyA9ICcnLFxuXHRcdGxhc3ROYW1lOiBzdHJpbmcgPSAnJyxcblx0KTogc3RyaW5nIHtcblx0XHRyZXR1cm4gZmlyc3ROYW1lXG5cdFx0XHQudHJpbSgpXG5cdFx0XHQuY29uY2F0KFxuXHRcdFx0XHQnICcsXG5cdFx0XHRcdGluZml4LFxuXHRcdFx0KVxuXHRcdFx0LnRyaW0oKVxuXHRcdFx0LmNvbmNhdChcblx0XHRcdFx0JyAnLFxuXHRcdFx0XHRsYXN0TmFtZSxcblx0XHRcdClcblx0XHRcdC50cmltKCk7XG5cdH1cblxuXHRnZXRUaXRsZUZpZWxkIChpdGVtVHlwZTogSXRlbVR5cGUpOiBzdHJpbmcge1xuXHRcdHN3aXRjaCAoaXRlbVR5cGUpIHtcblx0XHRcdGNhc2UgJ0V4ZW1wbGFhcic6XG5cdFx0XHRcdHJldHVybiAnc2VyaWVudW1tZXInO1xuXHRcdFx0Y2FzZSAnRmFjdHV1cic6XG5cdFx0XHRcdHJldHVybiAnbnVtbWVyJztcblx0XHRcdGNhc2UgJ0ZpbGVzJzpcblx0XHRcdFx0cmV0dXJuICdmcmllbmRseW5hbWUnO1xuXHRcdFx0Y2FzZSAnRnVuY3RpZSc6XG5cdFx0XHRjYXNlICdTdGFuZGFhcmRmdW5jdGllJzpcblx0XHRcdFx0cmV0dXJuICduYWFtaW50ZXJuJztcblx0XHRcdGNhc2UgJ1Zvb3JyYWFkbXV0YXRpZSc6XG5cdFx0XHRcdHJldHVybiAnb21zY2hyaWp2aW5nJztcblx0XHRcdGNhc2UgJ0JhcmNvZGUnOlxuXHRcdFx0XHRyZXR1cm4gJ2NvZGUnO1xuXHRcdFx0Y2FzZSAnQmV0YWFsbWlkZGVsJzpcblx0XHRcdGNhc2UgJ0JldGFsaW5nc2NvbmRpdGllJzpcblx0XHRcdGNhc2UgJ0JyaWVmcGFwaWVyJzpcblx0XHRcdGNhc2UgJ1RheENsYXNzJzpcblx0XHRcdGNhc2UgJ1RheFNjaGVtYSc6XG5cdFx0XHRjYXNlICdDb25kaXRpb24nOlxuXHRcdFx0Y2FzZSAnRmFjdHV1cm1vbWVudCc6XG5cdFx0XHRjYXNlICdGdW5jdGllZ3JvZXAnOlxuXHRcdFx0Y2FzZSAnR3Jvb3Rib2VrJzpcblx0XHRcdGNhc2UgJ0luaHV1cic6XG5cdFx0XHRjYXNlICdJbmh1dXJncm9lcCc6XG5cdFx0XHRjYXNlICdJbmh1dXJtYXRlcmlhYWwnOlxuXHRcdFx0Y2FzZSAnTWF0ZXJpYWFsJzpcblx0XHRcdGNhc2UgJ01hdGVyaWFhbENhdCc6XG5cdFx0XHRjYXNlICdNZWRld2Vya2VydGFyaWVmJzpcblx0XHRcdGNhc2UgJ05vdGl0aWUnOlxuXHRcdFx0Y2FzZSAnUGxhbm5pbmdtYXRlcmlhYWwnOlxuXHRcdFx0Y2FzZSAnUHJvamVjdCc6XG5cdFx0XHRjYXNlICdTdGFmZmVsZ3JvZXAnOlxuXHRcdFx0Y2FzZSAnU3VicHJvamVjdCc6XG5cdFx0XHRjYXNlICdUYWFrJzpcblx0XHRcdGNhc2UgJ1RhZyc6XG5cdFx0XHRjYXNlICdUZW1wbGF0ZSc6XG5cdFx0XHRjYXNlICdUaWpkJzpcblx0XHRcdGNhc2UgJ1RpdGVsJzpcblx0XHRcdGNhc2UgJ1R5cGUnOlxuXHRcdFx0Y2FzZSAnVm9lcnR1aWcnOlxuXHRcdFx0XHRyZXR1cm4gJ25hYW0nO1xuXHRcdFx0Ly8gY2FzZSAnQ29udGFjdCc6XG5cdFx0XHQvLyBjYXNlICdNZWRld2Vya2VyJzpcblx0XHRcdC8vIGNhc2UgJ1BlcnNvbic6XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHQvLyBvbmx5IHVzZSBkaXNwbGF5bmFtZSBmb3IgaXRlbXMgdGhhdCBkb250J3QgaGF2ZSBhIHNpbXBsZSwgd3JpdGFibGUgbmFtZSBmaWVsZFxuXHRcdFx0XHQvLyB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gdXNlZCBmb3IgdGVtcGxhdGVkIGl0ZW1zXG5cdFx0XHRcdHJldHVybiAnZGlzcGxheW5hbWUnO1xuXHRcdH1cblx0fVxuXG5cdC8vIFRPRE86IHdlIGNhbiByZW1vdmUgdGhlc2Ugb25jZSBhbGwgY29sdW1ucyBhcmUgcmVzcGVjdGVkIGZvciBsb2NhbCBpdGVtcyBbUk00LTEwMzc4XVxuXHRwdWJsaWMgZ2V0TG9jYWxEZWZhdWx0VmFsdWVzICgpOiBGaWVsZE1hcCB7XG5cdFx0cmV0dXJuIHtcblx0XHRcdHBlcm1pc3Npb25zOiBBTExfUEVSTUlTU0lPTlMsXG5cdFx0XHRjcmVhdG9yOiB0aGlzLmF1dGhJbnRlcmZhY2UuZ2V0VXNlcklkKCksXG5cdFx0XHRjcmVhdGVkOiBtb21lbnQoKSxcblx0XHR9O1xuXHR9XG59XG4iLCJpbXBvcnQgeyBEVVBMSUNBVEVfS0VZV09SRCwgRFVQTElDQVRFX1BSRUZJWCwgTkVXX0tFWVdPUkQsIE5FV19QUkVGSVggfSBmcm9tICcuLi9jb25zdGFudHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBTdGF0ZUtleSwgU3RhdGVLZXlUeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgS2V5U2VydmljZSB7XG5cdHNlcGFyYXRvcjogc3RyaW5nID0gJzonO1xuXG5cdGNvbnN0cnVjdG9yICgpIHt9XG5cblx0Z2V0U2luZ2xlS2V5IChpdGVtVHlwZTogc3RyaW5nLCBpdGVtSWQ6IG51bWJlciB8IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGl0ZW1UeXBlICsgdGhpcy5zZXBhcmF0b3IgKyBpdGVtSWQ7XG5cdH1cblxuXHRnZXRDc3NLZXkgKC4uLmFyZ3MpOiBzdHJpbmcge1xuXHRcdHJldHVybiBhcmdzLmpvaW4oJ18nKTtcblx0fVxuXG5cdHBhcnNlU3RhdGVLZXkgKHN0YXRlS2V5OiBzdHJpbmcpOiBTdGF0ZUtleSB8IG51bGwge1xuXHRcdHN0YXRlS2V5ID0gc3RhdGVLZXkudG9TdHJpbmcoKTtcblxuXHRcdGlmIChzdGF0ZUtleS5zdWJzdHJpbmcoMCwgTkVXX0tFWVdPUkQubGVuZ3RoKSA9PT0gTkVXX0tFWVdPUkQpXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR0eXBlOiBTdGF0ZUtleVR5cGUuTmV3LFxuXHRcdFx0XHR0ZW1wbGF0ZTogc3RhdGVLZXkuc3Vic3RyaW5nKE5FV19LRVlXT1JELmxlbmd0aCkgLy8gVE9ETzogdGhpcyBpcyBjdXJyZW50bHkgbm90IGJlaW5nIHVzZWQsIHJlZXZhbHVhdGVcblx0XHRcdH07XG5cblx0XHRpZiAoc3RhdGVLZXkuc3Vic3RyaW5nKDAsIERVUExJQ0FURV9LRVlXT1JELmxlbmd0aCkgPT09IERVUExJQ0FURV9LRVlXT1JEKVxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0dHlwZTogU3RhdGVLZXlUeXBlLkR1cGxpY2F0ZSxcblx0XHRcdFx0aXRlbUlkOiArc3RhdGVLZXkuc3Vic3RyaW5nKERVUExJQ0FURV9LRVlXT1JELmxlbmd0aClcblx0XHRcdH07XG5cblx0XHRyZXR1cm4gbnVsbDtcblx0fVxuXG5cdGdldER1cGxpY2F0ZVN0YXRlS2V5IChpdGVtSWQ6IHN0cmluZyB8IG51bWJlcik6IHN0cmluZyB7XG5cdFx0cmV0dXJuIERVUExJQ0FURV9LRVlXT1JEICsgaXRlbUlkO1xuXHR9XG5cblx0Z2V0TmV3U3RhdGVLZXkgKHRlbXBsYXRlVHlwZTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gTkVXX0tFWVdPUkQgKyB0ZW1wbGF0ZVR5cGU7XG5cdH1cblxuXHRnZXRMb2NhbElkICgpOiBJdGVtSWQge1xuXHRcdHJldHVybiArKE5FV19QUkVGSVggKyB0aGlzLmdldFJhbmRvbVN0cmluZygpKTtcblx0fVxuXG5cdGdldExvY2FsRHVwbGljYXRlSWQgKCk6IEl0ZW1JZCB7XG5cdFx0cmV0dXJuICsoRFVQTElDQVRFX1BSRUZJWCArIHRoaXMuZ2V0UmFuZG9tU3RyaW5nKCkpO1xuXHR9XG5cblx0Z2V0UmFuZG9tU3RyaW5nICgpOiBzdHJpbmcge1xuXHRcdHJldHVybiAoJycgKyBNYXRoLnJhbmRvbSgpKS5zcGxpdCgnLicpWzFdLnN1YnN0cigwLCA4KTtcblx0fVxuXG5cdC8vIG5vdGU6IHRoZSBjaGFuZ2VzIGNvbXBpbGVyIHVzZXMgdGhpc1xuXHQvLyBtaWdodCBiZSBjYWxsZWQgd2l0aCB1bmRlZmluZWQgKGl0ZW1IYW5kbGVyLmNyZWF0ZVJlcXVlc3QpXG5cdGlzTG9jYWxJZCAoaXRlbUlkOiBJdGVtSWQgfCBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gaXRlbUlkICE9PSB1bmRlZmluZWQgJiYgKHRoaXMuaXNOZXdJZChpdGVtSWQpIHx8IHRoaXMuaXNEdXBsaWNhdGVJZChpdGVtSWQpKTtcblx0fVxuXG5cdGlzTmV3SWQgKGl0ZW1JZDogSXRlbUlkIHwgc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGl0ZW1JZCA9PT0gTkVXX0tFWVdPUkQgfHwgKCcnICsgaXRlbUlkKS5zdWJzdHJpbmcoMCwgTkVXX1BSRUZJWC5sZW5ndGgpID09PSBORVdfUFJFRklYO1xuXHR9XG5cblx0aXNEdXBsaWNhdGVJZCAoaXRlbUlkOiBJdGVtSWQgfCBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gaXRlbUlkID09PSBEVVBMSUNBVEVfS0VZV09SRCB8fCAoJycgKyBpdGVtSWQpLnN1YnN0cmluZygwLCBEVVBMSUNBVEVfUFJFRklYLmxlbmd0aCkgPT09IERVUExJQ0FURV9QUkVGSVg7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVJlcXVlc3RTZXJ2aWNlLCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBFcnJvckhhbmRsZXJJbnRlcmZhY2UsIFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbUlkLCBJdGVtTWFwLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBjcmVhdGVQYXRoIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IHR5cGUgTG9ja1Rva2VuID0ge2lzRm9yZWlnbjogZmFsc2UsIGlkOiBudW1iZXIsIHRva2VuOiBzdHJpbmd9IHwge2lzRm9yZWlnbjogdHJ1ZSwgbWVzc2FnZTogc3RyaW5nfTtcblxuZXhwb3J0IGNsYXNzIExvY2tTZXJ2aWNlIHtcblxuXHRwcml2YXRlIGxvY2tJdGVtczogSXRlbU1hcDxMb2NrVG9rZW4+ID0ge307XG5cdHByaXZhdGUgcHJvbWlzZXM6IEl0ZW1NYXA8UHJvbWlzZUludGVyZmFjZTxMb2NrVG9rZW4+PiA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBnZXRMb2NrcyAoKTogTG9ja1NlcnZpY2VbJ2xvY2tJdGVtcyddIHtcblx0XHRyZXR1cm4gdGhpcy5sb2NrSXRlbXM7XG5cdH1cblxuXHRwdWJsaWMgaGFzTG9jayAobG9ja1Rva2VuSWQ6IEl0ZW1JZCk6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGxvY2tJdGVtcyA9IHRoaXMubG9ja0l0ZW1zO1xuXG5cdFx0Zm9yIChjb25zdCBpdGVtVHlwZSBpbiBsb2NrSXRlbXMpIHtcblx0XHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGxvY2tJdGVtc1tpdGVtVHlwZV0pIHtcblx0XHRcdFx0Y29uc3QgbG9ja0l0ZW0gPSBsb2NrSXRlbXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRcdFx0Ly8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnRyaXBsZS1lcXVhbHNcblx0XHRcdFx0aWYgKCFsb2NrSXRlbS5pc0ZvcmVpZ24gJiYgbG9ja0l0ZW0uaWQgPT0gbG9ja1Rva2VuSWQpIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdC8vIHNob3VsZCBiZSBmYXN0ICh3YXRjaGVkKVxuXHRwdWJsaWMgaXNMb2NrZWQgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBib29sZWFuIHtcblx0XHRjb25zdCBsb2NrSXRlbSA9IHRoaXMuZ2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHR0aGlzLmxvY2tJdGVtcyxcblx0XHQpO1xuXG5cdFx0aWYgKGxvY2tJdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbG9ja0l0ZW0uaXNGb3JlaWduO1xuXHR9XG5cblx0cHVibGljIGdldE1lc3NhZ2UgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiB1bmRlZmluZWQgfCBzdHJpbmcge1xuXHRcdGNvbnN0IGxvY2tJdGVtID0gdGhpcy5nZXRWYWx1ZShcblx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdHRoaXMubG9ja0l0ZW1zLFxuXHRcdCk7XG5cblx0XHRpZiAobG9ja0l0ZW0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRpZiAoIWxvY2tJdGVtLmlzRm9yZWlnbikge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gbG9ja0l0ZW0ubWVzc2FnZTtcblx0fVxuXG5cdC8vIGRvZXMgbm90IHJlamVjdCB3aGVuIGEgZm9yZWlnbiBsb2NrIGlzIGVuY291bnRlcmVkXG5cdC8vIGlzIGFsc28gdXNlZCBieSBkZWxldGVMb2NrXG5cdHB1YmxpYyBmZXRjaENhY2hlZExvY2sgKGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4pOiBQcm9taXNlSW50ZXJmYWNlPHVuZGVmaW5lZCB8IExvY2tUb2tlbj4ge1xuXHRcdGNvbnN0IGxvY2sgPSB0aGlzLmdldFZhbHVlKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0KTtcblxuXHRcdGlmIChsb2NrICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlLndoZW4obG9jayk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcHJvbWlzZSA9IHRoaXMuZ2V0VmFsdWUoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHR0aGlzLnByb21pc2VzLFxuXHRcdCk7XG5cblx0XHRpZiAocHJvbWlzZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gcHJvbWlzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogUHJvbWlzZUludGVyZmFjZTxzdHJpbmc+IHtcblx0XHRjb25zdCBlcnJvckhhbmRsZXIgPSB0aGlzLmVycm9ySGFuZGxlcjtcblxuXHRcdHJldHVybiB0aGlzLmZldGNoQ2FjaGVkTG9jayhpdGVtRW50cnkpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0bG9ja0l0ZW0gPT4ge1xuXHRcdFx0XHRcdGlmIChsb2NrSXRlbSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gbG9ja0l0ZW07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMucmVxdWVzdExvY2soaXRlbUVudHJ5KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0ZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRsb2NrSXRlbSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIGxvY2tJdGVtLmlzRm9yZWlnbiA/XG5cdFx0XHRcdFx0XHRlcnJvckhhbmRsZXIucmVqZWN0KGxvY2tJdGVtLm1lc3NhZ2UpIDpcblx0XHRcdFx0XHRcdGxvY2tJdGVtLnRva2VuO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHRlcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyByZXF1ZXN0TG9jayAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IFByb21pc2VJbnRlcmZhY2U8TG9ja1Rva2VuPiB7XG5cdFx0Y29uc3Qge2l0ZW1UeXBlLCBpdGVtSWR9ID0gaXRlbUVudHJ5O1xuXG5cdFx0Y29uc3QgcHJvbWlzZSA9IHRoaXMuYXBpUmVxdWVzdFNlcnZpY2Vcblx0XHRcdC5jcmVhdGUoXG5cdFx0XHRcdCdMb2NrdG9rZW4nLFxuXHRcdFx0XHR0aGlzLmtleVNlcnZpY2UuZ2V0TG9jYWxJZCgpLFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0aXRlbXR5cGU6IGl0ZW1UeXBlLFxuXHRcdFx0XHRcdGl0ZW06IGl0ZW1JZCxcblx0XHRcdFx0fSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0ZGVsZXRlIHRoaXMucHJvbWlzZXNbaXRlbVR5cGVdW2l0ZW1JZF07XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcy5zZXRWYWx1ZShcblx0XHRcdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0XHRcdHJlc3BvbnNlLmZldGNoT2JqZWN0KFxuXHRcdFx0XHRcdFx0XHQnTG9ja3Rva2VuJyxcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UubGlua3MuTG9ja3Rva2VuWzBdLFxuXHRcdFx0XHRcdFx0KSxcblx0XHRcdFx0XHRcdHRoaXMubG9ja0l0ZW1zLFxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9yID0+IHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5wcm9taXNlc1tpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHRcdGlmIChlcnJvci5jb2RlID09PSAzMDEpIHtcblx0XHRcdFx0XHRcdHJldHVybiB0aGlzLnNldFZhbHVlKFxuXHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHRpc0ZvcmVpZ246IHRydWUsXG5cdFx0XHRcdFx0XHRcdFx0bWVzc2FnZTogZXJyb3IubWVzc2FnZSxcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0dGhpcy5sb2NrSXRlbXMsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoZXJyb3IpO1xuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblxuXHRcdHJldHVybiB0aGlzLnNldFZhbHVlKFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0cHJvbWlzZSxcblx0XHRcdHRoaXMucHJvbWlzZXMsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBkZWxldGVMb2NrIChpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+KTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuZmV0Y2hDYWNoZWRMb2NrKGl0ZW1FbnRyeSlcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRjYWNoZWRMb2NrID0+IHtcblx0XHRcdFx0XHQvLyB1bmRlZmluZWQ6IG5vdCByZXF1ZXN0ZWQgeWV0XG5cdFx0XHRcdFx0aWYgKGNhY2hlZExvY2sgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGlmIChjYWNoZWRMb2NrLmlzRm9yZWlnbikge1xuXHRcdFx0XHRcdFx0dGhpcy5jbGVhckxvY2soaXRlbUVudHJ5KTtcblxuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHRcdFx0XHQuZGVsZXRlKFxuXHRcdFx0XHRcdFx0XHQnTG9ja3Rva2VuJyxcblx0XHRcdFx0XHRcdFx0W2NhY2hlZExvY2suaWRdLFxuXHRcdFx0XHRcdFx0KVxuXHRcdFx0XHRcdFx0LnRoZW4oXG5cdFx0XHRcdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmNsZWFyTG9jayhpdGVtRW50cnkpO1xuXHRcdFx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHR0aGlzLmVycm9ySGFuZGxlci5yZWplY3QsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNsZWFyTG9jayAoaXRlbUVudHJ5OiBJdGVtRW50cnk8YW55Pik6IGJvb2xlYW4ge1xuXHRcdGNvbnN0IGxvY2tJdGVtcyA9IHRoaXMubG9ja0l0ZW1zW2l0ZW1FbnRyeS5pdGVtVHlwZV07XG5cblx0XHRpZiAobG9ja0l0ZW1zID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVsZXRlIGxvY2tJdGVtc1tpdGVtRW50cnkuaXRlbUlkXTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0VmFsdWU8VD4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PGFueT4sXG5cdFx0bWFwOiBJdGVtTWFwPFQ+LFxuXHQpOiB1bmRlZmluZWQgfCBUIHtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGl0ZW1FbnRyeS5pdGVtVHlwZTtcblxuXHRcdGlmIChtYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG1hcFtpdGVtVHlwZV1baXRlbUVudHJ5Lml0ZW1JZF07XG5cdH1cblxuXHRwcml2YXRlIHNldFZhbHVlPFQ+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxhbnk+LFxuXHRcdHZhbHVlOiBULFxuXHRcdG1hcDogSXRlbU1hcDxUPixcblx0KTogVCB7XG5cdFx0cmV0dXJuIGNyZWF0ZVBhdGgoXG5cdFx0XHRtYXAsXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0aXRlbUVudHJ5Lml0ZW1JZCxcblx0XHRcdF0sXG5cdFx0XHRbXG5cdFx0XHRcdHt9LFxuXHRcdFx0XHR2YWx1ZSxcblx0XHRcdF0sXG5cdFx0KTtcblx0fVxuXG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdEl0ZW1NYXAsIEZpZWxkTWFwLCBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmltcG9ydCB7IGhhc1Byb3BlcnRpZXMgfSBmcm9tICcuL1V0aWwnO1xuXG5jb25zdCBFTVBUWV9FTlRSWSA9IHt9O1xuXG5leHBvcnQgdHlwZSBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25SZXN1bHQgPSB7XG5cdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0aXRlbUlkOiBJdGVtSWQsXG5cdGl0ZW1zOiBBcGlSZXF1ZXN0SXRlbU1hcFxufTtcblxuZXhwb3J0IGNsYXNzIE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbiB7XG5cblx0cHVibGljIHBhcmVudE1hcDogYW55ID0ge307XG5cdHB1YmxpYyBkZXN0aW5hdGlvbjogQXBpUmVxdWVzdEl0ZW1NYXAgPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KSB7XG5cdH1cblxuXHRwcm9jZXNzICgpOiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25SZXN1bHQge1xuXHRcdGlmICh0aGlzLnRyYW5zYWN0aW9uLnJvb3RJdGVtID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignQSBUcmFuc2FjdGlvbkNhY2hlIHJvb3RJdGVtIGlzIHJlcXVpcmVkIGZvciBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24nKTtcblx0XHR9XG5cblx0XHR0aGlzLnBhcmVudE1hcCA9IHRoaXMuY3JlYXRlUGFyZW50TWFwKCk7XG5cblx0XHR0aGlzLnByb2Nlc3NJdGVtcyhcblx0XHRcdHRoaXMudHJhbnNhY3Rpb24ucm9vdEl0ZW0uaXRlbVR5cGUsXG5cdFx0XHRbdGhpcy50cmFuc2FjdGlvbi5yb290SXRlbV0sXG5cdFx0XHR7fSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHtcblx0XHRcdGl0ZW1UeXBlOiB0aGlzLnRyYW5zYWN0aW9uLnJvb3RJdGVtLml0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkOiB0aGlzLnRyYW5zYWN0aW9uLnJvb3RJdGVtLml0ZW1JZCxcblx0XHRcdGl0ZW1zOiB0aGlzLmRlc3RpbmF0aW9uLFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZVBhcmVudE1hcCAoKSB7XG5cdFx0Y29uc3QgcmVzdWx0OiB7XG5cdFx0XHRbcGFyZW50VHlwZTogc3RyaW5nXToge1xuXHRcdFx0XHRbcGFyZW50SWQ6IG51bWJlcl06IHtcblx0XHRcdFx0XHRbaXRlbVR5cGU6IHN0cmluZ106IEFycmF5PEl0ZW1FbnRyeTxJdGVtVHlwZT4+XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ID0ge307XG5cblx0XHQvLyB0b2RvOiBhbHNvIGluY2x1ZGUgcGFyZW50J3MgZW50cmllcyA/IHByb2JhYmx5IG5vdC4uLlxuXHRcdHRoaXMudHJhbnNhY3Rpb24uaXRlbUhhbmRsZXIuZW50cmllcy5mb3JFYWNoKFxuXHRcdFx0aXRlbUVudHJ5ID0+IHtcblx0XHRcdFx0Y29uc3QgaXRlbVR5cGUgPSBpdGVtRW50cnkuaXRlbVR5cGU7XG5cdFx0XHRcdGNvbnN0IHBhcmVudCA9IHRoaXMudHJhbnNhY3Rpb24uZ2V0UGFyZW50KGl0ZW1FbnRyeSk7XG5cblx0XHRcdFx0Ly8gd2UgZG9uJ3QgY2FyZSBmb3IgaXRlbXMgdGhhdCBhcmUgbm90IGxpbmtlZCB0byB0aGUgcm9vdCBpdGVtXG5cdFx0XHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBwYXJlbnRUeXBlID0gcGFyZW50Lml0ZW1UeXBlO1xuXHRcdFx0XHRjb25zdCBwYXJlbnRJZCA9IHBhcmVudC5pdGVtSWQ7XG5cblx0XHRcdFx0aWYgKHJlc3VsdFtwYXJlbnRUeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmVzdWx0W3BhcmVudFR5cGVdID0ge307XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAocmVzdWx0W3BhcmVudFR5cGVdW3BhcmVudElkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmVzdWx0W3BhcmVudFR5cGVdW3BhcmVudElkXSA9IHt9O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKHJlc3VsdFtwYXJlbnRUeXBlXVtwYXJlbnRJZF1baXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRyZXN1bHRbcGFyZW50VHlwZV1bcGFyZW50SWRdW2l0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVzdWx0W3BhcmVudFR5cGVdW3BhcmVudElkXVtpdGVtVHlwZV0ucHVzaChpdGVtRW50cnkpO1xuXHRcdFx0fSxcblx0XHQpO1xuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc0l0ZW1zPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4+LFxuXHRcdGxpbmtBY2N1bXVsYXRvcjoge1tpdGVtVHlwZTogc3RyaW5nXTogSXRlbUlkW119LFxuXHQpIHtcblx0XHRpZiAodGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5kZXN0aW5hdGlvbltpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRpZiAobGlua0FjY3VtdWxhdG9yW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRsaW5rQWNjdW11bGF0b3JbaXRlbVR5cGVdID0gW107XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBpdGVtRW50cnkgb2YgaXRlbUVudHJpZXMpIHtcblx0XHRcdGNvbnN0IGl0ZW1JZCA9IGl0ZW1FbnRyeS5pdGVtSWQ7XG5cblx0XHRcdC8vIGVhY2ggaXRlbSBvbmx5IGhhcyBhIHNpbmdsZSBwYXJlbnQsIHNvIHdlIGNhbiBzYWZlbHkgZG8gdGhpc1xuXHRcdFx0aWYgKHRoaXMuZGVzdGluYXRpb25baXRlbVR5cGVdW2l0ZW1JZF0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0bGlua0FjY3VtdWxhdG9yW2l0ZW1UeXBlXS5wdXNoKGl0ZW1JZCk7XG5cblx0XHRcdHRoaXMuZGVzdGluYXRpb25baXRlbVR5cGVdW2l0ZW1JZF0gPSB0aGlzLnByb2Nlc3NJdGVtKGl0ZW1FbnRyeSk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzSXRlbTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdCk6IHt2YWx1ZXM/OiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LCBsaW5rcz86IHtbaXRlbVR5cGU6IHN0cmluZ106IEl0ZW1JZFtdfX0ge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gaXRlbUVudHJ5Lml0ZW1UeXBlO1xuXHRcdGNvbnN0IGl0ZW1JZCA9IGl0ZW1FbnRyeS5pdGVtSWQ7XG5cdFx0Y29uc3QgY2hpbGRJdGVtcyA9IHRoaXMuZ2V0SXRlbXNCeVBhcmVudChcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0aXRlbUlkLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjaGlsZENvbGxlY3Rpb25zID0gdGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldENvbGxlY3Rpb25zQnlQYXJlbnQoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGl0ZW1JZCxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdmFsdWVzID0gdGhpcy50cmFuc2FjdGlvbi5pdGVtSGFuZGxlci5mb3JtYXRSZXF1ZXN0KGl0ZW1FbnRyeSk7XG5cdFx0Y29uc3QgbGlua3MgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY2hpbGRUeXBlIGluIGNoaWxkSXRlbXMpIHtcblx0XHRcdHRoaXMucHJvY2Vzc0l0ZW1zKFxuXHRcdFx0XHRjaGlsZFR5cGUsXG5cdFx0XHRcdGNoaWxkSXRlbXNbY2hpbGRUeXBlXSxcblx0XHRcdFx0bGlua3MsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5IG9mIGNoaWxkQ29sbGVjdGlvbnMpIHtcblx0XHRcdGlmIChjb2xsZWN0aW9uRW50cnkub3B0aW9ucy5xdWVyeSAhPT0gbnVsbCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5wcm9jZXNzSXRlbXMoXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSxcblx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gVXNlIGdldENvbGxlY3Rpb25DaGFuZ2VzUmVjdXJzaXZlbHlcblx0XHRcdFx0dGhpcy50cmFuc2FjdGlvbi5jb2xsZWN0aW9uSGFuZGxlci5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdLFxuXHRcdFx0XHRsaW5rcyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgaGFzVmFsdWVzID0gaGFzUHJvcGVydGllcyh2YWx1ZXMpO1xuXHRcdGNvbnN0IGhhc0xpbmtzID0gaGFzUHJvcGVydGllcyhsaW5rcyk7XG5cblx0XHRpZiAoaGFzVmFsdWVzICYmIGhhc0xpbmtzKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR2YWx1ZXM6IHZhbHVlcyxcblx0XHRcdFx0bGlua3M6IGxpbmtzLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRpZiAoaGFzVmFsdWVzKSB7XG5cdFx0XHRyZXR1cm4ge3ZhbHVlczogdmFsdWVzfTtcblx0XHR9XG5cblx0XHRpZiAoaGFzTGlua3MpIHtcblx0XHRcdHJldHVybiB7bGlua3M6IGxpbmtzfTtcblx0XHR9XG5cblx0XHRyZXR1cm4gRU1QVFlfRU5UUlk7XG5cdH1cblxuXHRwcml2YXRlIGdldEl0ZW1zQnlQYXJlbnQgKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdHBhcmVudElkOiBJdGVtSWQsXG5cdCkge1xuXHRcdGNvbnN0IG1hcEVudHJ5ID0gdGhpcy5wYXJlbnRNYXBbcGFyZW50VHlwZV07XG5cblx0XHRpZiAobWFwRW50cnkgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdGlmIChtYXBFbnRyeVtwYXJlbnRJZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHt9O1xuXHRcdH1cblxuXHRcdHJldHVybiBtYXBFbnRyeVtwYXJlbnRJZF07XG5cdH1cbn1cbiIsImltcG9ydCAqIGFzIG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBBcGlGb3JtYXR0ZXIgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHsgaGFzUHJvcGVydGllcywgaW5BcnJheSB9IGZyb20gJy4vVXRpbCc7XG5cbmNvbnN0IE1BWUJFID0gJ21heWJlJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5TWF0Y2hlciB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHB1YmxpYyBpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cHVibGljIGZpZWxkczogRmllbGRNYXAsXG5cdFx0cHVibGljIHBhcmVudDogRW50cnlQYXJlbnROdWxsID0gbnVsbCxcblx0KSB7XG5cblx0fVxuXG5cdHByaXZhdGUgY29tcGFyZVZhbHVlcyAoXG5cdFx0dmFsdWU6IGFueSxcblx0XHRxdWVyeVZhbHVlOiBhbnksXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChtb21lbnQuaXNNb21lbnQocXVlcnlWYWx1ZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLmFwaUZvcm1hdHRlci5jb21wYXJlTW9tZW50T2JqZWN0cyhcblx0XHRcdFx0cXVlcnlWYWx1ZSxcblx0XHRcdFx0dmFsdWUsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGlmIChtb21lbnQuaXNEdXJhdGlvbihxdWVyeVZhbHVlKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMuYXBpRm9ybWF0dGVyLmNvbXBhcmVEdXJhdGlvbnMoXG5cdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdHZhbHVlLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHQvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6dHJpcGxlLWVxdWFsc1xuXHRcdHJldHVybiBxdWVyeVZhbHVlID09IHZhbHVlO1xuXHR9XG5cblx0bWF0Y2hRdWVyeSAocXVlcnk6IEFwaVF1ZXJ5KTogYm9vbGVhbiB8ICdtYXliZScge1xuXHRcdGlmIChxdWVyeS5zZWFyY2ggIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIE1BWUJFO1xuXHRcdH1cblxuXHRcdGlmIChxdWVyeS5jdXN0b20gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIE1BWUJFO1xuXHRcdH1cblxuXHRcdC8vIGxpbmtlZFRvIGFsc28gY29udGFpbnMgLnF1ZXJ5XG5cdFx0aWYgKHF1ZXJ5LmxpbmtlZFRvICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiB0aGlzLm1hdGNoTGlua2VkVG9RdWVyeShxdWVyeSk7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LnF1ZXJ5ICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBNQVlCRTtcblx0XHR9XG5cblx0XHRpZiAocXVlcnkuY29uZGl0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5tYXRjaENvbXBsZXhRdWVyeShxdWVyeSk7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5LmtleSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5tYXRjaFNpbXBsZVF1ZXJ5KFxuXHRcdFx0XHR0aGlzLmZpZWxkc1txdWVyeS5rZXldLFxuXHRcdFx0XHRxdWVyeSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHF1ZXJ5KSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0dGhyb3cgbmV3IEVycm9yKCdxdWVyeU1hdGNoZXI6IFVuc3VwcG9ydGVkIHF1ZXJ5ISBQYXJzZWQ/Jyk7XG5cdH1cblxuXHRwcml2YXRlIG1hdGNoTGlua2VkVG9RdWVyeSAocXVlcnk6IEFwaVF1ZXJ5KTogYm9vbGVhbiB8ICdtYXliZScge1xuXHRcdGlmIChxdWVyeS5yZXZlcnNlKSB7XG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG5cdFx0bGV0IG1hdGNoO1xuXG5cdFx0aWYgKHBhcmVudCA9PT0gbnVsbCkge1xuXHRcdFx0bWF0Y2ggPSBmYWxzZTtcblx0XHR9IGVsc2UgaWYgKHF1ZXJ5LmxpbmtlZFRvICE9PSBwYXJlbnQuaXRlbVR5cGUpIHtcblx0XHRcdG1hdGNoID0gZmFsc2U7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoID0gdGhpcy5tYXRjaFNpbXBsZVF1ZXJ5KFxuXHRcdFx0XHRwYXJlbnQuaXRlbUlkLFxuXHRcdFx0XHRxdWVyeS5xdWVyeSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKG1hdGNoID09PSBNQVlCRSkge1xuXHRcdFx0cmV0dXJuIE1BWUJFO1xuXHRcdH1cblxuXHRcdHJldHVybiBxdWVyeS5ub3QgPyAhbWF0Y2ggOiAhIW1hdGNoO1xuXHR9XG5cblx0cHJpdmF0ZSBtYXRjaENvbXBsZXhRdWVyeSAocXVlcnk6IEFwaVF1ZXJ5KTogYm9vbGVhbiB8ICdtYXliZScge1xuXHRcdGNvbnN0IGNvbmRpdGlvbnMgPSBxdWVyeS5jb25kaXRpb25zO1xuXG5cdFx0bGV0IHJlc3VsdDtcblx0XHRsZXQgdGVybWluYWw7XG5cblx0XHRzd2l0Y2ggKHF1ZXJ5Lm9wZXJhdG9yKSB7XG5cdFx0XHRjYXNlICdBTkQnOlxuXHRcdFx0XHRyZXN1bHQgPSB0cnVlO1xuXHRcdFx0XHR0ZXJtaW5hbCA9IGZhbHNlO1xuXHRcdFx0XHRicmVhaztcblx0XHRcdGNhc2UgJ09SJzpcblx0XHRcdFx0cmVzdWx0ID0gZmFsc2U7XG5cdFx0XHRcdHRlcm1pbmFsID0gdHJ1ZTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5TWF0Y2hlcjogVW5zdXBwb3J0ZWQgb3BlcmF0b3InKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNvbmRpdGlvbiBvZiBjb25kaXRpb25zKSB7XG5cdFx0XHRjb25zdCBtYXRjaCA9IHRoaXMubWF0Y2hRdWVyeShjb25kaXRpb24pO1xuXG5cdFx0XHRpZiAobWF0Y2ggPT09IHRlcm1pbmFsKSB7XG5cdFx0XHRcdHJldHVybiBxdWVyeS5ub3QgPyAhdGVybWluYWwgOiB0ZXJtaW5hbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKG1hdGNoID09PSBNQVlCRSkge1xuXHRcdFx0XHRyZXN1bHQgPSBNQVlCRTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAocmVzdWx0ID09PSBNQVlCRSkge1xuXHRcdFx0cmV0dXJuIE1BWUJFO1xuXHRcdH1cblxuXHRcdHJldHVybiBxdWVyeS5ub3QgPyAhcmVzdWx0IDogcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBtYXRjaFNpbXBsZVF1ZXJ5IChcblx0XHR2YWx1ZTogYW55LFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0KTogYm9vbGVhbiB8ICdtYXliZScge1xuXHRcdGNvbnN0IGtleSA9IHF1ZXJ5LmtleTtcblx0XHRsZXQgcXVlcnlWYWx1ZSA9IHF1ZXJ5LnZhbHVlO1xuXG5cdFx0aWYgKCFoYXNQcm9wZXJ0aWVzKHF1ZXJ5KSkgLy8gQ291bGQgYmUgbGlua2VkVG8gYW4gZW1wdHkgb2JqZWN0XG5cdFx0e1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXG5cdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdGNvbnNvbGUud2Fybihcblx0XHRcdFx0J1JlcXVpcmVkIGZpZWxkJyxcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHQnbm90IGZvdW5kIGZvcicsXG5cdFx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHQpO1xuXG5cdFx0XHRyZXR1cm4gTUFZQkU7XG5cdFx0fVxuXG5cdFx0aWYgKHF1ZXJ5VmFsdWUgPT09ICdOT1cnKSB7XG5cdFx0XHRxdWVyeVZhbHVlID0gbW9tZW50KCk7XG5cdFx0fVxuXG5cdFx0c3dpdGNoIChxdWVyeS5jb21wYXJhdG9yKSB7XG5cdFx0XHRjYXNlICc9Jzpcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29tcGFyZVZhbHVlcyhcblx0XHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0XHRxdWVyeVZhbHVlLFxuXHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnIT0nOlxuXHRcdFx0XHRyZXR1cm4gIXRoaXMuY29tcGFyZVZhbHVlcyhcblx0XHRcdFx0XHR2YWx1ZSxcblx0XHRcdFx0XHRxdWVyeVZhbHVlLFxuXHRcdFx0XHQpO1xuXHRcdFx0Y2FzZSAnPCc6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA8IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICc8PSc6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA8PSBxdWVyeVZhbHVlO1xuXHRcdFx0Y2FzZSAnPic6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA+IHF1ZXJ5VmFsdWU7XG5cdFx0XHRjYXNlICc+PSc6XG5cdFx0XHRcdHJldHVybiB2YWx1ZSA+PSBxdWVyeVZhbHVlO1xuXHRcdFx0Y2FzZSAnSU4nOlxuXHRcdFx0XHQvLyBPbmx5IElOIHN1cHBvcnRzIE5PVCwgYWxsIG90aGVyIGNvbXBhcmF0b3JzIGFyZSBmbGlwcGVkIGluIHRoZSBRdWVyeVBhcnNlclxuXHRcdFx0XHRjb25zdCByZXMgPSBpbkFycmF5KFxuXHRcdFx0XHRcdHZhbHVlLFxuXHRcdFx0XHRcdHF1ZXJ5VmFsdWUsXG5cdFx0XHRcdCk7XG5cblx0XHRcdFx0cmV0dXJuIHF1ZXJ5Lm5vdCA/ICFyZXMgOiByZXM7XG5cdFx0XHRkZWZhdWx0OlxuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3F1ZXJ5TWF0Y2hlcjogVW5zdXBwb3J0ZWQgY29tcGFyYXRvcjogJyArIHF1ZXJ5LmNvbXBhcmF0b3IgKyAnIGluIHF1ZXJ5ICcgKyBxdWVyeSk7XG5cdFx0fVxuXHR9XG59XG4iLCJpbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCB7IEFwaVF1ZXJ5LCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENPTVBBUkFUT1JTLCBPUEVSQVRPUlMsIE9QRVJBVE9SU19UWVBFLCBRdWVyeVBhcnNlckJhc2UgfSBmcm9tICcuL1F1ZXJ5UGFyc2VyQmFzZSc7XG5cbmV4cG9ydCBlbnVtIENPTlNUQU5UUyB7XG5cdE9CSiA9IDAsXG5cdFNUUiA9IDEsXG5cdFNFUCA9ICc6J1xufVxuXG5jb25zdCBWQUxJRF9DT01QQVJBVE9SUyA9IE9iamVjdC5rZXlzKENPTVBBUkFUT1JTKVxuXHQubWFwKFxuXHRcdGtleSA9PiBDT01QQVJBVE9SU1trZXldLFxuXHQpO1xuXG5leHBvcnQgdHlwZSBDT01QQVJBVE9SU19UWVBFID0gJz0nIHwgJyE9JyB8ICc8JyB8ICc+JyB8ICc8PScgfCAnPj0nIHwgJ0lOJyB8IENPTVBBUkFUT1JTO1xuXG5jb25zdCBPUFBPU0lURV9DT01QQVJBVE9SX01BUDogeyBba2V5IGluIENPTVBBUkFUT1JTXTogQ09NUEFSQVRPUlMgfSA9IHtcblx0W0NPTVBBUkFUT1JTLkVRVUFMU106IENPTVBBUkFUT1JTLk5PVF9FUVVBTFMsXG5cdFtDT01QQVJBVE9SUy5OT1RfRVFVQUxTXTogQ09NUEFSQVRPUlMuRVFVQUxTLFxuXHRbQ09NUEFSQVRPUlMuTU9SRV9USEFOXTogQ09NUEFSQVRPUlMuTEVTU19PUl9FUVVBTF9USEFOLFxuXHRbQ09NUEFSQVRPUlMuTEVTU19USEFOXTogQ09NUEFSQVRPUlMuRVFVQUxfT1JfTU9SRV9USEFOLFxuXHRbQ09NUEFSQVRPUlMuTEVTU19PUl9FUVVBTF9USEFOXTogQ09NUEFSQVRPUlMuTU9SRV9USEFOLFxuXHRbQ09NUEFSQVRPUlMuRVFVQUxfT1JfTU9SRV9USEFOXTogQ09NUEFSQVRPUlMuTEVTU19USEFOLFxuXHQvLyBJbiB1c2VzICdub3Q6IHRydWUnIGluc3RlYWQgb2YgcmV2ZXJzaW5nIHRoZSBxdWVyeVxuXHRbQ09NUEFSQVRPUlMuSU5dOiBDT01QQVJBVE9SUy5JTixcbn07XG5cbmV4cG9ydCBjbGFzcyBRdWVyeVBhcnNlclxuXHRleHRlbmRzIFF1ZXJ5UGFyc2VyQmFzZTxbb2JqZWN0LCBzdHJpbmddPiB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRwcml2YXRlIHBhcmFtZXRlcnM6IG9iamVjdCxcblx0KSB7XG5cdFx0c3VwZXIoXG5cdFx0XHRxdWVyeSxcblx0XHQpO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlRW1wdHlRdWVyeSAoKSB7XG5cdFx0cmV0dXJuIFtcblx0XHRcdHt9LFxuXHRcdFx0J3t9Jyxcblx0XHRdIGFzIFtvYmplY3QsIHN0cmluZ107XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VTdWJRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcsXG5cdFx0c3ViUXVlcnk6IG9iamVjdCxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLnBhcnNlKHN1YlF1ZXJ5KTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGtleSxcblx0XHRcdFx0cXVlcnk6IHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgJ3N1YicgKyBDT05TVEFOVFMuU0VQICsga2V5ICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU3ViRmllbGRRdWVyeSAoXG5cdFx0a2V5OiBzdHJpbmcgPSAnJyxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUgPSAnJyxcblx0XHRmaWVsZDogc3RyaW5nID0gJycsXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMucGFyc2UocXVlcnkpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0a2V5LFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0ZmllbGQsXG5cdFx0XHRcdHF1ZXJ5OiBwYXJzZWRRdWVyeVtDT05TVEFOVFMuT0JKXSxcblx0XHRcdFx0bm90LFxuXHRcdFx0fSxcblx0XHRcdC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcblx0XHRcdCdbJyArICdzdWJGaWVsZCcgKyBDT05TVEFOVFMuU0VQICsga2V5ICsgQ09OU1RBTlRTLlNFUCArIGl0ZW1UeXBlICsgQ09OU1RBTlRTLlNFUCArIGZpZWxkICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRdO1xuXHR9XG5cblx0cHJvdGVjdGVkIHBhcnNlU2VhcmNoUXVlcnkgKFxuXHRcdHZhbHVlOiBhbnksXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdHZhbHVlID0gdGhpcy5mb3JtYXRWYWx1ZSh2YWx1ZSk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRzZWFyY2g6IHZhbHVlW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgJ3NlYXJjaCcgKyBDT05TVEFOVFMuU0VQICsgdmFsdWVbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDdXN0b21RdWVyeSAoXG5cdFx0Y3VzdG9tOiBzdHJpbmcsXG5cdFx0cGFyYW1ldGVyczogYW55LFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRpZiAocGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHR7XG5cdFx0XHRcdFx0Y3VzdG9tLFxuXHRcdFx0XHRcdG5vdCxcblx0XHRcdFx0fSxcblx0XHRcdFx0J1snICsgY3VzdG9tICsgQ09OU1RBTlRTLlNFUCArIG5vdCArICddJyxcblx0XHRcdF07XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFyc2VkUGFyYW1ldGVycyA9IHRoaXMucGFyc2VDdXN0b21QYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0Y3VzdG9tLFxuXHRcdFx0XHRwYXJhbWV0ZXJzOiBwYXJzZWRQYXJhbWV0ZXJzW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRub3QsXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgY3VzdG9tICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFBhcmFtZXRlcnNbQ09OU1RBTlRTLlNUUl0gKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDdXN0b21QYXJhbWV0ZXJzIChwYXJhbWV0ZXJzOiBhbnkpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHRjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGFyYW1ldGVycylcblx0XHRcdC5zb3J0KCk7XG5cblx0XHRjb25zdCBxdWVyeTogQXBpUXVlcnkgPSB7fSBhcyBBcGlRdWVyeTtcblx0XHRsZXQgc3RyaW5nID0gJyc7XG5cblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHtcblx0XHRcdGNvbnN0IGtleSA9IGtleXNbaV07XG5cdFx0XHRjb25zdCB2YWx1ZSA9IHRoaXMuZm9ybWF0VmFsdWUocGFyYW1ldGVyc1trZXldKTtcblxuXHRcdFx0cXVlcnlba2V5XSA9IHZhbHVlW0NPTlNUQU5UUy5PQkpdO1xuXG5cdFx0XHRpZiAoaSA+IDApIHtcblx0XHRcdFx0c3RyaW5nICs9IENPTlNUQU5UUy5TRVA7XG5cdFx0XHR9XG5cblx0XHRcdHN0cmluZyArPSB2YWx1ZVtDT05TVEFOVFMuU1RSXTtcblx0XHR9XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0cXVlcnksXG5cdFx0XHRzdHJpbmcsXG5cdFx0XTtcblx0fVxuXG5cdHByb3RlY3RlZCBwYXJzZVNpbXBsZVF1ZXJ5IChcblx0XHRrZXk6IHN0cmluZyxcblx0XHR2YWx1ZTogYW55LFxuXHRcdGNvbXBhcmF0b3I/OiBDT01QQVJBVE9SU19UWVBFLFxuXHRcdG5vdDogYm9vbGVhbiA9IGZhbHNlLFxuXHQpOiBbb2JqZWN0LCBzdHJpbmddIHtcblx0XHR2YWx1ZSA9IHRoaXMuZm9ybWF0VmFsdWUodmFsdWUpO1xuXG5cdFx0aWYgKGNvbXBhcmF0b3IgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29tcGFyYXRvciA9IEFycmF5LmlzQXJyYXkodmFsdWVbQ09OU1RBTlRTLk9CSl0pID8gQ09NUEFSQVRPUlMuSU4gOiBDT01QQVJBVE9SUy5FUVVBTFM7XG5cdFx0fVxuXG5cdFx0aWYgKFZBTElEX0NPTVBBUkFUT1JTLmluZGV4T2YoY29tcGFyYXRvcikgPT09IC0xKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY29tcGFyYXRvciAnJHtjb21wYXJhdG9yfScsIGl0IG1pZ2h0IGJlIHRoYXQgdGhlIGJhY2tlbmQgc3VwcG9ydHMgaXQgYnV0IHRoZSBmcm9udGVuZCBkb2Vzbid0ICFgKTtcblx0XHR9XG5cblx0XHRpZiAobm90KSB7XG5cdFx0XHRjb21wYXJhdG9yID0gT1BQT1NJVEVfQ09NUEFSQVRPUl9NQVBbY29tcGFyYXRvcl07XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIG90aGVyIGNvbXBhcmF0b3JzIGNhbiBiZSBpbnZlcnRlZFxuXHRcdGNvbnN0IGlzTm90SW4gPSBjb21wYXJhdG9yID09PSBDT01QQVJBVE9SUy5JTiAmJiBub3Q7XG5cblx0XHRjb25zdCByZXN1bHQ6IFtvYmplY3QsIHN0cmluZ10gPSBbXG5cdFx0XHR7XG5cdFx0XHRcdGtleSxcblx0XHRcdFx0dmFsdWU6IHZhbHVlW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRjb21wYXJhdG9yLFxuXHRcdFx0XHRub3Q6IGlzTm90SW4sXG5cdFx0XHR9LFxuXHRcdFx0J1snICsgY29tcGFyYXRvciArIENPTlNUQU5UUy5TRVAgKyBrZXkgKyBDT05TVEFOVFMuU0VQICsgdmFsdWVbQ09OU1RBTlRTLlNUUl0gKyAnXScsXG5cdFx0XTtcblxuXHRcdGlmIChpc05vdEluKSB7XG5cdFx0XHRyZXN1bHRbMV0gPSByZXN1bHRbMV0uc2xpY2UoXG5cdFx0XHRcdDAsXG5cdFx0XHRcdC0xLFxuXHRcdFx0KTtcblx0XHRcdHJlc3VsdFsxXSArPSBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VMaW5rZWRUb1F1ZXJ5IChcblx0XHRsaW5rZWRUbzogYW55LFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSA9IHt9IGFzIEFwaVF1ZXJ5LFxuXHRcdHJldmVyc2U6IGJvb2xlYW4gPSBmYWxzZSxcblx0XHRub3Q6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogW29iamVjdCwgc3RyaW5nXSB7XG5cdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLnBhcnNlKHF1ZXJ5KTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGxpbmtlZFRvOiBsaW5rZWRUbyxcblx0XHRcdFx0cXVlcnk6IHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRyZXZlcnNlOiByZXZlcnNlLFxuXHRcdFx0XHRub3Q6IG5vdCxcblx0XHRcdH0sXG5cdFx0XHQnWycgKyAnbGlua2VkVG8nICsgQ09OU1RBTlRTLlNFUCArIGxpbmtlZFRvICsgQ09OU1RBTlRTLlNFUCArIHBhcnNlZFF1ZXJ5W0NPTlNUQU5UUy5TVFJdICsgQ09OU1RBTlRTLlNFUCArIHJldmVyc2UgKyBDT05TVEFOVFMuU0VQICsgbm90ICsgJ10nLFxuXHRcdF07XG5cdH1cblxuXHRwcm90ZWN0ZWQgcGFyc2VDb21wbGV4UXVlcnkgKFxuXHRcdGNvbmRpdGlvbnM6IGFueVtdLFxuXHRcdG9wZXJhdG9yOiBPUEVSQVRPUlNfVFlQRSA9IE9QRVJBVE9SUy5BTkQsXG5cdFx0bm90OiBib29sZWFuID0gZmFsc2UsXG5cdCk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdG9wZXJhdG9yID0gb3BlcmF0b3IudG9VcHBlckNhc2UoKSBhcyBPUEVSQVRPUlM7XG5cblx0XHRjb25zdCBwYXJzZWRDb25kaXRpb25zID0gdGhpcy5wYXJzZUNvbmRpdGlvbnMoY29uZGl0aW9ucyk7XG5cblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRjb25kaXRpb25zOiBwYXJzZWRDb25kaXRpb25zW0NPTlNUQU5UUy5PQkpdLFxuXHRcdFx0XHRvcGVyYXRvcixcblx0XHRcdFx0bm90LFxuXHRcdFx0fSxcblx0XHRcdCdbJyArIG9wZXJhdG9yICsgcGFyc2VkQ29uZGl0aW9uc1tDT05TVEFOVFMuU1RSXSArIENPTlNUQU5UUy5TRVAgKyBub3QgKyAnXScsXG5cdFx0XTtcblx0fVxuXG5cdHByaXZhdGUgcGFyc2VDb25kaXRpb25zIChjb25kaXRpb25zOiBhbnlbXSk6IFtvYmplY3QsIHN0cmluZ10ge1xuXHRcdGxldCBwYXJzZWRDb25kaXRpb25zOiBBcnJheTxbb2JqZWN0LCBzdHJpbmddPiA9IFtdO1xuXHRcdGNvbnN0IHF1ZXJ5OiBvYmplY3RbXSA9IFtdO1xuXHRcdGxldCBzdHJpbmcgPSAnJztcblxuXHRcdGZvciAoY29uc3QgY29uZGl0aW9uIG9mIGNvbmRpdGlvbnMpIHtcblx0XHRcdHBhcnNlZENvbmRpdGlvbnMucHVzaCh0aGlzLnBhcnNlKGNvbmRpdGlvbikpO1xuXHRcdH1cblxuXHRcdHBhcnNlZENvbmRpdGlvbnMgPSBwYXJzZWRDb25kaXRpb25zLnNvcnQoKFxuXHRcdFx0YSxcblx0XHRcdGIsXG5cdFx0KSA9PiB0aGlzLmNvbXBhcmVQYXJzZWRRdWVyaWVzKFxuXHRcdFx0YSxcblx0XHRcdGIsXG5cdFx0KSk7XG5cblx0XHRmb3IgKGNvbnN0IHBhcnNlZENvbmRpdGlvbiBvZiBwYXJzZWRDb25kaXRpb25zKSB7XG5cdFx0XHRxdWVyeS5wdXNoKHBhcnNlZENvbmRpdGlvbltDT05TVEFOVFMuT0JKXSk7XG5cdFx0XHRzdHJpbmcgKz0gcGFyc2VkQ29uZGl0aW9uW0NPTlNUQU5UUy5TVFJdO1xuXHRcdH1cblxuXHRcdHJldHVybiBbXG5cdFx0XHRxdWVyeSxcblx0XHRcdHN0cmluZyxcblx0XHRdO1xuXHR9XG5cblx0cHJpdmF0ZSBmb3JtYXRWYWx1ZTxUPiAodmFsdWU6IFQpOiBbVCwgc3RyaW5nXSB7XG5cdFx0bGV0IHByb2Nlc3NlZFZhbHVlO1xuXG5cdFx0aWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgdmFsdWUuY2hhckF0KDApID09PSAnJicpIHtcblx0XHRcdGNvbnN0IGtleSA9IHZhbHVlLnN1YnN0cmluZygxKTtcblxuXHRcdFx0dmFsdWUgPSB0aGlzLnBhcmFtZXRlcnNba2V5XTtcblxuXHRcdFx0aWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKCdxdWVyeVBhcnNlcjogVW5kZWZpbmVkIHRlbXBsYXRlIHBhcmFtZXRlciBcXCcnICsga2V5ICsgJ1xcJycpO1xuXHRcdFx0fVxuXG5cdFx0XHRwcm9jZXNzZWRWYWx1ZSA9IHRoaXMucHJvY2Vzc1ZhbHVlKHZhbHVlKTtcblxuXHRcdFx0cmV0dXJuIFtcblx0XHRcdFx0cHJvY2Vzc2VkVmFsdWUsXG5cdFx0XHRcdGtleSArICc+JyArIHZhbHVlLFxuXHRcdFx0XTtcblx0XHR9XG5cblx0XHRwcm9jZXNzZWRWYWx1ZSA9IHRoaXMucHJvY2Vzc1ZhbHVlKHZhbHVlKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHRwcm9jZXNzZWRWYWx1ZSxcblx0XHRcdCcnICsgcHJvY2Vzc2VkVmFsdWUsXG5cdFx0XTtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc1ZhbHVlPFQ+ICh2YWx1ZTogVFtdKTogVFtdO1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZSAodmFsdWU6IG1vbWVudC5Nb21lbnQpOiBtb21lbnQuTW9tZW50O1xuXHRwcml2YXRlIHByb2Nlc3NWYWx1ZSAodmFsdWU6IG1vbWVudC5EdXJhdGlvbik6IG1vbWVudC5EdXJhdGlvbjtcblx0cHJpdmF0ZSBwcm9jZXNzVmFsdWU8VD4gKHZhbHVlOiBUKTogVDtcblx0cHJpdmF0ZSBwcm9jZXNzVmFsdWU8VD4gKHZhbHVlOiBUIHwgVFtdIHwgbW9tZW50Lk1vbWVudCB8IG1vbWVudC5EdXJhdGlvbikge1xuXHRcdC8vIGFsZ29yaXRobSBpcyBub3QgaW1wb3J0YW50LCBhcyBsb25nIGFzIGFsbCBhcnJheXMgYXJlIHNvcnRlZCB0aGUgc2FtZSB3YXlcblx0XHRpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcblx0XHRcdHJldHVybiB2YWx1ZVxuXHRcdFx0XHQuc2xpY2UoKVxuXHRcdFx0XHQuc29ydCgpO1xuXHRcdH1cblxuXHRcdGlmIChtb21lbnQuaXNNb21lbnQodmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gbW9tZW50KHZhbHVlKTtcblx0XHR9XG5cblx0XHRpZiAobW9tZW50LmlzRHVyYXRpb24odmFsdWUpKSB7XG5cdFx0XHRyZXR1cm4gbW9tZW50LmR1cmF0aW9uKHZhbHVlKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdmFsdWU7XG5cdH1cblxuXHRwcml2YXRlIGNvbXBhcmVQYXJzZWRRdWVyaWVzIChcblx0XHRhOiBbb2JqZWN0LCBzdHJpbmddLFxuXHRcdGI6IFtvYmplY3QsIHN0cmluZ10sXG5cdCkge1xuXHRcdGlmIChhW0NPTlNUQU5UUy5TVFJdID09PSBiW0NPTlNUQU5UUy5TVFJdKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gYVtDT05TVEFOVFMuU1RSXSA+IGJbQ09OU1RBTlRTLlNUUl0gPyAxIDogLTE7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaVF1ZXJ5LCBFbnRyeVBhcmVudE51bGwsIEl0ZW1JZCB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENPTVBBUkFUT1JTLCBPUEVSQVRPUlMgfSBmcm9tICcuL1F1ZXJ5UGFyc2VyQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeVNlcnZpY2Uge1xuXHRjb25zdHJ1Y3RvciAoKSB7XG5cdH1cblxuXHRhZGRBbmRDb25kaXRpb24gKFxuXHRcdHF1ZXJ5OiBBcGlRdWVyeSxcblx0XHRjb25kaXRpb246IEFwaVF1ZXJ5LFxuXHQpOiBBcGlRdWVyeSB7XG5cdFx0aWYgKHF1ZXJ5LmNvbmRpdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBxdWVyeS5vcGVyYXRvciA9PT0gT1BFUkFUT1JTLk9SKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRjb25kaXRpb25zOiBbXG5cdFx0XHRcdFx0cXVlcnksXG5cdFx0XHRcdFx0Y29uZGl0aW9uLFxuXHRcdFx0XHRdLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIGFuICdhbmQnIGNvbmRpdGlvblxuXHRcdHJldHVybiB7Y29uZGl0aW9uczogcXVlcnkuY29uZGl0aW9ucy5jb25jYXQoY29uZGl0aW9uKX07XG5cdH1cblxuXHRhZGRPckNvbmRpdGlvbiAoXG5cdFx0cXVlcnk6IEFwaVF1ZXJ5LFxuXHRcdGNvbmRpdGlvbjogQXBpUXVlcnksXG5cdCk6IEFwaVF1ZXJ5IHtcblx0XHRpZiAocXVlcnkub3BlcmF0b3IgPT09IE9QRVJBVE9SUy5PUikge1xuXHRcdFx0cmV0dXJuIHtjb25kaXRpb25zOiBxdWVyeS5jb25kaXRpb25zLmNvbmNhdChjb25kaXRpb24pfTtcblx0XHR9XG5cblx0XHQvLyB3ZSBoYXZlIGFuICdhbmQnIGNvbmRpdGlvblxuXHRcdHJldHVybiB7XG5cdFx0XHRjb25kaXRpb25zOiBbXG5cdFx0XHRcdHF1ZXJ5LFxuXHRcdFx0XHRjb25kaXRpb24sXG5cdFx0XHRdLFxuXHRcdFx0b3BlcmF0b3I6IE9QRVJBVE9SUy5PUixcblx0XHR9O1xuXHR9XG5cblx0YWRkUGFyZW50Q29uZGl0aW9uIChcblx0XHRxdWVyeTogQXBpUXVlcnksXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwsXG5cdCk6IEFwaVF1ZXJ5IHtcblx0XHRsZXQgbGlua2VkVG9RdWVyeTtcblxuXHRcdGlmIChwYXJlbnQgPT09IG51bGwpIHtcblx0XHRcdHJldHVybiBxdWVyeTtcblx0XHR9XG5cblx0XHRsaW5rZWRUb1F1ZXJ5ID0ge1xuXHRcdFx0bGlua2VkVG86IHBhcmVudC5pdGVtVHlwZSxcblx0XHRcdHF1ZXJ5OiBwYXJlbnQuaXRlbUlkLFxuXHRcdH07XG5cblx0XHRyZXR1cm4gcXVlcnkgPT09IG51bGwgPyBsaW5rZWRUb1F1ZXJ5IDogdGhpcy5hZGRBbmRDb25kaXRpb24oXG5cdFx0XHRxdWVyeSxcblx0XHRcdGxpbmtlZFRvUXVlcnksXG5cdFx0KTtcblx0fVxuXG5cdGNyZWF0ZU5vdEluIChpZEFycmF5OiBJdGVtSWRbXSkge1xuXHRcdHJldHVybiB7XG5cdFx0XHRjb21wYXJhdG9yOiBDT01QQVJBVE9SUy5JTixcblx0XHRcdGtleTogJ2lkJyxcblx0XHRcdHZhbHVlOiBpZEFycmF5LFxuXHRcdFx0bm90OiB0cnVlXG5cdFx0fTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU2V0LCBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbnR5cGUgUmVxdWVzdENvbHVtbk1hcCA9IHtbaXRlbVR5cGU6IHN0cmluZ106IEFwaVJlcXVlc3RDb2x1bW5zfTtcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RDb2x1bW5FeHBhbnNpb24ge1xuXHRwcml2YXRlIGNvbHVtbnM6IFJlcXVlc3RDb2x1bW5NYXAgPSB7fTtcblx0cHJpdmF0ZSBjb2x1bW5TZXRJZE1hcDoge1tjb2x1bW5TZXRJZDogbnVtYmVyXTogYm9vbGVhbn0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBleHBhbmRXaXRoUmVxdWVzdENvbHVtbnMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG5cblx0XHRpZiAoY29sdW1uc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IHRoaXMuY29sdW1uVXRpbFxuXHRcdFx0Lm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdClcblx0XHRcdC5tZXJnZWQ7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kPFQgZXh0ZW5kcyBDb2x1bW5TZXQ8SXRlbVR5cGU+PiAoY29sdW1uU2V0OiBUKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuY29sdW1uU2V0SWRNYXBbY29sdW1uU2V0LmlkXSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IGNvbHVtbnMgPSB0aGlzLmNvbHVtbnM7XG5cdFx0Y29uc3QgaXRlbVR5cGUgPSBjb2x1bW5TZXQuaXRlbVR5cGU7XG5cblx0XHRpZiAoY29sdW1uc1tpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0Y29sdW1uc1tpdGVtVHlwZV0gPSBbXTtcblx0XHR9XG5cblx0XHRjb2x1bW5zW2l0ZW1UeXBlXSA9IHRoaXMuY29sdW1uVXRpbFxuXHRcdFx0Lm1lcmdlUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0XHRjb2x1bW5TZXQucmVxdWVzdCxcblx0XHRcdClcblx0XHRcdC5tZXJnZWQ7XG5cblx0XHR0aGlzLmNvbHVtblNldElkTWFwW2NvbHVtblNldC5pZF0gPSB0cnVlO1xuXHR9XG5cblx0cHVibGljIGdldCAoKTogUmVxdWVzdENvbHVtbk1hcCB7XG5cdFx0cmV0dXJuIHRoaXMuY29sdW1ucztcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSwgVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uTWF0Y2hSZXN1bHQsXG5cdEZpZWxkTWFwLFxuXHRGdW5jdGlvbkNoYW5nZXNSZXNvbHZlU29ja2V0TWVzc2FnZSxcblx0SXRlbUlkLFxuXHRJdGVtVHlwZSxcblx0UHJvbWlzZUludGVyZmFjZSxcblx0UmVzcG9uc2VDb2x1bW4sXG5cdFNvY2tldE1lc3NhZ2UsXG5cdFNvY2tldE1lc3NhZ2VDcmVhdGUsXG5cdFNvY2tldE1lc3NhZ2VEZWxldGUsXG5cdFNvY2tldE1lc3NhZ2VMaW5rVG8sXG5cdFNvY2tldE1lc3NhZ2VVcGRhdGUsXG59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YVJlc3VsdCB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB9IGZyb20gJy4vUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuXG5leHBvcnQgdHlwZSBTb2NrZXRDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiA9IHtbaXRlbUlkOiBudW1iZXJdOiBDb2xsZWN0aW9uTWF0Y2hSZXN1bHQ8SXRlbVR5cGVUeXBlPn07XG5cbmV4cG9ydCBjbGFzcyBTb2NrZXRNZXNzYWdlSGFuZGxlciB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcmVxdWVzdEJ1ZmZlck1hbmFnZXI6IFJlcXVlc3RCdWZmZXJNYW5hZ2VyLFxuXHRcdHByaXZhdGUgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHRwcml2YXRlIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSB0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeTogVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIG9uTWVzc2FnZVJlY2VpdmVkIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlKTogYW55IHtcblx0XHRzd2l0Y2ggKG1lc3NhZ2UuYm9keS5ldmVudFR5cGUpIHtcblx0XHRcdGNhc2UgJ3VwZGF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZVVwZGF0ZShtZXNzYWdlKTtcblx0XHRcdGNhc2UgJ2NyZWF0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZUNyZWF0ZShtZXNzYWdlKTtcblx0XHRcdGNhc2UgJ2RlbGV0ZSc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZURlbGV0ZShtZXNzYWdlKTtcblx0XHRcdGNhc2UgJ2xpbmtUbyc6XG5cdFx0XHRcdHJldHVybiB0aGlzLmhhbmRsZUxpbmtNb3ZlKG1lc3NhZ2UpO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZm9ybWF0TWVzc2FnZVZhbHVlcyAoXG5cdFx0dmFsdWVzOiBhbnksXG5cdFx0Y29sdW1uczogUmVzcG9uc2VDb2x1bW5bXSxcblx0KTogRmllbGRNYXAge1xuXHRcdGNvbnN0IHJlc3VsdDogRmllbGRNYXAgPSB7fTtcblxuXHRcdGZvciAoY29uc3QgY29sdW1uSWQgaW4gY29sdW1ucykge1xuXHRcdFx0cmVzdWx0W2NvbHVtbklkXSA9IHRoaXMuYXBpRm9ybWF0dGVyLmZvcm1hdFJlc3BvbnNlVmFsdWUoXG5cdFx0XHRcdGNvbHVtbnNbY29sdW1uSWRdLnR5cGUsXG5cdFx0XHRcdHZhbHVlc1tjb2x1bW5JZF0sXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGNyZWF0ZUNvbGxlY3Rpb25NYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGl0ZW1zOiB7W2l0ZW1JZDogbnVtYmVyXTogYW55fSxcblx0XHRjb2x1bW5zOiBSZXNwb25zZUNvbHVtbltdLFxuXHQpOiBTb2NrZXRDb2xsZWN0aW9uTWFwPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IHNlcnZlckNhY2hlID0gdGhpcy50cmFuc2FjdGlvbkNhY2hlRmFjdG9yeS5nZXRTZXJ2ZXJDYWNoZSgpO1xuXHRcdGNvbnN0IHJlc3VsdDogU29ja2V0Q29sbGVjdGlvbk1hcDxJdGVtVHlwZVR5cGU+ID0ge307XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBpbiBpdGVtcykge1xuXHRcdFx0Y29uc3QgaXRlbSA9IGl0ZW1zW2l0ZW1JZF07XG5cdFx0XHRjb25zdCBwYXJlbnQgPSBpdGVtLnBhcmVudCAhPT0gbnVsbCA/IGl0ZW0ucGFyZW50IDoge307XG5cdFx0XHRjb25zdCB2YWx1ZXMgPSB0aGlzLmZvcm1hdE1lc3NhZ2VWYWx1ZXMoXG5cdFx0XHRcdGl0ZW0udmFsdWVzLFxuXHRcdFx0XHRjb2x1bW5zLFxuXHRcdFx0KTtcblxuXHRcdFx0cmVzdWx0W2l0ZW1JZF0gPSBzZXJ2ZXJDYWNoZS5jb2xsZWN0aW9uSGFuZGxlci5lbnRyaWVzLmdldEJ5Rml0dGluZ0l0ZW0oXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR2YWx1ZXMsXG5cdFx0XHRcdHBhcmVudCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fVxuXG5cdHByaXZhdGUgZ2V0UmVxdWVzdENvbHVtbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbGxlY3Rpb25NYXA6IFNvY2tldENvbGxlY3Rpb25NYXA8SXRlbVR5cGVUeXBlPixcblx0KSB7XG5cdFx0Y29uc3Qgc2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCk7XG5cdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uID0gdGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGNvbGxlY3Rpb25NYXApIHtcblx0XHRcdGNvbnN0IGNvbGxlY3Rpb25zID0gY29sbGVjdGlvbk1hcFtpdGVtSWRdO1xuXHRcdFx0Y29uc3QgZml0dGluZ0NvbGxlY3Rpb25zID0gY29sbGVjdGlvbnMuZml0dGluZztcblx0XHRcdGNvbnN0IGl0ZW1FbnRyeSA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0KTtcblxuXHRcdFx0Zm9yIChjb25zdCBmaXR0aW5nQ29sbGVjdGlvbiBvZiBmaXR0aW5nQ29sbGVjdGlvbnMpIHtcblx0XHRcdFx0Y29sdW1uRXhwYW5zaW9uLmV4cGFuZChmaXR0aW5nQ29sbGVjdGlvbi5jb2x1bW5zKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGl0ZW1FbnRyeSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbHVtbkV4cGFuc2lvbi5leHBhbmQoaXRlbUVudHJ5LmNvbHVtbnMpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjb2x1bW5FeHBhbnNpb24uZ2V0KCk7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NNZXNzYWdlPFQgZXh0ZW5kcyBTb2NrZXRNZXNzYWdlWydib2R5J10+IChcblx0XHRib2R5OiBULFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPHZvaWQ+IHtcblx0XHRjb25zdCBzZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKTtcblx0XHRjb25zdCBpdGVtVHlwZSA9IGJvZHkuaXRlbVR5cGU7XG5cdFx0Y29uc3QgcmVxdWVzdElkczogSXRlbUlkW10gPSBbXTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25NYXAgPSB0aGlzLmNyZWF0ZUNvbGxlY3Rpb25NYXAoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGJvZHkuaXRlbXNbaXRlbVR5cGVdLFxuXHRcdFx0Ym9keS5jb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbnMgPSB0aGlzLmdldFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRjb2xsZWN0aW9uTWFwLFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGl0ZW1JZFN0cmluZyBpbiBjb2xsZWN0aW9uTWFwKSB7XG5cdFx0XHRjb25zdCBpdGVtRW50cnkgPSBzZXJ2ZXJDYWNoZS5pdGVtSGFuZGxlci5lbnRyaWVzLmdldChcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZFN0cmluZyxcblx0XHRcdCk7XG5cblx0XHRcdGNvbnN0IGl0ZW1JZCA9ICtpdGVtSWRTdHJpbmc7XG5cblx0XHRcdGlmIChpdGVtRW50cnkgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXF1ZXN0SWRzLnB1c2goaXRlbUlkKTtcblxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25NYXBbaXRlbUlkXS5maXR0aW5nLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cmVxdWVzdElkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlcXVlc3RJZHMubGVuZ3RoID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXJcblx0XHRcdC5mZXRjaEJ5SWRzKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0cmVxdWVzdElkcyxcblx0XHRcdFx0cmVxdWVzdENvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IHtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgcHJvY2Vzc0Z1bmN0aW9uQ2hhbmdlc1Jlc29sdmU8VCBleHRlbmRzIFNvY2tldE1lc3NhZ2VbJ2JvZHknXT4gKFxuXHRcdGJvZHk6IFQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q2hhbmdlc0RlbHRhUmVzdWx0PiB7XG5cdFx0Y29uc3Qgc2VydmVyQ2FjaGUgPSB0aGlzLnRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCk7XG5cdFx0Y29uc3QgaXRlbXMgPSBib2R5Lml0ZW1zLkZ1bmN0aW9uQ2hhbmdlc1Jlc29sdmU7XG5cdFx0Y29uc3QgcmVxdWVzdElkczogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIGluIGl0ZW1zKSB7XG5cdFx0XHRjb25zdCBmdW5jdGlvbklkID0gaXRlbXNbaXRlbUlkXS5wYXJlbnQuaXRlbUlkO1xuXHRcdFx0Y29uc3QgZnVuY3Rpb25FbnRyeSA9IHNlcnZlckNhY2hlLml0ZW1IYW5kbGVyLmVudHJpZXMuZ2V0KFxuXHRcdFx0XHQnRnVuY3RpZScsXG5cdFx0XHRcdGZ1bmN0aW9uSWQsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGZ1bmN0aW9uRW50cnkgPT09IHVuZGVmaW5lZFxuXHRcdFx0XHR8fCBmdW5jdGlvbkVudHJ5LmNvbHVtbnMucmVzcG9uc2UuRnVuY3RpZS5uZXdjaGFuZ2VzID09PSB1bmRlZmluZWRcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0cmVxdWVzdElkcy5wdXNoKGZ1bmN0aW9uSWQpO1xuXHRcdH1cblxuXHRcdGlmIChyZXF1ZXN0SWRzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnJlcXVlc3RCdWZmZXJNYW5hZ2VyXG5cdFx0XHQuZmV0Y2hCeUlkcyhcblx0XHRcdFx0J0Z1bmN0aWUnLFxuXHRcdFx0XHRyZXF1ZXN0SWRzLFxuXHRcdFx0XHRbJ25ld2NoYW5nZXMnXSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRidWZmZXJSZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0Ly8gdG9kb1tjYWNoZV0gaXNuJ3QgdGhpcyBhbHJlYWR5IGhhbmRsZWQgaW4gdGhlIFJlcXVlc3RCdWZmZXIgP1xuXHRcdFx0XHRcdGNvbnN0IGNoYW5nZXNEZWx0YSA9IHRoaXMuY2hhbmdlc0RlbHRhRmFjdG9yeS5jb25zdHJ1Y3QoKTtcblx0XHRcdFx0XHRjb25zdCByZXNwb25zZUlkcyA9IGJ1ZmZlclJlc3BvbnNlLnJlc3BvbnNlLmxpbmtzLkZ1bmN0aWU7XG5cblx0XHRcdFx0XHRmb3IgKGNvbnN0IGl0ZW1JZCBvZiByZXNwb25zZUlkcykge1xuXHRcdFx0XHRcdFx0Y29uc3QgaXRlbUVudHJ5ID0gc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdFx0XHRcdCdGdW5jdGllJyxcblx0XHRcdFx0XHRcdFx0aXRlbUlkLFxuXHRcdFx0XHRcdFx0KSE7XG5cblx0XHRcdFx0XHRcdGNvbnN0IHByZXZpb3VzID0gc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuaXRlbUNoYW5nZXNbaXRlbUVudHJ5LmlkXTtcblxuXHRcdFx0XHRcdFx0Y29uc3QgcmVzcG9uc2VWYWx1ZXMgPSBidWZmZXJSZXNwb25zZS5yZXNwb25zZS5mZXRjaE9iamVjdChcblx0XHRcdFx0XHRcdFx0J0Z1bmN0aWUnLFxuXHRcdFx0XHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdFx0XHRcdGZhbHNlLFxuXHRcdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdFx0aWYgKFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZVZhbHVlcyA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdFx0XHRcdHJlc3BvbnNlVmFsdWVzLm5ld2NoYW5nZXMgPT09IHByZXZpb3VzLm5ld2NoYW5nZXNcblx0XHRcdFx0XHRcdCkge1xuXHRcdFx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1VcGRhdGVkKFxuXHRcdFx0XHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdFx0XHRcdHtuZXdjaGFuZ2VzOiByZXNwb25zZVZhbHVlcy5uZXdjaGFuZ2VzfSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIHNlcnZlckNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhKGNoYW5nZXNEZWx0YSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdClcblx0XHRcdC5jYXRjaChcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIubm90aWZ5RXJyb3IsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBpc0Z1bmN0aW9uQ2hhbmdlc1Jlc29sdmVNZXNzYWdlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlKTogbWVzc2FnZSBpcyBGdW5jdGlvbkNoYW5nZXNSZXNvbHZlU29ja2V0TWVzc2FnZSB7XG5cdFx0cmV0dXJuIG1lc3NhZ2UuYm9keS5pdGVtVHlwZSA9PT0gJ0Z1bmN0aW9uQ2hhbmdlc1Jlc29sdmUnO1xuXHR9XG5cblx0cHJpdmF0ZSBoYW5kbGVDcmVhdGUgKG1lc3NhZ2U6IEZ1bmN0aW9uQ2hhbmdlc1Jlc29sdmVTb2NrZXRNZXNzYWdlKTogUHJvbWlzZUludGVyZmFjZTx2b2lkPjtcblx0cHJpdmF0ZSBoYW5kbGVDcmVhdGUgKG1lc3NhZ2U6IFNvY2tldE1lc3NhZ2VDcmVhdGUpOiBQcm9taXNlSW50ZXJmYWNlPG51bGw+O1xuXHRwcml2YXRlIGhhbmRsZUNyZWF0ZSAobWVzc2FnZTogU29ja2V0TWVzc2FnZSk6IGFueSB7XG5cdFx0Y29uc3QgYm9keSA9IG1lc3NhZ2UuYm9keTtcblxuXHRcdGlmICh0aGlzLmlzRnVuY3Rpb25DaGFuZ2VzUmVzb2x2ZU1lc3NhZ2UobWVzc2FnZSkpIHtcblx0XHRcdHJldHVybiB0aGlzLnByb2Nlc3NGdW5jdGlvbkNoYW5nZXNSZXNvbHZlKGJvZHkpO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQucHJvY2Vzc01lc3NhZ2UoYm9keSlcblx0XHRcdC5jYXRjaCh0aGlzLmVycm9ySGFuZGxlci5ub3RpZnlFcnJvcik7XG5cdH1cblxuXHRwcml2YXRlIGhhbmRsZVVwZGF0ZSAobWVzc2FnZTogU29ja2V0TWVzc2FnZVVwZGF0ZSk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzXG5cdFx0XHQucHJvY2Vzc01lc3NhZ2UobWVzc2FnZS5ib2R5KVxuXHRcdFx0LmNhdGNoKHRoaXMuZXJyb3JIYW5kbGVyLm5vdGlmeUVycm9yKTtcblx0fVxuXG5cdHByaXZhdGUgaGFuZGxlRGVsZXRlIChtZXNzYWdlOiBTb2NrZXRNZXNzYWdlRGVsZXRlKTogUHJvbWlzZUludGVyZmFjZTx2b2lkPiB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdEludGVybmFsRGVsdGEoKTtcblx0XHRjb25zdCBzZXJ2ZXJDYWNoZSA9IHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkuZ2V0U2VydmVyQ2FjaGUoKTtcblx0XHRjb25zdCBib2R5ID0gbWVzc2FnZS5ib2R5O1xuXHRcdGNvbnN0IGVudHJpZXNUb0JlRGVsZXRlZDogSXRlbUVudHJ5W10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIGJvZHkuaXRlbXMpIHtcblx0XHRcdGNvbnN0IGNhY2hlZEVudHJ5ID0gc2VydmVyQ2FjaGUuaXRlbUhhbmRsZXIuZW50cmllcy5nZXQoXG5cdFx0XHRcdGJvZHkuaXRlbVR5cGUsXG5cdFx0XHRcdGl0ZW1JZCxcblx0XHRcdCk7XG5cblx0XHRcdGlmIChjYWNoZWRFbnRyeSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHRlbnRyaWVzVG9CZURlbGV0ZWQucHVzaChjYWNoZWRFbnRyeSk7XG5cdFx0fVxuXG5cdFx0Y2hhbmdlc0RlbHRhLnNldEl0ZW1zRGVsZXRlZChlbnRyaWVzVG9CZURlbGV0ZWQpO1xuXG5cdFx0c2VydmVyQ2FjaGUuYXBwbHlDaGFuZ2VzRnJvbVBhcmVudChjaGFuZ2VzRGVsdGEpO1xuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbigpO1xuXHR9XG5cblx0cHJpdmF0ZSBoYW5kbGVMaW5rTW92ZSAobWVzc2FnZTogU29ja2V0TWVzc2FnZUxpbmtUbyk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NNZXNzYWdlKG1lc3NhZ2UuYm9keSlcblx0XHRcdC5jYXRjaCh0aGlzLmVycm9ySGFuZGxlci5ub3RpZnlFcnJvcik7XG5cdH1cblxuXHQvKlx0aGFuZGxlTGlua01vdmUgKG1lc3NhZ2UpIHtcblx0IHByb2Nlc3NNZXNzYWdlKFxuXHQgbWVzc2FnZSxcblx0IGZ1bmN0aW9uIChjb2xsZWN0aW9uLCBpdGVtRW50cmllcykge1xuXHQgLy8gZml0cyBpbiB0aGlzIGNvbGxlY3Rpb24sIHRvZG86IGdldCB0aGUgb2xkIGNvbGxlY3Rpb24gaXQgYmVsb25nZWQgdG9cblx0IGNvbGxlY3Rpb24ubW92ZUl0ZW1zKGl0ZW1FbnRyaWVzLCBudWxsLCB0cnVlKTtcblx0IH0sXG5cdCBmdW5jdGlvbiAoY29sbGVjdGlvbiwgaXRlbUVudHJpZXMpIHtcblx0IC8vIG1heWJlIGZpdHNcblx0IC8vIHRvZG86IGFsc28gcmVtb3ZlIHRoZW0gZnJvbSB0aGUgb2xkIGNvbGxlY3Rpb25cblx0IGNvbGxlY3Rpb24uZXh0ZW5kKGFuZ3VsYXIuaWRlbnRpdHksIGZhbHNlLCBmYWxzZSk7XG5cdCB9LFxuXHQgZnVuY3Rpb24gKGNvbGxlY3Rpb24sIGlkcykge1xuXHQgLy8gbm90IGZpdHRpbmcgaW4gdGhpcyBjb2xsZWN0aW9uLCByZW1vdmUgaXQgP1xuXHQgY29sbGVjdGlvbi5yZW1vdmVJdGVtcyhpZHMsIG51bGwsIG1lc3NhZ2UpO1xuXHQgfVxuXHQgKTtcblx0IH1cblx0ICovXG59XG4iLCJpbXBvcnQge1xuXHRDb2xsZWN0aW9uQ2FjaGVGYWN0b3J5LFxuXHRDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uLy4uLy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi4vLi4vLi4vZmFjdG9yaWVzL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdENoYW5nZXNEZWx0YSxcblx0Q29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0Q29sbGVjdGlvblF1ZXJ5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbHVtblN1YnNldENhY2hlLFxuXHRDb2x1bW5VdGlsLFxuXHRDb252ZXJzaW9uTWFwLFxuXHRFbnRyeVBhcmVudCxcblx0RXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0aXNGdW5jdGlvbixcblx0SXRlbUlkQ29udmVyc2lvbk1hcCxcblx0UHJvbWlzZUludGVyZmFjZSxcbn0gZnJvbSAnLi4vLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uLy4uLy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkVudHJ5LCBJdGVtRW50cnkgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbixcblx0Q29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXAsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVBhcmVudElkTWFwLFxuXHRJdGVtSWQsXG5cdEl0ZW1UeXBlLFxuXHRRdWVyeUNhbGxiYWNrLFxufSBmcm9tICcuLi8uLi8uLi90eXBlcyc7XG5pbXBvcnQge1xuXHRDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRDb2xsZWN0aW9uTWF0Y2hlcixcblx0Q29sdW1uSGFuZGxlcixcblx0S2V5U2VydmljZSxcblx0VHJhbnNhY3Rpb25JdGVtSGFuZGxlcixcbn0gZnJvbSAnLi4vLi4vaW5kZXgnO1xuaW1wb3J0IHsgQ29sbGVjdGlvbkhhbmRsZXJCYXNlIH0gZnJvbSAnLi4vQ29sbGVjdGlvbkhhbmRsZXJCYXNlJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25Db2xsZWN0aW9uSGFuZGxlclxuXHRleHRlbmRzIENvbGxlY3Rpb25IYW5kbGVyQmFzZSB7XG5cblx0cHVibGljIGNvbGxlY3Rpb25SZXNvdXJjZXM6IHtcblx0XHRbY29sbGVjdGlvbkVudHJ5SWQ6IG51bWJlcl06IENvbGxlY3Rpb25SZXNvdXJjZVtdXG5cdH0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk6IENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk6IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uSGFuZGxlcjogQ29sdW1uSGFuZGxlcixcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgaXRlbUhhbmRsZXI6IFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIsXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwcm90ZWN0ZWQgdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbHVtblV0aWwsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXG5cdH1cblxuXHRwdWJsaWMgZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0KTogQXJyYXk8Q29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4+IHtcblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cmllczogQ29sbGVjdGlvbkVudHJ5W10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgY29sbGVjdGlvbkVudHJ5SWQgaW4gdGhpcy5jb2xsZWN0aW9uQ2hhbmdlcykge1xuXHRcdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy50cmFuc2FjdGlvbi5nZXRMb2NhbENvbGxlY3Rpb25FbnRyeShOdW1iZXIoY29sbGVjdGlvbkVudHJ5SWQpKTtcblxuXHRcdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gdW5kZWZpbmVkICYmIGNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSA9PT0gaXRlbVR5cGUpIHtcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJpZXMucHVzaChjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBjb2xsZWN0aW9uRW50cmllcztcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+IHtcblx0XHRpZiAoIXRoaXMuaXNMb2NhbChvcHRpb25zKSkge1xuXHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHRcdC5jcmVhdGVDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gc3VwZXIuY3JlYXRlQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRvcHRpb25zLFxuXHRcdCk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENhbGxzIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucy5vbkl0ZW1zQ3JlYXRlZCBvbkl0ZW1zQ3JlYXRlZH0gY2FsbGJhY2sgd2hlbmV2ZXIgYSBjcmVhdGUgcmVxdWVzdCBpcyBkb25lIG9uIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9IHRoYXQgZml0IGluIHRoZSBjb2xsZWN0aW9uXG5cdCAqIENhbiBiZSB1c2VkIHRvIHVwZGF0ZSBtYXBzIHRoYXQgdXNlIHtAbGluayBJdGVtRW50cnkuaXRlbUlkIEl0ZW1FbnRyeS5pdGVtSWR9XG5cdCAqXG5cdCAqIEBkZXByZWNhdGVkXG5cdCAqIFlvdSBzaG91bGQgdXNlIGl0ZW1SZXNvdXJjZS5vbkNoYW5nZSBhbmQgY29tcGFyZSBwcmV2aW91cy5pZCB3aXRoIGZpZWxkcy5pZFxuXHQgKi9cblx0cHVibGljIG9uSXRlbUVudHJpZXNDcmVhdGVkIChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeSxcblx0XHRjb252ZXJzaW9uTWFwOiBDb252ZXJzaW9uTWFwLFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCByZXNvdXJjZXMgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbY29sbGVjdGlvbkVudHJ5LmlkXTtcblxuXHRcdGlmIChyZXNvdXJjZXMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgcmVzb3VyY2VzKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRyZXNvdXJjZS5vcHRpb25zLm9uSXRlbXNDcmVhdGVkKGNvbnZlcnNpb25NYXApO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0dGhpcy5leGNlcHRpb25IYW5kbGVyKGVycm9yKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgY2xlYXJFbnRyeSAoZW50cnk6IENvbGxlY3Rpb25FbnRyeSk6IHZvaWQge1xuXHRcdHRoaXMuZW50cmllcy5jbGVhcihlbnRyeSk7XG5cblx0XHRkZWxldGUgdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW2VudHJ5LmlkXTtcblx0XHRkZWxldGUgdGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tlbnRyeS5pZF07XG5cdH1cblxuXHRwdWJsaWMgYWRkUmVzb3VyY2UgKHJlc291cmNlOiBDb2xsZWN0aW9uUmVzb3VyY2UpOiB2b2lkIHtcblx0XHRsZXQgcmVzb3VyY2VBcnJheSA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF07XG5cblx0XHRpZiAocmVzb3VyY2VBcnJheSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXNvdXJjZUFycmF5ID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW3Jlc291cmNlLmVudHJ5LmlkXSA9IFtdO1xuXHRcdH1cblxuXHRcdHJlc291cmNlQXJyYXkucHVzaChyZXNvdXJjZSk7XG5cdH1cblxuXHRwdWJsaWMgY2xlYXJSZXNvdXJjZSAocmVzb3VyY2U6IENvbGxlY3Rpb25SZXNvdXJjZSk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc291cmNlcyA9IHRoaXMuY29sbGVjdGlvblJlc291cmNlc1tyZXNvdXJjZS5lbnRyeS5pZF07XG5cdFx0Y29uc3QgaW5kZXggPSByZXNvdXJjZXMuaW5kZXhPZihyZXNvdXJjZSk7XG5cblx0XHRpZiAoaW5kZXggIT09IC0xKSB7XG5cdFx0XHRyZXNvdXJjZXMuc3BsaWNlKFxuXHRcdFx0XHRpbmRleCxcblx0XHRcdFx0MSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0aWYgKHJlc291cmNlcy5sZW5ndGggPT09IDApIHtcblx0XHRcdGRlbGV0ZSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbcmVzb3VyY2UuZW50cnkuaWRdO1xuXHRcdH1cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogVXBkYXRlcyB0aGUgcGFyZW50cyBvZiB0aGUgcGFzc2VkIHtAbGluayBJdGVtRW50cnkgSXRlbUVudHJpZXN9LCByZXR1cm5zIGB2b2lkYCBiZWNhdXNlIHlvdSBzaG91bGQgdXNlIHRoZSB7QGxpbmsgQ29sbGVjdGlvblJlc291cmNlT3B0aW9ucy5vbkFkZCBvbkFkZH0gYW5kIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zLm9uUmVtb3ZlIG9uUmVtb3ZlfSBjYWxsYmFja3Ncblx0ICovXG5cdHB1YmxpYyBtb3ZlSXRlbXM8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdHNvdXJjZUNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRkZXN0aW5hdGlvbkNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRpdGVtRW50cmllczogQXJyYXk8SXRlbUVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+Pixcblx0KTogdm9pZCB7XG5cdFx0aWYgKHNvdXJjZUNvbGxlY3Rpb25FbnRyeS5pdGVtVHlwZSAhPT0gZGVzdGluYXRpb25Db2xsZWN0aW9uRW50cnkuaXRlbVR5cGUpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignY29sbGVjdGlvblJlc291cmNlU2VydmljZTogQ2Fubm90IG1vdmUgaXRlbXM6IGl0ZW1UeXBlIG1pc21hdGNoJyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0Ly8gdG9kb1tjYWNoZV0gcGFyZW50IG51bGwgP1xuXHRcdGZvciAoY29uc3QgaXRlbUVudHJ5IG9mIGl0ZW1FbnRyaWVzKSB7XG5cdFx0XHRjaGFuZ2VzRGVsdGEuc2V0SXRlbU1vdmVkKFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdGRlc3RpbmF0aW9uQ29sbGVjdGlvbkVudHJ5LnBhcmVudCEsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdHRoaXMudHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0fVxuXG5cdHB1YmxpYyBleHRlbmRDb2xsZWN0aW9uRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRxdWVyeUNhbGxiYWNrOiBRdWVyeUNhbGxiYWNrLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeVR5cGU+IHtcblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LnRyYW5zYWN0aW9uXG5cdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZXh0ZW5kQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRjb2xsZWN0aW9uRW50cnksXG5cdFx0XHRcdHF1ZXJ5Q2FsbGJhY2ssXG5cdFx0XHQpO1xuXHR9XG5cblx0Ly8gdG9kb1tjYWNoZV0gV2hhdCBpcyBjbG9uaW5nIGEgY29sbGVjdGlvbiBzdXBwb3NlZCB0byBkbyA/XG5cdHB1YmxpYyBjbG9uZUNvbGxlY3Rpb25FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlIGV4dGVuZHMgQ29sbGVjdGlvbkVudHJ5PiAoXG5cdFx0c291cmNlRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudCxcblx0XHRjb252ZXJzaW9uTWFwOiBJdGVtSWRDb252ZXJzaW9uTWFwID0ge30sXG5cdCk6IENvbGxlY3Rpb25FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPiB7XG5cdFx0Y29uc3Qgc291cmNlSXRlbUVudHJpZXMgPSB0aGlzLmNvbGxlY3Rpb25DaGFuZ2VzW3NvdXJjZUVudHJ5LmlkXTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25FbnRyeSA9IHRoaXMuY3JlYXRlQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0c291cmNlRW50cnkuaXRlbVR5cGUsXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY2xvbmVPcHRpb25zKFxuXHRcdFx0XHRzb3VyY2VFbnRyeS5vcHRpb25zLFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHRpZiAoc291cmNlRW50cnkucGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRjb25zdCBzb3VyY2VQYXJlbnQgPSBzb3VyY2VFbnRyeS5wYXJlbnQ7XG5cblx0XHRcdGlmIChjb252ZXJzaW9uTWFwW3NvdXJjZVBhcmVudC5pdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb252ZXJzaW9uTWFwW3NvdXJjZVBhcmVudC5pdGVtVHlwZV0gPSB7fTtcblx0XHRcdH1cblxuXHRcdFx0Y29udmVyc2lvbk1hcFtzb3VyY2VQYXJlbnQuaXRlbVR5cGVdW3NvdXJjZVBhcmVudC5pdGVtSWRdID0gcGFyZW50Lml0ZW1JZDtcblx0XHR9XG5cblx0XHR0aGlzLml0ZW1IYW5kbGVyLmNsb25lSXRlbUVudHJpZXMoXG5cdFx0XHRzb3VyY2VJdGVtRW50cmllcyxcblx0XHRcdGNvbnZlcnNpb25NYXAsXG5cdFx0KTtcblxuXHRcdHJldHVybiBjb2xsZWN0aW9uRW50cnk7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29sbGVjdGlvbk1hdGNoZXIgKCk6IENvbGxlY3Rpb25NYXRjaGVyIHtcblx0XHRyZXR1cm4gdGhpcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0dGhpcy50cmFuc2FjdGlvbixcblx0XHRcdGl0ZW1UeXBlID0+IHRoaXMuZ2V0QWxsQ29sbGVjdGlvbnNCeUl0ZW1UeXBlKGl0ZW1UeXBlKSxcblx0XHQpO1xuXHR9XG5cblx0cHVibGljIGZldGNoQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKCF0aGlzLmlzTG9jYWwob3B0aW9ucykpIHtcblx0XHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0XHQuZmV0Y2hDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0KTtcblx0XHR9XG5cblx0XHRjb25zdCBjaGFuZ2VzRGVsdGEgPSB0aGlzLmNoYW5nZXNEZWx0YUZhY3RvcnkuY29uc3RydWN0KCk7XG5cdFx0Y29uc3QgY29sdW1uU3Vic2V0Q2FjaGUgPSB0aGlzLmNvbHVtblN1YnNldENhY2hlRmFjdG9yeS5jb25zdHJ1Y3Qob3B0aW9ucy5jb2x1bW5zKTtcblx0XHRjb25zdCBwYXJzZWRRdWVyeSA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jcmVhdGVRdWVyeShvcHRpb25zKTtcblxuXHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0KTtcblxuXHRcdGxldCBjb2xsZWN0aW9uRW50cnk7XG5cblx0XHRyZXR1cm4gdGhpc1xuXHRcdFx0LmZldGNoQ29sbGVjdGlvbkRhdGEoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRfY29sbGVjdGlvbkVudHJ5ID0+IHtcblx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkgPSBfY29sbGVjdGlvbkVudHJ5O1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb24uYXBwbHlDaGFuZ2VzRGVsdGEoY2hhbmdlc0RlbHRhKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdCgpID0+IGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaExpbmtlZENvbGxlY3Rpb25FbnRyaWVzPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0cGFyZW50VHlwZTogSXRlbVR5cGUsXG5cdFx0cGFyZW50SWRBcnJheTogSXRlbUlkW10gfCAoKCkgPT4gSXRlbUlkW10pLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxDb2xsZWN0aW9uRW50cnlQYXJlbnRJZE1hcDxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0aWYgKGlzRnVuY3Rpb248KCkgPT4gSXRlbUlkW10+KHBhcmVudElkQXJyYXkpKSB7XG5cdFx0XHRwYXJlbnRJZEFycmF5ID0gcGFyZW50SWRBcnJheSgpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlbW90ZVBhcmVudElkczogSXRlbUlkW10gPSBbXTtcblx0XHRjb25zdCBsb2NhbFBhcmVudElkczogSXRlbUlkW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3QgaXRlbUlkIG9mIHBhcmVudElkQXJyYXkpIHtcblx0XHRcdGlmICh0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKGl0ZW1JZCkpIHtcblx0XHRcdFx0bG9jYWxQYXJlbnRJZHMucHVzaChpdGVtSWQpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVtb3RlUGFyZW50SWRzLnB1c2goaXRlbUlkKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZVxuXHRcdFx0LmFsbCh7XG5cdFx0XHRcdHJlbW90ZTogdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0XHRcdC5nZXRTZXJ2ZXJDYWNoZSgpXG5cdFx0XHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHRcdFx0LmZldGNoTGlua2VkQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdFx0cmVtb3RlUGFyZW50SWRzLFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRcdCksXG5cdFx0XHRcdGxvY2FsOiB0aGlzLmZldGNoTGlua2VkTG9jYWxDb2xsZWN0aW9uRW50cmllcyhcblx0XHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRcdGxvY2FsUGFyZW50SWRzLFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdCksXG5cdFx0XHR9KVxuXHRcdFx0LnRoZW4oXG5cdFx0XHRcdHJlc3VsdCA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0XHRcdC4uLnJlc3VsdC5yZW1vdGUsXG5cdFx0XHRcdFx0XHQuLi5yZXN1bHQubG9jYWwsXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kQ29sbGVjdGlvbkVudHJpZXM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdGNvbGxlY3Rpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcCxcblx0XHRuZXdDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1uW10sXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvblJlc291cmNlUGFyZW50SWRNYXA+IHtcblx0XHRyZXR1cm4gdGhpcy50cmFuc2FjdGlvblxuXHRcdFx0LmdldFNlcnZlckNhY2hlKClcblx0XHRcdC5jb2xsZWN0aW9uSGFuZGxlclxuXHRcdFx0LmV4cGFuZENvbGxlY3Rpb25FbnRyaWVzKFxuXHRcdFx0XHRwYXJlbnRUeXBlLFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0Y29sbGVjdGlvbnMsXG5cdFx0XHRcdG5ld0NvbHVtbnMsXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGV4dGVuZENvbGxlY3Rpb25FbnRyaWVzPFQgZXh0ZW5kcyBDb2xsZWN0aW9uUmVzb3VyY2VQYXJlbnRJZE1hcD4gKFxuXHRcdHBhcmVudFR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdHF1ZXJ5Q2FsbGJhY2s6IFF1ZXJ5Q2FsbGJhY2ssXG5cdFx0Y29sbGVjdGlvbnM6IFQsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8dm9pZD4ge1xuXHRcdHJldHVybiB0aGlzLnRyYW5zYWN0aW9uXG5cdFx0XHQuZ2V0U2VydmVyQ2FjaGUoKVxuXHRcdFx0LmNvbGxlY3Rpb25IYW5kbGVyXG5cdFx0XHQuZXh0ZW5kQ29sbGVjdGlvbkVudHJpZXMoXG5cdFx0XHRcdHBhcmVudFR5cGUsXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRvcHRpb25zLFxuXHRcdFx0XHRxdWVyeUNhbGxiYWNrLFxuXHRcdFx0XHRjb2xsZWN0aW9ucyxcblx0XHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgYWRkSXRlbUVudHJpZXNUb0NvbGxlY3Rpb25DaGFuZ2VzPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0aXRlbUVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdHN1cGVyLmFkZEl0ZW1FbnRyaWVzVG9Db2xsZWN0aW9uQ2hhbmdlcyhcblx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdGl0ZW1FbnRyaWVzLFxuXHRcdFx0KCkgPT4gZmFsc2UsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBpc0xvY2FsIChvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zKTogYm9vbGVhbiB7XG5cdFx0Y29uc3QgcGFyZW50ID0gb3B0aW9ucy5wYXJlbnQ7XG5cblx0XHRpZiAocGFyZW50ID09PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMua2V5U2VydmljZS5pc0xvY2FsSWQocGFyZW50Lml0ZW1JZCk7XG5cdH1cblxuXHRwdWJsaWMgZXhwYW5kQ29sbGVjdGlvbkVudHJ5PENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjaGFuZ2VzRGVsdGE6IENoYW5nZXNEZWx0YSxcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0bmV3Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5VHlwZT4ge1xuXHRcdGNvbnN0IHtkaWZmZXJlbmNlfSA9IGNvbGxlY3Rpb25FbnRyeS5jb2x1bW5zLm1lcmdlUmVxdWVzdENvbHVtbnMobmV3Q29sdW1ucyk7XG5cblx0XHRpZiAoZGlmZmVyZW5jZSAhPT0gdHJ1ZSAmJiBkaWZmZXJlbmNlLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjb2xsZWN0aW9uRW50cnkpO1xuXHRcdH1cblxuXHRcdGNvbnN0IGl0ZW1UeXBlID0gY29sbGVjdGlvbkVudHJ5Lml0ZW1UeXBlO1xuXG5cdFx0cmV0dXJuIHRoaXMuY29sdW1uSGFuZGxlclxuXHRcdFx0LmZldGNoKFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0ZGlmZmVyZW5jZSxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMgPT4ge1xuXHRcdFx0XHRcdHJldHVybiB0aGlzLml0ZW1IYW5kbGVyXG5cdFx0XHRcdFx0XHQuZXhwYW5kTG9jYWxJdGVtRW50cmllcyhcblx0XHRcdFx0XHRcdFx0Y2hhbmdlc0RlbHRhLFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0dGhpcy5jb2xsZWN0aW9uQ2hhbmdlc1tjb2xsZWN0aW9uRW50cnkuaWRdLFxuXHRcdFx0XHRcdFx0XHRkaWZmZXJlbmNlLFxuXHRcdFx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0XHQpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdFx0XHRcdGNvbnN0IGNvbHVtbkV4cGFuc2lvbiA9IHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeS5jb25zdHJ1Y3QoXG5cdFx0XHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0XHRcdGRpZmZlcmVuY2UsXG5cdFx0XHRcdFx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0XHRjb2xsZWN0aW9uRW50cnkuZXhwYW5kQ29sdW1ucyhjb2x1bW5FeHBhbnNpb24pO1xuXG5cdFx0XHRcdFx0XHRcdFx0cmV0dXJuIGNvbGxlY3Rpb25FbnRyeTtcblx0XHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0fSxcblx0XHRcdFx0dGhpcy5lcnJvckhhbmRsZXIucmVqZWN0LFxuXHRcdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogV2hlbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyaWVzfSBhcmUgYWRkZWQgdG8gdGhlIGNoYW5nZXMgb2YgYSB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyeX0gYWxsIHtAbGluayBDb2xsZWN0aW9uUmVzb3VyY2UgQ29sbGVjdGlvblJlc291cmNlc31cblx0ICogc2hvdWxkIGdldCBuZXcge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2VzfSBmb3IgdGhlIG5ld2x5IGFkZGVkIGVudHJpZXNcblx0ICovXG5cdHByb3RlY3RlZCBoYW5kbGVBZGRlZEl0ZW1FbnRyaWVzQ2FsbGJhY2s8Q29sbGVjdGlvbkVudHJ5VHlwZSBleHRlbmRzIENvbGxlY3Rpb25FbnRyeT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5VHlwZSxcblx0XHRhZGRlZEVudHJpZXM6IEFycmF5PEl0ZW1FbnRyeTxDb2xsZWN0aW9uRW50cnlUeXBlWydpdGVtVHlwZSddPj4sXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25SZXNvdXJjZXMgPSB0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZXNbY29sbGVjdGlvbkVudHJ5LmlkXTtcblxuXHRcdC8vIFdoZW4gdGhlcmUgYXJlIG5vIENvbGxlY3Rpb25SZXNvdXJjZXMgd2UgZG9uJ3QgaGF2ZSB0byBtYWtlIEl0ZW1SZXNvdXJjZXNcblx0XHRpZiAoXG5cdFx0XHRhZGRlZEVudHJpZXMubGVuZ3RoID09PSAwXG5cdFx0XHR8fCBjb2xsZWN0aW9uUmVzb3VyY2VzID09PSB1bmRlZmluZWRcblx0XHRcdHx8IGNvbGxlY3Rpb25SZXNvdXJjZXMubGVuZ3RoID09PSAwXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2Ugb2YgY29sbGVjdGlvblJlc291cmNlcykge1xuXHRcdFx0Y29uc3QgYWRkZWRSZXNvdXJjZXMgPSBjb2xsZWN0aW9uUmVzb3VyY2UuYWRkSXRlbVJlc291cmNlcyhhZGRlZEVudHJpZXMpO1xuXG5cdFx0XHRjb2xsZWN0aW9uUmVzb3VyY2UuY2FsbE9uQWRkKGFkZGVkUmVzb3VyY2VzKTtcblx0XHR9XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIFdoZW4ge0BsaW5rIEl0ZW1FbnRyeSBJdGVtRW50cmllc30gYXJlIHJlbW92ZWQgZnJvbSB0aGUgY2hhbmdlcyBvZiBhIHtAbGluayBDb2xsZWN0aW9uRW50cnkgQ29sbGVjdGlvbkVudHJ5fSB0aGUge0BsaW5rIEl0ZW1SZXNvdXJjZSBJdGVtUmVzb3VyY2VzfSBvZiB0aGUgSXRlbUVudHJpZXMgc2hvdWxkIGJlIHJlbW92ZWQgZnJvbSBhbGwge0BsaW5rIENvbGxlY3Rpb25SZXNvdXJjZSBDb2xsZWN0aW9uUmVzb3VyY2VzfVxuXHQgKi9cblx0cHJvdGVjdGVkIGhhbmRsZVJlbW92ZWRJdGVtRW50cmllc0NhbGxiYWNrPENvbGxlY3Rpb25FbnRyeVR5cGUgZXh0ZW5kcyBDb2xsZWN0aW9uRW50cnk+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeVR5cGUsXG5cdFx0cmVtb3ZlZEl0ZW1FbnRyaWVzOiBBcnJheTxJdGVtRW50cnk8Q29sbGVjdGlvbkVudHJ5VHlwZVsnaXRlbVR5cGUnXT4+LFxuXHQpOiB2b2lkIHtcblx0XHRjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2VzID0gdGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VzW2NvbGxlY3Rpb25FbnRyeS5pZF07XG5cblx0XHRpZiAoXG5cdFx0XHRyZW1vdmVkSXRlbUVudHJpZXMubGVuZ3RoID09PSAwXG5cdFx0XHR8fCBjb2xsZWN0aW9uUmVzb3VyY2VzID09PSB1bmRlZmluZWRcblx0XHRcdHx8IGNvbGxlY3Rpb25SZXNvdXJjZXMubGVuZ3RoID09PSAwXG5cdFx0KSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCBjb2xsZWN0aW9uUmVzb3VyY2Ugb2YgY29sbGVjdGlvblJlc291cmNlcykge1xuXHRcdFx0Y29uc3QgcmVtb3ZlZFJlc291cmNlcyA9IGNvbGxlY3Rpb25SZXNvdXJjZS5yZW1vdmVJdGVtUmVzb3VyY2VzKHJlbW92ZWRJdGVtRW50cmllcyk7XG5cblx0XHRcdGNvbGxlY3Rpb25SZXNvdXJjZS5jYWxsT25SZW1vdmUocmVtb3ZlZFJlc291cmNlcyk7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBmZXRjaENvbGxlY3Rpb25EYXRhPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y2hhbmdlc0RlbHRhOiBDaGFuZ2VzRGVsdGEsXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRjb2x1bW5TdWJzZXRDYWNoZTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uRW50cnlPcHRpb25zLFxuXHRcdGNvbGxlY3Rpb25RdWVyeTogQ29sbGVjdGlvblF1ZXJ5LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5ID0gdGhpcy5lbnRyaWVzLmdldEJ5UXVlcnkoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdGNvbGxlY3Rpb25RdWVyeSxcblx0XHQpO1xuXG5cdFx0aWYgKGNvbGxlY3Rpb25FbnRyeSAhPT0gbnVsbCkge1xuXHRcdFx0Ly8gVGhlcmUgYWxyZWFkeSBpcyBhbiBlbnRyeSBhbmQgaXQgY29udGFpbnMgdGhlIGNvbHVtbnMgd2UgbmVlZCwgc28gd2UgY2FuIHNhZmVseSByZXR1cm4gaXRcblxuXHRcdFx0aWYgKGNvbHVtblN1YnNldENhY2hlLnJ1bihjb2xsZWN0aW9uRW50cnkuY29sdW1ucykpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihjb2xsZWN0aW9uRW50cnkpO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdGhpcy5leHBhbmRDb2xsZWN0aW9uRW50cnkoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0XHRjb2x1bW5TdWJzZXRDYWNoZS5yZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Uud2hlbihcblx0XHRcdHRoaXMuY3JlYXRlQ29sbGVjdGlvbkVudHJ5KFxuXHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdCksXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyB7QGxpbmsgQ29sbGVjdGlvbkVudHJ5IENvbGxlY3Rpb25FbnRyaWVzfSBvZiB3aGljaCB0aGUgcGFyZW50cyBhcmUgbG9jYWxcblx0ICovXG5cdHByaXZhdGUgZmV0Y2hMaW5rZWRMb2NhbENvbGxlY3Rpb25FbnRyaWVzIChcblx0XHRwYXJlbnRUeXBlOiBJdGVtVHlwZSxcblx0XHRwYXJlbnRJZEFycmF5OiBJdGVtSWRbXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9ucyxcblx0KSB7XG5cdFx0Y29uc3QgY2hhbmdlc0RlbHRhID0gdGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LmNvbnN0cnVjdCgpO1xuXHRcdGNvbnN0IGNvbHVtblN1YnNldENhY2hlID0gdGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkuY29uc3RydWN0KG9wdGlvbnMuY29sdW1ucyk7XG5cdFx0Y29uc3QgcHJvbWlzZXM6IHtbcGFyZW50SWQ6IHN0cmluZ106IFByb21pc2VJbnRlcmZhY2U8Q29sbGVjdGlvbkVudHJ5Pn0gPSB7fTtcblxuXHRcdGZvciAoY29uc3QgcGFyZW50SWQgb2YgcGFyZW50SWRBcnJheSkge1xuXHRcdFx0Y29uc3QgbmV3T3B0aW9ucyA9IHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZS5jbG9uZU9wdGlvbnMoXG5cdFx0XHRcdG9wdGlvbnMsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRpdGVtVHlwZTogcGFyZW50VHlwZSxcblx0XHRcdFx0XHRpdGVtSWQ6IHBhcmVudElkLFxuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblxuXHRcdFx0Y29uc3QgcGFyc2VkUXVlcnkgPSB0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UuY3JlYXRlUXVlcnkobmV3T3B0aW9ucyk7XG5cblx0XHRcdHRoaXMuZXhwYW5kQ29sdW1uc1dpdGhRdWVyeUNvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeS5vYmplY3QsXG5cdFx0XHQpO1xuXG5cdFx0XHRwcm9taXNlc1twYXJlbnRJZF0gPSB0aGlzLmZldGNoQ29sbGVjdGlvbkRhdGEoXG5cdFx0XHRcdGNoYW5nZXNEZWx0YSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdGNvbHVtblN1YnNldENhY2hlLFxuXHRcdFx0XHRuZXdPcHRpb25zLFxuXHRcdFx0XHRwYXJzZWRRdWVyeSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHJvbWlzZVNlcnZpY2Vcblx0XHRcdC5hbGwocHJvbWlzZXMpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0Y29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXAgPT4ge1xuXG5cdFx0XHRcdFx0cmV0dXJuIHRoaXMudHJhbnNhY3Rpb25cblx0XHRcdFx0XHRcdC5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpXG5cdFx0XHRcdFx0XHQudGhlbihcblx0XHRcdFx0XHRcdFx0KCkgPT4gY29sbGVjdGlvbkVudHJ5UGFyZW50SWRNYXAsXG5cdFx0XHRcdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDb2x1bW5FeHBhbnNpb25SZXN1bHQsIEVudHJ5UGFyZW50TnVsbCwgRmllbGRNYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4vSXRlbUVudHJ5U2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIENoYW5nZXNEZWx0YVJlc3VsdCA9IHtcblx0cm9sbGJhY2s6ICgpID0+IHZvaWQsXG5cdGNyZWF0ZWQ6IEl0ZW1FbnRyeVtdXG5cdC8vIHRvZG9bY2FjaGVdIG90aGVyIHN0YXR1c2VzXG59O1xuXG4vKipcbiAqIEByZW1hcmtcbiAqIFdlIGV4cGxpY2l0bHkga2VlcCB0cmFjayBvZiB0aGUgbmV3IHBhcmVudCwgc28gd2UgY2FuIHNldCBhbiBpdGVtIHRvIG1vdmVkIGlmIGl0IGlzbid0IG51bGwgKE5lZWRlZCBmb3IgbGlua1RvIHJlcXVlc3QpXG4gKi9cbmV4cG9ydCB0eXBlIENoYW5nZXNEZWx0YUl0ZW1VcGRhdGVEZWx0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdGVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0Y2hhbmdlczoge1xuXHRcdGV4cGFuZGVkQ29sdW1uczogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1UeXBlVHlwZT4gfCBudWxsLFxuXHRcdGZpZWxkczogRmllbGRNYXA8SXRlbVR5cGVUeXBlPixcblx0XHRwYXJlbnQ6IEVudHJ5UGFyZW50TnVsbCxcblx0fVxufTtcblxuZXhwb3J0IHR5cGUgQ2hhbmdlc0RlbHRhSXRlbURlbGV0ZURlbHRhID0gSXRlbUVudHJ5W107XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDaGFuZ2VzRGVsdGFCYXNlIHtcblxuXHRwdWJsaWMgdXBkYXRlZDoge1xuXHRcdFtpdGVtRW50cnlJZDogbnVtYmVyXTogQ2hhbmdlc0RlbHRhSXRlbVVwZGF0ZURlbHRhXG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgZGVsZXRlZDoge1xuXHRcdFtpdGVtVHlwZTogc3RyaW5nXTogQ2hhbmdlc0RlbHRhSXRlbURlbGV0ZURlbHRhXG5cdH0gPSB7fTtcblxuXHRwcm90ZWN0ZWQgY29uc3RydWN0b3IgKFxuXHRcdHByb3RlY3RlZCBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHQpIHtcblxuXHR9XG5cblx0cHVibGljIHNldEl0ZW1VcGRhdGVkPEl0ZW1FbnRyeVR5cGUgZXh0ZW5kcyBJdGVtRW50cnk+IChcblx0XHRlbnRyeTogSXRlbUVudHJ5VHlwZSxcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+LFxuXHRcdGNvbHVtbkV4cGFuc2lvblJlc3VsdDogQ29sdW1uRXhwYW5zaW9uUmVzdWx0PEl0ZW1FbnRyeVR5cGVbJ2l0ZW1UeXBlJ10+IHwgbnVsbCA9IG51bGwsXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsLFxuXHQpOiB2b2lkIHtcblx0XHRpZiAodGhpcy51cGRhdGVkW2VudHJ5LmlkXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnVwZGF0ZWRbZW50cnkuaWRdID0ge1xuXHRcdFx0XHRlbnRyeTogZW50cnksXG5cdFx0XHRcdGNoYW5nZXM6IHtcblx0XHRcdFx0XHRmaWVsZHM6IHt9LFxuXHRcdFx0XHRcdGV4cGFuZGVkQ29sdW1uczogbnVsbCxcblx0XHRcdFx0XHRwYXJlbnQ6IHBhcmVudCxcblx0XHRcdFx0fSxcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0Y29uc3QgY2hhbmdlc0VudHJ5ID0gdGhpcy51cGRhdGVkW2VudHJ5LmlkXTtcblxuXHRcdGlmIChwYXJlbnQgIT09IG51bGwpIHtcblx0XHRcdGNvbnN0IHBhcmVudEZpZWxkcyA9IHRoaXMuaXRlbUVudHJ5U2VydmljZS5nZXRMaW5rRmllbGRzQnlQYXJlbnQoXG5cdFx0XHRcdHBhcmVudCxcblx0XHRcdFx0ZW50cnkuaXRlbVR5cGUsXG5cdFx0XHQpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHBhcmVudEZpZWxkcykge1xuXHRcdFx0XHRmaWVsZHNbY29sdW1uSWRdID0gcGFyZW50RmllbGRzW2NvbHVtbklkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGZpZWxkIGluIGZpZWxkcykge1xuXHRcdFx0Y29uc3QgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG5cdFx0XHRcdGZpZWxkcyxcblx0XHRcdFx0ZmllbGQsXG5cdFx0XHQpO1xuXG5cdFx0XHRpZiAoZGVzYyAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShcblx0XHRcdFx0XHRjaGFuZ2VzRW50cnkuY2hhbmdlcy5maWVsZHMsXG5cdFx0XHRcdFx0ZmllbGQsXG5cdFx0XHRcdFx0ZGVzYyxcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNoYW5nZXNFbnRyeS5jaGFuZ2VzLmZpZWxkc1tmaWVsZF0gPSBmaWVsZHNbZmllbGRdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmIChjb2x1bW5FeHBhbnNpb25SZXN1bHQgIT09IG51bGwpIHtcblx0XHRcdGNoYW5nZXNFbnRyeS5jaGFuZ2VzLmV4cGFuZGVkQ29sdW1ucyA9IGNvbHVtbkV4cGFuc2lvblJlc3VsdDtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgc2V0SXRlbURlbGV0ZWQgKFxuXHRcdGRlbGV0ZWQ6IEl0ZW1FbnRyeSxcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5zZXRJdGVtc0RlbGV0ZWQoXG5cdFx0XHRbZGVsZXRlZF0sXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBzZXRJdGVtc0RlbGV0ZWQgKFxuXHRcdGRlbGV0ZWQ6IEl0ZW1FbnRyeVtdLFxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IGl0ZW1FbnRyeSBvZiBkZWxldGVkKSB7XG5cdFx0XHRpZiAodGhpcy5kZWxldGVkW2l0ZW1FbnRyeS5pdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLmRlbGV0ZWRbaXRlbUVudHJ5Lml0ZW1UeXBlXSA9IFtdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyB0b2RvW2NhY2hlXTogZG8gd2UgcmVhbGx5IGhhdmUgdG8gY2hlY2sgdGhpcyA/IGRlbGV0aW5nIG11bHRpcGxlIHRpbWVzIGRvZXNuJ3QgbWF0dGVyXG5cdFx0XHQvLyB0b2RvW2NhY2hlXTogdGhpcyBjb3VsZCBhbHNvIGJlIGEgbWFwIG9mIGVudHJ5SWQgLT4gaXRlbUVudHJ5XG5cdFx0XHRpZiAodGhpcy5kZWxldGVkW2l0ZW1FbnRyeS5pdGVtVHlwZV0uaW5kZXhPZihpdGVtRW50cnkpID4gLTEpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZGVsZXRlZFtpdGVtRW50cnkuaXRlbVR5cGVdLnB1c2goaXRlbUVudHJ5KTtcblx0XHR9XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudCwgRW50cnlQYXJlbnROdWxsLCBGaWVsZE1hcCwgSXRlbUlkLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUJhc2UgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUJhc2UnO1xuaW1wb3J0IHsgQ29sdW1uU2V0IH0gZnJvbSAnLi9Db2x1bW5TZXQnO1xuaW1wb3J0IHsgSXRlbUVudHJ5U2VydmljZSB9IGZyb20gJy4vSXRlbUVudHJ5U2VydmljZSc7XG5cbmV4cG9ydCB0eXBlIENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdGl0ZW1JZDogSXRlbUlkLFxuXHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdGNvbHVtbnM6IENvbHVtblNldDxJdGVtVHlwZVR5cGU+LFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENoYW5nZXNEZWx0YSB1c2VkIHRvIGFwcGx5IGNoYW5nZXMgZnJvbSBvdXRzaWRlIG9mIHRoZSBjb3JlIHRvIGEgdHJhbnNhY3Rpb25cbiAqXG4gKiAtLS0tLS0tLS0tXG4gKlxuICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB7QGxpbmsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgSW50ZXJuYWxDaGFuZ2VzRGVsdGF9IGFuZCB7QGxpbmsgQ2hhbmdlc0RlbHRhIENoYW5nZXNEZWx0YX0gaXMgdGhhdCB0aGUgQ2hhbmdlc0RlbHRhXG4gKiBhc3N1bWVzICdjcmVhdGVkJyB2YWx1ZXMgaGF2ZSBubyBpdGVtRW50cmllcyB5ZXQuXG4gKlxuICogVXNlIHRoaXMgd2hlbiBjYWxsaW5nIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0RlbHRhIGFwcGx5Q2hhbmdlc0RlbHRhfVxuICovXG5leHBvcnQgY2xhc3MgQ2hhbmdlc0RlbHRhXG5cdGV4dGVuZHMgQ2hhbmdlc0RlbHRhQmFzZSB7XG5cblx0cHVibGljIGNyZWF0ZWQ6IENoYW5nZXNEZWx0YUl0ZW1DcmVhdGVEZWx0YVtdID0gW107XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdCkge1xuXHRcdHN1cGVyKFxuXHRcdFx0aXRlbUVudHJ5U2VydmljZSxcblx0XHQpO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBkZXNjcmlwdGlvblxuXHQgKiBXaWxsIGNyZWF0ZSBhbiB7QGxpbmsgSXRlbUVudHJ5IEl0ZW1FbnRyeX0gd2hlbiB0aGUgZGVsdGEgaXMgYXBwbGllZFxuXHQgKiBEb2VzIG5vdCBhbHdheXMgbWVhbiB0aGUgaXRlbSBpcyBsb2NhbCwganVzdCB0aGF0IGl0IGlzbid0IGNhY2hlZCB5ZXRcblx0ICpcblx0ICogLS0tLS0tXG5cdCAqXG5cdCAqIEByZW1hcmtcblx0ICogV2hlbiB0aGUgYHBhcmVudGAgcHJvcGVydHkgaXMgcGFzc2VkIGl0IHdpbGwgYXV0b21hdGljYWxseSBzZXQgdGhlIHByb3BlciBmaWVsZHMgdG8gbWF0Y2ggdGhlIHBhcmVudCwgdGhpcyBhc3N1bWVzIHRoZSByZXF1aXJlZCBwYXJlbnQgY29sdW1ucyBhcmUgaW4gdGhlIHBhc3NlZCBjb2x1bW5zXG5cdCAqIFlvdSBjYW4gZWFzaWx5IGdldCB0aGUgcmVxdWlyZWQgY29sdW1ucyBieSBhbHNvIHBhc3NpbmcgdGhlIGBwYXJlbnRgIHRvIHRoZSB7QGxpbmsgVGVtcGxhdGVDYWNoZS5mZXRjaFRlbXBsYXRlIHRlbXBsYXRlIGZldGNoQ29sbGVjdGlvbkVudHJ5fSBjYWxsXG5cdCAqL1xuXHRwdWJsaWMgc2V0SXRlbUNyZWF0ZWQ8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRmaWVsZHM6IEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4sXG5cdFx0Y29sdW1uczogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4sXG5cdFx0cGFyZW50OiBFbnRyeVBhcmVudE51bGwgPSBudWxsLFxuXHQpOiB2b2lkIHtcblx0XHRsZXQgcGFyZW50RmllbGRzOiBQYXJ0aWFsPEZpZWxkTWFwPEl0ZW1UeXBlVHlwZT4+ID0ge307XG5cblx0XHRpZiAocGFyZW50ICE9PSBudWxsKSB7XG5cdFx0XHRwYXJlbnRGaWVsZHMgPSB0aGlzLml0ZW1FbnRyeVNlcnZpY2UuZ2V0TGlua0ZpZWxkc0J5UGFyZW50KFxuXHRcdFx0XHRwYXJlbnQsXG5cdFx0XHRcdGNvbHVtbnMuaXRlbVR5cGUsXG5cdFx0XHQpO1xuXG5cdFx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHBhcmVudEZpZWxkcykge1xuXHRcdFx0XHRmaWVsZHNbY29sdW1uSWRdID0gcGFyZW50RmllbGRzW2NvbHVtbklkXTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRjb25zdCBkZWZhdWx0VmFsdWVzID0gdGhpcy5pdGVtRW50cnlTZXJ2aWNlLmdldExvY2FsRGVmYXVsdFZhbHVlcygpO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiBkZWZhdWx0VmFsdWVzKSB7XG5cdFx0XHRmaWVsZHNbY29sdW1uSWRdID0gZGVmYXVsdFZhbHVlc1tjb2x1bW5JZF07XG5cdFx0fVxuXG5cdFx0dGhpcy5jcmVhdGVkLnB1c2goe1xuXHRcdFx0aXRlbUlkOiBpdGVtSWQsXG5cdFx0XHRmaWVsZHM6IGZpZWxkcyxcblx0XHRcdGNvbHVtbnM6IGNvbHVtbnMsXG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQGRlc2NyaXB0aW9uXG5cdCAqIENvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGFzc2lnbiB0aGUgcHJvcGVyIHBhcmVudCBmaWVsZHMsIHdpbGwgY2FsbCB7QGxpbmsgQ2hhbmdlc0RlbHRhQmFzZS5zZXRJdGVtVXBkYXRlZCBzZXRJdGVtVXBkYXRlZH0gaW50ZXJuYWxseVxuXHQgKi9cblx0cHVibGljIHNldEl0ZW1Nb3ZlZCAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeSxcblx0XHR0bzogRW50cnlQYXJlbnQsXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuc2V0SXRlbVVwZGF0ZWQoXG5cdFx0XHRlbnRyeSxcblx0XHRcdHt9LFxuXHRcdFx0bnVsbCxcblx0XHRcdHRvLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudCwgRmllbGRNYXAsIEl0ZW1JZENvbnZlcnNpb25NYXAsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhQmFzZSB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhQmFzZSc7XG5pbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi9JdGVtRW50cnlTZXJ2aWNlJztcblxuZXhwb3J0IHR5cGUgSW50ZXJuYWxDcmVhdGVEZWx0YTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSA9IGFueT4gPSB7XG5cdGVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxufTtcblxuLyoqXG4gKiBAZGVzY3JpcHRpb25cbiAqIENoYW5nZXNEZWx0YSB1c2VkIGludGVybmFsbHkgYnkgdGhlIGNvcmVcbiAqXG4gKiAtLS0tLS0tLS0tXG4gKlxuICogVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB7QGxpbmsgSW50ZXJuYWxDaGFuZ2VzRGVsdGEgSW50ZXJuYWxDaGFuZ2VzRGVsdGF9IGFuZCB7QGxpbmsgQ2hhbmdlc0RlbHRhIENoYW5nZXNEZWx0YX0gaXMgdGhhdCB0aGUgSW50ZXJuYWxDaGFuZ2VzRGVsdGFcbiAqIGFzc3VtZXMgJ2NyZWF0ZWQnIGVudHJpZXMgYXJlIGFscmVhZHkgZXhpc3RpbmcsIHNvIGl0IGhhcyBhIGRpZmZlcmVudCBmb3JtYXQuXG4gKlxuICogVXNlIHRoaXMgd2hlbiBjYWxsaW5nIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21QYXJlbnQgYXBwbHlDaGFuZ2VzRnJvbVBhcmVudH0gYW5kIHtAbGluayBUcmFuc2FjdGlvbkNhY2hlLmFwcGx5Q2hhbmdlc0Zyb21DaGlsZCBhcHBseUNoYW5nZXNGcm9tQ2hpbGR9XG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbENoYW5nZXNEZWx0YVxuXHRleHRlbmRzIENoYW5nZXNEZWx0YUJhc2Uge1xuXG5cdHB1YmxpYyBjcmVhdGVkOiB7XG5cdFx0W2l0ZW1FbnRyeUlkOiBzdHJpbmddOiBJbnRlcm5hbENyZWF0ZURlbHRhXG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgbW92ZWQ6IHtcblx0XHRbaXRlbUVudHJ5SWQ6IG51bWJlcl06IHtcblx0XHRcdGVudHJ5OiBJdGVtRW50cnksXG5cdFx0XHR0bzogRW50cnlQYXJlbnRcblx0XHR9XG5cdH0gPSB7fTtcblxuXHRwdWJsaWMgaXRlbUlkQ29udmVyc2lvbk1hcDogSXRlbUlkQ29udmVyc2lvbk1hcCA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHQpIHtcblx0XHRzdXBlcihcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdHB1YmxpYyBzZXRJdGVtQ3JlYXRlZDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0ZmllbGRzOiBGaWVsZE1hcDxJdGVtVHlwZVR5cGU+LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLmNyZWF0ZWRbaXRlbUVudHJ5LmlkXSA9IHtcblx0XHRcdGVudHJ5OiBpdGVtRW50cnksXG5cdFx0XHRmaWVsZHM6IGZpZWxkcyxcblx0XHR9O1xuXHR9XG5cblx0LyoqXG5cdCAqIEByZW1hcmtcblx0ICogUGFyZW50IGZpZWxkcyBhcmUgbm9uLXdyaXRhYmxlIHNvIHdlIG5lZWQgdG8ga2VlcCB0cmFjayBvZiBtb3ZlZCBlbnRyaWVzIGFub3RoZXIgd2F5ICh0byBkbyBhIGxpbmtUbyByZXF1ZXN0KVxuXHQgKi9cblx0cHVibGljIHNldEl0ZW1Nb3ZlZCAoXG5cdFx0ZW50cnk6IEl0ZW1FbnRyeSxcblx0XHR0bzogRW50cnlQYXJlbnQsXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMubW92ZWRbZW50cnkuaWRdID0ge1xuXHRcdFx0ZW50cnk6IGVudHJ5LFxuXHRcdFx0dG86IHRvLFxuXHRcdH07XG5cdH1cbn1cbiIsImltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IERlZmVycmVkLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQXBpUXVlcnksIEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdFNlcnZpY2UgfSBmcm9tICcuL0FwaVJlcXVlc3RTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlUHJvY2Vzc29yIH0gZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3Nvcic7XG5pbXBvcnQgeyBTZXJ2ZXJDYWNoZSB9IGZyb20gJy4vY2FjaGUvc2VydmVyL1NlcnZlckNhY2hlJztcbmltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb24gfSBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb24nO1xuXG5leHBvcnQgdHlwZSBSZXF1ZXN0QnVmZmVyUmVzcG9uc2UgPSBBcGlSZXNwb25zZVByb2Nlc3NvcjtcblxuZXhwb3J0IGNsYXNzIFJlcXVlc3RCdWZmZXIge1xuXG5cdHByaXZhdGUgZGVmZXJyZWQ6IERlZmVycmVkPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4gPSB0aGlzLnByb21pc2VMaWJyYXJ5LmRlZmVyKCk7XG5cdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbjogUmVxdWVzdENvbHVtbkV4cGFuc2lvbiA9IHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkuY29uc3RydWN0KCk7XG5cdHByaXZhdGUgc2luZ2xlSXRlbUlkczogSXRlbUlkW10gPSBbXTtcblx0cHJpdmF0ZSBxdWVyaWVzOiB7W3F1ZXJ5U3RyaW5nOiBzdHJpbmddOiBBcGlRdWVyeX0gPSB7fTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBwcm9taXNlTGlicmFyeTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBzZXJ2ZXJDYWNoZTogU2VydmVyQ2FjaGUsXG5cdFx0cHJpdmF0ZSBpdGVtVHlwZTogSXRlbVR5cGUsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnNJZCAoXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLnNpbmdsZUl0ZW1JZHMuaW5kZXhPZihpdGVtSWQpICE9PSAtMTtcblx0fVxuXG5cdHB1YmxpYyBjb250YWluc1F1ZXJ5IChcblx0XHRxdWVyeVN0cmluZzogc3RyaW5nLFxuXHQpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gdGhpcy5xdWVyaWVzW3F1ZXJ5U3RyaW5nXSAhPT0gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGFkZFNpbmdsZUl0ZW0gKFxuXHRcdGl0ZW1JZDogSXRlbUlkLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZXhwYW5kV2l0aFJlcXVlc3RDb2x1bW5zKFxuXHRcdFx0dGhpcy5pdGVtVHlwZSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRpZiAodGhpcy5zaW5nbGVJdGVtSWRzLmluZGV4T2YoaXRlbUlkKSA9PT0gLTEpIHtcblx0XHRcdHRoaXMuc2luZ2xlSXRlbUlkcy5wdXNoKGl0ZW1JZCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpO1xuXHR9XG5cblx0cHVibGljIGFkZFF1ZXJ5IChcblx0XHRxdWVyeTogW29iamVjdCwgc3RyaW5nXSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHQpO1xuXG5cdFx0aWYgKHRoaXMucXVlcmllc1txdWVyeVsxXV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5xdWVyaWVzW3F1ZXJ5WzFdXSA9IHF1ZXJ5WzBdO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBmbHVzaCAoKTogUHJvbWlzZUludGVyZmFjZTxSZXF1ZXN0QnVmZmVyUmVzcG9uc2U+IHtcblx0XHRjb25zdCBjb25kaXRpb25zOiBhbnlbXSA9IFtdO1xuXG5cdFx0aWYgKHRoaXMuc2luZ2xlSXRlbUlkcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25kaXRpb25zLnB1c2goXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRrZXk6ICdpZCcsXG5cdFx0XHRcdFx0Y29tcGFyYXRvcjogJ0lOJyxcblx0XHRcdFx0XHR2YWx1ZTogdGhpcy5zaW5nbGVJdGVtSWRzLFxuXHRcdFx0XHR9LFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHF1ZXJ5U3RyaW5nIGluIHRoaXMucXVlcmllcykge1xuXHRcdFx0Y29uZGl0aW9ucy5wdXNoKHRoaXMucXVlcmllc1txdWVyeVN0cmluZ10pO1xuXHRcdH1cblxuXHRcdGlmIChjb25kaXRpb25zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdUcmllZCB0byBmbHVzaCBhIFJlcXVlc3RCdWZmZXIgd2l0aG91dCBzaW5nbGVJdGVtcyBvciBxdWVyaWVzJyk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbnMgPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZ2V0KCk7XG5cblx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQucXVlcnkoXG5cdFx0XHRcdHRoaXMuaXRlbVR5cGUsXG5cdFx0XHRcdHtcblx0XHRcdFx0XHRjb25kaXRpb25zOiBjb25kaXRpb25zLFxuXHRcdFx0XHRcdG9wZXJhdG9yOiAnT1InLFxuXHRcdFx0XHR9LFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdClcblx0XHRcdC50aGVuKFxuXHRcdFx0XHRyZXNwb25zZSA9PiB7XG5cdFx0XHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZS5wcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpO1xuXHRcdFx0XHRcdHRoaXMuZGVmZXJyZWQucmVzb2x2ZShyZXNwb25zZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGVycm9yID0+IHtcblx0XHRcdFx0XHR0aGlzLmRlZmVycmVkLnJlamVjdChlcnJvcik7XG5cdFx0XHRcdH0sXG5cdFx0XHQpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZ2V0UHJvbWlzZSgpO1xuXHR9XG5cblx0cHVibGljIGdldFByb21pc2UgKCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0cmV0dXJuIHRoaXMuZGVmZXJyZWQucHJvbWlzZTtcblx0fVxufVxuIiwiaW1wb3J0IHsgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgQXBpUmVxdWVzdENvbHVtbnMsIEl0ZW1JZCwgSXRlbVR5cGUsIFByb21pc2VJbnRlcmZhY2UgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0U2VydmljZSB9IGZyb20gJy4vQXBpUmVxdWVzdFNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpUmVzcG9uc2VQcm9jZXNzb3IgfSBmcm9tICcuL0FwaVJlc3BvbnNlUHJvY2Vzc29yJztcbmltcG9ydCB7IFNlcnZlckNhY2hlIH0gZnJvbSAnLi9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuaW1wb3J0IHsgS2V5U2VydmljZSB9IGZyb20gJy4vS2V5U2VydmljZSc7XG5pbXBvcnQgeyBSZXF1ZXN0QnVmZmVyLCBSZXF1ZXN0QnVmZmVyUmVzcG9uc2UgfSBmcm9tICcuL1JlcXVlc3RCdWZmZXInO1xuaW1wb3J0IHsgZ2V0UGF0aCB9IGZyb20gJy4vVXRpbCc7XG5cbmNvbnN0IEJVRkZFUl9GTFVTSF9USU1FT1VUX01TOiBudW1iZXIgPSAxNTA7XG5cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0QnVmZmVyTWFuYWdlciB7XG5cblx0cHJpdmF0ZSBwZW5kaW5nQnVmZmVyTWFwOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBSZXF1ZXN0QnVmZmVyfSA9IHt9O1xuXHRwcml2YXRlIHBlbmRpbmdUcnVlQnVmZmVyTWFwOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiBSZXF1ZXN0QnVmZmVyfSA9IHt9O1xuXG5cdHByaXZhdGUgcGVuZGluZ1F1ZXJ5QnVmZmVyTWFwOiB7W2l0ZW1UeXBlOiBzdHJpbmddOiB7W3F1ZXJ5U3RyaW5nOiBzdHJpbmddOiBSZXF1ZXN0QnVmZmVyfX0gPSB7fTtcblx0cHJpdmF0ZSBwZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXA6IHtbaXRlbVR5cGU6IHN0cmluZ106IHtbbG9jYWxJdGVtSWQ6IHN0cmluZ106IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+fX0gPSB7fTtcblxuXHRwcml2YXRlIHNlcnZlckNhY2hlOiBTZXJ2ZXJDYWNoZTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBwcm9taXNlTGlicmFyeTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgc2V0U2VydmVyQ2FjaGUgKHNlcnZlckNhY2hlOiBTZXJ2ZXJDYWNoZSk6IHZvaWQge1xuXHRcdHRoaXMuc2VydmVyQ2FjaGUgPSBzZXJ2ZXJDYWNoZTtcblx0fVxuXG5cdHB1YmxpYyBjb250YWluc0lkIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdGlmIChnZXRQYXRoKFxuXHRcdFx0dGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXAsXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRdLFxuXHRcdCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnBlbmRpbmdCdWZmZXJNYXBbaXRlbVR5cGVdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXS5jb250YWluc0lkKGl0ZW1JZCk7XG5cdH1cblxuXHRwdWJsaWMgY29udGFpbnNRdWVyeSAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHF1ZXJ5U3RyaW5nOiBzdHJpbmcsXG5cdCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiBnZXRQYXRoKFxuXHRcdFx0dGhpcy5wZW5kaW5nUXVlcnlCdWZmZXJNYXAsXG5cdFx0XHRbXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRxdWVyeVN0cmluZyxcblx0XHRcdF0sXG5cdFx0KSAhPT0gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHVibGljIGZldGNoQnlJZHMgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRpdGVtSWRzOiBJdGVtSWRbXSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8UmVxdWVzdEJ1ZmZlclJlc3BvbnNlPiB7XG5cdFx0Zm9yIChjb25zdCBpdGVtSWQgb2YgaXRlbUlkcykge1xuXHRcdFx0dGhpcy5mZXRjaEJ5SWQoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wZW5kaW5nQnVmZmVyTWFwW2l0ZW1UeXBlXS5nZXRQcm9taXNlKCk7XG5cdH1cblxuXHRwdWJsaWMgZmV0Y2hCeUlkIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdGlmICh0aGlzLmtleVNlcnZpY2UuaXNMb2NhbElkKGl0ZW1JZCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCBsb2NhbCBJdGVtSWQgaW4gUmVxdWVzdEJ1ZmZlck1hbmFnZXIuZmV0Y2hCeUlkLCBmb3IgbG9jYWwgSXRlbUlkcyB5b3Ugc2hvdWxkIHVzZSBSZXF1ZXN0QnVmZmVyTWFuYWdlci5mZXRjaEJ5TG9jYWxJZCcpO1xuXHRcdH1cblxuXHRcdGxldCBidWZmZXI7XG5cblx0XHRpZiAocmVxdWVzdENvbHVtbnMgPT09IHRydWUpIHtcblx0XHRcdGJ1ZmZlciA9IHRoaXMucGVuZGluZ1RydWVCdWZmZXJNYXBbaXRlbVR5cGVdO1xuXG5cdFx0XHRpZiAoYnVmZmVyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0YnVmZmVyID0gdGhpcy5jb25zdHJ1Y3RCdWZmZXIoXG5cdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0dGhpcy5wZW5kaW5nVHJ1ZUJ1ZmZlck1hcCxcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGNvbnNvbGUubG9nKGBFeGlzdGluZyAnY29sdW1uczogdHJ1ZScgUmVxdWVzdEJ1ZmZlciAke2l0ZW1UeXBlfSBhdCAke3BlcmZvcm1hbmNlLm5vdygpfSBieSBpZGApO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRidWZmZXIgPSB0aGlzLnBlbmRpbmdCdWZmZXJNYXBbaXRlbVR5cGVdO1xuXG5cdFx0XHRpZiAoYnVmZmVyID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0YnVmZmVyID0gdGhpcy5jb25zdHJ1Y3RCdWZmZXIoaXRlbVR5cGUpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y29uc29sZS5sb2coYEV4aXN0aW5nIFJlcXVlc3RCdWZmZXIgJHtpdGVtVHlwZX0gYXQgJHtwZXJmb3JtYW5jZS5ub3coKX0gYnkgaWRgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRidWZmZXIuYWRkU2luZ2xlSXRlbShcblx0XHRcdGl0ZW1JZCxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gYnVmZmVyLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEJ5UXVlcnkgKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRxdWVyeTogW29iamVjdCwgc3RyaW5nXSwgLy8gcXVlcnlQYXJzZXIgcmVzdWx0XG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPFJlcXVlc3RCdWZmZXJSZXNwb25zZT4ge1xuXHRcdGxldCBidWZmZXIgPSB0aGlzLnBlbmRpbmdCdWZmZXJNYXBbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRidWZmZXIgPSB0aGlzLmNvbnN0cnVjdEJ1ZmZlcihpdGVtVHlwZSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGNvbnNvbGUubG9nKGBFeGlzdGluZyBSZXF1ZXN0QnVmZmVyICR7aXRlbVR5cGV9IGF0ICR7cGVyZm9ybWFuY2Uubm93KCl9IHdpdGggcXVlcnlgKTtcblx0XHR9XG5cblx0XHRidWZmZXIuYWRkUXVlcnkoXG5cdFx0XHRxdWVyeSxcblx0XHRcdHJlcXVlc3RDb2x1bW5zLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gYnVmZmVyLmdldFByb21pc2UoKTtcblx0fVxuXG5cdHB1YmxpYyBmZXRjaEJ5TG9jYWxJZCAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdGl0ZW1JZDogSXRlbUlkIHwgc3RyaW5nID0gJ25vLWlkJyxcblx0XHR0ZW1wbGF0ZU9wdGlvbnM/OiBhbnksXG5cdCk6IFByb21pc2VJbnRlcmZhY2U8QXBpUmVzcG9uc2VQcm9jZXNzb3I+IHtcblx0XHRpZiAoXG5cdFx0XHR0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZFxuXHRcdFx0fHwgdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF0gPT09IHVuZGVmaW5lZFxuXHRcdCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0VGVtcGxhdGVCdWZmZXIoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRpdGVtSWQsXG5cdFx0XHRcdHRlbXBsYXRlT3B0aW9ucyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXVtpdGVtSWRdO1xuXHR9XG5cblx0Ly8gcHJpdmF0ZSBjb25zdHJ1Y3RRdWVyeUJ1ZmZlciAoXG5cdC8vIFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHQvLyBcdHF1ZXJ5U3RyaW5nOiBzdHJpbmcsXG5cdC8vICk6IFJlcXVlc3RCdWZmZXIge1xuXHQvLyBcdGlmICh0aGlzLnBlbmRpbmdRdWVyeUJ1ZmZlck1hcFtpdGVtVHlwZV0gPT09IHVuZGVmaW5lZCkge1xuXHQvLyBcdFx0dGhpcy5wZW5kaW5nUXVlcnlCdWZmZXJNYXBbaXRlbVR5cGVdID0ge307XG5cdC8vIFx0fVxuXHQvL1xuXHQvLyBcdGNvbnN0IGJ1ZmZlciA9IHRoaXMucGVuZGluZ1F1ZXJ5QnVmZmVyTWFwW2l0ZW1UeXBlXVtxdWVyeVN0cmluZ10gPSBuZXcgUmVxdWVzdEJ1ZmZlcihcblx0Ly8gXHRcdHRoaXMucHJvbWlzZUxpYnJhcnksXG5cdC8vIFx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlLFxuXHQvLyBcdFx0dGhpcy5yZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Ly8gXHRcdHRoaXMuc2VydmVyQ2FjaGUsXG5cdC8vIFx0XHRpdGVtVHlwZSxcblx0Ly8gXHQpO1xuXHQvL1xuXHQvLyBcdGNvbnNvbGUubG9nKGBDcmVhdGluZyBSZXF1ZXN0QnVmZmVyICR7aXRlbVR5cGV9IGF0ICR7cGVyZm9ybWFuY2Uubm93KCl9YCk7XG5cdC8vXG5cdC8vIFx0d2luZG93LnNldFRpbWVvdXQoXG5cdC8vIFx0XHQoKSA9PiB7XG5cdC8vIFx0XHRcdGJ1ZmZlci5mbHVzaCgpO1xuXHQvL1xuXHQvLyBcdFx0XHRjb25zb2xlLmxvZyhgUmVtb3ZpbmcgUmVxdWVzdEJ1ZmZlciAke2l0ZW1UeXBlfSBhdCAke3BlcmZvcm1hbmNlLm5vdygpfWApO1xuXHQvL1xuXHQvLyBcdFx0XHRkZWxldGUgdGhpcy5wZW5kaW5nUXVlcnlCdWZmZXJNYXBbaXRlbVR5cGVdW3F1ZXJ5U3RyaW5nXTtcblx0Ly8gXHRcdH0sXG5cdC8vIFx0XHRCVUZGRVJfRkxVU0hfVElNRU9VVF9NUyxcblx0Ly8gXHQpO1xuXHQvL1xuXHQvLyBcdHJldHVybiBidWZmZXI7XG5cdC8vIH1cblxuXHRwcml2YXRlIGNvbnN0cnVjdEJ1ZmZlciAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdG1hcCA9IHRoaXMucGVuZGluZ0J1ZmZlck1hcCxcblx0KTogUmVxdWVzdEJ1ZmZlciB7XG5cdFx0Y29uc3QgYnVmZmVyID0gbWFwW2l0ZW1UeXBlXSA9IG5ldyBSZXF1ZXN0QnVmZmVyKFxuXHRcdFx0dGhpcy5wcm9taXNlTGlicmFyeSxcblx0XHRcdHRoaXMuYXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5zZXJ2ZXJDYWNoZSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHR3aW5kb3cuc2V0VGltZW91dChcblx0XHRcdCgpID0+IHtcblx0XHRcdFx0YnVmZmVyLmZsdXNoKCk7XG5cblx0XHRcdFx0ZGVsZXRlIG1hcFtpdGVtVHlwZV07XG5cdFx0XHR9LFxuXHRcdFx0QlVGRkVSX0ZMVVNIX1RJTUVPVVRfTVMsXG5cdFx0KTtcblxuXHRcdHJldHVybiBidWZmZXI7XG5cdH1cblxuXHRwcml2YXRlIGNvbnN0cnVjdFRlbXBsYXRlQnVmZmVyIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0aXRlbUlkOiBJdGVtSWQgfCBzdHJpbmcsXG5cdFx0dGVtcGxhdGVPcHRpb25zPzogYW55LFxuXHQpOiBQcm9taXNlSW50ZXJmYWNlPEFwaVJlc3BvbnNlUHJvY2Vzc29yPiB7XG5cdFx0aWYgKHRoaXMucGVuZGluZ1RlbXBsYXRlQnVmZmVyTWFwW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHR0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5wZW5kaW5nVGVtcGxhdGVCdWZmZXJNYXBbaXRlbVR5cGVdW2l0ZW1JZF0gPSB0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlXG5cdFx0XHQudGVtcGxhdGUoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR0ZW1wbGF0ZU9wdGlvbnMsXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzcG9uc2UgPT4ge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHRcdHJldHVybiByZXNwb25zZTtcblx0XHRcdFx0fSxcblx0XHRcdFx0KCkgPT4ge1xuXHRcdFx0XHRcdGRlbGV0ZSB0aGlzLnBlbmRpbmdUZW1wbGF0ZUJ1ZmZlck1hcFtpdGVtVHlwZV1baXRlbUlkXTtcblxuXHRcdFx0XHRcdHJldHVybiB0aGlzLmVycm9ySGFuZGxlci5yZWplY3QoKTtcblx0XHRcdFx0fSxcblx0XHRcdCk7XG5cdH1cblxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9BcGlGb3JtYXR0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlSZXF1ZXN0U2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVJlc3BvbnNlUHJvY2Vzc29yJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlc0NvbXBpbGF0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlc1Byb2Nlc3Nvcic7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25DYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25FbnRyeVNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uTWF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5DYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkV4cGFuc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5JbmZvJztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uU2V0JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uU3Vic2V0Q2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9Db2x1bW5VdGlsJztcbmV4cG9ydCAqIGZyb20gJy4vQ3JlYXRlUmVxdWVzdCc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1DYWNoZSc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1FbnRyeVNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9LZXlTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25FdmVudEhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9Mb2NrU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL01vZHVsZUNoYW5nZXNDb21waWxhdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5TWF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5UGFyc2VyJztcbmV4cG9ydCAqIGZyb20gJy4vUXVlcnlTZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vUmVxdWVzdENvbHVtbkV4cGFuc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL1NvY2tldE1lc3NhZ2VIYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vVXRpbCc7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL0Fic3RyYWN0Q2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9zZXJ2ZXIvU2VydmVyQ2FjaGUnO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9zZXJ2ZXIvU2VydmVySXRlbUhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS9zZXJ2ZXIvU2VydmVyQ29sbGVjdGlvbkhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmV4cG9ydCAqIGZyb20gJy4vY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25JdGVtSGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ29sbGVjdGlvbkhhbmRsZXInO1xuZXhwb3J0ICogZnJvbSAnLi9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkV2ZW50SGFuZGxlcic7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNEZWx0YSc7XG5leHBvcnQgKiBmcm9tICcuL0ludGVybmFsQ2hhbmdlc0RlbHRhJztcbmV4cG9ydCAqIGZyb20gJy4vUmVxdWVzdEJ1ZmZlck1hbmFnZXInO1xuZXhwb3J0ICogZnJvbSAnLi9SZXF1ZXN0QnVmZmVyJztcbiIsImltcG9ydCB7IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LCBUZW1wbGF0ZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgVGVtcGxhdGUgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRW50cnlQYXJlbnROdWxsLCBJdGVtSWQsIEl0ZW1UeXBlLCBQcm9taXNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHsgQ29sdW1uSGFuZGxlciB9IGZyb20gJy4vQ29sdW1uSGFuZGxlcic7XG5pbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi9Db2x1bW5VdGlsJztcbmltcG9ydCB7IFJlcXVlc3RCdWZmZXJNYW5hZ2VyIH0gZnJvbSAnLi9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0aWVzIH0gZnJvbSAnLi9VdGlsJztcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQ2FjaGUge1xuXG5cdHB1YmxpYyB0ZW1wbGF0ZXM6IHtcblx0XHRbaXRlbVR5cGU6IHN0cmluZ106IFRlbXBsYXRlPGFueT5cblx0fSA9IHt9O1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtblV0aWw6IENvbHVtblV0aWwsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0QnVmZmVyRmFjdG9yeTogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cHJpdmF0ZSBjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyLFxuXHRcdHByaXZhdGUgdGVtcGxhdGVGYWN0b3J5OiBUZW1wbGF0ZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5OiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0KSB7XG5cblx0fVxuXG5cdC8qKlxuXHQgKiBAZGVzY3JpcHRpb25cblx0ICogRmV0Y2hlcyBhIHtAbGluayBUZW1wbGF0ZSB0ZW1wbGF0ZX0sIHtAbGluayBUcmFuc2FjdGlvbkl0ZW1IYW5kbGVyLmNyZWF0ZUl0ZW1zIFRyYW5zYWN0aW9uSXRlbUhhbmRsZXIuY3JlYXRlSXRlbXN9IGlzIGEgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHRoaXNcblx0ICpcblx0ICogQHBhcmFtIGl0ZW1UeXBlIFRoZSB7QGxpbmsgSXRlbVR5cGUgSXRlbVR5cGV9IG9mIHRoZSB0ZW1wbGF0ZSBpdGVtXG5cdCAqIEBwYXJhbSBpdGVtSWQgVXNlZCBmb3IgY2FjaGluZywgbXVsdGlwbGUgY29uY3VycmVudCB0ZW1wbGF0ZSBjYWxscyBmb3IgdGhlIHNhbWUgaXRlbUlkIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHRlbXBsYXRlXG5cdCAqIEBwYXJhbSB0ZW1wbGF0ZU9wdGlvbnNcblx0ICogQHBhcmFtIHRlbXBsYXRlQ29sdW1ucyBBZGRpdGlvbmFsIGNvbHVtbnMgdG8gYmUgZmV0Y2hlZCwgd2lsbCBiZSBzdG9yZWQgaW4gdGhlIHRlbXBsYXRlIC0gd2FybmluZyAtIHRoZSBUZW1wbGF0ZSB3b24ndCBoYXZlIHZhbHVlcyBmb3IgdGhvc2UgY29sdW1uc1xuXHQgKiBAcGFyYW0gZW50cnlQYXJlbnRPclBhcmVudEl0ZW1UeXBlIEFuIG9wdGlvbmFsIHtAbGluayBFbnRyeVBhcmVudE51bGwgZW50cnkgcGFyZW50fSBvciB7QGxpbmsgSXRlbVR5cGUgcGFyZW50IGl0ZW1UeXBlfSwgaWYgdGhlIHBhcmVudCBpcyBwYXNzZWQgdGhlIHRlbXBsYXRlQ29sdW1ucyB3aWxsIGJlIGV4cGFuZGVkIHdpdGggdGhlIHByb3BlciBsaW5rIGNvbHVtbnMgKFRocm91Z2gge0BsaW5rIENvbHVtblV0aWwuZ2V0Q29sdW1uc0Zyb21MaW5rIENvbHVtblV0aWwuZ2V0Q29sdW1uc0Zyb21MaW5rfSlcblx0ICpcblx0ICogQGV4YW1wbGVcblx0ICogYGBgXG5cdCAqICBjb25zdCBwYXJlbnQ6IEVudHJ5UGFyZW50ID0ge1xuXHQgKiAgICAgIGl0ZW1UeXBlOiAnRnVuY3RpZScsXG5cdCAqICAgICAgaXRlbUlkOiAxMCxcblx0ICogIH07XG5cdCAqXG5cdCAqICByZXR1cm4gY29yZS50ZW1wbGF0ZUNhY2hlXG5cdCAqICAgICAgLmZldGNoVGVtcGxhdGUoXG5cdCAqICAgICAgICAgICdQbGFubmluZ3BlcnNvbmVlbCcsXG5cdCAqICAgICAgICAgIHVuZGVmaW5lZCxcblx0ICogICAgICAgICAge30sXG5cdCAqICAgICAgICAgIHt9LFxuXHQgKiAgICAgICAgICBwYXJlbnQsXG5cdCAqICAgICAgKVxuXHQgKiAgICAgIC50aGVuKFxuXHQgKiAgICAgICAgICAodGVtcGxhdGU6IFRlbXBsYXRlPCdQbGFubmluZ3BlcnNvbmVlbCc+KSA9PiB7XG5cdCAqICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzRGVsdGEgPSB0cmFuc2FjdGlvbi5jcmVhdGVDaGFuZ2VzRGVsdGEoKTtcblx0ICpcblx0ICogICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbVJlc291cmNlIG9mIHNlbGVjdGVkSXRlbXMpIHtcblx0ICogICAgICAgICAgICAgICAgICBjaGFuZ2VzRGVsdGEuc2V0SXRlbUNyZWF0ZWQoXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIGNvcmUua2V5U2VydmljZS5nZXRMb2NhbElkKCksXG5cdCAqICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmZpZWxkcyxcblx0ICogICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuY29sdW1ucyxcblx0ICogICAgICAgICAgICAgICAgICAgICAgcGFyZW50LFxuXHQgKiAgICAgICAgICAgICAgICAgICk7XG5cdCAqICAgICAgICAgICAgICB9XG5cdCAqXG5cdCAqICAgICAgICAgICAgICB0cmFuc2FjdGlvbi5hcHBseUNoYW5nZXNEZWx0YShjaGFuZ2VzRGVsdGEpO1xuXHQgKiAgICAgICAgICApO1xuXHQgKiAgYGBgXG5cdCAqL1xuXHRwdWJsaWMgZmV0Y2hUZW1wbGF0ZTxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0aXRlbUlkPzogSXRlbUlkLFxuXHRcdHRlbXBsYXRlT3B0aW9uczogYW55ID0ge30sXG5cdFx0dGVtcGxhdGVDb2x1bW5zOiBhbnkgPSB7fSxcblx0XHRlbnRyeVBhcmVudE9yUGFyZW50SXRlbVR5cGU6IEVudHJ5UGFyZW50TnVsbCB8IEl0ZW1UeXBlID0gbnVsbCxcblx0KTogUHJvbWlzZUludGVyZmFjZTxUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+PiB7XG5cdFx0Y29uc3QgaGFzVGVtcGxhdGVPcHRpb25zID0gaGFzUHJvcGVydGllcyh0ZW1wbGF0ZU9wdGlvbnMpO1xuXHRcdC8vIHRvZG9bY2FjaGVdIFdlIGFsd2F5cyBuZWVkIHRvIGZldGNoIGNvbHVtbnMgb2YgdGhlIG1haW4gSXRlbVR5cGVcblx0XHQvLyBjb25zdCBjb2x1bW5JdGVtVHlwZSA9IGdldEZpcnN0UHJvcGVydHkodGVtcGxhdGVDb2x1bW5zKTsgLy8gaXQncyBwb3NzaWJsZSB0byBhZGQgY29sdW1ucyB0byBsaW5rZWQgaXRlbXNcblxuXHRcdGNvbnN0IHJlcXVlc3RDb2x1bW5FeHBhbnNpb24gPSB0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LmNvbnN0cnVjdCgpO1xuXG5cdFx0aWYgKHRlbXBsYXRlQ29sdW1uc1tpdGVtVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR0ZW1wbGF0ZUNvbHVtbnNbaXRlbVR5cGVdLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uLmV4cGFuZFdpdGhSZXF1ZXN0Q29sdW1ucyhcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0W1xuXHRcdFx0XHR7Y3JlYXRvcjogWydkaXNwbGF5bmFtZSddfSxcblx0XHRcdFx0J2NyZWF0ZWQnLFxuXHRcdFx0XHQncGVybWlzc2lvbnMnLFxuXHRcdFx0XSxcblx0XHQpO1xuXG5cdFx0aWYgKGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZSAhPT0gbnVsbCkge1xuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbi5leHBhbmRXaXRoUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHR0aGlzLmNvbHVtblV0aWwuZ2V0Q29sdW1uc0Zyb21MaW5rKFxuXHRcdFx0XHRcdCh0eXBlb2YgZW50cnlQYXJlbnRPclBhcmVudEl0ZW1UeXBlID09PSAnc3RyaW5nJylcblx0XHRcdFx0XHRcdD8gZW50cnlQYXJlbnRPclBhcmVudEl0ZW1UeXBlXG5cdFx0XHRcdFx0XHQ6IGVudHJ5UGFyZW50T3JQYXJlbnRJdGVtVHlwZS5pdGVtVHlwZSxcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0KSxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0dGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSA9IHJlcXVlc3RDb2x1bW5FeHBhbnNpb24uZ2V0KClbaXRlbVR5cGVdO1xuXG5cdFx0aWYgKCFoYXNUZW1wbGF0ZU9wdGlvbnMpIHtcblx0XHRcdGNvbnN0IGNhY2hlZFRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZXNbaXRlbVR5cGVdO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNhY2hlZFRlbXBsYXRlICE9PSB1bmRlZmluZWRcblx0XHRcdFx0JiYgKFxuXHRcdFx0XHRcdGl0ZW1UeXBlID09PSBudWxsXG5cdFx0XHRcdFx0fHwgdGhpcy5jb2x1bW5VdGlsLnJlc3BvbnNlQ29sdW1uc0F2YWlsYWJsZShcblx0XHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdFx0dGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdGNhY2hlZFRlbXBsYXRlLnJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0XHQpXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5wcm9taXNlU2VydmljZS53aGVuKGNhY2hlZFRlbXBsYXRlIGFzIFRlbXBsYXRlPEl0ZW1UeXBlVHlwZT4pO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnByb21pc2VTZXJ2aWNlXG5cdFx0XHQuYWxsKFxuXHRcdFx0XHR7XG5cdFx0XHRcdFx0dGVtcGxhdGU6IHRoaXMucmVxdWVzdEJ1ZmZlckZhY3RvcnkuZmV0Y2hCeUxvY2FsSWQoXG5cdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdGl0ZW1JZCxcblx0XHRcdFx0XHRcdHRlbXBsYXRlT3B0aW9ucyxcblx0XHRcdFx0XHQpLFxuXHRcdFx0XHRcdGFkZGl0aW9uYWxDb2x1bW5zOiB0ZW1wbGF0ZUNvbHVtbnNbaXRlbVR5cGVdID09PSB1bmRlZmluZWRcblx0XHRcdFx0XHRcdD8ge31cblx0XHRcdFx0XHRcdDogdGhpcy5jb2x1bW5IYW5kbGVyLmZldGNoKFxuXHRcdFx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRcdFx0dGVtcGxhdGVDb2x1bW5zW2l0ZW1UeXBlXSxcblx0XHRcdFx0XHRcdCksXG5cdFx0XHRcdH0sXG5cdFx0XHQpXG5cdFx0XHQudGhlbihcblx0XHRcdFx0cmVzb2x2ZWQgPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHRlbXBsYXRlUmVzcG9uc2UgPSByZXNvbHZlZC50ZW1wbGF0ZTtcblxuXHRcdFx0XHRcdGNvbnN0IHRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZUZhY3RvcnkuY29uc3RydWN0KFxuXHRcdFx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdFx0XHR0ZW1wbGF0ZVJlc3BvbnNlLFxuXHRcdFx0XHRcdFx0cmVzb2x2ZWQuYWRkaXRpb25hbENvbHVtbnMsXG5cdFx0XHRcdFx0KTtcblxuXHRcdFx0XHRcdGlmICghaGFzVGVtcGxhdGVPcHRpb25zICYmIHRlbXBsYXRlUmVzcG9uc2UuY2FjaGVhYmxlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLnRlbXBsYXRlc1tpdGVtVHlwZV0gPSB0ZW1wbGF0ZTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGVtcGxhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLnJlamVjdCxcblx0XHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQXBpUmVzcG9uc2VQcm9jZXNzb3IgfSBmcm9tICcuLi9jbGFzc2VzJztcblxuZXhwb3J0IGNsYXNzIEFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yIChwcml2YXRlIGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyKSB7XG5cblx0fVxuXG5cdGNvbnN0cnVjdCAocmVzcG9uc2U6IGFueSk6IEFwaVJlc3BvbnNlUHJvY2Vzc29yIHtcblx0XHRyZXR1cm4gbmV3IEFwaVJlc3BvbnNlUHJvY2Vzc29yKHRoaXMuYXBpRm9ybWF0dGVyLCByZXNwb25zZSk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENoYW5nZXNDb21waWxhdGlvbiB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoKSB7XG5cdH1cblxuXHRjb25zdHJ1Y3QgKFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDaGFuZ2VzQ29tcGlsYXRpb24ge1xuXHRcdHJldHVybiBuZXcgQ2hhbmdlc0NvbXBpbGF0aW9uKFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sbGVjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBBYnN0cmFjdENhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS9BYnN0cmFjdENhY2hlJztcbmltcG9ydCB7IFF1ZXJ5TWF0Y2hlckZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgcXVlcnlNYXRjaGVyRmFjdG9yeTogUXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogQWJzdHJhY3RDYWNoZSxcblx0KTogQ29sbGVjdGlvbkNhY2hlIHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25DYWNoZShcblx0XHRcdHRoaXMucXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdCk7XG5cdH1cblx0XG59XG4iLCJpbXBvcnQgeyBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLCBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnksIENvbGxlY3Rpb25FbnRyeU9wdGlvbnMsIENvbGxlY3Rpb25FbnRyeU9wdGlvbnNJbnRlcmZhY2UgfSBmcm9tICcuLi9tb2RlbHMvJztcbmltcG9ydCB7IEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMvJztcbmltcG9ydCB7IENvbHVtblNldEZhY3RvcnkgfSBmcm9tICcuL0NvbHVtblNldEZhY3RvcnknO1xuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkVudHJ5RmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbHVtblNldEZhY3Rvcnk6IENvbHVtblNldEZhY3RvcnksXG5cdFx0cHJpdmF0ZSBrZXlTZXJ2aWNlOiBLZXlTZXJ2aWNlLFxuXHQpIHtcblx0fVxuXG5cdGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvbkVudHJ5T3B0aW9uc0ludGVyZmFjZSxcblx0KTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdFx0XHR0aGlzLmNvbHVtblNldEZhY3RvcnksXG5cdFx0XHR0aGlzLmtleVNlcnZpY2UsXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdG5ldyBDb2xsZWN0aW9uRW50cnlPcHRpb25zKG9wdGlvbnMpLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbGxlY3Rpb25NYXRjaGVyLCBTZXJ2ZXJDYWNoZSwgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgUXVlcnlNYXRjaGVyRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBDb2xsZWN0aW9uRW50cnkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUgfCBTZXJ2ZXJDYWNoZSxcblx0XHRnZXRDb2xsZWN0aW9uRW50cmllczogPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPihpdGVtVHlwZTogSXRlbVR5cGVUeXBlKSA9PiBBcnJheTxDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPj4sXG5cdCk6IENvbGxlY3Rpb25NYXRjaGVyIHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb25NYXRjaGVyKFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRnZXRDb2xsZWN0aW9uRW50cmllcyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBLZXlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEl0ZW1SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkVkaXRSZXNvdXJjZSxcblx0Q29sbGVjdGlvbkVudHJ5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnMsXG5cdENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2UsXG5cdENvbGxlY3Rpb25WaWV3UmVzb3VyY2UsXG5cdEVkaXRSZXNvdXJjZSxcblx0SXRlbVJlc291cmNlLFxuXHRMb2NhbFZpZXdSZXNvdXJjZSxcblx0UmVtb3RlVmlld1Jlc291cmNlLFxufSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgSXRlbVR5cGUgfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGFGYWN0b3J5IH0gZnJvbSAnLi9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25SZXNvdXJjZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHVibGljIGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHVibGljIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHVibGljIHByb21pc2VTZXJ2aWNlOiBQcm9taXNlTGlicmFyeUludGVyZmFjZSxcblx0XHRwdWJsaWMgY2hhbmdlc0RlbHRhRmFjdG9yeTogQ2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0Y29sbGVjdGlvbkVudHJ5OiBDb2xsZWN0aW9uRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zSW50ZXJmYWNlPEl0ZW1UeXBlVHlwZT4gJiB7ZWRpdEl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBFZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge3JlbW90ZUl0ZW1zOiB0cnVlLCBlZGl0Q29sbGVjdGlvbjogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IENvbGxlY3Rpb25FZGl0UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+ICYge2VkaXRDb2xsZWN0aW9uOiB0cnVlfSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogQ29sbGVjdGlvbkVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGUsIExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtlZGl0SXRlbXM6IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb2xsZWN0aW9uRW50cnk6IENvbGxlY3Rpb25FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IENvbGxlY3Rpb25SZXNvdXJjZU9wdGlvbnNJbnRlcmZhY2U8SXRlbVR5cGVUeXBlPiAmIHtyZW1vdGVJdGVtczogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IENvbGxlY3Rpb25WaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBSZW1vdGVWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbGxlY3Rpb25FbnRyeTogQ29sbGVjdGlvbkVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogQ29sbGVjdGlvblJlc291cmNlT3B0aW9uc0ludGVyZmFjZTxJdGVtVHlwZVR5cGU+LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBDb2xsZWN0aW9uUmVzb3VyY2U8SXRlbVR5cGVUeXBlLCBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IG9wdGlvbnNJbnN0YW5jZSA9IG5ldyBDb2xsZWN0aW9uUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpO1xuXG5cdFx0aWYgKG9wdGlvbnNJbnN0YW5jZS5lZGl0Q29sbGVjdGlvbikge1xuXHRcdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdGNvbGxlY3Rpb25FbnRyeSxcblx0XHRcdFx0b3B0aW9uc0luc3RhbmNlLFxuXHRcdFx0XHR0cmFuc2FjdGlvbixcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBDb2xsZWN0aW9uVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHR0aGlzLFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5LFxuXHRcdFx0b3B0aW9uc0luc3RhbmNlLFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uRXhwYW5zaW9uIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5JbmZvRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBBcGlSZXF1ZXN0Q29sdW1ucywgSXRlbVR5cGUsIFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5FeHBhbnNpb25GYWN0b3J5IHtcblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgY29sdW1uSW5mb0ZhY3Rvcnk6IENvbHVtbkluZm9GYWN0b3J5LFxuXHQpIHtcblxuXHR9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlVHlwZSxcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbnMsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHQpOiBDb2x1bW5FeHBhbnNpb248SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDb2x1bW5FeHBhbnNpb24oXG5cdFx0XHR0aGlzLmNvbHVtbkluZm9GYWN0b3J5LFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5JbmZvIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW4sIFJvb3RDb2x1bW5NYXAgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBDb2x1bW5JbmZvRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yICgpIHt9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0YXBpQ29sdW1uOiBSZXNwb25zZUNvbHVtbixcblx0XHRwYXJlbnQ6IENvbHVtbkluZm88SXRlbVR5cGVUeXBlPiB8IG51bGxcblx0KTogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENvbHVtbkluZm8oYXBpQ29sdW1uLCBwYXJlbnQpO1xuXHR9XG5cblx0Y29uc3RydWN0RnJvbVJvb3RNYXA8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRyb290Q29sdW1uTWFwOiBSb290Q29sdW1uTWFwLFxuXHRcdHBhcmVudDogQ29sdW1uSW5mbzxJdGVtVHlwZVR5cGU+IHwgbnVsbCA9IG51bGxcblx0KSB7XG5cdFx0Y29uc3QgcmVzdWx0OiBBcnJheTxDb2x1bW5JbmZvPEl0ZW1UeXBlVHlwZT4+ID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbklkIGluIHJvb3RDb2x1bW5NYXApIHtcblx0XHRcdGNvbnN0IGNvbHVtbk1hcEVudHJ5ID0gcm9vdENvbHVtbk1hcFtjb2x1bW5JZF07XG5cdFx0XHRjb25zdCBjb2x1bW5JbmZvID0gdGhpcy5jb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlPihjb2x1bW5NYXBFbnRyeS5hcGlDb2x1bW4sIHBhcmVudCk7XG5cdFx0XHRjb25zdCBjaGlsZENvbHVtbnMgPSB0aGlzLmNvbnN0cnVjdEZyb21Sb290TWFwPEl0ZW1UeXBlVHlwZT4oY29sdW1uTWFwRW50cnkuY2hpbGRyZW4sIGNvbHVtbkluZm8pO1xuXG5cdFx0XHRpZiAoY2hpbGRDb2x1bW5zLmxlbmd0aCA+IDApXG5cdFx0XHRcdGNvbHVtbkluZm8uc2V0Q2hpbGRyZW4oY29sdW1uSW5mby5hcGlDb2x1bW4uaXRlbVR5cGUsIGNoaWxkQ29sdW1ucyk7XG5cblx0XHRcdHJlc3VsdC5wdXNoKGNvbHVtbkluZm8pO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cbn1cbiIsImltcG9ydCB7IENvbHVtbkhhbmRsZXIsIENvbHVtbkluZm8sIENvbHVtblNldCwgQ29sdW1uVXRpbCwgaGFzUHJvcGVydGllcyB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQ29sdW1uSW5mb0ZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdENvbHVtbixcblx0QXBpUmVxdWVzdENvbHVtbnMsXG5cdEl0ZW1UeXBlLFxuXHRJdGVtVHlwZU1hcCxcblx0UmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0Um9vdENvbHVtbk1hcCxcbn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgQ29sdW1uU2V0RmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXIsXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHByaXZhdGUgY29sdW1uSW5mb0ZhY3Rvcnk6IENvbHVtbkluZm9GYWN0b3J5LFxuXHQpIHtcblx0fVxuXG5cdGNvbnN0cnVjdFN0dWI8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHJlcXVlc3RDb2x1bW5zOiBBcGlSZXF1ZXN0Q29sdW1ucyxcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGNvbHVtblNldCA9IG5ldyBDb2x1bW5TZXQoXG5cdFx0XHR0aGlzLmNvbHVtblV0aWwsXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0KTtcblxuXHRcdGNvbHVtblNldC5yZXF1ZXN0ID0gcmVxdWVzdENvbHVtbnM7XG5cdFx0Y29sdW1uU2V0LnJlcXVlc3RDb2x1bW5zVHJ1ZSA9IHJlcXVlc3RDb2x1bW5zID09PSB0cnVlO1xuXG5cdFx0cmV0dXJuIGNvbHVtblNldDtcblx0fVxuXG5cdHB1YmxpYyByZXNvbHZlU3R1YjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0LFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuID0gdHJ1ZSxcblx0XHRpbmNsdWRlSWRDb2x1bW46IGJvb2xlYW4gPSB0cnVlLFxuXHQpOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIGNvbHVtblNldC5yZXF1ZXN0Q29sdW1uc1RydWUgP1xuXHRcdFx0dGhpcy5wcm9jZXNzUmVzcG9uc2VDb2x1bW5zKFxuXHRcdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdCkgOlxuXHRcdFx0dGhpcy5wcm9jZXNzUmVxdWVzdENvbHVtbnMoXG5cdFx0XHRcdGNvbHVtblNldCxcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW5zLFxuXHRcdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0XHRpbmNsdWRlSWRDb2x1bW4sXG5cdFx0XHQpO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZVR5cGUsXG5cdFx0cmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nPzogYm9vbGVhbixcblx0XHRpbmNsdWRlSWRDb2x1bW4/OiBib29sZWFuLFxuXHQpOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMucmVzb2x2ZVN0dWIoXG5cdFx0XHR0aGlzLmNvbnN0cnVjdFN0dWIoXG5cdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRyZXF1ZXN0Q29sdW1ucyxcblx0XHRcdCksXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0aW5jbHVkZUlkQ29sdW1uLFxuXHRcdCk7XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0RnJvbVJlc3BvbnNlPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbVR5cGU6IEl0ZW1UeXBlLFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuID0gdHJ1ZSxcblx0KTogQ29sdW1uU2V0PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGNvbnN0IGNvbHVtblNldCA9IG5ldyBDb2x1bW5TZXQoXG5cdFx0XHR0aGlzLmNvbHVtblV0aWwsXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0KTtcblxuXHRcdGNvbHVtblNldC5yZXF1ZXN0Q29sdW1uc1RydWUgPSBmYWxzZTtcblxuXHRcdHJldHVybiB0aGlzLnByb2Nlc3NSZXNwb25zZUNvbHVtbnMoXG5cdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHByb2Nlc3NSZXNwb25zZUNvbHVtbnMgKFxuXHRcdGNvbHVtblNldDogQ29sdW1uU2V0LFxuXHRcdHJlc3BvbnNlQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuLFxuXHQpOiBDb2x1bW5TZXQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gY29sdW1uU2V0Lml0ZW1UeXBlO1xuXHRcdGNvbnN0IHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAgPSB7fTtcblx0XHRjb25zdCBwcm9jZXNzZWRJdGVtVHlwZU1hcDogSXRlbVR5cGVNYXA8Ym9vbGVhbj4gPSB7fTtcblxuXHRcdGNvbHVtblNldC5yZXNwb25zZSA9IHJlc3BvbnNlQ29sdW1ucztcblxuXHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcEZyb21SZXNwb25zZUNvbHVtbnMoXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdHJvb3RDb2x1bW5NYXAsXG5cdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0cHJvY2Vzc2VkSXRlbVR5cGVNYXAsXG5cdFx0KTtcblxuXHRcdHRoaXMucHJvY2Vzc0NvbHVtbkluZm8oXG5cdFx0XHRjb2x1bW5TZXQsXG5cdFx0XHR0aGlzLmNvbHVtbkluZm9GYWN0b3J5LmNvbnN0cnVjdEZyb21Sb290TWFwKHJvb3RDb2x1bW5NYXApLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0KTtcblxuXHRcdGNvbHVtblNldC5yZXF1ZXN0ID0gdGhpcy5jb25zdHJ1Y3RSZXF1ZXN0Q29sdW1uc0Zyb21Sb290Q29sdW1uTWFwKHJvb3RDb2x1bW5NYXApO1xuXG5cdFx0cmV0dXJuIGNvbHVtblNldDtcblx0fVxuXG5cdHByaXZhdGUgY29uc3RydWN0UmVxdWVzdENvbHVtbnNGcm9tUm9vdENvbHVtbk1hcCAoXG5cdFx0cm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCxcblx0KTogQXBpUmVxdWVzdENvbHVtbltdIHtcblx0XHRjb25zdCByZXN1bHQ6IEFwaVJlcXVlc3RDb2x1bW5bXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiByb290Q29sdW1uTWFwKSB7XG5cdFx0XHRjb25zdCBlbnRyeSA9IHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdO1xuXG5cdFx0XHRpZiAoaGFzUHJvcGVydGllcyhlbnRyeS5jaGlsZHJlbikpIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goe1xuXHRcdFx0XHRcdFtjb2x1bW5JZF06IHRoaXMuY29uc3RydWN0UmVxdWVzdENvbHVtbnNGcm9tUm9vdENvbHVtbk1hcChlbnRyeS5jaGlsZHJlbiksXG5cdFx0XHRcdH0pO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmVzdWx0LnB1c2goY29sdW1uSWQpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGV4cGFuZFJvb3RDb2x1bW5NYXBGcm9tUmVzcG9uc2VDb2x1bW5zIChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAsXG5cdFx0ZW5hYmxlQ2FjaGluZzogYm9vbGVhbixcblx0XHRwcm9jZXNzZWRJdGVtVHlwZU1hcDogSXRlbVR5cGVNYXA8Ym9vbGVhbj4sXG5cdCkge1xuXHRcdGlmIChwcm9jZXNzZWRJdGVtVHlwZU1hcFtpdGVtVHlwZV0gPT09IHRydWUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRwcm9jZXNzZWRJdGVtVHlwZU1hcFtpdGVtVHlwZV0gPSB0cnVlO1xuXG5cdFx0Zm9yIChjb25zdCBjb2x1bW5JZCBpbiByZXNwb25zZUNvbHVtbnNbaXRlbVR5cGVdKSB7XG5cdFx0XHRjb25zdCByZXNwb25zZUNvbHVtbiA9IHJlc3BvbnNlQ29sdW1uc1tpdGVtVHlwZV1bY29sdW1uSWRdO1xuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVuYWJsZUNhY2hpbmcpIHtcblx0XHRcdFx0dGhpcy5jb2x1bW5IYW5kbGVyLnNldENvbHVtbihcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0XHRyZXNwb25zZUNvbHVtbixcblx0XHRcdFx0KTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdID09PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cm9vdENvbHVtbk1hcFtjb2x1bW5JZF0gPSB7XG5cdFx0XHRcdFx0YXBpQ29sdW1uOiByZXNwb25zZUNvbHVtbixcblx0XHRcdFx0XHRjaGlsZHJlbjoge30sXG5cdFx0XHRcdH07XG5cdFx0XHR9XG5cblx0XHRcdGlmIChcblx0XHRcdFx0IXRoaXMuY29sdW1uVXRpbC5pc0l0ZW1Db2x1bW4oXG5cdFx0XHRcdFx0cmVzcG9uc2VDb2x1bW4sXG5cdFx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdClcblx0XHRcdCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0Y29uc3QgY2hpbGRyZW4gPSByZXNwb25zZUNvbHVtbnNbcmVzcG9uc2VDb2x1bW4uaXRlbVR5cGVdO1xuXG5cdFx0XHRpZiAoXG5cdFx0XHRcdGNoaWxkcmVuID09PSB1bmRlZmluZWRcblx0XHRcdFx0fHwgIWhhc1Byb3BlcnRpZXMoY2hpbGRyZW4pXG5cdFx0XHQpIHtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcEZyb21SZXNwb25zZUNvbHVtbnMoXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1uLml0ZW1UeXBlLFxuXHRcdFx0XHRyZXNwb25zZUNvbHVtbnMsXG5cdFx0XHRcdHJvb3RDb2x1bW5NYXBbY29sdW1uSWRdLmNoaWxkcmVuLFxuXHRcdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdFx0XHRwcm9jZXNzZWRJdGVtVHlwZU1hcCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0Ly8gd2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgcmVxdWVzdGNvbHVtbnMgZG9lcyAqbm90KiBlcXVhbCAndHJ1ZScsIGFuZCBtaWdodCBjb250YWluIGRlcml2ZWQgY29sdW1uc1xuXHRwcml2YXRlIHByb2Nlc3NSZXF1ZXN0Q29sdW1ucyAoXG5cdFx0Y29sdW1uU2V0OiBDb2x1bW5TZXQsXG5cdFx0cmVzcG9uc2VDb2x1bW5zOiBSZXNwb25zZUNvbHVtbkl0ZW1UeXBlTWFwLFxuXHRcdGVuYWJsZUNhY2hpbmc6IGJvb2xlYW4sXG5cdFx0aW5jbHVkZUlkQ29sdW1uOiBib29sZWFuLFxuXHQpOiBDb2x1bW5TZXQge1xuXHRcdGNvbnN0IGl0ZW1UeXBlID0gY29sdW1uU2V0Lml0ZW1UeXBlO1xuXHRcdGNvbnN0IHJvb3RDb2x1bW5NYXA6IFJvb3RDb2x1bW5NYXAgPSB7fTtcblxuXHRcdHRoaXMuZXhwYW5kUm9vdENvbHVtbk1hcChcblx0XHRcdGNvbHVtblNldC5yZXF1ZXN0IGFzIEFwaVJlcXVlc3RDb2x1bW5bXSwgLy8gd2UgY2FuIGFzc3VtZSByZXF1ZXN0Q29sdW1ucyBpcyBhbiBhcnJheSBoZXJlXG5cdFx0XHRpdGVtVHlwZSxcblx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdHJvb3RDb2x1bW5NYXAsXG5cdFx0XHRlbmFibGVDYWNoaW5nLFxuXHRcdCk7XG5cblx0XHRpZiAoaW5jbHVkZUlkQ29sdW1uKSB7XG5cdFx0XHR0aGlzLmV4cGFuZFJvb3RDb2x1bW5NYXAoXG5cdFx0XHRcdFsnaWQnXSxcblx0XHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0cm9vdENvbHVtbk1hcCxcblx0XHRcdFx0ZW5hYmxlQ2FjaGluZyxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29sdW1uU2V0LnJlc3BvbnNlID0ge307XG5cblx0XHR0aGlzLnByb2Nlc3NDb2x1bW5JbmZvKFxuXHRcdFx0Y29sdW1uU2V0LFxuXHRcdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeS5jb25zdHJ1Y3RGcm9tUm9vdE1hcChyb290Q29sdW1uTWFwKSxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4gY29sdW1uU2V0O1xuXHR9XG5cblx0cHJpdmF0ZSBwcm9jZXNzQ29sdW1uSW5mbyAoXG5cdFx0Y29sdW1uU2V0OiBDb2x1bW5TZXQsXG5cdFx0Y29sdW1uSW5mb09iamVjdHM6IENvbHVtbkluZm9bXSxcblx0XHRpdGVtVHlwZTogSXRlbVR5cGUsXG5cdCk6IHZvaWQge1xuXHRcdGNvbnN0IHJlc3BvbnNlID0gY29sdW1uU2V0LnJlc3BvbnNlO1xuXG5cdFx0aWYgKHJlc3BvbnNlW2l0ZW1UeXBlXSA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXNwb25zZVtpdGVtVHlwZV0gPSB7fTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IGNvbHVtbkluZm8gb2YgY29sdW1uSW5mb09iamVjdHMpIHtcblx0XHRcdHJlc3BvbnNlW2l0ZW1UeXBlXVtjb2x1bW5JbmZvLmlkXSA9IGNvbHVtbkluZm8uYXBpQ29sdW1uO1xuXHRcdFx0Y29sdW1uU2V0Lmdyb3VwQ29sdW1uSW5mbyhjb2x1bW5JbmZvKTtcblxuXHRcdFx0aWYgKCFjb2x1bW5JbmZvLmlzTGVhZikge1xuXHRcdFx0XHR0aGlzLnByb2Nlc3NDb2x1bW5JbmZvKFxuXHRcdFx0XHRcdGNvbHVtblNldCxcblx0XHRcdFx0XHRjb2x1bW5JbmZvLmNoaWxkcmVuLFxuXHRcdFx0XHRcdGNvbHVtbkluZm8uaXRlbVR5cGUsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBleHBhbmRSb290Q29sdW1uTWFwIChcblx0XHRyZXF1ZXN0Q29sdW1uczogQXBpUmVxdWVzdENvbHVtbltdLFxuXHRcdGl0ZW1UeXBlOiBJdGVtVHlwZSxcblx0XHRyZXNwb25zZUNvbHVtbnM6IFJlc3BvbnNlQ29sdW1uSXRlbVR5cGVNYXAsXG5cdFx0cm9vdENvbHVtbk1hcDogUm9vdENvbHVtbk1hcCxcblx0XHRlbmFibGVDYWNoaW5nOiBib29sZWFuLFxuXHQpOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHJlcXVlc3RDb2x1bW4gb2YgcmVxdWVzdENvbHVtbnMpIHtcblx0XHRcdGNvbnN0IHtpZDogY29sdW1uSWQsIGNoaWxkcmVufSA9IHRoaXMuY29sdW1uVXRpbC5wYXJzZVJlcXVlc3RDb2x1bW4ocmVxdWVzdENvbHVtbik7XG5cblx0XHRcdGxldCByZXNwb25zZUNvbHVtbjtcblxuXHRcdFx0aWYgKHJlc3BvbnNlQ29sdW1uc1tpdGVtVHlwZV0gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyZXNwb25zZUNvbHVtbiA9IHJlc3BvbnNlQ29sdW1uc1tpdGVtVHlwZV1bY29sdW1uSWRdO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocmVzcG9uc2VDb2x1bW4gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRjb25zb2xlLndhcm4oXG5cdFx0XHRcdFx0J05vIGFwaSBjb2x1bW4gZm9yIHJlcXVlc3QgY29sdW1uJyxcblx0XHRcdFx0XHRjb2x1bW5JZCxcblx0XHRcdFx0XHQnZm9yIGl0ZW1UeXBlJyxcblx0XHRcdFx0XHRpdGVtVHlwZSxcblx0XHRcdFx0KTtcblxuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGVuYWJsZUNhY2hpbmcpIHtcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW4gPSB0aGlzLmNvbHVtbkhhbmRsZXIuc2V0Q29sdW1uKFxuXHRcdFx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0XHRcdHJlc3BvbnNlQ29sdW1uLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAocm9vdENvbHVtbk1hcFtjb2x1bW5JZF0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRyb290Q29sdW1uTWFwW2NvbHVtbklkXSA9IHtcblx0XHRcdFx0XHRhcGlDb2x1bW46IHJlc3BvbnNlQ29sdW1uLFxuXHRcdFx0XHRcdGNoaWxkcmVuOiB7fSxcblx0XHRcdFx0fTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKGNoaWxkcmVuLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0XHRjb250aW51ZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5leHBhbmRSb290Q29sdW1uTWFwKFxuXHRcdFx0XHRjaGlsZHJlbixcblx0XHRcdFx0cmVzcG9uc2VDb2x1bW4uaXRlbVR5cGUsXG5cdFx0XHRcdHJlc3BvbnNlQ29sdW1ucyxcblx0XHRcdFx0cm9vdENvbHVtbk1hcFtjb2x1bW5JZF0uY2hpbGRyZW4sXG5cdFx0XHRcdGVuYWJsZUNhY2hpbmcsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uU3Vic2V0Q2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IEFwaVJlcXVlc3RDb2x1bW5zLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENvbHVtblN1YnNldENhY2hlRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yICgpIHt9XG5cblx0Y29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAocmVxdWVzdENvbHVtbnM6IEFwaVJlcXVlc3RDb2x1bW5zKTogQ29sdW1uU3Vic2V0Q2FjaGU8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBDb2x1bW5TdWJzZXRDYWNoZTxJdGVtVHlwZVR5cGU+KHJlcXVlc3RDb2x1bW5zKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBDcmVhdGVDb21waWxhdGlvbiwgQ3JlYXRlUmVxdWVzdCwgS2V5U2VydmljZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvdHJhbnNhY3Rpb24vVHJhbnNhY3Rpb25DYWNoZSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQgeyBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIENyZWF0ZVJlcXVlc3RGYWN0b3J5IHtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcml2YXRlIGtleVNlcnZpY2U6IEtleVNlcnZpY2UsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdCkge1xuXG5cdH1cblxuXHRjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRjb21waWxhdGlvbjogQ3JlYXRlQ29tcGlsYXRpb24sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0YnJlYWt1cEJ5UGFyZW50PzogYm9vbGVhbixcblx0KTogQ3JlYXRlUmVxdWVzdDxJdGVtVHlwZVR5cGU+IHtcblx0XHRyZXR1cm4gbmV3IENyZWF0ZVJlcXVlc3QoXG5cdFx0XHR0aGlzLmFwaUZvcm1hdHRlcixcblx0XHRcdHRoaXMua2V5U2VydmljZSxcblx0XHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRjb21waWxhdGlvbixcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0YnJlYWt1cEJ5UGFyZW50LFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEl0ZW1DYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQWJzdHJhY3RDYWNoZSB9IGZyb20gJy4uL2NsYXNzZXMvY2FjaGUvQWJzdHJhY3RDYWNoZSc7XG5pbXBvcnQgeyBRdWVyeU1hdGNoZXJGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcblxuZXhwb3J0IGNsYXNzIEl0ZW1DYWNoZUZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdCkge1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoXG5cdFx0dHJhbnNhY3Rpb246IEFic3RyYWN0Q2FjaGUsXG5cdCk6IEl0ZW1DYWNoZSB7XG5cdFx0cmV0dXJuIG5ldyBJdGVtQ2FjaGUoXG5cdFx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0cmFuc2FjdGlvbixcblx0XHQpO1xuXHR9XG5cdFxufVxuIiwiaW1wb3J0IHsgQXBpRm9ybWF0dGVyLCBDb2x1bW5TZXQsIEl0ZW1FbnRyeVNlcnZpY2UsIEtleVNlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IENvbHVtblNldEZhY3RvcnksIEl0ZW1SZXNvdXJjZUZhY3RvcnkgfSBmcm9tICcuLi9mYWN0b3JpZXMnO1xuaW1wb3J0IHsgQXV0aEludGVyZmFjZSwgRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEl0ZW1FbnRyeSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBJdGVtSWQsIEl0ZW1UeXBlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgSXRlbUVudHJ5RmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHB1YmxpYyBhdXRoSW50ZXJmYWNlOiBBdXRoSW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwdWJsaWMgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwdWJsaWMgZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwdWJsaWMgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0XHRwdWJsaWMgaXRlbVJlc291cmNlRmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRwdWJsaWMga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwdWJsaWMgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHQpIHtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtSWQ6IEl0ZW1JZCxcblx0XHRjb2x1bW5JbmZvOiBDb2x1bW5TZXQ8SXRlbVR5cGVUeXBlPixcblx0KTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4ge1xuXHRcdHJldHVybiBuZXcgSXRlbUVudHJ5KFxuXHRcdFx0dGhpcyxcblx0XHRcdGNvbHVtbkluZm8uaXRlbVR5cGUsXG5cdFx0XHRpdGVtSWQsXG5cdFx0XHRjb2x1bW5JbmZvLFxuXHRcdCk7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgQ29sdW1uVXRpbCwgTG9ja1NlcnZpY2UgfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuaW1wb3J0IHsgRXJyb3JIYW5kbGVySW50ZXJmYWNlLCBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLCBQcm9taXNlTGlicmFyeUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHsgTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9MaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UnO1xuaW1wb3J0IHtcblx0RWRpdFJlc291cmNlLFxuXHRJdGVtRW50cnksXG5cdEl0ZW1SZXNvdXJjZSxcblx0SXRlbVJlc291cmNlT3B0aW9ucyxcblx0TG9jYWxWaWV3UmVzb3VyY2UsXG5cdFJlbW90ZVZpZXdSZXNvdXJjZSxcbn0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEl0ZW1PcHRpb25zSW50ZXJmYWNlLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgUmVzb3VyY2VDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZSwgVCBleHRlbmRzIEl0ZW1SZXNvdXJjZTxJdGVtVHlwZVR5cGU+PiA9IChpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+KSA9PiBUO1xuXG5leHBvcnQgY2xhc3MgSXRlbVJlc291cmNlRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHB1YmxpYyBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwdWJsaWMgbG9ja1NlcnZpY2U6IExvY2tTZXJ2aWNlLFxuXHRcdHB1YmxpYyBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwdWJsaWMgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBleGNlcHRpb25IYW5kbGVyOiBFeGNlcHRpb25IYW5kbGVySW50ZXJmYWNlLFxuXHRcdHB1YmxpYyBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsLFxuXHRcdHB1YmxpYyBsaW5rVHJlZVNlcnZpY2U6IExpbmtUcmVlU2VydmljZUludGVyZmFjZSxcblx0KSB7XG5cdH1cblxuXHRwdWJsaWMgZ2V0Q29uc3RydWN0b3I8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogUmVzb3VyY2VDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUsIEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+PjtcblxuXHRwdWJsaWMgZ2V0Q29uc3RydWN0b3I8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtyZW1vdGU6IHRydWV9LFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBSZXNvdXJjZUNvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSwgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4+O1xuXG5cdHB1YmxpYyBnZXRDb25zdHJ1Y3RvcjxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHQpOiBSZXNvdXJjZUNvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSwgTG9jYWxWaWV3UmVzb3VyY2U8SXRlbVR5cGVUeXBlPj47XG5cblx0cHVibGljIGdldENvbnN0cnVjdG9yPEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdCk6IFJlc291cmNlQ29uc3RydWN0b3I8SXRlbVR5cGVUeXBlLCBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPj4ge1xuXHRcdGNvbnN0IG9wdGlvbnNJbnN0YW5jZSA9IG5ldyBJdGVtUmVzb3VyY2VPcHRpb25zKG9wdGlvbnMpO1xuXG5cdFx0cmV0dXJuIChcblx0XHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0KSA9PiB7XG5cdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RXaXRoT3B0aW9uczxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0XHRpdGVtRW50cnksXG5cdFx0XHRcdG9wdGlvbnNJbnN0YW5jZSxcblx0XHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHQpO1xuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0PEl0ZW1UeXBlVHlwZSBleHRlbmRzIEl0ZW1UeXBlPiAoXG5cdFx0aXRlbUVudHJ5OiBJdGVtRW50cnk8SXRlbVR5cGVUeXBlPixcblx0XHRvcHRpb25zOiBJdGVtT3B0aW9uc0ludGVyZmFjZSAmIHtlZGl0OiB0cnVlfSxcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRpc05ldz86IGJvb2xlYW4sXG5cdCk6IEVkaXRSZXNvdXJjZTxJdGVtVHlwZVR5cGU+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlICYge3JlbW90ZTogdHJ1ZX0sXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpOiBMb2NhbFZpZXdSZXNvdXJjZTxJdGVtVHlwZVR5cGU+O1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1PcHRpb25zSW50ZXJmYWNlLFxuXHRcdHRyYW5zYWN0aW9uOiBUcmFuc2FjdGlvbkNhY2hlLFxuXHRcdGlzTmV3PzogYm9vbGVhbixcblx0KTogUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT47XG5cblx0cHVibGljIGNvbnN0cnVjdDxJdGVtVHlwZVR5cGUgZXh0ZW5kcyBJdGVtVHlwZT4gKFxuXHRcdGl0ZW1FbnRyeTogSXRlbUVudHJ5PEl0ZW1UeXBlVHlwZT4sXG5cdFx0b3B0aW9uczogSXRlbU9wdGlvbnNJbnRlcmZhY2UsXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0aXNOZXc/OiBib29sZWFuLFxuXHQpOiBJdGVtUmVzb3VyY2U8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIHRoaXMuY29uc3RydWN0V2l0aE9wdGlvbnMoXG5cdFx0XHRpdGVtRW50cnksXG5cdFx0XHRuZXcgSXRlbVJlc291cmNlT3B0aW9ucyhvcHRpb25zKSxcblx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0aXNOZXcsXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgY29uc3RydWN0V2l0aE9wdGlvbnM8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtRW50cnk6IEl0ZW1FbnRyeTxJdGVtVHlwZVR5cGU+LFxuXHRcdG9wdGlvbnM6IEl0ZW1SZXNvdXJjZU9wdGlvbnMsXG5cdFx0dHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uQ2FjaGUsXG5cdFx0aXNOZXc6IGJvb2xlYW4gPSBmYWxzZSxcblx0KTogSXRlbVJlc291cmNlPEl0ZW1UeXBlVHlwZT4ge1xuXHRcdGlmIChvcHRpb25zLmVkaXQpIHtcblx0XHRcdHJldHVybiBuZXcgRWRpdFJlc291cmNlPEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0aXNOZXcsXG5cdFx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5yZW1vdGUpIHtcblx0XHRcdHJldHVybiBuZXcgUmVtb3RlVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHRcdHRoaXMsXG5cdFx0XHRcdGl0ZW1FbnRyeSxcblx0XHRcdFx0b3B0aW9ucyxcblx0XHRcdFx0aXNOZXcsXG5cdFx0XHRcdHRyYW5zYWN0aW9uLFxuXHRcdFx0KTtcblx0XHR9XG5cblx0XHRyZXR1cm4gbmV3IExvY2FsVmlld1Jlc291cmNlPEl0ZW1UeXBlVHlwZT4oXG5cdFx0XHR0aGlzLFxuXHRcdFx0aXRlbUVudHJ5LFxuXHRcdFx0b3B0aW9ucyxcblx0XHRcdGlzTmV3LFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0KTtcblx0fVxufVxuIiwiaW1wb3J0IHtcblx0QXBpRm9ybWF0dGVyLFxuXHRBcGlSZXF1ZXN0U2VydmljZSxcblx0Q29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0Q29sdW1uQ2FjaGUsXG5cdENvbHVtbkhhbmRsZXIsXG5cdENvbHVtblV0aWwsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdEtleVNlcnZpY2UsXG5cdExvY2tTZXJ2aWNlLFxuXHRRdWVyeVNlcnZpY2UsXG59IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgU2VydmVyQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3NlcnZlci9TZXJ2ZXJDYWNoZSc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IFJlcXVlc3RCdWZmZXJNYW5hZ2VyIH0gZnJvbSAnLi4vY2xhc3Nlcy9SZXF1ZXN0QnVmZmVyTWFuYWdlcic7XG5pbXBvcnQgeyBUZW1wbGF0ZUNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9UZW1wbGF0ZUNhY2hlJztcbmltcG9ydCB7IFJtQ29yZSB9IGZyb20gJy4uL2NvcmUnO1xuaW1wb3J0IHtcblx0Q29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0Q29sbGVjdGlvbkVudHJ5RmFjdG9yeSxcblx0Q29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRDb2x1bW5TZXRGYWN0b3J5LFxuXHRDb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG59IGZyb20gJy4uL2ZhY3Rvcmllcyc7XG5pbXBvcnQge1xuXHRBdXRoSW50ZXJmYWNlLFxuXHRFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxufSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IExpbmtUcmVlU2VydmljZUludGVyZmFjZSB9IGZyb20gJy4uL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuL0NoYW5nZXNEZWx0YUZhY3RvcnknO1xuaW1wb3J0IHsgQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnkgfSBmcm9tICcuL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5JztcblxuZXhwb3J0IGNsYXNzIFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5IHtcblxuXHRwcml2YXRlIHJlYWRvbmx5IHNlcnZlckNhY2hlOiBTZXJ2ZXJDYWNoZTtcblxuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb3JlOiBSbUNvcmUsXG5cdFx0cHJpdmF0ZSBjb2x1bW5DYWNoZTogQ29sdW1uQ2FjaGUsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0QnVmZmVyTWFuYWdlcjogUmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0cHJpdmF0ZSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTogUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBxdWVyeU1hdGNoZXJGYWN0b3J5OiBRdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdHByaXZhdGUgYXV0aEludGVyZmFjZTogQXV0aEludGVyZmFjZSxcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeTogQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBsb2NrU2VydmljZTogTG9ja1NlcnZpY2UsXG5cdFx0cHJpdmF0ZSBtb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvblJlc291cmNlRmFjdG9yeTogQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRwcml2YXRlIGl0ZW1SZXNvdXJjZUZhY3Rvcnk6IEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSB0ZW1wbGF0ZUNhY2hlOiBUZW1wbGF0ZUNhY2hlLFxuXHRcdHByaXZhdGUgaXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk6IENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBlcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0XHRwcml2YXRlIGV4Y2VwdGlvbkhhbmRsZXI6IEV4Y2VwdGlvbkhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBwcm9taXNlU2VydmljZTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0cHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlcixcblx0XHRwcml2YXRlIGFwaVJlcXVlc3RTZXJ2aWNlOiBBcGlSZXF1ZXN0U2VydmljZSxcblx0XHRwcml2YXRlIGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2x1bW5IYW5kbGVyOiBDb2x1bW5IYW5kbGVyLFxuXHRcdHByaXZhdGUgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwcml2YXRlIGNvbHVtblN1YnNldENhY2hlRmFjdG9yeTogQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0XHRwcml2YXRlIGl0ZW1FbnRyeUZhY3Rvcnk6IEl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBpdGVtRW50cnlTZXJ2aWNlOiBJdGVtRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUga2V5U2VydmljZTogS2V5U2VydmljZSxcblx0XHRwcml2YXRlIGNvbGxlY3Rpb25FbnRyeUZhY3Rvcnk6IENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlOiBDb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5OiBDb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0cHJpdmF0ZSBxdWVyeVBhcnNlckZhY3Rvcnk6IFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRwcml2YXRlIHF1ZXJ5U2VydmljZTogUXVlcnlTZXJ2aWNlLFxuXHRcdHByaXZhdGUgbGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHRcdHRoaXMuc2VydmVyQ2FjaGUgPSBuZXcgU2VydmVyQ2FjaGUoXG5cdFx0XHR0aGlzLmNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb3JlLFxuXHRcdFx0dGhpcy5jb2x1bW5DYWNoZSxcblx0XHRcdHRoaXMucmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5xdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0dGhpcy5hdXRoSW50ZXJmYWNlLFxuXHRcdFx0dGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0dGhpcy5sb2NrU2VydmljZSxcblx0XHRcdHRoaXMubW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0XHRcdHRoaXMuaXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRcdHRoaXMudGVtcGxhdGVDYWNoZSxcblx0XHRcdHRoaXMuaXRlbUNhY2hlRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRcdHRoaXMuZXJyb3JIYW5kbGVyLFxuXHRcdFx0dGhpcy5leGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0dGhpcy5wcm9taXNlU2VydmljZSxcblx0XHRcdHRoaXMuYXBpRm9ybWF0dGVyLFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uSGFuZGxlcixcblx0XHRcdHRoaXMuY29sdW1uU2V0RmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2x1bW5VdGlsLFxuXHRcdFx0dGhpcy5pdGVtRW50cnlGYWN0b3J5LFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5rZXlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlGYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnksXG5cdFx0XHR0aGlzLnF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0XHRcdHRoaXMucXVlcnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5saW5rVHJlZVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBUb2RvW2NhY2hlXSBTdG9yZSBhIG1hcCBvZiBhbGwgdHJhbnNhY3Rpb25zIGJ5IHRyYW5zYWN0aW9uIGlkID9cblx0ICovXG5cdHB1YmxpYyBnZXRCeUlkIChpZDogc3RyaW5nKTogVHJhbnNhY3Rpb25DYWNoZSB8IHVuZGVmaW5lZCB7XG5cdFx0Y29uc3QgZmluZENoaWxkID0gKGNoaWxkcmVuOiBUcmFuc2FjdGlvbkNhY2hlW10pID0+IHtcblx0XHRcdGZvciAoY29uc3QgdHJhbnNhY3Rpb24gb2YgY2hpbGRyZW4pIHtcblx0XHRcdFx0aWYgKHRyYW5zYWN0aW9uLmlkID09PSBpZCkge1xuXHRcdFx0XHRcdHJldHVybiB0cmFuc2FjdGlvbjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGNoaWxkUmVzdWx0ID0gZmluZENoaWxkKHRyYW5zYWN0aW9uLmNoaWxkcmVuKTtcblxuXHRcdFx0XHRpZiAoY2hpbGRSZXN1bHQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybiBjaGlsZFJlc3VsdDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH07XG5cblx0XHRyZXR1cm4gZmluZENoaWxkKHRoaXMuc2VydmVyQ2FjaGUuY2hpbGRyZW4pO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdCAoaWQ/OiBzdHJpbmcpOiBUcmFuc2FjdGlvbkNhY2hlIHtcblx0XHRyZXR1cm4gdGhpcy5zZXJ2ZXJDYWNoZS5jcmVhdGVDaGlsZChpZCk7XG5cdH1cblxuXHQvKkBpbnRlcm5hbCovXG5cdHB1YmxpYyBnZXRTZXJ2ZXJDYWNoZSAoKTogU2VydmVyQ2FjaGUge1xuXHRcdHJldHVybiB0aGlzLnNlcnZlckNhY2hlO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBNb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb24gfSBmcm9tICcuLi9jbGFzc2VzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ2FjaGUgfSBmcm9tICcuLi9jbGFzc2VzL2NhY2hlL3RyYW5zYWN0aW9uL1RyYW5zYWN0aW9uQ2FjaGUnO1xuXG5leHBvcnQgY2xhc3MgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0KTogTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uIHtcblx0XHRyZXR1cm4gbmV3IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbih0cmFuc2FjdGlvbik7XG5cdH1cbn1cbiIsImltcG9ydCB7IEFwaUZvcm1hdHRlciwgUXVlcnlNYXRjaGVyIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBFbnRyeVBhcmVudE51bGwsIEZpZWxkTWFwLCBJdGVtVHlwZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5TWF0Y2hlckZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBhcGlGb3JtYXR0ZXI6IEFwaUZvcm1hdHRlclxuXHQpIHtcblxuXHR9XG5cblx0Y29uc3RydWN0IChpdGVtVHlwZTogSXRlbVR5cGUsIGZpZWxkczogRmllbGRNYXAsIHBhcmVudDogRW50cnlQYXJlbnROdWxsKTogUXVlcnlNYXRjaGVyIHtcblx0XHRyZXR1cm4gbmV3IFF1ZXJ5TWF0Y2hlcihcblx0XHRcdHRoaXMuYXBpRm9ybWF0dGVyLFxuXHRcdFx0aXRlbVR5cGUsXG5cdFx0XHRmaWVsZHMsXG5cdFx0XHRwYXJlbnRcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBRdWVyeVBhcnNlciB9IGZyb20gJy4uL2NsYXNzZXMnO1xuaW1wb3J0IHsgQXBpUXVlcnkgfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBRdWVyeVBhcnNlckZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoKSB7XG5cdH1cblxuXHRjb25zdHJ1Y3QgKHF1ZXJ5OiBBcGlRdWVyeSwgcGFyYW1ldGVycz86IGFueSk6IFF1ZXJ5UGFyc2VyIHtcblx0XHRyZXR1cm4gbmV3IFF1ZXJ5UGFyc2VyKHF1ZXJ5LCBwYXJhbWV0ZXJzKTtcblx0fVxufVxuIiwiaW1wb3J0IHsgQ29sdW1uVXRpbCwgUmVxdWVzdENvbHVtbkV4cGFuc2lvbiB9IGZyb20gJy4uL2NsYXNzZXMnO1xuXG5leHBvcnQgY2xhc3MgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnkge1xuXHRjb25zdHJ1Y3RvciAoXG5cdFx0cHJpdmF0ZSBjb2x1bW5VdGlsOiBDb2x1bW5VdGlsXG5cdCkge1xuXHR9XG5cblx0Y29uc3RydWN0ICgpOiBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uIHtcblx0XHRyZXR1cm4gbmV3IFJlcXVlc3RDb2x1bW5FeHBhbnNpb24oXG5cdFx0XHR0aGlzLmNvbHVtblV0aWxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBDb2x1bW5VdGlsIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDb2x1bW5TZXRGYWN0b3J5IH0gZnJvbSAnLi4vZmFjdG9yaWVzJztcbmltcG9ydCB7IFRlbXBsYXRlIH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IEFwaVJlc3BvbnNlLCBJdGVtVHlwZSwgUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlRmFjdG9yeSB7XG5cdGNvbnN0cnVjdG9yIChcblx0XHRwdWJsaWMgY29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeSxcblx0XHRwdWJsaWMgY29sdW1uVXRpbDogQ29sdW1uVXRpbCxcblx0KSB7XG5cdH1cblxuXHRjb25zdHJ1Y3Q8SXRlbVR5cGVUeXBlIGV4dGVuZHMgSXRlbVR5cGU+IChcblx0XHRpdGVtVHlwZTogSXRlbVR5cGVUeXBlLFxuXHRcdHJlc3BvbnNlOiBBcGlSZXNwb25zZSxcblx0XHRhZGRpdGlvbmFsQ29sdW1uczogUmVzcG9uc2VDb2x1bW5JdGVtVHlwZU1hcCxcblx0KTogVGVtcGxhdGU8SXRlbVR5cGVUeXBlPiB7XG5cdFx0cmV0dXJuIG5ldyBUZW1wbGF0ZTxJdGVtVHlwZVR5cGU+KFxuXHRcdFx0dGhpcyxcblx0XHRcdGl0ZW1UeXBlLFxuXHRcdFx0cmVzcG9uc2UsXG5cdFx0XHRhZGRpdGlvbmFsQ29sdW1ucyxcblx0XHQpO1xuXHR9XG59XG4iLCJpbXBvcnQgeyBJdGVtRW50cnlTZXJ2aWNlIH0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBDaGFuZ2VzRGVsdGEgfSBmcm9tICcuLi9jbGFzc2VzL0NoYW5nZXNEZWx0YSc7XG5pbXBvcnQgeyBJbnRlcm5hbENoYW5nZXNEZWx0YSB9IGZyb20gJy4uL2NsYXNzZXMvSW50ZXJuYWxDaGFuZ2VzRGVsdGEnO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc0RlbHRhRmFjdG9yeSB7XG5cblx0Y29uc3RydWN0b3IgKFxuXHRcdHByaXZhdGUgaXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZSxcblx0KSB7XG5cblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3QgKCk6IENoYW5nZXNEZWx0YSB7XG5cdFx0cmV0dXJuIG5ldyBDaGFuZ2VzRGVsdGEoXG5cdFx0XHR0aGlzLml0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblx0fVxuXG5cdC8qQGludGVybmFsKi9cblx0cHVibGljIGNvbnN0cnVjdEludGVybmFsRGVsdGEgKCk6IEludGVybmFsQ2hhbmdlc0RlbHRhIHtcblx0XHRyZXR1cm4gbmV3IEludGVybmFsQ2hhbmdlc0RlbHRhKFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdCk7XG5cdH1cblxufVxuIiwiaW1wb3J0IHtcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENoYW5nZXNQcm9jZXNzb3IsXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdEl0ZW1FbnRyeVNlcnZpY2UsXG5cdE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcbn0gZnJvbSAnLi4vY2xhc3Nlcyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvbkNhY2hlIH0gZnJvbSAnLi4vY2xhc3Nlcy9jYWNoZS90cmFuc2FjdGlvbi9UcmFuc2FjdGlvbkNhY2hlJztcbmltcG9ydCB7IEVycm9ySGFuZGxlckludGVyZmFjZSwgUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgfSBmcm9tICcuL0NoYW5nZXNDb21waWxhdGlvbkZhY3RvcnknO1xuaW1wb3J0IHsgQ2hhbmdlc0RlbHRhRmFjdG9yeSB9IGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5pbXBvcnQgeyBDb2x1bW5FeHBhbnNpb25GYWN0b3J5IH0gZnJvbSAnLi9Db2x1bW5FeHBhbnNpb25GYWN0b3J5JztcbmltcG9ydCB7IENyZWF0ZVJlcXVlc3RGYWN0b3J5IH0gZnJvbSAnLi9DcmVhdGVSZXF1ZXN0RmFjdG9yeSc7XG5pbXBvcnQgeyBSZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSB9IGZyb20gJy4vUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnknO1xuXG5leHBvcnQgY2xhc3MgQ2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnkge1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRwcml2YXRlIGNoYW5nZXNEZWx0YUZhY3Rvcnk6IENoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0cHJpdmF0ZSBhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0cHJpdmF0ZSBjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sdW1uRXhwYW5zaW9uRmFjdG9yeTogQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRwcml2YXRlIGNyZWF0ZVJlcXVlc3RGYWN0b3J5OiBDcmVhdGVSZXF1ZXN0RmFjdG9yeSxcblx0XHRwcml2YXRlIGVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGVySW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcHJvbWlzZVNlcnZpY2U6IFByb21pc2VMaWJyYXJ5SW50ZXJmYWNlLFxuXHRcdHByaXZhdGUgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdHByaXZhdGUgY29sbGVjdGlvbkVudHJ5U2VydmljZTogQ29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRwcml2YXRlIGl0ZW1FbnRyeVNlcnZpY2U6IEl0ZW1FbnRyeVNlcnZpY2UsXG5cdCkge1xuXG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0IChcblx0XHR0cmFuc2FjdGlvbjogVHJhbnNhY3Rpb25DYWNoZSxcblx0XHRicmVha1VwQnlQYXJlbnQ/OiBib29sZWFuLFxuXHRcdG9uQWZ0ZXJDcmVhdGVDYWxsYmFjaz86IE9uQWZ0ZXJDcmVhdGVDYWxsYmFjayxcblx0KTogQ2hhbmdlc1Byb2Nlc3NvciB7XG5cdFx0cmV0dXJuIG5ldyBDaGFuZ2VzUHJvY2Vzc29yKFxuXHRcdFx0dGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0dGhpcy5hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdHRoaXMuY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdHRoaXMuY3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdFx0XHR0aGlzLmVycm9ySGFuZGxlcixcblx0XHRcdHRoaXMucHJvbWlzZVNlcnZpY2UsXG5cdFx0XHR0aGlzLnJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0dGhpcy5jb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0dGhpcy5pdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0dHJhbnNhY3Rpb24sXG5cdFx0XHRicmVha1VwQnlQYXJlbnQsXG5cdFx0XHRvbkFmdGVyQ3JlYXRlQ2FsbGJhY2ssXG5cdFx0KTtcblx0fVxufVxuIiwiZXhwb3J0ICogZnJvbSAnLi9BcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9DaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sbGVjdGlvbkNhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbGxlY3Rpb25FbnRyeUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uTWF0Y2hlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Db2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uRXhwYW5zaW9uRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtbkluZm9GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ29sdW1uU2V0RmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NvbHVtblN1YnNldENhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NyZWF0ZVJlcXVlc3RGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vSXRlbUNhY2hlRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0l0ZW1FbnRyeUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9JdGVtUmVzb3VyY2VGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi9Nb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vUXVlcnlNYXRjaGVyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1F1ZXJ5UGFyc2VyRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL1JlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vVGVtcGxhdGVGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vQ2hhbmdlc0RlbHRhRmFjdG9yeSc7XG5leHBvcnQgKiBmcm9tICcuL0NoYW5nZXNQcm9jZXNzb3JGYWN0b3J5JztcbiIsImltcG9ydCB7XG5cdEFwaUZvcm1hdHRlcixcblx0QXBpUmVxdWVzdFNlcnZpY2UsXG5cdENvbGxlY3Rpb25FbnRyeVNlcnZpY2UsXG5cdENvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UsXG5cdENvbHVtbkNhY2hlLFxuXHRDb2x1bW5IYW5kbGVyLFxuXHRDb2x1bW5VdGlsLFxuXHRJdGVtRW50cnlTZXJ2aWNlLFxuXHRLZXlTZXJ2aWNlLFxuXHRMb2NrU2VydmljZSxcblx0UXVlcnlTZXJ2aWNlLFxuXHRTb2NrZXRNZXNzYWdlSGFuZGxlcixcbn0gZnJvbSAnLi9jbGFzc2VzJztcbmltcG9ydCB7IFJlcXVlc3RCdWZmZXJNYW5hZ2VyIH0gZnJvbSAnLi9jbGFzc2VzL1JlcXVlc3RCdWZmZXJNYW5hZ2VyJztcbmltcG9ydCB7IFRlbXBsYXRlQ2FjaGUgfSBmcm9tICcuL2NsYXNzZXMvVGVtcGxhdGVDYWNoZSc7XG5pbXBvcnQge1xuXHRBcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnksXG5cdENoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdENvbGxlY3Rpb25DYWNoZUZhY3RvcnksXG5cdENvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdENvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeSxcblx0Q29sbGVjdGlvblJlc291cmNlRmFjdG9yeSxcblx0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0Q29sdW1uSW5mb0ZhY3RvcnksXG5cdENvbHVtblNldEZhY3RvcnksXG5cdENvbHVtblN1YnNldENhY2hlRmFjdG9yeSxcblx0Q3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdEl0ZW1DYWNoZUZhY3RvcnksXG5cdEl0ZW1FbnRyeUZhY3RvcnksXG5cdEl0ZW1SZXNvdXJjZUZhY3RvcnksXG5cdE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFF1ZXJ5TWF0Y2hlckZhY3RvcnksXG5cdFF1ZXJ5UGFyc2VyRmFjdG9yeSxcblx0UmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFRlbXBsYXRlRmFjdG9yeSxcblx0VHJhbnNhY3Rpb25DYWNoZUZhY3RvcnksXG59IGZyb20gJy4vZmFjdG9yaWVzJztcbmltcG9ydCB7IENoYW5nZXNEZWx0YUZhY3RvcnkgfSBmcm9tICcuL2ZhY3Rvcmllcy9DaGFuZ2VzRGVsdGFGYWN0b3J5JztcbmltcG9ydCB7IENoYW5nZXNQcm9jZXNzb3JGYWN0b3J5IH0gZnJvbSAnLi9mYWN0b3JpZXMvQ2hhbmdlc1Byb2Nlc3NvckZhY3RvcnknO1xuaW1wb3J0IHtcblx0QXBpUmVxdWVzdFNlcnZpY2VJbnRlcmZhY2UsXG5cdEF1dGhJbnRlcmZhY2UsXG5cdEVycm9ySGFuZGxlckludGVyZmFjZSxcblx0RXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0UHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG59IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvTGlua1RyZWVTZXJ2aWNlSW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIFJtQ29yZSB7XG5cdHZlcnNpb246IHN0cmluZyA9ICcyLjAuMyc7XG5cdG5vb3AgPSBub29wO1xuXG5cdGFwaUZvcm1hdHRlcjogQXBpRm9ybWF0dGVyO1xuXHRhcGlSZXF1ZXN0U2VydmljZTogQXBpUmVxdWVzdFNlcnZpY2U7XG5cdGFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeTogQXBpUmVzcG9uc2VQcm9jZXNzb3JGYWN0b3J5O1xuXHRjaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5OiBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5O1xuXHRjaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeTogQ2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk7XG5cdGNvbGxlY3Rpb25DYWNoZUZhY3Rvcnk6IENvbGxlY3Rpb25DYWNoZUZhY3Rvcnk7XG5cdGNvbGxlY3Rpb25FbnRyeUZhY3Rvcnk6IENvbGxlY3Rpb25FbnRyeUZhY3Rvcnk7XG5cdGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U6IENvbGxlY3Rpb25FbnRyeVNlcnZpY2U7XG5cdGNvbGxlY3Rpb25NYXRjaGVyRmFjdG9yeTogQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5O1xuXHRjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5OiBDb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5O1xuXHRjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlOiBDb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlO1xuXHRjb2x1bW5DYWNoZTogQ29sdW1uQ2FjaGU7XG5cdGNvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk7XG5cdGNvbHVtbkhhbmRsZXI6IENvbHVtbkhhbmRsZXI7XG5cdGNvbHVtbkluZm9GYWN0b3J5OiBDb2x1bW5JbmZvRmFjdG9yeTtcblx0Y29sdW1uU2V0RmFjdG9yeTogQ29sdW1uU2V0RmFjdG9yeTtcblx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5OiBDb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk7XG5cdGNvbHVtblV0aWw6IENvbHVtblV0aWw7XG5cdGNyZWF0ZVJlcXVlc3RGYWN0b3J5OiBDcmVhdGVSZXF1ZXN0RmFjdG9yeTtcblx0aXRlbUNhY2hlRmFjdG9yeTogSXRlbUNhY2hlRmFjdG9yeTtcblx0aXRlbUVudHJ5RmFjdG9yeTogSXRlbUVudHJ5RmFjdG9yeTtcblx0aXRlbUVudHJ5U2VydmljZTogSXRlbUVudHJ5U2VydmljZTtcblx0aXRlbVJlc291cmNlRmFjdG9yeTogSXRlbVJlc291cmNlRmFjdG9yeTtcblx0a2V5U2VydmljZTogS2V5U2VydmljZTtcblx0dHJhbnNhY3Rpb25DYWNoZUZhY3Rvcnk6IFRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5O1xuXHRsb2NrU2VydmljZTogTG9ja1NlcnZpY2U7XG5cdG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk6IE1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3Rvcnk7XG5cdHF1ZXJ5TWF0Y2hlckZhY3Rvcnk6IFF1ZXJ5TWF0Y2hlckZhY3Rvcnk7XG5cdHF1ZXJ5UGFyc2VyRmFjdG9yeTogUXVlcnlQYXJzZXJGYWN0b3J5O1xuXHRxdWVyeVNlcnZpY2U6IFF1ZXJ5U2VydmljZTtcblx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3Rvcnk6IFJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5O1xuXHRzb2NrZXRNZXNzYWdlSGFuZGxlcjogU29ja2V0TWVzc2FnZUhhbmRsZXI7XG5cdHRlbXBsYXRlRmFjdG9yeTogVGVtcGxhdGVGYWN0b3J5O1xuXHRjaGFuZ2VzRGVsdGFGYWN0b3J5OiBDaGFuZ2VzRGVsdGFGYWN0b3J5O1xuXHR0ZW1wbGF0ZUNhY2hlOiBUZW1wbGF0ZUNhY2hlO1xuXG5cdGNvbnN0cnVjdG9yIChcblx0XHRfYXBpUmVxdWVzdFNlcnZpY2U6IEFwaVJlcXVlc3RTZXJ2aWNlSW50ZXJmYWNlLFxuXHRcdGF1dGhJbnRlcmZhY2U6IEF1dGhJbnRlcmZhY2UsXG5cdFx0ZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsZXJJbnRlcmZhY2UsXG5cdFx0ZXhjZXB0aW9uSGFuZGxlcjogRXhjZXB0aW9uSGFuZGxlckludGVyZmFjZSxcblx0XHRwcm9taXNlTGlicmFyeTogUHJvbWlzZUxpYnJhcnlJbnRlcmZhY2UsXG5cdFx0bGlua1RyZWVTZXJ2aWNlOiBMaW5rVHJlZVNlcnZpY2VJbnRlcmZhY2UsXG5cdCkge1xuXHRcdC8vIENyZWF0ZSB2YXJpYWJsZXMgZm9yIGVhY2ggc2VydmljZSBpbiBvcmRlciB0byBnZXQgYSBUeXBlU2NyaXB0IGVycm9yIHdoZW4gYSBkZXBlbmRlbmN5IGhhc24ndCBiZWVuXG5cdFx0Ly8gaW5pdGlhbGl6ZWQgeWV0LlxuXHRcdGNvbnN0IGtleVNlcnZpY2UgPSBuZXcgS2V5U2VydmljZSgpO1xuXG5cdFx0Y29uc3QgaXRlbUVudHJ5U2VydmljZSA9IG5ldyBJdGVtRW50cnlTZXJ2aWNlKFxuXHRcdFx0YXV0aEludGVyZmFjZSxcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRsaW5rVHJlZVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNoYW5nZXNEZWx0YUZhY3RvcnkgPSBuZXcgQ2hhbmdlc0RlbHRhRmFjdG9yeShcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGFwaUZvcm1hdHRlciA9IG5ldyBBcGlGb3JtYXR0ZXIoKTtcblxuXHRcdGNvbnN0IGFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBBcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkoYXBpRm9ybWF0dGVyKTtcblx0XHRjb25zdCBhcGlSZXF1ZXN0U2VydmljZSA9IG5ldyBBcGlSZXF1ZXN0U2VydmljZShcblx0XHRcdF9hcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGFwaVJlc3BvbnNlUHJvY2Vzc29yRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgcXVlcnlNYXRjaGVyRmFjdG9yeSA9IG5ldyBRdWVyeU1hdGNoZXJGYWN0b3J5KGFwaUZvcm1hdHRlcik7XG5cdFx0Y29uc3QgcXVlcnlQYXJzZXJGYWN0b3J5ID0gbmV3IFF1ZXJ5UGFyc2VyRmFjdG9yeSgpO1xuXHRcdGNvbnN0IHF1ZXJ5U2VydmljZSA9IG5ldyBRdWVyeVNlcnZpY2UoKTtcblxuXHRcdGNvbnN0IGNvbHVtblV0aWwgPSBuZXcgQ29sdW1uVXRpbChcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY29sdW1uQ2FjaGUgPSBuZXcgQ29sdW1uQ2FjaGUoY29sdW1uVXRpbCk7XG5cdFx0Y29uc3QgY29sdW1uSGFuZGxlciA9IG5ldyBDb2x1bW5IYW5kbGVyKFxuXHRcdFx0YXBpUmVxdWVzdFNlcnZpY2UsXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdGNvbHVtbkNhY2hlLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHQpO1xuXHRcdGNvbnN0IGNvbHVtbkluZm9GYWN0b3J5ID0gbmV3IENvbHVtbkluZm9GYWN0b3J5KCk7XG5cdFx0Y29uc3QgY29sdW1uRXhwYW5zaW9uRmFjdG9yeSA9IG5ldyBDb2x1bW5FeHBhbnNpb25GYWN0b3J5KGNvbHVtbkluZm9GYWN0b3J5KTtcblxuXHRcdGNvbnN0IGNvbHVtblNldEZhY3RvcnkgPSBuZXcgQ29sdW1uU2V0RmFjdG9yeShcblx0XHRcdGNvbHVtbkhhbmRsZXIsXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0Y29sdW1uSW5mb0ZhY3RvcnksXG5cdFx0KTtcblx0XHRjb25zdCBjb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkgPSBuZXcgQ29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5KCk7XG5cblx0XHRjb25zdCBsb2NrU2VydmljZSA9IG5ldyBMb2NrU2VydmljZShcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdCk7XG5cdFx0Y29uc3QgdGVtcGxhdGVGYWN0b3J5ID0gbmV3IFRlbXBsYXRlRmFjdG9yeShcblx0XHRcdGNvbHVtblNldEZhY3RvcnksXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdCk7XG5cdFx0Y29uc3QgaXRlbUNhY2hlRmFjdG9yeSA9IG5ldyBJdGVtQ2FjaGVGYWN0b3J5KHF1ZXJ5TWF0Y2hlckZhY3RvcnkpO1xuXHRcdGNvbnN0IGl0ZW1SZXNvdXJjZUZhY3RvcnkgPSBuZXcgSXRlbVJlc291cmNlRmFjdG9yeShcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGxvY2tTZXJ2aWNlLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRleGNlcHRpb25IYW5kbGVyLFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGxpbmtUcmVlU2VydmljZSxcblx0XHQpO1xuXHRcdGNvbnN0IGNvbGxlY3Rpb25SZXNvdXJjZUZhY3RvcnkgPSBuZXcgQ29sbGVjdGlvblJlc291cmNlRmFjdG9yeShcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdGV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHRpdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdFx0Y2hhbmdlc0RlbHRhRmFjdG9yeSxcblx0XHQpO1xuXHRcdGNvbnN0IGl0ZW1FbnRyeUZhY3RvcnkgPSBuZXcgSXRlbUVudHJ5RmFjdG9yeShcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRhcGlGb3JtYXR0ZXIsXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0ZXhjZXB0aW9uSGFuZGxlcixcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0XHRpdGVtUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdHByb21pc2VMaWJyYXJ5LFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uRW50cnlTZXJ2aWNlID0gbmV3IENvbGxlY3Rpb25FbnRyeVNlcnZpY2UoXG5cdFx0XHRxdWVyeVBhcnNlckZhY3RvcnksXG5cdFx0XHRxdWVyeVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UgPSBuZXcgQ29sbGVjdGlvblJlc291cmNlU2VydmljZSgpO1xuXG5cdFx0Y29uc3QgY29sbGVjdGlvbkVudHJ5RmFjdG9yeSA9IG5ldyBDb2xsZWN0aW9uRW50cnlGYWN0b3J5KFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGNvbHVtblNldEZhY3RvcnksXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uQ2FjaGVGYWN0b3J5ID0gbmV3IENvbGxlY3Rpb25DYWNoZUZhY3RvcnkoXG5cdFx0XHRxdWVyeU1hdGNoZXJGYWN0b3J5LFxuXHRcdCk7XG5cblx0XHRjb25zdCBjb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkgPSBuZXcgQ29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5KHF1ZXJ5TWF0Y2hlckZhY3RvcnkpO1xuXG5cdFx0Y29uc3QgcmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSBuZXcgUmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkoY29sdW1uVXRpbCk7XG5cblx0XHRjb25zdCBjcmVhdGVSZXF1ZXN0RmFjdG9yeSA9IG5ldyBDcmVhdGVSZXF1ZXN0RmFjdG9yeShcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGtleVNlcnZpY2UsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSA9IG5ldyBDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5KCk7XG5cblx0XHRjb25zdCBjaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeSA9IG5ldyBDaGFuZ2VzUHJvY2Vzc29yRmFjdG9yeShcblx0XHRcdGNoYW5nZXNEZWx0YUZhY3RvcnksXG5cdFx0XHRhcGlSZXF1ZXN0U2VydmljZSxcblx0XHRcdGNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0XHRjb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y3JlYXRlUmVxdWVzdEZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkVudHJ5U2VydmljZSxcblx0XHRcdGl0ZW1FbnRyeVNlcnZpY2UsXG5cdFx0KTtcblxuXHRcdGNvbnN0IG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnkgPSBuZXcgTW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeSgpO1xuXG5cdFx0Y29uc3QgcmVxdWVzdEJ1ZmZlck1hbmFnZXIgPSBuZXcgUmVxdWVzdEJ1ZmZlck1hbmFnZXIoXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0cmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnksXG5cdFx0XHRrZXlTZXJ2aWNlLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdCk7XG5cblx0XHRjb25zdCB0ZW1wbGF0ZUNhY2hlID0gbmV3IFRlbXBsYXRlQ2FjaGUoXG5cdFx0XHRjb2x1bW5VdGlsLFxuXHRcdFx0cHJvbWlzZUxpYnJhcnksXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdGNvbHVtbkhhbmRsZXIsXG5cdFx0XHR0ZW1wbGF0ZUZhY3RvcnksXG5cdFx0XHRlcnJvckhhbmRsZXIsXG5cdFx0XHRyZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgdHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkgPSBuZXcgVHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkoXG5cdFx0XHR0aGlzLFxuXHRcdFx0Y29sdW1uQ2FjaGUsXG5cdFx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlcixcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdFx0cXVlcnlNYXRjaGVyRmFjdG9yeSxcblx0XHRcdGF1dGhJbnRlcmZhY2UsXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0Y2hhbmdlc1Byb2Nlc3NvckZhY3RvcnksXG5cdFx0XHRsb2NrU2VydmljZSxcblx0XHRcdG1vZHVsZUNoYW5nZXNDb21waWxhdGlvbkZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5LFxuXHRcdFx0aXRlbVJlc291cmNlRmFjdG9yeSxcblx0XHRcdHRlbXBsYXRlQ2FjaGUsXG5cdFx0XHRpdGVtQ2FjaGVGYWN0b3J5LFxuXHRcdFx0Y29sbGVjdGlvbkNhY2hlRmFjdG9yeSxcblx0XHRcdGVycm9ySGFuZGxlcixcblx0XHRcdGV4Y2VwdGlvbkhhbmRsZXIsXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdGFwaUZvcm1hdHRlcixcblx0XHRcdGFwaVJlcXVlc3RTZXJ2aWNlLFxuXHRcdFx0Y29sdW1uRXhwYW5zaW9uRmFjdG9yeSxcblx0XHRcdGNvbHVtbkhhbmRsZXIsXG5cdFx0XHRjb2x1bW5TZXRGYWN0b3J5LFxuXHRcdFx0Y29sdW1uU3Vic2V0Q2FjaGVGYWN0b3J5LFxuXHRcdFx0Y29sdW1uVXRpbCxcblx0XHRcdGl0ZW1FbnRyeUZhY3RvcnksXG5cdFx0XHRpdGVtRW50cnlTZXJ2aWNlLFxuXHRcdFx0a2V5U2VydmljZSxcblx0XHRcdGNvbGxlY3Rpb25FbnRyeUZhY3RvcnksXG5cdFx0XHRjb2xsZWN0aW9uRW50cnlTZXJ2aWNlLFxuXHRcdFx0Y29sbGVjdGlvbk1hdGNoZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlQYXJzZXJGYWN0b3J5LFxuXHRcdFx0cXVlcnlTZXJ2aWNlLFxuXHRcdFx0bGlua1RyZWVTZXJ2aWNlLFxuXHRcdCk7XG5cblx0XHRyZXF1ZXN0QnVmZmVyTWFuYWdlci5zZXRTZXJ2ZXJDYWNoZShcblx0XHRcdHRyYW5zYWN0aW9uQ2FjaGVGYWN0b3J5LmdldFNlcnZlckNhY2hlKCksXG5cdFx0KTtcblxuXHRcdGNvbnN0IHNvY2tldE1lc3NhZ2VIYW5kbGVyID0gbmV3IFNvY2tldE1lc3NhZ2VIYW5kbGVyKFxuXHRcdFx0cmVxdWVzdEJ1ZmZlck1hbmFnZXIsXG5cdFx0XHRjaGFuZ2VzRGVsdGFGYWN0b3J5LFxuXHRcdFx0YXBpRm9ybWF0dGVyLFxuXHRcdFx0ZXJyb3JIYW5kbGVyLFxuXHRcdFx0dHJhbnNhY3Rpb25DYWNoZUZhY3RvcnksXG5cdFx0XHRwcm9taXNlTGlicmFyeSxcblx0XHRcdHJlcXVlc3RDb2x1bW5FeHBhbnNpb25GYWN0b3J5LFxuXHRcdCk7XG5cblx0XHR0aGlzLmFwaUZvcm1hdHRlciA9IGFwaUZvcm1hdHRlcjtcblx0XHR0aGlzLmFwaVJlcXVlc3RTZXJ2aWNlID0gYXBpUmVxdWVzdFNlcnZpY2U7XG5cdFx0dGhpcy5hcGlSZXNwb25zZVByb2Nlc3NvckZhY3RvcnkgPSBhcGlSZXNwb25zZVByb2Nlc3NvckZhY3Rvcnk7XG5cdFx0dGhpcy5jaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gY2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTtcblx0XHR0aGlzLmNoYW5nZXNQcm9jZXNzb3JGYWN0b3J5ID0gY2hhbmdlc1Byb2Nlc3NvckZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uQ2FjaGVGYWN0b3J5ID0gY29sbGVjdGlvbkNhY2hlRmFjdG9yeTtcblx0XHR0aGlzLmNvbGxlY3Rpb25FbnRyeUZhY3RvcnkgPSBjb2xsZWN0aW9uRW50cnlGYWN0b3J5O1xuXHRcdHRoaXMuY29sbGVjdGlvbkVudHJ5U2VydmljZSA9IGNvbGxlY3Rpb25FbnRyeVNlcnZpY2U7XG5cdFx0dGhpcy5jb2xsZWN0aW9uTWF0Y2hlckZhY3RvcnkgPSBjb2xsZWN0aW9uTWF0Y2hlckZhY3Rvcnk7XG5cdFx0dGhpcy5jb2xsZWN0aW9uUmVzb3VyY2VGYWN0b3J5ID0gY29sbGVjdGlvblJlc291cmNlRmFjdG9yeTtcblx0XHR0aGlzLmNvbGxlY3Rpb25SZXNvdXJjZVNlcnZpY2UgPSBjb2xsZWN0aW9uUmVzb3VyY2VTZXJ2aWNlO1xuXHRcdHRoaXMuY29sdW1uQ2FjaGUgPSBjb2x1bW5DYWNoZTtcblx0XHR0aGlzLmNvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSBjb2x1bW5FeHBhbnNpb25GYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uSGFuZGxlciA9IGNvbHVtbkhhbmRsZXI7XG5cdFx0dGhpcy5jb2x1bW5JbmZvRmFjdG9yeSA9IGNvbHVtbkluZm9GYWN0b3J5O1xuXHRcdHRoaXMuY29sdW1uU2V0RmFjdG9yeSA9IGNvbHVtblNldEZhY3Rvcnk7XG5cdFx0dGhpcy5jb2x1bW5TdWJzZXRDYWNoZUZhY3RvcnkgPSBjb2x1bW5TdWJzZXRDYWNoZUZhY3Rvcnk7XG5cdFx0dGhpcy5jb2x1bW5VdGlsID0gY29sdW1uVXRpbDtcblx0XHR0aGlzLmNyZWF0ZVJlcXVlc3RGYWN0b3J5ID0gY3JlYXRlUmVxdWVzdEZhY3Rvcnk7XG5cdFx0dGhpcy5pdGVtQ2FjaGVGYWN0b3J5ID0gaXRlbUNhY2hlRmFjdG9yeTtcblx0XHR0aGlzLml0ZW1FbnRyeUZhY3RvcnkgPSBpdGVtRW50cnlGYWN0b3J5O1xuXHRcdHRoaXMuaXRlbUVudHJ5U2VydmljZSA9IGl0ZW1FbnRyeVNlcnZpY2U7XG5cdFx0dGhpcy5pdGVtUmVzb3VyY2VGYWN0b3J5ID0gaXRlbVJlc291cmNlRmFjdG9yeTtcblx0XHR0aGlzLmtleVNlcnZpY2UgPSBrZXlTZXJ2aWNlO1xuXHRcdHRoaXMudHJhbnNhY3Rpb25DYWNoZUZhY3RvcnkgPSB0cmFuc2FjdGlvbkNhY2hlRmFjdG9yeTtcblx0XHR0aGlzLmxvY2tTZXJ2aWNlID0gbG9ja1NlcnZpY2U7XG5cdFx0dGhpcy5tb2R1bGVDaGFuZ2VzQ29tcGlsYXRpb25GYWN0b3J5ID0gbW9kdWxlQ2hhbmdlc0NvbXBpbGF0aW9uRmFjdG9yeTtcblx0XHR0aGlzLnF1ZXJ5TWF0Y2hlckZhY3RvcnkgPSBxdWVyeU1hdGNoZXJGYWN0b3J5O1xuXHRcdHRoaXMucXVlcnlQYXJzZXJGYWN0b3J5ID0gcXVlcnlQYXJzZXJGYWN0b3J5O1xuXHRcdHRoaXMucXVlcnlTZXJ2aWNlID0gcXVlcnlTZXJ2aWNlO1xuXHRcdHRoaXMucmVxdWVzdENvbHVtbkV4cGFuc2lvbkZhY3RvcnkgPSByZXF1ZXN0Q29sdW1uRXhwYW5zaW9uRmFjdG9yeTtcblx0XHR0aGlzLnNvY2tldE1lc3NhZ2VIYW5kbGVyID0gc29ja2V0TWVzc2FnZUhhbmRsZXI7XG5cdFx0dGhpcy50ZW1wbGF0ZUZhY3RvcnkgPSB0ZW1wbGF0ZUZhY3Rvcnk7XG5cdFx0dGhpcy5jaGFuZ2VzRGVsdGFGYWN0b3J5ID0gY2hhbmdlc0RlbHRhRmFjdG9yeTtcblx0XHR0aGlzLnRlbXBsYXRlQ2FjaGUgPSB0ZW1wbGF0ZUNhY2hlO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub29wICgpIHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlkZW50aXR5ICh2YWx1ZSkge1xuXHRyZXR1cm4gdmFsdWU7XG59XG4iLCJleHBvcnQgKiBmcm9tICcuL2NvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMnO1xuZXhwb3J0ICogZnJvbSAnLi9tb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vY2xhc3Nlcyc7XG5leHBvcnQgKiBmcm9tICcuL2ZhY3Rvcmllcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdLCJzb3VyY2VSb290IjoiIn0=
|