breeze-client 2.1.6-mjs → 2.1.7-mjs
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/LICENSE +1 -1
- package/esm2022/src/abstract-data-service-adapter.mjs +68 -37
- package/esm2022/src/entity-query.mjs +23 -4
- package/fesm2022/breeze-client.mjs +88 -38
- package/fesm2022/breeze-client.mjs.map +1 -1
- package/package.json +1 -1
- package/src/abstract-data-service-adapter.d.ts +20 -0
- package/src/entity-query.d.ts +17 -3
|
@@ -41,6 +41,7 @@ export class EntityQuery {
|
|
|
41
41
|
this.parameters = {};
|
|
42
42
|
this.inlineCountEnabled = false;
|
|
43
43
|
this.noTrackingEnabled = false;
|
|
44
|
+
this.usePostEnabled = false;
|
|
44
45
|
// default is to get queryOptions and dataService from the entityManager.
|
|
45
46
|
// this.queryOptions = new QueryOptions();
|
|
46
47
|
// this.dataService = new DataService();
|
|
@@ -310,7 +311,7 @@ export class EntityQuery {
|
|
|
310
311
|
return clone(this, "parameters", parameters);
|
|
311
312
|
}
|
|
312
313
|
/**
|
|
313
|
-
Returns a query with the
|
|
314
|
+
Returns a query with the `inlineCount` capability either enabled or disabled. With `inlineCount` enabled, an additional 'inlineCount' property
|
|
314
315
|
will be returned with the query results that will contain the number of entities that would have been returned by this
|
|
315
316
|
query with only the 'where'/'filter' clauses applied, i.e. without any 'skip'/'take' operators applied. For local queries this clause is ignored.
|
|
316
317
|
> let query = new EntityQuery("Customers")
|
|
@@ -318,7 +319,7 @@ export class EntityQuery {
|
|
|
318
319
|
> .orderBy("CompanyName")
|
|
319
320
|
> .inlineCount(true);
|
|
320
321
|
|
|
321
|
-
will return the first 20 customers as well as a count of
|
|
322
|
+
will return the first 20 customers as well as a count of _all_ of the customers in the remote store.
|
|
322
323
|
@param enabled - (default = true) Whether or not inlineCount capability should be enabled. If this parameter is omitted, true is assumed.
|
|
323
324
|
**/
|
|
324
325
|
inlineCount(enabled) {
|
|
@@ -332,7 +333,7 @@ export class EntityQuery {
|
|
|
332
333
|
return clone(this, "usesNameOnServer", usesNameOnServer);
|
|
333
334
|
}
|
|
334
335
|
/**
|
|
335
|
-
Returns a query with the
|
|
336
|
+
Returns a query with the `noTracking` capability either enabled or disabled. With `noTracking` enabled, the results of this query
|
|
336
337
|
will not be coerced into entities but will instead look like raw javascript projections. i.e. simple javascript objects.
|
|
337
338
|
> let query = new EntityQuery("Customers")
|
|
338
339
|
> .take(20)
|
|
@@ -346,6 +347,22 @@ export class EntityQuery {
|
|
|
346
347
|
return clone(this, "noTrackingEnabled", enabled);
|
|
347
348
|
}
|
|
348
349
|
/**
|
|
350
|
+
Returns a query with the `usePost` capability either enabled or disabled. With `usePost` enabled, the query is sent
|
|
351
|
+
as a POST request (instead of GET) and the query expression will be sent as JSON in the body of the post.
|
|
352
|
+
Note that the server must be able to parse the body of the request; otherwise the query expression will be ignored.
|
|
353
|
+
> let query = new EntityQuery("Customers")
|
|
354
|
+
> .where("companyId", "eq", 1)
|
|
355
|
+
> .usePost(true);
|
|
356
|
+
results in a POST request to `{host}/{path}/Customers`
|
|
357
|
+
with body `{"where": {"companyId":{"eq":1}}}`
|
|
358
|
+
@param enabled - (default = true) Whether or not usePost should be enabled. If this parameter is omitted, true is assumed.
|
|
359
|
+
**/
|
|
360
|
+
usePost(enabled) {
|
|
361
|
+
assertParam(enabled, "enabled").isBoolean().isOptional().check();
|
|
362
|
+
enabled = (enabled === undefined) ? true : !!enabled;
|
|
363
|
+
return clone(this, "usePostEnabled", enabled);
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
349
366
|
Returns a copy of this EntityQuery with the specified [[EntityManager]], [[DataService]],
|
|
350
367
|
[[JsonResultsAdapter]], [[MergeStrategy]] or [[FetchStrategy]] applied.
|
|
351
368
|
> // 'using' can be used to return a new query with a specified EntityManager.
|
|
@@ -657,6 +674,7 @@ function fromJSON(eq, json) {
|
|
|
657
674
|
},
|
|
658
675
|
"inlineCountEnabled,inlineCount": false,
|
|
659
676
|
"noTrackingEnabled,noTracking": false,
|
|
677
|
+
"usePostEnabled,usePost": false,
|
|
660
678
|
queryOptions: function (v) {
|
|
661
679
|
return v ? QueryOptions.fromJSON(v) : undefined;
|
|
662
680
|
}
|
|
@@ -681,6 +699,7 @@ function clone(eq, propName, value) {
|
|
|
681
699
|
"expandClause",
|
|
682
700
|
"inlineCountEnabled",
|
|
683
701
|
"noTrackingEnabled",
|
|
702
|
+
"usePostEnabled",
|
|
684
703
|
"usesNameOnServer",
|
|
685
704
|
"queryOptions",
|
|
686
705
|
"entityManager",
|
|
@@ -1002,4 +1021,4 @@ export class ExpandClause {
|
|
|
1002
1021
|
});
|
|
1003
1022
|
}
|
|
1004
1023
|
}
|
|
1005
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXF1ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VudGl0eS1xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUEyQixNQUFNLFFBQVEsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQXNCLE1BQU0sZ0JBQWdCLENBQUM7QUFFakUsT0FBTyxFQUFpQixVQUFVLEVBQXNDLE1BQU0sbUJBQW1CLENBQUM7QUFDbEcsT0FBTyxFQUFFLFlBQVksRUFBZ0MsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBV3hDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBd0N0Qjs7Ozs7Ozs7T0FRRztJQUNILFlBQVksWUFBOEI7UUFDeEMsSUFBSSxZQUFZLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLEVBQUU7WUFDOUQsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsOEdBQThHO1FBQzlHLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBc0IsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUMvQixJQUFJ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QztnQkFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQy9FLENBQUMsQ0FBQyxDQUFDO1lBQ0gsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDO0lBQ0osQ0FBQztJQUVELFNBQVMsQ0FBQyxPQUErQjtRQUN2QyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUN4QyxPQUFPLE9BQU8sQ0FBQyxjQUFlLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQUN2QixhQUFhLENBQVc7SUFFeEIsWUFBWSxhQUF1QjtRQUNqQyxJQUFJLENBQUMsYUFBYSxHQUFHLGFBQWEsQ0FBQztJQUNyQyxDQUFDO0lBRUQsU0FBUyxDQUFDLE9BQStCO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFO1lBQ3hDLE9BQU8sT0FBTyxDQUFDLGNBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvcmUsIENhbGxiYWNrLCBFcnJvckNhbGxiYWNrIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgYXNzZXJ0UGFyYW0gfSBmcm9tICcuL2Fzc2VydC1wYXJhbSc7XHJcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xyXG5pbXBvcnQgeyBFbnRpdHlBc3BlY3QsIEVudGl0eSB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcbmltcG9ydCB7IEVudGl0eUtleSB9IGZyb20gJy4vZW50aXR5LWtleSc7XHJcbmltcG9ydCB7IEJyZWV6ZUVudW0gfSBmcm9tICcuL2VudW0nO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZSwgSnNvblJlc3VsdHNBZGFwdGVyIH0gZnJvbSAnLi9kYXRhLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCBRdWVyeVJlc3VsdCB9IGZyb20gJy4vZW50aXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBNZXRhZGF0YVN0b3JlLCBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIEVudGl0eVByb3BlcnR5IH0gZnJvbSAnLi9lbnRpdHktbWV0YWRhdGEnO1xyXG5pbXBvcnQgeyBRdWVyeU9wdGlvbnMsIE1lcmdlU3RyYXRlZ3ksIEZldGNoU3RyYXRlZ3kgfSBmcm9tICcuL3F1ZXJ5LW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBQcmVkaWNhdGUgfSBmcm9tICcuL3ByZWRpY2F0ZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Vyc2l2ZUFycmF5PFQ+IHtcclxuICBbaTogbnVtYmVyXTogVCB8IFJlY3Vyc2l2ZUFycmF5PFQ+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVF1ZXJ5SnNvbkNvbnRleHQge1xyXG4gIGVudGl0eVR5cGU/OiBFbnRpdHlUeXBlO1xyXG4gIHByb3BlcnR5UGF0aEZuPzogRnVuY3Rpb247IC8vIFRPRE9cclxuICB0b05hbWVPblNlcnZlcj86IGJvb2xlYW47XHJcbn1cclxuLyoqXHJcbkFuIEVudGl0eVF1ZXJ5IGluc3RhbmNlIGlzIHVzZWQgdG8gcXVlcnkgZW50aXRpZXMgZWl0aGVyIGZyb20gYSByZW1vdGUgZGF0YXNvdXJjZSBvciBmcm9tIGEgbG9jYWwgW1tFbnRpdHlNYW5hZ2VyXV0uXHJcblxyXG5FbnRpdHlRdWVyaWVzIGFyZSBpbW11dGFibGUgLSB0aGlzIG1lYW5zIHRoYXQgYWxsIEVudGl0eVF1ZXJ5IG1ldGhvZHMgdGhhdCByZXR1cm4gYW4gRW50aXR5UXVlcnkgYWN0dWFsbHkgY3JlYXRlIGEgbmV3IEVudGl0eVF1ZXJ5LiAgVGhpcyBtZWFucyB0aGF0XHJcbkVudGl0eVF1ZXJpZXMgY2FuIGJlICdtb2RpZmllZCcgd2l0aG91dCBhZmZlY3RpbmcgYW55IGN1cnJlbnQgaW5zdGFuY2VzLlxyXG5AZHluYW1pY1xyXG4qKi9cclxuZXhwb3J0IGNsYXNzIEVudGl0eVF1ZXJ5IHtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBkZWNsYXJlIF8kdHlwZU5hbWU6IHN0cmluZzsgLy8gYWN0dWFsbHkgcGxhY2VkIG9uIHByb3RvdHlwZVxyXG4gIC8vIHRvcCA9IHRoaXMudGFrZTsgLy8gVE9ETzogY29uc2lkZXJcclxuICAvKiogVGhlIHJlc291cmNlIG5hbWUgdXNlZCBieSB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICovXHJcbiAgZGVjbGFyZSByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBbW0VudGl0eVR5cGVdXSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ2Zyb20nIGNsYXVzZSAoIHJlc291cmNlTmFtZSkgb2YgdGhlIHF1ZXJ5LiAgVGhpcyBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgYmUgc2V0IEFGVEVSIHRoZSBxdWVyeVxyXG4gIGhhcyBiZWVuIGV4ZWN1dGVkIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgW1tNZXRhZGF0YVN0b3JlXV0gYXNzb2NpYXRlZCB3aXRoIHRoZSBbW0VudGl0eU1hbmFnZXJdXSB0aGF0IHRoZSBxdWVyeSB3YXMgZXhlY3V0ZWQgYWdhaW5zdC5cclxuICBUaGlzIHZhbHVlIG1heSBiZSBudWxsIGlmIHRoZSBlbnRpdHlUeXBlIGNhbm5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZU5hbWUuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIGZyb21FbnRpdHlUeXBlPzogRW50aXR5VHlwZTtcclxuICAvKiogVGhlICd3aGVyZScgW1tQcmVkaWNhdGVdXSB1c2VkIGJ5IHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHdoZXJlUHJlZGljYXRlOiBQcmVkaWNhdGU7IC8vIFRPRE9cclxuICAvKiogVGhlIFtbT3JkZXJCeUNsYXVzZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgb3JkZXJCeUNsYXVzZT86IE9yZGVyQnlDbGF1c2U7XHJcbiAgLyoqIFRoZSBbW0V4cGFuZENsYXVzZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgZXhwYW5kQ2xhdXNlPzogRXhwYW5kQ2xhdXNlO1xyXG4gIC8qKiBUaGUgW1tTZWxlY3RDbGF1c2VdXSB1c2VkIGJ5IHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHNlbGVjdENsYXVzZT86IFNlbGVjdENsYXVzZTtcclxuICAvKiogVGhlIG51bWJlciBvZiBlbnRpdGllcyB0byAnc2tpcCcgZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHNraXBDb3VudD86IG51bWJlcjtcclxuICAvKiogVGhlIG51bWJlciBvZiBlbnRpdGllcyB0byAndGFrZScgZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHRha2VDb3VudD86IG51bWJlcjtcclxuICAvKiogQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXJ5IHZpYSB0aGUgJ3dpdGhQYXJhbWV0ZXJzJyBtZXRob2QuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHBhcmFtZXRlcnM6IE9iamVjdDtcclxuICAvKiogV2hldGhlciBhbiBpbmxpbmUgY291bnQgaXMgcmV0dXJuZWQgZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIGlubGluZUNvdW50RW5hYmxlZDogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciBlbnRpdHkgdHJhY2tpbmcgaGFzIGJlZW4gZGlzYWJsZWQgZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIG5vVHJhY2tpbmdFbmFibGVkOiBib29sZWFuO1xyXG4gIC8qKiBUaGUgW1tRdWVyeU9wdGlvbnNdXSBmb3IgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAgKiovXHJcbiAgLy8gZGVmYXVsdCBpcyB0byBnZXQgcXVlcnlPcHRpb25zIGFuZCBkYXRhU2VydmljZSBmcm9tIHRoZSBlbnRpdHlNYW5hZ2VyLlxyXG4gIGRlY2xhcmUgcXVlcnlPcHRpb25zPzogUXVlcnlPcHRpb25zO1xyXG4gIC8qKiBUaGUgW1tEYXRhU2VydmljZV1dIGZvciB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICAqKi9cclxuICBkZWNsYXJlIGRhdGFTZXJ2aWNlPzogRGF0YVNlcnZpY2U7XHJcbiAgLyoqIFRoZSBbW0VudGl0eU1hbmFnZXJdXSBmb3IgdGhpcyBxdWVyeS4gVGhpcyBtYXkgYmUgbnVsbCBhbmQgY2FuIGJlIHNldCB2aWEgdGhlICd1c2luZycgbWV0aG9kLiAgKiovXHJcbiAgZGVjbGFyZSBlbnRpdHlNYW5hZ2VyPzogRW50aXR5TWFuYWdlcjtcclxuICAvKiogIFRoZSBlbnRpdHlUeXBlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGlzIHF1ZXJ5LiBcclxuICBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBzZXQgaWYgdGhlICd0b1R5cGUnIG1ldGhvZCB3YXMgY2FsbGVkLiBfX1JlYWQgT25seV9fICovXHJcbiAgZGVjbGFyZSByZXN1bHRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgc3RyaW5nO1xyXG4gIGRlY2xhcmUgdXNlc05hbWVPblNlcnZlcj86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBDb25zdHJ1Y3RvclxyXG4gID4gICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcblxyXG4gIFVzdWFsbHkgdGhpcyBjb25zdHJ1Y3RvciB3aWxsIGJlIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIGZpbHRlcmluZywgb3JkZXJpbmcgb3Igc2VsZWN0aW9uIG1ldGhvZHNcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiUmVnaW9uXCIpO1xyXG4gIEBwYXJhbSByZXNvdXJjZU5hbWUgLSBlaXRoZXIgYSByZXNvdXJjZSBuYW1lIG9yIGEgc2VyaWFsaXplZCBFbnRpdHlRdWVyeSAoIGNyZWF0ZWQgYnkgW1tFbnRpdHlRdWVyeS50b0pTT05dXSlcclxuICAqKi9cclxuICBjb25zdHJ1Y3RvcihyZXNvdXJjZU5hbWU/OiBzdHJpbmcgfCBPYmplY3QpIHtcclxuICAgIGlmIChyZXNvdXJjZU5hbWUgIT0gbnVsbCAmJiAodHlwZW9mIHJlc291cmNlTmFtZSAhPT0gJ3N0cmluZycpKSB7XHJcbiAgICAgIHJldHVybiBmcm9tSlNPTih0aGlzLCByZXNvdXJjZU5hbWUpO1xyXG4gICAgfVxyXG4gICAgLy8gVE9ETzogY2FzdCBhcyBzdHJpbmcgYmVsb3cgbmVlZGVkIGZvciBlYXJseSB2ZXJzaW9ucyBvZiBUeXBlRG9jIC0gYnV0IG5vdCBmb3IgcmVndWxhciBjb21waWxlIC0gY2hlY2sgbGF0ZXJcclxuICAgIHRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lIGFzIHN0cmluZztcclxuICAgIHRoaXMuZnJvbUVudGl0eVR5cGUgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLndoZXJlUHJlZGljYXRlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5vcmRlckJ5Q2xhdXNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWxlY3RDbGF1c2UgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNraXBDb3VudCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGFrZUNvdW50ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5leHBhbmRDbGF1c2UgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSB7fTtcclxuICAgIHRoaXMuaW5saW5lQ291bnRFbmFibGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLm5vVHJhY2tpbmdFbmFibGVkID0gZmFsc2U7XHJcbiAgICAvLyBkZWZhdWx0IGlzIHRvIGdldCBxdWVyeU9wdGlvbnMgYW5kIGRhdGFTZXJ2aWNlIGZyb20gdGhlIGVudGl0eU1hbmFnZXIuXHJcbiAgICAvLyB0aGlzLnF1ZXJ5T3B0aW9ucyA9IG5ldyBRdWVyeU9wdGlvbnMoKTtcclxuICAgIC8vIHRoaXMuZGF0YVNlcnZpY2UgPSBuZXcgRGF0YVNlcnZpY2UoKTtcclxuICAgIHRoaXMuZW50aXR5TWFuYWdlciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgU3BlY2lmaWVzIHRoZSByZXNvdXJjZSB0byBxdWVyeSBmb3IgdGhpcyBFbnRpdHlRdWVyeS5cclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KClcclxuICA+ICAgICAgICAuZnJvbShcIkN1c3RvbWVyc1wiKTtcclxuXHJcbiAgaXMgdGhlIHNhbWUgYXNcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpO1xyXG4gIEBwYXJhbSByZXNvdXJjZU5hbWUgLSBUaGUgcmVzb3VyY2UgdG8gcXVlcnkuXHJcbiAgKiovXHJcbiAgZnJvbShyZXNvdXJjZU5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgYWxsb3dpbmcgZW50aXR5VHlwZSBhcyB3ZWxsXHJcbiAgICBhc3NlcnRQYXJhbShyZXNvdXJjZU5hbWUsIFwicmVzb3VyY2VOYW1lXCIpLmlzU3RyaW5nKCkuY2hlY2soKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInJlc291cmNlTmFtZVwiLCByZXNvdXJjZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgVGhpcyBpcyBhIHN0YXRpYyB2ZXJzaW9uIG9mIHRoZSBcImZyb21cIiBtZXRob2QgYW5kIGl0IGNyZWF0ZXMgYSAnYmFzZScgZW50aXR5UXVlcnkgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgbmFtZS5cclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbShcIkN1c3RvbWVyc1wiKTtcclxuXHJcbiAgaXMgdGhlIHNhbWUgYXNcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpO1xyXG4gIEBwYXJhbSByZXNvdXJjZU5hbWUgLSBUaGUgcmVzb3VyY2UgdG8gcXVlcnkuXHJcbiAgKiovXHJcbiAgc3RhdGljIGZyb20ocmVzb3VyY2VOYW1lOiBzdHJpbmcpIHtcclxuICAgIGFzc2VydFBhcmFtKHJlc291cmNlTmFtZSwgXCJyZXNvdXJjZU5hbWVcIikuaXNTdHJpbmcoKS5jaGVjaygpO1xyXG4gICAgcmV0dXJuIG5ldyBFbnRpdHlRdWVyeShyZXNvdXJjZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgU3BlY2lmaWVzIHRoZSB0b3AgbGV2ZWwgRW50aXR5VHlwZSB0aGF0IHRoaXMgcXVlcnkgd2lsbCByZXR1cm4uICBPbmx5IG5lZWRlZCB3aGVuIGEgcXVlcnkgcmV0dXJucyBhIGpzb24gcmVzdWx0IHRoYXQgZG9lcyBub3QgaW5jbHVkZSB0eXBlIGluZm9ybWF0aW9uLFxyXG4gIG9yIHdoZW4gdXNpbmcgYSByZXNvdXJjZSBuYW1lIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgdG8gYW4gRW50aXR5VHlwZS5cclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KClcclxuICA+ICAgICAgICAuZnJvbShcIk15Q3VzdG9tTWV0aG9kXCIpXHJcbiAgPiAgICAgICAgLnRvVHlwZShcIkN1c3RvbWVyXCIpXHJcbiAgQHBhcmFtIGVudGl0eVR5cGUgLSBUaGUgdG9wIGxldmVsIEVudGl0eVR5cGUgdGhhdCB0aGlzIHF1ZXJ5IHdpbGwgcmV0dXJuLlxyXG4gIEBzdW1tYXJ5IElmIHRoZSBqc29uIHJlc3VsdCBjb25zaXN0cyBvZiBtb3JlIHRoYW4gYSBzaW1wbGUgZW50aXR5IG9yIGFycmF5IG9mIGVudGl0aWVzLCBjb25zaWRlciB1c2luZyBhIFtbSnNvblJlc3VsdHNBZGFwdGVyXV0gaW5zdGVhZC5cclxuICAqKi9cclxuICB0b1R5cGUoZW50aXR5VHlwZTogc3RyaW5nIHwgRW50aXR5VHlwZSkge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXR5VHlwZSwgXCJlbnRpdHlUeXBlXCIpLmlzU3RyaW5nKCkub3IoKS5pc0luc3RhbmNlT2YoRW50aXR5VHlwZSkuY2hlY2soKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInJlc3VsdEVudGl0eVR5cGVcIiwgZW50aXR5VHlwZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgd2hlcmUocHJlZGljYXRlPzogUHJlZGljYXRlKTogRW50aXR5UXVlcnk7XHJcbiAgd2hlcmUocHJlZGljYXRlOiBPYmplY3QpOiBFbnRpdHlRdWVyeTtcclxuICB3aGVyZShwcm9wZXJ0eTogc3RyaW5nLCBvcGVyYXRvcjogc3RyaW5nLCB2YWx1ZTogYW55KTogRW50aXR5UXVlcnk7XHJcbiAgd2hlcmUocHJvcGVydHk6IHN0cmluZywgb3BlcmF0b3I6IEZpbHRlclF1ZXJ5T3AsIHZhbHVlOiBhbnkpOiBFbnRpdHlRdWVyeTtcclxuICB3aGVyZShwcm9wZXJ0eTogc3RyaW5nLCBmaWx0ZXJvcDogRmlsdGVyUXVlcnlPcCwgcHJvcGVydHkyOiBzdHJpbmcsIGZpbHRlcm9wMjogRmlsdGVyUXVlcnlPcCwgdmFsdWU6IGFueSk6IEVudGl0eVF1ZXJ5OyAgLy8gZm9yIGFueS9hbGwgY2xhdXNlc1xyXG4gIHdoZXJlKHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlcm9wOiBzdHJpbmcsIHByb3BlcnR5Mjogc3RyaW5nLCBmaWx0ZXJvcDI6IHN0cmluZywgdmFsdWU6IGFueSk6IEVudGl0eVF1ZXJ5OyAgLy8gZm9yIGFueS9hbGwgY2xhdXNlc1xyXG4gIHdoZXJlKHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlcm9wOiBzdHJpbmcsIHByb3BlcnR5Mjogc3RyaW5nLCBmaWx0ZXJvcDI6IHN0cmluZywgcHJvcGVydHkzOiBzdHJpbmcsIGZpbHRlcm9wMzogc3RyaW5nLCB2YWx1ZTogYW55KTogRW50aXR5UXVlcnk7ICAvLyBmb3IgYW55L2FsbCBjbGF1c2VzXHJcbiAgd2hlcmUoYW5BcnJheTogUmVjdXJzaXZlQXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgRmlsdGVyUXVlcnlPcCB8IFByZWRpY2F0ZT4pOiBFbnRpdHlRdWVyeTtcclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHdpdGggYW4gYWRkZWQgZmlsdGVyIGNyaXRlcmlhOyBDYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdoaWNoIG1lYW5zIHRvICdhbmQnIHdpdGggYW55IGV4aXN0aW5nXHJcbiAgUHJlZGljYXRlIG9yIGNhbiBiZSBjYWxsZWQgd2l0aCBudWxsIHRvIGNsZWFyIGFsbCBwcmVkaWNhdGVzLlxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIik7XHJcblxyXG4gIFRoaXMgY2FuIGFsc28gYmUgZXhwcmVzc2VkIHVzaW5nIGFuIGV4cGxpY2l0IFtbRmlsdGVyUXVlcnlPcF1dIGFzXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgRmlsdGVyUXVlcnlPcC5TdGFydHNXaXRoLCBcIkNcIik7XHJcblxyXG4gIG9yIGEgcHJlY29uc3RydWN0ZWQgW1tQcmVkaWNhdGVdXSBtYXkgYmUgdXNlZFxyXG4gID4gICAgICBsZXQgcHJlZCA9IG5ldyBQcmVkaWNhdGUoXCJDb21wYW55TmFtZVwiLCBGaWx0ZXJRdWVyeU9wLlN0YXJ0c1dpdGgsIFwiQ1wiKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpLndoZXJlKHByZWQpO1xyXG5cclxuICBQcmVkaWNhdGVzIGFyZSBvZnRlbiB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBjb21iaW5lIG11bHRpcGxlIGNvbmRpdGlvbnMgaW4gYSBzaW5nbGUgZmlsdGVyLCBzdWNoIGFzXHJcbiAgPiAgICAgIGxldCBwcmVkID0gUHJlZGljYXRlLmNyZWF0ZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzd2l0aFwiLCBcIkNcIikuYW5kKFwiUmVnaW9uXCIsIEZpbHRlclF1ZXJ5T3AuRXF1YWxzLCBudWxsKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUocHJlZCk7XHJcblxyXG4gIE1vcmUgY29tcGxpY2F0ZWQgcXVlcmllcyBjYW4gbWFrZSB1c2Ugb2YgbmVzdGVkIHByb3BlcnR5IHBhdGhzXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIlByb2R1Y3RzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUoXCJDYXRlZ29yeS5DYXRlZ29yeU5hbWVcIiwgXCJzdGFydHN3aXRoXCIsIFwiU1wiKTtcclxuXHJcbiAgb3IgT0RhdGEgZnVuY3Rpb25zIC0gQSBsaXN0IG9mIHZhbGlkIE9EYXRhIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgd2l0aGluIHRoZSBbW1ByZWRpY2F0ZV1dIGRvY3VtZW50YXRpb24uXHJcbiAgXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAgLndoZXJlKFwidG9Mb3dlcihDb21wYW55TmFtZSlcIiwgXCJzdGFydHNXaXRoXCIsIFwiY1wiKTtcclxuXHJcbiAgb3IgdG8gYmUgZXZlbiBtb3JlIGJhcm9xdWVcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUoXCJ0b1VwcGVyKHN1YnN0cmluZyhDb21wYW55TmFtZSwgMSwgMikpXCIsIEZpbHRlclF1ZXJ5T3AuRXF1YWxzLCBcIk9NXCIpO1xyXG4gIEBwYXJhbSBwcmVkaWNhdGUgLSAgQ2FuIGJlIGVpdGhlclxyXG4gICAgLSBhIHNpbmdsZSBbW1ByZWRpY2F0ZV1dXHJcblxyXG4gICAgLSB0aGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSAnc2ltcGxlJyBQcmVkaWNhdGVcclxuICAgIC0gLSAgYSBwcm9wZXJ0eSBuYW1lLCBhIHByb3BlcnR5IHBhdGggd2l0aCAnLicgYXMgcGF0aCBzZXBlcmF0b3JzIG9yIGEgcHJvcGVydHkgZXhwcmVzc2lvbiB7U3RyaW5nfVxyXG4gICAgLSAtICBhbiBvcGVyYXRvciAtIFtbRmlsdGVyUXVlcnlPcF1dIG9yIGl0J3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBDYXNlIGlzIGlnbm9yZWRcclxuICAgIHdoZW4gaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQgYW5kIGFueSBzdHJpbmcgdGhhdCBtYXRjaGVzIG9uZSBvZiB0aGUgRmlsdGVyUXVlcnlPcCBhbGlhc2VzIHdpbGwgYmUgYWNjZXB0ZWQuXHJcbiAgICAtIC0gIGEgdmFsdWUge09iamVjdH0gLSBUaGlzIHdpbGwgYmUgdHJlYXRlZCBhcyBlaXRoZXIgYSBwcm9wZXJ0eSBleHByZXNzaW9uIG9yIGEgbGl0ZXJhbCBkZXBlbmRpbmcgb24gY29udGV4dC4gIFxyXG4gICAgSW4gZ2VuZXJhbCwgaWYgdGhlIHZhbHVlIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHByb3BlcnR5IGV4cHJlc3Npb24gaXQgd2lsbCBiZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIGxpdGVyYWwuXHJcbiAgICBJbiBtb3N0IGNhc2VzIHRoaXMgd29ya3Mgd2VsbCwgYnV0IHlvdSBjYW4gYWxzbyBmb3JjZSB0aGUgaW50ZXJwcmV0YXRpb24gYnkgbWFraW5nIHRoZSB2YWx1ZSBhcmd1bWVudCBpdHNlbGYgYW4gb2JqZWN0IFxyXG4gICAgd2l0aCBhICd2YWx1ZScgcHJvcGVydHkgYW5kIGFuICdpc0xpdGVyYWwnIHByb3BlcnR5IHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS5cclxuICAgIEJyZWV6ZSBhbHNvIHRyaWVzIHRvIGluZmVyIHRoZSBkYXRhVHlwZSBvZiBhbnkgbGl0ZXJhbCBiYXNlZCBvbiBjb250ZXh0LCBpZiB0aGlzIGZhaWxzIHlvdSBjYW4gZm9yY2UgdGhpcyBpbmZlcmVuY2UgYnkgbWFraW5nIHRoZSB2YWx1ZSBhcmd1bWVudCBcclxuICAgIGFuIG9iamVjdCB3aXRoIGEgJ3ZhbHVlJyBwcm9wZXJ0eSBhbmQgYSAnZGF0YVR5cGUncHJvcGVydHkgc2V0IHRvIG9uZSBvZiB0aGUgRGF0YVR5cGUgZW51bWVyYXRpb24gaW5zdGFuY2VzLlxyXG5cclxuICAgIC0gYSBudWxsIG9yIHVuZGVmaW5lZCAoIHRoaXMgY2F1c2VzIGFueSBleGlzdGluZyB3aGVyZSBjbGF1c2UgdG8gYmUgcmVtb3ZlZClcclxuICAqKi9cclxuICB3aGVyZSguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgbGV0IHdoZXJlUHJlZGljYXRlOiBQcmVkaWNhdGUgfCB1bmRlZmluZWQ7XHJcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF0gIT0gbnVsbCkge1xyXG4gICAgICB3aGVyZVByZWRpY2F0ZSA9IFByZWRpY2F0ZS5jcmVhdGUoLi4uPGFueT5hcmdzKTtcclxuICAgICAgaWYgKHRoaXMuZnJvbUVudGl0eVR5cGUpIHdoZXJlUHJlZGljYXRlLl92YWxpZGF0ZSh0aGlzLmZyb21FbnRpdHlUeXBlKTtcclxuICAgICAgaWYgKHRoaXMud2hlcmVQcmVkaWNhdGUpIHtcclxuICAgICAgICB3aGVyZVByZWRpY2F0ZSA9IHRoaXMud2hlcmVQcmVkaWNhdGUuYW5kKHdoZXJlUHJlZGljYXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwid2hlcmVQcmVkaWNhdGVcIiwgd2hlcmVQcmVkaWNhdGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIG9yZGVyQnkocHJvcGVydHlQYXRocz86IHN0cmluZywgaXNEZXNjZW5kaW5nPzogYm9vbGVhbik6IEVudGl0eVF1ZXJ5O1xyXG4gIG9yZGVyQnkocHJvcGVydHlQYXRoczogc3RyaW5nW10sIGlzRGVzY2VuZGluZz86IGJvb2xlYW4pOiBFbnRpdHlRdWVyeTtcclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgb3JkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSBieSBwcm9wZXJ0eSBuYW1lLiAgQnkgZGVmYXVsdCBzb3J0aW5nIG9jY3VycyBpcyBhc2NlbmRpbmcgb3JkZXIsIGJ1dCBzb3J0aW5nIGluIGRlc2NlbmRpbmcgb3JkZXIgaXMgc3VwcG9ydGVkIGFzIHdlbGwuXHJcbiAgT3JkZXJCeSBjbGF1c2VzIG1heSBiZSBjaGFpbmVkLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiQ29tcGFueU5hbWVcIik7XHJcblxyXG4gIG9yIHRvIHNvcnQgYWNyb3NzIG11bHRpcGxlIHByb3BlcnRpZXNcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAub3JkZXJCeShcIlJlZ2lvbiwgQ29tcGFueU5hbWVcIik7XHJcblxyXG4gIE5lc3RlZCBwcm9wZXJ0eSBwYXRocyBhcmUgYWxzbyBzdXBwb3J0ZWRcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJQcm9kdWN0c1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiQ2F0ZWdvcnkuQ2F0ZWdvcnlOYW1lXCIpO1xyXG5cclxuICBTb3J0aW5nIGluIGRlc2NlbmRpbmcgb3JkZXIgaXMgc3VwcG9ydGVkIHZpYSB0aGUgYWRkaXRpb24gb2YgJyBkZXNjJyB0byB0aGUgZW5kIG9mIGFueSBwcm9wZXJ0eSBwYXRoLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiQ29tcGFueU5hbWUgZGVzY1wiKTtcclxuXHJcbiAgb3JcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAub3JkZXJCeShcIlJlZ2lvbiBkZXNjLCBDb21wYW55TmFtZSBkZXNjXCIpO1xyXG4gIEBwYXJhbSBwcm9wZXJ0eVBhdGhzIC0gQSBjb21tYS1zZXBhcmF0ZWQgKCcsJykgc3RyaW5nIG9mIHByb3BlcnR5IHBhdGhzIG9yIGFuIGFycmF5IG9mIHByb3BlcnR5IHBhdGhzLlxyXG4gIEVhY2ggcHJvcGVydHkgcGF0aCBjYW4gb3B0aW9uYWxseSBlbmQgd2l0aCBcIiBkZXNjXCIgdG8gZm9yY2UgYSBkZXNjZW5kaW5nIHNvcnQgb3JkZXIuIElmICdwcm9wZXJ0eVBhdGhzJyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYWxsIG9yZGVyaW5nIGlzIHJlbW92ZWQuXHJcbiAgQHBhcmFtIGlzRGVzY2VuZGluZyAtIElmIHNwZWNpZmllZCwgb3ZlcnJpZGVzIGFsbCBvZiB0aGUgZW1iZWRkZWQgJ2Rlc2MnIHRhZ3MgaW4gdGhlIHByZXZpb3VzbHkgc3BlY2lmaWVkIHByb3BlcnR5IHBhdGhzLlxyXG4gICoqL1xyXG4gIG9yZGVyQnkocHJvcGVydHlQYXRoczogc3RyaW5nIHwgc3RyaW5nW10sIGlzRGVzY2VuZGluZz86IGJvb2xlYW4pIHtcclxuICAgIC8vIHByb3BlcnR5UGF0aHM6IGNhbiBwYXNzIGluIGNyZWF0ZShcIkEuWCxCXCIpIG9yIGNyZWF0ZShcIkEuWCBkZXNjLCBCXCIpIG9yIGNyZWF0ZShcIkEuWCBkZXNjLEJcIiwgdHJ1ZV0pXHJcbiAgICAvLyBpc0Rlc2MgcGFyYW1ldGVyIHRydW1wcyBpc0Rlc2MgaW4gcHJvcGVydHlOYW1lLlxyXG4gICAgbGV0IG9yZGVyQnlDbGF1c2UgPSBwcm9wZXJ0eVBhdGhzID09IG51bGwgPyBudWxsIDogbmV3IE9yZGVyQnlDbGF1c2Uobm9ybWFsaXplUHJvcGVydHlQYXRocyhwcm9wZXJ0eVBhdGhzKSwgaXNEZXNjZW5kaW5nKTtcclxuICAgIGlmICh0aGlzLm9yZGVyQnlDbGF1c2UgJiYgb3JkZXJCeUNsYXVzZSkge1xyXG4gICAgICBvcmRlckJ5Q2xhdXNlID0gbmV3IE9yZGVyQnlDbGF1c2UoW3RoaXMub3JkZXJCeUNsYXVzZSwgb3JkZXJCeUNsYXVzZV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwib3JkZXJCeUNsYXVzZVwiLCBvcmRlckJ5Q2xhdXNlKTtcclxuICB9XHJcblxyXG5cclxuICBvcmRlckJ5RGVzYyhwcm9wZXJ0eVBhdGhzOiBzdHJpbmcpOiBFbnRpdHlRdWVyeTtcclxuICBvcmRlckJ5RGVzYyhwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSk6IEVudGl0eVF1ZXJ5O1xyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCBvcmRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IGJ5IHByb3BlcnR5IG5hbWUgaW4gZGVzY2VuZGluZyBvcmRlci5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAub3JkZXJCeURlc2MoXCJDb21wYW55TmFtZVwiKTtcclxuXHJcbiAgb3IgdG8gc29ydCBhY3Jvc3MgbXVsdGlwbGUgcHJvcGVydGllc1xyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5RGVzYyhcIlJlZ2lvbiwgQ29tcGFueU5hbWVcIik7XHJcblxyXG4gIE5lc3RlZCBwcm9wZXJ0eSBwYXRocyBhcmUgYWxzbyBzdXBwb3J0ZWRcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJQcm9kdWN0c1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5RGVzYyhcIkNhdGVnb3J5LkNhdGVnb3J5TmFtZVwiKTtcclxuICBAcGFyYW0gcHJvcGVydHlQYXRocyAtIEEgY29tbWEtc2VwYXJhdGVkICgnLCcpIHN0cmluZyBvZiBwcm9wZXJ0eSBwYXRocyBvciBhbiBhcnJheSBvZiBwcm9wZXJ0eSBwYXRocy5cclxuICBJZiAncHJvcGVydHlQYXRocycgaXMgZWl0aGVyIG51bGwgb3Igb21pdHRlZCB0aGVuIGFsbCBvcmRlcmluZyBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIG9yZGVyQnlEZXNjKHByb3BlcnR5UGF0aHM6IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcmRlckJ5KHByb3BlcnR5UGF0aHMgYXMgYW55LCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCBzZWxlY3RzIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlc3VsdHMgb2YgdGhlIG9yaWdpbmFsIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSB2YWx1ZXMgb2YganVzdCB0aGVzZSBwcm9wZXJ0aWVzLiBUaGlzXHJcbiAgd2lsbCBiZSByZWZlcnJlZCB0byBhcyBhIHByb2plY3Rpb24uXHJcbiAgSWYgdGhlIHJlc3VsdCBvZiB0aGlzIHNlbGVjdGlvbiBcInByb2plY3Rpb25cIiBjb250YWlucyBlbnRpdGllcywgdGhlc2UgZW50aXRpZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIEVudGl0eU1hbmFnZXIncyBjYWNoZSBhbmQgd2lsbFxyXG4gIGJlIG1hZGUgJ29ic2VydmFibGUnLlxyXG4gIEFueSBzaW1wbGUgcHJvcGVydGllcywgaS5lLiBzdHJpbmdzLCBudW1iZXJzIG9yIGRhdGVzIHdpdGhpbiBhIHByb2plY3Rpb24gd2lsbCBub3QgYmUgY2FjaGVkIGFyZSB3aWxsIE5PVCBiZSBtYWRlICdvYnNlcnZhYmxlJy5cclxuICBcclxuICBTaW1wbGUgZGF0YSBwcm9wZXJ0aWVzIGNhbiBiZSBwcm9qZWN0ZWRcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgICAuc2VsZWN0KFwiQ29tcGFueU5hbWVcIik7XHJcblxyXG4gIFRoaXMgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2Ygb2JqZWN0cyBlYWNoIHdpdGggYSBzaW5nbGUgXCJDb21wYW55TmFtZVwiIHByb3BlcnR5IG9mIHR5cGUgc3RyaW5nLlxyXG4gIEEgc2ltaWxhciBxdWVyeSBjb3VsZCByZXR1cm4gYSBuYXZpZ2F0aW9uIHByb3BlcnR5IGluc3RlYWRcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgLnNlbGVjdChcIk9yZGVyc1wiKTtcclxuXHJcbiAgd2hlcmUgdGhlIHJlc3VsdCB3b3VsZCBiZSBhbiBhcnJheSBvZiBvYmplY3RzIGVhY2ggd2l0aCBhIHNpbmdsZSBcIk9yZGVyc1wiIHByb3BlcnR5IHRoYXQgd291bGQgaXRzZWxmIGJlIGFuIGFycmF5IG9mIFwiT3JkZXJcIiBlbnRpdGllcy5cclxuICBDb21wb3NpdGUgcHJvamVjdGlvbnMgYXJlIGFsc28gcG9zc2libGU6XHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgIC5zZWxlY3QoXCJDb21wYW55TmFtZSwgT3JkZXJzXCIpO1xyXG5cclxuICBBcyB3ZWxsIGFzIHByb2plY3Rpb25zIGludm9sdmluZyBuZXN0ZWQgcHJvcGVydHkgcGF0aHNcclxuICA+ICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKVxyXG4gID4gICAgICAgIC53aGVyZShcIkN1c3RvbWVyLkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgICAuc2VsZWN0KFwiQ3VzdG9tZXIuQ29tcGFueU5hbWUsIEN1c3RvbWVyLCBPcmRlckRhdGVcIik7XHJcbiAgQHBhcmFtIHByb3BlcnR5UGF0aHMgLSBBIGNvbW1hLXNlcGFyYXRlZCAoJywnKSBzdHJpbmcgb2YgcHJvcGVydHkgcGF0aHMgb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgcGF0aHMuXHJcbiAgSWYgJ3Byb3BlcnR5UGF0aHMnIGlzIGVpdGhlciBudWxsIG9yIG9taXR0ZWQgdGhlbiBhbnkgZXhpc3RpbmcgcHJvamVjdGlvbiBvbiB0aGUgcXVlcnkgaXMgcmVtb3ZlZC5cclxuICAqKi9cclxuICBzZWxlY3QocHJvcGVydHlQYXRocz86IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgICBsZXQgc2VsZWN0Q2xhdXNlID0gcHJvcGVydHlQYXRocyA9PSBudWxsID8gbnVsbCA6IG5ldyBTZWxlY3RDbGF1c2Uobm9ybWFsaXplUHJvcGVydHlQYXRocyhwcm9wZXJ0eVBhdGhzKSk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJzZWxlY3RDbGF1c2VcIiwgc2VsZWN0Q2xhdXNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCBza2lwcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRpdGllcyB3aGVuIHJldHVybmluZyByZXN1bHRzLlxyXG4gIEFueSBleGlzdGluZyAnc2tpcCcgY2FuIGJlIGNsZWFyZWQgYnkgY2FsbGluZyAnc2tpcCcgd2l0aCBubyBhcmd1bWVudHMuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAuc2tpcCg1KTtcclxuICBAcGFyYW0gY291bnQgLSBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHRvIHNraXAgb3Zlci4gSWYgb21pdHRlZCBvciBudWxsIGFueSBleGlzdGluZyBza2lwIGNvdW50IG9uIHRoZSBxdWVyeSBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIHNraXAoY291bnQ/OiBudW1iZXIpIHtcclxuICAgIGFzc2VydFBhcmFtKGNvdW50LCBcImNvdW50XCIpLmlzT3B0aW9uYWwoKS5pc051bWJlcigpLmNoZWNrKCk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJza2lwQ291bnRcIiwgKGNvdW50ID09IG51bGwpID8gbnVsbCA6IGNvdW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50aXRpZXMgd2hlbiByZXR1cm5pbmcgcmVzdWx0cy4gLSBTYW1lIGFzICd0YWtlJy5cclxuICBBbnkgZXhpc3RpbmcgJ3RvcCcgY2FuIGJlIGNsZWFyZWQgYnkgY2FsbGluZyAndG9wJyB3aXRoIG5vIGFyZ3VtZW50cy5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAudG9wKDUpO1xyXG4gIEBwYXJhbSBjb3VudCAtIFRoZSBudW1iZXIgb2YgZW50aXRpZXMgdG8gcmV0dXJuLlxyXG4gIElmICdjb3VudCcgaXMgZWl0aGVyIG51bGwgb3Igb21pdHRlZCB0aGVuIGFueSBleGlzdGluZyAndG9wJyBjb3VudCBvbiB0aGUgcXVlcnkgaXMgcmVtb3ZlZC5cclxuICAqKi9cclxuICB0b3AoY291bnQ/OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLnRha2UoY291bnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IHJldHVybnMgb25seSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRpdGllcyB3aGVuIHJldHVybmluZyByZXN1bHRzIC0gU2FtZSBhcyAndG9wJy5cclxuICBBbnkgZXhpc3RpbmcgdGFrZSBjYW4gYmUgY2xlYXJlZCBieSBjYWxsaW5nIHRha2Ugd2l0aCBubyBhcmd1bWVudHMuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLnRha2UoNSk7XHJcbiAgQHBhcmFtIGNvdW50IC0gVGhlIG51bWJlciBvZiBlbnRpdGllcyB0byByZXR1cm4uXHJcbiAgSWYgJ2NvdW50JyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYW55IGV4aXN0aW5nICd0YWtlJyBjb3VudCBvbiB0aGUgcXVlcnkgaXMgcmVtb3ZlZC5cclxuICAqKi9cclxuICB0YWtlKGNvdW50PzogbnVtYmVyKSB7XHJcbiAgICBhc3NlcnRQYXJhbShjb3VudCwgXCJjb3VudFwiKS5pc09wdGlvbmFsKCkuaXNOdW1iZXIoKS5jaGVjaygpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwidGFrZUNvdW50XCIsIChjb3VudCA9PSBudWxsKSA/IG51bGwgOiBjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgd2lsbCByZXR1cm4gcmVsYXRlZCBlbnRpdGllcyBuZXN0ZWQgd2l0aGluIGl0cyByZXN1bHRzLiBUaGUgZXhwYW5kIG1ldGhvZCBhbGxvd3MgeW91IHRvIGlkZW50aWZ5IHJlbGF0ZWQgZW50aXRpZXMsIHZpYSBuYXZpZ2F0aW9uIHByb3BlcnR5XHJcbiAgbmFtZXMgc3VjaCB0aGF0IGEgZ3JhcGggb2YgZW50aXRpZXMgbWF5IGJlIHJldHJpZXZlZCB3aXRoIGEgc2luZ2xlIHJlcXVlc3QuIEFueSBmaWx0ZXJpbmcgb2NjdXJzIGJlZm9yZSB0aGUgcmVzdWx0cyBhcmUgJ2V4cGFuZGVkJy5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgLmV4cGFuZChcIk9yZGVyc1wiKTtcclxuXHJcbiAgd2lsbCByZXR1cm4gdGhlIGZpbHRlcmVkIGN1c3RvbWVycyBlYWNoIHdpdGggaXRzIFwiT3JkZXJzXCIgcHJvcGVydGllcyBmdWxseSByZXNvbHZlZC5cclxuICBNdWx0aXBsZSBwYXRocyBtYXkgYmUgc3BlY2lmaWVkIGJ5IHNlcGFyYXRpbmcgdGhlIHBhdGhzIGJ5IGEgJywnXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpXHJcbiAgPiAgICAgICAgLmV4cGFuZChcIkN1c3RvbWVyLCBFbXBsb3llZVwiKVxyXG5cclxuICBhbmQgbmVzdGVkIHByb3BlcnR5IHBhdGhzIG15IGJlIHNwZWNpZmllZCBhcyB3ZWxsXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpXHJcbiAgPiAgICAgICAgLmV4cGFuZChcIkN1c3RvbWVyLCBPcmRlckRldGFpbHMsIE9yZGVyRGV0YWlscy5Qcm9kdWN0XCIpXHJcbiAgQHBhcmFtIHByb3BlcnR5UGF0aHMgLSBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5hdmlnYXRpb24gcHJvcGVydHkgbmFtZXMgb3IgYW4gYXJyYXkgb2YgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lcy4gRWFjaCBOYXZpZ2F0aW9uIFByb3BlcnR5IG5hbWUgY2FuIGJlIGZvbGxvd2VkXHJcbiAgYnkgYSAnLicgYW5kIGFub3RoZXIgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lIHRvIGVuYWJsZSBpZGVudGlmeWluZyBhIG11bHRpLWxldmVsIHJlbGF0aW9uc2hpcC5cclxuICBJZiAncHJvcGVydHlQYXRocycgaXMgZWl0aGVyIG51bGwgb3Igb21pdHRlZCB0aGVuIGFueSBleGlzdGluZyAnZXhwYW5kJyBjbGF1c2Ugb24gdGhlIHF1ZXJ5IGlzIHJlbW92ZWQuXHJcbiAgKiovXHJcbiAgZXhwYW5kKHByb3BlcnR5UGF0aHM/OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgbGV0IGV4cGFuZENsYXVzZSA9IHByb3BlcnR5UGF0aHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgRXhwYW5kQ2xhdXNlKG5vcm1hbGl6ZVByb3BlcnR5UGF0aHMocHJvcGVydHlQYXRocykpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwiZXhwYW5kQ2xhdXNlXCIsIGV4cGFuZENsYXVzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgaW5jbHVkZXMgYSBjb2xsZWN0aW9uIG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgc2VydmVyLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb20oXCJFbXBsb3llZXNGaWx0ZXJlZEJ5Q291bnRyeUFuZEJpcnRoZGF0ZVwiKVxyXG4gID4gICAgICAgIC53aXRoUGFyYW1ldGVycyh7IEJpcnRoRGF0ZTogXCIxLzEvMTk2MFwiLCBDb3VudHJ5OiBcIlVTQVwiIH0pO1xyXG4gICBcclxuICB3aWxsIGNhbGwgdGhlICdFbXBsb3llZXNGaWx0ZXJlZEJ5Q291bnRyeUFuZEJpcnRoZGF0ZScgbWV0aG9kIG9uIHRoZSBzZXJ2ZXIgYW5kIHBhc3MgaW4gMiBwYXJhbWV0ZXJzLiBUaGlzXHJcbiAgcXVlcnkgd2lsbCBiZSB1cmkgZW5jb2RlZCBhc1xyXG4gID4gICAgICB7c2VydmljZUFwaX0vRW1wbG95ZWVzRmlsdGVyZWRCeUNvdW50cnlBbmRCaXJ0aGRhdGU/YmlydGhEYXRlPTElMkYxJTJGMTk2MCZjb3VudHJ5PVVTQVxyXG5cclxuICBQYXJhbWV0ZXJzIG1heSBhbHNvIGJlIG1peGVkIGluIHdpdGggb3RoZXIgcXVlcnkgY3JpdGVyaWEuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbShcIkVtcGxveWVlc0ZpbHRlcmVkQnlDb3VudHJ5QW5kQmlydGhkYXRlXCIpXHJcbiAgPiAgICAgICAgLndpdGhQYXJhbWV0ZXJzKHsgQmlydGhEYXRlOiBcIjEvMS8xOTYwXCIsIENvdW50cnk6IFwiVVNBXCIgfSlcclxuICA+ICAgICAgICAud2hlcmUoXCJMYXN0TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJTXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJCaXJ0aERhdGVcIik7XHJcbiAgQHBhcmFtIHBhcmFtZXRlcnMgLSBBIHBhcmFtZXRlcnMgb2JqZWN0IHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUgcGFyYW1ldGVyIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgcGFyYW1ldGVyIHZhbHVlcy5cclxuICAqKi9cclxuICB3aXRoUGFyYW1ldGVycyhwYXJhbWV0ZXJzOiBPYmplY3QpIHtcclxuICAgIGFzc2VydFBhcmFtKHBhcmFtZXRlcnMsIFwicGFyYW1ldGVyc1wiKS5pc09iamVjdCgpLmNoZWNrKCk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJwYXJhbWV0ZXJzXCIsIHBhcmFtZXRlcnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHF1ZXJ5IHdpdGggdGhlICdpbmxpbmVDb3VudCcgY2FwYWJpbGl0eSBlaXRoZXIgZW5hYmxlZCBvciBkaXNhYmxlZC4gIFdpdGggJ2lubGluZUNvdW50JyBlbmFibGVkLCBhbiBhZGRpdGlvbmFsICdpbmxpbmVDb3VudCcgcHJvcGVydHlcclxuICB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIHF1ZXJ5IHJlc3VsdHMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBlbnRpdGllcyB0aGF0IHdvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBieSB0aGlzXHJcbiAgcXVlcnkgd2l0aCBvbmx5IHRoZSAnd2hlcmUnLydmaWx0ZXInIGNsYXVzZXMgYXBwbGllZCwgaS5lLiB3aXRob3V0IGFueSAnc2tpcCcvJ3Rha2UnIG9wZXJhdG9ycyBhcHBsaWVkLiBGb3IgbG9jYWwgcXVlcmllcyB0aGlzIGNsYXVzZSBpcyBpZ25vcmVkLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC50YWtlKDIwKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiQ29tcGFueU5hbWVcIilcclxuICA+ICAgICAgICAuaW5saW5lQ291bnQodHJ1ZSk7XHJcblxyXG4gIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCAyMCBjdXN0b21lcnMgYXMgd2VsbCBhcyBhIGNvdW50IG9mIGFsbCBvZiB0aGUgY3VzdG9tZXJzIGluIHRoZSByZW1vdGUgc3RvcmUuXHJcbiAgQHBhcmFtIGVuYWJsZWQgLSAoZGVmYXVsdCA9IHRydWUpIFdoZXRoZXIgb3Igbm90IGlubGluZUNvdW50IGNhcGFiaWxpdHkgc2hvdWxkIGJlIGVuYWJsZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRydWUgaXMgYXNzdW1lZC5cclxuICAqKi9cclxuICBpbmxpbmVDb3VudChlbmFibGVkPzogYm9vbGVhbikge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW5hYmxlZCwgXCJlbmFibGVkXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG4gICAgZW5hYmxlZCA9IChlbmFibGVkID09PSB1bmRlZmluZWQpID8gdHJ1ZSA6ICEhZW5hYmxlZDtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcImlubGluZUNvdW50RW5hYmxlZFwiLCBlbmFibGVkKTtcclxuICB9XHJcblxyXG4gIHVzZU5hbWVPblNlcnZlcih1c2VzTmFtZU9uU2VydmVyPzogYm9vbGVhbikge1xyXG4gICAgYXNzZXJ0UGFyYW0odXNlc05hbWVPblNlcnZlciwgXCJ1c2VzTmFtZU9uU2VydmVyXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG4gICAgdXNlc05hbWVPblNlcnZlciA9ICh1c2VzTmFtZU9uU2VydmVyID09PSB1bmRlZmluZWQpID8gdHJ1ZSA6ICEhdXNlc05hbWVPblNlcnZlcjtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInVzZXNOYW1lT25TZXJ2ZXJcIiwgdXNlc05hbWVPblNlcnZlcik7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgcXVlcnkgd2l0aCB0aGUgJ25vVHJhY2tpbmcnIGNhcGFiaWxpdHkgZWl0aGVyIGVuYWJsZWQgb3IgZGlzYWJsZWQuICBXaXRoICdub1RyYWNraW5nJyBlbmFibGVkLCB0aGUgcmVzdWx0cyBvZiB0aGlzIHF1ZXJ5XHJcbiAgd2lsbCBub3QgYmUgY29lcmNlZCBpbnRvIGVudGl0aWVzIGJ1dCB3aWxsIGluc3RlYWQgbG9vayBsaWtlIHJhdyBqYXZhc2NyaXB0IHByb2plY3Rpb25zLiBpLmUuIHNpbXBsZSBqYXZhc2NyaXB0IG9iamVjdHMuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgIC50YWtlKDIwKVxyXG4gID4gICAgICAgICAub3JkZXJCeShcIkNvbXBhbnlOYW1lXCIpXHJcbiAgPiAgICAgICAgIC5ub1RyYWNraW5nKHRydWUpO1xyXG4gIEBwYXJhbSBlbmFibGVkIC0gKGRlZmF1bHQgPSB0cnVlKSBXaGV0aGVyIG9yIG5vdCB0aGUgbm9UcmFja2luZyBjYXBhYmlsaXR5IHNob3VsZCBiZSBlbmFibGVkLiBJZiB0aGlzIHBhcmFtZXRlciBpcyBvbWl0dGVkLCB0cnVlIGlzIGFzc3VtZWQuXHJcbiAgKiovXHJcbiAgbm9UcmFja2luZyhlbmFibGVkPzogYm9vbGVhbikge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW5hYmxlZCwgXCJlbmFibGVkXCIpLmlzQm9vbGVhbigpLmlzT3B0aW9uYWwoKS5jaGVjaygpO1xyXG4gICAgZW5hYmxlZCA9IChlbmFibGVkID09PSB1bmRlZmluZWQpID8gdHJ1ZSA6ICEhZW5hYmxlZDtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcIm5vVHJhY2tpbmdFbmFibGVkXCIsIGVuYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgdXNpbmcob2JqOiBFbnRpdHlNYW5hZ2VyKTogRW50aXR5UXVlcnk7XHJcbiAgdXNpbmcob2JqOiBEYXRhU2VydmljZSk6IEVudGl0eVF1ZXJ5O1xyXG4gIHVzaW5nKG9iajogSnNvblJlc3VsdHNBZGFwdGVyKTogRW50aXR5UXVlcnk7XHJcbiAgdXNpbmcob2JqOiBRdWVyeU9wdGlvbnMpOiBFbnRpdHlRdWVyeTtcclxuICB1c2luZyhvYmo6IE1lcmdlU3RyYXRlZ3kpOiBFbnRpdHlRdWVyeTtcclxuICB1c2luZyhvYmo6IEZldGNoU3RyYXRlZ3kpOiBFbnRpdHlRdWVyeTtcclxuICAvKipcclxuICBSZXR1cm5zIGEgY29weSBvZiB0aGlzIEVudGl0eVF1ZXJ5IHdpdGggdGhlIHNwZWNpZmllZCBbW0VudGl0eU1hbmFnZXJdXSwgW1tEYXRhU2VydmljZV1dLFxyXG4gIFtbSnNvblJlc3VsdHNBZGFwdGVyXV0sIFtbTWVyZ2VTdHJhdGVneV1dIG9yIFtbRmV0Y2hTdHJhdGVneV1dIGFwcGxpZWQuXHJcbiAgPiAgICAgIC8vICd1c2luZycgY2FuIGJlIHVzZWQgdG8gcmV0dXJuIGEgbmV3IHF1ZXJ5IHdpdGggYSBzcGVjaWZpZWQgRW50aXR5TWFuYWdlci5cclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIilcclxuICA+ICAgICAgICAudXNpbmcoZW0pO1xyXG5cclxuICBvciB3aXRoIGEgc3BlY2lmaWVkIFtbTWVyZ2VTdHJhdGVneV1dXHJcbiAgPiAgICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpXHJcbiAgPiAgICAgICAgLnVzaW5nKE1lcmdlU3RyYXRlZ3kuUHJlc2VydmVDaGFuZ2VzKTtcclxuXHJcbiAgb3Igd2l0aCBhIHNwZWNpZmllZCBbW0ZldGNoU3RyYXRlZ3ldXVxyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcihzZXJ2aWNlTmFtZSk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKVxyXG4gID4gICAgICAgIC51c2luZyhGZXRjaFN0cmF0ZWd5LkZyb21Mb2NhbENhY2hlKTtcclxuICBAcGFyYW0gb2JqIC0gVGhlIG9iamVjdCB0byB1cGRhdGUgaW4gY3JlYXRpbmcgYSBuZXcgRW50aXR5UXVlcnkgZnJvbSBhbiBleGlzdGluZyBvbmUuXHJcbiAgKiovXHJcbiAgdXNpbmcob2JqOiBhbnkpIHtcclxuICAgIGlmICghb2JqKSByZXR1cm4gdGhpcztcclxuICAgIGxldCBlcSA9IGNsb25lKHRoaXMpO1xyXG4gICAgcHJvY2Vzc1VzaW5nKGVxLCB7XHJcbiAgICAgIFwiZW50aXR5TWFuYWdlclwiOiBudWxsLFxyXG4gICAgICBcImRhdGFTZXJ2aWNlXCI6IG51bGwsXHJcbiAgICAgIFwicXVlcnlPcHRpb25zXCI6IG51bGwsXHJcbiAgICAgIFwiZmV0Y2hTdHJhdGVneVwiOiAoZXE6IEVudGl0eVF1ZXJ5LCB2YWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGVxLnF1ZXJ5T3B0aW9ucyA9IChlcS5xdWVyeU9wdGlvbnMgfHwgbmV3IFF1ZXJ5T3B0aW9ucygpKS51c2luZyh2YWwpO1xyXG4gICAgICB9LFxyXG4gICAgICBcIm1lcmdlU3RyYXRlZ3lcIjogKGVxOiBFbnRpdHlRdWVyeSwgdmFsOiBhbnkpID0+IHtcclxuICAgICAgICBlcS5xdWVyeU9wdGlvbnMgPSAoZXEucXVlcnlPcHRpb25zIHx8IG5ldyBRdWVyeU9wdGlvbnMoKSkudXNpbmcodmFsKTtcclxuICAgICAgfSxcclxuICAgICAgXCJqc29uUmVzdWx0c0FkYXB0ZXJcIjogKGVxOiBFbnRpdHlRdWVyeSwgdmFsOiBhbnkpID0+IHtcclxuICAgICAgICBlcS5kYXRhU2VydmljZSA9IChlcS5kYXRhU2VydmljZSB8fCBuZXcgRGF0YVNlcnZpY2UoKSkudXNpbmcoeyBqc29uUmVzdWx0c0FkYXB0ZXI6IHZhbCB9KTtcclxuICAgICAgfVxyXG4gICAgfSwgb2JqKTtcclxuICAgIHJldHVybiBlcTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIEV4ZWN1dGVzIHRoaXMgcXVlcnkuICBUaGlzIG1ldGhvZCByZXF1aXJlcyB0aGF0IGFuIEVudGl0eU1hbmFnZXIgaGFzIGJlZW4gcHJldmlvdXNseSBzcGVjaWZpZWQgdmlhIHRoZSBcInVzaW5nXCIgbWV0aG9kLlxyXG4gIFxyXG4gIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgdXNpbmcgYSAncHJvbWlzZXMnIHN5bnRheCAoIHJlY29tbWVuZGVkKVxyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcihzZXJ2aWNlTmFtZSk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKS51c2luZyhlbSk7XHJcbiAgPiAgICAgIHF1ZXJ5LmV4ZWN1dGUoKS50aGVuKCBmdW5jdGlvbihkYXRhKSB7XHJcbiAgPiAgICAgICAgICAuLi4gcXVlcnkgcmVzdWx0cyBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgICB9KS5jYXRjaCggZnVuY3Rpb24oZXJyKSB7XHJcbiAgPiAgICAgICAgICAuLi4gcXVlcnkgZmFpbHVyZSBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgICB9KTtcclxuXHJcbiAgb3Igd2l0aCBjYWxsYmFja3NcclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIikudXNpbmcoZW0pO1xyXG4gID4gICAgICBxdWVyeS5leGVjdXRlKFxyXG4gID4gICAgICAgIGZ1bmN0aW9uKGRhdGEpIHtcclxuICA+ICAgICAgICAgICAgICAgICAgICBsZXQgb3JkZXJzID0gZGF0YS5yZXN1bHRzO1xyXG4gID4gICAgICAgICAgICAgICAgICAgIC4uLiBxdWVyeSByZXN1bHRzIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgICAgICAgICAgICB9LFxyXG4gID4gICAgICAgIGZ1bmN0aW9uKGVycikge1xyXG4gID4gICAgICAgICAgICAgICAgICAgIC4uLiBxdWVyeSBmYWlsdXJlIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgICAgICAgICAgICB9KTtcclxuXHJcbiAgRWl0aGVyIHdheSB0aGlzIG1ldGhvZCBpcyB0aGUgc2FtZSBhcyBjYWxsaW5nIHRoZSBFbnRpdHlNYW5hZ2VyICdleGVjdXRlJyBtZXRob2QuXHJcbiAgPiAgICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpO1xyXG4gID4gICAgICBlbS5leGVjdXRlUXVlcnkocXVlcnkpLnRoZW4oIGZ1bmN0aW9uKGRhdGEpIHtcclxuICA+ICAgICAgICAgbGV0IG9yZGVycyA9IGRhdGEucmVzdWx0cztcclxuICA+ICAgICAgICAgIC4uLiBxdWVyeSByZXN1bHRzIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgIH0pLmNhdGNoKCBmdW5jdGlvbihlcnIpIHtcclxuICA+ICAgICAgICAgLi4uIHF1ZXJ5IGZhaWx1cmUgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICAgfSk7XHJcblxyXG4gIEBwYXJhbSBjYWxsYmFjayAtICBGdW5jdGlvbiBjYWxsZWQgb24gc3VjY2Vzcy5cclxuICBAcGFyYW0gZXJyb3JDYWxsYmFjayAtIEZ1bmN0aW9uIGNhbGxlZCBvbiBmYWlsdXJlLlxyXG4gIEByZXR1cm4gUHJvbWlzZVxyXG4gICoqL1xyXG4gIGV4ZWN1dGUoY2FsbGJhY2s/OiBDYWxsYmFjaywgZXJyb3JDYWxsYmFjaz86IEVycm9yQ2FsbGJhY2spOiBQcm9taXNlPFF1ZXJ5UmVzdWx0PiB7XHJcbiAgICBpZiAoIXRoaXMuZW50aXR5TWFuYWdlcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBbiBFbnRpdHlRdWVyeSBtdXN0IGhhdmUgaXRzIEVudGl0eU1hbmFnZXIgcHJvcGVydHkgc2V0IGJlZm9yZSBjYWxsaW5nICdleGVjdXRlJ1wiKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmVudGl0eU1hbmFnZXIuZXhlY3V0ZVF1ZXJ5KHRoaXMsIGNhbGxiYWNrLCBlcnJvckNhbGxiYWNrKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIEV4ZWN1dGVzIHRoaXMgcXVlcnkgYWdhaW5zdCB0aGUgbG9jYWwgY2FjaGUuICBUaGlzIG1ldGhvZCByZXF1aXJlcyB0aGF0IGFuIEVudGl0eU1hbmFnZXIgaGF2ZSBiZWVuIHByZXZpb3VzbHkgc3BlY2lmaWVkIHZpYSB0aGUgXCJ1c2luZ1wiIG1ldGhvZC5cclxuICA+ICAgICAgLy8gYXNzdW1lIGVtIGlzIGFuIGVudGl0eU1hbmFnZXIgYWxyZWFkeSBmaWxsZWQgd2l0aCBvcmRlciBlbnRpdGllcztcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpLnVzaW5nKGVtKTtcclxuICA+ICAgICAgbGV0IG9yZGVycyA9IHF1ZXJ5LmV4ZWN1dGVMb2NhbGx5KCk7XHJcblxyXG4gIE5vdGUgdGhhdCBjYWxsaW5nIHRoaXMgbWV0aG9kIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgW1tFbnRpdHlNYW5hZ2VyLmV4ZWN1dGVRdWVyeUxvY2FsbHldXS5cclxuICAqKi9cclxuICBleGVjdXRlTG9jYWxseSgpIHtcclxuICAgIGlmICghdGhpcy5lbnRpdHlNYW5hZ2VyKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFuIEVudGl0eVF1ZXJ5IG11c3QgaGF2ZSBpdHMgRW50aXR5TWFuYWdlciBwcm9wZXJ0eSBzZXQgYmVmb3JlIGNhbGxpbmcgJ2V4ZWN1dGVMb2NhbGx5J1wiKTtcclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmVudGl0eU1hbmFnZXIuZXhlY3V0ZVF1ZXJ5TG9jYWxseSh0aGlzKTtcclxuICB9XHJcblxyXG4gIHRvSlNPTigpIHtcclxuICAgIHJldHVybiB0aGlzLnRvSlNPTkV4dCgpO1xyXG4gIH1cclxuXHJcbiAgLyoqIFR5cGljYWxseSBvbmx5IGZvciB1c2Ugd2hlbiBidWlsZGluZyBVcmlCdWlsZGVyQWRhcHRlcnMuICBcclxuICBAaGlkZGVuIEBpbnRlcm5hbCAgXHJcbiAgKi9cclxuICB0b0pTT05FeHQoY29udGV4dD86IEVudGl0eVF1ZXJ5SnNvbkNvbnRleHQpIHtcclxuICAgIGNvbnRleHQgPSBjb250ZXh0IHx8IHt9O1xyXG4gICAgY29udGV4dC5lbnRpdHlUeXBlID0gY29udGV4dC5lbnRpdHlUeXBlIHx8IHRoaXMuZnJvbUVudGl0eVR5cGU7XHJcbiAgICBjb250ZXh0LnByb3BlcnR5UGF0aEZuID0gY29udGV4dC50b05hbWVPblNlcnZlciA/IGNvbnRleHQuZW50aXR5VHlwZSEuY2xpZW50UHJvcGVydHlQYXRoVG9TZXJ2ZXIuYmluZChjb250ZXh0LmVudGl0eVR5cGUpIDogY29yZS5pZGVudGl0eTtcclxuXHJcbiAgICBsZXQgdG9KU09ORXh0Rm4gPSBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIHJldHVybiB2ID8gdi50b0pTT05FeHQoY29udGV4dCkgOiB1bmRlZmluZWQ7XHJcbiAgICB9O1xyXG4gICAgcmV0dXJuIGNvcmUudG9Kc29uKHRoaXMsIHtcclxuICAgICAgXCJmcm9tLHJlc291cmNlTmFtZVwiOiBudWxsLFxyXG4gICAgICBcInRvVHlwZSxyZXN1bHRFbnRpdHlUeXBlXCI6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgICAvLyByZXN1bHRFbnRpdHlUeXBlIGNhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gZW50aXR5VHlwZVxyXG4gICAgICAgIHJldHVybiB2ID8gKHR5cGVvZiB2ID09PSAnc3RyaW5nJyA/IHYgOiB2Lm5hbWUpIDogdW5kZWZpbmVkO1xyXG4gICAgICB9LFxyXG4gICAgICBcIndoZXJlLHdoZXJlUHJlZGljYXRlXCI6IHRvSlNPTkV4dEZuLFxyXG4gICAgICBcIm9yZGVyQnksb3JkZXJCeUNsYXVzZVwiOiB0b0pTT05FeHRGbixcclxuICAgICAgXCJzZWxlY3Qsc2VsZWN0Q2xhdXNlXCI6IHRvSlNPTkV4dEZuLFxyXG4gICAgICBcImV4cGFuZCxleHBhbmRDbGF1c2VcIjogdG9KU09ORXh0Rm4sXHJcbiAgICAgIFwic2tpcCxza2lwQ291bnRcIjogbnVsbCxcclxuICAgICAgXCJ0YWtlLHRha2VDb3VudFwiOiBudWxsLFxyXG4gICAgICBwYXJhbWV0ZXJzOiBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgICAgcmV0dXJuIGNvcmUuaXNFbXB0eSh2KSA/IHVuZGVmaW5lZCA6IHY7XHJcbiAgICAgIH0sXHJcbiAgICAgIFwiaW5saW5lQ291bnQsaW5saW5lQ291bnRFbmFibGVkXCI6IGZhbHNlLFxyXG4gICAgICBcIm5vVHJhY2tpbmcsbm9UcmFja2luZ0VuYWJsZWRcIjogZmFsc2UsXHJcbiAgICAgIHF1ZXJ5T3B0aW9uczogbnVsbFxyXG4gICAgfSk7XHJcblxyXG4gIH1cclxuXHJcbiAgc3RhdGljIGZyb21FbnRpdGllcyhlbnRpdHk6IEVudGl0eSk6IEVudGl0eVF1ZXJ5O1xyXG4gIHN0YXRpYyBmcm9tRW50aXRpZXMoZW50aXRpZXM6IEVudGl0eVtdKTogRW50aXR5UXVlcnk7XHJcbiAgLyoqXHJcbiAgU3RhdGljIG1ldGhvZCB0aGF0IGNyZWF0ZXMgYW4gRW50aXR5UXVlcnkgdGhhdCB3aWxsIGFsbG93ICdyZXF1ZXJ5aW5nJyBhbiBlbnRpdHkgb3IgYSBjb2xsZWN0aW9uIG9mIGVudGl0aWVzIGJ5IHByaW1hcnkga2V5LiBUaGlzIGNhbiBiZSB1c2VmdWxcclxuICB0byBmb3JjZSBhIHJlcXVlcnkgb2Ygc2VsZWN0ZWQgZW50aXRpZXMsIG9yIHRvIHJlc3RyaWN0IGFuIGV4aXN0aW5nIGNvbGxlY3Rpb24gb2YgZW50aXRpZXMgYWNjb3JkaW5nIHRvIHNvbWUgZmlsdGVyLlxyXG5cclxuICBXb3JrcyBmb3IgYSBzaW5nbGUgZW50aXR5IG9yIGFuIGFycmF5IG9mIGVudGl0aWVzIG9mIHRoZSBTQU1FIHR5cGUuXHJcbiAgRG9lcyBub3Qgd29yayBmb3IgYW4gYXJyYXkgb2YgZW50aXRpZXMgb2YgZGlmZmVyZW50IHR5cGVzLlxyXG4gID4gICAgICAvLyBhc3N1bWluZyAnY3VzdG9tZXJzJyBpcyBhbiBhcnJheSBvZiAnQ3VzdG9tZXInIGVudGl0aWVzIHJldHJpZXZlZCBlYXJsaWVyLlxyXG4gID4gICAgICBsZXQgY3VzdG9tZXJzUXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXRpZXMoY3VzdG9tZXJzKTtcclxuXHJcbiAgVGhlIHJlc3VsdGluZyBxdWVyeSBjYW4sIG9mIGNvdXJzZSwgYmUgZXh0ZW5kZWRcclxuICA+ICAgICAgLy8gYXNzdW1pbmcgJ2N1c3RvbWVycycgaXMgYW4gYXJyYXkgb2YgJ0N1c3RvbWVyJyBlbnRpdGllcyByZXRyaWV2ZWQgZWFybGllci5cclxuICA+ICAgICAgbGV0IGN1c3RvbWVyc1F1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbUVudGl0aWVzKGN1c3RvbWVycylcclxuICA+ICAgICAgICAud2hlcmUoXCJSZWdpb25cIiwgRmlsdGVyUXVlcnlPcC5Ob3RFcXVhbHMsIG51bGwpO1xyXG5cclxuICBTaW5nbGUgZW50aXRpZXMgY2FuIHJlcXVlcmllZCBhcyB3ZWxsLlxyXG4gID4gICAgICAvLyBhc3N1bWluZyAnY3VzdG9tZXInIGlzIGEgJ0N1c3RvbWVyJyBlbnRpdHkgcmV0cmlldmVkIGVhcmxpZXIuXHJcbiAgPiAgICAgIGxldCBjdXN0b21lclF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbUVudGl0aWVzKGN1c3RvbWVyKTtcclxuXHJcbiAgd2lsbCBjcmVhdGUgYSBxdWVyeSB0aGF0IHdpbGwgcmV0dXJuIGFuIGFycmF5IGNvbnRhaW5pbmcgYSBzaW5nbGUgY3VzdG9tZXIgZW50aXR5LlxyXG4gIEBwYXJhbSBlbnRpdGllcyAtIFRoZSBlbnRpdGllcyBmb3Igd2hpY2ggd2Ugd2FudCB0byBjcmVhdGUgYW4gRW50aXR5UXVlcnkuXHJcbiAgKiovXHJcbiAgc3RhdGljIGZyb21FbnRpdGllcyhlbnRpdGllczogRW50aXR5IHwgRW50aXR5W10pIHtcclxuICAgIGFzc2VydFBhcmFtKGVudGl0aWVzLCBcImVudGl0aWVzXCIpLmlzRW50aXR5KCkub3IoKS5pc05vbkVtcHR5QXJyYXkoKS5pc0VudGl0eSgpLmNoZWNrKCk7XHJcbiAgICBsZXQgZW50cyA9IChBcnJheS5pc0FycmF5KGVudGl0aWVzKSkgPyBlbnRpdGllcyA6IFtlbnRpdGllc107XHJcblxyXG4gICAgbGV0IGZpcnN0RW50aXR5ID0gZW50c1swXTtcclxuICAgIGxldCB0eXBlID0gZmlyc3RFbnRpdHkuZW50aXR5VHlwZTtcclxuICAgIGlmIChlbnRzLnNvbWUoZnVuY3Rpb24gKGUpIHtcclxuICAgICAgcmV0dXJuIGUuZW50aXR5VHlwZSAhPT0gdHlwZTtcclxuICAgIH0pKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFsbCAnZnJvbUVudGl0aWVzJyBtdXN0IGJlIHRoZSBzYW1lIHR5cGU7IGF0IGxlYXN0IG9uZSBpcyBub3Qgb2YgdHlwZSBcIiArXHJcbiAgICAgICAgdHlwZS5uYW1lKTtcclxuICAgIH1cclxuICAgIGxldCBxID0gbmV3IEVudGl0eVF1ZXJ5KHR5cGUuZGVmYXVsdFJlc291cmNlTmFtZSk7XHJcbiAgICBsZXQgcHJlZHMgPSBlbnRzLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7XHJcbiAgICAgIHJldHVybiBidWlsZFByZWRpY2F0ZShlbnRpdHkpO1xyXG4gICAgfSk7XHJcbiAgICBsZXQgcHJlZCA9IFByZWRpY2F0ZS5vcihwcmVkcyk7XHJcbiAgICBxID0gcS53aGVyZShwcmVkKTtcclxuICAgIGxldCBlbSA9IGZpcnN0RW50aXR5LmVudGl0eUFzcGVjdC5lbnRpdHlNYW5hZ2VyO1xyXG4gICAgaWYgKGVtKSB7XHJcbiAgICAgIHEgPSBxLnVzaW5nKGVtKTtcclxuICAgIH1cclxuICAgIHJldHVybiBxO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhbiBFbnRpdHlRdWVyeSBmb3IgdGhlIHNwZWNpZmllZCBbW0VudGl0eUtleV1dLlxyXG4gID4gICAgICBsZXQgZW1wVHlwZSA9IG1ldGFkYXRhU3RvcmUuZ2V0RW50aXR5VHlwZShcIkVtcGxveWVlXCIpO1xyXG4gID4gICAgICBsZXQgZW50aXR5S2V5ID0gbmV3IEVudGl0eUtleShlbXBUeXBlLCAxKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbUVudGl0eUtleShlbnRpdHlLZXkpO1xyXG5cclxuICBvclxyXG4gID4gICAgICAvLyAnZW1wbG95ZWUnIGlzIGEgcHJldmlvdXNseSBxdWVyaWVkIGVtcGxveWVlXHJcbiAgPiAgICAgIGxldCBlbnRpdHlLZXkgPSBlbXBsb3llZS5lbnRpdHlBc3BlY3QuZ2V0S2V5KCk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb21FbnRpdHlLZXkoZW50aXR5S2V5KTtcclxuICBAcGFyYW0gZW50aXR5S2V5IC0gVGhlIFtbRW50aXR5S2V5XV0gZm9yIHdoaWNoIGEgcXVlcnkgd2lsbCBiZSBjcmVhdGVkLlxyXG4gICoqL1xyXG4gIHN0YXRpYyBmcm9tRW50aXR5S2V5KGVudGl0eUtleTogRW50aXR5S2V5KSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbnRpdHlLZXksIFwiZW50aXR5S2V5XCIpLmlzSW5zdGFuY2VPZihFbnRpdHlLZXkpLmNoZWNrKCk7XHJcbiAgICBsZXQgcSA9IG5ldyBFbnRpdHlRdWVyeShlbnRpdHlLZXkuZW50aXR5VHlwZS5kZWZhdWx0UmVzb3VyY2VOYW1lKTtcclxuICAgIGxldCBwcmVkID0gYnVpbGRLZXlQcmVkaWNhdGUoZW50aXR5S2V5KTtcclxuICAgIHEgPSBxLndoZXJlKHByZWQpLnRvVHlwZShlbnRpdHlLZXkuZW50aXR5VHlwZSk7XHJcbiAgICByZXR1cm4gcTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIENyZWF0ZXMgYW4gRW50aXR5UXVlcnkgZm9yIHRoZSBzcGVjaWZpZWQgZW50aXR5IGFuZCBbW05hdmlnYXRpb25Qcm9wZXJ0eV1dLlxyXG4gID4gICAgICAvLyAnZW1wbG95ZWUnIGlzIGEgcHJldmlvdXNseSBxdWVyaWVkIGVtcGxveWVlXHJcbiAgPiAgICAgIGxldCBvcmRlcnNOYXZQcm9wID0gZW1wbG95ZWUuZW50aXR5VHlwZS5nZXRQcm9wZXJ0eShcIk9yZGVyc1wiKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbUVudGl0eU5hdmlnYXRpb24oZW1wbG95ZWUsIG9yZGVyc05hdlByb3ApO1xyXG5cclxuICB3aWxsIHJldHVybiBhIHF1ZXJ5IGZvciB0aGUgXCJPcmRlcnNcIiBvZiB0aGUgc3BlY2lmaWVkICdlbXBsb3llZScuXHJcbiAgQHBhcmFtIGVudGl0eSAtIFRoZSBFbnRpdHkgd2hvc2UgbmF2aWdhdGlvbiBwcm9wZXJ0eSB3aWxsIGJlIHF1ZXJpZWQuXHJcbiAgQHBhcmFtIG5hdmlnYXRpb25Qcm9wZXJ0eSAtIFRoZSBbW05hdmlnYXRpb25Qcm9wZXJ0eV1dIG9yIG5hbWUgb2YgdGhlIE5hdmlnYXRpb25Qcm9wZXJ0eSB0byBiZSBxdWVyaWVkLlxyXG4gICoqL1xyXG4gIHN0YXRpYyBmcm9tRW50aXR5TmF2aWdhdGlvbiA9IGZ1bmN0aW9uIChlbnRpdHk6IEVudGl0eSwgbmF2aWdhdGlvblByb3BlcnR5OiBOYXZpZ2F0aW9uUHJvcGVydHkgfCBzdHJpbmcpIHtcclxuICAgIGFzc2VydFBhcmFtKGVudGl0eSwgXCJlbnRpdHlcIikuaXNFbnRpdHkoKS5jaGVjaygpO1xyXG4gICAgbGV0IG5hdlByb3BlcnR5ID0gZW50aXR5LmVudGl0eVR5cGUuX2NoZWNrTmF2UHJvcGVydHkobmF2aWdhdGlvblByb3BlcnR5KTtcclxuICAgIGxldCBxID0gbmV3IEVudGl0eVF1ZXJ5KG5hdlByb3BlcnR5LmVudGl0eVR5cGUuZGVmYXVsdFJlc291cmNlTmFtZSk7XHJcbiAgICBsZXQgcHJlZCA9IGJ1aWxkTmF2aWdhdGlvblByZWRpY2F0ZShlbnRpdHksIG5hdlByb3BlcnR5KTtcclxuICAgIGlmIChwcmVkID09IG51bGwpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVW5hYmxlIHRvIGNyZWF0ZSBhIE5hdmlnYXRpb25RdWVyeSBmb3IgbmF2aWdhdGlvblByb3BlcnR5OiBcIiArIG5hdlByb3BlcnR5Lm5hbWUgKTtcclxuICAgIH1cclxuICAgIHEgPSBxLndoZXJlKHByZWQpO1xyXG4gICAgbGV0IGVtID0gZW50aXR5LmVudGl0eUFzcGVjdC5lbnRpdHlNYW5hZ2VyO1xyXG4gICAgcmV0dXJuIGVtID8gcS51c2luZyhlbSkgOiBxO1xyXG4gIH07XHJcblxyXG4gIC8vIHByb3RlY3RlZCBtZXRob2RzXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2dldEZyb21FbnRpdHlUeXBlKG1ldGFkYXRhU3RvcmU6IE1ldGFkYXRhU3RvcmUsIHRocm93RXJyb3JJZk5vdEZvdW5kPzogYm9vbGVhbikge1xyXG4gICAgLy8gVW5jb21tZW50IG5leHQgdHdvIGxpbmVzIGlmIHdlIG1ha2UgdGhpcyBtZXRob2QgcHVibGljLlxyXG4gICAgLy8gYXNzZXJ0UGFyYW0obWV0YWRhdGFTdG9yZSwgXCJtZXRhZGF0YVN0b3JlXCIpLmlzSW5zdGFuY2VPZihNZXRhZGF0YVN0b3JlKS5jaGVjaygpO1xyXG4gICAgLy8gYXNzZXJ0UGFyYW0odGhyb3dFcnJvcklmTm90Rm91bmQsIFwidGhyb3dFcnJvcklmTm90Rm91bmRcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBsZXQgZW50aXR5VHlwZSA9IHRoaXMuZnJvbUVudGl0eVR5cGU7XHJcbiAgICBpZiAoZW50aXR5VHlwZSkgcmV0dXJuIGVudGl0eVR5cGU7XHJcblxyXG4gICAgbGV0IHJlc291cmNlTmFtZSA9IHRoaXMucmVzb3VyY2VOYW1lO1xyXG4gICAgaWYgKCFyZXNvdXJjZU5hbWUpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhlcmUgaXMgbm8gcmVzb3VyY2VOYW1lIGZvciB0aGlzIHF1ZXJ5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChtZXRhZGF0YVN0b3JlLmlzRW1wdHkoKSkge1xyXG4gICAgICBpZiAodGhyb3dFcnJvcklmTm90Rm91bmQpIHtcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyBtZXRhZGF0YSBhdmFpbGFibGUgZm9yIHRoaXMgcXVlcnkuIFwiICtcclxuICAgICAgICAgIFwiQXJlIHlvdSBxdWVyeWluZyB0aGUgbG9jYWwgY2FjaGUgYmVmb3JlIHlvdSd2ZSBmZXRjaGVkIG1ldGFkYXRhP1wiKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IGVudGl0eVR5cGVOYW1lID0gbWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlTmFtZUZvclJlc291cmNlTmFtZShyZXNvdXJjZU5hbWUpO1xyXG4gICAgaWYgKGVudGl0eVR5cGVOYW1lKSB7XHJcbiAgICAgIGVudGl0eVR5cGUgPSBtZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZShlbnRpdHlUeXBlTmFtZSkgYXMgRW50aXR5VHlwZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGVudGl0eVR5cGUgPSB0aGlzLl9nZXRUb0VudGl0eVR5cGUobWV0YWRhdGFTdG9yZSwgdHJ1ZSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKCFlbnRpdHlUeXBlKSB7XHJcbiAgICAgIGlmICh0aHJvd0Vycm9ySWZOb3RGb3VuZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihjb3JlLmZvcm1hdFN0cmluZyhcIkNhbm5vdCBmaW5kIGFuIGVudGl0eVR5cGUgZm9yIHJlc291cmNlTmFtZTogJyUxJy4gXCIsIHJlc291cmNlTmFtZSkgKyBjb3JlLnN0cmluZ3MuVE9fVFlQRSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHRoaXMuZnJvbUVudGl0eVR5cGUgPSBlbnRpdHlUeXBlO1xyXG4gICAgcmV0dXJuIGVudGl0eVR5cGU7XHJcblxyXG4gIH1cclxuXHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX2dldFRvRW50aXR5VHlwZShtZXRhZGF0YVN0b3JlOiBNZXRhZGF0YVN0b3JlLCBza2lwRnJvbUNoZWNrPzogYm9vbGVhbik6IEVudGl0eVR5cGUgfCB1bmRlZmluZWQge1xyXG4gICAgLy8gc2tpcEZyb21DaGVjayBpcyB0byBhdm9pZCByZWN1cnNpb24gaWYgY2FsbGVkIGZyb20gX2dldEZyb21FbnRpdHlUeXBlO1xyXG4gICAgaWYgKHRoaXMucmVzdWx0RW50aXR5VHlwZSBpbnN0YW5jZW9mIEVudGl0eVR5cGUpIHtcclxuICAgICAgcmV0dXJuIHRoaXMucmVzdWx0RW50aXR5VHlwZTtcclxuICAgIH0gZWxzZSBpZiAodGhpcy5yZXN1bHRFbnRpdHlUeXBlKSB7XHJcbiAgICAgIC8vIHJlc3VsdEVudGl0eVR5cGUgaXMgYSBzdHJpbmdcclxuICAgICAgdGhpcy5yZXN1bHRFbnRpdHlUeXBlID0gbWV0YWRhdGFTdG9yZS5fZ2V0U3RydWN0dXJhbFR5cGUodGhpcy5yZXN1bHRFbnRpdHlUeXBlLCBmYWxzZSkgYXMgRW50aXR5VHlwZTtcclxuICAgICAgcmV0dXJuIHRoaXMucmVzdWx0RW50aXR5VHlwZTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIC8vIHJlc29sdmUgaXQsIGlmIHBvc3NpYmxlLCB2aWEgdGhlIHJlc291cmNlTmFtZVxyXG4gICAgICAvLyBkbyBub3QgY2FjaGUgdGhpcyB2YWx1ZSBpbiB0aGlzIGNhc2VcclxuICAgICAgLy8gY2Fubm90IGRldGVybWluZSB0aGUgcmVzdWx0RW50aXR5VHlwZSBpZiBhIHNlbGVjdENsYXVzZSBpcyBwcmVzZW50LlxyXG4gICAgICAvLyByZXR1cm4gc2tpcEZyb21DaGVjayA/IG51bGwgOiAoIXRoaXMuc2VsZWN0Q2xhdXNlKSAmJiB0aGlzLl9nZXRGcm9tRW50aXR5VHlwZShtZXRhZGF0YVN0b3JlLCBmYWxzZSk7XHJcbiAgICAgIGlmIChza2lwRnJvbUNoZWNrIHx8IHRoaXMuc2VsZWN0Q2xhdXNlKSB7XHJcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICB0aGlzLl9nZXRGcm9tRW50aXR5VHlwZShtZXRhZGF0YVN0b3JlLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICAvLyBmb3IgdGVzdGluZ1xyXG4gIF90b1VyaShlbTogRW50aXR5TWFuYWdlcikge1xyXG4gICAgbGV0IGRzID0gRGF0YVNlcnZpY2UucmVzb2x2ZShbZW0uZGF0YVNlcnZpY2VdKTtcclxuICAgIHJldHVybiBkcyEudXJpQnVpbGRlciEuYnVpbGRVcmkodGhpcywgZW0ubWV0YWRhdGFTdG9yZSk7XHJcbiAgfVxyXG5cclxufVxyXG5FbnRpdHlRdWVyeS5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiRW50aXR5UXVlcnlcIjtcclxuXHJcbi8vIHByaXZhdGUgZnVuY3Rpb25zXHJcblxyXG5mdW5jdGlvbiBmcm9tSlNPTihlcTogRW50aXR5UXVlcnksIGpzb246IE9iamVjdCkge1xyXG4gIGNvcmUudG9Kc29uKGpzb24sIHtcclxuICAgIFwicmVzb3VyY2VOYW1lLGZyb21cIjogbnVsbCxcclxuICAgIC8vIGp1c3QgdGhlIG5hbWUgY29tZXMgYmFjayBhbmQgd2lsbCBiZSByZXNvbHZlZCBsYXRlclxyXG4gICAgXCJyZXN1bHRFbnRpdHlUeXBlLHRvVHlwZVwiOiBudWxsLFxyXG4gICAgXCJ3aGVyZVByZWRpY2F0ZSx3aGVyZVwiOiBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIHJldHVybiB2ID8gbmV3IFByZWRpY2F0ZSh2KSA6IHVuZGVmaW5lZDtcclxuICAgIH0sXHJcbiAgICBcIm9yZGVyQnlDbGF1c2Usb3JkZXJCeVwiOiBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIHJldHVybiB2ID8gbmV3IE9yZGVyQnlDbGF1c2UodikgOiB1bmRlZmluZWQ7XHJcbiAgICB9LFxyXG4gICAgXCJzZWxlY3RDbGF1c2Usc2VsZWN0XCI6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyBuZXcgU2VsZWN0Q2xhdXNlKHYpIDogdW5kZWZpbmVkO1xyXG4gICAgfSxcclxuICAgIFwiZXhwYW5kQ2xhdXNlLGV4cGFuZFwiOiBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIHJldHVybiB2ID8gbmV3IEV4cGFuZENsYXVzZSh2KSA6IHVuZGVmaW5lZDtcclxuICAgIH0sXHJcbiAgICBcInNraXBDb3VudCxza2lwXCI6IG51bGwsXHJcbiAgICBcInRha2VDb3VudCx0YWtlXCI6IG51bGwsXHJcbiAgICBwYXJhbWV0ZXJzOiBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIHJldHVybiBjb3JlLmlzRW1wdHkodikgPyB1bmRlZmluZWQgOiB2O1xyXG4gICAgfSxcclxuICAgIFwiaW5saW5lQ291bnRFbmFibGVkLGlubGluZUNvdW50XCI6IGZhbHNlLFxyXG4gICAgXCJub1RyYWNraW5nRW5hYmxlZCxub1RyYWNraW5nXCI6IGZhbHNlLFxyXG4gICAgcXVlcnlPcHRpb25zOiBmdW5jdGlvbiAodjogYW55KSB7XHJcbiAgICAgIHJldHVybiB2ID8gUXVlcnlPcHRpb25zLmZyb21KU09OKHYpIDogdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH0sIGVxKTtcclxuICByZXR1cm4gZXE7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNsb25lKGVxOiBFbnRpdHlRdWVyeSwgcHJvcE5hbWU/OiBzdHJpbmcsIHZhbHVlPzogYW55KSB7XHJcbiAgLy8gaW1tdXRhYmxlIHF1ZXJpZXMgbWVhbiB0aGF0IHdlIGRvbid0IG5lZWQgdG8gY2xvbmUgaWYgbm8gY2hhbmdlIGluIHZhbHVlLlxyXG4gIGlmIChwcm9wTmFtZSkge1xyXG4gICAgaWYgKGVxW3Byb3BOYW1lXSA9PT0gdmFsdWUpIHJldHVybiBlcTtcclxuICB9XHJcbiAgLy8gY29weWluZyBRdWVyeU9wdGlvbnMgaXMgc2FmZSBiZWNhdXNlIHRoZXkgYXJlIGFyZSBpbW11dGFibGU7XHJcbiAgbGV0IGNvcHkgPSBjb3JlLmV4dGVuZChuZXcgRW50aXR5UXVlcnkoKSwgZXEsIFtcclxuICAgIFwicmVzb3VyY2VOYW1lXCIsXHJcbiAgICBcImZyb21FbnRpdHlUeXBlXCIsXHJcbiAgICBcIndoZXJlUHJlZGljYXRlXCIsXHJcbiAgICBcIm9yZGVyQnlDbGF1c2VcIixcclxuICAgIFwic2VsZWN0Q2xhdXNlXCIsXHJcbiAgICBcInNraXBDb3VudFwiLFxyXG4gICAgXCJ0YWtlQ291bnRcIixcclxuICAgIFwiZXhwYW5kQ2xhdXNlXCIsXHJcbiAgICBcImlubGluZUNvdW50RW5hYmxlZFwiLFxyXG4gICAgXCJub1RyYWNraW5nRW5hYmxlZFwiLFxyXG4gICAgXCJ1c2VzTmFtZU9uU2VydmVyXCIsXHJcbiAgICBcInF1ZXJ5T3B0aW9uc1wiLFxyXG4gICAgXCJlbnRpdHlNYW5hZ2VyXCIsXHJcbiAgICBcImRhdGFTZXJ2aWNlXCIsXHJcbiAgICBcInJlc3VsdEVudGl0eVR5cGVcIlxyXG4gIF0pIGFzIEVudGl0eVF1ZXJ5O1xyXG4gIGNvcHkucGFyYW1ldGVycyA9IGNvcmUuZXh0ZW5kKHt9LCBlcS5wYXJhbWV0ZXJzKTtcclxuICBpZiAocHJvcE5hbWUpIHtcclxuICAgIGNvcHlbcHJvcE5hbWVdID0gdmFsdWU7XHJcbiAgfVxyXG4gIHJldHVybiBjb3B5O1xyXG59XHJcblxyXG5mdW5jdGlvbiBwcm9jZXNzVXNpbmcoZXE6IEVudGl0eVF1ZXJ5LCBtYXA6IE9iamVjdCwgdmFsdWU6IGFueSwgcHJvcGVydHlOYW1lPzogc3RyaW5nKSB7XHJcbiAgbGV0IHR5cGVOYW1lID0gdmFsdWUuXyR0eXBlTmFtZSB8fCAoKHZhbHVlIGluc3RhbmNlb2YgQnJlZXplRW51bSkgJiYgKHZhbHVlLmNvbnN0cnVjdG9yIGFzIGFueSkubmFtZSk7XHJcbiAgbGV0IGtleSA9IHR5cGVOYW1lICYmIHR5cGVOYW1lLnN1YnN0cigwLCAxKS50b0xvd2VyQ2FzZSgpICsgdHlwZU5hbWUuc3Vic3RyKDEpO1xyXG4gIGlmIChwcm9wZXJ0eU5hbWUgJiYga2V5ICE9PSBwcm9wZXJ0eU5hbWUpIHtcclxuICAgIHRocm93IG5ldyBFcnJvcihcIkludmFsaWQgdmFsdWUgZm9yIHByb3BlcnR5OiBcIiArIHByb3BlcnR5TmFtZSk7XHJcbiAgfVxyXG4gIGlmIChrZXkpIHtcclxuICAgIGxldCBmbiA9IG1hcFtrZXldO1xyXG4gICAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCBjb25maWcgcHJvcGVydHk6IFwiICsga2V5KTtcclxuICAgIH0gZWxzZSBpZiAoZm4gPT09IG51bGwpIHtcclxuICAgICAgZXFba2V5XSA9IHZhbHVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZm4oZXEsIHZhbHVlKTtcclxuICAgIH1cclxuICB9IGVsc2Uge1xyXG4gICAgY29yZS5vYmplY3RGb3JFYWNoKHZhbHVlLCAocHJvcE5hbWUsIHZhbCkgPT4ge1xyXG4gICAgICBwcm9jZXNzVXNpbmcoZXEsIG1hcCwgdmFsLCBwcm9wTmFtZSk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbmZ1bmN0aW9uIG5vcm1hbGl6ZVByb3BlcnR5UGF0aHMocHJvcGVydHlQYXRoczogc3RyaW5nIHwgc3RyaW5nW10pIHtcclxuICBhc3NlcnRQYXJhbShwcm9wZXJ0eVBhdGhzLCBcInByb3BlcnR5UGF0aHNcIikuaXNPcHRpb25hbCgpLmlzU3RyaW5nKCkub3IoKS5pc0FycmF5KCkuaXNTdHJpbmcoKS5jaGVjaygpO1xyXG4gIGlmICh0eXBlb2YgcHJvcGVydHlQYXRocyA9PT0gJ3N0cmluZycpIHtcclxuICAgIHByb3BlcnR5UGF0aHMgPSBwcm9wZXJ0eVBhdGhzLnNwbGl0KFwiLFwiKTtcclxuICB9XHJcblxyXG4gIHByb3BlcnR5UGF0aHMgPSBwcm9wZXJ0eVBhdGhzLm1hcChmdW5jdGlvbiAocHApIHtcclxuICAgIHJldHVybiBwcC50cmltKCk7XHJcbiAgfSk7XHJcbiAgcmV0dXJuIHByb3BlcnR5UGF0aHM7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJ1aWxkUHJlZGljYXRlKGVudGl0eTogRW50aXR5KSB7XHJcbiAgbGV0IGVudGl0eVR5cGUgPSBlbnRpdHkuZW50aXR5VHlwZTtcclxuICBsZXQgcHJlZFBhcnRzID0gZW50aXR5VHlwZS5rZXlQcm9wZXJ0aWVzLm1hcChmdW5jdGlvbiAoa3ApIHtcclxuICAgIHJldHVybiBQcmVkaWNhdGUuY3JlYXRlKGtwLm5hbWUsIEZpbHRlclF1ZXJ5T3AuRXF1YWxzLCBlbnRpdHkuZ2V0UHJvcGVydHkoa3AubmFtZSkpO1xyXG4gIH0pO1xyXG4gIGxldCBwcmVkID0gUHJlZGljYXRlLmFuZChwcmVkUGFydHMpO1xyXG4gIHJldHVybiBwcmVkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZEtleVByZWRpY2F0ZShlbnRpdHlLZXk6IEVudGl0eUtleSkge1xyXG4gIGxldCBrZXlQcm9wcyA9IGVudGl0eUtleS5lbnRpdHlUeXBlLmtleVByb3BlcnRpZXM7XHJcbiAgbGV0IHByZWRzID0gY29yZS5hcnJheVppcChrZXlQcm9wcywgZW50aXR5S2V5LnZhbHVlcywgZnVuY3Rpb24gKGtwLCB2KSB7XHJcbiAgICByZXR1cm4gUHJlZGljYXRlLmNyZWF0ZShrcC5uYW1lLCBGaWx0ZXJRdWVyeU9wLkVxdWFscywgdik7XHJcbiAgfSk7XHJcbiAgbGV0IHByZWQgPSBQcmVkaWNhdGUuYW5kKHByZWRzKTtcclxuICByZXR1cm4gcHJlZDtcclxufVxyXG5cclxuZnVuY3Rpb24gYnVpbGROYXZpZ2F0aW9uUHJlZGljYXRlKGVudGl0eTogRW50aXR5LCBuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSkge1xyXG4gIGlmIChuYXZpZ2F0aW9uUHJvcGVydHkuaXNTY2FsYXIpIHtcclxuICAgIGlmIChuYXZpZ2F0aW9uUHJvcGVydHkuZm9yZWlnbktleU5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQgcmVsYXRlZEtleVZhbHVlcyA9IG5hdmlnYXRpb25Qcm9wZXJ0eS5mb3JlaWduS2V5TmFtZXMubWFwKChma05hbWUpID0+IHtcclxuICAgICAgcmV0dXJuIGVudGl0eS5nZXRQcm9wZXJ0eShma05hbWUpO1xyXG4gICAgfSk7XHJcbiAgICBsZXQgZW50aXR5S2V5ID0gbmV3IEVudGl0eUtleShuYXZpZ2F0aW9uUHJvcGVydHkuZW50aXR5VHlwZSwgcmVsYXRlZEtleVZhbHVlcyk7XHJcbiAgICByZXR1cm4gYnVpbGRLZXlQcmVkaWNhdGUoZW50aXR5S2V5KTtcclxuICB9IGVsc2Uge1xyXG4gICAgbGV0IGludmVyc2VOcCA9IG5hdmlnYXRpb25Qcm9wZXJ0eS5pbnZlcnNlO1xyXG4gICAgbGV0IGZvcmVpZ25LZXlOYW1lcyA9IGludmVyc2VOcCA/IGludmVyc2VOcC5mb3JlaWduS2V5TmFtZXMgOiBuYXZpZ2F0aW9uUHJvcGVydHkuaW52Rm9yZWlnbktleU5hbWVzO1xyXG4gICAgaWYgKGZvcmVpZ25LZXlOYW1lcy5sZW5ndGggPT09IDApIHJldHVybiBudWxsO1xyXG4gICAgbGV0IGtleVZhbHVlcyA9IGVudGl0eS5lbnRpdHlBc3BlY3QuZ2V0S2V5KCkudmFsdWVzO1xyXG4gICAgbGV0IHByZWRQYXJ0cyA9IGNvcmUuYXJyYXlaaXAoZm9yZWlnbktleU5hbWVzLCBrZXlWYWx1ZXMsIChma05hbWUsIGt2KSA9PiB7XHJcbiAgICAgIHJldHVybiBQcmVkaWNhdGUuY3JlYXRlKGZrTmFtZSwgRmlsdGVyUXVlcnlPcC5FcXVhbHMsIGt2KTtcclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIFByZWRpY2F0ZS5hbmQocHJlZFBhcnRzKTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBCYXNlIGNsYXNzIGZvciBCb29sZWFuUXVlcnlPcCBhbmQgRmlsdGVyUXVlcnlPcCAqL1xyXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5T3Age1xyXG4gIC8qKiBUaGUgb3BlcmF0b3IgZm9yIHRoaXMgZW51bS4gKi9cclxuICBvcGVyYXRvcjogc3RyaW5nO1xyXG59XHJcblxyXG5cclxuXHJcbi8qKlxyXG5GaWx0ZXJRdWVyeU9wIGlzIGFuICdFbnVtJyBjb250YWluaW5nIGFsbCBvZiB0aGUgdmFsaWQgIFtbUHJlZGljYXRlXV1cclxuZmlsdGVyIG9wZXJhdG9ycyBmb3IgYW4gW1tFbnRpdHlRdWVyeV1dLlxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIEZpbHRlclF1ZXJ5T3AgZXh0ZW5kcyBCcmVlemVFbnVtIGltcGxlbWVudHMgUXVlcnlPcCB7XHJcbiAgLyoqIFRoZSBvcGVyYXRvciBmb3IgdGhpcyBlbnVtLiAqL1xyXG4gIGRlY2xhcmUgb3BlcmF0b3I6IHN0cmluZztcclxuXHJcbiAgLyoqIEFsaWFzZXM6IFwiZXFcIiwgXCI9PVwiICoqL1xyXG4gIHN0YXRpYyBFcXVhbHMgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImVxXCIgfSk7XHJcbiAgLyoqICBBbGlhc2VzOiBcIm5lXCIsIFwiIT1cIiAgKiovXHJcbiAgc3RhdGljIE5vdEVxdWFscyA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwibmVcIiB9KTtcclxuICAvKiogQWxpYXNlczogXCJndFwiLCBcIj5cIiAgICoqL1xyXG4gIHN0YXRpYyBHcmVhdGVyVGhhbiA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiZ3RcIiB9KTtcclxuICAvKiogQWxpYXNlczogXCJsdFwiLCBcIjxcIiAgKiovXHJcbiAgc3RhdGljIExlc3NUaGFuID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJsdFwiIH0pO1xyXG4gIC8qKiAgQWxpYXNlczogXCJnZVwiLCBcIj49XCIgICoqL1xyXG4gIHN0YXRpYyBHcmVhdGVyVGhhbk9yRXF1YWwgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImdlXCIgfSk7XHJcbiAgLyoqICBBbGlhc2VzOiBcImxlXCIsIFwiPD1cIiAgKiovXHJcbiAgc3RhdGljIExlc3NUaGFuT3JFcXVhbCA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwibGVcIiB9KTtcclxuICAvKiogIFN0cmluZyBvcGVyYXRpb246IElzIGEgc3RyaW5nIGEgc3Vic3RyaW5nIG9mIGFub3RoZXIgc3RyaW5nLiAgQWxpYXNlczogXCJzdWJzdHJpbmdvZlwiICAgKiovXHJcbiAgc3RhdGljIENvbnRhaW5zID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJjb250YWluc1wiIH0pO1xyXG4gIC8qKiBObyBhbGlhc2VzICovXHJcbiAgc3RhdGljIFN0YXJ0c1dpdGggPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcInN0YXJ0c3dpdGhcIiB9KTtcclxuICAvKiogTm8gYWxpYXNlcyAqL1xyXG4gIHN0YXRpYyBFbmRzV2l0aCA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiZW5kc3dpdGhcIiB9KTtcclxuICAvKiogIEFsaWFzZXM6IFwic29tZVwiICAqKi9cclxuICBzdGF0aWMgQW55ID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJhbnlcIiB9KTtcclxuICAvKiogIEFsaWFzZXM6IFwiZXZlcnlcIiAgKiovXHJcbiAgc3RhdGljIEFsbCA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiYWxsXCIgfSk7XHJcbiAgLyoqIE5vIGFsaWFzZXMgKi9cclxuICBzdGF0aWMgSW4gPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImluXCIgfSk7XHJcbiAgLyoqIE5vIGFsaWFzZXMgKi9cclxuICBzdGF0aWMgSXNUeXBlT2YgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImlzb2ZcIiB9KTtcclxufVxyXG5GaWx0ZXJRdWVyeU9wLnByb3RvdHlwZS5fJHR5cGVOYW1lID0gXCJGaWx0ZXJRdWVyeU9wXCI7XHJcbkVycm9yWyd4J10gPSBGaWx0ZXJRdWVyeU9wLnJlc29sdmVTeW1ib2xzKCk7XHJcblxyXG5cclxuLyoqXHJcbiBCb29sZWFuUXVlcnlPcCBpcyBhbiAnRW51bScgY29udGFpbmluZyBhbGwgb2YgdGhlIHZhbGlkICBib29sZWFuXHJcbm9wZXJhdG9ycyBmb3IgYW4gW1tFbnRpdHlRdWVyeV1dLlxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIEJvb2xlYW5RdWVyeU9wIGV4dGVuZHMgQnJlZXplRW51bSBpbXBsZW1lbnRzIFF1ZXJ5T3Age1xyXG4gIC8qKiBUaGUgb3BlcmF0b3IgZm9yIHRoaXMgZW51bS4gKi9cclxuICBkZWNsYXJlIG9wZXJhdG9yOiBzdHJpbmc7XHJcblxyXG4gIHN0YXRpYyBBbmQgPSBuZXcgQm9vbGVhblF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJhbmRcIiB9KTtcclxuICBzdGF0aWMgT3IgPSBuZXcgQm9vbGVhblF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJvclwiIH0pO1xyXG4gIHN0YXRpYyBOb3QgPSBuZXcgQm9vbGVhblF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJub3RcIiB9KTtcclxuXHJcbn1cclxuQm9vbGVhblF1ZXJ5T3AucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIkJvb2xlYW5RdWVyeU9wXCI7XHJcbkVycm9yWyd4J10gPSBCb29sZWFuUXVlcnlPcC5yZXNvbHZlU3ltYm9scygpO1xyXG5cclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiAgVGhlIGNsYXNzIGlzIHVzZWQgaW4gbW9zdCBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uc1xyXG5AYWRhcHRlciAoc2VlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuXHJcblxyXG5BbiBPcmRlckJ5Q2xhdXNlIGlzIGEgZGVzY3JpcHRpb24gb2YgdGhlIHByb3BlcnRpZXMgYW5kIGRpcmVjdGlvbiB0aGF0IHRoZSByZXN1bHRcclxub2YgYSBxdWVyeSBzaG91bGQgYmUgc29ydGVkIGluLiAgT3JkZXJCeUNsYXVzZXMgYXJlIGltbXV0YWJsZSwgd2hpY2ggbWVhbnMgdGhhdCBhbnlcclxubWV0aG9kIHRoYXQgd291bGQgbW9kaWZ5IGFuIE9yZGVyQnlDbGF1c2UgYWN0dWFsbHkgcmV0dXJucyBhIG5ldyBPcmRlckJ5Q2xhdXNlLlxyXG5cclxuRm9yIGV4YW1wbGUgZm9yIGFuIEVtcGxveWVlIG9iamVjdCB3aXRoIHByb3BlcnRpZXMgb2YgJ0NvbXBhbnknIGFuZCAnTGFzdE5hbWUnIHRoZSBmb2xsb3dpbmcgd291bGQgYmUgdmFsaWQgZXhwcmVzc2lvbnM6XHJcbj4gICAgIGxldCBvYmMgPSBuZXcgT3JkZXJCeUNsYXVzZShcIkNvbXBhbnkuQ29tcGFueU5hbWUsIExhc3ROYW1lXCIpXHJcblxyXG5vclxyXG4+ICAgICBsZXQgb2JjID0gbmV3IE9yZGVyQnlDbGF1c2UoXCJDb21wYW55LkNvbXBhbnlOYW1lIGRlc2MsIExhc3ROYW1lXCIpXHJcblxyXG5vclxyXG4+ICAgICBsZXQgb2JjID0gbmV3IE9yZGVyQnlDbGF1c2UoXCJDb21wYW55LkNvbXBhbnlOYW1lLCBMYXN0TmFtZVwiLCB0cnVlKTtcclxuKi9cclxuZXhwb3J0IGNsYXNzIE9yZGVyQnlDbGF1c2Uge1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIGl0ZW1zOiBPcmRlckJ5SXRlbVtdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSB8IE9yZGVyQnlDbGF1c2VbXSwgaXNEZXNjPzogYm9vbGVhbikge1xyXG4gICAgaWYgKHByb3BlcnR5UGF0aHMubGVuZ3RoID09PSAwKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk9yZGVyQnlDbGF1c2UgY2Fubm90IGJlIGVtcHR5XCIpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIHlvdSBjYW4gYWxzbyBwYXNzIGluIGFuIGFycmF5IG9mIG9yZGVyQnlDbGF1c2VzXHJcbiAgICBpZiAocHJvcGVydHlQYXRoc1swXSBpbnN0YW5jZW9mIE9yZGVyQnlDbGF1c2UpIHtcclxuICAgICAgbGV0IGNsYXVzZXMgPSBwcm9wZXJ0eVBhdGhzIGFzIE9yZGVyQnlDbGF1c2VbXTtcclxuICAgICAgdGhpcy5pdGVtcyA9IGNvcmUuYXJyYXlGbGF0TWFwKGNsYXVzZXMsIGMgPT4gYy5pdGVtcyk7XHJcbiAgICAgIC8vIHRoaXMuaXRlbXMgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KGNsYXVzZXNbMF0uaXRlbXMsIGNsYXVzZXMuc2xpY2UoMSkubWFwKGNvcmUucGx1Y2soXCJpdGVtc1wiKSkpO1xyXG4gICAgICAvLyB0aGlzLml0ZW1zID0gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSwgY2xhdXNlcy5tYXAoY29yZS5wbHVjayhcIml0ZW1zXCIpKSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLml0ZW1zID0gKHByb3BlcnR5UGF0aHMgYXMgc3RyaW5nW10pLm1hcChmdW5jdGlvbiAocHApIHtcclxuICAgICAgICByZXR1cm4gbmV3IE9yZGVyQnlJdGVtKHBwLCBpc0Rlc2MpO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XHJcbiAgICBpZiAoZW50aXR5VHlwZSA9PSBudWxsIHx8IGVudGl0eVR5cGUuaXNBbm9ueW1vdXMpIHJldHVybjtcclxuICAgIHRoaXMuaXRlbXMuZm9yRWFjaCgoaXRlbSkgPT4ge1xyXG4gICAgICBpdGVtLnZhbGlkYXRlKGVudGl0eVR5cGUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRDb21wYXJlcihlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XHJcbiAgICBsZXQgb3JkZXJCeUZ1bmNzID0gdGhpcy5pdGVtcy5tYXAoZnVuY3Rpb24gKG9iYykge1xyXG4gICAgICByZXR1cm4gb2JjLmdldENvbXBhcmVyKGVudGl0eVR5cGUpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudGl0eTE6IGFueSwgZW50aXR5MjogYW55KSB7XHJcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXJCeUZ1bmNzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgbGV0IHJlc3VsdCA9IG9yZGVyQnlGdW5jc1tpXShlbnRpdHkxLCBlbnRpdHkyKTtcclxuICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICByZXR1cm4gMDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0b0pTT05FeHQoY29udGV4dDogRW50aXR5UXVlcnlKc29uQ29udGV4dCkge1xyXG4gICAgcmV0dXJuIHRoaXMuaXRlbXMubWFwKGZ1bmN0aW9uIChpdGVtKSB7XHJcbiAgICAgIHJldHVybiBjb250ZXh0LnByb3BlcnR5UGF0aEZuIShpdGVtLnByb3BlcnR5UGF0aCkgKyAoaXRlbS5pc0Rlc2MgPyBcIiBkZXNjXCIgOiBcIlwiKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcbi8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG5leHBvcnQgY2xhc3MgT3JkZXJCeUl0ZW0ge1xyXG4gIHByb3BlcnR5UGF0aDogc3RyaW5nO1xyXG4gIGlzRGVzYzogYm9vbGVhbjtcclxuICBsYXN0UHJvcGVydHk6IEVudGl0eVByb3BlcnR5O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eVBhdGg6IHN0cmluZywgaXNEZXNjPzogYm9vbGVhbikge1xyXG4gICAgaWYgKCEodHlwZW9mIHByb3BlcnR5UGF0aCA9PT0gJ3N0cmluZycpKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcInByb3BlcnR5UGF0aCBpcyBub3QgYSBzdHJpbmdcIik7XHJcbiAgICB9XHJcbiAgICBwcm9wZXJ0eVBhdGggPSBwcm9wZXJ0eVBhdGgudHJpbSgpO1xyXG5cclxuICAgIGxldCBwYXJ0cyA9IHByb3BlcnR5UGF0aC5zcGxpdCgnICcpO1xyXG4gICAgLy8gcGFydHNbMF0gaXMgdGhlIHByb3BlcnR5UGF0aDsgWzFdIHdvdWxkIGJlIHdoZXRoZXIgZGVzY2VuZGluZyBvciBub3QuXHJcbiAgICAvLyBpZiAocGFydHMubGVuZ3RoID4gMSAmJiBpc0Rlc2MgIT09IHRydWUgJiYgaXNEZXNjICE9PSBmYWxzZSkge1xyXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEgJiYgaXNEZXNjID09IG51bGwpIHtcclxuICAgICAgaXNEZXNjID0gY29yZS5zdHJpbmdTdGFydHNXaXRoKHBhcnRzWzFdLnRvTG93ZXJDYXNlKCksIFwiZGVzY1wiKTtcclxuICAgICAgaWYgKCFpc0Rlc2MpIHtcclxuICAgICAgICAvLyBpc0Rlc2MgaXMgZmFsc2UgYnV0IGNoZWNrIHRvIG1ha2Ugc3VyZSBpdHMgaW50ZW5kZWQuXHJcbiAgICAgICAgbGV0IGlzQXNjID0gY29yZS5zdHJpbmdTdGFydHNXaXRoKHBhcnRzWzFdLnRvTG93ZXJDYXNlKCksIFwiYXNjXCIpO1xyXG4gICAgICAgIGlmICghaXNBc2MpIHtcclxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcInRoZSBzZWNvbmQgd29yZCBpbiB0aGUgcHJvcGVydHlQYXRoIG11c3QgYmVnaW4gd2l0aCAnZGVzYycgb3IgJ2FzYydcIik7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgdGhpcy5wcm9wZXJ0eVBhdGggPSBwYXJ0c1swXTtcclxuICAgIHRoaXMuaXNEZXNjID0gaXNEZXNjIHx8IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgdmFsaWRhdGUoZW50aXR5VHlwZTogRW50aXR5VHlwZSk6IEVudGl0eVByb3BlcnR5IHwgdW5kZWZpbmVkIHtcclxuICAgIGlmIChlbnRpdHlUeXBlID09IG51bGwgfHwgZW50aXR5VHlwZS5pc0Fub255bW91cykgcmV0dXJuO1xyXG4gICAgLy8gd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gb24gYmFkIHByb3BlcnR5UGF0aFxyXG4gICAgdGhpcy5sYXN0UHJvcGVydHkgPSBlbnRpdHlUeXBlLmdldFByb3BlcnR5KHRoaXMucHJvcGVydHlQYXRoLCB0cnVlKSBhcyBFbnRpdHlQcm9wZXJ0eTtcclxuICAgIHJldHVybiB0aGlzLmxhc3RQcm9wZXJ0eTtcclxuICB9XHJcblxyXG4gIGdldENvbXBhcmVyKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICAgIGxldCBwcm9wRGF0YVR5cGU6IERhdGFUeXBlO1xyXG4gICAgbGV0IGlzQ2FzZVNlbnNpdGl2ZTogYm9vbGVhbjtcclxuICAgIGlmICghdGhpcy5sYXN0UHJvcGVydHkpIHRoaXMudmFsaWRhdGUoZW50aXR5VHlwZSk7XHJcbiAgICBpZiAodGhpcy5sYXN0UHJvcGVydHkpIHtcclxuICAgICAgcHJvcERhdGFUeXBlID0gKHRoaXMubGFzdFByb3BlcnR5IGFzIGFueSkuZGF0YVR5cGU7XHJcbiAgICAgIGlzQ2FzZVNlbnNpdGl2ZSA9IHRoaXMubGFzdFByb3BlcnR5LnBhcmVudFR5cGUubWV0YWRhdGFTdG9yZS5sb2NhbFF1ZXJ5Q29tcGFyaXNvbk9wdGlvbnMuaXNDYXNlU2Vuc2l0aXZlO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwcm9wZXJ0eVBhdGggPSB0aGlzLnByb3BlcnR5UGF0aDtcclxuICAgIGxldCBpc0Rlc2MgPSB0aGlzLmlzRGVzYztcclxuXHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudGl0eTE6IGFueSwgZW50aXR5MjogYW55KSB7XHJcbiAgICAgIGxldCB2YWx1ZTEgPSBFbnRpdHlBc3BlY3QuZ2V0UHJvcGVydHlQYXRoVmFsdWUoZW50aXR5MSwgcHJvcGVydHlQYXRoKTtcclxuICAgICAgbGV0IHZhbHVlMiA9IEVudGl0eUFzcGVjdC5nZXRQcm9wZXJ0eVBhdGhWYWx1ZShlbnRpdHkyLCBwcm9wZXJ0eVBhdGgpO1xyXG4gICAgICBsZXQgZGF0YVR5cGUgPSBwcm9wRGF0YVR5cGUgfHwgKHZhbHVlMSAmJiBEYXRhVHlwZS5mcm9tVmFsdWUodmFsdWUxKSkgfHwgRGF0YVR5cGUuZnJvbVZhbHVlKHZhbHVlMik7XHJcbiAgICAgIGlmIChkYXRhVHlwZSA9PT0gRGF0YVR5cGUuU3RyaW5nKSB7XHJcbiAgICAgICAgaWYgKGlzQ2FzZVNlbnNpdGl2ZSkge1xyXG4gICAgICAgICAgdmFsdWUxID0gdmFsdWUxIHx8IFwiXCI7XHJcbiAgICAgICAgICB2YWx1ZTIgPSB2YWx1ZTIgfHwgXCJcIjtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdmFsdWUxID0gKHZhbHVlMSB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgICAgdmFsdWUyID0gKHZhbHVlMiB8fCBcIlwiKS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBsZXQgbm9ybWFsaXplID0gRGF0YVR5cGUuZ2V0Q29tcGFyYWJsZUZuKGRhdGFUeXBlKTtcclxuICAgICAgICB2YWx1ZTEgPSBub3JtYWxpemUodmFsdWUxKTtcclxuICAgICAgICB2YWx1ZTIgPSBub3JtYWxpemUodmFsdWUyKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodmFsdWUxID09PSB2YWx1ZTIpIHtcclxuICAgICAgICByZXR1cm4gMDtcclxuICAgICAgfSBlbHNlIGlmICh2YWx1ZTEgPiB2YWx1ZTIgfHwgdmFsdWUyID09PSB1bmRlZmluZWQpIHtcclxuICAgICAgICByZXR1cm4gaXNEZXNjID8gLTEgOiAxO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiBpc0Rlc2MgPyAxIDogLTE7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgfVxyXG59XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gIFRoZSBjbGFzcyBpcyB1c2VkIGluIG1vc3QgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbnNcclxuQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKiovXHJcbmV4cG9ydCBjbGFzcyBTZWxlY3RDbGF1c2Uge1xyXG4gIHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdO1xyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIF9wYXRoTmFtZXM6IHN0cmluZ1tdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5wcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRocztcclxuICAgIHRoaXMuX3BhdGhOYW1lcyA9IHByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcCkge1xyXG4gICAgICByZXR1cm4gcHAucmVwbGFjZShcIi5cIiwgXCJfXCIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKSB7XHJcbiAgICBpZiAoZW50aXR5VHlwZSA9PSBudWxsIHx8IGVudGl0eVR5cGUuaXNBbm9ueW1vdXMpIHJldHVybjsgLy8gY2FuJ3QgdmFsaWRhdGUgeWV0XHJcbiAgICAvLyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBiYWQgcHJvcGVydHlQYXRoXHJcbiAgICB0aGlzLnByb3BlcnR5UGF0aHMuZm9yRWFjaChmdW5jdGlvbiAocGF0aCkge1xyXG4gICAgICBlbnRpdHlUeXBlLmdldFByb3BlcnR5KHBhdGgsIHRydWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICB0b0Z1bmN0aW9uKC8qIGNvbmZpZyAqLykge1xyXG4gICAgbGV0IHRoYXQgPSB0aGlzO1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uIChlbnRpdHk6IEVudGl0eSkge1xyXG4gICAgICBsZXQgcmVzdWx0ID0ge307XHJcbiAgICAgIHRoYXQucHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoLCBpKSB7XHJcbiAgICAgICAgcmVzdWx0W3RoYXQuX3BhdGhOYW1lc1tpXV0gPSBFbnRpdHlBc3BlY3QuZ2V0UHJvcGVydHlQYXRoVmFsdWUoZW50aXR5LCBwYXRoKTtcclxuICAgICAgfSk7XHJcbiAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgdG9KU09ORXh0KGNvbnRleHQ6IEVudGl0eVF1ZXJ5SnNvbkNvbnRleHQpIHtcclxuICAgIHJldHVybiB0aGlzLnByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcCkge1xyXG4gICAgICByZXR1cm4gY29udGV4dC5wcm9wZXJ0eVBhdGhGbiEocHApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG4vKiogRm9yIHVzZSBieSBicmVlemUgcGx1Z2luIGF1dGhvcnMgb25seS4gIFRoZSBjbGFzcyBpcyB1c2VkIGluIG1vc3QgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSBpbXBsZW1lbnRhdGlvbnNcclxuQGFkYXB0ZXIgKHNlZSBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dKSAgICBcclxuQGhpZGRlbiBcclxuKiovXHJcbmV4cG9ydCBjbGFzcyBFeHBhbmRDbGF1c2Uge1xyXG4gIHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSkge1xyXG4gICAgdGhpcy5wcm9wZXJ0eVBhdGhzID0gcHJvcGVydHlQYXRocztcclxuICB9XHJcblxyXG4gIHRvSlNPTkV4dChjb250ZXh0OiBFbnRpdHlRdWVyeUpzb25Db250ZXh0KSB7XHJcbiAgICByZXR1cm4gdGhpcy5wcm9wZXJ0eVBhdGhzLm1hcChmdW5jdGlvbiAocHApIHtcclxuICAgICAgcmV0dXJuIGNvbnRleHQucHJvcGVydHlQYXRoRm4hKHBwKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbn1cclxuXHJcblxyXG4iXX0=
|
|
1024
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXF1ZXJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VudGl0eS1xdWVyeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUEyQixNQUFNLFFBQVEsQ0FBQztBQUN2RCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsWUFBWSxFQUFVLE1BQU0saUJBQWlCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN6QyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxXQUFXLEVBQXNCLE1BQU0sZ0JBQWdCLENBQUM7QUFFakUsT0FBTyxFQUFpQixVQUFVLEVBQXNDLE1BQU0sbUJBQW1CLENBQUM7QUFDbEcsT0FBTyxFQUFFLFlBQVksRUFBZ0MsTUFBTSxpQkFBaUIsQ0FBQztBQUM3RSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBV3hDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBMEN0Qjs7Ozs7Ozs7T0FRRztJQUNILFlBQVksWUFBOEI7UUFDeEMsSUFBSSxZQUFZLElBQUksSUFBSSxJQUFJLENBQUMsT0FBTyxZQUFZLEtBQUssUUFBUSxDQUFDLEVBQUU7WUFDOUQsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsOEdBQThHO1FBQzlHLElBQUksQ0FBQyxZQUFZLEdBQUcsWUFBc0IsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsY0FBYyxHQUFHLFNBQVMsQ0FBQztRQUNoQyxJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztRQUMvQixJQUFJ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Q0FBQyxFQUFFLENBQUMsQ0FBQztRQUNyQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FFRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNvcmUsIENhbGxiYWNrLCBFcnJvckNhbGxiYWNrIH0gZnJvbSAnLi9jb3JlJztcclxuaW1wb3J0IHsgYXNzZXJ0UGFyYW0gfSBmcm9tICcuL2Fzc2VydC1wYXJhbSc7XHJcbmltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi9kYXRhLXR5cGUnO1xyXG5pbXBvcnQgeyBFbnRpdHlBc3BlY3QsIEVudGl0eSB9IGZyb20gJy4vZW50aXR5LWFzcGVjdCc7XHJcbmltcG9ydCB7IEVudGl0eUtleSB9IGZyb20gJy4vZW50aXR5LWtleSc7XHJcbmltcG9ydCB7IEJyZWV6ZUVudW0gfSBmcm9tICcuL2VudW0nO1xyXG5pbXBvcnQgeyBEYXRhU2VydmljZSwgSnNvblJlc3VsdHNBZGFwdGVyIH0gZnJvbSAnLi9kYXRhLXNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnRpdHlNYW5hZ2VyLCBRdWVyeVJlc3VsdCB9IGZyb20gJy4vZW50aXR5LW1hbmFnZXInO1xyXG5pbXBvcnQgeyBNZXRhZGF0YVN0b3JlLCBFbnRpdHlUeXBlLCBOYXZpZ2F0aW9uUHJvcGVydHksIEVudGl0eVByb3BlcnR5IH0gZnJvbSAnLi9lbnRpdHktbWV0YWRhdGEnO1xyXG5pbXBvcnQgeyBRdWVyeU9wdGlvbnMsIE1lcmdlU3RyYXRlZ3ksIEZldGNoU3RyYXRlZ3kgfSBmcm9tICcuL3F1ZXJ5LW9wdGlvbnMnO1xyXG5pbXBvcnQgeyBQcmVkaWNhdGUgfSBmcm9tICcuL3ByZWRpY2F0ZSc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJlY3Vyc2l2ZUFycmF5PFQ+IHtcclxuICBbaTogbnVtYmVyXTogVCB8IFJlY3Vyc2l2ZUFycmF5PFQ+O1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEVudGl0eVF1ZXJ5SnNvbkNvbnRleHQge1xyXG4gIGVudGl0eVR5cGU/OiBFbnRpdHlUeXBlO1xyXG4gIHByb3BlcnR5UGF0aEZuPzogRnVuY3Rpb247IC8vIFRPRE9cclxuICB0b05hbWVPblNlcnZlcj86IGJvb2xlYW47XHJcbn1cclxuLyoqXHJcbkFuIEVudGl0eVF1ZXJ5IGluc3RhbmNlIGlzIHVzZWQgdG8gcXVlcnkgZW50aXRpZXMgZWl0aGVyIGZyb20gYSByZW1vdGUgZGF0YXNvdXJjZSBvciBmcm9tIGEgbG9jYWwgW1tFbnRpdHlNYW5hZ2VyXV0uXHJcblxyXG5FbnRpdHlRdWVyaWVzIGFyZSBpbW11dGFibGUgLSB0aGlzIG1lYW5zIHRoYXQgYWxsIEVudGl0eVF1ZXJ5IG1ldGhvZHMgdGhhdCByZXR1cm4gYW4gRW50aXR5UXVlcnkgYWN0dWFsbHkgY3JlYXRlIGEgbmV3IEVudGl0eVF1ZXJ5LiAgVGhpcyBtZWFucyB0aGF0XHJcbkVudGl0eVF1ZXJpZXMgY2FuIGJlICdtb2RpZmllZCcgd2l0aG91dCBhZmZlY3RpbmcgYW55IGN1cnJlbnQgaW5zdGFuY2VzLlxyXG5AZHluYW1pY1xyXG4qKi9cclxuZXhwb3J0IGNsYXNzIEVudGl0eVF1ZXJ5IHtcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBkZWNsYXJlIF8kdHlwZU5hbWU6IHN0cmluZzsgLy8gYWN0dWFsbHkgcGxhY2VkIG9uIHByb3RvdHlwZVxyXG4gIC8vIHRvcCA9IHRoaXMudGFrZTsgLy8gVE9ETzogY29uc2lkZXJcclxuICAvKiogVGhlIHJlc291cmNlIG5hbWUgdXNlZCBieSB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICovXHJcbiAgZGVjbGFyZSByZXNvdXJjZU5hbWU/OiBzdHJpbmc7XHJcbiAgLyoqIFRoZSBbW0VudGl0eVR5cGVdXSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgJ2Zyb20nIGNsYXVzZSAoIHJlc291cmNlTmFtZSkgb2YgdGhlIHF1ZXJ5LiAgVGhpcyBpcyBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgYmUgc2V0IEFGVEVSIHRoZSBxdWVyeVxyXG4gIGhhcyBiZWVuIGV4ZWN1dGVkIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiB0aGUgW1tNZXRhZGF0YVN0b3JlXV0gYXNzb2NpYXRlZCB3aXRoIHRoZSBbW0VudGl0eU1hbmFnZXJdXSB0aGF0IHRoZSBxdWVyeSB3YXMgZXhlY3V0ZWQgYWdhaW5zdC5cclxuICBUaGlzIHZhbHVlIG1heSBiZSBudWxsIGlmIHRoZSBlbnRpdHlUeXBlIGNhbm5vdCBiZSBhc3NvY2lhdGVkIHdpdGggYSByZXNvdXJjZU5hbWUuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIGZyb21FbnRpdHlUeXBlPzogRW50aXR5VHlwZTtcclxuICAvKiogVGhlICd3aGVyZScgW1tQcmVkaWNhdGVdXSB1c2VkIGJ5IHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHdoZXJlUHJlZGljYXRlOiBQcmVkaWNhdGU7IC8vIFRPRE9cclxuICAvKiogVGhlIFtbT3JkZXJCeUNsYXVzZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgb3JkZXJCeUNsYXVzZT86IE9yZGVyQnlDbGF1c2U7XHJcbiAgLyoqIFRoZSBbW0V4cGFuZENsYXVzZV1dIHVzZWQgYnkgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAqL1xyXG4gIGRlY2xhcmUgZXhwYW5kQ2xhdXNlPzogRXhwYW5kQ2xhdXNlO1xyXG4gIC8qKiBUaGUgW1tTZWxlY3RDbGF1c2VdXSB1c2VkIGJ5IHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHNlbGVjdENsYXVzZT86IFNlbGVjdENsYXVzZTtcclxuICAvKiogVGhlIG51bWJlciBvZiBlbnRpdGllcyB0byAnc2tpcCcgZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHNraXBDb3VudD86IG51bWJlcjtcclxuICAvKiogVGhlIG51bWJlciBvZiBlbnRpdGllcyB0byAndGFrZScgZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHRha2VDb3VudD86IG51bWJlcjtcclxuICAvKiogQW55IGFkZGl0aW9uYWwgcGFyYW1ldGVycyB0aGF0IHdlcmUgYWRkZWQgdG8gdGhlIHF1ZXJ5IHZpYSB0aGUgJ3dpdGhQYXJhbWV0ZXJzJyBtZXRob2QuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHBhcmFtZXRlcnM6IE9iamVjdDtcclxuICAvKiogV2hldGhlciBhbiBpbmxpbmUgY291bnQgaXMgcmV0dXJuZWQgZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIGlubGluZUNvdW50RW5hYmxlZDogYm9vbGVhbjtcclxuICAvKiogV2hldGhlciBlbnRpdHkgdHJhY2tpbmcgaGFzIGJlZW4gZGlzYWJsZWQgZm9yIHRoaXMgcXVlcnkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIG5vVHJhY2tpbmdFbmFibGVkOiBib29sZWFuO1xyXG4gIC8qKiBXaGV0aGVyIHRvIHNlbmQgcXVlcnkgYXMgdGhlIGJvZHkgb2YgYSBQT1NUIHJlcXVlc3QuICAoU2VydmVyIG5lZWRzIHRvIGFjY29tb2RhdGUgUE9TVCkuIF9fUmVhZCBPbmx5X18gKi9cclxuICBkZWNsYXJlIHVzZVBvc3RFbmFibGVkOiBib29sZWFuO1xyXG4gIC8qKiBUaGUgW1tRdWVyeU9wdGlvbnNdXSBmb3IgdGhpcyBxdWVyeS4gX19SZWFkIE9ubHlfXyAgKiovXHJcbiAgLy8gZGVmYXVsdCBpcyB0byBnZXQgcXVlcnlPcHRpb25zIGFuZCBkYXRhU2VydmljZSBmcm9tIHRoZSBlbnRpdHlNYW5hZ2VyLlxyXG4gIGRlY2xhcmUgcXVlcnlPcHRpb25zPzogUXVlcnlPcHRpb25zO1xyXG4gIC8qKiBUaGUgW1tEYXRhU2VydmljZV1dIGZvciB0aGlzIHF1ZXJ5LiBfX1JlYWQgT25seV9fICAqKi9cclxuICBkZWNsYXJlIGRhdGFTZXJ2aWNlPzogRGF0YVNlcnZpY2U7XHJcbiAgLyoqIFRoZSBbW0VudGl0eU1hbmFnZXJdXSBmb3IgdGhpcyBxdWVyeS4gVGhpcyBtYXkgYmUgbnVsbCBhbmQgY2FuIGJlIHNldCB2aWEgdGhlICd1c2luZycgbWV0aG9kLiAgKiovXHJcbiAgZGVjbGFyZSBlbnRpdHlNYW5hZ2VyPzogRW50aXR5TWFuYWdlcjtcclxuICAvKiogIFRoZSBlbnRpdHlUeXBlIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBieSB0aGlzIHF1ZXJ5LiBcclxuICBUaGlzIHByb3BlcnR5IHdpbGwgb25seSBiZSBzZXQgaWYgdGhlICd0b1R5cGUnIG1ldGhvZCB3YXMgY2FsbGVkLiBfX1JlYWQgT25seV9fICovXHJcbiAgZGVjbGFyZSByZXN1bHRFbnRpdHlUeXBlOiBFbnRpdHlUeXBlIHwgc3RyaW5nO1xyXG4gIGRlY2xhcmUgdXNlc05hbWVPblNlcnZlcj86IGJvb2xlYW47XHJcblxyXG4gIC8qKiBDb25zdHJ1Y3RvclxyXG4gID4gICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcblxyXG4gIFVzdWFsbHkgdGhpcyBjb25zdHJ1Y3RvciB3aWxsIGJlIGZvbGxvd2VkIGJ5IGNhbGxzIHRvIGZpbHRlcmluZywgb3JkZXJpbmcgb3Igc2VsZWN0aW9uIG1ldGhvZHNcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiUmVnaW9uXCIpO1xyXG4gIEBwYXJhbSByZXNvdXJjZU5hbWUgLSBlaXRoZXIgYSByZXNvdXJjZSBuYW1lIG9yIGEgc2VyaWFsaXplZCBFbnRpdHlRdWVyeSAoIGNyZWF0ZWQgYnkgW1tFbnRpdHlRdWVyeS50b0pTT05dXSlcclxuICAqKi9cclxuICBjb25zdHJ1Y3RvcihyZXNvdXJjZU5hbWU/OiBzdHJpbmcgfCBPYmplY3QpIHtcclxuICAgIGlmIChyZXNvdXJjZU5hbWUgIT0gbnVsbCAmJiAodHlwZW9mIHJlc291cmNlTmFtZSAhPT0gJ3N0cmluZycpKSB7XHJcbiAgICAgIHJldHVybiBmcm9tSlNPTih0aGlzLCByZXNvdXJjZU5hbWUpO1xyXG4gICAgfVxyXG4gICAgLy8gVE9ETzogY2FzdCBhcyBzdHJpbmcgYmVsb3cgbmVlZGVkIGZvciBlYXJseSB2ZXJzaW9ucyBvZiBUeXBlRG9jIC0gYnV0IG5vdCBmb3IgcmVndWxhciBjb21waWxlIC0gY2hlY2sgbGF0ZXJcclxuICAgIHRoaXMucmVzb3VyY2VOYW1lID0gcmVzb3VyY2VOYW1lIGFzIHN0cmluZztcclxuICAgIHRoaXMuZnJvbUVudGl0eVR5cGUgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLndoZXJlUHJlZGljYXRlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5vcmRlckJ5Q2xhdXNlID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5zZWxlY3RDbGF1c2UgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnNraXBDb3VudCA9IHVuZGVmaW5lZDtcclxuICAgIHRoaXMudGFrZUNvdW50ID0gdW5kZWZpbmVkO1xyXG4gICAgdGhpcy5leHBhbmRDbGF1c2UgPSB1bmRlZmluZWQ7XHJcbiAgICB0aGlzLnBhcmFtZXRlcnMgPSB7fTtcclxuICAgIHRoaXMuaW5saW5lQ291bnRFbmFibGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLm5vVHJhY2tpbmdFbmFibGVkID0gZmFsc2U7XHJcbiAgICB0aGlzLnVzZVBvc3RFbmFibGVkID0gZmFsc2U7XHJcbiAgICAvLyBkZWZhdWx0IGlzIHRvIGdldCBxdWVyeU9wdGlvbnMgYW5kIGRhdGFTZXJ2aWNlIGZyb20gdGhlIGVudGl0eU1hbmFnZXIuXHJcbiAgICAvLyB0aGlzLnF1ZXJ5T3B0aW9ucyA9IG5ldyBRdWVyeU9wdGlvbnMoKTtcclxuICAgIC8vIHRoaXMuZGF0YVNlcnZpY2UgPSBuZXcgRGF0YVNlcnZpY2UoKTtcclxuICAgIHRoaXMuZW50aXR5TWFuYWdlciA9IHVuZGVmaW5lZDtcclxuXHJcbiAgfVxyXG5cclxuXHJcbiAgLyoqXHJcbiAgU3BlY2lmaWVzIHRoZSByZXNvdXJjZSB0byBxdWVyeSBmb3IgdGhpcyBFbnRpdHlRdWVyeS5cclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KClcclxuICA+ICAgICAgICAuZnJvbShcIkN1c3RvbWVyc1wiKTtcclxuXHJcbiAgaXMgdGhlIHNhbWUgYXNcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpO1xyXG4gIEBwYXJhbSByZXNvdXJjZU5hbWUgLSBUaGUgcmVzb3VyY2UgdG8gcXVlcnkuXHJcbiAgKiovXHJcbiAgZnJvbShyZXNvdXJjZU5hbWU6IHN0cmluZykge1xyXG4gICAgLy8gVE9ETzogdGhpbmsgYWJvdXQgYWxsb3dpbmcgZW50aXR5VHlwZSBhcyB3ZWxsXHJcbiAgICBhc3NlcnRQYXJhbShyZXNvdXJjZU5hbWUsIFwicmVzb3VyY2VOYW1lXCIpLmlzU3RyaW5nKCkuY2hlY2soKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInJlc291cmNlTmFtZVwiLCByZXNvdXJjZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgVGhpcyBpcyBhIHN0YXRpYyB2ZXJzaW9uIG9mIHRoZSBcImZyb21cIiBtZXRob2QgYW5kIGl0IGNyZWF0ZXMgYSAnYmFzZScgZW50aXR5UXVlcnkgZm9yIHRoZSBzcGVjaWZpZWQgcmVzb3VyY2UgbmFtZS5cclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbShcIkN1c3RvbWVyc1wiKTtcclxuXHJcbiAgaXMgdGhlIHNhbWUgYXNcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpO1xyXG4gIEBwYXJhbSByZXNvdXJjZU5hbWUgLSBUaGUgcmVzb3VyY2UgdG8gcXVlcnkuXHJcbiAgKiovXHJcbiAgc3RhdGljIGZyb20ocmVzb3VyY2VOYW1lOiBzdHJpbmcpIHtcclxuICAgIGFzc2VydFBhcmFtKHJlc291cmNlTmFtZSwgXCJyZXNvdXJjZU5hbWVcIikuaXNTdHJpbmcoKS5jaGVjaygpO1xyXG4gICAgcmV0dXJuIG5ldyBFbnRpdHlRdWVyeShyZXNvdXJjZU5hbWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgU3BlY2lmaWVzIHRoZSB0b3AgbGV2ZWwgRW50aXR5VHlwZSB0aGF0IHRoaXMgcXVlcnkgd2lsbCByZXR1cm4uICBPbmx5IG5lZWRlZCB3aGVuIGEgcXVlcnkgcmV0dXJucyBhIGpzb24gcmVzdWx0IHRoYXQgZG9lcyBub3QgaW5jbHVkZSB0eXBlIGluZm9ybWF0aW9uLFxyXG4gIG9yIHdoZW4gdXNpbmcgYSByZXNvdXJjZSBuYW1lIHRoYXQgaXMgbm90IGFzc29jaWF0ZWQgdG8gYW4gRW50aXR5VHlwZS5cclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KClcclxuICA+ICAgICAgICAuZnJvbShcIk15Q3VzdG9tTWV0aG9kXCIpXHJcbiAgPiAgICAgICAgLnRvVHlwZShcIkN1c3RvbWVyXCIpXHJcbiAgQHBhcmFtIGVudGl0eVR5cGUgLSBUaGUgdG9wIGxldmVsIEVudGl0eVR5cGUgdGhhdCB0aGlzIHF1ZXJ5IHdpbGwgcmV0dXJuLlxyXG4gIEBzdW1tYXJ5IElmIHRoZSBqc29uIHJlc3VsdCBjb25zaXN0cyBvZiBtb3JlIHRoYW4gYSBzaW1wbGUgZW50aXR5IG9yIGFycmF5IG9mIGVudGl0aWVzLCBjb25zaWRlciB1c2luZyBhIFtbSnNvblJlc3VsdHNBZGFwdGVyXV0gaW5zdGVhZC5cclxuICAqKi9cclxuICB0b1R5cGUoZW50aXR5VHlwZTogc3RyaW5nIHwgRW50aXR5VHlwZSkge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXR5VHlwZSwgXCJlbnRpdHlUeXBlXCIpLmlzU3RyaW5nKCkub3IoKS5pc0luc3RhbmNlT2YoRW50aXR5VHlwZSkuY2hlY2soKTtcclxuICAgIHJldHVybiBjbG9uZSh0aGlzLCBcInJlc3VsdEVudGl0eVR5cGVcIiwgZW50aXR5VHlwZSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgd2hlcmUocHJlZGljYXRlPzogUHJlZGljYXRlKTogRW50aXR5UXVlcnk7XHJcbiAgd2hlcmUocHJlZGljYXRlOiBPYmplY3QpOiBFbnRpdHlRdWVyeTtcclxuICB3aGVyZShwcm9wZXJ0eTogc3RyaW5nLCBvcGVyYXRvcjogc3RyaW5nLCB2YWx1ZTogYW55KTogRW50aXR5UXVlcnk7XHJcbiAgd2hlcmUocHJvcGVydHk6IHN0cmluZywgb3BlcmF0b3I6IEZpbHRlclF1ZXJ5T3AsIHZhbHVlOiBhbnkpOiBFbnRpdHlRdWVyeTtcclxuICB3aGVyZShwcm9wZXJ0eTogc3RyaW5nLCBmaWx0ZXJvcDogRmlsdGVyUXVlcnlPcCwgcHJvcGVydHkyOiBzdHJpbmcsIGZpbHRlcm9wMjogRmlsdGVyUXVlcnlPcCwgdmFsdWU6IGFueSk6IEVudGl0eVF1ZXJ5OyAgLy8gZm9yIGFueS9hbGwgY2xhdXNlc1xyXG4gIHdoZXJlKHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlcm9wOiBzdHJpbmcsIHByb3BlcnR5Mjogc3RyaW5nLCBmaWx0ZXJvcDI6IHN0cmluZywgdmFsdWU6IGFueSk6IEVudGl0eVF1ZXJ5OyAgLy8gZm9yIGFueS9hbGwgY2xhdXNlc1xyXG4gIHdoZXJlKHByb3BlcnR5OiBzdHJpbmcsIGZpbHRlcm9wOiBzdHJpbmcsIHByb3BlcnR5Mjogc3RyaW5nLCBmaWx0ZXJvcDI6IHN0cmluZywgcHJvcGVydHkzOiBzdHJpbmcsIGZpbHRlcm9wMzogc3RyaW5nLCB2YWx1ZTogYW55KTogRW50aXR5UXVlcnk7ICAvLyBmb3IgYW55L2FsbCBjbGF1c2VzXHJcbiAgd2hlcmUoYW5BcnJheTogUmVjdXJzaXZlQXJyYXk8c3RyaW5nIHwgbnVtYmVyIHwgRmlsdGVyUXVlcnlPcCB8IFByZWRpY2F0ZT4pOiBFbnRpdHlRdWVyeTtcclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHdpdGggYW4gYWRkZWQgZmlsdGVyIGNyaXRlcmlhOyBDYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHdoaWNoIG1lYW5zIHRvICdhbmQnIHdpdGggYW55IGV4aXN0aW5nXHJcbiAgUHJlZGljYXRlIG9yIGNhbiBiZSBjYWxsZWQgd2l0aCBudWxsIHRvIGNsZWFyIGFsbCBwcmVkaWNhdGVzLlxyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgIC53aGVyZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIik7XHJcblxyXG4gIFRoaXMgY2FuIGFsc28gYmUgZXhwcmVzc2VkIHVzaW5nIGFuIGV4cGxpY2l0IFtbRmlsdGVyUXVlcnlPcF1dIGFzXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgRmlsdGVyUXVlcnlPcC5TdGFydHNXaXRoLCBcIkNcIik7XHJcblxyXG4gIG9yIGEgcHJlY29uc3RydWN0ZWQgW1tQcmVkaWNhdGVdXSBtYXkgYmUgdXNlZFxyXG4gID4gICAgICBsZXQgcHJlZCA9IG5ldyBQcmVkaWNhdGUoXCJDb21wYW55TmFtZVwiLCBGaWx0ZXJRdWVyeU9wLlN0YXJ0c1dpdGgsIFwiQ1wiKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpLndoZXJlKHByZWQpO1xyXG5cclxuICBQcmVkaWNhdGVzIGFyZSBvZnRlbiB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBjb21iaW5lIG11bHRpcGxlIGNvbmRpdGlvbnMgaW4gYSBzaW5nbGUgZmlsdGVyLCBzdWNoIGFzXHJcbiAgPiAgICAgIGxldCBwcmVkID0gUHJlZGljYXRlLmNyZWF0ZShcIkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzd2l0aFwiLCBcIkNcIikuYW5kKFwiUmVnaW9uXCIsIEZpbHRlclF1ZXJ5T3AuRXF1YWxzLCBudWxsKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUocHJlZCk7XHJcblxyXG4gIE1vcmUgY29tcGxpY2F0ZWQgcXVlcmllcyBjYW4gbWFrZSB1c2Ugb2YgbmVzdGVkIHByb3BlcnR5IHBhdGhzXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIlByb2R1Y3RzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUoXCJDYXRlZ29yeS5DYXRlZ29yeU5hbWVcIiwgXCJzdGFydHN3aXRoXCIsIFwiU1wiKTtcclxuXHJcbiAgb3IgT0RhdGEgZnVuY3Rpb25zIC0gQSBsaXN0IG9mIHZhbGlkIE9EYXRhIGZ1bmN0aW9ucyBjYW4gYmUgZm91bmQgd2l0aGluIHRoZSBbW1ByZWRpY2F0ZV1dIGRvY3VtZW50YXRpb24uXHJcbiAgXHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgICAgLndoZXJlKFwidG9Mb3dlcihDb21wYW55TmFtZSlcIiwgXCJzdGFydHNXaXRoXCIsIFwiY1wiKTtcclxuXHJcbiAgb3IgdG8gYmUgZXZlbiBtb3JlIGJhcm9xdWVcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgICAud2hlcmUoXCJ0b1VwcGVyKHN1YnN0cmluZyhDb21wYW55TmFtZSwgMSwgMikpXCIsIEZpbHRlclF1ZXJ5T3AuRXF1YWxzLCBcIk9NXCIpO1xyXG4gIEBwYXJhbSBwcmVkaWNhdGUgLSAgQ2FuIGJlIGVpdGhlclxyXG4gICAgLSBhIHNpbmdsZSBbW1ByZWRpY2F0ZV1dXHJcblxyXG4gICAgLSB0aGUgcGFyYW1ldGVycyB0byBjcmVhdGUgYSAnc2ltcGxlJyBQcmVkaWNhdGVcclxuICAgIC0gLSAgYSBwcm9wZXJ0eSBuYW1lLCBhIHByb3BlcnR5IHBhdGggd2l0aCAnLicgYXMgcGF0aCBzZXBlcmF0b3JzIG9yIGEgcHJvcGVydHkgZXhwcmVzc2lvbiB7U3RyaW5nfVxyXG4gICAgLSAtICBhbiBvcGVyYXRvciAtIFtbRmlsdGVyUXVlcnlPcF1dIG9yIGl0J3Mgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBDYXNlIGlzIGlnbm9yZWRcclxuICAgIHdoZW4gaWYgYSBzdHJpbmcgaXMgcHJvdmlkZWQgYW5kIGFueSBzdHJpbmcgdGhhdCBtYXRjaGVzIG9uZSBvZiB0aGUgRmlsdGVyUXVlcnlPcCBhbGlhc2VzIHdpbGwgYmUgYWNjZXB0ZWQuXHJcbiAgICAtIC0gIGEgdmFsdWUge09iamVjdH0gLSBUaGlzIHdpbGwgYmUgdHJlYXRlZCBhcyBlaXRoZXIgYSBwcm9wZXJ0eSBleHByZXNzaW9uIG9yIGEgbGl0ZXJhbCBkZXBlbmRpbmcgb24gY29udGV4dC4gIFxyXG4gICAgSW4gZ2VuZXJhbCwgaWYgdGhlIHZhbHVlIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHByb3BlcnR5IGV4cHJlc3Npb24gaXQgd2lsbCBiZSwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhIGxpdGVyYWwuXHJcbiAgICBJbiBtb3N0IGNhc2VzIHRoaXMgd29ya3Mgd2VsbCwgYnV0IHlvdSBjYW4gYWxzbyBmb3JjZSB0aGUgaW50ZXJwcmV0YXRpb24gYnkgbWFraW5nIHRoZSB2YWx1ZSBhcmd1bWVudCBpdHNlbGYgYW4gb2JqZWN0IFxyXG4gICAgd2l0aCBhICd2YWx1ZScgcHJvcGVydHkgYW5kIGFuICdpc0xpdGVyYWwnIHByb3BlcnR5IHNldCB0byBlaXRoZXIgdHJ1ZSBvciBmYWxzZS5cclxuICAgIEJyZWV6ZSBhbHNvIHRyaWVzIHRvIGluZmVyIHRoZSBkYXRhVHlwZSBvZiBhbnkgbGl0ZXJhbCBiYXNlZCBvbiBjb250ZXh0LCBpZiB0aGlzIGZhaWxzIHlvdSBjYW4gZm9yY2UgdGhpcyBpbmZlcmVuY2UgYnkgbWFraW5nIHRoZSB2YWx1ZSBhcmd1bWVudCBcclxuICAgIGFuIG9iamVjdCB3aXRoIGEgJ3ZhbHVlJyBwcm9wZXJ0eSBhbmQgYSAnZGF0YVR5cGUncHJvcGVydHkgc2V0IHRvIG9uZSBvZiB0aGUgRGF0YVR5cGUgZW51bWVyYXRpb24gaW5zdGFuY2VzLlxyXG5cclxuICAgIC0gYSBudWxsIG9yIHVuZGVmaW5lZCAoIHRoaXMgY2F1c2VzIGFueSBleGlzdGluZyB3aGVyZSBjbGF1c2UgdG8gYmUgcmVtb3ZlZClcclxuICAqKi9cclxuICB3aGVyZSguLi5hcmdzOiBhbnlbXSkge1xyXG4gICAgbGV0IHdoZXJlUHJlZGljYXRlOiBQcmVkaWNhdGUgfCB1bmRlZmluZWQ7XHJcbiAgICBpZiAoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF0gIT0gbnVsbCkge1xyXG4gICAgICB3aGVyZVByZWRpY2F0ZSA9IFByZWRpY2F0ZS5jcmVhdGUoLi4uPGFueT5hcmdzKTtcclxuICAgICAgaWYgKHRoaXMuZnJvbUVudGl0eVR5cGUpIHdoZXJlUHJlZGljYXRlLl92YWxpZGF0ZSh0aGlzLmZyb21FbnRpdHlUeXBlKTtcclxuICAgICAgaWYgKHRoaXMud2hlcmVQcmVkaWNhdGUpIHtcclxuICAgICAgICB3aGVyZVByZWRpY2F0ZSA9IHRoaXMud2hlcmVQcmVkaWNhdGUuYW5kKHdoZXJlUHJlZGljYXRlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwid2hlcmVQcmVkaWNhdGVcIiwgd2hlcmVQcmVkaWNhdGUpO1xyXG4gIH1cclxuXHJcblxyXG4gIG9yZGVyQnkocHJvcGVydHlQYXRocz86IHN0cmluZywgaXNEZXNjZW5kaW5nPzogYm9vbGVhbik6IEVudGl0eVF1ZXJ5O1xyXG4gIG9yZGVyQnkocHJvcGVydHlQYXRoczogc3RyaW5nW10sIGlzRGVzY2VuZGluZz86IGJvb2xlYW4pOiBFbnRpdHlRdWVyeTtcclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgb3JkZXJzIHRoZSByZXN1bHRzIG9mIHRoZSBxdWVyeSBieSBwcm9wZXJ0eSBuYW1lLiAgQnkgZGVmYXVsdCBzb3J0aW5nIG9jY3VycyBpcyBhc2NlbmRpbmcgb3JkZXIsIGJ1dCBzb3J0aW5nIGluIGRlc2NlbmRpbmcgb3JkZXIgaXMgc3VwcG9ydGVkIGFzIHdlbGwuXHJcbiAgT3JkZXJCeSBjbGF1c2VzIG1heSBiZSBjaGFpbmVkLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiQ29tcGFueU5hbWVcIik7XHJcblxyXG4gIG9yIHRvIHNvcnQgYWNyb3NzIG11bHRpcGxlIHByb3BlcnRpZXNcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAub3JkZXJCeShcIlJlZ2lvbiwgQ29tcGFueU5hbWVcIik7XHJcblxyXG4gIE5lc3RlZCBwcm9wZXJ0eSBwYXRocyBhcmUgYWxzbyBzdXBwb3J0ZWRcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJQcm9kdWN0c1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiQ2F0ZWdvcnkuQ2F0ZWdvcnlOYW1lXCIpO1xyXG5cclxuICBTb3J0aW5nIGluIGRlc2NlbmRpbmcgb3JkZXIgaXMgc3VwcG9ydGVkIHZpYSB0aGUgYWRkaXRpb24gb2YgJyBkZXNjJyB0byB0aGUgZW5kIG9mIGFueSBwcm9wZXJ0eSBwYXRoLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiQ29tcGFueU5hbWUgZGVzY1wiKTtcclxuXHJcbiAgb3JcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAub3JkZXJCeShcIlJlZ2lvbiBkZXNjLCBDb21wYW55TmFtZSBkZXNjXCIpO1xyXG4gIEBwYXJhbSBwcm9wZXJ0eVBhdGhzIC0gQSBjb21tYS1zZXBhcmF0ZWQgKCcsJykgc3RyaW5nIG9mIHByb3BlcnR5IHBhdGhzIG9yIGFuIGFycmF5IG9mIHByb3BlcnR5IHBhdGhzLlxyXG4gIEVhY2ggcHJvcGVydHkgcGF0aCBjYW4gb3B0aW9uYWxseSBlbmQgd2l0aCBcIiBkZXNjXCIgdG8gZm9yY2UgYSBkZXNjZW5kaW5nIHNvcnQgb3JkZXIuIElmICdwcm9wZXJ0eVBhdGhzJyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYWxsIG9yZGVyaW5nIGlzIHJlbW92ZWQuXHJcbiAgQHBhcmFtIGlzRGVzY2VuZGluZyAtIElmIHNwZWNpZmllZCwgb3ZlcnJpZGVzIGFsbCBvZiB0aGUgZW1iZWRkZWQgJ2Rlc2MnIHRhZ3MgaW4gdGhlIHByZXZpb3VzbHkgc3BlY2lmaWVkIHByb3BlcnR5IHBhdGhzLlxyXG4gICoqL1xyXG4gIG9yZGVyQnkocHJvcGVydHlQYXRoczogc3RyaW5nIHwgc3RyaW5nW10sIGlzRGVzY2VuZGluZz86IGJvb2xlYW4pIHtcclxuICAgIC8vIHByb3BlcnR5UGF0aHM6IGNhbiBwYXNzIGluIGNyZWF0ZShcIkEuWCxCXCIpIG9yIGNyZWF0ZShcIkEuWCBkZXNjLCBCXCIpIG9yIGNyZWF0ZShcIkEuWCBkZXNjLEJcIiwgdHJ1ZV0pXHJcbiAgICAvLyBpc0Rlc2MgcGFyYW1ldGVyIHRydW1wcyBpc0Rlc2MgaW4gcHJvcGVydHlOYW1lLlxyXG4gICAgbGV0IG9yZGVyQnlDbGF1c2UgPSBwcm9wZXJ0eVBhdGhzID09IG51bGwgPyBudWxsIDogbmV3IE9yZGVyQnlDbGF1c2Uobm9ybWFsaXplUHJvcGVydHlQYXRocyhwcm9wZXJ0eVBhdGhzKSwgaXNEZXNjZW5kaW5nKTtcclxuICAgIGlmICh0aGlzLm9yZGVyQnlDbGF1c2UgJiYgb3JkZXJCeUNsYXVzZSkge1xyXG4gICAgICBvcmRlckJ5Q2xhdXNlID0gbmV3IE9yZGVyQnlDbGF1c2UoW3RoaXMub3JkZXJCeUNsYXVzZSwgb3JkZXJCeUNsYXVzZV0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwib3JkZXJCeUNsYXVzZVwiLCBvcmRlckJ5Q2xhdXNlKTtcclxuICB9XHJcblxyXG5cclxuICBvcmRlckJ5RGVzYyhwcm9wZXJ0eVBhdGhzOiBzdHJpbmcpOiBFbnRpdHlRdWVyeTtcclxuICBvcmRlckJ5RGVzYyhwcm9wZXJ0eVBhdGhzOiBzdHJpbmdbXSk6IEVudGl0eVF1ZXJ5O1xyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCBvcmRlcnMgdGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IGJ5IHByb3BlcnR5IG5hbWUgaW4gZGVzY2VuZGluZyBvcmRlci5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAub3JkZXJCeURlc2MoXCJDb21wYW55TmFtZVwiKTtcclxuXHJcbiAgb3IgdG8gc29ydCBhY3Jvc3MgbXVsdGlwbGUgcHJvcGVydGllc1xyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5RGVzYyhcIlJlZ2lvbiwgQ29tcGFueU5hbWVcIik7XHJcblxyXG4gIE5lc3RlZCBwcm9wZXJ0eSBwYXRocyBhcmUgYWxzbyBzdXBwb3J0ZWRcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJQcm9kdWN0c1wiKVxyXG4gID4gICAgICAgIC5vcmRlckJ5RGVzYyhcIkNhdGVnb3J5LkNhdGVnb3J5TmFtZVwiKTtcclxuICBAcGFyYW0gcHJvcGVydHlQYXRocyAtIEEgY29tbWEtc2VwYXJhdGVkICgnLCcpIHN0cmluZyBvZiBwcm9wZXJ0eSBwYXRocyBvciBhbiBhcnJheSBvZiBwcm9wZXJ0eSBwYXRocy5cclxuICBJZiAncHJvcGVydHlQYXRocycgaXMgZWl0aGVyIG51bGwgb3Igb21pdHRlZCB0aGVuIGFsbCBvcmRlcmluZyBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIG9yZGVyQnlEZXNjKHByb3BlcnR5UGF0aHM6IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vcmRlckJ5KHByb3BlcnR5UGF0aHMgYXMgYW55LCB0cnVlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCBzZWxlY3RzIGEgbGlzdCBvZiBwcm9wZXJ0aWVzIGZyb20gdGhlIHJlc3VsdHMgb2YgdGhlIG9yaWdpbmFsIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSB2YWx1ZXMgb2YganVzdCB0aGVzZSBwcm9wZXJ0aWVzLiBUaGlzXHJcbiAgd2lsbCBiZSByZWZlcnJlZCB0byBhcyBhIHByb2plY3Rpb24uXHJcbiAgSWYgdGhlIHJlc3VsdCBvZiB0aGlzIHNlbGVjdGlvbiBcInByb2plY3Rpb25cIiBjb250YWlucyBlbnRpdGllcywgdGhlc2UgZW50aXRpZXMgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGFkZGVkIHRvIEVudGl0eU1hbmFnZXIncyBjYWNoZSBhbmQgd2lsbFxyXG4gIGJlIG1hZGUgJ29ic2VydmFibGUnLlxyXG4gIEFueSBzaW1wbGUgcHJvcGVydGllcywgaS5lLiBzdHJpbmdzLCBudW1iZXJzIG9yIGRhdGVzIHdpdGhpbiBhIHByb2plY3Rpb24gd2lsbCBub3QgYmUgY2FjaGVkIGFyZSB3aWxsIE5PVCBiZSBtYWRlICdvYnNlcnZhYmxlJy5cclxuICBcclxuICBTaW1wbGUgZGF0YSBwcm9wZXJ0aWVzIGNhbiBiZSBwcm9qZWN0ZWRcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgICAuc2VsZWN0KFwiQ29tcGFueU5hbWVcIik7XHJcblxyXG4gIFRoaXMgd2lsbCByZXR1cm4gYW4gYXJyYXkgb2Ygb2JqZWN0cyBlYWNoIHdpdGggYSBzaW5nbGUgXCJDb21wYW55TmFtZVwiIHByb3BlcnR5IG9mIHR5cGUgc3RyaW5nLlxyXG4gIEEgc2ltaWxhciBxdWVyeSBjb3VsZCByZXR1cm4gYSBuYXZpZ2F0aW9uIHByb3BlcnR5IGluc3RlYWRcclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgLnNlbGVjdChcIk9yZGVyc1wiKTtcclxuXHJcbiAgd2hlcmUgdGhlIHJlc3VsdCB3b3VsZCBiZSBhbiBhcnJheSBvZiBvYmplY3RzIGVhY2ggd2l0aCBhIHNpbmdsZSBcIk9yZGVyc1wiIHByb3BlcnR5IHRoYXQgd291bGQgaXRzZWxmIGJlIGFuIGFycmF5IG9mIFwiT3JkZXJcIiBlbnRpdGllcy5cclxuICBDb21wb3NpdGUgcHJvamVjdGlvbnMgYXJlIGFsc28gcG9zc2libGU6XHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLndoZXJlKFwiQ29tcGFueU5hbWVcIiwgXCJzdGFydHNXaXRoXCIsIFwiQ1wiKVxyXG4gID4gICAgICAgIC5zZWxlY3QoXCJDb21wYW55TmFtZSwgT3JkZXJzXCIpO1xyXG5cclxuICBBcyB3ZWxsIGFzIHByb2plY3Rpb25zIGludm9sdmluZyBuZXN0ZWQgcHJvcGVydHkgcGF0aHNcclxuICA+ICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKVxyXG4gID4gICAgICAgIC53aGVyZShcIkN1c3RvbWVyLkNvbXBhbnlOYW1lXCIsIFwic3RhcnRzV2l0aFwiLCBcIkNcIilcclxuICA+ICAgICAgICAuc2VsZWN0KFwiQ3VzdG9tZXIuQ29tcGFueU5hbWUsIEN1c3RvbWVyLCBPcmRlckRhdGVcIik7XHJcbiAgQHBhcmFtIHByb3BlcnR5UGF0aHMgLSBBIGNvbW1hLXNlcGFyYXRlZCAoJywnKSBzdHJpbmcgb2YgcHJvcGVydHkgcGF0aHMgb3IgYW4gYXJyYXkgb2YgcHJvcGVydHkgcGF0aHMuXHJcbiAgSWYgJ3Byb3BlcnR5UGF0aHMnIGlzIGVpdGhlciBudWxsIG9yIG9taXR0ZWQgdGhlbiBhbnkgZXhpc3RpbmcgcHJvamVjdGlvbiBvbiB0aGUgcXVlcnkgaXMgcmVtb3ZlZC5cclxuICAqKi9cclxuICBzZWxlY3QocHJvcGVydHlQYXRocz86IHN0cmluZyB8IHN0cmluZ1tdKSB7XHJcbiAgICBsZXQgc2VsZWN0Q2xhdXNlID0gcHJvcGVydHlQYXRocyA9PSBudWxsID8gbnVsbCA6IG5ldyBTZWxlY3RDbGF1c2Uobm9ybWFsaXplUHJvcGVydHlQYXRocyhwcm9wZXJ0eVBhdGhzKSk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJzZWxlY3RDbGF1c2VcIiwgc2VsZWN0Q2xhdXNlKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCBza2lwcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRpdGllcyB3aGVuIHJldHVybmluZyByZXN1bHRzLlxyXG4gIEFueSBleGlzdGluZyAnc2tpcCcgY2FuIGJlIGNsZWFyZWQgYnkgY2FsbGluZyAnc2tpcCcgd2l0aCBubyBhcmd1bWVudHMuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAuc2tpcCg1KTtcclxuICBAcGFyYW0gY291bnQgLSBUaGUgbnVtYmVyIG9mIGVudGl0aWVzIHRvIHNraXAgb3Zlci4gSWYgb21pdHRlZCBvciBudWxsIGFueSBleGlzdGluZyBza2lwIGNvdW50IG9uIHRoZSBxdWVyeSBpcyByZW1vdmVkLlxyXG4gICoqL1xyXG4gIHNraXAoY291bnQ/OiBudW1iZXIpIHtcclxuICAgIGFzc2VydFBhcmFtKGNvdW50LCBcImNvdW50XCIpLmlzT3B0aW9uYWwoKS5pc051bWJlcigpLmNoZWNrKCk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJza2lwQ291bnRcIiwgKGNvdW50ID09IG51bGwpID8gbnVsbCA6IGNvdW50KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBuZXcgcXVlcnkgdGhhdCByZXR1cm5zIG9ubHkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50aXRpZXMgd2hlbiByZXR1cm5pbmcgcmVzdWx0cy4gLSBTYW1lIGFzICd0YWtlJy5cclxuICBBbnkgZXhpc3RpbmcgJ3RvcCcgY2FuIGJlIGNsZWFyZWQgYnkgY2FsbGluZyAndG9wJyB3aXRoIG5vIGFyZ3VtZW50cy5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAudG9wKDUpO1xyXG4gIEBwYXJhbSBjb3VudCAtIFRoZSBudW1iZXIgb2YgZW50aXRpZXMgdG8gcmV0dXJuLlxyXG4gIElmICdjb3VudCcgaXMgZWl0aGVyIG51bGwgb3Igb21pdHRlZCB0aGVuIGFueSBleGlzdGluZyAndG9wJyBjb3VudCBvbiB0aGUgcXVlcnkgaXMgcmVtb3ZlZC5cclxuICAqKi9cclxuICB0b3AoY291bnQ/OiBudW1iZXIpIHtcclxuICAgIHJldHVybiB0aGlzLnRha2UoY291bnQpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIG5ldyBxdWVyeSB0aGF0IHJldHVybnMgb25seSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRpdGllcyB3aGVuIHJldHVybmluZyByZXN1bHRzIC0gU2FtZSBhcyAndG9wJy5cclxuICBBbnkgZXhpc3RpbmcgdGFrZSBjYW4gYmUgY2xlYXJlZCBieSBjYWxsaW5nIHRha2Ugd2l0aCBubyBhcmd1bWVudHMuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiQ3VzdG9tZXJzXCIpXHJcbiAgPiAgICAgICAgLnRha2UoNSk7XHJcbiAgQHBhcmFtIGNvdW50IC0gVGhlIG51bWJlciBvZiBlbnRpdGllcyB0byByZXR1cm4uXHJcbiAgSWYgJ2NvdW50JyBpcyBlaXRoZXIgbnVsbCBvciBvbWl0dGVkIHRoZW4gYW55IGV4aXN0aW5nICd0YWtlJyBjb3VudCBvbiB0aGUgcXVlcnkgaXMgcmVtb3ZlZC5cclxuICAqKi9cclxuICB0YWtlKGNvdW50PzogbnVtYmVyKSB7XHJcbiAgICBhc3NlcnRQYXJhbShjb3VudCwgXCJjb3VudFwiKS5pc09wdGlvbmFsKCkuaXNOdW1iZXIoKS5jaGVjaygpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwidGFrZUNvdW50XCIsIChjb3VudCA9PSBudWxsKSA/IG51bGwgOiBjb3VudCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgd2lsbCByZXR1cm4gcmVsYXRlZCBlbnRpdGllcyBuZXN0ZWQgd2l0aGluIGl0cyByZXN1bHRzLiBUaGUgZXhwYW5kIG1ldGhvZCBhbGxvd3MgeW91IHRvIGlkZW50aWZ5IHJlbGF0ZWQgZW50aXRpZXMsIHZpYSBuYXZpZ2F0aW9uIHByb3BlcnR5XHJcbiAgbmFtZXMgc3VjaCB0aGF0IGEgZ3JhcGggb2YgZW50aXRpZXMgbWF5IGJlIHJldHJpZXZlZCB3aXRoIGEgc2luZ2xlIHJlcXVlc3QuIEFueSBmaWx0ZXJpbmcgb2NjdXJzIGJlZm9yZSB0aGUgcmVzdWx0cyBhcmUgJ2V4cGFuZGVkJy5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAud2hlcmUoXCJDb21wYW55TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJDXCIpXHJcbiAgPiAgICAgICAgLmV4cGFuZChcIk9yZGVyc1wiKTtcclxuXHJcbiAgd2lsbCByZXR1cm4gdGhlIGZpbHRlcmVkIGN1c3RvbWVycyBlYWNoIHdpdGggaXRzIFwiT3JkZXJzXCIgcHJvcGVydGllcyBmdWxseSByZXNvbHZlZC5cclxuICBNdWx0aXBsZSBwYXRocyBtYXkgYmUgc3BlY2lmaWVkIGJ5IHNlcGFyYXRpbmcgdGhlIHBhdGhzIGJ5IGEgJywnXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpXHJcbiAgPiAgICAgICAgLmV4cGFuZChcIkN1c3RvbWVyLCBFbXBsb3llZVwiKVxyXG5cclxuICBhbmQgbmVzdGVkIHByb3BlcnR5IHBhdGhzIG15IGJlIHNwZWNpZmllZCBhcyB3ZWxsXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpXHJcbiAgPiAgICAgICAgLmV4cGFuZChcIkN1c3RvbWVyLCBPcmRlckRldGFpbHMsIE9yZGVyRGV0YWlscy5Qcm9kdWN0XCIpXHJcbiAgQHBhcmFtIHByb3BlcnR5UGF0aHMgLSBBIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5hdmlnYXRpb24gcHJvcGVydHkgbmFtZXMgb3IgYW4gYXJyYXkgb2YgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lcy4gRWFjaCBOYXZpZ2F0aW9uIFByb3BlcnR5IG5hbWUgY2FuIGJlIGZvbGxvd2VkXHJcbiAgYnkgYSAnLicgYW5kIGFub3RoZXIgbmF2aWdhdGlvbiBwcm9wZXJ0eSBuYW1lIHRvIGVuYWJsZSBpZGVudGlmeWluZyBhIG11bHRpLWxldmVsIHJlbGF0aW9uc2hpcC5cclxuICBJZiAncHJvcGVydHlQYXRocycgaXMgZWl0aGVyIG51bGwgb3Igb21pdHRlZCB0aGVuIGFueSBleGlzdGluZyAnZXhwYW5kJyBjbGF1c2Ugb24gdGhlIHF1ZXJ5IGlzIHJlbW92ZWQuXHJcbiAgKiovXHJcbiAgZXhwYW5kKHByb3BlcnR5UGF0aHM/OiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gICAgbGV0IGV4cGFuZENsYXVzZSA9IHByb3BlcnR5UGF0aHMgPT0gbnVsbCA/IG51bGwgOiBuZXcgRXhwYW5kQ2xhdXNlKG5vcm1hbGl6ZVByb3BlcnR5UGF0aHMocHJvcGVydHlQYXRocykpO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwiZXhwYW5kQ2xhdXNlXCIsIGV4cGFuZENsYXVzZSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgbmV3IHF1ZXJ5IHRoYXQgaW5jbHVkZXMgYSBjb2xsZWN0aW9uIG9mIHBhcmFtZXRlcnMgdG8gcGFzcyB0byB0aGUgc2VydmVyLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb20oXCJFbXBsb3llZXNGaWx0ZXJlZEJ5Q291bnRyeUFuZEJpcnRoZGF0ZVwiKVxyXG4gID4gICAgICAgIC53aXRoUGFyYW1ldGVycyh7IEJpcnRoRGF0ZTogXCIxLzEvMTk2MFwiLCBDb3VudHJ5OiBcIlVTQVwiIH0pO1xyXG4gICBcclxuICB3aWxsIGNhbGwgdGhlICdFbXBsb3llZXNGaWx0ZXJlZEJ5Q291bnRyeUFuZEJpcnRoZGF0ZScgbWV0aG9kIG9uIHRoZSBzZXJ2ZXIgYW5kIHBhc3MgaW4gMiBwYXJhbWV0ZXJzLiBUaGlzXHJcbiAgcXVlcnkgd2lsbCBiZSB1cmkgZW5jb2RlZCBhc1xyXG4gID4gICAgICB7c2VydmljZUFwaX0vRW1wbG95ZWVzRmlsdGVyZWRCeUNvdW50cnlBbmRCaXJ0aGRhdGU/YmlydGhEYXRlPTElMkYxJTJGMTk2MCZjb3VudHJ5PVVTQVxyXG5cclxuICBQYXJhbWV0ZXJzIG1heSBhbHNvIGJlIG1peGVkIGluIHdpdGggb3RoZXIgcXVlcnkgY3JpdGVyaWEuXHJcbiAgPiAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbShcIkVtcGxveWVlc0ZpbHRlcmVkQnlDb3VudHJ5QW5kQmlydGhkYXRlXCIpXHJcbiAgPiAgICAgICAgLndpdGhQYXJhbWV0ZXJzKHsgQmlydGhEYXRlOiBcIjEvMS8xOTYwXCIsIENvdW50cnk6IFwiVVNBXCIgfSlcclxuICA+ICAgICAgICAud2hlcmUoXCJMYXN0TmFtZVwiLCBcInN0YXJ0c1dpdGhcIiwgXCJTXCIpXHJcbiAgPiAgICAgICAgLm9yZGVyQnkoXCJCaXJ0aERhdGVcIik7XHJcbiAgQHBhcmFtIHBhcmFtZXRlcnMgLSBBIHBhcmFtZXRlcnMgb2JqZWN0IHdoZXJlIHRoZSBrZXlzIGFyZSB0aGUgcGFyYW1ldGVyIG5hbWVzIGFuZCB0aGUgdmFsdWVzIGFyZSB0aGUgcGFyYW1ldGVyIHZhbHVlcy5cclxuICAqKi9cclxuICB3aXRoUGFyYW1ldGVycyhwYXJhbWV0ZXJzOiBPYmplY3QpIHtcclxuICAgIGFzc2VydFBhcmFtKHBhcmFtZXRlcnMsIFwicGFyYW1ldGVyc1wiKS5pc09iamVjdCgpLmNoZWNrKCk7XHJcbiAgICByZXR1cm4gY2xvbmUodGhpcywgXCJwYXJhbWV0ZXJzXCIsIHBhcmFtZXRlcnMpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgUmV0dXJucyBhIHF1ZXJ5IHdpdGggdGhlIGBpbmxpbmVDb3VudGAgY2FwYWJpbGl0eSBlaXRoZXIgZW5hYmxlZCBvciBkaXNhYmxlZC4gIFdpdGggYGlubGluZUNvdW50YCBlbmFibGVkLCBhbiBhZGRpdGlvbmFsICdpbmxpbmVDb3VudCcgcHJvcGVydHlcclxuICB3aWxsIGJlIHJldHVybmVkIHdpdGggdGhlIHF1ZXJ5IHJlc3VsdHMgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiBlbnRpdGllcyB0aGF0IHdvdWxkIGhhdmUgYmVlbiByZXR1cm5lZCBieSB0aGlzXHJcbiAgcXVlcnkgd2l0aCBvbmx5IHRoZSAnd2hlcmUnLydmaWx0ZXInIGNsYXVzZXMgYXBwbGllZCwgaS5lLiB3aXRob3V0IGFueSAnc2tpcCcvJ3Rha2UnIG9wZXJhdG9ycyBhcHBsaWVkLiBGb3IgbG9jYWwgcXVlcmllcyB0aGlzIGNsYXVzZSBpcyBpZ25vcmVkLlxyXG4gID4gICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIkN1c3RvbWVyc1wiKVxyXG4gID4gICAgICAgIC50YWtlKDIwKVxyXG4gID4gICAgICAgIC5vcmRlckJ5KFwiQ29tcGFueU5hbWVcIilcclxuICA+ICAgICAgICAuaW5saW5lQ291bnQodHJ1ZSk7XHJcblxyXG4gIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCAyMCBjdXN0b21lcnMgYXMgd2VsbCBhcyBhIGNvdW50IG9mIF9hbGxfIG9mIHRoZSBjdXN0b21lcnMgaW4gdGhlIHJlbW90ZSBzdG9yZS5cclxuICBAcGFyYW0gZW5hYmxlZCAtIChkZWZhdWx0ID0gdHJ1ZSkgV2hldGhlciBvciBub3QgaW5saW5lQ291bnQgY2FwYWJpbGl0eSBzaG91bGQgYmUgZW5hYmxlZC4gSWYgdGhpcyBwYXJhbWV0ZXIgaXMgb21pdHRlZCwgdHJ1ZSBpcyBhc3N1bWVkLlxyXG4gICoqL1xyXG4gIGlubGluZUNvdW50KGVuYWJsZWQ/OiBib29sZWFuKSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbmFibGVkLCBcImVuYWJsZWRcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBlbmFibGVkID0gKGVuYWJsZWQgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogISFlbmFibGVkO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwiaW5saW5lQ291bnRFbmFibGVkXCIsIGVuYWJsZWQpO1xyXG4gIH1cclxuXHJcbiAgdXNlTmFtZU9uU2VydmVyKHVzZXNOYW1lT25TZXJ2ZXI/OiBib29sZWFuKSB7XHJcbiAgICBhc3NlcnRQYXJhbSh1c2VzTmFtZU9uU2VydmVyLCBcInVzZXNOYW1lT25TZXJ2ZXJcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICB1c2VzTmFtZU9uU2VydmVyID0gKHVzZXNOYW1lT25TZXJ2ZXIgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogISF1c2VzTmFtZU9uU2VydmVyO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwidXNlc05hbWVPblNlcnZlclwiLCB1c2VzTmFtZU9uU2VydmVyKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBxdWVyeSB3aXRoIHRoZSBgbm9UcmFja2luZ2AgY2FwYWJpbGl0eSBlaXRoZXIgZW5hYmxlZCBvciBkaXNhYmxlZC4gIFdpdGggYG5vVHJhY2tpbmdgIGVuYWJsZWQsIHRoZSByZXN1bHRzIG9mIHRoaXMgcXVlcnlcclxuICB3aWxsIG5vdCBiZSBjb2VyY2VkIGludG8gZW50aXRpZXMgYnV0IHdpbGwgaW5zdGVhZCBsb29rIGxpa2UgcmF3IGphdmFzY3JpcHQgcHJvamVjdGlvbnMuIGkuZS4gc2ltcGxlIGphdmFzY3JpcHQgb2JqZWN0cy5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgLnRha2UoMjApXHJcbiAgPiAgICAgICAgIC5vcmRlckJ5KFwiQ29tcGFueU5hbWVcIilcclxuICA+ICAgICAgICAgLm5vVHJhY2tpbmcodHJ1ZSk7XHJcbiAgQHBhcmFtIGVuYWJsZWQgLSAoZGVmYXVsdCA9IHRydWUpIFdoZXRoZXIgb3Igbm90IHRoZSBub1RyYWNraW5nIGNhcGFiaWxpdHkgc2hvdWxkIGJlIGVuYWJsZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRydWUgaXMgYXNzdW1lZC5cclxuICAqKi9cclxuICBub1RyYWNraW5nKGVuYWJsZWQ/OiBib29sZWFuKSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbmFibGVkLCBcImVuYWJsZWRcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBlbmFibGVkID0gKGVuYWJsZWQgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogISFlbmFibGVkO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwibm9UcmFja2luZ0VuYWJsZWRcIiwgZW5hYmxlZCk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBSZXR1cm5zIGEgcXVlcnkgd2l0aCB0aGUgYHVzZVBvc3RgIGNhcGFiaWxpdHkgZWl0aGVyIGVuYWJsZWQgb3IgZGlzYWJsZWQuICBXaXRoIGB1c2VQb3N0YCBlbmFibGVkLCB0aGUgcXVlcnkgaXMgc2VudFxyXG4gIGFzIGEgUE9TVCByZXF1ZXN0IChpbnN0ZWFkIG9mIEdFVCkgYW5kIHRoZSBxdWVyeSBleHByZXNzaW9uIHdpbGwgYmUgc2VudCBhcyBKU09OIGluIHRoZSBib2R5IG9mIHRoZSBwb3N0LlxyXG4gIE5vdGUgdGhhdCB0aGUgc2VydmVyIG11c3QgYmUgYWJsZSB0byBwYXJzZSB0aGUgYm9keSBvZiB0aGUgcmVxdWVzdDsgb3RoZXJ3aXNlIHRoZSBxdWVyeSBleHByZXNzaW9uIHdpbGwgYmUgaWdub3JlZC5cclxuICA+ICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJDdXN0b21lcnNcIilcclxuICA+ICAgICAgICAgLndoZXJlKFwiY29tcGFueUlkXCIsIFwiZXFcIiwgMSlcclxuICA+ICAgICAgICAgLnVzZVBvc3QodHJ1ZSk7XHJcbiAgcmVzdWx0cyBpbiBhIFBPU1QgcmVxdWVzdCB0byBge2hvc3R9L3twYXRofS9DdXN0b21lcnNgXHJcbiAgd2l0aCBib2R5IGB7XCJ3aGVyZVwiOiB7XCJjb21wYW55SWRcIjp7XCJlcVwiOjF9fX1gXHJcbiAgQHBhcmFtIGVuYWJsZWQgLSAoZGVmYXVsdCA9IHRydWUpIFdoZXRoZXIgb3Igbm90IHVzZVBvc3Qgc2hvdWxkIGJlIGVuYWJsZWQuIElmIHRoaXMgcGFyYW1ldGVyIGlzIG9taXR0ZWQsIHRydWUgaXMgYXNzdW1lZC5cclxuICAqKi9cclxuICB1c2VQb3N0KGVuYWJsZWQ/OiBib29sZWFuKSB7XHJcbiAgICBhc3NlcnRQYXJhbShlbmFibGVkLCBcImVuYWJsZWRcIikuaXNCb29sZWFuKCkuaXNPcHRpb25hbCgpLmNoZWNrKCk7XHJcbiAgICBlbmFibGVkID0gKGVuYWJsZWQgPT09IHVuZGVmaW5lZCkgPyB0cnVlIDogISFlbmFibGVkO1xyXG4gICAgcmV0dXJuIGNsb25lKHRoaXMsIFwidXNlUG9zdEVuYWJsZWRcIiwgZW5hYmxlZCk7XHJcbiAgfVxyXG5cclxuICB1c2luZyhvYmo6IEVudGl0eU1hbmFnZXIpOiBFbnRpdHlRdWVyeTtcclxuICB1c2luZyhvYmo6IERhdGFTZXJ2aWNlKTogRW50aXR5UXVlcnk7XHJcbiAgdXNpbmcob2JqOiBKc29uUmVzdWx0c0FkYXB0ZXIpOiBFbnRpdHlRdWVyeTtcclxuICB1c2luZyhvYmo6IFF1ZXJ5T3B0aW9ucyk6IEVudGl0eVF1ZXJ5O1xyXG4gIHVzaW5nKG9iajogTWVyZ2VTdHJhdGVneSk6IEVudGl0eVF1ZXJ5O1xyXG4gIHVzaW5nKG9iajogRmV0Y2hTdHJhdGVneSk6IEVudGl0eVF1ZXJ5O1xyXG4gIC8qKlxyXG4gIFJldHVybnMgYSBjb3B5IG9mIHRoaXMgRW50aXR5UXVlcnkgd2l0aCB0aGUgc3BlY2lmaWVkIFtbRW50aXR5TWFuYWdlcl1dLCBbW0RhdGFTZXJ2aWNlXV0sXHJcbiAgW1tKc29uUmVzdWx0c0FkYXB0ZXJdXSwgW1tNZXJnZVN0cmF0ZWd5XV0gb3IgW1tGZXRjaFN0cmF0ZWd5XV0gYXBwbGllZC5cclxuICA+ICAgICAgLy8gJ3VzaW5nJyBjYW4gYmUgdXNlZCB0byByZXR1cm4gYSBuZXcgcXVlcnkgd2l0aCBhIHNwZWNpZmllZCBFbnRpdHlNYW5hZ2VyLlxyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcihzZXJ2aWNlTmFtZSk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKVxyXG4gID4gICAgICAgIC51c2luZyhlbSk7XHJcblxyXG4gIG9yIHdpdGggYSBzcGVjaWZpZWQgW1tNZXJnZVN0cmF0ZWd5XV1cclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIilcclxuICA+ICAgICAgICAudXNpbmcoTWVyZ2VTdHJhdGVneS5QcmVzZXJ2ZUNoYW5nZXMpO1xyXG5cclxuICBvciB3aXRoIGEgc3BlY2lmaWVkIFtbRmV0Y2hTdHJhdGVneV1dXHJcbiAgPiAgICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpXHJcbiAgPiAgICAgICAgLnVzaW5nKEZldGNoU3RyYXRlZ3kuRnJvbUxvY2FsQ2FjaGUpO1xyXG4gIEBwYXJhbSBvYmogLSBUaGUgb2JqZWN0IHRvIHVwZGF0ZSBpbiBjcmVhdGluZyBhIG5ldyBFbnRpdHlRdWVyeSBmcm9tIGFuIGV4aXN0aW5nIG9uZS5cclxuICAqKi9cclxuICB1c2luZyhvYmo6IGFueSkge1xyXG4gICAgaWYgKCFvYmopIHJldHVybiB0aGlzO1xyXG4gICAgbGV0IGVxID0gY2xvbmUodGhpcyk7XHJcbiAgICBwcm9jZXNzVXNpbmcoZXEsIHtcclxuICAgICAgXCJlbnRpdHlNYW5hZ2VyXCI6IG51bGwsXHJcbiAgICAgIFwiZGF0YVNlcnZpY2VcIjogbnVsbCxcclxuICAgICAgXCJxdWVyeU9wdGlvbnNcIjogbnVsbCxcclxuICAgICAgXCJmZXRjaFN0cmF0ZWd5XCI6IChlcTogRW50aXR5UXVlcnksIHZhbDogYW55KSA9PiB7XHJcbiAgICAgICAgZXEucXVlcnlPcHRpb25zID0gKGVxLnF1ZXJ5T3B0aW9ucyB8fCBuZXcgUXVlcnlPcHRpb25zKCkpLnVzaW5nKHZhbCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIFwibWVyZ2VTdHJhdGVneVwiOiAoZXE6IEVudGl0eVF1ZXJ5LCB2YWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGVxLnF1ZXJ5T3B0aW9ucyA9IChlcS5xdWVyeU9wdGlvbnMgfHwgbmV3IFF1ZXJ5T3B0aW9ucygpKS51c2luZyh2YWwpO1xyXG4gICAgICB9LFxyXG4gICAgICBcImpzb25SZXN1bHRzQWRhcHRlclwiOiAoZXE6IEVudGl0eVF1ZXJ5LCB2YWw6IGFueSkgPT4ge1xyXG4gICAgICAgIGVxLmRhdGFTZXJ2aWNlID0gKGVxLmRhdGFTZXJ2aWNlIHx8IG5ldyBEYXRhU2VydmljZSgpKS51c2luZyh7IGpzb25SZXN1bHRzQWRhcHRlcjogdmFsIH0pO1xyXG4gICAgICB9XHJcbiAgICB9LCBvYmopO1xyXG4gICAgcmV0dXJuIGVxO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgRXhlY3V0ZXMgdGhpcyBxdWVyeS4gIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoYXQgYW4gRW50aXR5TWFuYWdlciBoYXMgYmVlbiBwcmV2aW91c2x5IHNwZWNpZmllZCB2aWEgdGhlIFwidXNpbmdcIiBtZXRob2QuXHJcbiAgXHJcbiAgVGhpcyBtZXRob2QgY2FuIGJlIGNhbGxlZCB1c2luZyBhICdwcm9taXNlcycgc3ludGF4ICggcmVjb21tZW5kZWQpXHJcbiAgPiAgICAgIGxldCBlbSA9IG5ldyBFbnRpdHlNYW5hZ2VyKHNlcnZpY2VOYW1lKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gbmV3IEVudGl0eVF1ZXJ5KFwiT3JkZXJzXCIpLnVzaW5nKGVtKTtcclxuICA+ICAgICAgcXVlcnkuZXhlY3V0ZSgpLnRoZW4oIGZ1bmN0aW9uKGRhdGEpIHtcclxuICA+ICAgICAgICAgIC4uLiBxdWVyeSByZXN1bHRzIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgIH0pLmNhdGNoKCBmdW5jdGlvbihlcnIpIHtcclxuICA+ICAgICAgICAgIC4uLiBxdWVyeSBmYWlsdXJlIHByb2Nlc3NlZCBoZXJlXHJcbiAgPiAgICAgIH0pO1xyXG5cclxuICBvciB3aXRoIGNhbGxiYWNrc1xyXG4gID4gICAgICBsZXQgZW0gPSBuZXcgRW50aXR5TWFuYWdlcihzZXJ2aWNlTmFtZSk7XHJcbiAgPiAgICAgIGxldCBxdWVyeSA9IG5ldyBFbnRpdHlRdWVyeShcIk9yZGVyc1wiKS51c2luZyhlbSk7XHJcbiAgPiAgICAgIHF1ZXJ5LmV4ZWN1dGUoXHJcbiAgPiAgICAgICAgZnVuY3Rpb24oZGF0YSkge1xyXG4gID4gICAgICAgICAgICAgICAgICAgIGxldCBvcmRlcnMgPSBkYXRhLnJlc3VsdHM7XHJcbiAgPiAgICAgICAgICAgICAgICAgICAgLi4uIHF1ZXJ5IHJlc3VsdHMgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICAgICAgICAgICAgIH0sXHJcbiAgPiAgICAgICAgZnVuY3Rpb24oZXJyKSB7XHJcbiAgPiAgICAgICAgICAgICAgICAgICAgLi4uIHF1ZXJ5IGZhaWx1cmUgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICAgICAgICAgICAgIH0pO1xyXG5cclxuICBFaXRoZXIgd2F5IHRoaXMgbWV0aG9kIGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgdGhlIEVudGl0eU1hbmFnZXIgJ2V4ZWN1dGUnIG1ldGhvZC5cclxuICA+ICAgICAgbGV0IGVtID0gbmV3IEVudGl0eU1hbmFnZXIoc2VydmljZU5hbWUpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIik7XHJcbiAgPiAgICAgIGVtLmV4ZWN1dGVRdWVyeShxdWVyeSkudGhlbiggZnVuY3Rpb24oZGF0YSkge1xyXG4gID4gICAgICAgICBsZXQgb3JkZXJzID0gZGF0YS5yZXN1bHRzO1xyXG4gID4gICAgICAgICAgLi4uIHF1ZXJ5IHJlc3VsdHMgcHJvY2Vzc2VkIGhlcmVcclxuICA+ICAgICAgfSkuY2F0Y2goIGZ1bmN0aW9uKGVycikge1xyXG4gID4gICAgICAgICAuLi4gcXVlcnkgZmFpbHVyZSBwcm9jZXNzZWQgaGVyZVxyXG4gID4gICAgICB9KTtcclxuXHJcbiAgQHBhcmFtIGNhbGxiYWNrIC0gIEZ1bmN0aW9uIGNhbGxlZCBvbiBzdWNjZXNzLlxyXG4gIEBwYXJhbSBlcnJvckNhbGxiYWNrIC0gRnVuY3Rpb24gY2FsbGVkIG9uIGZhaWx1cmUuXHJcbiAgQHJldHVybiBQcm9taXNlXHJcbiAgKiovXHJcbiAgZXhlY3V0ZShjYWxsYmFjaz86IENhbGxiYWNrLCBlcnJvckNhbGxiYWNrPzogRXJyb3JDYWxsYmFjayk6IFByb21pc2U8UXVlcnlSZXN1bHQ+IHtcclxuICAgIGlmICghdGhpcy5lbnRpdHlNYW5hZ2VyKSB7XHJcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkFuIEVudGl0eVF1ZXJ5IG11c3QgaGF2ZSBpdHMgRW50aXR5TWFuYWdlciBwcm9wZXJ0eSBzZXQgYmVmb3JlIGNhbGxpbmcgJ2V4ZWN1dGUnXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZW50aXR5TWFuYWdlci5leGVjdXRlUXVlcnkodGhpcywgY2FsbGJhY2ssIGVycm9yQ2FsbGJhY2spO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgRXhlY3V0ZXMgdGhpcyBxdWVyeSBhZ2FpbnN0IHRoZSBsb2NhbCBjYWNoZS4gIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHRoYXQgYW4gRW50aXR5TWFuYWdlciBoYXZlIGJlZW4gcHJldmlvdXNseSBzcGVjaWZpZWQgdmlhIHRoZSBcInVzaW5nXCIgbWV0aG9kLlxyXG4gID4gICAgICAvLyBhc3N1bWUgZW0gaXMgYW4gZW50aXR5TWFuYWdlciBhbHJlYWR5IGZpbGxlZCB3aXRoIG9yZGVyIGVudGl0aWVzO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBuZXcgRW50aXR5UXVlcnkoXCJPcmRlcnNcIikudXNpbmcoZW0pO1xyXG4gID4gICAgICBsZXQgb3JkZXJzID0gcXVlcnkuZXhlY3V0ZUxvY2FsbHkoKTtcclxuXHJcbiAgTm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBtZXRob2QgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyBbW0VudGl0eU1hbmFnZXIuZXhlY3V0ZVF1ZXJ5TG9jYWxseV1dLlxyXG4gICoqL1xyXG4gIGV4ZWN1dGVMb2NhbGx5KCkge1xyXG4gICAgaWYgKCF0aGlzLmVudGl0eU1hbmFnZXIpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQW4gRW50aXR5UXVlcnkgbXVzdCBoYXZlIGl0cyBFbnRpdHlNYW5hZ2VyIHByb3BlcnR5IHNldCBiZWZvcmUgY2FsbGluZyAnZXhlY3V0ZUxvY2FsbHknXCIpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuZW50aXR5TWFuYWdlci5leGVjdXRlUXVlcnlMb2NhbGx5KHRoaXMpO1xyXG4gIH1cclxuXHJcbiAgdG9KU09OKCkge1xyXG4gICAgcmV0dXJuIHRoaXMudG9KU09ORXh0KCk7XHJcbiAgfVxyXG5cclxuICAvKiogVHlwaWNhbGx5IG9ubHkgZm9yIHVzZSB3aGVuIGJ1aWxkaW5nIFVyaUJ1aWxkZXJBZGFwdGVycy4gIFxyXG4gIEBoaWRkZW4gQGludGVybmFsICBcclxuICAqL1xyXG4gIHRvSlNPTkV4dChjb250ZXh0PzogRW50aXR5UXVlcnlKc29uQ29udGV4dCkge1xyXG4gICAgY29udGV4dCA9IGNvbnRleHQgfHwge307XHJcbiAgICBjb250ZXh0LmVudGl0eVR5cGUgPSBjb250ZXh0LmVudGl0eVR5cGUgfHwgdGhpcy5mcm9tRW50aXR5VHlwZTtcclxuICAgIGNvbnRleHQucHJvcGVydHlQYXRoRm4gPSBjb250ZXh0LnRvTmFtZU9uU2VydmVyID8gY29udGV4dC5lbnRpdHlUeXBlIS5jbGllbnRQcm9wZXJ0eVBhdGhUb1NlcnZlci5iaW5kKGNvbnRleHQuZW50aXR5VHlwZSkgOiBjb3JlLmlkZW50aXR5O1xyXG5cclxuICAgIGxldCB0b0pTT05FeHRGbiA9IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyB2LnRvSlNPTkV4dChjb250ZXh0KSA6IHVuZGVmaW5lZDtcclxuICAgIH07XHJcbiAgICByZXR1cm4gY29yZS50b0pzb24odGhpcywge1xyXG4gICAgICBcImZyb20scmVzb3VyY2VOYW1lXCI6IG51bGwsXHJcbiAgICAgIFwidG9UeXBlLHJlc3VsdEVudGl0eVR5cGVcIjogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICAgIC8vIHJlc3VsdEVudGl0eVR5cGUgY2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBlbnRpdHlUeXBlXHJcbiAgICAgICAgcmV0dXJuIHYgPyAodHlwZW9mIHYgPT09ICdzdHJpbmcnID8gdiA6IHYubmFtZSkgOiB1bmRlZmluZWQ7XHJcbiAgICAgIH0sXHJcbiAgICAgIFwid2hlcmUsd2hlcmVQcmVkaWNhdGVcIjogdG9KU09ORXh0Rm4sXHJcbiAgICAgIFwib3JkZXJCeSxvcmRlckJ5Q2xhdXNlXCI6IHRvSlNPTkV4dEZuLFxyXG4gICAgICBcInNlbGVjdCxzZWxlY3RDbGF1c2VcIjogdG9KU09ORXh0Rm4sXHJcbiAgICAgIFwiZXhwYW5kLGV4cGFuZENsYXVzZVwiOiB0b0pTT05FeHRGbixcclxuICAgICAgXCJza2lwLHNraXBDb3VudFwiOiBudWxsLFxyXG4gICAgICBcInRha2UsdGFrZUNvdW50XCI6IG51bGwsXHJcbiAgICAgIHBhcmFtZXRlcnM6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgICByZXR1cm4gY29yZS5pc0VtcHR5KHYpID8gdW5kZWZpbmVkIDogdjtcclxuICAgICAgfSxcclxuICAgICAgXCJpbmxpbmVDb3VudCxpbmxpbmVDb3VudEVuYWJsZWRcIjogZmFsc2UsXHJcbiAgICAgIFwibm9UcmFja2luZyxub1RyYWNraW5nRW5hYmxlZFwiOiBmYWxzZSxcclxuICAgICAgcXVlcnlPcHRpb25zOiBudWxsXHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBzdGF0aWMgZnJvbUVudGl0aWVzKGVudGl0eTogRW50aXR5KTogRW50aXR5UXVlcnk7XHJcbiAgc3RhdGljIGZyb21FbnRpdGllcyhlbnRpdGllczogRW50aXR5W10pOiBFbnRpdHlRdWVyeTtcclxuICAvKipcclxuICBTdGF0aWMgbWV0aG9kIHRoYXQgY3JlYXRlcyBhbiBFbnRpdHlRdWVyeSB0aGF0IHdpbGwgYWxsb3cgJ3JlcXVlcnlpbmcnIGFuIGVudGl0eSBvciBhIGNvbGxlY3Rpb24gb2YgZW50aXRpZXMgYnkgcHJpbWFyeSBrZXkuIFRoaXMgY2FuIGJlIHVzZWZ1bFxyXG4gIHRvIGZvcmNlIGEgcmVxdWVyeSBvZiBzZWxlY3RlZCBlbnRpdGllcywgb3IgdG8gcmVzdHJpY3QgYW4gZXhpc3RpbmcgY29sbGVjdGlvbiBvZiBlbnRpdGllcyBhY2NvcmRpbmcgdG8gc29tZSBmaWx0ZXIuXHJcblxyXG4gIFdvcmtzIGZvciBhIHNpbmdsZSBlbnRpdHkgb3IgYW4gYXJyYXkgb2YgZW50aXRpZXMgb2YgdGhlIFNBTUUgdHlwZS5cclxuICBEb2VzIG5vdCB3b3JrIGZvciBhbiBhcnJheSBvZiBlbnRpdGllcyBvZiBkaWZmZXJlbnQgdHlwZXMuXHJcbiAgPiAgICAgIC8vIGFzc3VtaW5nICdjdXN0b21lcnMnIGlzIGFuIGFycmF5IG9mICdDdXN0b21lcicgZW50aXRpZXMgcmV0cmlldmVkIGVhcmxpZXIuXHJcbiAgPiAgICAgIGxldCBjdXN0b21lcnNRdWVyeSA9IEVudGl0eVF1ZXJ5LmZyb21FbnRpdGllcyhjdXN0b21lcnMpO1xyXG5cclxuICBUaGUgcmVzdWx0aW5nIHF1ZXJ5IGNhbiwgb2YgY291cnNlLCBiZSBleHRlbmRlZFxyXG4gID4gICAgICAvLyBhc3N1bWluZyAnY3VzdG9tZXJzJyBpcyBhbiBhcnJheSBvZiAnQ3VzdG9tZXInIGVudGl0aWVzIHJldHJpZXZlZCBlYXJsaWVyLlxyXG4gID4gICAgICBsZXQgY3VzdG9tZXJzUXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXRpZXMoY3VzdG9tZXJzKVxyXG4gID4gICAgICAgIC53aGVyZShcIlJlZ2lvblwiLCBGaWx0ZXJRdWVyeU9wLk5vdEVxdWFscywgbnVsbCk7XHJcblxyXG4gIFNpbmdsZSBlbnRpdGllcyBjYW4gcmVxdWVyaWVkIGFzIHdlbGwuXHJcbiAgPiAgICAgIC8vIGFzc3VtaW5nICdjdXN0b21lcicgaXMgYSAnQ3VzdG9tZXInIGVudGl0eSByZXRyaWV2ZWQgZWFybGllci5cclxuICA+ICAgICAgbGV0IGN1c3RvbWVyUXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXRpZXMoY3VzdG9tZXIpO1xyXG5cclxuICB3aWxsIGNyZWF0ZSBhIHF1ZXJ5IHRoYXQgd2lsbCByZXR1cm4gYW4gYXJyYXkgY29udGFpbmluZyBhIHNpbmdsZSBjdXN0b21lciBlbnRpdHkuXHJcbiAgQHBhcmFtIGVudGl0aWVzIC0gVGhlIGVudGl0aWVzIGZvciB3aGljaCB3ZSB3YW50IHRvIGNyZWF0ZSBhbiBFbnRpdHlRdWVyeS5cclxuICAqKi9cclxuICBzdGF0aWMgZnJvbUVudGl0aWVzKGVudGl0aWVzOiBFbnRpdHkgfCBFbnRpdHlbXSkge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXRpZXMsIFwiZW50aXRpZXNcIikuaXNFbnRpdHkoKS5vcigpLmlzTm9uRW1wdHlBcnJheSgpLmlzRW50aXR5KCkuY2hlY2soKTtcclxuICAgIGxldCBlbnRzID0gKEFycmF5LmlzQXJyYXkoZW50aXRpZXMpKSA/IGVudGl0aWVzIDogW2VudGl0aWVzXTtcclxuXHJcbiAgICBsZXQgZmlyc3RFbnRpdHkgPSBlbnRzWzBdO1xyXG4gICAgbGV0IHR5cGUgPSBmaXJzdEVudGl0eS5lbnRpdHlUeXBlO1xyXG4gICAgaWYgKGVudHMuc29tZShmdW5jdGlvbiAoZSkge1xyXG4gICAgICByZXR1cm4gZS5lbnRpdHlUeXBlICE9PSB0eXBlO1xyXG4gICAgfSkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQWxsICdmcm9tRW50aXRpZXMnIG11c3QgYmUgdGhlIHNhbWUgdHlwZTsgYXQgbGVhc3Qgb25lIGlzIG5vdCBvZiB0eXBlIFwiICtcclxuICAgICAgICB0eXBlLm5hbWUpO1xyXG4gICAgfVxyXG4gICAgbGV0IHEgPSBuZXcgRW50aXR5UXVlcnkodHlwZS5kZWZhdWx0UmVzb3VyY2VOYW1lKTtcclxuICAgIGxldCBwcmVkcyA9IGVudHMubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHtcclxuICAgICAgcmV0dXJuIGJ1aWxkUHJlZGljYXRlKGVudGl0eSk7XHJcbiAgICB9KTtcclxuICAgIGxldCBwcmVkID0gUHJlZGljYXRlLm9yKHByZWRzKTtcclxuICAgIHEgPSBxLndoZXJlKHByZWQpO1xyXG4gICAgbGV0IGVtID0gZmlyc3RFbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eU1hbmFnZXI7XHJcbiAgICBpZiAoZW0pIHtcclxuICAgICAgcSA9IHEudXNpbmcoZW0pO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHE7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICBDcmVhdGVzIGFuIEVudGl0eVF1ZXJ5IGZvciB0aGUgc3BlY2lmaWVkIFtbRW50aXR5S2V5XV0uXHJcbiAgPiAgICAgIGxldCBlbXBUeXBlID0gbWV0YWRhdGFTdG9yZS5nZXRFbnRpdHlUeXBlKFwiRW1wbG95ZWVcIik7XHJcbiAgPiAgICAgIGxldCBlbnRpdHlLZXkgPSBuZXcgRW50aXR5S2V5KGVtcFR5cGUsIDEpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXR5S2V5KGVudGl0eUtleSk7XHJcblxyXG4gIG9yXHJcbiAgPiAgICAgIC8vICdlbXBsb3llZScgaXMgYSBwcmV2aW91c2x5IHF1ZXJpZWQgZW1wbG95ZWVcclxuICA+ICAgICAgbGV0IGVudGl0eUtleSA9IGVtcGxveWVlLmVudGl0eUFzcGVjdC5nZXRLZXkoKTtcclxuICA+ICAgICAgbGV0IHF1ZXJ5ID0gRW50aXR5UXVlcnkuZnJvbUVudGl0eUtleShlbnRpdHlLZXkpO1xyXG4gIEBwYXJhbSBlbnRpdHlLZXkgLSBUaGUgW1tFbnRpdHlLZXldXSBmb3Igd2hpY2ggYSBxdWVyeSB3aWxsIGJlIGNyZWF0ZWQuXHJcbiAgKiovXHJcbiAgc3RhdGljIGZyb21FbnRpdHlLZXkoZW50aXR5S2V5OiBFbnRpdHlLZXkpIHtcclxuICAgIGFzc2VydFBhcmFtKGVudGl0eUtleSwgXCJlbnRpdHlLZXlcIikuaXNJbnN0YW5jZU9mKEVudGl0eUtleSkuY2hlY2soKTtcclxuICAgIGxldCBxID0gbmV3IEVudGl0eVF1ZXJ5KGVudGl0eUtleS5lbnRpdHlUeXBlLmRlZmF1bHRSZXNvdXJjZU5hbWUpO1xyXG4gICAgbGV0IHByZWQgPSBidWlsZEtleVByZWRpY2F0ZShlbnRpdHlLZXkpO1xyXG4gICAgcSA9IHEud2hlcmUocHJlZCkudG9UeXBlKGVudGl0eUtleS5lbnRpdHlUeXBlKTtcclxuICAgIHJldHVybiBxO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgQ3JlYXRlcyBhbiBFbnRpdHlRdWVyeSBmb3IgdGhlIHNwZWNpZmllZCBlbnRpdHkgYW5kIFtbTmF2aWdhdGlvblByb3BlcnR5XV0uXHJcbiAgPiAgICAgIC8vICdlbXBsb3llZScgaXMgYSBwcmV2aW91c2x5IHF1ZXJpZWQgZW1wbG95ZWVcclxuICA+ICAgICAgbGV0IG9yZGVyc05hdlByb3AgPSBlbXBsb3llZS5lbnRpdHlUeXBlLmdldFByb3BlcnR5KFwiT3JkZXJzXCIpO1xyXG4gID4gICAgICBsZXQgcXVlcnkgPSBFbnRpdHlRdWVyeS5mcm9tRW50aXR5TmF2aWdhdGlvbihlbXBsb3llZSwgb3JkZXJzTmF2UHJvcCk7XHJcblxyXG4gIHdpbGwgcmV0dXJuIGEgcXVlcnkgZm9yIHRoZSBcIk9yZGVyc1wiIG9mIHRoZSBzcGVjaWZpZWQgJ2VtcGxveWVlJy5cclxuICBAcGFyYW0gZW50aXR5IC0gVGhlIEVudGl0eSB3aG9zZSBuYXZpZ2F0aW9uIHByb3BlcnR5IHdpbGwgYmUgcXVlcmllZC5cclxuICBAcGFyYW0gbmF2aWdhdGlvblByb3BlcnR5IC0gVGhlIFtbTmF2aWdhdGlvblByb3BlcnR5XV0gb3IgbmFtZSBvZiB0aGUgTmF2aWdhdGlvblByb3BlcnR5IHRvIGJlIHF1ZXJpZWQuXHJcbiAgKiovXHJcbiAgc3RhdGljIGZyb21FbnRpdHlOYXZpZ2F0aW9uID0gZnVuY3Rpb24gKGVudGl0eTogRW50aXR5LCBuYXZpZ2F0aW9uUHJvcGVydHk6IE5hdmlnYXRpb25Qcm9wZXJ0eSB8IHN0cmluZykge1xyXG4gICAgYXNzZXJ0UGFyYW0oZW50aXR5LCBcImVudGl0eVwiKS5pc0VudGl0eSgpLmNoZWNrKCk7XHJcbiAgICBsZXQgbmF2UHJvcGVydHkgPSBlbnRpdHkuZW50aXR5VHlwZS5fY2hlY2tOYXZQcm9wZXJ0eShuYXZpZ2F0aW9uUHJvcGVydHkpO1xyXG4gICAgbGV0IHEgPSBuZXcgRW50aXR5UXVlcnkobmF2UHJvcGVydHkuZW50aXR5VHlwZS5kZWZhdWx0UmVzb3VyY2VOYW1lKTtcclxuICAgIGxldCBwcmVkID0gYnVpbGROYXZpZ2F0aW9uUHJlZGljYXRlKGVudGl0eSwgbmF2UHJvcGVydHkpO1xyXG4gICAgaWYgKHByZWQgPT0gbnVsbCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJVbmFibGUgdG8gY3JlYXRlIGEgTmF2aWdhdGlvblF1ZXJ5IGZvciBuYXZpZ2F0aW9uUHJvcGVydHk6IFwiICsgbmF2UHJvcGVydHkubmFtZSApO1xyXG4gICAgfVxyXG4gICAgcSA9IHEud2hlcmUocHJlZCk7XHJcbiAgICBsZXQgZW0gPSBlbnRpdHkuZW50aXR5QXNwZWN0LmVudGl0eU1hbmFnZXI7XHJcbiAgICByZXR1cm4gZW0gPyBxLnVzaW5nKGVtKSA6IHE7XHJcbiAgfTtcclxuXHJcbiAgLy8gcHJvdGVjdGVkIG1ldGhvZHNcclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfZ2V0RnJvbUVudGl0eVR5cGUobWV0YWRhdGFTdG9yZTogTWV0YWRhdGFTdG9yZSwgdGhyb3dFcnJvcklmTm90Rm91bmQ/OiBib29sZWFuKSB7XHJcbiAgICAvLyBVbmNvbW1lbnQgbmV4dCB0d28gbGluZXMgaWYgd2UgbWFrZSB0aGlzIG1ldGhvZCBwdWJsaWMuXHJcbiAgICAvLyBhc3NlcnRQYXJhbShtZXRhZGF0YVN0b3JlLCBcIm1ldGFkYXRhU3RvcmVcIikuaXNJbnN0YW5jZU9mKE1ldGFkYXRhU3RvcmUpLmNoZWNrKCk7XHJcbiAgICAvLyBhc3NlcnRQYXJhbSh0aHJvd0Vycm9ySWZOb3RGb3VuZCwgXCJ0aHJvd0Vycm9ySWZOb3RGb3VuZFwiKS5pc0Jvb2xlYW4oKS5pc09wdGlvbmFsKCkuY2hlY2soKTtcclxuICAgIGxldCBlbnRpdHlUeXBlID0gdGhpcy5mcm9tRW50aXR5VHlwZTtcclxuICAgIGlmIChlbnRpdHlUeXBlKSByZXR1cm4gZW50aXR5VHlwZTtcclxuXHJcbiAgICBsZXQgcmVzb3VyY2VOYW1lID0gdGhpcy5yZXNvdXJjZU5hbWU7XHJcbiAgICBpZiAoIXJlc291cmNlTmFtZSkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGVyZSBpcyBubyByZXNvdXJjZU5hbWUgZm9yIHRoaXMgcXVlcnlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKG1ldGFkYXRhU3RvcmUuaXNFbXB0eSgpKSB7XHJcbiAgICAgIGlmICh0aHJvd0Vycm9ySWZOb3RGb3VuZCkge1xyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZXJlIGlzIG5vIG1ldGFkYXRhIGF2YWlsYWJsZSBmb3IgdGhpcyBxdWVyeS4gXCIgK1xyXG4gICAgICAgICAgXCJBcmUgeW91IHF1ZXJ5aW5nIHRoZSBsb2NhbCBjYWNoZSBiZWZvcmUgeW91J3ZlIGZldGNoZWQgbWV0YWRhdGE/XCIpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBsZXQgZW50aXR5VHlwZU5hbWUgPSBtZXRhZGF0YVN0b3JlLmdldEVudGl0eVR5cGVOYW1lRm9yUmVzb3VyY2VOYW1lKHJlc291cmNlTmFtZSk7XHJcbiAgICBpZiAoZW50aXR5VHlwZU5hbWUpIHtcclxuICAgICAgZW50aXR5VHlwZSA9IG1ldGFkYXRhU3RvcmUuX2dldFN0cnVjdHVyYWxUeXBlKGVudGl0eVR5cGVOYW1lKSBhcyBFbnRpdHlUeXBlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgZW50aXR5VHlwZSA9IHRoaXMuX2dldFRvRW50aXR5VHlwZShtZXRhZGF0YVN0b3JlLCB0cnVlKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIWVudGl0eVR5cGUpIHtcclxuICAgICAgaWYgKHRocm93RXJyb3JJZk5vdEZvdW5kKSB7XHJcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGNvcmUuZm9ybWF0U3RyaW5nKFwiQ2Fubm90IGZpbmQgYW4gZW50aXR5VHlwZSBmb3IgcmVzb3VyY2VOYW1lOiAnJTEnLiBcIiwgcmVzb3VyY2VOYW1lKSArIGNvcmUuc3RyaW5ncy5UT19UWVBFKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgdGhpcy5mcm9tRW50aXR5VHlwZSA9IGVudGl0eVR5cGU7XHJcbiAgICByZXR1cm4gZW50aXR5VHlwZTtcclxuXHJcbiAgfVxyXG5cclxuICAvKiogQGhpZGRlbiBAaW50ZXJuYWwgKi9cclxuICBfZ2V0VG9FbnRpdHlUeXBlKG1ldGFkYXRhU3RvcmU6IE1ldGFkYXRhU3RvcmUsIHNraXBGcm9tQ2hlY2s/OiBib29sZWFuKTogRW50aXR5VHlwZSB8IHVuZGVmaW5lZCB7XHJcbiAgICAvLyBza2lwRnJvbUNoZWNrIGlzIHRvIGF2b2lkIHJlY3Vyc2lvbiBpZiBjYWxsZWQgZnJvbSBfZ2V0RnJvbUVudGl0eVR5cGU7XHJcbiAgICBpZiAodGhpcy5yZXN1bHRFbnRpdHlUeXBlIGluc3RhbmNlb2YgRW50aXR5VHlwZSkge1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXN1bHRFbnRpdHlUeXBlO1xyXG4gICAgfSBlbHNlIGlmICh0aGlzLnJlc3VsdEVudGl0eVR5cGUpIHtcclxuICAgICAgLy8gcmVzdWx0RW50aXR5VHlwZSBpcyBhIHN0cmluZ1xyXG4gICAgICB0aGlzLnJlc3VsdEVudGl0eVR5cGUgPSBtZXRhZGF0YVN0b3JlLl9nZXRTdHJ1Y3R1cmFsVHlwZSh0aGlzLnJlc3VsdEVudGl0eVR5cGUsIGZhbHNlKSBhcyBFbnRpdHlUeXBlO1xyXG4gICAgICByZXR1cm4gdGhpcy5yZXN1bHRFbnRpdHlUeXBlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgLy8gcmVzb2x2ZSBpdCwgaWYgcG9zc2libGUsIHZpYSB0aGUgcmVzb3VyY2VOYW1lXHJcbiAgICAgIC8vIGRvIG5vdCBjYWNoZSB0aGlzIHZhbHVlIGluIHRoaXMgY2FzZVxyXG4gICAgICAvLyBjYW5ub3QgZGV0ZXJtaW5lIHRoZSByZXN1bHRFbnRpdHlUeXBlIGlmIGEgc2VsZWN0Q2xhdXNlIGlzIHByZXNlbnQuXHJcbiAgICAgIC8vIHJldHVybiBza2lwRnJvbUNoZWNrID8gbnVsbCA6ICghdGhpcy5zZWxlY3RDbGF1c2UpICYmIHRoaXMuX2dldEZyb21FbnRpdHlUeXBlKG1ldGFkYXRhU3RvcmUsIGZhbHNlKTtcclxuICAgICAgaWYgKHNraXBGcm9tQ2hlY2sgfHwgdGhpcy5zZWxlY3RDbGF1c2UpIHtcclxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuX2dldEZyb21FbnRpdHlUeXBlKG1ldGFkYXRhU3RvcmUsIGZhbHNlKTtcclxuICAgICAgfVxyXG5cclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBAaGlkZGVuIEBpbnRlcm5hbCAqL1xyXG4gIC8vIGZvciB0ZXN0aW5nXHJcbiAgX3RvVXJpKGVtOiBFbnRpdHlNYW5hZ2VyKSB7XHJcbiAgICBsZXQgZHMgPSBEYXRhU2VydmljZS5yZXNvbHZlKFtlbS5kYXRhU2VydmljZV0pO1xyXG4gICAgcmV0dXJuIGRzIS51cmlCdWlsZGVyIS5idWlsZFVyaSh0aGlzLCBlbS5tZXRhZGF0YVN0b3JlKTtcclxuICB9XHJcblxyXG59XHJcbkVudGl0eVF1ZXJ5LnByb3RvdHlwZS5fJHR5cGVOYW1lID0gXCJFbnRpdHlRdWVyeVwiO1xyXG5cclxuLy8gcHJpdmF0ZSBmdW5jdGlvbnNcclxuXHJcbmZ1bmN0aW9uIGZyb21KU09OKGVxOiBFbnRpdHlRdWVyeSwganNvbjogT2JqZWN0KSB7XHJcbiAgY29yZS50b0pzb24oanNvbiwge1xyXG4gICAgXCJyZXNvdXJjZU5hbWUsZnJvbVwiOiBudWxsLFxyXG4gICAgLy8ganVzdCB0aGUgbmFtZSBjb21lcyBiYWNrIGFuZCB3aWxsIGJlIHJlc29sdmVkIGxhdGVyXHJcbiAgICBcInJlc3VsdEVudGl0eVR5cGUsdG9UeXBlXCI6IG51bGwsXHJcbiAgICBcIndoZXJlUHJlZGljYXRlLHdoZXJlXCI6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyBuZXcgUHJlZGljYXRlKHYpIDogdW5kZWZpbmVkO1xyXG4gICAgfSxcclxuICAgIFwib3JkZXJCeUNsYXVzZSxvcmRlckJ5XCI6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyBuZXcgT3JkZXJCeUNsYXVzZSh2KSA6IHVuZGVmaW5lZDtcclxuICAgIH0sXHJcbiAgICBcInNlbGVjdENsYXVzZSxzZWxlY3RcIjogZnVuY3Rpb24gKHY6IGFueSkge1xyXG4gICAgICByZXR1cm4gdiA/IG5ldyBTZWxlY3RDbGF1c2UodikgOiB1bmRlZmluZWQ7XHJcbiAgICB9LFxyXG4gICAgXCJleHBhbmRDbGF1c2UsZXhwYW5kXCI6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyBuZXcgRXhwYW5kQ2xhdXNlKHYpIDogdW5kZWZpbmVkO1xyXG4gICAgfSxcclxuICAgIFwic2tpcENvdW50LHNraXBcIjogbnVsbCxcclxuICAgIFwidGFrZUNvdW50LHRha2VcIjogbnVsbCxcclxuICAgIHBhcmFtZXRlcnM6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIGNvcmUuaXNFbXB0eSh2KSA/IHVuZGVmaW5lZCA6IHY7XHJcbiAgICB9LFxyXG4gICAgXCJpbmxpbmVDb3VudEVuYWJsZWQsaW5saW5lQ291bnRcIjogZmFsc2UsXHJcbiAgICBcIm5vVHJhY2tpbmdFbmFibGVkLG5vVHJhY2tpbmdcIjogZmFsc2UsXHJcbiAgICBcInVzZVBvc3RFbmFibGVkLHVzZVBvc3RcIjogZmFsc2UsXHJcbiAgICBxdWVyeU9wdGlvbnM6IGZ1bmN0aW9uICh2OiBhbnkpIHtcclxuICAgICAgcmV0dXJuIHYgPyBRdWVyeU9wdGlvbnMuZnJvbUpTT04odikgOiB1bmRlZmluZWQ7XHJcbiAgICB9XHJcbiAgfSwgZXEpO1xyXG4gIHJldHVybiBlcTtcclxufVxyXG5cclxuZnVuY3Rpb24gY2xvbmUoZXE6IEVudGl0eVF1ZXJ5LCBwcm9wTmFtZT86IHN0cmluZywgdmFsdWU/OiBhbnkpIHtcclxuICAvLyBpbW11dGFibGUgcXVlcmllcyBtZWFuIHRoYXQgd2UgZG9uJ3QgbmVlZCB0byBjbG9uZSBpZiBubyBjaGFuZ2UgaW4gdmFsdWUuXHJcbiAgaWYgKHByb3BOYW1lKSB7XHJcbiAgICBpZiAoZXFbcHJvcE5hbWVdID09PSB2YWx1ZSkgcmV0dXJuIGVxO1xyXG4gIH1cclxuICAvLyBjb3B5aW5nIFF1ZXJ5T3B0aW9ucyBpcyBzYWZlIGJlY2F1c2UgdGhleSBhcmUgYXJlIGltbXV0YWJsZTtcclxuICBsZXQgY29weSA9IGNvcmUuZXh0ZW5kKG5ldyBFbnRpdHlRdWVyeSgpLCBlcSwgW1xyXG4gICAgXCJyZXNvdXJjZU5hbWVcIixcclxuICAgIFwiZnJvbUVudGl0eVR5cGVcIixcclxuICAgIFwid2hlcmVQcmVkaWNhdGVcIixcclxuICAgIFwib3JkZXJCeUNsYXVzZVwiLFxyXG4gICAgXCJzZWxlY3RDbGF1c2VcIixcclxuICAgIFwic2tpcENvdW50XCIsXHJcbiAgICBcInRha2VDb3VudFwiLFxyXG4gICAgXCJleHBhbmRDbGF1c2VcIixcclxuICAgIFwiaW5saW5lQ291bnRFbmFibGVkXCIsXHJcbiAgICBcIm5vVHJhY2tpbmdFbmFibGVkXCIsXHJcbiAgICBcInVzZVBvc3RFbmFibGVkXCIsXHJcbiAgICBcInVzZXNOYW1lT25TZXJ2ZXJcIixcclxuICAgIFwicXVlcnlPcHRpb25zXCIsXHJcbiAgICBcImVudGl0eU1hbmFnZXJcIixcclxuICAgIFwiZGF0YVNlcnZpY2VcIixcclxuICAgIFwicmVzdWx0RW50aXR5VHlwZVwiXHJcbiAgXSkgYXMgRW50aXR5UXVlcnk7XHJcbiAgY29weS5wYXJhbWV0ZXJzID0gY29yZS5leHRlbmQoe30sIGVxLnBhcmFtZXRlcnMpO1xyXG4gIGlmIChwcm9wTmFtZSkge1xyXG4gICAgY29weVtwcm9wTmFtZV0gPSB2YWx1ZTtcclxuICB9XHJcbiAgcmV0dXJuIGNvcHk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHByb2Nlc3NVc2luZyhlcTogRW50aXR5UXVlcnksIG1hcDogT2JqZWN0LCB2YWx1ZTogYW55LCBwcm9wZXJ0eU5hbWU/OiBzdHJpbmcpIHtcclxuICBsZXQgdHlwZU5hbWUgPSB2YWx1ZS5fJHR5cGVOYW1lIHx8ICgodmFsdWUgaW5zdGFuY2VvZiBCcmVlemVFbnVtKSAmJiAodmFsdWUuY29uc3RydWN0b3IgYXMgYW55KS5uYW1lKTtcclxuICBsZXQga2V5ID0gdHlwZU5hbWUgJiYgdHlwZU5hbWUuc3Vic3RyKDAsIDEpLnRvTG93ZXJDYXNlKCkgKyB0eXBlTmFtZS5zdWJzdHIoMSk7XHJcbiAgaWYgKHByb3BlcnR5TmFtZSAmJiBrZXkgIT09IHByb3BlcnR5TmFtZSkge1xyXG4gICAgdGhyb3cgbmV3IEVycm9yKFwiSW52YWxpZCB2YWx1ZSBmb3IgcHJvcGVydHk6IFwiICsgcHJvcGVydHlOYW1lKTtcclxuICB9XHJcbiAgaWYgKGtleSkge1xyXG4gICAgbGV0IGZuID0gbWFwW2tleV07XHJcbiAgICBpZiAoZm4gPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJJbnZhbGlkIGNvbmZpZyBwcm9wZXJ0eTogXCIgKyBrZXkpO1xyXG4gICAgfSBlbHNlIGlmIChmbiA9PT0gbnVsbCkge1xyXG4gICAgICBlcVtrZXldID0gdmFsdWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBmbihlcSwgdmFsdWUpO1xyXG4gICAgfVxyXG4gIH0gZWxzZSB7XHJcbiAgICBjb3JlLm9iamVjdEZvckVhY2godmFsdWUsIChwcm9wTmFtZSwgdmFsKSA9PiB7XHJcbiAgICAgIHByb2Nlc3NVc2luZyhlcSwgbWFwLCB2YWwsIHByb3BOYW1lKTtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG5cclxuZnVuY3Rpb24gbm9ybWFsaXplUHJvcGVydHlQYXRocyhwcm9wZXJ0eVBhdGhzOiBzdHJpbmcgfCBzdHJpbmdbXSkge1xyXG4gIGFzc2VydFBhcmFtKHByb3BlcnR5UGF0aHMsIFwicHJvcGVydHlQYXRoc1wiKS5pc09wdGlvbmFsKCkuaXNTdHJpbmcoKS5vcigpLmlzQXJyYXkoKS5pc1N0cmluZygpLmNoZWNrKCk7XHJcbiAgaWYgKHR5cGVvZiBwcm9wZXJ0eVBhdGhzID09PSAnc3RyaW5nJykge1xyXG4gICAgcHJvcGVydHlQYXRocyA9IHByb3BlcnR5UGF0aHMuc3BsaXQoXCIsXCIpO1xyXG4gIH1cclxuXHJcbiAgcHJvcGVydHlQYXRocyA9IHByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcCkge1xyXG4gICAgcmV0dXJuIHBwLnRyaW0oKTtcclxuICB9KTtcclxuICByZXR1cm4gcHJvcGVydHlQYXRocztcclxufVxyXG5cclxuZnVuY3Rpb24gYnVpbGRQcmVkaWNhdGUoZW50aXR5OiBFbnRpdHkpIHtcclxuICBsZXQgZW50aXR5VHlwZSA9IGVudGl0eS5lbnRpdHlUeXBlO1xyXG4gIGxldCBwcmVkUGFydHMgPSBlbnRpdHlUeXBlLmtleVByb3BlcnRpZXMubWFwKGZ1bmN0aW9uIChrcCkge1xyXG4gICAgcmV0dXJuIFByZWRpY2F0ZS5jcmVhdGUoa3AubmFtZSwgRmlsdGVyUXVlcnlPcC5FcXVhbHMsIGVudGl0eS5nZXRQcm9wZXJ0eShrcC5uYW1lKSk7XHJcbiAgfSk7XHJcbiAgbGV0IHByZWQgPSBQcmVkaWNhdGUuYW5kKHByZWRQYXJ0cyk7XHJcbiAgcmV0dXJuIHByZWQ7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIGJ1aWxkS2V5UHJlZGljYXRlKGVudGl0eUtleTogRW50aXR5S2V5KSB7XHJcbiAgbGV0IGtleVByb3BzID0gZW50aXR5S2V5LmVudGl0eVR5cGUua2V5UHJvcGVydGllcztcclxuICBsZXQgcHJlZHMgPSBjb3JlLmFycmF5WmlwKGtleVByb3BzLCBlbnRpdHlLZXkudmFsdWVzLCBmdW5jdGlvbiAoa3AsIHYpIHtcclxuICAgIHJldHVybiBQcmVkaWNhdGUuY3JlYXRlKGtwLm5hbWUsIEZpbHRlclF1ZXJ5T3AuRXF1YWxzLCB2KTtcclxuICB9KTtcclxuICBsZXQgcHJlZCA9IFByZWRpY2F0ZS5hbmQocHJlZHMpO1xyXG4gIHJldHVybiBwcmVkO1xyXG59XHJcblxyXG5mdW5jdGlvbiBidWlsZE5hdmlnYXRpb25QcmVkaWNhdGUoZW50aXR5OiBFbnRpdHksIG5hdmlnYXRpb25Qcm9wZXJ0eTogTmF2aWdhdGlvblByb3BlcnR5KSB7XHJcbiAgaWYgKG5hdmlnYXRpb25Qcm9wZXJ0eS5pc1NjYWxhcikge1xyXG4gICAgaWYgKG5hdmlnYXRpb25Qcm9wZXJ0eS5mb3JlaWduS2V5TmFtZXMubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcclxuICAgIGxldCByZWxhdGVkS2V5VmFsdWVzID0gbmF2aWdhdGlvblByb3BlcnR5LmZvcmVpZ25LZXlOYW1lcy5tYXAoKGZrTmFtZSkgPT4ge1xyXG4gICAgICByZXR1cm4gZW50aXR5LmdldFByb3BlcnR5KGZrTmFtZSk7XHJcbiAgICB9KTtcclxuICAgIGxldCBlbnRpdHlLZXkgPSBuZXcgRW50aXR5S2V5KG5hdmlnYXRpb25Qcm9wZXJ0eS5lbnRpdHlUeXBlLCByZWxhdGVkS2V5VmFsdWVzKTtcclxuICAgIHJldHVybiBidWlsZEtleVByZWRpY2F0ZShlbnRpdHlLZXkpO1xyXG4gIH0gZWxzZSB7XHJcbiAgICBsZXQgaW52ZXJzZU5wID0gbmF2aWdhdGlvblByb3BlcnR5LmludmVyc2U7XHJcbiAgICBsZXQgZm9yZWlnbktleU5hbWVzID0gaW52ZXJzZU5wID8gaW52ZXJzZU5wLmZvcmVpZ25LZXlOYW1lcyA6IG5hdmlnYXRpb25Qcm9wZXJ0eS5pbnZGb3JlaWduS2V5TmFtZXM7XHJcbiAgICBpZiAoZm9yZWlnbktleU5hbWVzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIG51bGw7XHJcbiAgICBsZXQga2V5VmFsdWVzID0gZW50aXR5LmVudGl0eUFzcGVjdC5nZXRLZXkoKS52YWx1ZXM7XHJcbiAgICBsZXQgcHJlZFBhcnRzID0gY29yZS5hcnJheVppcChmb3JlaWduS2V5TmFtZXMsIGtleVZhbHVlcywgKGZrTmFtZSwga3YpID0+IHtcclxuICAgICAgcmV0dXJuIFByZWRpY2F0ZS5jcmVhdGUoZmtOYW1lLCBGaWx0ZXJRdWVyeU9wLkVxdWFscywga3YpO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4gUHJlZGljYXRlLmFuZChwcmVkUGFydHMpO1xyXG4gIH1cclxufVxyXG5cclxuLyoqIEJhc2UgY2xhc3MgZm9yIEJvb2xlYW5RdWVyeU9wIGFuZCBGaWx0ZXJRdWVyeU9wICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlPcCB7XHJcbiAgLyoqIFRoZSBvcGVyYXRvciBmb3IgdGhpcyBlbnVtLiAqL1xyXG4gIG9wZXJhdG9yOiBzdHJpbmc7XHJcbn1cclxuXHJcblxyXG5cclxuLyoqXHJcbkZpbHRlclF1ZXJ5T3AgaXMgYW4gJ0VudW0nIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB2YWxpZCAgW1tQcmVkaWNhdGVdXVxyXG5maWx0ZXIgb3BlcmF0b3JzIGZvciBhbiBbW0VudGl0eVF1ZXJ5XV0uXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgRmlsdGVyUXVlcnlPcCBleHRlbmRzIEJyZWV6ZUVudW0gaW1wbGVtZW50cyBRdWVyeU9wIHtcclxuICAvKiogVGhlIG9wZXJhdG9yIGZvciB0aGlzIGVudW0uICovXHJcbiAgZGVjbGFyZSBvcGVyYXRvcjogc3RyaW5nO1xyXG5cclxuICAvKiogQWxpYXNlczogXCJlcVwiLCBcIj09XCIgKiovXHJcbiAgc3RhdGljIEVxdWFscyA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiZXFcIiB9KTtcclxuICAvKiogIEFsaWFzZXM6IFwibmVcIiwgXCIhPVwiICAqKi9cclxuICBzdGF0aWMgTm90RXF1YWxzID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJuZVwiIH0pO1xyXG4gIC8qKiBBbGlhc2VzOiBcImd0XCIsIFwiPlwiICAgKiovXHJcbiAgc3RhdGljIEdyZWF0ZXJUaGFuID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJndFwiIH0pO1xyXG4gIC8qKiBBbGlhc2VzOiBcImx0XCIsIFwiPFwiICAqKi9cclxuICBzdGF0aWMgTGVzc1RoYW4gPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImx0XCIgfSk7XHJcbiAgLyoqICBBbGlhc2VzOiBcImdlXCIsIFwiPj1cIiAgKiovXHJcbiAgc3RhdGljIEdyZWF0ZXJUaGFuT3JFcXVhbCA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiZ2VcIiB9KTtcclxuICAvKiogIEFsaWFzZXM6IFwibGVcIiwgXCI8PVwiICAqKi9cclxuICBzdGF0aWMgTGVzc1RoYW5PckVxdWFsID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJsZVwiIH0pO1xyXG4gIC8qKiAgU3RyaW5nIG9wZXJhdGlvbjogSXMgYSBzdHJpbmcgYSBzdWJzdHJpbmcgb2YgYW5vdGhlciBzdHJpbmcuICBBbGlhc2VzOiBcInN1YnN0cmluZ29mXCIgICAqKi9cclxuICBzdGF0aWMgQ29udGFpbnMgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImNvbnRhaW5zXCIgfSk7XHJcbiAgLyoqIE5vIGFsaWFzZXMgKi9cclxuICBzdGF0aWMgU3RhcnRzV2l0aCA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwic3RhcnRzd2l0aFwiIH0pO1xyXG4gIC8qKiBObyBhbGlhc2VzICovXHJcbiAgc3RhdGljIEVuZHNXaXRoID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJlbmRzd2l0aFwiIH0pO1xyXG4gIC8qKiAgQWxpYXNlczogXCJzb21lXCIgICoqL1xyXG4gIHN0YXRpYyBBbnkgPSBuZXcgRmlsdGVyUXVlcnlPcCh7IG9wZXJhdG9yOiBcImFueVwiIH0pO1xyXG4gIC8qKiAgQWxpYXNlczogXCJldmVyeVwiICAqKi9cclxuICBzdGF0aWMgQWxsID0gbmV3IEZpbHRlclF1ZXJ5T3AoeyBvcGVyYXRvcjogXCJhbGxcIiB9KTtcclxuICAvKiogTm8gYWxpYXNlcyAqL1xyXG4gIHN0YXRpYyBJbiA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiaW5cIiB9KTtcclxuICAvKiogTm8gYWxpYXNlcyAqL1xyXG4gIHN0YXRpYyBJc1R5cGVPZiA9IG5ldyBGaWx0ZXJRdWVyeU9wKHsgb3BlcmF0b3I6IFwiaXNvZlwiIH0pO1xyXG59XHJcbkZpbHRlclF1ZXJ5T3AucHJvdG90eXBlLl8kdHlwZU5hbWUgPSBcIkZpbHRlclF1ZXJ5T3BcIjtcclxuRXJyb3JbJ3gnXSA9IEZpbHRlclF1ZXJ5T3AucmVzb2x2ZVN5bWJvbHMoKTtcclxuXHJcblxyXG4vKipcclxuIEJvb2xlYW5RdWVyeU9wIGlzIGFuICdFbnVtJyBjb250YWluaW5nIGFsbCBvZiB0aGUgdmFsaWQgIGJvb2xlYW5cclxub3BlcmF0b3JzIGZvciBhbiBbW0VudGl0eVF1ZXJ5XV0uXHJcbioqL1xyXG5leHBvcnQgY2xhc3MgQm9vbGVhblF1ZXJ5T3AgZXh0ZW5kcyBCcmVlemVFbnVtIGltcGxlbWVudHMgUXVlcnlPcCB7XHJcbiAgLyoqIFRoZSBvcGVyYXRvciBmb3IgdGhpcyBlbnVtLiAqL1xyXG4gIGRlY2xhcmUgb3BlcmF0b3I6IHN0cmluZztcclxuXHJcbiAgc3RhdGljIEFuZCA9IG5ldyBCb29sZWFuUXVlcnlPcCh7IG9wZXJhdG9yOiBcImFuZFwiIH0pO1xyXG4gIHN0YXRpYyBPciA9IG5ldyBCb29sZWFuUXVlcnlPcCh7IG9wZXJhdG9yOiBcIm9yXCIgfSk7XHJcbiAgc3RhdGljIE5vdCA9IG5ldyBCb29sZWFuUXVlcnlPcCh7IG9wZXJhdG9yOiBcIm5vdFwiIH0pO1xyXG5cclxufVxyXG5Cb29sZWFuUXVlcnlPcC5wcm90b3R5cGUuXyR0eXBlTmFtZSA9IFwiQm9vbGVhblF1ZXJ5T3BcIjtcclxuRXJyb3JbJ3gnXSA9IEJvb2xlYW5RdWVyeU9wLnJlc29sdmVTeW1ib2xzKCk7XHJcblxyXG5cclxuLyoqIEZvciB1c2UgYnkgYnJlZXplIHBsdWdpbiBhdXRob3JzIG9ubHkuICBUaGUgY2xhc3MgaXMgdXNlZCBpbiBtb3N0IFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0gaW1wbGVtZW50YXRpb25zXHJcbkBhZGFwdGVyIChzZWUgW1tJVXJpQnVpbGRlckFkYXB0ZXJdXSkgICAgXHJcbkBoaWRkZW5cclxuXHJcbkFuIE9yZGVyQnlDbGF1c2UgaXMgYSBkZXNjcmlwdGlvbiBvZiB0aGUgcHJvcGVydGllcyBhbmQgZGlyZWN0aW9uIHRoYXQgdGhlIHJlc3VsdFxyXG5vZiBhIHF1ZXJ5IHNob3VsZCBiZSBzb3J0ZWQgaW4uICBPcmRlckJ5Q2xhdXNlcyBhcmUgaW1tdXRhYmxlLCB3aGljaCBtZWFucyB0aGF0IGFueVxyXG5tZXRob2QgdGhhdCB3b3VsZCBtb2RpZnkgYW4gT3JkZXJCeUNsYXVzZSBhY3R1YWxseSByZXR1cm5zIGEgbmV3IE9yZGVyQnlDbGF1c2UuXHJcblxyXG5Gb3IgZXhhbXBsZSBmb3IgYW4gRW1wbG95ZWUgb2JqZWN0IHdpdGggcHJvcGVydGllcyBvZiAnQ29tcGFueScgYW5kICdMYXN0TmFtZScgdGhlIGZvbGxvd2luZyB3b3VsZCBiZSB2YWxpZCBleHByZXNzaW9uczpcclxuPiAgICAgbGV0IG9iYyA9IG5ldyBPcmRlckJ5Q2xhdXNlKFwiQ29tcGFueS5Db21wYW55TmFtZSwgTGFzdE5hbWVcIilcclxuXHJcbm9yXHJcbj4gICAgIGxldCBvYmMgPSBuZXcgT3JkZXJCeUNsYXVzZShcIkNvbXBhbnkuQ29tcGFueU5hbWUgZGVzYywgTGFzdE5hbWVcIilcclxuXHJcbm9yXHJcbj4gICAgIGxldCBvYmMgPSBuZXcgT3JkZXJCeUNsYXVzZShcIkNvbXBhbnkuQ29tcGFueU5hbWUsIExhc3ROYW1lXCIsIHRydWUpO1xyXG4qL1xyXG5leHBvcnQgY2xhc3MgT3JkZXJCeUNsYXVzZSB7XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgaXRlbXM6IE9yZGVyQnlJdGVtW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdIHwgT3JkZXJCeUNsYXVzZVtdLCBpc0Rlc2M/OiBib29sZWFuKSB7XHJcbiAgICBpZiAocHJvcGVydHlQYXRocy5sZW5ndGggPT09IDApIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiT3JkZXJCeUNsYXVzZSBjYW5ub3QgYmUgZW1wdHlcIik7XHJcbiAgICB9XHJcblxyXG4gICAgLy8geW91IGNhbiBhbHNvIHBhc3MgaW4gYW4gYXJyYXkgb2Ygb3JkZXJCeUNsYXVzZXNcclxuICAgIGlmIChwcm9wZXJ0eVBhdGhzWzBdIGluc3RhbmNlb2YgT3JkZXJCeUNsYXVzZSkge1xyXG4gICAgICBsZXQgY2xhdXNlcyA9IHByb3BlcnR5UGF0aHMgYXMgT3JkZXJCeUNsYXVzZVtdO1xyXG4gICAgICB0aGlzLml0ZW1zID0gY29yZS5hcnJheUZsYXRNYXAoY2xhdXNlcywgYyA9PiBjLml0ZW1zKTtcclxuICAgICAgLy8gdGhpcy5pdGVtcyA9IEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoY2xhdXNlc1swXS5pdGVtcywgY2xhdXNlcy5zbGljZSgxKS5tYXAoY29yZS5wbHVjayhcIml0ZW1zXCIpKSk7XHJcbiAgICAgIC8vIHRoaXMuaXRlbXMgPSBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBjbGF1c2VzLm1hcChjb3JlLnBsdWNrKFwiaXRlbXNcIikpKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuaXRlbXMgPSAocHJvcGVydHlQYXRocyBhcyBzdHJpbmdbXSkubWFwKGZ1bmN0aW9uIChwcCkge1xyXG4gICAgICAgIHJldHVybiBuZXcgT3JkZXJCeUl0ZW0ocHAsIGlzRGVzYyk7XHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICB9XHJcblxyXG4gIHZhbGlkYXRlKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICAgIGlmIChlbnRpdHlUeXBlID09IG51bGwgfHwgZW50aXR5VHlwZS5pc0Fub255bW91cykgcmV0dXJuO1xyXG4gICAgdGhpcy5pdGVtcy5mb3JFYWNoKChpdGVtKSA9PiB7XHJcbiAgICAgIGl0ZW0udmFsaWRhdGUoZW50aXR5VHlwZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldENvbXBhcmVyKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICAgIGxldCBvcmRlckJ5RnVuY3MgPSB0aGlzLml0ZW1zLm1hcChmdW5jdGlvbiAob2JjKSB7XHJcbiAgICAgIHJldHVybiBvYmMuZ2V0Q29tcGFyZXIoZW50aXR5VHlwZSk7XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBmdW5jdGlvbiAoZW50aXR5MTogYW55LCBlbnRpdHkyOiBhbnkpIHtcclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcmRlckJ5RnVuY3MubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICBsZXQgcmVzdWx0ID0gb3JkZXJCeUZ1bmNzW2ldKGVudGl0eTEsIGVudGl0eTIpO1xyXG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcclxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiAwO1xyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIHRvSlNPTkV4dChjb250ZXh0OiBFbnRpdHlRdWVyeUpzb25Db250ZXh0KSB7XHJcbiAgICByZXR1cm4gdGhpcy5pdGVtcy5tYXAoZnVuY3Rpb24gKGl0ZW0pIHtcclxuICAgICAgcmV0dXJuIGNvbnRleHQucHJvcGVydHlQYXRoRm4hKGl0ZW0ucHJvcGVydHlQYXRoKSArIChpdGVtLmlzRGVzYyA/IFwiIGRlc2NcIiA6IFwiXCIpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbmV4cG9ydCBjbGFzcyBPcmRlckJ5SXRlbSB7XHJcbiAgcHJvcGVydHlQYXRoOiBzdHJpbmc7XHJcbiAgaXNEZXNjOiBib29sZWFuO1xyXG4gIGxhc3RQcm9wZXJ0eTogRW50aXR5UHJvcGVydHk7XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5UGF0aDogc3RyaW5nLCBpc0Rlc2M/OiBib29sZWFuKSB7XHJcbiAgICBpZiAoISh0eXBlb2YgcHJvcGVydHlQYXRoID09PSAnc3RyaW5nJykpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwicHJvcGVydHlQYXRoIGlzIG5vdCBhIHN0cmluZ1wiKTtcclxuICAgIH1cclxuICAgIHByb3BlcnR5UGF0aCA9IHByb3BlcnR5UGF0aC50cmltKCk7XHJcblxyXG4gICAgbGV0IHBhcnRzID0gcHJvcGVydHlQYXRoLnNwbGl0KCcgJyk7XHJcbiAgICAvLyBwYXJ0c1swXSBpcyB0aGUgcHJvcGVydHlQYXRoOyBbMV0gd291bGQgYmUgd2hldGhlciBkZXNjZW5kaW5nIG9yIG5vdC5cclxuICAgIC8vIGlmIChwYXJ0cy5sZW5ndGggPiAxICYmIGlzRGVzYyAhPT0gdHJ1ZSAmJiBpc0Rlc2MgIT09IGZhbHNlKSB7XHJcbiAgICBpZiAocGFydHMubGVuZ3RoID4gMSAmJiBpc0Rlc2MgPT0gbnVsbCkge1xyXG4gICAgICBpc0Rlc2MgPSBjb3JlLnN0cmluZ1N0YXJ0c1dpdGgocGFydHNbMV0udG9Mb3dlckNhc2UoKSwgXCJkZXNjXCIpO1xyXG4gICAgICBpZiAoIWlzRGVzYykge1xyXG4gICAgICAgIC8vIGlzRGVzYyBpcyBmYWxzZSBidXQgY2hlY2sgdG8gbWFrZSBzdXJlIGl0cyBpbnRlbmRlZC5cclxuICAgICAgICBsZXQgaXNBc2MgPSBjb3JlLnN0cmluZ1N0YXJ0c1dpdGgocGFydHNbMV0udG9Mb3dlckNhc2UoKSwgXCJhc2NcIik7XHJcbiAgICAgICAgaWYgKCFpc0FzYykge1xyXG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwidGhlIHNlY29uZCB3b3JkIGluIHRoZSBwcm9wZXJ0eVBhdGggbXVzdCBiZWdpbiB3aXRoICdkZXNjJyBvciAnYXNjJ1wiKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLnByb3BlcnR5UGF0aCA9IHBhcnRzWzBdO1xyXG4gICAgdGhpcy5pc0Rlc2MgPSBpc0Rlc2MgfHwgZmFsc2U7XHJcbiAgfVxyXG5cclxuICB2YWxpZGF0ZShlbnRpdHlUeXBlOiBFbnRpdHlUeXBlKTogRW50aXR5UHJvcGVydHkgfCB1bmRlZmluZWQge1xyXG4gICAgaWYgKGVudGl0eVR5cGUgPT0gbnVsbCB8fCBlbnRpdHlUeXBlLmlzQW5vbnltb3VzKSByZXR1cm47XHJcbiAgICAvLyB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBvbiBiYWQgcHJvcGVydHlQYXRoXHJcbiAgICB0aGlzLmxhc3RQcm9wZXJ0eSA9IGVudGl0eVR5cGUuZ2V0UHJvcGVydHkodGhpcy5wcm9wZXJ0eVBhdGgsIHRydWUpIGFzIEVudGl0eVByb3BlcnR5O1xyXG4gICAgcmV0dXJuIHRoaXMubGFzdFByb3BlcnR5O1xyXG4gIH1cclxuXHJcbiAgZ2V0Q29tcGFyZXIoZW50aXR5VHlwZTogRW50aXR5VHlwZSkge1xyXG4gICAgbGV0IHByb3BEYXRhVHlwZTogRGF0YVR5cGU7XHJcbiAgICBsZXQgaXNDYXNlU2Vuc2l0aXZlOiBib29sZWFuO1xyXG4gICAgaWYgKCF0aGlzLmxhc3RQcm9wZXJ0eSkgdGhpcy52YWxpZGF0ZShlbnRpdHlUeXBlKTtcclxuICAgIGlmICh0aGlzLmxhc3RQcm9wZXJ0eSkge1xyXG4gICAgICBwcm9wRGF0YVR5cGUgPSAodGhpcy5sYXN0UHJvcGVydHkgYXMgYW55KS5kYXRhVHlwZTtcclxuICAgICAgaXNDYXNlU2Vuc2l0aXZlID0gdGhpcy5sYXN0UHJvcGVydHkucGFyZW50VHlwZS5tZXRhZGF0YVN0b3JlLmxvY2FsUXVlcnlDb21wYXJpc29uT3B0aW9ucy5pc0Nhc2VTZW5zaXRpdmU7XHJcbiAgICB9XHJcblxyXG4gICAgbGV0IHByb3BlcnR5UGF0aCA9IHRoaXMucHJvcGVydHlQYXRoO1xyXG4gICAgbGV0IGlzRGVzYyA9IHRoaXMuaXNEZXNjO1xyXG5cclxuICAgIHJldHVybiBmdW5jdGlvbiAoZW50aXR5MTogYW55LCBlbnRpdHkyOiBhbnkpIHtcclxuICAgICAgbGV0IHZhbHVlMSA9IEVudGl0eUFzcGVjdC5nZXRQcm9wZXJ0eVBhdGhWYWx1ZShlbnRpdHkxLCBwcm9wZXJ0eVBhdGgpO1xyXG4gICAgICBsZXQgdmFsdWUyID0gRW50aXR5QXNwZWN0LmdldFByb3BlcnR5UGF0aFZhbHVlKGVudGl0eTIsIHByb3BlcnR5UGF0aCk7XHJcbiAgICAgIGxldCBkYXRhVHlwZSA9IHByb3BEYXRhVHlwZSB8fCAodmFsdWUxICYmIERhdGFUeXBlLmZyb21WYWx1ZSh2YWx1ZTEpKSB8fCBEYXRhVHlwZS5mcm9tVmFsdWUodmFsdWUyKTtcclxuICAgICAgaWYgKGRhdGFUeXBlID09PSBEYXRhVHlwZS5TdHJpbmcpIHtcclxuICAgICAgICBpZiAoaXNDYXNlU2Vuc2l0aXZlKSB7XHJcbiAgICAgICAgICB2YWx1ZTEgPSB2YWx1ZTEgfHwgXCJcIjtcclxuICAgICAgICAgIHZhbHVlMiA9IHZhbHVlMiB8fCBcIlwiO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB2YWx1ZTEgPSAodmFsdWUxIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgICB2YWx1ZTIgPSAodmFsdWUyIHx8IFwiXCIpLnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGxldCBub3JtYWxpemUgPSBEYXRhVHlwZS5nZXRDb21wYXJhYmxlRm4oZGF0YVR5cGUpO1xyXG4gICAgICAgIHZhbHVlMSA9IG5vcm1hbGl6ZSh2YWx1ZTEpO1xyXG4gICAgICAgIHZhbHVlMiA9IG5vcm1hbGl6ZSh2YWx1ZTIpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICh2YWx1ZTEgPT09IHZhbHVlMikge1xyXG4gICAgICAgIHJldHVybiAwO1xyXG4gICAgICB9IGVsc2UgaWYgKHZhbHVlMSA+IHZhbHVlMiB8fCB2YWx1ZTIgPT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgIHJldHVybiBpc0Rlc2MgPyAtMSA6IDE7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgcmV0dXJuIGlzRGVzYyA/IDEgOiAtMTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiAgVGhlIGNsYXNzIGlzIHVzZWQgaW4gbW9zdCBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uc1xyXG5AYWRhcHRlciAoc2VlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIFNlbGVjdENsYXVzZSB7XHJcbiAgcHJvcGVydHlQYXRoczogc3RyaW5nW107XHJcbiAgLyoqIEBoaWRkZW4gQGludGVybmFsICovXHJcbiAgX3BhdGhOYW1lczogc3RyaW5nW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLnByb3BlcnR5UGF0aHMgPSBwcm9wZXJ0eVBhdGhzO1xyXG4gICAgdGhpcy5fcGF0aE5hbWVzID0gcHJvcGVydHlQYXRocy5tYXAoZnVuY3Rpb24gKHBwKSB7XHJcbiAgICAgIHJldHVybiBwcC5yZXBsYWNlKFwiLlwiLCBcIl9cIik7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlKGVudGl0eVR5cGU6IEVudGl0eVR5cGUpIHtcclxuICAgIGlmIChlbnRpdHlUeXBlID09IG51bGwgfHwgZW50aXR5VHlwZS5pc0Fub255bW91cykgcmV0dXJuOyAvLyBjYW4ndCB2YWxpZGF0ZSB5ZXRcclxuICAgIC8vIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIGJhZCBwcm9wZXJ0eVBhdGhcclxuICAgIHRoaXMucHJvcGVydHlQYXRocy5mb3JFYWNoKGZ1bmN0aW9uIChwYXRoKSB7XHJcbiAgICAgIGVudGl0eVR5cGUuZ2V0UHJvcGVydHkocGF0aCwgdHJ1ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHRvRnVuY3Rpb24oLyogY29uZmlnICovKSB7XHJcbiAgICBsZXQgdGhhdCA9IHRoaXM7XHJcbiAgICByZXR1cm4gZnVuY3Rpb24gKGVudGl0eTogRW50aXR5KSB7XHJcbiAgICAgIGxldCByZXN1bHQgPSB7fTtcclxuICAgICAgdGhhdC5wcm9wZXJ0eVBhdGhzLmZvckVhY2goZnVuY3Rpb24gKHBhdGgsIGkpIHtcclxuICAgICAgICByZXN1bHRbdGhhdC5fcGF0aE5hbWVzW2ldXSA9IEVudGl0eUFzcGVjdC5nZXRQcm9wZXJ0eVBhdGhWYWx1ZShlbnRpdHksIHBhdGgpO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH07XHJcbiAgfVxyXG5cclxuICB0b0pTT05FeHQoY29udGV4dDogRW50aXR5UXVlcnlKc29uQ29udGV4dCkge1xyXG4gICAgcmV0dXJuIHRoaXMucHJvcGVydHlQYXRocy5tYXAoZnVuY3Rpb24gKHBwKSB7XHJcbiAgICAgIHJldHVybiBjb250ZXh0LnByb3BlcnR5UGF0aEZuIShwcCk7XHJcbiAgICB9KTtcclxuICB9XHJcbn1cclxuXHJcbi8qKiBGb3IgdXNlIGJ5IGJyZWV6ZSBwbHVnaW4gYXV0aG9ycyBvbmx5LiAgVGhlIGNsYXNzIGlzIHVzZWQgaW4gbW9zdCBbW0lVcmlCdWlsZGVyQWRhcHRlcl1dIGltcGxlbWVudGF0aW9uc1xyXG5AYWRhcHRlciAoc2VlIFtbSVVyaUJ1aWxkZXJBZGFwdGVyXV0pICAgIFxyXG5AaGlkZGVuIFxyXG4qKi9cclxuZXhwb3J0IGNsYXNzIEV4cGFuZENsYXVzZSB7XHJcbiAgcHJvcGVydHlQYXRoczogc3RyaW5nW107XHJcblxyXG4gIGNvbnN0cnVjdG9yKHByb3BlcnR5UGF0aHM6IHN0cmluZ1tdKSB7XHJcbiAgICB0aGlzLnByb3BlcnR5UGF0aHMgPSBwcm9wZXJ0eVBhdGhzO1xyXG4gIH1cclxuXHJcbiAgdG9KU09ORXh0KGNvbnRleHQ6IEVudGl0eVF1ZXJ5SnNvbkNvbnRleHQpIHtcclxuICAgIHJldHVybiB0aGlzLnByb3BlcnR5UGF0aHMubWFwKGZ1bmN0aW9uIChwcCkge1xyXG4gICAgICByZXR1cm4gY29udGV4dC5wcm9wZXJ0eVBhdGhGbiEocHApO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxufVxyXG5cclxuXHJcbiJdfQ==
|