@finbourne/lusid-sdk-angular18 0.11.9972 → 0.11.9985
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/esm2022/lib/.generated/api/funds.service.mjs +3 -3
- package/esm2022/lib/.generated/api/transactionPortfolios.service.mjs +164 -13
- package/esm2022/lib/.generated/model/createRecDefinitionRequest.mjs +1 -1
- package/esm2022/lib/.generated/model/models.mjs +14 -2
- package/esm2022/lib/.generated/model/overrideDefinitionRequest.mjs +2 -0
- package/esm2022/lib/.generated/model/overrideDefinitionResponse.mjs +2 -0
- package/esm2022/lib/.generated/model/overrideEntryResponse.mjs +2 -0
- package/esm2022/lib/.generated/model/overrideVirtualTransactionsRequest.mjs +2 -0
- package/esm2022/lib/.generated/model/recActivityWindow.mjs +12 -0
- package/esm2022/lib/.generated/model/recAsAtPolicy.mjs +12 -0
- package/esm2022/lib/.generated/model/recDatePolicy.mjs +2 -0
- package/esm2022/lib/.generated/model/recDefinition.mjs +1 -1
- package/esm2022/lib/.generated/model/resourceListOfVirtualTransactionOverrideRecord.mjs +2 -0
- package/esm2022/lib/.generated/model/storedOverrideDefinition.mjs +2 -0
- package/esm2022/lib/.generated/model/suppressionEntryResponse.mjs +12 -0
- package/esm2022/lib/.generated/model/terminationEvent.mjs +1 -1
- package/esm2022/lib/.generated/model/updateRecDefinitionRequest.mjs +1 -1
- package/esm2022/lib/.generated/model/upsertVirtualTransactionOverrideResponse.mjs +2 -0
- package/esm2022/lib/.generated/model/valuationPointDataResponse.mjs +1 -1
- package/esm2022/lib/.generated/model/virtualTransactionOverrideRecord.mjs +2 -0
- package/esm2022/lib/.generated/model/{overrideVirtualTransactionsResponse.mjs → virtualTransactionOverridesResponse.mjs} +1 -1
- package/fesm2022/finbourne-lusid-sdk-angular18.mjs +198 -14
- package/fesm2022/finbourne-lusid-sdk-angular18.mjs.map +2 -2
- package/lib/.generated/api/funds.service.d.ts +2 -2
- package/lib/.generated/api/transactionPortfolios.service.d.ts +83 -14
- package/lib/.generated/model/createRecDefinitionRequest.d.ts +2 -0
- package/lib/.generated/model/models.d.ts +13 -1
- package/lib/.generated/model/overrideDefinitionRequest.d.ts +68 -0
- package/lib/.generated/model/overrideDefinitionResponse.d.ts +72 -0
- package/lib/.generated/model/overrideEntryResponse.d.ts +28 -0
- package/lib/.generated/model/overrideVirtualTransactionsRequest.d.ts +26 -0
- package/lib/.generated/model/recActivityWindow.d.ts +19 -0
- package/lib/.generated/model/recAsAtPolicy.d.ts +23 -0
- package/lib/.generated/model/recDatePolicy.d.ts +23 -0
- package/lib/.generated/model/recDefinition.d.ts +2 -0
- package/lib/.generated/model/{overrideVirtualTransactionsResponse.d.ts → resourceListOfVirtualTransactionOverrideRecord.d.ts} +5 -21
- package/lib/.generated/model/storedOverrideDefinition.d.ts +68 -0
- package/lib/.generated/model/suppressionEntryResponse.d.ts +23 -0
- package/lib/.generated/model/terminationEvent.d.ts +5 -1
- package/lib/.generated/model/updateRecDefinitionRequest.d.ts +2 -0
- package/lib/.generated/model/upsertVirtualTransactionOverrideResponse.d.ts +49 -0
- package/lib/.generated/model/valuationPointDataResponse.d.ts +2 -0
- package/lib/.generated/model/virtualTransactionOverrideRecord.d.ts +49 -0
- package/lib/.generated/model/virtualTransactionOverridesResponse.d.ts +36 -0
- package/package.json +1 -1
|
@@ -2574,7 +2574,7 @@ export class FundsService {
|
|
|
2574
2574
|
const date = requestParameters?.date;
|
|
2575
2575
|
const diaryEntry = requestParameters?.diaryEntry;
|
|
2576
2576
|
const variant = requestParameters?.variant;
|
|
2577
|
-
const
|
|
2577
|
+
const singleValuationPointQueryParameters = requestParameters?.singleValuationPointQueryParameters;
|
|
2578
2578
|
let localVarQueryParameters = new HttpParams({ encoder: this.encoder });
|
|
2579
2579
|
if (asAt !== undefined && asAt !== null) {
|
|
2580
2580
|
localVarQueryParameters = this.addToHttpParams(localVarQueryParameters, asAt, 'asAt');
|
|
@@ -2656,7 +2656,7 @@ export class FundsService {
|
|
|
2656
2656
|
let localVarPath = `/api/funds/${this.configuration.encodeParam({ name: "scope", value: scope, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}/${this.configuration.encodeParam({ name: "code", value: code, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined })}/valuationpoints/unsettledtransactions/$query`;
|
|
2657
2657
|
return this.httpClient.request('post', `${this.configuration.basePath}${localVarPath}`, {
|
|
2658
2658
|
context: localVarHttpContext,
|
|
2659
|
-
body:
|
|
2659
|
+
body: singleValuationPointQueryParameters,
|
|
2660
2660
|
params: localVarQueryParameters,
|
|
2661
2661
|
responseType: responseType_,
|
|
2662
2662
|
withCredentials: this.configuration.withCredentials,
|
|
@@ -4437,4 +4437,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImpor
|
|
|
4437
4437
|
}] }, { type: i2.Configuration, decorators: [{
|
|
4438
4438
|
type: Optional
|
|
4439
4439
|
}] }] });
|
|
4440
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuZHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ZpbmJvdXJuZS9sdXNpZC1zZGstYW5ndWxhcjE4L3NyYy9saWIvLmdlbmVyYXRlZC9hcGkvZnVuZHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVSxXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQStCLFlBQVksQ0FBQztBQThHL0UsYUFBYTtBQUNiLE9BQU8sRUFBRSxTQUFTLEVBQXNCLE1BQTBCLGNBQWMsQ0FBQztBQUNqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQTBDLGtCQUFrQixDQUFDOzs7O0FBcXZCckYsTUFBTSxPQUFPLFlBQVk7SUFPQztJQUxaLFFBQVEsR0FBRywyQkFBMkIsQ0FBQztJQUMxQyxjQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNuQyxhQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUNwQyxPQUFPLENBQXFCO0lBRW5DLFlBQXNCLFVBQXNCLEVBQWdDLFFBQXlCLEVBQWMsYUFBNEI7UUFBekgsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN4QyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENB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eEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVFrRCxRQUFROzswQkFBRyxNQUFNOzJCQUFDLFNBQVM7OzBCQUE4QixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMVVNJRCBBUElcbiAqICMgSW50cm9kdWN0aW9uICBUaGlzIHBhZ2UgZG9jdW1lbnRzIHRoZSBbTFVTSUQgQVBJc10oLi4vLi4vLi4vYXBpL3N3YWdnZXIpLCB3aGljaCBhbGxvd3MgYXV0aG9yaXNlZCBjbGllbnRzIHRvIHF1ZXJ5IGFuZCB1cGRhdGUgdGhlaXIgZGF0YSB3aXRoaW4gdGhlIExVU0lEIHBsYXRmb3JtLiAgU0RLcyB0byBpbnRlcmFjdCB3aXRoIHRoZSBMVVNJRCBBUElzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGZvbGxvd2luZyBsYW5ndWFnZXMgYW5kIGZyYW1ld29ya3M6ICAqIFtDI10oaHR0cHM6Ly9naXRodWIuY29tL2ZpbmJvdXJuZS9sdXNpZC1zZGstY3NoYXJwKSAqIFtKYXZhXShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1qYXZhKSAqIFtKYXZhU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1qcykgKiBbUHl0aG9uXShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1weXRob24pICogW0FuZ3VsYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9maW5ib3VybmUvbHVzaWQtc2RrLWFuZ3VsYXIpICBUaGUgTFVTSUQgcGxhdGZvcm0gaXMgbWFkZSB1cCBvZiBhIG51bWJlciBvZiBzdWItYXBwbGljYXRpb25zLiBZb3UgY2FuIGZpbmQgdGhlIEFQSSAvIHN3YWdnZXIgZG9jdW1lbnRhdGlvbiBieSBmb2xsb3dpbmcgdGhlIGxpbmtzIGluIHRoZSB0YWJsZSBiZWxvdy4gICB8IEFwcGxpY2F0aW9uICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBUEkgLyBTd2FnZ2VyIERvY3VtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgTFVTSUQgICAgICAgICB8IE9wZW4sIEFQSS1maXJzdCwgZGV2ZWxvcGVyLWZyaWVuZGx5IGludmVzdG1lbnQgZGF0YSBwbGF0Zm9ybS4gICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9hcGkvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgICAgICAgfCB8IFdlYiBhcHAgICAgICAgfCBVc2VyLWZhY2luZyBmcm9udCBlbmQgZm9yIExVU0lELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vYXBwL3N3YWdnZXIvaW5kZXguaHRtbCkgICAgICAgICAgIHwgfCBTY2hlZHVsZXIgICAgIHwgQXV0b21hdGVkIGpvYiBzY2hlZHVsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL3NjaGVkdWxlcjIvc3dhZ2dlci9pbmRleC5odG1sKSAgICB8IHwgSW5zaWdodHMgICAgICB8IE1vbml0b3JpbmcgYW5kIHRyb3VibGVzaG9vdGluZyBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9pbnNpZ2h0cy9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICAgfCB8IElkZW50aXR5ICAgICAgfCBJZGVudGl0eSBtYW5hZ2VtZW50IGZvciBMVVNJRCAoaW4gY29uanVuY3Rpb24gd2l0aCBBY2Nlc3MpICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vaWRlbnRpdHkvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgIHwgfCBBY2Nlc3MgICAgICAgIHwgQWNjZXNzIGNvbnRyb2wgZm9yIExVU0lEIChpbiBjb25qdW5jdGlvbiB3aXRoIElkZW50aXR5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL2FjY2Vzcy9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICAgICB8IHwgRHJpdmUgICAgICAgICB8IFNlY3VyZSBmaWxlIHJlcG9zaXRvcnkgYW5kIG1hbmFnZXIgZm9yIGNvbGxhYm9yYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9kcml2ZS9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICAgICAgfCB8IEx1bWluZXNjZSAgICAgfCBEYXRhIHZpcnR1YWxpc2F0aW9uIHNlcnZpY2UgKHF1ZXJ5IGRhdGEgZnJvbSBtdWx0aXBsZSBwcm92aWRlcnMsIGluY2x1ZGluZyBMVVNJRCkgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vaG9uZXljb21iL3N3YWdnZXIvaW5kZXguaHRtbCkgICAgIHwgfCBOb3RpZmljYXRpb24gIHwgTm90aWZpY2F0aW9uIHNlcnZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL25vdGlmaWNhdGlvbi9zd2FnZ2VyL2luZGV4Lmh0bWwpICB8IHwgQ29uZmlndXJhdGlvbiB8IEZpbGUgc3RvcmUgZm9yIHNlY3JldHMgYW5kIG90aGVyIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9jb25maWd1cmF0aW9uL3N3YWdnZXIvaW5kZXguaHRtbCkgfCB8IFdvcmtmbG93ICAgICAgfCBXb3JrZmxvdyBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vd29ya2Zsb3cvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgIHwgICAjIEVycm9yIENvZGVzICB8IENvZGV8TmFtZXxEZXNjcmlwdGlvbiB8IHwgLS0tfC0tLXwtLS0gfCB8IDxhIG5hbWU9XFxcIi0xMFxcXCI+LTEwPC9hPnxTZXJ2ZXIgQ29uZmlndXJhdGlvbiBFcnJvcnwgIHwgfCA8YSBuYW1lPVxcXCItMVxcXCI+LTE8L2E+fFVua25vd24gZXJyb3J8QW4gdW5leHBlY3RlZCBlcnJvciB3YXMgZW5jb3VudGVyZWQgb24gb3VyIHNpZGUuIHwgfCA8YSBuYW1lPVxcXCIxMDJcXFwiPjEwMjwvYT58VmVyc2lvbiBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTAzXFxcIj4xMDM8L2E+fEFwaSBSYXRlIExpbWl0IFZpb2xhdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCIxMDRcXFwiPjEwNDwvYT58SW5zdHJ1bWVudCBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTA1XFxcIj4xMDU8L2E+fFByb3BlcnR5IE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxMDZcXFwiPjEwNjwvYT58UG9ydGZvbGlvIFJlY3Vyc2lvbiBEZXB0aHwgIHwgfCA8YSBuYW1lPVxcXCIxMDhcXFwiPjEwODwvYT58R3JvdXAgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjEwOVxcXCI+MTA5PC9hPnxQb3J0Zm9saW8gTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMFxcXCI+MTEwPC9hPnxQcm9wZXJ0eSBTY2hlbWEgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMVxcXCI+MTExPC9hPnxQb3J0Zm9saW8gQW5jZXN0cnkgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMlxcXCI+MTEyPC9hPnxQb3J0Zm9saW8gV2l0aCBJZCBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxMTNcXFwiPjExMzwvYT58T3JwaGFuZWQgUG9ydGZvbGlvfCAgfCB8IDxhIG5hbWU9XFxcIjExOVxcXCI+MTE5PC9hPnxNaXNzaW5nIEJhc2UgQ2xhaW1zfCAgfCB8IDxhIG5hbWU9XFxcIjEyMVxcXCI+MTIxPC9hPnxQcm9wZXJ0eSBOb3QgRGVmaW5lZHwgIHwgfCA8YSBuYW1lPVxcXCIxMjJcXFwiPjEyMjwvYT58Q2Fubm90IERlbGV0ZSBTeXN0ZW0gUHJvcGVydHl8ICB8IHwgPGEgbmFtZT1cXFwiMTIzXFxcIj4xMjM8L2E+fENhbm5vdCBNb2RpZnkgSW1tdXRhYmxlIFByb3BlcnR5IEZpZWxkfCAgfCB8IDxhIG5hbWU9XFxcIjEyNFxcXCI+MTI0PC9hPnxQcm9wZXJ0eSBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxMjVcXFwiPjEyNTwvYT58SW52YWxpZCBQcm9wZXJ0eSBMaWZlIFRpbWV8ICB8IHwgPGEgbmFtZT1cXFwiMTI2XFxcIj4xMjY8L2E+fFByb3BlcnR5IENvbnN0cmFpbnQgU3R5bGUgRXhjbHVkZXMgUHJvcGVydGllc3wgIHwgfCA8YSBuYW1lPVxcXCIxMjdcXFwiPjEyNzwvYT58Q2Fubm90IE1vZGlmeSBEZWZhdWx0IERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMjhcXFwiPjEyODwvYT58R3JvdXAgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTI5XFxcIj4xMjk8L2E+fE5vIFN1Y2ggRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjEzMFxcXCI+MTMwPC9hPnxVbmRlZmluZWQgVmFsdWUgRm9yIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMzFcXFwiPjEzMTwvYT58VW5zdXBwb3J0ZWQgVmFsdWUgVHlwZSBEZWZpbmVkIE9uIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMzJcXFwiPjEzMjwvYT58VmFsaWRhdGlvbiBFcnJvcnwgIHwgfCA8YSBuYW1lPVxcXCIxMzNcXFwiPjEzMzwvYT58TG9vcCBEZXRlY3RlZCBJbiBHcm91cCBIaWVyYXJjaHl8ICB8IHwgPGEgbmFtZT1cXFwiMTM0XFxcIj4xMzQ8L2E+fFVuZGVmaW5lZCBBY2NlcHRhYmxlIFZhbHVlc3wgIHwgfCA8YSBuYW1lPVxcXCIxMzVcXFwiPjEzNTwvYT58U3ViIEdyb3VwIEFscmVhZHkgRXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjEzOFxcXCI+MTM4PC9hPnxQcmljZSBTb3VyY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjEzOVxcXCI+MTM5PC9hPnxBbmFseXRpYyBTdG9yZSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTQxXFxcIj4xNDE8L2E+fEFuYWx5dGljIFN0b3JlIEFscmVhZHkgRXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjE0M1xcXCI+MTQzPC9hPnxDbGllbnQgSW5zdHJ1bWVudCBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxNDRcXFwiPjE0NDwvYT58RHVwbGljYXRlIEluIFBhcmFtZXRlciBTZXR8ICB8IHwgPGEgbmFtZT1cXFwiMTQ3XFxcIj4xNDc8L2E+fFJlc3VsdHMgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE0OFxcXCI+MTQ4PC9hPnxPcmRlciBGaWVsZCBOb3QgSW4gUmVzdWx0IFNldHwgIHwgfCA8YSBuYW1lPVxcXCIxNDlcXFwiPjE0OTwvYT58T3BlcmF0aW9uIEZhaWxlZHwgIHwgfCA8YSBuYW1lPVxcXCIxNTBcXFwiPjE1MDwvYT58RWxhc3RpYyBTZWFyY2ggRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiMTUxXFxcIj4xNTE8L2E+fEludmFsaWQgUGFyYW1ldGVyIFZhbHVlfCAgfCB8IDxhIG5hbWU9XFxcIjE1M1xcXCI+MTUzPC9hPnxDb21tYW5kIFByb2Nlc3NpbmcgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNTRcXFwiPjE1NDwvYT58RW50aXR5IFN0YXRlIENvbnN0cnVjdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE1NVxcXCI+MTU1PC9hPnxFbnRpdHkgVGltZWxpbmUgRG9lcyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTU2XFxcIj4xNTY8L2E+fENvbmN1cnJlbmN5IENvbmZsaWN0IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTU3XFxcIj4xNTc8L2E+fEludmFsaWQgUmVxdWVzdHwgIHwgfCA8YSBuYW1lPVxcXCIxNThcXFwiPjE1ODwvYT58RXZlbnQgUHVibGlzaCBVbmtub3dufCAgfCB8IDxhIG5hbWU9XFxcIjE1OVxcXCI+MTU5PC9hPnxFdmVudCBRdWVyeSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE2MFxcXCI+MTYwPC9hPnxCbG9iIERpZCBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTYyXFxcIj4xNjI8L2E+fFN1YiBTeXN0ZW0gUmVxdWVzdCBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE2M1xcXCI+MTYzPC9hPnxTdWIgU3lzdGVtIENvbmZpZ3VyYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjVcXFwiPjE2NTwvYT58RmFpbGVkIFRvIERlbGV0ZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjZcXFwiPjE2NjwvYT58VXBzZXJ0IENsaWVudCBJbnN0cnVtZW50IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTY3XFxcIj4xNjc8L2E+fElsbGVnYWwgQXMgQXQgSW50ZXJ2YWx8ICB8IHwgPGEgbmFtZT1cXFwiMTY4XFxcIj4xNjg8L2E+fElsbGVnYWwgQml0ZW1wb3JhbCBRdWVyeXwgIHwgfCA8YSBuYW1lPVxcXCIxNjlcXFwiPjE2OTwvYT58SW52YWxpZCBBbHRlcm5hdGUgSWR8ICB8IHwgPGEgbmFtZT1cXFwiMTcwXFxcIj4xNzA8L2E+fENhbm5vdCBBZGQgTm9uLVdyaXRhYmxlIFByb3BlcnRpZXMgVG8gRW50aXR5fCAgfCB8IDxhIG5hbWU9XFxcIjE3MVxcXCI+MTcxPC9hPnxFbnRpdHkgQWxyZWFkeSBFeGlzdHMgSW4gR3JvdXB8ICB8IHwgPGEgbmFtZT1cXFwiMTcyXFxcIj4xNzI8L2E+fEVudGl0eSBXaXRoIElkIERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjE3M1xcXCI+MTczPC9hPnxFbnRpdHkgV2l0aCBJZCBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxNzRcXFwiPjE3NDwvYT58RGVyaXZlZCBQb3J0Zm9saW8gRGV0YWlscyBEbyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTc1XFxcIj4xNzU8L2E+fEVudGl0eSBOb3QgSW4gR3JvdXB8ICB8IHwgPGEgbmFtZT1cXFwiMTc2XFxcIj4xNzY8L2E+fFBvcnRmb2xpbyBXaXRoIE5hbWUgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTc3XFxcIj4xNzc8L2E+fEludmFsaWQgVHJhbnNhY3Rpb25zfCAgfCB8IDxhIG5hbWU9XFxcIjE3OFxcXCI+MTc4PC9hPnxSZWZlcmVuY2UgUG9ydGZvbGlvIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxNzlcXFwiPjE3OTwvYT58RHVwbGljYXRlIElkfCAgfCB8IDxhIG5hbWU9XFxcIjE4MFxcXCI+MTgwPC9hPnxDb21tYW5kIFJldHJpZXZhbCBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE4MVxcXCI+MTgxPC9hPnxEYXRhIEZpbHRlciBBcHBsaWNhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE4MlxcXCI+MTgyPC9hPnxTZWFyY2ggRmFpbGVkfCAgfCB8IDxhIG5hbWU9XFxcIjE4M1xcXCI+MTgzPC9hPnxNb3ZlbWVudHMgRW5naW5lIENvbmZpZ3VyYXRpb24gS2V5IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTg0XFxcIj4xODQ8L2E+fEZ4IFJhdGUgU291cmNlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxODVcXFwiPjE4NTwvYT58QWNjcnVhbCBTb3VyY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE4NlxcXCI+MTg2PC9hPnxBY2Nlc3MgRGVuaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjE4N1xcXCI+MTg3PC9hPnxJbnZhbGlkIElkZW50aXR5IFRva2VufCAgfCB8IDxhIG5hbWU9XFxcIjE4OFxcXCI+MTg4PC9hPnxJbnZhbGlkIFJlcXVlc3QgSGVhZGVyc3wgIHwgfCA8YSBuYW1lPVxcXCIxODlcXFwiPjE4OTwvYT58UHJpY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE5MFxcXCI+MTkwPC9hPnxJbnZhbGlkIFN1YiBIb2xkaW5nIEtleXMgUHJvdmlkZWR8ICB8IHwgPGEgbmFtZT1cXFwiMTkxXFxcIj4xOTE8L2E+fER1cGxpY2F0ZSBTdWIgSG9sZGluZyBLZXlzIFByb3ZpZGVkfCAgfCB8IDxhIG5hbWU9XFxcIjE5MlxcXCI+MTkyPC9hPnxDdXQgRGVmaW5pdGlvbiBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTkzXFxcIj4xOTM8L2E+fEN1dCBEZWZpbml0aW9uIEludmFsaWR8ICB8IHwgPGEgbmFtZT1cXFwiMTk0XFxcIj4xOTQ8L2E+fFRpbWUgVmFyaWFudCBQcm9wZXJ0eSBEZWxldGlvbiBEYXRlIFVuc3BlY2lmaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjE5NVxcXCI+MTk1PC9hPnxQZXJwZXR1YWwgUHJvcGVydHkgRGVsZXRpb24gRGF0ZSBTcGVjaWZpZWR8ICB8IHwgPGEgbmFtZT1cXFwiMTk2XFxcIj4xOTY8L2E+fFRpbWUgVmFyaWFudCBQcm9wZXJ0eSBVcHNlcnQgRGF0ZSBVbnNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIxOTdcXFwiPjE5NzwvYT58UGVycGV0dWFsIFByb3BlcnR5IFVwc2VydCBEYXRlIFNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIyMDBcXFwiPjIwMDwvYT58SW52YWxpZCBVbml0IEZvciBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjAxXFxcIj4yMDE8L2E+fEludmFsaWQgVHlwZSBGb3IgRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwMlxcXCI+MjAyPC9hPnxJbnZhbGlkIFZhbHVlIEZvciBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjAzXFxcIj4yMDM8L2E+fFVuaXQgTm90IERlZmluZWQgRm9yIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMDRcXFwiPjIwNDwvYT58VW5pdHMgTm90IFN1cHBvcnRlZCBPbiBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjA1XFxcIj4yMDU8L2E+fENhbm5vdCBTcGVjaWZ5IFVuaXRzIE9uIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMDZcXFwiPjIwNjwvYT58VW5pdCBTY2hlbWEgSW5jb25zaXN0ZW50IFdpdGggRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwN1xcXCI+MjA3PC9hPnxVbml0IERlZmluaXRpb24gTm90IFNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIyMDhcXFwiPjIwODwvYT58RHVwbGljYXRlIFVuaXQgRGVmaW5pdGlvbnMgU3BlY2lmaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjIwOVxcXCI+MjA5PC9hPnxJbnZhbGlkIFVuaXRzIERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiMjEwXFxcIj4yMTA8L2E+fEludmFsaWQgSW5zdHJ1bWVudCBJZGVudGlmaWVyIFVuaXR8ICB8IHwgPGEgbmFtZT1cXFwiMjExXFxcIj4yMTE8L2E+fEhvbGRpbmdzIEFkanVzdG1lbnQgRG9lcyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMjEyXFxcIj4yMTI8L2E+fENvdWxkIE5vdCBCdWlsZCBFeGNlbCBVcmx8ICB8IHwgPGEgbmFtZT1cXFwiMjEzXFxcIj4yMTM8L2E+fENvdWxkIE5vdCBHZXQgRXhjZWwgVmVyc2lvbnwgIHwgfCA8YSBuYW1lPVxcXCIyMTRcXFwiPjIxNDwvYT58SW5zdHJ1bWVudCBCeSBDb2RlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIyMTVcXFwiPjIxNTwvYT58RW50aXR5IFNjaGVtYSBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCIyMTZcXFwiPjIxNjwvYT58RmVhdHVyZSBOb3QgU3VwcG9ydGVkIE9uIFBvcnRmb2xpbyBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIxN1xcXCI+MjE3PC9hPnxRdW90ZSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMjE4XFxcIj4yMTg8L2E+fEludmFsaWQgUXVvdGUgSWRlbnRpZmllcnwgIHwgfCA8YSBuYW1lPVxcXCIyMTlcXFwiPjIxOTwvYT58SW52YWxpZCBNZXRyaWMgRm9yIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMjBcXFwiPjIyMDwvYT58SW52YWxpZCBJbnN0cnVtZW50IERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiMjIxXFxcIj4yMjE8L2E+fEluc3RydW1lbnQgVXBzZXJ0IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMjIyXFxcIj4yMjI8L2E+fFJlZmVyZW5jZSBQb3J0Zm9saW8gUmVxdWVzdCBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjIyM1xcXCI+MjIzPC9hPnxUcmFuc2FjdGlvbiBQb3J0Zm9saW8gUmVxdWVzdCBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjIyNFxcXCI+MjI0PC9hPnxJbnZhbGlkIFByb3BlcnR5IFZhbHVlIEFzc2lnbm1lbnR8ICB8IHwgPGEgbmFtZT1cXFwiMjMwXFxcIj4yMzA8L2E+fFRyYW5zYWN0aW9uIFR5cGUgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjIzMVxcXCI+MjMxPC9hPnxUcmFuc2FjdGlvbiBUeXBlIER1cGxpY2F0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjIzMlxcXCI+MjMyPC9hPnxQb3J0Zm9saW8gRG9lcyBOb3QgRXhpc3QgQXQgR2l2ZW4gRGF0ZXwgIHwgfCA8YSBuYW1lPVxcXCIyMzNcXFwiPjIzMzwvYT58UXVlcnkgUGFyc2VyIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMjM0XFxcIj4yMzQ8L2E+fER1cGxpY2F0ZSBDb25zdGl0dWVudHwgIHwgfCA8YSBuYW1lPVxcXCIyMzVcXFwiPjIzNTwvYT58VW5yZXNvbHZlZCBJbnN0cnVtZW50IENvbnN0aXR1ZW50fCAgfCB8IDxhIG5hbWU9XFxcIjIzNlxcXCI+MjM2PC9hPnxVbnJlc29sdmVkIEluc3RydW1lbnQgSW4gVHJhbnNpdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCIyMzdcXFwiPjIzNzwvYT58TWlzc2luZyBTaWRlIERlZmluaXRpb25zfCAgfCB8IDxhIG5hbWU9XFxcIjI0MFxcXCI+MjQwPC9hPnxEdXBsaWNhdGUgQ2FsY3VsYXRpb25zIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMjk5XFxcIj4yOTk8L2E+fEludmFsaWQgUmVjaXBlfCAgfCB8IDxhIG5hbWU9XFxcIjMwMFxcXCI+MzAwPC9hPnxNaXNzaW5nIFJlY2lwZXwgIHwgfCA8YSBuYW1lPVxcXCIzMDFcXFwiPjMwMTwvYT58RGVwZW5kZW5jaWVzfCAgfCB8IDxhIG5hbWU9XFxcIjMwNFxcXCI+MzA0PC9hPnxQb3J0Zm9saW8gUHJlcHJvY2VzcyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMxMFxcXCI+MzEwPC9hPnxWYWx1YXRpb24gRW5naW5lIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzExXFxcIj4zMTE8L2E+fFRhc2sgRmFjdG9yeSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMxMlxcXCI+MzEyPC9hPnxUYXNrIEV2YWx1YXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMTNcXFwiPjMxMzwvYT58VGFzayBHZW5lcmF0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzE0XFxcIj4zMTQ8L2E+fEVuZ2luZSBDb25maWd1cmF0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzE1XFxcIj4zMTU8L2E+fE1vZGVsIFNwZWNpZmljYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMjBcXFwiPjMyMDwvYT58TWFya2V0IERhdGEgS2V5IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzIxXFxcIj4zMjE8L2E+fE1hcmtldCBSZXNvbHZlciBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMyMlxcXCI+MzIyPC9hPnxNYXJrZXQgRGF0YSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMzMFxcXCI+MzMwPC9hPnxDdXJ2ZSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMzMVxcXCI+MzMxPC9hPnxWb2xhdGlsaXR5IFN1cmZhY2UgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMzJcXFwiPjMzMjwvYT58Vm9sYXRpbGl0eSBDdWJlIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzUwXFxcIj4zNTA8L2E+fEluc3RydW1lbnQgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNTFcXFwiPjM1MTwvYT58Q2FzaCBGbG93cyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM1MlxcXCI+MzUyPC9hPnxSZWZlcmVuY2UgRGF0YSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM2MFxcXCI+MzYwPC9hPnxBZ2dyZWdhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM2MVxcXCI+MzYxPC9hPnxBZ2dyZWdhdGlvbiBNZWFzdXJlIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzcwXFxcIj4zNzA8L2E+fFJlc3VsdCBSZXRyaWV2YWwgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNzFcXFwiPjM3MTwvYT58UmVzdWx0IFByb2Nlc3NpbmcgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNzJcXFwiPjM3MjwvYT58VmVuZG9yIFJlc3VsdCBQcm9jZXNzaW5nIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzczXFxcIj4zNzM8L2E+fFZlbmRvciBSZXN1bHQgTWFwcGluZyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM3NFxcXCI+Mzc0PC9hPnxWZW5kb3IgTGlicmFyeSBVbmF1dGhvcmlzZWR8ICB8IHwgPGEgbmFtZT1cXFwiMzc1XFxcIj4zNzU8L2E+fFZlbmRvciBDb25uZWN0aXZpdHkgRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiMzc2XFxcIj4zNzY8L2E+fFZlbmRvciBJbnRlcmZhY2UgRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiMzc3XFxcIj4zNzc8L2E+fFZlbmRvciBQcmljaW5nIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzc4XFxcIj4zNzg8L2E+fFZlbmRvciBUcmFuc2xhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM3OVxcXCI+Mzc5PC9hPnxWZW5kb3IgS2V5IE1hcHBpbmcgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzODBcXFwiPjM4MDwvYT58VmVuZG9yIFJlZmxlY3Rpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzODFcXFwiPjM4MTwvYT58VmVuZG9yIFByb2Nlc3MgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzODJcXFwiPjM4MjwvYT58VmVuZG9yIFN5c3RlbSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM5MFxcXCI+MzkwPC9hPnxBdHRlbXB0IFRvIFVwc2VydCBEdXBsaWNhdGUgUXVvdGVzfCAgfCB8IDxhIG5hbWU9XFxcIjM5MVxcXCI+MzkxPC9hPnxDb3Jwb3JhdGUgQWN0aW9uIFNvdXJjZSBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCIzOTJcXFwiPjM5MjwvYT58Q29ycG9yYXRlIEFjdGlvbiBTb3VyY2UgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMzkzXFxcIj4zOTM8L2E+fEluc3RydW1lbnQgSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCIzOTRcXFwiPjM5NDwvYT58UHJvcGVydGllcyBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMzk1XFxcIj4zOTU8L2E+fEJhdGNoIE9wZXJhdGlvbiBBYm9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjQwMFxcXCI+NDAwPC9hPnxJbnZhbGlkIElzbzQyMTcgQ3VycmVuY3kgQ29kZXwgIHwgfCA8YSBuYW1lPVxcXCI0MDFcXFwiPjQwMTwvYT58Q2Fubm90IEFzc2lnbiBJbnN0cnVtZW50IElkZW50aWZpZXIgVG8gQ3VycmVuY3l8ICB8IHwgPGEgbmFtZT1cXFwiNDAyXFxcIj40MDI8L2E+fENhbm5vdCBBc3NpZ24gQ3VycmVuY3kgSWRlbnRpZmllciBUbyBOb24gQ3VycmVuY3l8ICB8IHwgPGEgbmFtZT1cXFwiNDAzXFxcIj40MDM8L2E+fEN1cnJlbmN5IEluc3RydW1lbnQgQ2Fubm90IEJlIERlbGV0ZWR8ICB8IHwgPGEgbmFtZT1cXFwiNDA0XFxcIj40MDQ8L2E+fEN1cnJlbmN5IEluc3RydW1lbnQgQ2Fubm90IEhhdmUgRWNvbm9taWMgRGVmaW5pdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI0MDVcXFwiPjQwNTwvYT58Q3VycmVuY3kgSW5zdHJ1bWVudCBDYW5ub3QgSGF2ZSBMb29rdGhyb3VnaCBQb3J0Zm9saW98ICB8IHwgPGEgbmFtZT1cXFwiNDA2XFxcIj40MDY8L2E+fENhbm5vdCBDcmVhdGUgQ3VycmVuY3kgSW5zdHJ1bWVudCBXaXRoIE11bHRpcGxlIElkZW50aWZpZXJzfCAgfCB8IDxhIG5hbWU9XFxcIjQwN1xcXCI+NDA3PC9hPnxTcGVjaWZpZWQgQ3VycmVuY3kgSXMgVW5kZWZpbmVkfCAgfCB8IDxhIG5hbWU9XFxcIjQxMFxcXCI+NDEwPC9hPnxJbmRleCBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI0MTFcXFwiPjQxMTwvYT58U29ydCBGaWVsZCBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI0MTNcXFwiPjQxMzwvYT58TmVnYXRpdmUgUGFnaW5hdGlvbiBQYXJhbWV0ZXJzfCAgfCB8IDxhIG5hbWU9XFxcIjQxNFxcXCI+NDE0PC9hPnxJbnZhbGlkIFNlYXJjaCBTeW50YXh8ICB8IHwgPGEgbmFtZT1cXFwiNDE1XFxcIj40MTU8L2E+fEZpbHRlciBFeGVjdXRpb24gVGltZW91dHwgIHwgfCA8YSBuYW1lPVxcXCI0MjBcXFwiPjQyMDwvYT58U2lkZSBEZWZpbml0aW9uIEluY29uc2lzdGVudHwgIHwgfCA8YSBuYW1lPVxcXCI0NTBcXFwiPjQ1MDwvYT58SW52YWxpZCBRdW90ZSBBY2Nlc3MgTWV0YWRhdGEgUnVsZXwgIHwgfCA8YSBuYW1lPVxcXCI0NTFcXFwiPjQ1MTwvYT58QWNjZXNzIE1ldGFkYXRhIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI0NTJcXFwiPjQ1MjwvYT58SW52YWxpZCBBY2Nlc3MgTWV0YWRhdGEgSWRlbnRpZmllcnwgIHwgfCA8YSBuYW1lPVxcXCI0NjBcXFwiPjQ2MDwvYT58U3RhbmRhcmQgUmVzb3VyY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjQ2MVxcXCI+NDYxPC9hPnxTdGFuZGFyZCBSZXNvdXJjZSBDb25mbGljdHwgIHwgfCA8YSBuYW1lPVxcXCI0NjJcXFwiPjQ2MjwvYT58Q2FsZW5kYXIgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjQ2M1xcXCI+NDYzPC9hPnxEYXRlIEluIEEgQ2FsZW5kYXIgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjQ2NFxcXCI+NDY0PC9hPnxJbnZhbGlkIERhdGUgU291cmNlIERhdGF8ICB8IHwgPGEgbmFtZT1cXFwiNDY1XFxcIj40NjU8L2E+fEludmFsaWQgVGltZXpvbmV8ICB8IHwgPGEgbmFtZT1cXFwiNjAxXFxcIj42MDE8L2E+fFBlcnNvbiBJZGVudGlmaWVyIEFscmVhZHkgSW4gVXNlfCAgfCB8IDxhIG5hbWU9XFxcIjYwMlxcXCI+NjAyPC9hPnxQZXJzb24gTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjYwM1xcXCI+NjAzPC9hPnxDYW5ub3QgU2V0IElkZW50aWZpZXJ8ICB8IHwgPGEgbmFtZT1cXFwiNjE3XFxcIj42MTc8L2E+fEludmFsaWQgUmVjaXBlIFNwZWNpZmljYXRpb24gSW4gUmVxdWVzdHwgIHwgfCA8YSBuYW1lPVxcXCI2MThcXFwiPjYxODwvYT58SW5saW5lIFJlY2lwZSBEZXNlcmlhbGlzYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCI2MTlcXFwiPjYxOTwvYT58SWRlbnRpZmllciBUeXBlcyBOb3QgU2V0IEZvciBFbnRpdHl8ICB8IHwgPGEgbmFtZT1cXFwiNjIwXFxcIj42MjA8L2E+fENhbm5vdCBEZWxldGUgQWxsIENsaWVudCBEZWZpbmVkIElkZW50aWZpZXJzfCAgfCB8IDxhIG5hbWU9XFxcIjY1MFxcXCI+NjUwPC9hPnxUaGUgT3JkZXIgcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjY1NFxcXCI+NjU0PC9hPnxUaGUgQWxsb2NhdGlvbiByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNjU1XFxcIj42NTU8L2E+fENhbm5vdCBidWlsZCB0aGUgZnggZm9yd2FyZCB0YXJnZXQgd2l0aCB0aGUgZ2l2ZW4gaG9sZGluZ3MufCAgfCB8IDxhIG5hbWU9XFxcIjY1NlxcXCI+NjU2PC9hPnxHcm91cCBkb2VzIG5vdCBjb250YWluIGV4cGVjdGVkIGVudGl0aWVzLnwgIHwgfCA8YSBuYW1lPVxcXCI2NjVcXFwiPjY2NTwvYT58RGVzdGluYXRpb24gZGlyZWN0b3J5IG5vdCBmb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI2NjdcXFwiPjY2NzwvYT58UmVsYXRpb24gZGVmaW5pdGlvbiBhbHJlYWR5IGV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCI2NzJcXFwiPjY3MjwvYT58Q291bGQgbm90IHJldHJpZXZlIGZpbGUgY29udGVudHN8ICB8IHwgPGEgbmFtZT1cXFwiNjczXFxcIj42NzM8L2E+fE1pc3NpbmcgZW50aXRsZW1lbnRzIGZvciBlbnRpdGllcyBpbiBHcm91cHwgIHwgfCA8YSBuYW1lPVxcXCI2NzRcXFwiPjY3NDwvYT58TmV4dCBCZXN0IEFjdGlvbiBub3QgZm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiNjc2XFxcIj42NzY8L2E+fFJlbGF0aW9uIGRlZmluaXRpb24gbm90IGRlZmluZWR8ICB8IHwgPGEgbmFtZT1cXFwiNjc3XFxcIj42Nzc8L2E+fEludmFsaWQgZW50aXR5IGlkZW50aWZpZXIgZm9yIHJlbGF0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjY4MVxcXCI+NjgxPC9hPnxTb3J0aW5nIGJ5IHNwZWNpZmllZCBmaWVsZCBub3Qgc3VwcG9ydGVkfE9uZSBvciBtb3JlIG9mIHRoZSBwcm92aWRlZCBmaWVsZHMgdG8gb3JkZXIgYnkgd2VyZSBlaXRoZXIgaW52YWxpZCBvciBub3Qgc3VwcG9ydGVkLiB8IHwgPGEgbmFtZT1cXFwiNjgyXFxcIj42ODI8L2E+fFRvbyBtYW55IGZpZWxkcyB0byBzb3J0IGJ5fFRoZSBudW1iZXIgb2YgZmllbGRzIHRvIHNvcnQgdGhlIGRhdGEgYnkgZXhjZWVkcyB0aGUgbnVtYmVyIGFsbG93ZWQgYnkgdGhlIGVuZHBvaW50IHwgfCA8YSBuYW1lPVxcXCI2ODRcXFwiPjY4NDwvYT58U2VxdWVuY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjY4NVxcXCI+Njg1PC9hPnxTZXF1ZW5jZSBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCI2ODZcXFwiPjY4NjwvYT58Tm9uLWN5Y2xpbmcgc2VxdWVuY2UgaGFzIGJlZW4gZXhoYXVzdGVkfCAgfCB8IDxhIG5hbWU9XFxcIjY4N1xcXCI+Njg3PC9hPnxMZWdhbCBFbnRpdHkgSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI2ODhcXFwiPjY4ODwvYT58TGVnYWwgRW50aXR5IE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI2ODlcXFwiPjY4OTwvYT58VGhlIHN1cHBsaWVkIHBhZ2luYXRpb24gdG9rZW4gaXMgaW52YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI2OTBcXFwiPjY5MDwvYT58UHJvcGVydHkgVHlwZSBJcyBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjY5MVxcXCI+NjkxPC9hPnxNdWx0aXBsZSBUYXgtbG90cyBGb3IgQ3VycmVuY3kgVHlwZSBJcyBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjY5MlxcXCI+NjkyPC9hPnxUaGlzIGVuZHBvaW50IGRvZXMgbm90IHN1cHBvcnQgaW1wZXJzb25hdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI2OTNcXFwiPjY5MzwvYT58RW50aXR5IHR5cGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgUmVsYXRpb25zaGlwfCAgfCB8IDxhIG5hbWU9XFxcIjY5NFxcXCI+Njk0PC9hPnxSZWxhdGlvbnNoaXAgVmFsaWRhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjY5NVxcXCI+Njk1PC9hPnxSZWxhdGlvbnNoaXAgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjY5N1xcXCI+Njk3PC9hPnxEZXJpdmVkIFByb3BlcnR5IEZvcm11bGEgTm8gTG9uZ2VyIFZhbGlkfCAgfCB8IDxhIG5hbWU9XFxcIjY5OFxcXCI+Njk4PC9hPnxTdG9yeSBpcyBub3QgYXZhaWxhYmxlfCAgfCB8IDxhIG5hbWU9XFxcIjcwM1xcXCI+NzAzPC9hPnxDb3Jwb3JhdGUgQWN0aW9uIERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjcyMFxcXCI+NzIwPC9hPnxUaGUgcHJvdmlkZWQgc29ydCBhbmQgZmlsdGVyIGNvbWJpbmF0aW9uIGlzIG5vdCB2YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI3MjFcXFwiPjcyMTwvYT58QTJCIGdlbmVyYXRpb24gZmFpbGVkfCAgfCB8IDxhIG5hbWU9XFxcIjcyMlxcXCI+NzIyPC9hPnxBZ2dyZWdhdGVkIFJldHVybiBDYWxjdWxhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjcyM1xcXCI+NzIzPC9hPnxDdXN0b20gRW50aXR5IERlZmluaXRpb24gSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI3MjRcXFwiPjcyNDwvYT58Q3VzdG9tIEVudGl0eSBEZWZpbml0aW9uIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI3MjVcXFwiPjcyNTwvYT58VGhlIFBsYWNlbWVudCByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzI2XFxcIj43MjY8L2E+fFRoZSBFeGVjdXRpb24gcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjcyN1xcXCI+NzI3PC9hPnxUaGUgQmxvY2sgcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjcyOFxcXCI+NzI4PC9hPnxUaGUgUGFydGljaXBhdGlvbiByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzI5XFxcIj43Mjk8L2E+fFRoZSBQYWNrYWdlIHJlcXVlc3RlZCB3YXMgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3MzBcXFwiPjczMDwvYT58VGhlIE9yZGVySW5zdHJ1Y3Rpb24gcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjczMlxcXCI+NzMyPC9hPnxDdXN0b20gRW50aXR5IG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzMzXFxcIj43MzM8L2E+fEN1c3RvbSBFbnRpdHkgSWRlbnRpZmllciBhbHJlYWR5IGluIHVzZS58ICB8IHwgPGEgbmFtZT1cXFwiNzM1XFxcIj43MzU8L2E+fENhbGN1bGF0aW9uIEZhaWxlZC58ICB8IHwgPGEgbmFtZT1cXFwiNzM2XFxcIj43MzY8L2E+fEFuIGV4cGVjdGVkIGtleSBvbiBIdHRwUmVzcG9uc2UgaXMgbWlzc2luZy58ICB8IHwgPGEgbmFtZT1cXFwiNzM3XFxcIj43Mzc8L2E+fEEgcmVxdWlyZWQgZmVlIGRldGFpbCBpcyBtaXNzaW5nLnwgIHwgfCA8YSBuYW1lPVxcXCI3MzhcXFwiPjczODwvYT58WmVybyByb3dzIHdlcmUgcmV0dXJuZWQgZnJvbSBMdW1pbmVzY2V8ICB8IHwgPGEgbmFtZT1cXFwiNzM5XFxcIj43Mzk8L2E+fFByb3ZpZGVkIFdlZWtlbmQgTWFzayB3YXMgaW52YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI3NDJcXFwiPjc0MjwvYT58Q3VzdG9tIEVudGl0eSBmaWVsZHMgZG8gbm90IG1hdGNoIHRoZSBkZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjc0NlxcXCI+NzQ2PC9hPnxUaGUgcHJvdmlkZWQgc2VxdWVuY2UgaXMgbm90IHZhbGlkLnwgIHwgfCA8YSBuYW1lPVxcXCI3NTFcXFwiPjc1MTwvYT58VGhlIHR5cGUgb2YgdGhlIEN1c3RvbSBFbnRpdHkgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHR5cGUgcHJvdmlkZWQgaW4gdGhlIGRlZmluaXRpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjc1MlxcXCI+NzUyPC9hPnxMdW1pbmVzY2UgcHJvY2VzcyByZXR1cm5lZCBhbiBlcnJvci58ICB8IHwgPGEgbmFtZT1cXFwiNzUzXFxcIj43NTM8L2E+fEZpbGUgbmFtZSBvciBjb250ZW50IGluY29tcGF0aWJsZSB3aXRoIG9wZXJhdGlvbi58ICB8IHwgPGEgbmFtZT1cXFwiNzU1XFxcIj43NTU8L2E+fFNjaGVtYSBvZiByZXNwb25zZSBmcm9tIERyaXZlIGlzIG5vdCBhcyBleHBlY3RlZC58ICB8IHwgPGEgbmFtZT1cXFwiNzU3XFxcIj43NTc8L2E+fFNjaGVtYSBvZiByZXNwb25zZSBmcm9tIEx1bWluZXNjZSBpcyBub3QgYXMgZXhwZWN0ZWQufCAgfCB8IDxhIG5hbWU9XFxcIjc1OFxcXCI+NzU4PC9hPnxMdW1pbmVzY2UgdGltZWQgb3V0LnwgIHwgfCA8YSBuYW1lPVxcXCI3NjNcXFwiPjc2MzwvYT58SW52YWxpZCBMdXNpZCBFbnRpdHkgSWRlbnRpZmllciBVbml0fCAgfCB8IDxhIG5hbWU9XFxcIjc2OFxcXCI+NzY4PC9hPnxGZWUgcnVsZSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjc2OVxcXCI+NzY5PC9hPnxDYW5ub3QgdXBkYXRlIHRoZSBiYXNlIGN1cnJlbmN5IG9mIGEgcG9ydGZvbGlvIHdpdGggdHJhbnNhY3Rpb25zIGxvYWRlZHwgIHwgfCA8YSBuYW1lPVxcXCI3NzFcXFwiPjc3MTwvYT58VHJhbnNhY3Rpb24gY29uZmlndXJhdGlvbiBzb3VyY2Ugbm90IGZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjc3NFxcXCI+Nzc0PC9hPnxDb21wbGlhbmNlIHJ1bGUgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3NzVcXFwiPjc3NTwvYT58RnVuZCBhY2NvdW50aW5nIGRvY3VtZW50IGNhbm5vdCBiZSBwcm9jZXNzZWQufCAgfCB8IDxhIG5hbWU9XFxcIjc3OFxcXCI+Nzc4PC9hPnxVbmFibGUgdG8gbG9vayB1cCBGWCByYXRlIGZyb20gdHJhZGUgY2N5IHRvIHBvcnRmb2xpbyBjY3kgZm9yIHNvbWUgb2YgdGhlIHRyYWRlcy58ICB8IHwgPGEgbmFtZT1cXFwiNzgyXFxcIj43ODI8L2E+fFRoZSBQcm9wZXJ0eSBkZWZpbml0aW9uIGRhdGFUeXBlIGlzIG5vdCBtYXRjaGluZyB0aGUgZGVyaXZhdGlvbiBmb3JtdWxhIGRhdGFUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjc4M1xcXCI+NzgzPC9hPnxUaGUgUHJvcGVydHkgZGVmaW5pdGlvbiBkb21haW4gaXMgbm90IHN1cHBvcnRlZCBmb3IgZGVyaXZlZCBwcm9wZXJ0aWVzfCAgfCB8IDxhIG5hbWU9XFxcIjc4OFxcXCI+Nzg4PC9hPnxDb21wbGlhbmNlIHJ1biBub3QgZm91bmQgZmFpbHVyZS58ICB8IHwgPGEgbmFtZT1cXFwiNzkwXFxcIj43OTA8L2E+fEN1c3RvbSBFbnRpdHkgaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBpZGVudGlmaWVyc3wgIHwgfCA8YSBuYW1lPVxcXCI3OTFcXFwiPjc5MTwvYT58Q3VzdG9tIEVudGl0eSBkZWZpbml0aW9uIGFscmVhZHkgZXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjc5MlxcXCI+NzkyPC9hPnxDb21wbGlhbmNlIFByb3BlcnR5S2V5IGlzIG1pc3NpbmcufCAgfCB8IDxhIG5hbWU9XFxcIjc5M1xcXCI+NzkzPC9hPnxDb21wbGlhbmNlIENyaXRlcmlhIFZhbHVlIGZvciBtYXRjaGluZyBpcyBtaXNzaW5nLnwgIHwgfCA8YSBuYW1lPVxcXCI3OTVcXFwiPjc5NTwvYT58Q2Fubm90IGRlbGV0ZSBpZGVudGlmaWVyIGRlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiNzk2XFxcIj43OTY8L2E+fFRheCBydWxlIHNldCBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjc5N1xcXCI+Nzk3PC9hPnxBIHRheCBydWxlIHNldCB3aXRoIHRoaXMgaWQgYWxyZWFkeSBleGlzdHMufCAgfCB8IDxhIG5hbWU9XFxcIjc5OFxcXCI+Nzk4PC9hPnxNdWx0aXBsZSBydWxlIHNldHMgZm9yIHRoZSBzYW1lIHByb3BlcnR5IGtleSBhcmUgYXBwbGljYWJsZS58ICB8IHwgPGEgbmFtZT1cXFwiNzk5XFxcIj43OTk8L2E+fFRoZSByZXF1ZXN0IG11c3QgY29udGFpbiBhIGRhdGUgb3IgZGlhcnkgZW50cnkufCAgfCB8IDxhIG5hbWU9XFxcIjgwMFxcXCI+ODAwPC9hPnxDYW4gbm90IHVwc2VydCBhbiBpbnN0cnVtZW50IGV2ZW50IG9mIHRoaXMgdHlwZS58ICB8IHwgPGEgbmFtZT1cXFwiODAxXFxcIj44MDE8L2E+fFRoZSBpbnN0cnVtZW50IGV2ZW50IGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MDJcXFwiPjgwMjwvYT58VGhlIEluc3RydW1lbnQgZXZlbnQgaXMgbWlzc2luZyBzYWxpZW50IGluZm9ybWF0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI4MDNcXFwiPjgwMzwvYT58VGhlIEluc3RydW1lbnQgZXZlbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC58ICB8IHwgPGEgbmFtZT1cXFwiODA0XFxcIj44MDQ8L2E+fFNvbWUgZGF0YSByZXF1ZXN0ZWQgZG9lcyBub3QgZm9sbG93IHRoZSBvcmRlciBncmFwaCBhc3N1bXB0aW9ucy58ICB8IHwgPGEgbmFtZT1cXFwiODA1XFxcIj44MDU8L2E+fFRoZSBpbnN0cnVtZW50IGV2ZW50IHR5cGUgZG9lcyBub3QgZXhpc3QufCAgfCB8IDxhIG5hbWU9XFxcIjgwNlxcXCI+ODA2PC9hPnxUaGUgdHJhbnNhY3Rpb24gdGVtcGxhdGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODA3XFxcIj44MDc8L2E+fFRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MDhcXFwiPjgwODwvYT58VGhlIHRyYW5zYWN0aW9uIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MTFcXFwiPjgxMTwvYT58QSBwcmljZSBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGFuIG9yZGVyLnwgIHwgfCA8YSBuYW1lPVxcXCI4MTJcXFwiPjgxMjwvYT58QSBwcmljZSBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGFuIGFsbG9jYXRpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjgxM1xcXCI+ODEzPC9hPnxDaGFydCBvZiBBY2NvdW50cyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgxNFxcXCI+ODE0PC9hPnxBY2NvdW50IG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODE1XFxcIj44MTU8L2E+fEFib3Igbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4MTZcXFwiPjgxNjwvYT58QWJvciBDb25maWd1cmF0aW9uIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODE3XFxcIj44MTc8L2E+fFJlY29uY2lsaWF0aW9uIG1hcHBpbmcgbm90IGZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjgxOFxcXCI+ODE4PC9hPnxBdHRyaWJ1dGUgdHlwZSBjb3VsZCBub3QgYmUgZGVsZXRlZCBiZWNhdXNlIGl0IGRvZXNuXFwndCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODE5XFxcIj44MTk8L2E+fFJlY29uY2lsaWF0aW9uIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODIwXFxcIj44MjA8L2E+fEN1c3RvZGlhbiBBY2NvdW50IG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODIxXFxcIj44MjE8L2E+fEFsbG9jYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCI4MjJcXFwiPjgyMjwvYT58UmVjb25jaWxpYXRpb24gcnVuIG5vdCBmb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI4MjNcXFwiPjgyMzwvYT58UmVjb25jaWxpYXRpb24gYnJlYWsgbm90IGZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjgyNFxcXCI+ODI0PC9hPnxFbnRpdHkgbGluayB0eXBlIGNvdWxkIG5vdCBiZSBkZWxldGVkIGJlY2F1c2UgaXQgZG9lc25cXCd0IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MjhcXFwiPjgyODwvYT58QWRkcmVzcyBrZXkgZGVmaW5pdGlvbiBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgyOVxcXCI+ODI5PC9hPnxDb21wbGlhbmNlIHRlbXBsYXRlIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODMwXFxcIj44MzA8L2E+fEFjdGlvbiBub3Qgc3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjgzMVxcXCI+ODMxPC9hPnxSZWZlcmVuY2UgbGlzdCBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzMlxcXCI+ODMyPC9hPnxQb3N0aW5nIE1vZHVsZSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzM1xcXCI+ODMzPC9hPnxUaGUgdHlwZSBvZiBwYXJhbWV0ZXIgcHJvdmlkZWQgZGlkIG5vdCBtYXRjaCB0aGF0IHJlcXVpcmVkIGJ5IHRoZSBjb21wbGlhbmNlIHJ1bGUufCAgfCB8IDxhIG5hbWU9XFxcIjgzNFxcXCI+ODM0PC9hPnxUaGUgcGFyYW1ldGVycyBwcm92aWRlZCBieSBhIHJ1bGUgZGlkIG5vdCBtYXRjaCB0aG9zZSByZXF1aXJlZCBieSBpdHMgdGVtcGxhdGUufCAgfCB8IDxhIG5hbWU9XFxcIjgzNVxcXCI+ODM1PC9hPnxUaGUgZW50aXR5IGhhcyBhIHByb3BlcnR5IGluIGEgZG9tYWluIHRoYXQgaXMgbm90IHN1cHBydGVkIGZvciB0aGF0IGVudGl0eSB0eXBlLnwgIHwgfCA8YSBuYW1lPVxcXCI4MzZcXFwiPjgzNjwvYT58U3RydWN0dXJlZCByZXN1bHQgZGF0YSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzN1xcXCI+ODM3PC9hPnxEaWFyeSBlbnRyeSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzOFxcXCI+ODM4PC9hPnxEaWFyeSBlbnRyeSBjb3VsZCBub3QgYmUgY3JlYXRlZC58ICB8IHwgPGEgbmFtZT1cXFwiODM5XFxcIj44Mzk8L2E+fERpYXJ5IGVudHJ5IGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI4NjFcXFwiPjg2MTwvYT58Q29tcGxpYW5jZSBydW4gc3VtbWFyeSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjg2OVxcXCI+ODY5PC9hPnxDb25mbGljdGluZyBpbnN0cnVtZW50IHByb3BlcnRpZXMgaW4gYmF0Y2gufCAgfCB8IDxhIG5hbWU9XFxcIjg3MFxcXCI+ODcwPC9hPnxDb21wbGlhbmNlIHJ1biBzdW1tYXJ5IGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI4NzFcXFwiPjg3MTwvYT58VGhlIHNwZWNpZmllZCBpbXBlcnNvbmF0ZWQgdXNlciBkb2VzIG5vdCBleGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI4NzRcXFwiPjg3NDwvYT58UHJvdmlkZWQgUHJvcGVydHkgRG9tYWluIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGVudGl0eSBmaWx0ZXIufCAgfCB8IDxhIG5hbWU9XFxcIjg3NVxcXCI+ODc1PC9hPnxDYW5ub3QgRGVsZXRlIFN5c3RlbSBSZWZlcmVuY2UgTGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODc2XFxcIj44NzY8L2E+fENsZWFyZG93biBNb2R1bGUgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4NzlcXFwiPjg3OTwvYT58UG9ydGZvbGlvcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBiYXNlIGN1cnJlbmN5fCAgfCB8IDxhIG5hbWU9XFxcIjg4MFxcXCI+ODgwPC9hPnxUaGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbXBsaWFuY2UgZXhwcmVzc2lvbi58ICB8IHwgPGEgbmFtZT1cXFwiODgxXFxcIj44ODE8L2E+fEJsb2NrIG92ZXJwbGFjZWQufCAgfCB8IDxhIG5hbWU9XFxcIjg4MlxcXCI+ODgyPC9hPnxPcmRlciBub3QgYXBwcm92ZWQufCAgfCB8IDxhIG5hbWU9XFxcIjg4M1xcXCI+ODgzPC9hPnxDYW5ub3QgdXBkYXRlIHRoZSBzaGFyZWQgZmllbGRzIG9mIGEgYmxvY2sgd2l0aCBhc3NvY2lhdGVkIG9yZGVycy58ICB8IHwgPGEgbmFtZT1cXFwiODg2XFxcIj44ODY8L2E+fENhbm5vdCBsb2NrIHRoZSBwZXJpb2QufCAgfCB8IDxhIG5hbWU9XFxcIjg4N1xcXCI+ODg3PC9hPnxDYW5ub3QgYXBwbHkgY2xlYXIgZG93biBtb2R1bGUufCAgfCB8IDxhIG5hbWU9XFxcIjg4OFxcXCI+ODg4PC9hPnxDYW5ub3QgdXBzZXJ0IEluc3RydW1lbnQgRXZlbnQgSW5zdHJ1Y3Rpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjg4OVxcXCI+ODg5PC9hPnxDYW5ub3QgcmVhZCBJbnN0cnVtZW50IEV2ZW50IEluc3RydWN0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI4OTVcXFwiPjg5NTwvYT58VGhlIENhcGl0YWwgUmF0aW8gQ2FsY3VsYXRpb24gSXMgV3JvbmcufCAgfCB8IDxhIG5hbWU9XFxcIjkxMFxcXCI+OTEwPC9hPnxDYW5ub3QgdXBkYXRlIGEgYmxvY2sgcmVmZXJlbmNlZCBieSBhIHBsYWNlbWVudC58ICB8IHwgPGEgbmFtZT1cXFwiOTExXFxcIj45MTE8L2E+fEEgRnVuZCB0aGF0IHJlZmVyZW5jZXMgdGhpcyBBYm9yIGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTJcXFwiPjkxMjwvYT58Q2Fubm90IGFkZCBkZWNpc2lvbiB0byBTdGFnZWQgTW9kaWZpY2F0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTNcXFwiPjkxMzwvYT58VGhlIFN0YWdlZCBNb2RpZmljYXRpb24gY291bGQgbm90IGJlIGFwcGxpZWQufCAgfCB8IDxhIG5hbWU9XFxcIjkxNFxcXCI+OTE0PC9hPnxBY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTVcXFwiPjkxNTwvYT58Q2Fubm90IHVwc2VydCBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBpbiBvbmUgcmVxdWVzdC58ICB8IHwgPGEgbmFtZT1cXFwiOTE2XFxcIj45MTY8L2E+fFBsYWNlbWVudCBhbmQgZGlyZWN0IGRlc2NlbmRlbnRzIGhhdmUgbW9yZSBleGVjdXRlZCBxdWFudGl0eSB0aGFuIHRvdGFsIHBsYWNlbWVudCBxdWFudGl0eS58ICB8IHwgPGEgbmFtZT1cXFwiOTE3XFxcIj45MTc8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgd2l0aCB0aGlzIEVudHJ5VHlwZS58ICB8IHwgPGEgbmFtZT1cXFwiOTE4XFxcIj45MTg8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgaW4gdGhpcyBTdGF0ZS58ICB8IHwgPGEgbmFtZT1cXFwiOTE5XFxcIj45MTk8L2E+fFBsYWNlbWVudCBjb3VsZCBub3QgYmUgY2FuY2VsbGVkLnwgIHwgfCA8YSBuYW1lPVxcXCI5MjBcXFwiPjkyMDwvYT58U2hhcmUgQ2xhc3Mgbm90IGNvbmZpZ3VyZWQgaW4gRnVuZHwgIHwgfCA8YSBuYW1lPVxcXCI5MjFcXFwiPjkyMTwvYT58U2hhcmUgQ2xhc3MgU3ViIEhvbGRpbmcgS2V5IG5vdCBjb25maWd1cmVkIGluIFBvcnRmb2xpb3wgIHwgfCA8YSBuYW1lPVxcXCI5MjJcXFwiPjkyMjwvYT58Q291bGQgbm90IHVwZGF0ZSBhbiBvcmRlci58ICB8IHwgPGEgbmFtZT1cXFwiOTIzXFxcIj45MjM8L2E+fE11bHRpcGxlIHNldHMgb2YgU2hhcmUgQ2xhc3MgU3ViIEhvbGRpbmcgS2V5cyBjb25maWd1cmVkIGFjcm9zcyB0aGUgUG9ydGZvbGlvcyBvZiBhIEZ1bmQufCAgfCB8IDxhIG5hbWU9XFxcIjkyNFxcXCI+OTI0PC9hPnxPbmUgb3IgbW9yZSBtYXRyaXggY2VsbHMgY291bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtYXRyaXgufCAgfCB8IDxhIG5hbWU9XFxcIjkyNVxcXCI+OTI1PC9hPnxUaGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIHByb3ZpZGVkIG1hdHJpeCBkZWZpbml0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI5MjZcXFwiPjkyNjwvYT58TWF0cml4IGRlZmluaXRpb24gZG9lcyBub3QgZXhpc3QufCAgfCB8IDxhIG5hbWU9XFxcIjkyN1xcXCI+OTI3PC9hPnxNYXRyaXggZGVmaW5pdGlvbiBjb3VsZCBub3QgYmUgZGVsZXRlZCBiZWNhdXNlIGl0IGRvZXNuXFwndCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiOTI4XFxcIj45Mjg8L2E+fERhdGFUeXBlIHdpdGggSWQgYWxyZWFkeSBleGlzdHMufCAgfCB8IDxhIG5hbWU9XFxcIjkyOVxcXCI+OTI5PC9hPnxTcXVhcmUgbWF0cml4IGlzIGluY29tcGxldGUufCAgfCB8IDxhIG5hbWU9XFxcIjkzMFxcXCI+OTMwPC9hPnxBIGNvbmRpdGlvbmFsIGxpY2Vuc2UgdGVybSBoYXMgYmVlbiBleGNlZWRlZC58ICB8IHwgPGEgbmFtZT1cXFwiOTMxXFxcIj45MzE8L2E+fFRoZSBDdXN0b20gRGF0YSBNb2RlbCByZXF1ZXN0ZWQgaXMgbm90IGludGVuZGVkIGZvciB0aGUgZW50aXR5IHByb3ZpZGVkLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzJcXFwiPjkzMjwvYT58VGhlIGVudGl0eSBwcm92aWRlZCBkb2VzIG5vdCBoYXZlIGEgbWFuZGF0b3J5IHByb3BlcnR5IHNwZWNpZmllZCBieSB0aGUgQ3VzdG9tIERhdGEgTW9kZWwufCAgfCB8IDxhIG5hbWU9XFxcIjkzM1xcXCI+OTMzPC9hPnxUaGUgZW50aXR5IHByb3ZpZGVkIGhhcyBhIHByb3BlcnR5IG5vdCBhbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgQ3VzdG9tIERhdGEgTW9kZWwufCAgfCB8IDxhIG5hbWU9XFxcIjkzNFxcXCI+OTM0PC9hPnxUaGUgZW50aXR5IHByb3ZpZGVkIGRvZXMgbm90IGhhdmUgYSBtYW5kYXRvcnkgaWRlbnRpZmllciBzcGVjaWZpZWQgYnkgdGhlIEN1c3RvbSBEYXRhIE1vZGVsLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzVcXFwiPjkzNTwvYT58VGhlIGVudGl0eSBwcm92aWRlZCBoYXMgYW4gaWRlbnRpZmllciBub3QgYWxsb3dlZCBieSB0aGUgc3BlY2lmaWVkIEN1c3RvbSBEYXRhIE1vZGVsLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzZcXFwiPjkzNjwvYT58VGhlIEN1c3RvbSBEYXRhIE1vZGVsIGluY2x1ZGVkIGFuIGFsaWFzIG9yIHNvcnQtYnkgYXR0cmlidXRlIHRoYXQgd2FzIG5vdCBvbiB0aGUgZGVmaW5pdGlvbi58ICB8IHwgPGEgbmFtZT1cXFwiOTM3XFxcIj45Mzc8L2E+fFRoZSBDbG9zZWRQZXJpb2Qgd2l0aCB0aGUgSWQgYWxyZWFkeSBleGlzdHMgb24gdGhlIFRpbWVsaW5lfCAgfCB8IDxhIG5hbWU9XFxcIjkzOFxcXCI+OTM4PC9hPnxUaGUgbmV3IENsb3NlZCBQZXJpb2Qgd291bGQgY2F1c2UgdGhlIFRpbWVsaW5lIHRvIGhhdmUgbm9uLWNvbnRpZ3VvdXMgQ2xvc2VkIFBlcmlvZHN8ICB8IHwgPGEgbmFtZT1cXFwiOTM5XFxcIj45Mzk8L2E+fEJsb2NrZWQgYnkgYSBOZXR3b3JrIFpvbmV8ICB8IHwgPGEgbmFtZT1cXFwiOTQwXFxcIj45NDA8L2E+fFRoZSBlbnRpdHkgcHJvdmlkZWQgZG9lcyBub3QgbWVldCB0aGUgY29uZGl0aW9ucyBvZiB0aGUgQ3VzdG9tIERhdGEgTW9kZWwufCAgfCB8IDxhIG5hbWU9XFxcIjk0MVxcXCI+OTQxPC9hPnxPcmRlciBub3QgY29tcGxpYW50LnwgIHwgfCA8YSBuYW1lPVxcXCI5NDJcXFwiPjk0MjwvYT58QWN0aW9uIHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyIGRlcGVuZGVuY3kufCAgfCB8IDxhIG5hbWU9XFxcIjk0NFxcXCI+OTQ0PC9hPnxEZXJpdmVkIFByb3BlcnR5IGNhbGN1bGF0aW9uIG5vdCBjb21wbGV0ZS58ICB8IHwgPGEgbmFtZT1cXFwiOTQ1XFxcIj45NDU8L2E+fERlcml2ZWQgUHJvcGVydHkgaXMgbm90IGZpbHRlcmFibGUufCAgfCB8IDxhIG5hbWU9XFxcIjk0NlxcXCI+OTQ2PC9hPnxUaGUgY29uZGl0aW9ucyBwcm92aWRlZCBoYXZlIG9uZSBvciBtb3JlIGVycm9ycy58ICB8IHwgPGEgbmFtZT1cXFwiOTQ3XFxcIj45NDc8L2E+fFRoZSBwcm9wZXJ0eS9pZGVudGlmaWVyIGRvbWFpbiBhbmQgZW50aXR5IGRvbWFpbiBkbyBub3QgbWF0Y2gufCAgfCB8IDxhIG5hbWU9XFxcIjk0OFxcXCI+OTQ4PC9hPnxJbnZhbGlkIFRpbWVsaW5lfCAgfCB8IDxhIG5hbWU9XFxcIjk0OVxcXCI+OTQ5PC9hPnxGaWx0ZXJhYmxlIERlcml2ZWQgUHJvcGVydHkgbGltaXQgcmVhY2hlZC58ICB8IHwgPGEgbmFtZT1cXFwiOTUwXFxcIj45NTA8L2E+fEludmVzdG9yIFJlY29yZCBJZGVudGlmaWVyIEFscmVhZHkgSW4gVXNlfCAgfCB8IDxhIG5hbWU9XFxcIjk1MVxcXCI+OTUxPC9hPnxJbnZlc3RvciBSZWNvcmQgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjk1MlxcXCI+OTUyPC9hPnxJbnZlc3RtZW50IEFjY291bnQgSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI5NTNcXFwiPjk1MzwvYT58SW52ZXN0bWVudCBBY2NvdW50IE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI5NTRcXFwiPjk1NDwvYT58Q291bGQgTm90IFN3ZWVwIEJsb2NrfCAgfCB8IDxhIG5hbWU9XFxcIjk1NVxcXCI+OTU1PC9hPnxFbnRpdHkgVW5pcXVlIElkIGhhcyB0aGUgd3JvbmcgZm9ybWF0fCAgfCB8IDxhIG5hbWU9XFxcIjk1NlxcXCI+OTU2PC9hPnxQb3N0IENsb3NlIEFjdGl2aXR5IGlzIGludmFsaWR8ICB8IHwgPGEgbmFtZT1cXFwiOTU3XFxcIj45NTc8L2E+fFRoZSBDbG9zZWRQZXJpb2Qgd2l0aCB0aGUgSWQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIFRpbWVsaW5lfCAgfCB8IDxhIG5hbWU9XFxcIjk1OFxcXCI+OTU4PC9hPnxJbnZhbGlkIFNldHRsZW1lbnQgSW5zdHJ1Y3Rpb25zfCAgfCB8IDxhIG5hbWU9XFxcIjk1OVxcXCI+OTU5PC9hPnxPcmRlciByZXF1aXJlcyBxdWFudGl0eS58ICB8IHwgPGEgbmFtZT1cXFwiOTYwXFxcIj45NjA8L2E+fEludmFsaWQgRGF0YVBvaW50IFZhbHVlIEFzc2lnbm1lbnR8ICB8IHwgPGEgbmFtZT1cXFwiOTYxXFxcIj45NjE8L2E+fEludmFsaWQgUmVsYXRpb25hbCBEYXRhc2V0IEZpZWxkIERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiOTYyXFxcIj45NjI8L2E+fFJlbGF0aW9uYWwgRGF0YXNldCBEZWZpbml0aW9uIERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjk2M1xcXCI+OTYzPC9hPnxUaW1lbGluZSBCb29rbWFyayBOb3QgSW4gT3BlbiBQZXJpb2R8ICB8IHwgPGEgbmFtZT1cXFwiOTY0XFxcIj45NjQ8L2E+fFRoZSBDdXN0b20gRGF0YSBNb2RlbCBzcGVjaWZpZWQgaWRlbnRpZmllcnMgYnV0IHRoZSBlbnRpdHkgZG9lcyBub3Qgc3VwcG9ydCBpZGVudGlmaWVyc3wgIHwgfCA8YSBuYW1lPVxcXCI5NjVcXFwiPjk2NTwvYT58VGhlIHNvcnQgYnkgcHJvdmlkZWQgaGFzIG9uZSBvciBtb3JlIGVycm9yc3wgIHwgfCA8YSBuYW1lPVxcXCI5NjZcXFwiPjk2NjwvYT58SW52YWxpZCBDdXN0b20gRGF0YSBNb2RlbCBEZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjk2N1xcXCI+OTY3PC9hPnxSdWxlIHNldCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgQ2hlY2sgRGVmaW5pdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI5NjhcXFwiPjk2ODwvYT58VGhlIENsb3NlZCBQZXJpb2QgaXMgaW52YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI5NjlcXFwiPjk2OTwvYT58Q2Fubm90IHVwZGF0ZSBhIHBsYWNlbWVudCB3aXRoIHRoaXMgU3RvcCBQcmljZS58ICB8IHwgPGEgbmFtZT1cXFwiOTcwXFxcIj45NzA8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgd2l0aCB0aGlzIExpbWl0IFByaWNlLnwgIHwgfCA8YSBuYW1lPVxcXCI5NzFcXFwiPjk3MTwvYT58Q2Fubm90IHVwZGF0ZSBhIHBsYWNlbWVudCB3aXRoIHRoZSBjdXJyZW50IFR5cGUufCAgfCB8IDxhIG5hbWU9XFxcIjk3NFxcXCI+OTc0PC9hPnxDYW5ub3QgUGxhY2VCbG9ja3MgYWdhaW5zdCBhbiBcXCdVbnNvbGljaXRlZFxcJyBCbG9jayAoYmxvY2sgY29udGFpbmluZyAwIE9yZGVycykufCAgfCB8IDxhIG5hbWU9XFxcIjk3NVxcXCI+OTc1PC9hPnxObyBQb3J0Zm9saW8gR3JvdXAgU2VsZWN0ZWR8ICB8IHwgPGEgbmFtZT1cXFwiOTc2XFxcIj45NzY8L2E+fEFtYmlndW91cyBTY29wZXwgIHwgXG4gKlxuICogQ29udGFjdDogaW5mb0BmaW5ib3VybmUuY29tXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgbWVtYmVyLW9yZGVyaW5nICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLFxuICAgICAgICAgSHR0cFJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBQYXJhbWV0ZXJDb2RlYywgSHR0cENvbnRleHQgXG4gICAgICAgIH0gICAgICAgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjIH0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2VuY29kZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ3J4anMnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9hY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQWxsb2NhdGlvbkdyb3VwRGVmaW5pdGlvbiB9IGZyb20gJy4uL21vZGVsL2FsbG9jYXRpb25Hcm91cERlZmluaXRpb24nO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQ3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvY3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERlbGV0ZWRFbnRpdHlSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL2RlbGV0ZWRFbnRpdHlSZXNwb25zZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBEaWFyeUVudHJ5IH0gZnJvbSAnLi4vbW9kZWwvZGlhcnlFbnRyeSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBGZWUgfSBmcm9tICcuLi9tb2RlbC9mZWUnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRmVlUHJvcGVydGllcyB9IGZyb20gJy4uL21vZGVsL2ZlZVByb3BlcnRpZXMnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRmVlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL2ZlZVJlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRnVuZCB9IGZyb20gJy4uL21vZGVsL2Z1bmQnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRnVuZENhbGVuZGFyRW50cnkgfSBmcm9tICcuLi9tb2RlbC9mdW5kQ2FsZW5kYXJFbnRyeSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBGdW5kRGVmaW5pdGlvblJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC9mdW5kRGVmaW5pdGlvblJlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRnVuZFByb3BlcnRpZXMgfSBmcm9tICcuLi9tb2RlbC9mdW5kUHJvcGVydGllcyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBGdW5kUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL2Z1bmRSZXF1ZXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEZ1bmRWYWx1YXRpb25SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvZnVuZFZhbHVhdGlvblJlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgTGlzdEFnZ3JlZ2F0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9saXN0QWdncmVnYXRpb25SZXNwb25zZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBMdXNpZFByb2JsZW1EZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvbHVzaWRQcm9ibGVtRGV0YWlscyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBMdXNpZFZhbGlkYXRpb25Qcm9ibGVtRGV0YWlscyB9IGZyb20gJy4uL21vZGVsL2x1c2lkVmFsaWRhdGlvblByb2JsZW1EZXRhaWxzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IE5hdkFjdGl2aXR5QWRqdXN0bWVudCB9IGZyb20gJy4uL21vZGVsL25hdkFjdGl2aXR5QWRqdXN0bWVudCc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBOYXZBY3Rpdml0eUFkanVzdG1lbnRSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL25hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IE9wZXJhdGlvbiB9IGZyb20gJy4uL21vZGVsL29wZXJhdGlvbic7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBQYWdlZFJlc291cmNlTGlzdE9mRmVlIH0gZnJvbSAnLi4vbW9kZWwvcGFnZWRSZXNvdXJjZUxpc3RPZkZlZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBQYWdlZFJlc291cmNlTGlzdE9mRnVuZCB9IGZyb20gJy4uL21vZGVsL3BhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kQ2FsZW5kYXJFbnRyaWVzIH0gZnJvbSAnLi4vbW9kZWwvcGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmRDYWxlbmRhckVudHJpZXMnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmRDYWxlbmRhckVudHJ5IH0gZnJvbSAnLi4vbW9kZWwvcGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmRDYWxlbmRhckVudHJ5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFBhZ2VkUmVzb3VyY2VMaXN0T2ZWYWx1YXRpb25Qb2ludEluc3RydW1lbnQgfSBmcm9tICcuLi9tb2RlbC9wYWdlZFJlc291cmNlTGlzdE9mVmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFBhZ2VkUmVzb3VyY2VMaXN0T2ZWYWx1YXRpb25Qb2ludE92ZXJ2aWV3IH0gZnJvbSAnLi4vbW9kZWwvcGFnZWRSZXNvdXJjZUxpc3RPZlZhbHVhdGlvblBvaW50T3ZlcnZpZXcnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUHJvcGVydHkgfSBmcm9tICcuLi9tb2RlbC9wcm9wZXJ0eSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBRdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyB9IGZyb20gJy4uL21vZGVsL3F1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFJlc291cmNlTGlzdE9mTmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9yZXNvdXJjZUxpc3RPZk5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFJldmVydFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC9yZXZlcnRWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFNlcmllc0RlZmluaXRpb25SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvc2VyaWVzRGVmaW5pdGlvblJlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgU2V0U2hhcmVDbGFzc0luc3RydW1lbnRzUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL3NldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgU2luZ2xlVmFsdWF0aW9uUG9pbnRRdWVyeVBhcmFtZXRlcnMgfSBmcm9tICcuLi9tb2RlbC9zaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBVcGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC91cGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVXBzZXJ0RnVuZEJvb2ttYXJrUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL3Vwc2VydEZ1bmRCb29rbWFya1JlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVXBzZXJ0VmFsdWF0aW9uUG9pbnRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvdXBzZXJ0VmFsdWF0aW9uUG9pbnRSZXF1ZXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50IH0gZnJvbSAnLi4vbW9kZWwvdmFsdWF0aW9uUG9pbnQnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vbW9kZWwvdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC92YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50RGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWwvdmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZENvbXBsZXhNYXJrZXREYXRhIH0gZnJvbSAnLi4vbW9kZWwvdmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZENvbXBsZXhNYXJrZXREYXRhJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRRdW90ZSB9IGZyb20gJy4uL21vZGVsL3ZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRRdW90ZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9tb2RlbC92YWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkVHJhbnNhY3Rpb24nO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeSB9IGZyb20gJy4uL21vZGVsL3ZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kQ2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3knO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRDYXNoU3RhdGVtZW50Um93IH0gZnJvbSAnLi4vbW9kZWwvdmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRDYXNoU3RhdGVtZW50Um93Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kSm91cm5hbEVudHJ5TGluZSB9IGZyb20gJy4uL21vZGVsL3ZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kSm91cm5hbEVudHJ5TGluZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mUG5sSm91cm5hbEVudHJ5TGluZSB9IGZyb20gJy4uL21vZGVsL3ZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZQbmxKb3VybmFsRW50cnlMaW5lJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZUcmlhbEJhbGFuY2UgfSBmcm9tICcuLi9tb2RlbC92YWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mVHJpYWxCYWxhbmNlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZVbnNldHRsZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL21vZGVsL3ZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZVbnNldHRsZWRUcmFuc2FjdGlvbic7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZkZ1bmRBMkJEYXRhUmVjb3JkIH0gZnJvbSAnLi4vbW9kZWwvdmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZGdW5kQTJCRGF0YVJlY29yZCc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZkZ1bmRBMkJNb3ZlbWVudFJlY29yZCB9IGZyb20gJy4uL21vZGVsL3ZlcnNpb25lZFJlc291cmNlTGlzdE9mRnVuZEEyQk1vdmVtZW50UmVjb3JkJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZlcnNpb25lZFJlc291cmNlTGlzdE9mSG9sZGluZ0NvbnRyaWJ1dG9yIH0gZnJvbSAnLi4vbW9kZWwvdmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZIb2xkaW5nQ29udHJpYnV0b3InO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZQb3J0Zm9saW9Ib2xkaW5nIH0gZnJvbSAnLi4vbW9kZWwvdmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZQb3J0Zm9saW9Ib2xkaW5nJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5cblxuZXhwb3J0IGludGVyZmFjZSBBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIHZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3Qgd2hpY2ggY29udGFpbnMgdGhlIERpYXJ5IEVudHJ5IGNvZGUgZm9yIHRoZSBFc3RpbWF0ZSBWYWx1YXRpb24gUG9pbnQgdG8gbW92ZSB0byBDYW5kaWRhdGUgb3IgRmluYWwgc3RhdGUuICovXG4gICAgdmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdDogVmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdDtcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgYWNjZXB0cyB0aGUgVmFsdWF0aW9uIFBvaW50IG9mIHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQWxsb2NhdGlvbkdyb3Vwc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBkZWZpbml0aW9ucyBvZiB0aGUgQWxsb2NhdGlvbiBHcm91cHMgdG8gYWRkIHRvIHRoZSBGdW5kLiAqL1xuICAgIGFsbG9jYXRpb25Hcm91cERlZmluaXRpb246IEFycmF5PEFsbG9jYXRpb25Hcm91cERlZmluaXRpb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkZFNlcmllc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBkZWZpbml0aW9ucyBvZiB0aGUgU2VyaWVzIHRvIGFkZC4gKi9cbiAgICBzZXJpZXNEZWZpbml0aW9uUmVxdWVzdDogQXJyYXk8U2VyaWVzRGVmaW5pdGlvblJlcXVlc3Q+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUZlZVJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBGZWUgdG8gY3JlYXRlLiAqL1xuICAgIGZlZVJlcXVlc3Q6IEZlZVJlcXVlc3Q7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIGNyZWF0ZXMgdGhlIEZlZSBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRnVuZFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGRlZmluaXRpb24gb2YgdGhlIEZ1bmQuICovXG4gICAgZnVuZFJlcXVlc3Q6IEZ1bmRSZXF1ZXN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUZ1bmRWMlJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGRlZmluaXRpb24gb2YgdGhlIEZ1bmQuICovXG4gICAgZnVuZERlZmluaXRpb25SZXF1ZXN0OiBGdW5kRGVmaW5pdGlvblJlcXVlc3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgVmFsdWF0aW9uIFBvaW50IEVzdGltYXRlIGRlZmluaXRpb24gdG8gY3JlYXRlLiAqL1xuICAgIGNyZWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdDogQ3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0O1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBjcmVhdGVzIHRoZSBWYWx1YXRpb24gUG9pbnQgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlYWN0aXZhdGVOYXZUeXBlc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlcyBvZiB0aGUgbmF2IHR5cGVzIHRvIGJlIGRlYWN0aXZhdGVkLiAqL1xuICAgIHJlcXVlc3RCb2R5OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKiBUaGUgZGVsZXRlIG1vZGUgdG8gdXNlLiBEZWZhdWx0IHZhbHVlOiBTb2Z0LiBBdmFpbGFibGUgdmFsdWVzOiBTb2Z0LCBIYXJkLiAqL1xuICAgIGRlbGV0ZU1vZGU/OiAnU29mdCcgfCAnSGFyZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlQm9va21hcmtSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYm9va21hcmsgY29kZSBmb3IgdGhlIGJvb2ttYXJrIHRvIGJlIGRlbGV0ZWQuICovXG4gICAgYm9va21hcmtDb2RlOiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIGRlbGV0ZXMgdGhlIEJvb2ttYXJrIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWxldGVGZWVSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRmVlIHRvIGJlIGRlbGV0ZWQuICovXG4gICAgZmVlQ29kZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZUZ1bmRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kIHRvIGJlIGRlbGV0ZWQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQgdG8gYmUgZGVsZXRlZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWxldGVOYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgaXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZ2l2ZW4gRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2YWx1YXRpb24gcG9pbnQgQ29kZSB0byBkZWxldGUgdGhlIGFkanVzdG1lbnQgZnJvbSAqL1xuICAgIHZhbHVhdGlvblBvaW50Q29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgcmVxdWVzdCBkZXNjcmliaW5nIHRoZSBOYXYgYWN0aXZpdHkgYWRqdXN0bWVudHMgdG8gZGVsZXRlIGZyb20gYSBzcGVjaWZpYyB2YWx1YXRpb24gcG9pbnQgYW5kIG5hdiB0eXBlICovXG4gICAgbmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2U6IEFycmF5PE5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlPjtcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgcnVucyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2YXJpYW50IG9mIHRoZSB2YWx1YXRpb24gcG9pbnQgdXNlZCBpbiB0aGUgcmVxdWVzdC4gVG9nZXRoZXIgd2l0aCB0aGUgdmFsdWF0aW9uIHBvaW50IGNvZGUgbWFya3MgdGhlIHVuaXF1ZSBicmFuY2ggZm9yIHRoZSBOYXZUeXBlLiAqL1xuICAgIHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgZGlhcnkgZW50cnkgY29kZSBmb3IgdGhlIHZhbHVhdGlvbiBQb2ludCB0byBiZSBkZWxldGVkLiAqL1xuICAgIGRpYXJ5RW50cnlDb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2YXJpYW50IG9mIHRoZSB2YWx1YXRpb24gcG9pbnQgdXNlZCBpbiB0aGUgcmVxdWVzdC4gVG9nZXRoZXIgd2l0aCB0aGUgdmFsdWF0aW9uIHBvaW50IGNvZGUgbWFya3MgdGhlIHVuaXF1ZSBicmFuY2ggZm9yIHRoZSBOYXZUeXBlLiBUaGlzIGlzIHdvcmtpbmcgb25seSBmb3IgdGhlIEVzdGltYXRlcy4gKi9cbiAgICBkaWFyeUVudHJ5Q29kZVZhcmlhbnQ/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIGRlbGV0ZXMgdGhlIFZhbHVhdGlvbiBQb2ludCBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpc2VDYW5kaWRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBkZXRhaWxzIG9mIHRoZSBWYWx1YXRpb24gUG9pbnQgdG8gbWFyayBhcyBmaW5hbC4gKi9cbiAgICB2YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0OiBWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0O1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBmaW5hbGlzZXMgdGhlIFZhbHVhdGlvbiBQb2ludCBvZiB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEEyQkRhdGFGb3JGdW5kUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGFyZ3VtZW50cyB0byB1c2UgZm9yIHF1ZXJ5aW5nIHRoZSBBMkIgZGF0YS4gVGhpcyBpbmNsdWRlcyBzdGFydCBhbmQgZW5kIGRhdGVzLiAqL1xuICAgIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVyczogVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmVzb2x2ZSB0aGUgZnVuZCBhbmQgdGhlIHRpbWVsaW5lLiBEZWZhdWx0cyAgICAgICAgICAgICAgdG8gcmV0dXJuIHRoZSBsYXRlc3QgdmVyc2lvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHQgc2V0LiBSZWFkIG1vcmUgYWJvdXQgZmlsdGVyaW5nIHJlc3VsdHMgZnJvbSBMVVNJRCBoZXJlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZmlsdGVyaW5nLXJlc3VsdHMtZnJvbS1sdXNpZC4gKi9cbiAgICBmaWx0ZXI/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIFxcJnF1b3Q7SW5zdHJ1bWVudFxcJnF1b3Q7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvICAgICAgICAgICAgICB0aGUgQTJCIGRhdGEuIFRoZXNlIHRha2UgdGhlIGZvcm1hdCB7ZG9tYWlufS97c2NvcGV9L3tjb2RlfSBlLmcuIFxcJnF1b3Q7SW5zdHJ1bWVudC9zeXN0ZW0vTmFtZVxcJnF1b3Q7LiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QTJCTW92ZW1lbnRzRm9yRnVuZFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhcmd1bWVudHMgdG8gdXNlIGZvciBxdWVyeWluZyB0aGUgQTJCIG1vdmVtZW50cy4gVGhpcyBpbmNsdWRlcyBzdGFydCBhbmQgZW5kIGRhdGVzLiAqL1xuICAgIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVyczogVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmVzb2x2ZSB0aGUgZnVuZCBhbmQgdGhlIHRpbWVsaW5lLiBEZWZhdWx0cyAgICAgICAgICAgICAgdG8gcmV0dXJuIHRoZSBsYXRlc3QgdmVyc2lvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHQgc2V0LiBSZWFkIG1vcmUgYWJvdXQgZmlsdGVyaW5nIHJlc3VsdHMgZnJvbSBMVVNJRCBoZXJlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZmlsdGVyaW5nLXJlc3VsdHMtZnJvbS1sdXNpZC4gKi9cbiAgICBmaWx0ZXI/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIFxcJnF1b3Q7SW5zdHJ1bWVudFxcJnF1b3Q7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvICAgICAgICAgICAgICB0aGUgQTJCIG1vdmVtZW50cy4gVGhlc2UgdGFrZSB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9IGUuZy4gXFwmcXVvdDtJbnN0cnVtZW50L3N5c3RlbS9OYW1lXFwmcXVvdDsuICovXG4gICAgcHJvcGVydHlLZXlzPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRGZWVSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRmVlLiAqL1xuICAgIGZlZUNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGVmZmVjdGl2ZSBkYXRldGltZSBvciBjdXQgbGFiZWwgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIEZlZSBwcm9wZXJ0aWVzLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBMVVNJRCBzeXN0ZW0gZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBlZmZlY3RpdmVBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIEZlZS4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgRmVlIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0ZlZVxcJiMzOTsgZG9tYWluIHRvIGRlY29yYXRlIG9udG8gdGhlIEZlZS4gICAgICAgICAgICAgIFRoZXNlIG11c3QgdGFrZSB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9LCBmb3IgZXhhbXBsZSBcXCYjMzk7RmVlL0FjY291bnQvSWRcXCYjMzk7LiBJZiBubyBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQsIHRoZW4gbm8gcHJvcGVydGllcyB3aWxsIGJlIHJldHVybmVkLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RmVlUHJvcGVydGllc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGZWUgdG8gZ2V0IHRoZSBwcm9wZXJ0aWVzIGZvci4gKi9cbiAgICBmZWVDb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBlZmZlY3RpdmUgZGF0ZXRpbWUgb3IgY3V0IGxhYmVsIGF0IHdoaWNoIHRvIGxpc3QgdGhlIEZlZVxcJiMzOTtzIHByb3BlcnRpZXMuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IExVU0lEIHN5c3RlbSBkYXRldGltZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGVmZmVjdGl2ZUF0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBsaXN0IHRoZSBGZWVcXCYjMzk7cyBwcm9wZXJ0aWVzLiBEZWZhdWx0cyB0byByZXR1cm4gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggcHJvcGVydHkgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEZ1bmRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGV0aW1lIG9yIGN1dCBsYWJlbCBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgRnVuZCBwcm9wZXJ0aWVzLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBMVVNJRCBzeXN0ZW0gZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBlZmZlY3RpdmVBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIEZ1bmQgZGVmaW5pdGlvbi4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgRnVuZCBkZWZpbml0aW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0Z1bmRcXCYjMzk7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvIHRoZSBGdW5kLiAgICAgICAgICAgICAgVGhlc2UgbXVzdCB0YWtlIHRoZSBmb3JtYXQge2RvbWFpbn0ve3Njb3BlfS97Y29kZX0sIGZvciBleGFtcGxlIFxcJiMzOTtGdW5kL01hbmFnZXIvSWRcXCYjMzk7LiBJZiBubyBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQsIHRoZW4gbm8gcHJvcGVydGllcyB3aWxsIGJlIHJldHVybmVkLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RnVuZFByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kIHRvIGxpc3QgdGhlIHByb3BlcnRpZXMgZm9yLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kIHRvIGxpc3QgdGhlIHByb3BlcnRpZXMgZm9yLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGV0aW1lIG9yIGN1dCBsYWJlbCBhdCB3aGljaCB0byBsaXN0IHRoZSBGdW5kXFwmIzM5O3MgcHJvcGVydGllcy4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgTFVTSUQgc3lzdGVtIGRhdGV0aW1lIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgZWZmZWN0aXZlQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIGxpc3QgdGhlIEZ1bmRcXCYjMzk7cyBwcm9wZXJ0aWVzLiBEZWZhdWx0cyB0byByZXR1cm4gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggcHJvcGVydHkgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIHVuaXF1ZSBob2xkaW5nIGlkZW50aWZpZXIgKi9cbiAgICBob2xkaW5nSWQ6IG51bWJlcjtcbiAgICAvKiogVGhlIGFyZ3VtZW50cyB0byB1c2UgZm9yIHF1ZXJ5aW5nIHRoZSBob2xkaW5ncy5UaGlzIGNhbiBiZSBhIGRhdGUsIHZhbHVhdGlvblBvaW50IG9yIGEgYm9va21hcmsuICovXG4gICAgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzOiBWYWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBJZiB0cnVlLCB0cmFuc2FjdGlvbnMgZnJvbSBwcmV2aW91c2x5IGNsb3NlZCBob2xkaW5ncyBhcmUgcmV0dXJuZWQuICAgICAgICAgICAgICBJZiBmYWxzZSwgb25seSB0cmFuc2FjdGlvbnMgZnJvbSBsYXN0IHRpbWUgcG9zaXRpb24gaXMgb3BlbmVkLiAqL1xuICAgIGluY2x1ZGVIaXN0b3JpYz86IGJvb2xlYW47XG4gICAgLyoqIENvbnN0cmFpbnMgdGhlIEhvbGRpbmcgQ29udHJpYnV0b3JzIHRvIHRob3NlIHdoaWNoIGNvbnRyaWJ1dGVkIHRvIHRoZSBzcGVjaWZpZWQgdGF4IGxvdC4gKi9cbiAgICB0YXhMb3RJZD86IHN0cmluZztcbiAgICAvKiogSWYgdHJ1ZSwgY29udHJpYnV0aW5nIHRyYW5zYWN0aW9uIHdoaWNoIGhhdmUgbm90IHNldHRsZWQgeWV0IHdpbGwgYWxzbyBiZSByZXR1cm5lZC4gRmFsc2UgYnkgZGVmYXVsdCAqL1xuICAgIGluY2x1ZGVVbnNldHRsZWRNb3ZlbWVudHM/OiBib29sZWFuO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBidWlsZCB0aGUgdHJhbnNhY3Rpb25zLiBEZWZhdWx0cyB0byByZXR1cm4gdGhlIGxhdGVzdCAgICAgICAgICAgICAgdmVyc2lvbiBvZiBlYWNoIHRyYW5zYWN0aW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgdHJhbnNhY3Rpb25zIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIEdldEhvbGRpbmdDb250cmlidXRvcnMuICovXG4gICAgcGFnZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRIb2xkaW5nc0ZvckZ1bmRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXJndW1lbnRzIHRvIHVzZSBmb3IgcXVlcnlpbmcgdGhlIGhvbGRpbmdzLiAqL1xuICAgIHNpbmdsZVZhbHVhdGlvblBvaW50UXVlcnlQYXJhbWV0ZXJzOiBTaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycztcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgcnVucyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBob2xkaW5ncyBvZiB0cmFuc2FjdGlvbiBwb3J0Zm9saW9zIGluIHRoZSBGdW5kLiBEZWZhdWx0cyAgICAgICAgICAgICAgdG8gcmV0dXJuIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgaG9sZGluZ3MgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBFeHByZXNzaW9uIHRvIGZpbHRlciB0aGUgcmVzdWx0IHNldC4gUmVhZCBtb3JlIGFib3V0IGZpbHRlcmluZyByZXN1bHRzIGZyb20gTFVTSUQgaGVyZSBodHRwczovL3N1cHBvcnQubHVzaWQuY29tL2ZpbHRlcmluZy1yZXN1bHRzLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBBIGxpc3Qgb2YgcHJvcGVydHkga2V5cyBmcm9tIHRoZSBcXCZxdW90O0luc3RydW1lbnRcXCZxdW90OywgXFwmcXVvdDtIb2xkaW5nXFwmcXVvdDsgb3IgXFwmcXVvdDtQb3J0Zm9saW9cXCZxdW90OyxcXCZxdW90O0N1c3RvZGlhbkFjY291bnRcXCZxdW90OyBvciBcXCZxdW90O0xlZ2FsRW50aXR5XFwmcXVvdDsgZG9tYWluIHRvIGRlY29yYXRlIG9udG8gZG9tYWluIHRvIGRlY29yYXRlIG9udG8gICAgICAgICAgICAgIHRoZSBob2xkaW5ncy4gVGhlc2UgdGFrZSB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9IGUuZy4gXFwmcXVvdDtJbnN0cnVtZW50L3N5c3RlbS9OYW1lXFwmcXVvdDsgb3IgXFwmcXVvdDtIb2xkaW5nL3N5c3RlbS9Db3N0XFwmcXVvdDsuICovXG4gICAgcHJvcGVydHlLZXlzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogV2hldGhlciB0byBleHBhbmQgdGhlIGhvbGRpbmdzIHRvIHJldHVybiB0aGUgdW5kZXJseWluZyB0YXgtbG90cy4gRGVmYXVsdHMgdG8gRmFsc2UuICovXG4gICAgYnlUYXhsb3RzPzogYm9vbGVhbjtcbiAgICAvKiogTnVtYmVyIG9mIGRheXMgYWhlYWQgdG8gYnJpbmcgYmFjayBzZXR0bGVtZW50cyBmcm9tLCBpbiByZWxhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGVmZmVjdGl2ZUF0LiAqL1xuICAgIGluY2x1ZGVTZXR0bGVtZW50RXZlbnRzQWZ0ZXJEYXlzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFZhbHVhdGlvbkZvckZ1bmRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIHJlcXVlc3Qgc3BlY2lmeWluZyB0aGUgZGF0ZXMgKG9yIERpYXJ5RW50cnkpIG9uIHdoaWNoIHRvIGNhbGN1bGF0ZSBhIHNldCBvZiB2YWx1YXRpb24gbWV0cmljcy4gKi9cbiAgICBmdW5kVmFsdWF0aW9uUmVxdWVzdD86IEZ1bmRWYWx1YXRpb25SZXF1ZXN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhcmd1bWVudHMgdG8gdXNlIGZvciBxdWVyeWluZyB0aGUgVmFsdWF0aW9uIFBvaW50IGRhdGEuICovXG4gICAgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzOiBWYWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBGdW5kIGRlZmluaXRpb24uIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIEZ1bmQgZGVmaW5pdGlvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXJndW1lbnRzIHRvIHVzZSBmb3IgcXVlcnlpbmcgdGhlIEpvdXJuYWwgRW50cnkgTGluZXMuICovXG4gICAgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzOiBWYWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgLyoqIFRoZSBvcHRpb25hbCBjb2RlIG9mIGEgR2VuZXJhbCBMZWRnZXIgUHJvZmlsZSB1c2VkIHRvIGRlY29yYXRlIEpvdXJuYWwgRW50cnkgTGluZXMgd2l0aCBsZXZlbHMuICovXG4gICAgZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSBKb3VybmFsIEVudHJ5IExpbmVzLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdCBzZXQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyBKb3VybmFsIEVudHJ5IExpbmVzIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIEdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXMuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0luc3RydW1lbnRcXCYjMzk7LCBcXCYjMzk7VHJhbnNhY3Rpb25cXCYjMzk7LCBcXCYjMzk7UG9ydGZvbGlvXFwmIzM5OywgXFwmIzM5O0FjY291bnRcXCYjMzk7LCBcXCYjMzk7TGVnYWxFbnRpdHlcXCYjMzk7IG9yIFxcJiMzOTtDdXN0b2RpYW5BY2NvdW50XFwmIzM5OyAgICAgICAgICAgICAgIGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvIHRoZSBKb3VybmFsIEVudHJ5IExpbmVzLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBlYWNoIGxpbmVcXCYjMzk7cyBidWNrZXRNZW1iZXJzaGlwcyByZXBvcnQgb25seSB0aGlzIGJ1Y2tldCBzZXRcXCYjMzk7cyBjbGFzc2lmaWNhdGlvbiBvZiBpdC4gICAgICAgICAgICAgICBPdGhlcndpc2UsIGV2ZXJ5IGJ1Y2tldCBzZXQgY292ZXJpbmcgdGhlIE5BViBUeXBlIGlzIHJlcG9ydGVkLiAqL1xuICAgIGJ1Y2tldFNldENvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5UmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGFyZ3VtZW50cyB0byB1c2UgZm9yIGdlbmVyYXRpbmcgdGhlIFBuTCBzdW1tYXJ5LiAqL1xuICAgIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVyczogVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgY29kZSBvZiBhIEdlbmVyYWwgTGVkZ2VyIFByb2ZpbGUgdXNlZCB0byBkZWNvcmF0ZSBKb3VybmFsIEVudHJ5IExpbmVzIHdpdGggbGV2ZWxzLiAqL1xuICAgIGdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgUG5MIHN1bW1hcnkuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gICAgICAgICAgICAgIG9mIGVhY2ggdHJhbnNhY3Rpb24gaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBcXCZxdW90O0V4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHQgc2V0LlxcJnF1b3Q7ICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyByZXN1bHRzIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIEdldFZhbHVhdGlvblBvaW50UG5sU3VtbWFyeS4gKi9cbiAgICBwYWdlPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRWYWx1YXRpb25Qb2ludFF1b3Rlc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhcmd1bWVudHMgdG8gdXNlIGZvciBxdWVyeWluZyB0aGUgcXVvdGVzLiAqL1xuICAgIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVyczogVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSBxdW90ZXMuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gICAgICAgICAgICAgIG9mIGVhY2ggcXVvdGUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyBxdW90ZXMgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gR2V0VmFsdWF0aW9uUG9pbnRRdW90ZXMuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgcnVucyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXJndW1lbnRzIHRvIHVzZSBmb3IgcXVlcnlpbmcgdGhlIHRyYW5zYWN0aW9ucy4gKi9cbiAgICB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM6IFZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdHJhbnNhY3Rpb25zLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uICAgICAgICAgICAgICBvZiBlYWNoIHRyYW5zYWN0aW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdCBzZXQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyB0cmFuc2FjdGlvbnMgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gR2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnMuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0luc3RydW1lbnRcXCYjMzk7LCBcXCYjMzk7VHJhbnNhY3Rpb25cXCYjMzk7LCBcXCYjMzk7UG9ydGZvbGlvXFwmIzM5OywgXFwmIzM5O0FjY291bnRcXCYjMzk7LCBcXCYjMzk7TGVnYWxFbnRpdHlcXCYjMzk7IG9yIFxcJiMzOTtDdXN0b2RpYW5BY2NvdW50XFwmIzM5OyAgICAgICAgICAgICAgZG9tYWluIHRvIGRlY29yYXRlIG9udG8gdGhlIHRyYW5zYWN0aW9ucy4gKi9cbiAgICBwcm9wZXJ0eUtleXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIG9wdGlvbmFsIHNjb3BlIG9mIGEgQ3VzdG9tIERhdGEgTW9kZWwgdG8gdXNlICovXG4gICAgZGF0YU1vZGVsU2NvcGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBvcHRpb25hbCBjb2RlIG9mIGEgQ3VzdG9tIERhdGEgTW9kZWwgdG8gdXNlICovXG4gICAgZGF0YU1vZGVsQ29kZT86IHN0cmluZztcbiAgICAvKiogT3B0aW9uIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBjYW5jZWxsZWQgdHJhbnNhY3Rpb25zLCAgICAgICAgICAgICAgaW5jbHVkaW5nIHByZXZpb3VzIHZlcnNpb25zIG9mIHRyYW5zYWN0aW9ucyB3aGljaCBoYXZlIHNpbmNlIGJlZW4gYW1lbmRlZC4gICAgICAgICAgICAgIERlZmF1bHRzIHRvIEZhbHNlIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgc2hvd0NhbmNlbGxlZFRyYW5zYWN0aW9ucz86IGJvb2xlYW47XG4gICAgLyoqIFRoZSBtZW1iZXJzaGlwIHR5cGVzIG9mIHRoZSBzcGVjaWZpZWQgQ3VzdG9tIERhdGEgTW9kZWwgdG8gcmV0dXJuLiBEZWZhdWx0IHZhbHVlOiBNZW1iZXIuIEF2YWlsYWJsZSB2YWx1ZXM6IEFsbCwgTWVtYmVyLCBDYW5kaWRhdGUuICovXG4gICAgbWVtYmVyc2hpcFR5cGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2VSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXJndW1lbnRzIHRvIHVzZSBmb3IgZ2VuZXJhdGluZyB0aGUgVHJpYWwgQmFsYW5jZS4gKi9cbiAgICB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM6IFZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAvKiogVGhlIG9wdGlvbmFsIGNvZGUgb2YgYSBHZW5lcmFsIExlZGdlciBQcm9maWxlIHVzZWQgdG8gZGVjb3JhdGUgSm91cm5hbCBFbnRyeSBMaW5lcyB3aXRoIGxldmVscy4gKi9cbiAgICBnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBUcmlhbCBCYWxhbmNlLiAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBFeHByZXNzaW9uIHRvIGZpbHRlciB0aGUgcmVzdWx0cyBieS4gICAgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmaWx0ZXJpbmcgcmVzdWx0cywgc2VlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZG9jcy9maWx0ZXJpbmctaW5mb3JtYXRpb24tcmV0cmlldmVkLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG51bWJlci4gICAgICAgICAgICAgICBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgVHJpYWwgQmFsYW5jZXMuICAgICAgICAgICAgICAgVGhpcyB0b2tlbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBwcmV2aW91cyBjYWxsLiAgICAgICAgICAgICAgIElmIGEgcGFnaW5hdGlvbiB0b2tlbiBpcyBwcm92aWRlZCwgdGhlIGZpbHRlciwgZWZmZWN0aXZlQXQgYW5kIGFzQXQgZmllbGRzICAgICAgICAgICAgICAgbXVzdCBub3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvcmlnaW5hbCByZXF1ZXN0LiAqL1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIFxcJiMzOTtJbnN0cnVtZW50XFwmIzM5OywgXFwmIzM5O1RyYW5zYWN0aW9uXFwmIzM5OywgXFwmIzM5O1BvcnRmb2xpb1xcJiMzOTssIFxcJiMzOTtBY2NvdW50XFwmIzM5OywgXFwmIzM5O0xlZ2FsRW50aXR5XFwmIzM5OyBvciBcXCYjMzk7Q3VzdG9kaWFuQWNjb3VudFxcJiMzOTsgICAgICAgICAgICAgICBkb21haW4gdG8gZGVjb3JhdGUgb250byB0aGUgVHJpYWxCYWxhbmNlLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCBubyBDbGVhcmRvd24gTW9kdWxlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgVHJpYWwgQmFsYW5jZS4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gICAgZXhjbHVkZUNsZWFyZG93bk1vZHVsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmFsdWF0aW9uUG9pbnRVbnNldHRsZWRUcmFuc2FjdGlvbnNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgcmVwb3J0LiBEZWZhdWx0cyB0byBsYXRlc3QuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogV2hlbiBwYWdpbmF0aW5nLCBsaW1pdCB0aGUgbnVtYmVyIG9mIHJldHVybmVkIHJlc3VsdHMgdG8gdGhpcyBtYW55LiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgZnJvbSBhIHByZXZpb3VzIGNhbGwuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0luc3RydW1lbnRcXCYjMzk7LCBcXCYjMzk7VHJhbnNhY3Rpb25cXCYjMzk7LCBcXCYjMzk7UG9ydGZvbGlvXFwmIzM5Oywgb3IgXFwmIzM5O0FjY291bnRcXCYjMzk7ICAgICAgICAgICAgICBkb21haW4gdG8gZGVjb3JhdGUgb250byB0aGUgdHJhbnNhY3Rpb25zLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgZGF0ZSBvZiB0aGUgVmFsdWF0aW9uIFBvaW50IHRvIHJlcG9ydCBhZ2FpbnN0LCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBzdXBwbHlpbmcgICAgICAgICAgICAgIGl0IGluIHRoZSByZXF1ZXN0IGJvZHkuIE11c3Qgbm90IGJlIHN1cHBsaWVkIHRvZ2V0aGVyIHdpdGggZGlhcnlFbnRyeS4gKi9cbiAgICBkYXRlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgZGlhcnkgZW50cnkgY29kZSBvZiB0aGUgVmFsdWF0aW9uIFBvaW50IHRvIHJlcG9ydCBhZ2FpbnN0LCBhcyBhbiAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgdG8gc3VwcGx5aW5nIGl0IGluIHRoZSByZXF1ZXN0IGJvZHkuIE11c3Qgbm90IGJlIHN1cHBsaWVkIHRvZ2V0aGVyIHdpdGggZGF0ZS4gKi9cbiAgICBkaWFyeUVudHJ5Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgdmFyaWFudCBjb2RlIG9mIHRoZSBWYWx1YXRpb24gUG9pbnQgdG8gcmVwb3J0IGFnYWluc3QsIGFzIGFuIGFsdGVybmF0aXZlIHRvICAgICAgICAgICAgICBzdXBwbHlpbmcgaXQgaW4gdGhlIHJlcXVlc3QgYm9keS4gT25seSByZXF1aXJlZCB3aGVuIGl0IGlzIG5lY2Vzc2FyeSB0byBjaG9vc2UgYmV0d2VlbiBzY2VuYXJpb3Mgd2l0aCBtdWx0aXBsZSAgICAgICAgICAgICAgZXN0aW1hdGVzLiAqL1xuICAgIHZhcmlhbnQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gdXNlIGZvciBxdWVyeWluZyB0aGUgdW5zZXR0bGVkIHRyYW5zYWN0aW9ucy4gQ2FuIGJlICAgICAgICAgICAgICBvbWl0dGVkIHdoZW4gdGhlIFZhbHVhdGlvbiBQb2ludCBpcyBpZGVudGlmaWVkIGJ5IHRoZSBkYXRlIG9yIGRpYXJ5RW50cnkgcXVlcnkgcGFyYW1ldGVycy4gKi9cbiAgICB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM/OiBWYWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEZlZXNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGV0aW1lIG9yIGN1dCBsYWJlbCBhdCB3aGljaCB0byBsaXN0IHRoZSBUaW1lVmFyaWFudCBwcm9wZXJ0aWVzIGZvciB0aGUgRmVlcy4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgTFVTSUQgICAgICAgICAgICAgIHN5c3RlbSBkYXRldGltZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGVmZmVjdGl2ZUF0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBsaXN0IHRoZSBGZWVzLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggRmVlIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgZmVlczsgdGhpcyAgICAgICAgICAgICAgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcHJldmlvdXMgY2FsbC4gSWYgYSBwYWdpbmF0aW9uIHRva2VuIGlzIHByb3ZpZGVkLCB0aGUgZmlsdGVyLCBlZmZlY3RpdmVBdCAgICAgICAgICAgICAgYW5kIGFzQXQgZmllbGRzIG11c3Qgbm90IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb3JpZ2luYWwgcmVxdWVzdC4gKi9cbiAgICBwYWdlPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSByZXN1bHRzIHRvIHRoaXMgbnVtYmVyLiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdG8gZmlsdGVyIG9uIHRoZSB0cmVhdG1lbnQsIHNwZWNpZnkgXFwmcXVvdDt0cmVhdG1lbnQgZXEgXFwmIzM5O01vbnRobHlcXCYjMzk7XFwmcXVvdDsuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZpbHRlcmluZyAgICAgICAgICAgICAgcmVzdWx0cywgc2VlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZG9jcy9maWx0ZXJpbmctaW5mb3JtYXRpb24tcmV0cmlldmVkLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBBIGxpc3Qgb2YgZmllbGQgbmFtZXMgb3IgcHJvcGVydGllcyB0byBzb3J0IGJ5LCBlYWNoIHN1ZmZpeGVkIGJ5IFxcJnF1b3Q7IEFTQ1xcJnF1b3Q7IG9yIFxcJnF1b3Q7IERFU0NcXCZxdW90OyAqL1xuICAgIHNvcnRCeT86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIFxcJiMzOTtGZWVcXCYjMzk7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvIGVhY2ggRmVlLiAgICAgICAgICAgICAgVGhlc2UgbXVzdCB0YWtlIHRoZSBmb3JtYXQge2RvbWFpbn0ve3Njb3BlfS97Y29kZX0sIGZvciBleGFtcGxlIFxcJiMzOTtGZWUvQWNjb3VudC9JZFxcJiMzOTsuICovXG4gICAgcHJvcGVydHlLZXlzPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0RnVuZENhbGVuZGFyUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gbGlzdCB0aGUgQ2FsZW5kYXIuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCBDYWxlbmRhciBFbnRyeSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwYWdpbmF0aW9uIHRva2VuIHRvIHVzZSB0byBjb250aW51ZSBsaXN0aW5nIENhbGVuZGFyIEVudHJpZXM7IHRoaXMgICAgICAgICAgICAgIHZhbHVlIGlzIHJldHVybmVkIGZyb20gdGhlIHByZXZpb3VzIGNhbGwuIElmIGEgcGFnaW5hdGlvbiB0b2tlbiBpcyBwcm92aWRlZCwgdGhlIGZpbHRlciwgZWZmZWN0aXZlQXQgICAgICAgICAgICAgIGFuZCBhc0F0IGZpZWxkcyBtdXN0IG5vdCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG9yaWdpbmFsIHJlcXVlc3QuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogV2hlbiBwYWdpbmF0aW5nLCBsaW1pdCB0aGUgcmVzdWx0cyB0byB0aGlzIG51bWJlci4gRGVmYXVsdHMgdG8gMTAwIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHRzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmaWx0ZXJpbmcgICAgICAgICAgICAgIHJlc3VsdHMsIHNlZSBodHRwczovL3N1cHBvcnQubHVzaWQuY29tL2RvY3MvZmlsdGVyaW5nLWluZm9ybWF0aW9uLXJldHJpZXZlZC1mcm9tLWx1c2lkLiAqL1xuICAgIGZpbHRlcj86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIGZpZWxkIG5hbWVzIG9yIHByb3BlcnRpZXMgdG8gc29ydCBieSwgZWFjaCBzdWZmaXhlZCBieSBcXCZxdW90OyBBU0NcXCZxdW90OyBvciBcXCZxdW90OyBERVNDXFwmcXVvdDsuICovXG4gICAgc29ydEJ5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0Nsb3NlZFBlcmlvZFxcJiMzOTsgZG9tYWluIHRvIGRlY29yYXRlIG9udG8gZWFjaCBpdGVtLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEZ1bmRDYWxlbmRhckVudHJpZXNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBsaXN0IHRoZSBDYWxlbmRhci4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlYWNoIENhbGVuZGFyIEVudHJ5IGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgQ2FsZW5kYXIgRW50cmllczsgdGhpcyAgICAgICAgICAgICAgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcHJldmlvdXMgY2FsbC4gSWYgYSBwYWdpbmF0aW9uIHRva2VuIGlzIHByb3ZpZGVkLCB0aGUgZmlsdGVyLCBlZmZlY3RpdmVBdCAgICAgICAgICAgICAgYW5kIGFzQXQgZmllbGRzIG11c3Qgbm90IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb3JpZ2luYWwgcmVxdWVzdC4gKi9cbiAgICBwYWdlPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSByZXN1bHRzIHRvIHRoaXMgbnVtYmVyLiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZpbHRlcmluZyAgICAgICAgICAgICAgcmVzdWx0cywgc2VlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZG9jcy9maWx0ZXJpbmctaW5mb3JtYXRpb24tcmV0cmlldmVkLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBBIGxpc3Qgb2YgZmllbGQgbmFtZXMgb3IgcHJvcGVydGllcyB0byBzb3J0IGJ5LCBlYWNoIHN1ZmZpeGVkIGJ5IFxcJnF1b3Q7IEFTQ1xcJnF1b3Q7IG9yIFxcJnF1b3Q7IERFU0NcXCZxdW90Oy4gKi9cbiAgICBzb3J0Qnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKiBBIGxpc3Qgb2YgcHJvcGVydHkga2V5cyBmcm9tIHRoZSBcXCYjMzk7RGlhcnlFbnRyeVxcJiMzOTsgZG9tYWluIHRvIGRlY29yYXRlIG9udG8gZWFjaCBpdGVtLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEZ1bmRzUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBlZmZlY3RpdmUgZGF0ZXRpbWUgb3IgY3V0IGxhYmVsIGF0IHdoaWNoIHRvIGxpc3QgdGhlIFRpbWVWYXJpYW50IHByb3BlcnRpZXMgZm9yIHRoZSBGdW5kcy4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgTFVTSUQgICAgICAgICAgICAgIHN5c3RlbSBkYXRldGltZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGVmZmVjdGl2ZUF0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBsaXN0IHRoZSBGdW5kcy4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlYWNoIEZ1bmQgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyBGdW5kczsgdGhpcyAgICAgICAgICAgICAgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcHJldmlvdXMgY2FsbC4gSWYgYSBwYWdpbmF0aW9uIHRva2VuIGlzIHByb3ZpZGVkLCB0aGUgZmlsdGVyLCBlZmZlY3RpdmVBdCAgICAgICAgICAgICAgYW5kIGFzQXQgZmllbGRzIG11c3Qgbm90IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb3JpZ2luYWwgcmVxdWVzdC4gKi9cbiAgICBwYWdlPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSByZXN1bHRzIHRvIHRoaXMgbnVtYmVyLiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdHMuICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdG8gZmlsdGVyIG9uIHRoZSBGdW5kIGNvZGUsIHNwZWNpZnkgXFwmcXVvdDtpZC5Db2RlIGVxIFxcJiMzOTtGdW5kMVxcJiMzOTtcXCZxdW90Oy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZmlsdGVyaW5nICAgICAgICAgICAgICByZXN1bHRzLCBzZWUgaHR0cHM6Ly9zdXBwb3J0Lmx1c2lkLmNvbS9kb2NzL2ZpbHRlcmluZy1pbmZvcm1hdGlvbi1yZXRyaWV2ZWQtZnJvbS1sdXNpZC4gKi9cbiAgICBmaWx0ZXI/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBmaWVsZCBuYW1lcyBvciBwcm9wZXJ0aWVzIHRvIHNvcnQgYnksIGVhY2ggc3VmZml4ZWQgYnkgXFwmcXVvdDsgQVNDXFwmcXVvdDsgb3IgXFwmcXVvdDsgREVTQ1xcJnF1b3Q7ICovXG4gICAgc29ydEJ5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0Z1bmRcXCYjMzk7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvIGVhY2ggRnVuZC4gICAgICAgICAgICAgIFRoZXNlIG11c3QgdGFrZSB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9LCBmb3IgZXhhbXBsZSBcXCYjMzk7RnVuZC9NYW5hZ2VyL0lkXFwmIzM5Oy4gKi9cbiAgICBwcm9wZXJ0eUtleXM/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3ROYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgaXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZ2l2ZW4gRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIEZldGNoIGFsbCBOQVYgYWRqdXN0bWVudCBhY3Rpdml0aWVzIGZvciB0aGlzIHZhbHVhdGlvbiBwb2ludC4gKi9cbiAgICB2YWx1YXRpb25Qb2ludENvZGU6IHN0cmluZztcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgcnVucyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIGxpc3QgdGhlIE5hdiBhY3Rpdml0eSBhZGp1c3RtZW50cy4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlYWNoIGFkanVzdG1lbnQgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyBOYXYgYWN0aXZpdHkgYWRqdXN0bWVudHM7IHRoaXMgICAgICAgICAgICAgIHZhbHVlIGlzIHJldHVybmVkIGZyb20gdGhlIHByZXZpb3VzIGNhbGwuIElmIGEgcGFnaW5hdGlvbiB0b2tlbiBpcyBwcm92aWRlZCwgdGhlIGZpbHRlciwgICAgICAgICAgICAgIGFuZCBhc0F0IGZpZWxkcyBtdXN0IG5vdCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG9yaWdpbmFsIHJlcXVlc3QuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogV2hlbiBwYWdpbmF0aW5nLCBsaW1pdCB0aGUgcmVzdWx0cyB0byB0aGlzIG51bWJlci4gRGVmYXVsdHMgdG8gMTAwIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHQgc2V0LiBSZWFkIG1vcmUgYWJvdXQgZmlsdGVyaW5nIHJlc3VsdHMgZnJvbSBMVVNJRCBoZXJlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZmlsdGVyaW5nLXJlc3VsdHMtZnJvbS1sdXNpZC4gKi9cbiAgICBmaWx0ZXI/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2YXJpYW50IG9mIHRoZSB2YWx1YXRpb24gcG9pbnQgdXNlZCBpbiB0aGUgcmVxdWVzdC4gVG9nZXRoZXIgd2l0aCB0aGUgdmFsdWF0aW9uIHBvaW50IGNvZGUgbWFya3MgdGhlIHVuaXF1ZSBicmFuY2ggZm9yIHRoZSBOYXZUeXBlLiAqL1xuICAgIHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGFSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXJndW1lbnRzIHRvIHVzZSBmb3IgcXVlcnlpbmcgdGhlIGNvbXBsZXggbWFya2V0IGRhdGEuICovXG4gICAgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzOiBWYWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIGNvbXBsZXggbWFya2V0IGRhdGEuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gICAgICAgICAgICAgIG9mIGVhY2ggaXRlbSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcGFnaW5hdGluZywgbGltaXQgdGhlIG51bWJlciBvZiByZXR1cm5lZCByZXN1bHRzIHRvIHRoaXMgbWFueS4gRGVmYXVsdHMgdG8gMTAwIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgLyoqIFRoZSBwYWdpbmF0aW9uIHRva2VuIHRvIHVzZSB0byBjb250aW51ZSBsaXN0aW5nIGNvbXBsZXggbWFya2V0IGRhdGEgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gTGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGEuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgcnVucyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFZhbHVhdGlvblBvaW50SW5zdHJ1bWVudHNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSBpcyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBnaXZlbiBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogRmV0Y2ggYWxsIGluc3RydW1lbnRzIGZvciB0aGlzIHZhbHVhdGlvbiBwb2ludC4gKi9cbiAgICB2YWx1YXRpb25Qb2ludENvZGU6IHN0cmluZztcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgcnVucyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIGxpc3QgdGhlIGluc3RydW1lbnRzLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggaW5zdHJ1bWVudCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwYWdpbmF0aW9uIHRva2VuIHRvIHVzZSB0byBjb250aW51ZSBsaXN0aW5nIGluc3RydW1lbnRzOyB0aGlzICAgICAgICAgICAgICB2YWx1ZSBpcyByZXR1cm5lZCBmcm9tIHRoZSBwcmV2aW91cyBjYWxsLiBJZiBhIHBhZ2luYXRpb24gdG9rZW4gaXMgcHJvdmlkZWQsIHRoZSBmaWx0ZXIsICAgICAgICAgICAgICBhbmQgYXNBdCBmaWVsZHMgbXVzdCBub3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvcmlnaW5hbCByZXF1ZXN0LiAqL1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcGFnaW5hdGluZywgbGltaXQgdGhlIHJlc3VsdHMgdG8gdGhpcyBudW1iZXIuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBFeHByZXNzaW9uIHRvIGZpbHRlciB0aGUgcmVzdWx0IHNldC4gUmVhZCBtb3JlIGFib3V0IGZpbHRlcmluZyByZXN1bHRzIGZyb20gTFVTSUQgaGVyZSBodHRwczovL3N1cHBvcnQubHVzaWQuY29tL2ZpbHRlcmluZy1yZXN1bHRzLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBBIGxpc3Qgb2YgZmllbGQgbmFtZXMgb3IgcHJvcGVydGllcyB0byBzb3J0IGJ5LCBlYWNoIHN1ZmZpeGVkIGJ5IFxcJnF1b3Q7IEFTQ1xcJnF1b3Q7IG9yIFxcJnF1b3Q7IERFU0NcXCZxdW90Oy4gKi9cbiAgICBzb3J0Qnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKiBBIGxpc3Qgb2YgcHJvcGVydHkga2V5cyBmcm9tIHRoZSBcXCYjMzk7SW5zdHJ1bWVudFxcJiMzOTsgZG9tYWluIHRvIGRlY29yYXRlIG9udG8gICAgICAgICAgICAgIGluc3RydW1lbnRzLCBvciBmcm9tIGFueSBkb21haW4gdGhhdCBzdXBwb3J0cyByZWxhdGlvbnNoaXBzIHRvIGRlY29yYXRlIG9udG8gcmVsYXRlZCBlbnRpdGllcy4gICAgICAgICAgICAgIFRoZXNlIG11c3QgaGF2ZSB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9LCBmb3IgZXhhbXBsZSBcXCYjMzk7SW5zdHJ1bWVudC9zeXN0ZW0vTmFtZVxcJiMzOTsuICovXG4gICAgaW5zdHJ1bWVudFByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIFRoZSB2YXJpYW50IG9mIHRoZSB2YWx1YXRpb24gcG9pbnQgdXNlZCBpbiB0aGUgcmVxdWVzdC4gVG9nZXRoZXIgd2l0aCB0aGUgdmFsdWF0aW9uIHBvaW50IGNvZGUgbWFya3MgdGhlIHVuaXF1ZSBicmFuY2ggZm9yIHRoZSBOYXZUeXBlLiAqL1xuICAgIHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdFZhbHVhdGlvblBvaW50T3ZlcnZpZXdSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGV0aW1lIG9yIGN1dCBsYWJlbCBhdCB3aGljaCB0byBsaXN0IHRoZSBUaW1lVmFyaWFudCBwcm9wZXJ0aWVzIGZvciB0aGUgVmFsdWF0aW9uIFBvaW50cy4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgTFVTSUQgICAgICAgICAgICAgIHN5c3RlbSBkYXRldGltZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGVmZmVjdGl2ZUF0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBsaXN0IHRoZSBWYWx1YXRpb24gUG9pbnRzLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggVmFsdWF0aW9uIFBvaW50IGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgVmFsdWF0aW9uIFBvaW50czsgdGhpcyAgICAgICAgICAgICAgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcHJldmlvdXMgY2FsbC4gSWYgYSBwYWdpbmF0aW9uIHRva2VuIGlzIHByb3ZpZGVkLCB0aGUgZmlsdGVyLCBlZmZlY3RpdmVBdCAgICAgICAgICAgICAgYW5kIGFzQXQgZmllbGRzIG11c3Qgbm90IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb3JpZ2luYWwgcmVxdWVzdC4gKi9cbiAgICBwYWdlPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSByZXN1bHRzIHRvIHRoaXMgbnVtYmVyLiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdHMgYnkuICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdG8gZmlsdGVyIG9uIHRoZSBOQVYsIHNwZWNpZnkgXFwmcXVvdDtOQVYgZ3QgMzAwXFwmcXVvdDsuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZpbHRlcmluZyAgICAgICAgICAgICAgcmVzdWx0cywgc2VlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZG9jcy9maWx0ZXJpbmctaW5mb3JtYXRpb24tcmV0cmlldmVkLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBBIGxpc3Qgb2YgcHJvcGVydHkga2V5cyBmcm9tIHRoZSBcXCYjMzk7RGlhcnlFbnRyeVxcJiMzOTsgZG9tYWluIHRvIGRlY29yYXRlIG9udG8gZWFjaCBWYWx1YXRpb25Qb2ludC4gICAgICAgICAgICAgIFRoZXNlIG11c3QgdGFrZSB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9LCBmb3IgZXhhbXBsZSBcXCYjMzk7RGlhcnlFbnRyeS9WYWx1YXRpb25Qb2ludC9JZFxcJiMzOTsuICovXG4gICAgcHJvcGVydHlLZXlzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgcnVucyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hGZWVSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRmVlLiAqL1xuICAgIGZlZUNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGpzb24gcGF0Y2ggZG9jdW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZTogaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2OTAyLiAqL1xuICAgIG9wZXJhdGlvbjogQXJyYXk8T3BlcmF0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXRjaEZ1bmRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUganNvbiBwYXRjaCBkb2N1bWVudC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOiBodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzY5MDIuICovXG4gICAgb3BlcmF0aW9uOiBBcnJheTxPcGVyYXRpb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Q2FzaFN0YXRlbWVudFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgdGhlIGRpYXJ5IGVudHJ5IHBlcmlvZCBhbmQgZGlzcGxheSBtb2RlLiAqL1xuICAgIHF1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzOiBRdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIGNhc2ggc3RhdGVtZW50LiBEZWZhdWx0cyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBFeHByZXNzaW9uIHRvIGZpbHRlciB0aGUgcmVzdWx0IHNldC4gKi9cbiAgICBmaWx0ZXI/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcGFnaW5hdGluZywgbGltaXQgdGhlIG51bWJlciBvZiByZXR1cm5lZCByZXN1bHRzIHRvIHRoaXMgbWFueS4gRGVmYXVsdHMgdG8gMTAwIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgLyoqIFRoZSBwYWdpbmF0aW9uIHRva2VuIHRvIHVzZSB0byBnZXQgdGhlIG5leHQgcGFnZSBvZiByZXN1bHRzLiAqL1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIHRvIGRlY29yYXRlIG9udG8gdGhlIGNhc2ggc3RhdGVtZW50IHJvd3MuICovXG4gICAgcHJvcGVydHlLZXlzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIE5BViB0eXBlIHRvIHVzZS4gRGVmYXVsdHMgdG8gdGhlIHByaW1hcnkgTkFWIHR5cGUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5UmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIHF1ZXJ5IHBhcmFtZXRlcnMgc3BlY2lmeWluZyB0aGUgZGlhcnkgZW50cnkgcGVyaW9kIGFuZCBkaXNwbGF5IG1vZGUuICovXG4gICAgcXVlcnlGdW5kQ2FzaFN0YXRlbWVudFBhcmFtZXRlcnM6IFF1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgY2FzaCBzdGF0ZW1lbnQuIERlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHQgc2V0LiAqL1xuICAgIGZpbHRlcj86IHN0cmluZztcbiAgICAvKiogV2hlbiBwYWdpbmF0aW5nLCBsaW1pdCB0aGUgbnVtYmVyIG9mIHJldHVybmVkIHJlc3VsdHMgdG8gdGhpcyBtYW55LiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGdldCB0aGUgbmV4dCBwYWdlIG9mIHJlc3VsdHMuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgdG8gZGVjb3JhdGUgb250byB0aGUgY2FzaCBzdGF0ZW1lbnQgcm93cy4gKi9cbiAgICBwcm9wZXJ0eUtleXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgTkFWIHR5cGUgdG8gdXNlLiBEZWZhdWx0cyB0byB0aGUgcHJpbWFyeSBOQVYgdHlwZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJldmVydFZhbHVhdGlvblBvaW50VG9Fc3RpbWF0ZVJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSByZXZlcnRWYWx1YXRpb25Qb2ludFJlcXVlc3Qgd2hpY2ggY29udGFpbnMgdGhlIERpYXJ5IEVudHJ5IGNvZGUgZm9yIHRoZSBGaW5hbCBWYWx1YXRpb24gUG9pbnQgdG8gbW92ZSB0byBFc3RpbWF0ZSBzdGF0dXMuICovXG4gICAgcmV2ZXJ0VmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdDogUmV2ZXJ0VmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdDtcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgc2V0cyB0aGUgc3RhdHVzIG9mIHRoZSBWYWx1YXRpb24gUG9pbnQgb2YgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSB0byBiZSBFc3RpbWF0ZS4gICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBzY29wZXMgYW5kIGluc3RydW1lbnQgaWRlbnRpZmllcnMgZm9yIHRoZSBpbnN0cnVtZW50cyB0byBiZSBzZXQuICovXG4gICAgc2V0U2hhcmVDbGFzc0luc3RydW1lbnRzUmVxdWVzdDogU2V0U2hhcmVDbGFzc0luc3RydW1lbnRzUmVxdWVzdDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBWYWx1YXRpb24gUG9pbnQgRXN0aW1hdGUgZGVmaW5pdGlvbiB0byB1cHNlcnQuICovXG4gICAgdXBkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0OiBVcGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3Q7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHVwc2VydHMgdGhlIFZhbHVhdGlvbiBQb2ludCBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBzZXJ0Qm9va21hcmtSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYm9va21hcmsgZGVmaW5pdGlvbiB0byB1cHNlcnQuICovXG4gICAgdXBzZXJ0RnVuZEJvb2ttYXJrUmVxdWVzdDogVXBzZXJ0RnVuZEJvb2ttYXJrUmVxdWVzdDtcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgdXBzZXJ0cyB0aGUgVmFsdWF0aW9uIFBvaW50IGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcHNlcnREaWFyeUVudHJ5VHlwZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIFZhbHVhdGlvbiBQb2ludCBFc3RpbWF0ZSBkZWZpbml0aW9uIHRvIHVwc2VydC4gKi9cbiAgICB1cHNlcnRWYWx1YXRpb25Qb2ludFJlcXVlc3Q6IFVwc2VydFZhbHVhdGlvblBvaW50UmVxdWVzdDtcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgdXBzZXJ0cyB0aGUgVmFsdWF0aW9uIFBvaW50IGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcHNlcnRGZWVQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZlZSB0byB1cGRhdGUgb3IgaW5zZXJ0IHRoZSBwcm9wZXJ0aWVzIG9udG8uICovXG4gICAgZmVlQ29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgcHJvcGVydGllcyB0byBiZSB1cGRhdGVkIG9yIGluc2VydGVkIG9udG8gdGhlIEZlZS4gRWFjaCBwcm9wZXJ0eSBpbiAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0IG11c3QgYmUga2V5ZWQgYnkgaXRzIHVuaXF1ZSBwcm9wZXJ0eSBrZXkuIFRoaXMgaGFzIHRoZSBmb3JtYXQge2RvbWFpbn0ve3Njb3BlfS97Y29kZX0gZS5nLiBcXCZxdW90O0ZlZS9NYW5hZ2VyL0lkXFwmcXVvdDsuICovXG4gICAgcmVxdWVzdEJvZHk/OiB7IFtrZXk6IHN0cmluZ106IFByb3BlcnR5OyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwc2VydEZ1bmRQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIHByb3BlcnRpZXMgdG8gYmUgdXBkYXRlZCBvciBpbnNlcnRlZCBvbnRvIHRoZSBGdW5kLiBFYWNoIHByb3BlcnR5IGluICAgICAgICAgICAgICAgdGhlIHJlcXVlc3QgbXVzdCBiZSBrZXllZCBieSBpdHMgdW5pcXVlIHByb3BlcnR5IGtleS4gVGhpcyBoYXMgdGhlIGZvcm1hdCB7ZG9tYWlufS97c2NvcGV9L3tjb2RlfSBlLmcuIFxcJnF1b3Q7RnVuZC9NYW5hZ2VyL0lkXFwmcXVvdDsuICovXG4gICAgcmVxdWVzdEJvZHk/OiB7IFtrZXk6IHN0cmluZ106IFByb3BlcnR5OyB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSBpcyB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBnaXZlbiBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIHZhbHVhdGlvbiBwb2ludCBDb2RlIHRvIGFwcGx5IHRoZSBhZGp1c3RtZW50IHRvICovXG4gICAgdmFsdWF0aW9uUG9pbnRDb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSByZXF1ZXN0IGRlc2NyaWJpbmcgdGhlIE5hdiBhY3Rpdml0eSBhZGp1c3RtZW50cyB0byBhcHBseSB0byBhIHNwZWNpZmljIHZhbHVhdGlvbiBwb2ludCBhbmQgbmF2IHR5cGUgKi9cbiAgICBuYXZBY3Rpdml0eUFkanVzdG1lbnQ6IEFycmF5PE5hdkFjdGl2aXR5QWRqdXN0bWVudD47XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgdmFyaWFudCBvZiB0aGUgdmFsdWF0aW9uIHBvaW50IHVzZWQgaW4gdGhlIHJlcXVlc3QuIFRvZ2V0aGVyIHdpdGggdGhlIHZhbHVhdGlvbiBwb2ludCBjb2RlIG1hcmtzIHRoZSB1bmlxdWUgYnJhbmNoIGZvciB0aGUgTmF2VHlwZS4gKi9cbiAgICB2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50Pzogc3RyaW5nO1xufVxuXG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIEZ1bmRzU2VydmljZSB7XG5cbiAgICBwcm90ZWN0ZWQgYmFzZVBhdGggPSAnaHR0cHM6Ly93d3cubHVzaWQuY29tL2FwaSc7XG4gICAgcHVibGljIGRlZmF1bHRIZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKCk7XG4gICAgcHVibGljIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpO1xuICAgIHB1YmxpYyBlbmNvZGVyOiBIdHRwUGFyYW1ldGVyQ29kZWM7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaHR0cENsaWVudDogSHR0cENsaWVudCwgQE9wdGlvbmFsKClASW5qZWN0KEJBU0VfUEFUSCkgYmFzZVBhdGg6IHN0cmluZ3xzdHJpbmdbXSwgQE9wdGlvbmFsKCkgY29uZmlndXJhdGlvbjogQ29uZmlndXJhdGlvbikge1xuICAgICAgICBpZiAoY29uZmlndXJhdGlvbikge1xuICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0QmFzZVBhdGggPSBBcnJheS5pc0FycmF5KGJhc2VQYXRoKSA/IGJhc2VQYXRoWzBdIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKGZpcnN0QmFzZVBhdGggIT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgYmFzZVBhdGggPSBmaXJzdEJhc2VQYXRoO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIGJhc2VQYXRoICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gdGhpcy5iYXNlUGF0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aCA9IGJhc2VQYXRoO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW5jb2RlciA9IHRoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVyIHx8IG5ldyBDdXN0b21IdHRwUGFyYW1ldGVyQ29kZWMoKTtcbiAgICB9XG5cblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtcyhodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZTogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlLCBrZXkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIHByaXZhdGUgYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXM6IEh0dHBQYXJhbXMsIHZhbHVlPzogYW55LCBrZXk/OiBzdHJpbmcpOiBIdHRwUGFyYW1zIHtcbiAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIikge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgKHZhbHVlIGFzIGFueVtdKS5mb3JFYWNoKCBlbGVtID0+IGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCBlbGVtLCBrZXkpKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksICh2YWx1ZSBhcyBEYXRlKS50b0lTT1N0cmluZygpLnN1YnN0cmluZygwLCAxMCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoXCJrZXkgbWF5IG5vdCBiZSBudWxsIGlmIHZhbHVlIGlzIERhdGVcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh2YWx1ZSkuZm9yRWFjaCggayA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoXG4gICAgICAgICAgICAgICAgICAgIGh0dHBQYXJhbXMsIHZhbHVlW2tdLCBrZXkgIT0gbnVsbCA/IGAke2tleX0uJHtrfWAgOiBrKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSBodHRwUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBub3Qgb2JqZWN0IG9yIGFycmF5XCIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBodHRwUGFyYW1zO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnQ6IEFjY2VwdHMgYW4gRXN0aW1hdGUgVmFsdWF0aW9uIFBvaW50LlxuICAgICAqIEFjY2VwdHMgdGhlIHNwZWNpZmllZCBlc3RpbWF0ZSBWYWx1YXRpb24gUG9pbnQuICBTaG91bGQgdGhlIFZhbHVhdGlvbiBQb2ludCBkaWZmZXIgc2luY2UgdGhlIFZhbHVhdGlvbiBQb2ludCB3YXMgbGFzdCBydW4sIGJvdGggVmFsdWF0aW9uIFBvaW50cyB3aWxsIGJlIHJldHVybmVkIGFuZCBzdGF0dXMgd2lsbCBiZSBtYXJrZWQgYXMgXFwmIzM5O0NhbmRpZGF0ZVxcJiMzOTssICBvdGhlcndpc2UgaXQgd2lsbCBiZSBtYXJrZWQgYXMgXFwmIzM5O0ZpbmFsXFwmIzM5Oy5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWNjZXB0RXN0aW1hdGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IEFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8QWNjZXB0RXN0aW1hdGVWYWx1YXRpb25Qb2ludFJlc3BvbnNlPjtcbiAgICBwdWJsaWMgYWNjZXB0RXN0aW1hdGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IEFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgYWNjZXB0RXN0aW1hdGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IEFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8QWNjZXB0RXN0aW1hdGVWYWx1YXRpb25Qb2ludFJlc3BvbnNlPj47XG4gICAgcHVibGljIGFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgYWNjZXB0RXN0aW1hdGVWYWx1YXRpb25Qb2ludC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0O1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdCA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvJGFjY2VwdGVzdGltYXRlYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnRSZXNwb25zZT4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEFkZEFsbG9jYXRpb25Hcm91cHM6IEFkZCBBbGxvY2F0aW9uIEdyb3VwcyB0byBhIEZ1bmQuXG4gICAgICogQWRkIHRoZSBnaXZlbiBBbGxvY2F0aW9uIEdyb3VwIGRlZmluaXRpb25zIHRvIHRoZSBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRBbGxvY2F0aW9uR3JvdXBzKHJlcXVlc3RQYXJhbWV0ZXJzPzogQWRkQWxsb2NhdGlvbkdyb3Vwc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxGdW5kPjtcbiAgICBwdWJsaWMgYWRkQWxsb2NhdGlvbkdyb3VwcyhyZXF1ZXN0UGFyYW1ldGVycz86IEFkZEFsbG9jYXRpb25Hcm91cHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGdW5kPj47XG4gICAgcHVibGljIGFkZEFsbG9jYXRpb25Hcm91cHMocmVxdWVzdFBhcmFtZXRlcnM/OiBBZGRBbGxvY2F0aW9uR3JvdXBzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZ1bmQ+PjtcbiAgICBwdWJsaWMgYWRkQWxsb2NhdGlvbkdyb3VwcyhyZXF1ZXN0UGFyYW1ldGVycz86IEFkZEFsbG9jYXRpb25Hcm91cHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhZGRBbGxvY2F0aW9uR3JvdXBzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgYWRkQWxsb2NhdGlvbkdyb3Vwcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbGxvY2F0aW9uR3JvdXBEZWZpbml0aW9uID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFsbG9jYXRpb25Hcm91cERlZmluaXRpb247XG4gICAgICAgIGlmIChhbGxvY2F0aW9uR3JvdXBEZWZpbml0aW9uID09PSBudWxsIHx8IGFsbG9jYXRpb25Hcm91cERlZmluaXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYWxsb2NhdGlvbkdyb3VwRGVmaW5pdGlvbiB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGFkZEFsbG9jYXRpb25Hcm91cHMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9hbGxvY2F0aW9uZ3JvdXBzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZ1bmQ+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBhbGxvY2F0aW9uR3JvdXBEZWZpbml0aW9uLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gQWRkU2VyaWVzOiBBZGQgU2VyaWVzIHRvIGEgRnVuZC5cbiAgICAgKiBBZGQgdGhlIGdpdmVuIFNlcmllcyBkZWZpbml0aW9ucyB0byB0aGUgc3BlY2lmaWVkIFNoYXJlIENsYXNzZXMgb2YgdGhlIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGFkZFNlcmllcyhyZXF1ZXN0UGFyYW1ldGVycz86IEFkZFNlcmllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxGdW5kPjtcbiAgICBwdWJsaWMgYWRkU2VyaWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogQWRkU2VyaWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RnVuZD4+O1xuICAgIHB1YmxpYyBhZGRTZXJpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBBZGRTZXJpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RnVuZD4+O1xuICAgIHB1YmxpYyBhZGRTZXJpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBBZGRTZXJpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhZGRTZXJpZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhZGRTZXJpZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VyaWVzRGVmaW5pdGlvblJlcXVlc3QgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2VyaWVzRGVmaW5pdGlvblJlcXVlc3Q7XG4gICAgICAgIGlmIChzZXJpZXNEZWZpbml0aW9uUmVxdWVzdCA9PT0gbnVsbCB8fCBzZXJpZXNEZWZpbml0aW9uUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzZXJpZXNEZWZpbml0aW9uUmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGFkZFNlcmllcy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3Nlcmllc2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGdW5kPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogc2VyaWVzRGVmaW5pdGlvblJlcXVlc3QsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBDcmVhdGVGZWU6IENyZWF0ZSBhIEZlZS5cbiAgICAgKiBDcmVhdGUgdGhlIGdpdmVuIEZlZS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRmVlKHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlRmVlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZlZT47XG4gICAgcHVibGljIGNyZWF0ZUZlZShyZXF1ZXN0UGFyYW1ldGVycz86IENyZWF0ZUZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZlZT4+O1xuICAgIHB1YmxpYyBjcmVhdGVGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RmVlPj47XG4gICAgcHVibGljIGNyZWF0ZUZlZShyZXF1ZXN0UGFyYW1ldGVycz86IENyZWF0ZUZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZUZlZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZUZlZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmZWVSZXF1ZXN0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZlZVJlcXVlc3Q7XG4gICAgICAgIGlmIChmZWVSZXF1ZXN0ID09PSBudWxsIHx8IGZlZVJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmVlUmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZUZlZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vZmVlc2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGZWU+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBmZWVSZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBDcmVhdGVGdW5kOiBDcmVhdGUgYSBGdW5kLlxuICAgICAqIENyZWF0ZSB0aGUgZ2l2ZW4gRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IENyZWF0ZUZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RnVuZD47XG4gICAgcHVibGljIGNyZWF0ZUZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RnVuZD4+O1xuICAgIHB1YmxpYyBjcmVhdGVGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxGdW5kPj47XG4gICAgcHVibGljIGNyZWF0ZUZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmdW5kUmVxdWVzdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5mdW5kUmVxdWVzdDtcbiAgICAgICAgaWYgKGZ1bmRSZXF1ZXN0ID09PSBudWxsIHx8IGZ1bmRSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZ1bmRSZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlRnVuZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZ1bmQ+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBmdW5kUmVxdWVzdCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIENyZWF0ZUZ1bmRWMjogQ3JlYXRlIGEgRnVuZCBWMiAoUHJldmlldykuXG4gICAgICogQ3JlYXRlIHRoZSBnaXZlbiBWMiBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVGdW5kVjIocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVGdW5kVjJSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RnVuZD47XG4gICAgcHVibGljIGNyZWF0ZUZ1bmRWMihyZXF1ZXN0UGFyYW1ldGVycz86IENyZWF0ZUZ1bmRWMlJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZ1bmQ+PjtcbiAgICBwdWJsaWMgY3JlYXRlRnVuZFYyKHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlRnVuZFYyUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZ1bmQ+PjtcbiAgICBwdWJsaWMgY3JlYXRlRnVuZFYyKHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlRnVuZFYyUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlRnVuZFYyLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZ1bmREZWZpbml0aW9uUmVxdWVzdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5mdW5kRGVmaW5pdGlvblJlcXVlc3Q7XG4gICAgICAgIGlmIChmdW5kRGVmaW5pdGlvblJlcXVlc3QgPT09IG51bGwgfHwgZnVuZERlZmluaXRpb25SZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZ1bmREZWZpbml0aW9uUmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZUZ1bmRWMi4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy92Mi8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZ1bmQ+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBmdW5kRGVmaW5pdGlvblJlcXVlc3QsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBDcmVhdGVWYWx1YXRpb25Qb2ludDogQ3JlYXRlIGEgVmFsdWF0aW9uIFBvaW50LlxuICAgICAqIEluc2VydCB0aGUgZXN0aW1hdGUgVmFsdWF0aW9uIFBvaW50LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBjcmVhdGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IENyZWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50PjtcbiAgICBwdWJsaWMgY3JlYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZhbHVhdGlvblBvaW50Pj47XG4gICAgcHVibGljIGNyZWF0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnQ+PjtcbiAgICBwdWJsaWMgY3JlYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNyZWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdDtcbiAgICAgICAgaWYgKGNyZWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdCA9PT0gbnVsbCB8fCBjcmVhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgY3JlYXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy8kY3JlYXRlYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50PigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogY3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBEZWFjdGl2YXRlTmF2VHlwZXM6IERlYWN0aXZhdGUgTkFWIHR5cGVzIG9uIGEgRnVuZC5cbiAgICAgKiBEZWFjdGl2YXRlIHRoZSBnaXZlbiBOQVYgdHlwZXMgb24gdGhlIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlYWN0aXZhdGVOYXZUeXBlcyhyZXF1ZXN0UGFyYW1ldGVycz86IERlYWN0aXZhdGVOYXZUeXBlc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxGdW5kPjtcbiAgICBwdWJsaWMgZGVhY3RpdmF0ZU5hdlR5cGVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVhY3RpdmF0ZU5hdlR5cGVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RnVuZD4+O1xuICAgIHB1YmxpYyBkZWFjdGl2YXRlTmF2VHlwZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWFjdGl2YXRlTmF2VHlwZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RnVuZD4+O1xuICAgIHB1YmxpYyBkZWFjdGl2YXRlTmF2VHlwZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWFjdGl2YXRlTmF2VHlwZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWFjdGl2YXRlTmF2VHlwZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWFjdGl2YXRlTmF2VHlwZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSByZXF1ZXN0UGFyYW1ldGVycz8ucmVxdWVzdEJvZHk7XG4gICAgICAgIGlmIChyZXF1ZXN0Qm9keSA9PT0gbnVsbCB8fCByZXF1ZXN0Qm9keSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXF1ZXN0Qm9keSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlYWN0aXZhdGVOYXZUeXBlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkZWxldGVNb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmRlbGV0ZU1vZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZGVsZXRlTW9kZSAhPT0gdW5kZWZpbmVkICYmIGRlbGV0ZU1vZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5kZWxldGVNb2RlLCAnZGVsZXRlTW9kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vZGVhY3RpdmF0ZU5hdlR5cGVzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZ1bmQ+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gRGVsZXRlQm9va21hcms6IERlbGV0ZSBhIEJvb2ttYXJrLlxuICAgICAqIERlbGV0ZXMgdGhlIGdpdmVuIEJvb2ttYXJrLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVCb29rbWFyayhyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZUJvb2ttYXJrUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPERlbGV0ZWRFbnRpdHlSZXNwb25zZT47XG4gICAgcHVibGljIGRlbGV0ZUJvb2ttYXJrKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlQm9va21hcmtSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxEZWxldGVkRW50aXR5UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZGVsZXRlQm9va21hcmsocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVCb29rbWFya1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxEZWxldGVkRW50aXR5UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZGVsZXRlQm9va21hcmsocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVCb29rbWFya1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZUJvb2ttYXJrLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlQm9va21hcmsuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYm9va21hcmtDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmJvb2ttYXJrQ29kZTtcbiAgICAgICAgaWYgKGJvb2ttYXJrQ29kZSA9PT0gbnVsbCB8fCBib29rbWFya0NvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgYm9va21hcmtDb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlQm9va21hcmsuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vYm9va21hcmtzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImJvb2ttYXJrQ29kZVwiLCB2YWx1ZTogYm9va21hcmtDb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxEZWxldGVkRW50aXR5UmVzcG9uc2U+KCdkZWxldGUnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBEZWxldGVGZWU6IERlbGV0ZSBhIEZlZS5cbiAgICAgKiBEZWxldGUgdGhlIGdpdmVuIEZlZS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlRmVlKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlRmVlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPERlbGV0ZWRFbnRpdHlSZXNwb25zZT47XG4gICAgcHVibGljIGRlbGV0ZUZlZShyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZUZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPERlbGV0ZWRFbnRpdHlSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBkZWxldGVGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RGVsZXRlZEVudGl0eVJlc3BvbnNlPj47XG4gICAgcHVibGljIGRlbGV0ZUZlZShyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZUZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZUZlZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZUZlZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmZWVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZlZUNvZGU7XG4gICAgICAgIGlmIChmZWVDb2RlID09PSBudWxsIHx8IGZlZUNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgZmVlQ29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZUZlZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vZmVlcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJmZWVDb2RlXCIsIHZhbHVlOiBmZWVDb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxEZWxldGVkRW50aXR5UmVzcG9uc2U+KCdkZWxldGUnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gRGVsZXRlRnVuZDogRGVsZXRlIGEgRnVuZC5cbiAgICAgKiBEZWxldGUgdGhlIGdpdmVuIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPERlbGV0ZWRFbnRpdHlSZXNwb25zZT47XG4gICAgcHVibGljIGRlbGV0ZUZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RGVsZXRlZEVudGl0eVJlc3BvbnNlPj47XG4gICAgcHVibGljIGRlbGV0ZUZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PERlbGV0ZWRFbnRpdHlSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBkZWxldGVGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZUZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVGdW5kLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxEZWxldGVkRW50aXR5UmVzcG9uc2U+KCdkZWxldGUnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gRGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50czogRGVsZXRlIE5hdiBhY3Rpdml0eSBhZGp1c3RtZW50cy5cbiAgICAgKiBEZWxldGUgTmF2IGFjdGl2aXR5IGFkanVzdG1lbnRzIG9uIGEgVmFsdWF0aW9uIFBvaW50LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVOYXZBY3Rpdml0eUFkanVzdG1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxEZWxldGVkRW50aXR5UmVzcG9uc2U+O1xuICAgIHB1YmxpYyBkZWxldGVOYXZBY3Rpdml0eUFkanVzdG1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPERlbGV0ZWRFbnRpdHlSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBkZWxldGVOYXZBY3Rpdml0eUFkanVzdG1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxEZWxldGVkRW50aXR5UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZU5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVOYXZBY3Rpdml0eUFkanVzdG1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludENvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnRDb2RlO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnRDb2RlID09PSBudWxsIHx8IHZhbHVhdGlvblBvaW50Q29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2YWx1YXRpb25Qb2ludENvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVOYXZBY3Rpdml0eUFkanVzdG1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlO1xuICAgICAgICBpZiAobmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2UgPT09IG51bGwgfHwgbmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgbmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2Ugd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVOYXZBY3Rpdml0eUFkanVzdG1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQ7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnRDb2RlICE9PSB1bmRlZmluZWQgJiYgdmFsdWF0aW9uUG9pbnRDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dmFsdWF0aW9uUG9pbnRDb2RlLCAndmFsdWF0aW9uUG9pbnRDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQgIT09IHVuZGVmaW5lZCAmJiB2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCwgJ3ZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L25hdkFkanVzdG1lbnQvJGRlbGV0ZWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxEZWxldGVkRW50aXR5UmVzcG9uc2U+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBuYXZBY3Rpdml0eUFkanVzdG1lbnRSZXNwb25zZSxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gRGVsZXRlVmFsdWF0aW9uUG9pbnQ6IERlbGV0ZSBhIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBEZWxldGVzIHRoZSBnaXZlbiBWYWx1YXRpb24gUG9pbnQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RGVsZXRlZEVudGl0eVJlc3BvbnNlPjtcbiAgICBwdWJsaWMgZGVsZXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPERlbGV0ZWRFbnRpdHlSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBkZWxldGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PERlbGV0ZWRFbnRpdHlSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBkZWxldGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVWYWx1YXRpb25Qb2ludC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaWFyeUVudHJ5Q29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5kaWFyeUVudHJ5Q29kZTtcbiAgICAgICAgaWYgKGRpYXJ5RW50cnlDb2RlID09PSBudWxsIHx8IGRpYXJ5RW50cnlDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGRpYXJ5RW50cnlDb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlhcnlFbnRyeUNvZGVWYXJpYW50ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmRpYXJ5RW50cnlDb2RlVmFyaWFudDtcbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZGlhcnlFbnRyeUNvZGVWYXJpYW50ICE9PSB1bmRlZmluZWQgJiYgZGlhcnlFbnRyeUNvZGVWYXJpYW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZGlhcnlFbnRyeUNvZGVWYXJpYW50LCAnZGlhcnlFbnRyeUNvZGVWYXJpYW50Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJkaWFyeUVudHJ5Q29kZVwiLCB2YWx1ZTogZGlhcnlFbnRyeUNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PERlbGV0ZWRFbnRpdHlSZXNwb25zZT4oJ2RlbGV0ZScsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEZpbmFsaXNlQ2FuZGlkYXRlVmFsdWF0aW9uUG9pbnQ6IEZpbmFsaXNlIGEgQ2FuZGlkYXRlIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBNb3ZlcyBhIFxcJiMzOTtDYW5kaWRhdGVcXCYjMzk7IHN0YXR1cyBWYWx1YXRpb24gUG9pbnQgdG8gc3RhdHVzIFxcJiMzOTtGaW5hbFxcJiMzOTsuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGZpbmFsaXNlQ2FuZGlkYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBGaW5hbGlzZUNhbmRpZGF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50RGF0YVJlc3BvbnNlPjtcbiAgICBwdWJsaWMgZmluYWxpc2VDYW5kaWRhdGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IEZpbmFsaXNlQ2FuZGlkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludERhdGFSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBmaW5hbGlzZUNhbmRpZGF0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogRmluYWxpc2VDYW5kaWRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxWYWx1YXRpb25Qb2ludERhdGFSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBmaW5hbGlzZUNhbmRpZGF0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogRmluYWxpc2VDYW5kaWRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGZpbmFsaXNlQ2FuZGlkYXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBmaW5hbGlzZUNhbmRpZGF0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdDtcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZmluYWxpc2VDYW5kaWRhdGVWYWx1YXRpb25Qb2ludC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzLyRmaW5hbGlzZWNhbmRpZGF0ZWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWYWx1YXRpb25Qb2ludERhdGFSZXNwb25zZT4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldEEyQkRhdGFGb3JGdW5kOiBHZXQgQTJCIGRhdGEgZm9yIGEgRnVuZC5cbiAgICAgKiBHZXQgdGhlIEEyQiBkYXRhIGZvciB0cmFuc2FjdGlvbiBwb3J0Zm9saW9zIGluIGEgc3BlY2lmaWVkIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEEyQkRhdGFGb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0QTJCRGF0YUZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZGdW5kQTJCRGF0YVJlY29yZD47XG4gICAgcHVibGljIGdldEEyQkRhdGFGb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0QTJCRGF0YUZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZkZ1bmRBMkJEYXRhUmVjb3JkPj47XG4gICAgcHVibGljIGdldEEyQkRhdGFGb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0QTJCRGF0YUZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZGdW5kQTJCRGF0YVJlY29yZD4+O1xuICAgIHB1YmxpYyBnZXRBMkJEYXRhRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEEyQkRhdGFGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QTJCRGF0YUZvckZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRBMkJEYXRhRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSBudWxsIHx8IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRBMkJEYXRhRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJvcGVydHlLZXlzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgcHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJvcGVydHlLZXlzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzL2EyYi8kcXVlcnlgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZGdW5kQTJCRGF0YVJlY29yZD4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gR2V0QTJCTW92ZW1lbnRzRm9yRnVuZDogR2V0IEEyQiBtb3ZlbWVudHMgZm9yIHRyYW5zYWN0aW9uIHBvcnRmb2xpb3MgaW4gYSBGdW5kLlxuICAgICAqIEdldCB0aGUgQTJCIG1vdmVtZW50IHJlY29yZHMgb2YgdHJhbnNhY3Rpb24gcG9ydGZvbGlvcyBpbiBhIHNwZWNpZmllZCBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBMkJNb3ZlbWVudHNGb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0QTJCTW92ZW1lbnRzRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZkZ1bmRBMkJNb3ZlbWVudFJlY29yZD47XG4gICAgcHVibGljIGdldEEyQk1vdmVtZW50c0ZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRBMkJNb3ZlbWVudHNGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZGdW5kQTJCTW92ZW1lbnRSZWNvcmQ+PjtcbiAgICBwdWJsaWMgZ2V0QTJCTW92ZW1lbnRzRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEEyQk1vdmVtZW50c0ZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZGdW5kQTJCTW92ZW1lbnRSZWNvcmQ+PjtcbiAgICBwdWJsaWMgZ2V0QTJCTW92ZW1lbnRzRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEEyQk1vdmVtZW50c0ZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRBMkJNb3ZlbWVudHNGb3JGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QTJCTW92ZW1lbnRzRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSBudWxsIHx8IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRBMkJNb3ZlbWVudHNGb3JGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5maWx0ZXIsICdmaWx0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXlzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUtleXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcm9wZXJ0eUtleXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvYTJibW92ZW1lbnRzLyRxdWVyeWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZkZ1bmRBMkJNb3ZlbWVudFJlY29yZD4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gR2V0RmVlOiBHZXQgYSBGZWUgZm9yIGEgc3BlY2lmaWVkIEZ1bmQuXG4gICAgICogUmV0cmlldmUgYSBmZWUgZm9yIGEgc3BlY2lmaWVkIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEZlZShyZXF1ZXN0UGFyYW1ldGVycz86IEdldEZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxGZWU+O1xuICAgIHB1YmxpYyBnZXRGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGZWU+PjtcbiAgICBwdWJsaWMgZ2V0RmVlKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RmVlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZlZT4+O1xuICAgIHB1YmxpYyBnZXRGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRGZWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRGZWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmVlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5mZWVDb2RlO1xuICAgICAgICBpZiAoZmVlQ29kZSA9PT0gbnVsbCB8fCBmZWVDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZlZUNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRGZWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZWZmZWN0aXZlQXQ7XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByb3BlcnR5S2V5cztcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChlZmZlY3RpdmVBdCAhPT0gdW5kZWZpbmVkICYmIGVmZmVjdGl2ZUF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZWZmZWN0aXZlQXQsICdlZmZlY3RpdmVBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgcHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJvcGVydHlLZXlzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9mZWVzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImZlZUNvZGVcIiwgdmFsdWU6IGZlZUNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZlZT4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldEZlZVByb3BlcnRpZXM6IEdldCBGZWUgcHJvcGVydGllcy5cbiAgICAgKiBHZXQgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIGEgc2luZ2xlIGZlZS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RmVlUHJvcGVydGllcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldEZlZVByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RmVlUHJvcGVydGllcz47XG4gICAgcHVibGljIGdldEZlZVByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRGZWVQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RmVlUHJvcGVydGllcz4+O1xuICAgIHB1YmxpYyBnZXRGZWVQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RmVlUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxGZWVQcm9wZXJ0aWVzPj47XG4gICAgcHVibGljIGdldEZlZVByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRGZWVQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RmVlUHJvcGVydGllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEZlZVByb3BlcnRpZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmVlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5mZWVDb2RlO1xuICAgICAgICBpZiAoZmVlQ29kZSA9PT0gbnVsbCB8fCBmZWVDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZlZUNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRGZWVQcm9wZXJ0aWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUF0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVmZmVjdGl2ZUF0O1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZWZmZWN0aXZlQXQgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmVmZmVjdGl2ZUF0LCAnZWZmZWN0aXZlQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9mZWVzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImZlZUNvZGVcIiwgdmFsdWU6IGZlZUNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3Byb3BlcnRpZXNgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8RmVlUHJvcGVydGllcz4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldEZ1bmQ6IEdldCBhIEZ1bmQuXG4gICAgICogUmV0cmlldmUgdGhlIGRlZmluaXRpb24gb2YgYSBwYXJ0aWN1bGFyIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZ1bmQ+O1xuICAgIHB1YmxpYyBnZXRGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZ1bmQ+PjtcbiAgICBwdWJsaWMgZ2V0RnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RnVuZD4+O1xuICAgIHB1YmxpYyBnZXRGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUF0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVmZmVjdGl2ZUF0O1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZWZmZWN0aXZlQXQgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmVmZmVjdGl2ZUF0LCAnZWZmZWN0aXZlQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8RnVuZD4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldEZ1bmRQcm9wZXJ0aWVzOiBHZXQgRnVuZCBwcm9wZXJ0aWVzLlxuICAgICAqIEdldCBhbGwgdGhlIHByb3BlcnRpZXMgb2YgYSBzaW5nbGUgZnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0RnVuZFByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRGdW5kUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxGdW5kUHJvcGVydGllcz47XG4gICAgcHVibGljIGdldEZ1bmRQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RnVuZFByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGdW5kUHJvcGVydGllcz4+O1xuICAgIHB1YmxpYyBnZXRGdW5kUHJvcGVydGllcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldEZ1bmRQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZ1bmRQcm9wZXJ0aWVzPj47XG4gICAgcHVibGljIGdldEZ1bmRQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RnVuZFByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRGdW5kUHJvcGVydGllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEZ1bmRQcm9wZXJ0aWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUF0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVmZmVjdGl2ZUF0O1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZWZmZWN0aXZlQXQgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmVmZmVjdGl2ZUF0LCAnZWZmZWN0aXZlQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9wcm9wZXJ0aWVzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZ1bmRQcm9wZXJ0aWVzPignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gR2V0SG9sZGluZ0NvbnRyaWJ1dG9yc0ZvckZ1bmQ6IEdldCBob2xkaW5ncyBjb250cmlidXRvcnMgZm9yIHRyYW5zYWN0aW9uIHBvcnRmb2xpb3MgaW4gYSBGdW5kLlxuICAgICAqIEdldCB0aGUgaG9sZGluZ3Mgb2YgdHJhbnNhY3Rpb24gcG9ydGZvbGlvcyBpbiBhIHNwZWNpZmllZCBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRIb2xkaW5nQ29udHJpYnV0b3JzRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZlcnNpb25lZFJlc291cmNlTGlzdE9mSG9sZGluZ0NvbnRyaWJ1dG9yPjtcbiAgICBwdWJsaWMgZ2V0SG9sZGluZ0NvbnRyaWJ1dG9yc0ZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRIb2xkaW5nQ29udHJpYnV0b3JzRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZlcnNpb25lZFJlc291cmNlTGlzdE9mSG9sZGluZ0NvbnRyaWJ1dG9yPj47XG4gICAgcHVibGljIGdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0SG9sZGluZ0NvbnRyaWJ1dG9yc0ZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZIb2xkaW5nQ29udHJpYnV0b3I+PjtcbiAgICBwdWJsaWMgZ2V0SG9sZGluZ0NvbnRyaWJ1dG9yc0ZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRIb2xkaW5nQ29udHJpYnV0b3JzRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0SG9sZGluZ0NvbnRyaWJ1dG9yc0ZvckZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaG9sZGluZ0lkID0gcmVxdWVzdFBhcmFtZXRlcnM/LmhvbGRpbmdJZDtcbiAgICAgICAgaWYgKGhvbGRpbmdJZCA9PT0gbnVsbCB8fCBob2xkaW5nSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgaG9sZGluZ0lkIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0SG9sZGluZ0NvbnRyaWJ1dG9yc0ZvckZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0SG9sZGluZ0NvbnRyaWJ1dG9yc0ZvckZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVIaXN0b3JpYyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5pbmNsdWRlSGlzdG9yaWM7XG4gICAgICAgIGNvbnN0IHRheExvdElkID0gcmVxdWVzdFBhcmFtZXRlcnM/LnRheExvdElkO1xuICAgICAgICBjb25zdCBpbmNsdWRlVW5zZXR0bGVkTW92ZW1lbnRzID0gcmVxdWVzdFBhcmFtZXRlcnM/LmluY2x1ZGVVbnNldHRsZWRNb3ZlbWVudHM7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpbmNsdWRlSGlzdG9yaWMgIT09IHVuZGVmaW5lZCAmJiBpbmNsdWRlSGlzdG9yaWMgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5pbmNsdWRlSGlzdG9yaWMsICdpbmNsdWRlSGlzdG9yaWMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGF4TG90SWQgIT09IHVuZGVmaW5lZCAmJiB0YXhMb3RJZCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnRheExvdElkLCAndGF4TG90SWQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZVVuc2V0dGxlZE1vdmVtZW50cyAhPT0gdW5kZWZpbmVkICYmIGluY2x1ZGVVbnNldHRsZWRNb3ZlbWVudHMgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5pbmNsdWRlVW5zZXR0bGVkTW92ZW1lbnRzLCAnaW5jbHVkZVVuc2V0dGxlZE1vdmVtZW50cycpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2hvbGRpbmdzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImhvbGRpbmdJZFwiLCB2YWx1ZTogaG9sZGluZ0lkLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwibnVtYmVyXCIsIGRhdGFGb3JtYXQ6IFwiaW50NjRcIn0pfS9jb250cmlidXRvcnNgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZIb2xkaW5nQ29udHJpYnV0b3I+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldEhvbGRpbmdzRm9yRnVuZDogR2V0IGhvbGRpbmdzIGZvciB0cmFuc2FjdGlvbiBwb3J0Zm9saW9zIGluIGEgRnVuZC5cbiAgICAgKiBHZXQgdGhlIGhvbGRpbmdzIG9mIHRyYW5zYWN0aW9uIHBvcnRmb2xpb3MgaW4gYSBzcGVjaWZpZWQgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SG9sZGluZ3NGb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0SG9sZGluZ3NGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZlcnNpb25lZFJlc291cmNlTGlzdE9mUG9ydGZvbGlvSG9sZGluZz47XG4gICAgcHVibGljIGdldEhvbGRpbmdzRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEhvbGRpbmdzRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZlcnNpb25lZFJlc291cmNlTGlzdE9mUG9ydGZvbGlvSG9sZGluZz4+O1xuICAgIHB1YmxpYyBnZXRIb2xkaW5nc0ZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRIb2xkaW5nc0ZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZQb3J0Zm9saW9Ib2xkaW5nPj47XG4gICAgcHVibGljIGdldEhvbGRpbmdzRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEhvbGRpbmdzRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEhvbGRpbmdzRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEhvbGRpbmdzRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHNpbmdsZVZhbHVhdGlvblBvaW50UXVlcnlQYXJhbWV0ZXJzID09PSBudWxsIHx8IHNpbmdsZVZhbHVhdGlvblBvaW50UXVlcnlQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNpbmdsZVZhbHVhdGlvblBvaW50UXVlcnlQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0SG9sZGluZ3NGb3JGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG4gICAgICAgIGNvbnN0IGJ5VGF4bG90cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5ieVRheGxvdHM7XG4gICAgICAgIGNvbnN0IGluY2x1ZGVTZXR0bGVtZW50RXZlbnRzQWZ0ZXJEYXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LmluY2x1ZGVTZXR0bGVtZW50RXZlbnRzQWZ0ZXJEYXlzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgcHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJvcGVydHlLZXlzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChieVRheGxvdHMgIT09IHVuZGVmaW5lZCAmJiBieVRheGxvdHMgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5ieVRheGxvdHMsICdieVRheGxvdHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZVNldHRsZW1lbnRFdmVudHNBZnRlckRheXMgIT09IHVuZGVmaW5lZCAmJiBpbmNsdWRlU2V0dGxlbWVudEV2ZW50c0FmdGVyRGF5cyAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmluY2x1ZGVTZXR0bGVtZW50RXZlbnRzQWZ0ZXJEYXlzLCAnaW5jbHVkZVNldHRsZW1lbnRFdmVudHNBZnRlckRheXMnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyRob2xkaW5nc2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZlBvcnRmb2xpb0hvbGRpbmc+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBzaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gR2V0VmFsdWF0aW9uRm9yRnVuZDogUGVyZm9ybSB2YWx1YXRpb24gZm9yIGEgRnVuZC5cbiAgICAgKiBQZXJmb3JtIHZhbHVhdGlvbiBvbiBhIHNwZWNpZmllZCBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Gb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxMaXN0QWdncmVnYXRpb25SZXNwb25zZT47XG4gICAgcHVibGljIGdldFZhbHVhdGlvbkZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Gb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8TGlzdEFnZ3JlZ2F0aW9uUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvbkZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8TGlzdEFnZ3JlZ2F0aW9uUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvbkZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Gb3JGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcbiAgICAgICAgY29uc3QgZnVuZFZhbHVhdGlvblJlcXVlc3QgPSByZXF1ZXN0UGFyYW1ldGVycz8uZnVuZFZhbHVhdGlvblJlcXVlc3Q7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR2YWx1YXRpb25gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8TGlzdEFnZ3JlZ2F0aW9uUmVzcG9uc2U+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBmdW5kVmFsdWF0aW9uUmVxdWVzdCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gR2V0VmFsdWF0aW9uUG9pbnREYXRhOiBHZXQgVmFsdWF0aW9uIFBvaW50IERhdGEgZm9yIGEgRnVuZC5cbiAgICAgKiBSZXRyaWV2ZXMgdGhlIFZhbHVhdGlvbiBQb2ludCBkYXRhIGJldHdlZW4gZ2l2ZW4gZGF0ZXMgb3IgVmFsdWF0aW9uIFBvaW50IGNvZGVzLiAgVGhlIGVuZHBvaW50IHdpbGwgaW50ZXJuYWxseSBleHRyYWN0IGFsbCBcXCYjMzk7QXNzZXRzXFwmIzM5OyBhbmQgXFwmIzM5O0xpYWJpbGl0aWVzXFwmIzM5OyBmcm9tIHRoZSBGdW5kXFwmIzM5O3MgVHJpYWwgYmFsYW5jZSB0byBwcm9kdWNlIGEgR0FWLiAgU3RhcnQgZGF0ZSB3aWxsIGJlIGFzc3VtZWQgZnJvbSB0aGUgbGFzdCBcXCYjMzk7b2ZmaWNpYWxcXCYjMzk7IFZhbHVhdGlvblBvaW50IGFuZCBFbmREYXRlIHdpbGwgYmUgYXMgcHJvdmlkZWQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50RGF0YShyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludERhdGFSZXNwb25zZT47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50RGF0YShyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZhbHVhdGlvblBvaW50RGF0YVJlc3BvbnNlPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50RGF0YShyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxWYWx1YXRpb25Qb2ludERhdGFSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludERhdGEocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludERhdGEuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludERhdGEuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnREYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzLyRxdWVyeWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWYWx1YXRpb25Qb2ludERhdGFSZXNwb25zZT4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gR2V0VmFsdWF0aW9uUG9pbnRKb3VybmFsRW50cnlMaW5lczogR2V0IHRoZSBKb3VybmFsIEVudHJ5IExpbmVzIGZvciB0aGUgZ2l2ZW4gRnVuZC5cbiAgICAgKiBHZXRzIHRoZSBKb3VybmFsIEVudHJ5IExpbmVzIGZvciB0aGUgZ2l2ZW4gVmFsdWF0aW9uIFBvaW50IGZvciBhIEZ1bmQuICAgICAgICAgICAgICAgIFRoZSBKb3VybmFsIEVudHJ5IExpbmVzIGhhdmUgYmVlbiBnZW5lcmF0ZWQgZnJvbSB0cmFuc2FjdGlvbnMsIHRyYW5zbGF0ZWQgdmlhIHBvc3RpbmcgcnVsZXMgYW5kIHVzZWQgaW4gdGhlIHZhbHVhdGlvbiBwb2ludC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRKb3VybmFsRW50cnlMaW5lcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRKb3VybmFsRW50cnlMaW5lPjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRKb3VybmFsRW50cnlMaW5lcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mRnVuZEpvdXJuYWxFbnRyeUxpbmU+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRKb3VybmFsRW50cnlMaW5lcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRKb3VybmFsRW50cnlMaW5lPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludEpvdXJuYWxFbnRyeUxpbmVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRKb3VybmFsRW50cnlMaW5lcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRKb3VybmFsRW50cnlMaW5lcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlO1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuICAgICAgICBjb25zdCBidWNrZXRTZXRDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmJ1Y2tldFNldENvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlICE9PSB1bmRlZmluZWQgJiYgZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+Z2VuZXJhbExlZGdlclByb2ZpbGVDb2RlLCAnZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXlzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUtleXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcm9wZXJ0eUtleXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGJ1Y2tldFNldENvZGUgIT09IHVuZGVmaW5lZCAmJiBidWNrZXRTZXRDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YnVja2V0U2V0Q29kZSwgJ2J1Y2tldFNldENvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy9qb3VybmFsZW50cnlsaW5lcy8kcXVlcnlgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRKb3VybmFsRW50cnlMaW5lPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBHZXRWYWx1YXRpb25Qb2ludFBubFN1bW1hcnk6IEdldCBhIFBuTCBzdW1tYXJ5IGZvciB0aGUgZ2l2ZW4gVmFsdWF0aW9uIFBvaW50IGluIHRoZSBGdW5kLlxuICAgICAqIEdldHMgdGhlIFBuTCBTdW1tYXJ5IGxpbmVzIGZyb20gdGhlIEpvdXJuYWwgRW50cnkgTGluZXMgcHJvZHVjZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgVmFsdWF0aW9uIFBvaW50LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFBubFN1bW1hcnkocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFBubFN1bW1hcnlSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZlBubEpvdXJuYWxFbnRyeUxpbmU+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFBubFN1bW1hcnkocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFBubFN1bW1hcnlSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mUG5sSm91cm5hbEVudHJ5TGluZT4+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFBubFN1bW1hcnkocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFBubFN1bW1hcnlSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZlBubEpvdXJuYWxFbnRyeUxpbmU+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5KHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50UG5sU3VtbWFyeS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlO1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZSAhPT0gdW5kZWZpbmVkICYmIGdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZSwgJ2dlbmVyYWxMZWRnZXJQcm9maWxlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvcG5sc3VtbWFyeS8kcXVlcnlgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZlBubEpvdXJuYWxFbnRyeUxpbmU+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldFZhbHVhdGlvblBvaW50UXVvdGVzOiBHZXQgdGhlIFF1b3RlcyBmb3IgdGhlIGdpdmVuIEZ1bmQgYW5kIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBHZXRzIGFsbCBxdW90ZXMgd2l0aGluIHRoZSBlZmZlY3RpdmUgZGF0ZSByYW5nZSBvZiB0aGUgc3BlY2lmaWVkIFZhbHVhdGlvbiBQb2ludCBmb3IgYSBGdW5kLCAgaW5jbHVkaW5nIGFueSBxdW90ZXMgYWRkZWQgdmlhIGEgQ29tcGxleCBDbG9zZSAoUG9zdC1DbG9zZSBBY3Rpdml0eSkuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50UXVvdGVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRRdW90ZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZFF1b3RlPjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRRdW90ZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFF1b3Rlc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRRdW90ZT4+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFF1b3RlcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50UXVvdGVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRRdW90ZT4+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFF1b3RlcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50UXVvdGVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRRdW90ZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludFF1b3Rlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSBudWxsIHx8IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludFF1b3Rlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzL3F1b3Rlcy8kcXVlcnlgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZFF1b3RlPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBHZXRWYWx1YXRpb25Qb2ludFRyYW5zYWN0aW9uczogR2V0IHRoZSBUcmFuc2FjdGlvbnMgZm9yIHRoZSBnaXZlbiBGdW5kLlxuICAgICAqIEdldHMgdGhlIFRyYW5zYWN0aW9ucyBmb3IgdGhlIGdpdmVuIFZhbHVhdGlvbiBQb2ludCBmb3IgYSBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFRyYW5zYWN0aW9ucyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50VHJhbnNhY3Rpb25zUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRUcmFuc2FjdGlvbj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50VHJhbnNhY3Rpb25zKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkVHJhbnNhY3Rpb24+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFRyYW5zYWN0aW9uc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkVHJhbnNhY3Rpb24+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFRyYW5zYWN0aW9uc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50VHJhbnNhY3Rpb25zLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJvcGVydHlLZXlzO1xuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcbiAgICAgICAgY29uc3QgZGF0YU1vZGVsU2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZGF0YU1vZGVsU2NvcGU7XG4gICAgICAgIGNvbnN0IGRhdGFNb2RlbENvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZGF0YU1vZGVsQ29kZTtcbiAgICAgICAgY29uc3Qgc2hvd0NhbmNlbGxlZFRyYW5zYWN0aW9ucyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zaG93Q2FuY2VsbGVkVHJhbnNhY3Rpb25zO1xuICAgICAgICBjb25zdCBtZW1iZXJzaGlwVHlwZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5tZW1iZXJzaGlwVHlwZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgcHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJvcGVydHlLZXlzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhTW9kZWxTY29wZSAhPT0gdW5kZWZpbmVkICYmIGRhdGFNb2RlbFNjb3BlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZGF0YU1vZGVsU2NvcGUsICdkYXRhTW9kZWxTY29wZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXRhTW9kZWxDb2RlICE9PSB1bmRlZmluZWQgJiYgZGF0YU1vZGVsQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmRhdGFNb2RlbENvZGUsICdkYXRhTW9kZWxDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNob3dDYW5jZWxsZWRUcmFuc2FjdGlvbnMgIT09IHVuZGVmaW5lZCAmJiBzaG93Q2FuY2VsbGVkVHJhbnNhY3Rpb25zICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+c2hvd0NhbmNlbGxlZFRyYW5zYWN0aW9ucywgJ3Nob3dDYW5jZWxsZWRUcmFuc2FjdGlvbnMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobWVtYmVyc2hpcFR5cGUgIT09IHVuZGVmaW5lZCAmJiBtZW1iZXJzaGlwVHlwZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm1lbWJlcnNoaXBUeXBlLCAnbWVtYmVyc2hpcFR5cGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy90cmFuc2FjdGlvbnMvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRUcmFuc2FjdGlvbj4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gR2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2U6IEdldCBUcmlhbCBCYWxhbmNlIGZvciB0aGUgZ2l2ZW4gRnVuZC5cbiAgICAgKiBHZXRzIHRoZSBUcmlhbCBCYWxhbmNlIGZvciB0aGUgZ2l2ZW4gVmFsdWF0aW9uIFBvaW50IGZvciBhIEZ1bmQuICAgICAgICAgICAgICAgIFRoZSBUcmlhbCBCYWxhbmNlIGhhcyBiZWVuIGdlbmVyYXRlZCBmcm9tIHRyYW5zYWN0aW9ucywgdHJhbnNsYXRlZCB2aWEgUG9zdGluZyBSdWxlcyAgYW5kIGFnZ3JlZ2F0ZWQgYmFzZWQgb24gYSBHZW5lcmFsIExlZGdlciBQcm9maWxlICh3aGVyZSBzcGVjaWZpZWQpLiAgICAgICAgICAgICAgICBTdXBwbHlpbmcgdGhlIFgtTFVTSUQtU3VwcHJlc3NJbWJhbGFuY2VWYWxpZGF0aW9uIGhlYWRlciBzdXBwcmVzc2VzIHRoZSBpbWJhbGFuY2UgY2hlY2suICBBbnkgY2FsbGVyIHdpdGggYWNjZXNzIHRvIHRoaXMgZW5kcG9pbnQgbWF5IHVzZSBpdDsgaXQgaXMgbm90IHJvbGUtcmVzdHJpY3RlZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2UocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFRyaWFsQmFsYW5jZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mVHJpYWxCYWxhbmNlPjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2UocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFRyaWFsQmFsYW5jZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZUcmlhbEJhbGFuY2U+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2UocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFRyaWFsQmFsYW5jZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mVHJpYWxCYWxhbmNlPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50VHJpYWxCYWxhbmNlKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2VSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludFRyaWFsQmFsYW5jZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50VHJpYWxCYWxhbmNlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50VHJpYWxCYWxhbmNlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5nZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGU7XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbHRlcjtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByb3BlcnR5S2V5cztcbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG4gICAgICAgIGNvbnN0IGV4Y2x1ZGVDbGVhcmRvd25Nb2R1bGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZXhjbHVkZUNsZWFyZG93bk1vZHVsZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5nZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUsICdnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5maWx0ZXIsICdmaWx0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXhjbHVkZUNsZWFyZG93bk1vZHVsZSAhPT0gdW5kZWZpbmVkICYmIGV4Y2x1ZGVDbGVhcmRvd25Nb2R1bGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5leGNsdWRlQ2xlYXJkb3duTW9kdWxlLCAnZXhjbHVkZUNsZWFyZG93bk1vZHVsZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzL3RyaWFsYmFsYW5jZS8kcXVlcnlgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZlRyaWFsQmFsYW5jZT4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gR2V0VmFsdWF0aW9uUG9pbnRVbnNldHRsZWRUcmFuc2FjdGlvbnM6IEdldCBVbnNldHRsZWQgVHJhbnNhY3Rpb25zIGZvciB0aGUgZ2l2ZW4gRnVuZC5cbiAgICAgKiBHZXRzIGFsbCB0cmFuc2FjdGlvbnMgdGhhdCByZW1haW4gdW5zZXR0bGVkIGFzIGF0IHRoZSBzcGVjaWZpZWQgVmFsdWF0aW9uIFBvaW50IGZvciBhIEZ1bmQsICBsb29raW5nIGJhY2sgZnJvbSBpbmNlcHRpb24uIFNldHRsZW1lbnQgc3RhdHVzIGlzIHBvaW50LWluLXRpbWU6IHBvc3QtY3V0b2ZmIHNldHRsZW1lbnQgIGFjdGl2aXR5IGRvZXMgbm90IGFsdGVyIHRoZSByZXN1bHQuICBUaGUgVmFsdWF0aW9uIFBvaW50IG11c3QgYmUgaWRlbnRpZmllZCBlaXRoZXIgYnkgdGhlIGRhdGUgb3IgZGlhcnlFbnRyeSBxdWVyeSBwYXJhbWV0ZXJzIG9yIGJ5IHRoZSBcXCYjMzk7RW5kXFwmIzM5OyBwYXJhbWV0ZXIgaW4gdGhlICByZXF1ZXN0IGJvZHk7IHdoZW4gYm90aCBhcmUgc3VwcGxpZWQgdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgYXJlIHVzZWQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50VW5zZXR0bGVkVHJhbnNhY3Rpb25zKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRVbnNldHRsZWRUcmFuc2FjdGlvbnNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZlVuc2V0dGxlZFRyYW5zYWN0aW9uPjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRVbnNldHRsZWRUcmFuc2FjdGlvbnMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFVuc2V0dGxlZFRyYW5zYWN0aW9uc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZVbnNldHRsZWRUcmFuc2FjdGlvbj4+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFVuc2V0dGxlZFRyYW5zYWN0aW9ucyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50VW5zZXR0bGVkVHJhbnNhY3Rpb25zUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZVbnNldHRsZWRUcmFuc2FjdGlvbj4+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFVuc2V0dGxlZFRyYW5zYWN0aW9ucyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50VW5zZXR0bGVkVHJhbnNhY3Rpb25zUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRVbnNldHRsZWRUcmFuc2FjdGlvbnMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludFVuc2V0dGxlZFRyYW5zYWN0aW9ucy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuICAgICAgICBjb25zdCBkYXRlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmRhdGU7XG4gICAgICAgIGNvbnN0IGRpYXJ5RW50cnkgPSByZXF1ZXN0UGFyYW1ldGVycz8uZGlhcnlFbnRyeTtcbiAgICAgICAgY29uc3QgdmFyaWFudCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YXJpYW50O1xuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5kYXRlLCAnZGF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWFyeUVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZGlhcnlFbnRyeSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmRpYXJ5RW50cnksICdkaWFyeUVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhcmlhbnQgIT09IHVuZGVmaW5lZCAmJiB2YXJpYW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dmFyaWFudCwgJ3ZhcmlhbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy91bnNldHRsZWR0cmFuc2FjdGlvbnMvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZVbnNldHRsZWRUcmFuc2FjdGlvbj4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gTGlzdEZlZXM6IExpc3QgRmVlcyBmb3IgYSBzcGVjaWZpZWQgRnVuZC5cbiAgICAgKiBMaXN0IGFsbCB0aGUgRmVlcyBtYXRjaGluZyBhIHBhcnRpY3VsYXIgY3JpdGVyaWEuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGxpc3RGZWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZlZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8UGFnZWRSZXNvdXJjZUxpc3RPZkZlZT47XG4gICAgcHVibGljIGxpc3RGZWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZlZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxQYWdlZFJlc291cmNlTGlzdE9mRmVlPj47XG4gICAgcHVibGljIGxpc3RGZWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZlZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8UGFnZWRSZXNvdXJjZUxpc3RPZkZlZT4+O1xuICAgIHB1YmxpYyBsaXN0RmVlcyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RGZWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdEZlZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0RmVlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZmZlY3RpdmVBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lZmZlY3RpdmVBdDtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBzb3J0QnkgPSByZXF1ZXN0UGFyYW1ldGVycz8uc29ydEJ5O1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJvcGVydHlLZXlzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUF0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5lZmZlY3RpdmVBdCwgJ2VmZmVjdGl2ZUF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5maWx0ZXIsICdmaWx0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc29ydEJ5KSB7XG4gICAgICAgICAgICBzb3J0QnkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdzb3J0QnknKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgcHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJvcGVydHlLZXlzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9mZWVzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFBhZ2VkUmVzb3VyY2VMaXN0T2ZGZWU+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBMaXN0RnVuZENhbGVuZGFyOiBMaXN0IEZ1bmQgQ2FsZW5kYXIuXG4gICAgICogTGlzdCBhbGwgdGhlIENhbGVuZGFyIEVudHJpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsaXN0RnVuZENhbGVuZGFyKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRDYWxlbmRhclJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxQYWdlZFJlc291cmNlTGlzdE9mRnVuZENhbGVuZGFyRW50cnk+O1xuICAgIHB1YmxpYyBsaXN0RnVuZENhbGVuZGFyKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRDYWxlbmRhclJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kQ2FsZW5kYXJFbnRyeT4+O1xuICAgIHB1YmxpYyBsaXN0RnVuZENhbGVuZGFyKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRDYWxlbmRhclJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxQYWdlZFJlc291cmNlTGlzdE9mRnVuZENhbGVuZGFyRW50cnk+PjtcbiAgICBwdWJsaWMgbGlzdEZ1bmRDYWxlbmRhcihyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RGdW5kQ2FsZW5kYXJSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0RnVuZENhbGVuZGFyLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdEZ1bmRDYWxlbmRhci4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IHNvcnRCeSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zb3J0Qnk7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0QnkpIHtcbiAgICAgICAgICAgIHNvcnRCeS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3NvcnRCeScpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXlzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUtleXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcm9wZXJ0eUtleXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2NhbGVuZGFyYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kQ2FsZW5kYXJFbnRyeT4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIExpc3RGdW5kQ2FsZW5kYXJFbnRyaWVzOiBMaXN0IEZ1bmQgQ2FsZW5kYXIgRW50cmllcy5cbiAgICAgKiBMaXN0IGFsbCB0aGUgQ2FsZW5kYXIgRW50cmllcyBhc3NvY2lhdGVkIHdpdGggdGhlIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGxpc3RGdW5kQ2FsZW5kYXJFbnRyaWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRDYWxlbmRhckVudHJpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8UGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmRDYWxlbmRhckVudHJpZXM+O1xuICAgIHB1YmxpYyBsaXN0RnVuZENhbGVuZGFyRW50cmllcyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RGdW5kQ2FsZW5kYXJFbnRyaWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8UGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmRDYWxlbmRhckVudHJpZXM+PjtcbiAgICBwdWJsaWMgbGlzdEZ1bmRDYWxlbmRhckVudHJpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RnVuZENhbGVuZGFyRW50cmllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxQYWdlZFJlc291cmNlTGlzdE9mRnVuZENhbGVuZGFyRW50cmllcz4+O1xuICAgIHB1YmxpYyBsaXN0RnVuZENhbGVuZGFyRW50cmllcyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RGdW5kQ2FsZW5kYXJFbnRyaWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdEZ1bmRDYWxlbmRhckVudHJpZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0RnVuZENhbGVuZGFyRW50cmllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IHNvcnRCeSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zb3J0Qnk7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0QnkpIHtcbiAgICAgICAgICAgIHNvcnRCeS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3NvcnRCeScpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXlzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUtleXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcm9wZXJ0eUtleXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2NhbGVuZGFyc2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxQYWdlZFJlc291cmNlTGlzdE9mRnVuZENhbGVuZGFyRW50cmllcz4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIExpc3RGdW5kczogTGlzdCBGdW5kcy5cbiAgICAgKiBMaXN0IGFsbCB0aGUgRnVuZHMgbWF0Y2hpbmcgcGFydGljdWxhciBjcml0ZXJpYS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGlzdEZ1bmRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kPjtcbiAgICBwdWJsaWMgbGlzdEZ1bmRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8UGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmQ+PjtcbiAgICBwdWJsaWMgbGlzdEZ1bmRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kPj47XG4gICAgcHVibGljIGxpc3RGdW5kcyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RGdW5kc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3QgZWZmZWN0aXZlQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZWZmZWN0aXZlQXQ7XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbHRlcjtcbiAgICAgICAgY29uc3Qgc29ydEJ5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNvcnRCeTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByb3BlcnR5S2V5cztcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChlZmZlY3RpdmVBdCAhPT0gdW5kZWZpbmVkICYmIGVmZmVjdGl2ZUF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZWZmZWN0aXZlQXQsICdlZmZlY3RpdmVBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvcnRCeSkge1xuICAgICAgICAgICAgc29ydEJ5LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAnc29ydEJ5Jyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kPignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gTGlzdE5hdkFjdGl2aXR5QWRqdXN0bWVudHM6IExpc3QgTkFWIGFkanVzdG1lbnQgYWN0aXZpdGllcyBhcHBsaWVkIHRvIGEgdmFsdWF0aW9uIHBvaW50XG4gICAgICogTGlzdHMgdGhlIE5BViBhZGp1c3RtZW50IGFjdGl2aXRpZXMgYXBwbGllZCB0byB0aGUgc3BlY2lmaWVkIHZhbHVhdGlvbiBwb2ludCBmb3IgYSBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsaXN0TmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3ROYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFJlc291cmNlTGlzdE9mTmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2U+O1xuICAgIHB1YmxpYyBsaXN0TmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3ROYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8UmVzb3VyY2VMaXN0T2ZOYXZBY3Rpdml0eUFkanVzdG1lbnRSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBsaXN0TmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3ROYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFJlc291cmNlTGlzdE9mTmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgbGlzdE5hdkFjdGl2aXR5QWRqdXN0bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0TmF2QWN0aXZpdHlBZGp1c3RtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGxpc3ROYXZBY3Rpdml0eUFkanVzdG1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdE5hdkFjdGl2aXR5QWRqdXN0bWVudHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnRDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50Q29kZTtcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZSA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludENvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnRDb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdE5hdkFjdGl2aXR5QWRqdXN0bWVudHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbHRlcjtcbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludENvZGVWYXJpYW50O1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVhdGlvblBvaW50Q29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnZhbHVhdGlvblBvaW50Q29kZSwgJ3ZhbHVhdGlvblBvaW50Q29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQgIT09IHVuZGVmaW5lZCAmJiB2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCwgJ3ZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vbmF2QWRqdXN0bWVudGA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxSZXNvdXJjZUxpc3RPZk5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlPignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gTGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGE6IExpc3QgdGhlIENvbXBsZXggTWFya2V0IERhdGEgZm9yIHRoZSBnaXZlbiBGdW5kIGFuZCBWYWx1YXRpb24gUG9pbnQuXG4gICAgICogTGlzdHMgYWxsIGNvbXBsZXggbWFya2V0IGRhdGEgd2l0aGluIHRoZSBlZmZlY3RpdmUgZGF0ZSByYW5nZSBvZiB0aGUgc3BlY2lmaWVkIFZhbHVhdGlvbiBQb2ludCBmb3IgYSBGdW5kLCAgaW5jbHVkaW5nIGFueSBpdGVtcyBhZGRlZCB2aWEgYSBDb21wbGV4IENsb3NlIChQb3N0LUNsb3NlIEFjdGl2aXR5KS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGEocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0VmFsdWF0aW9uUG9pbnRDb21wbGV4TWFya2V0RGF0YVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkQ29tcGxleE1hcmtldERhdGE+O1xuICAgIHB1YmxpYyBsaXN0VmFsdWF0aW9uUG9pbnRDb21wbGV4TWFya2V0RGF0YShyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RWYWx1YXRpb25Qb2ludENvbXBsZXhNYXJrZXREYXRhUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZENvbXBsZXhNYXJrZXREYXRhPj47XG4gICAgcHVibGljIGxpc3RWYWx1YXRpb25Qb2ludENvbXBsZXhNYXJrZXREYXRhKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGFSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZENvbXBsZXhNYXJrZXREYXRhPj47XG4gICAgcHVibGljIGxpc3RWYWx1YXRpb25Qb2ludENvbXBsZXhNYXJrZXREYXRhKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGFSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0VmFsdWF0aW9uUG9pbnRDb21wbGV4TWFya2V0RGF0YS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGxpc3RWYWx1YXRpb25Qb2ludENvbXBsZXhNYXJrZXREYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGxpc3RWYWx1YXRpb25Qb2ludENvbXBsZXhNYXJrZXREYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvY29tcGxleG1hcmtldGRhdGEvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRDb21wbGV4TWFya2V0RGF0YT4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gTGlzdFZhbHVhdGlvblBvaW50SW5zdHJ1bWVudHM6IExpc3QgSW5zdHJ1bWVudHMgaW5zaWRlIGEgdmFsdWF0aW9uIHBvaW50XG4gICAgICogTGlzdHMgdGhlIEluc3RydW1lbnRzIGxpbmtlZCB0byBUcmFuc2FjdGlvbnMgd2l0aGluIGEgVmFsdWF0aW9uIFBvaW50IGZvciBhIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGxpc3RWYWx1YXRpb25Qb2ludEluc3RydW1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdFZhbHVhdGlvblBvaW50SW5zdHJ1bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8UGFnZWRSZXNvdXJjZUxpc3RPZlZhbHVhdGlvblBvaW50SW5zdHJ1bWVudD47XG4gICAgcHVibGljIGxpc3RWYWx1YXRpb25Qb2ludEluc3RydW1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdFZhbHVhdGlvblBvaW50SW5zdHJ1bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxQYWdlZFJlc291cmNlTGlzdE9mVmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50Pj47XG4gICAgcHVibGljIGxpc3RWYWx1YXRpb25Qb2ludEluc3RydW1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdFZhbHVhdGlvblBvaW50SW5zdHJ1bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8UGFnZWRSZXNvdXJjZUxpc3RPZlZhbHVhdGlvblBvaW50SW5zdHJ1bWVudD4+O1xuICAgIHB1YmxpYyBsaXN0VmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RWYWx1YXRpb25Qb2ludEluc3RydW1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdFZhbHVhdGlvblBvaW50SW5zdHJ1bWVudHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0VmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludENvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnRDb2RlO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnRDb2RlID09PSBudWxsIHx8IHZhbHVhdGlvblBvaW50Q29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2YWx1YXRpb25Qb2ludENvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0VmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBzb3J0QnkgPSByZXF1ZXN0UGFyYW1ldGVycz8uc29ydEJ5O1xuICAgICAgICBjb25zdCBpbnN0cnVtZW50UHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/Lmluc3RydW1lbnRQcm9wZXJ0eUtleXM7XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudDtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludENvZGUgIT09IHVuZGVmaW5lZCAmJiB2YWx1YXRpb25Qb2ludENvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT52YWx1YXRpb25Qb2ludENvZGUsICd2YWx1YXRpb25Qb2ludENvZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0QnkpIHtcbiAgICAgICAgICAgIHNvcnRCeS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3NvcnRCeScpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5zdHJ1bWVudFByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgaW5zdHJ1bWVudFByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ2luc3RydW1lbnRQcm9wZXJ0eUtleXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQgIT09IHVuZGVmaW5lZCAmJiB2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCwgJ3ZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzL2luc3RydW1lbnRzLyRxdWVyeWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxQYWdlZFJlc291cmNlTGlzdE9mVmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50PignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gTGlzdFZhbHVhdGlvblBvaW50T3ZlcnZpZXc6IExpc3QgVmFsdWF0aW9uIFBvaW50cyBPdmVydmlldyBmb3IgYSBnaXZlbiBGdW5kLlxuICAgICAqIExpc3QgdGhlIG92ZXJ2aWV3IG9mIGFsbCB0aGUgVmFsdWF0aW9uIFBvaW50cyB0aGF0IG1hdGNoIHRoZSBnaXZlbiBjcml0ZXJpYSBmb3IgYSBnaXZlbiBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsaXN0VmFsdWF0aW9uUG9pbnRPdmVydmlldyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RWYWx1YXRpb25Qb2ludE92ZXJ2aWV3UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFBhZ2VkUmVzb3VyY2VMaXN0T2ZWYWx1YXRpb25Qb2ludE92ZXJ2aWV3PjtcbiAgICBwdWJsaWMgbGlzdFZhbHVhdGlvblBvaW50T3ZlcnZpZXcocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0VmFsdWF0aW9uUG9pbnRPdmVydmlld1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFBhZ2VkUmVzb3VyY2VMaXN0T2ZWYWx1YXRpb25Qb2ludE92ZXJ2aWV3Pj47XG4gICAgcHVibGljIGxpc3RWYWx1YXRpb25Qb2ludE92ZXJ2aWV3KHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdFZhbHVhdGlvblBvaW50T3ZlcnZpZXdSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8UGFnZWRSZXNvdXJjZUxpc3RPZlZhbHVhdGlvblBvaW50T3ZlcnZpZXc+PjtcbiAgICBwdWJsaWMgbGlzdFZhbHVhdGlvblBvaW50T3ZlcnZpZXcocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0VmFsdWF0aW9uUG9pbnRPdmVydmlld1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGxpc3RWYWx1YXRpb25Qb2ludE92ZXJ2aWV3LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdFZhbHVhdGlvblBvaW50T3ZlcnZpZXcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZWZmZWN0aXZlQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uZWZmZWN0aXZlQXQ7XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbHRlcjtcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByb3BlcnR5S2V5cztcbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZWZmZWN0aXZlQXQgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmVmZmVjdGl2ZUF0LCAnZWZmZWN0aXZlQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9uUG9pbnRPdmVydmlld2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxQYWdlZFJlc291cmNlTGlzdE9mVmFsdWF0aW9uUG9pbnRPdmVydmlldz4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIFBhdGNoRmVlOiBQYXRjaCBGZWUuXG4gICAgICogQ3JlYXRlIG9yIHVwZGF0ZSBjZXJ0YWluIGZpZWxkcyBmb3IgYSBwYXJ0aWN1bGFyIEZlZS4gIFRoZSBiZWhhdmlvdXIgaXMgZGVmaW5lZCBieSB0aGUgSlNPTiBQYXRjaCBzcGVjaWZpY2F0aW9uLiAgICBDdXJyZW50bHkgc3VwcG9ydGVkIGZpZWxkcyBhcmU6IEVuZERhdGUsIFNoYXJlQ2xhc3Nlcy5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGF0Y2hGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBQYXRjaEZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxGZWU+O1xuICAgIHB1YmxpYyBwYXRjaEZlZShyZXF1ZXN0UGFyYW1ldGVycz86IFBhdGNoRmVlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RmVlPj47XG4gICAgcHVibGljIHBhdGNoRmVlKHJlcXVlc3RQYXJhbWV0ZXJzPzogUGF0Y2hGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RmVlPj47XG4gICAgcHVibGljIHBhdGNoRmVlKHJlcXVlc3RQYXJhbWV0ZXJzPzogUGF0Y2hGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwYXRjaEZlZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBhdGNoRmVlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZlZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmVlQ29kZTtcbiAgICAgICAgaWYgKGZlZUNvZGUgPT09IG51bGwgfHwgZmVlQ29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmZWVDb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcGF0Y2hGZWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3BlcmF0aW9uID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm9wZXJhdGlvbjtcbiAgICAgICAgaWYgKG9wZXJhdGlvbiA9PT0gbnVsbCB8fCBvcGVyYXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgb3BlcmF0aW9uIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcGF0Y2hGZWUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9mZWVzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImZlZUNvZGVcIiwgdmFsdWU6IGZlZUNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZlZT4oJ3BhdGNoJywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBvcGVyYXRpb24sXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBQYXRjaEZ1bmQ6IFBhdGNoIGEgRnVuZC5cbiAgICAgKiBVcGRhdGUgZmllbGRzIG9uIGEgRnVuZC4gIFRoZSBiZWhhdmlvdXIgaXMgZGVmaW5lZCBieSB0aGUgSlNPTiBQYXRjaCBzcGVjaWZpY2F0aW9uLiAgICBDdXJyZW50bHkgc3VwcG9ydGVkIGZpZWxkcyBhcmU6IERpc3BsYXlOYW1lLCBEZXNjcmlwdGlvbiwgQmFzZUN1cnJlbmN5LCBQb3J0Zm9saW9JZHMsIEZ1bmRDb25maWd1cmF0aW9uSWQsIFNoYXJlQ2xhc3NJbnN0cnVtZW50cywgVHlwZSwgSW5jZXB0aW9uRGF0ZSwgRGVjaW1hbFBsYWNlcywgUHJpbWFyeU5hdlR5cGUsIEFkZGl0aW9uYWxOYXZUeXBlcywgQWJvcklkLCBZZWFyRW5kRGF0ZS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcGF0Y2hGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogUGF0Y2hGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZ1bmQ+O1xuICAgIHB1YmxpYyBwYXRjaEZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBQYXRjaEZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGdW5kPj47XG4gICAgcHVibGljIHBhdGNoRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IFBhdGNoRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxGdW5kPj47XG4gICAgcHVibGljIHBhdGNoRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IFBhdGNoRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBhdGNoRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBhdGNoRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSByZXF1ZXN0UGFyYW1ldGVycz8ub3BlcmF0aW9uO1xuICAgICAgICBpZiAob3BlcmF0aW9uID09PSBudWxsIHx8IG9wZXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBvcGVyYXRpb24gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwYXRjaEZ1bmQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGdW5kPigncGF0Y2gnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IG9wZXJhdGlvbixcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtERVBSRUNBVEVEXSBRdWVyeUNhc2hTdGF0ZW1lbnQ6IFtERVBSRUNBVEVEXSBRdWVyeUNhc2hTdGF0ZW1lbnQ6IFF1ZXJ5IGNhc2ggc3RhdGVtZW50IGZvciBhIEZ1bmQgdmFsdWF0aW9uIHBvaW50LlxuICAgICAqIERlcHJlY2F0ZWQ6IHVzZSBRdWVyeUNhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5IGluc3RlYWQuIFJldHVybnMgc2V0dGxlZCBjYXNoIG1vdmVtZW50cyB3aXRoICBydW5uaW5nIGJhbGFuY2UsIGNvc3QgYmFzaXMsIGF2ZXJhZ2UgRlggcmF0ZSwgYW5kIHJlYWxpc2VkIEZYIFBuTCBmb3IgdGhlIHNwZWNpZmllZCBGdW5kICB2YWx1YXRpb24gcG9pbnQgcGVyaW9kLiBUaGUgY2FzaCBzdGF0ZW1lbnQgaXMgZGVyaXZlZCBmcm9tIEpvdXJuYWwgRW50cnkgTGluZXMgZmlsdGVyZWQgdG8gIHNldHRsZWQgY2FzaCAoSG9sZFR5cGUmI3gzRDtcXCYjMzk7QlxcJiMzOTssIFNvdXJjZVR5cGUmI3gzRDtMdXNpZFRyYW5zYWN0aW9uKS4gVXNlIHRoZSBEaXNwbGF5TW9kZSBwYXJhbWV0ZXIgb24gdGhlICByZXF1ZXN0IGJvZHkgdG8gY2hvb3NlIGJldHdlZW4gU2hvd1JldmVyc2FsIChmdWxsIHJldmVyc2FsL1RydWVVcCBkZXRhaWwpIGFuZCBDb25zb2xpZGF0ZWQgIChjb2xsYXBzZXMgcmV2ZXJzYWxzIGludG8gQXZnUmF0ZUNvcnJlY3Rpb24gcm93cykuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHF1ZXJ5Q2FzaFN0YXRlbWVudChyZXF1ZXN0UGFyYW1ldGVycz86IFF1ZXJ5Q2FzaFN0YXRlbWVudFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mRnVuZENhc2hTdGF0ZW1lbnRSb3c+O1xuICAgIHB1YmxpYyBxdWVyeUNhc2hTdGF0ZW1lbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBRdWVyeUNhc2hTdGF0ZW1lbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mRnVuZENhc2hTdGF0ZW1lbnRSb3c+PjtcbiAgICBwdWJsaWMgcXVlcnlDYXNoU3RhdGVtZW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogUXVlcnlDYXNoU3RhdGVtZW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kQ2FzaFN0YXRlbWVudFJvdz4+O1xuICAgIHB1YmxpYyBxdWVyeUNhc2hTdGF0ZW1lbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBRdWVyeUNhc2hTdGF0ZW1lbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBxdWVyeUNhc2hTdGF0ZW1lbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBxdWVyeUNhc2hTdGF0ZW1lbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXVlcnlGdW5kQ2FzaFN0YXRlbWVudFBhcmFtZXRlcnMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucXVlcnlGdW5kQ2FzaFN0YXRlbWVudFBhcmFtZXRlcnM7XG4gICAgICAgIGlmIChxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyA9PT0gbnVsbCB8fCBxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHF1ZXJ5Q2FzaFN0YXRlbWVudC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXlzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUtleXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcm9wZXJ0eUtleXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvY2FzaHN0YXRlbWVudC8kcXVlcnlgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRDYXNoU3RhdGVtZW50Um93PigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcXVlcnlGdW5kQ2FzaFN0YXRlbWVudFBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIFF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3k6IFtFWFBFUklNRU5UQUxdIFF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3k6IFF1ZXJ5IHRoZSBsb2NhbC1jdXJyZW5jeSBjYXNoIHN0YXRlbWVudCBmb3IgYSBGdW5kIHZhbHVhdGlvbiBwb2ludC5cbiAgICAgKiBSZXR1cm5zIHNldHRsZWQgY2FzaCBtb3ZlbWVudHMgd2l0aCBhIHJ1bm5pbmcgYmFsYW5jZSBpbiBsb2NhbCBjdXJyZW5jeSBmb3IgdGhlIHNwZWNpZmllZCBGdW5kICB2YWx1YXRpb24gcG9pbnQgcGVyaW9kLiBUaGUgY2FzaCBzdGF0ZW1lbnQgaXMgZGVyaXZlZCBmcm9tIEpvdXJuYWwgRW50cnkgTGluZXMgZmlsdGVyZWQgdG8gIHNldHRsZWQgY2FzaCAoSG9sZFR5cGUmI3gzRDtcXCYjMzk7QlxcJiMzOTssIFNvdXJjZVR5cGUmI3gzRDtMdXNpZFRyYW5zYWN0aW9uKS4gVXNlIHRoZSBEaXNwbGF5TW9kZSBwYXJhbWV0ZXIgb24gdGhlICByZXF1ZXN0IGJvZHkgdG8gY2hvb3NlIGJldHdlZW4gU2hvd1JldmVyc2FsIChmdWxsIHJldmVyc2FsL1RydWVVcCBkZXRhaWwpIGFuZCBDb25zb2xpZGF0ZWQgIChjb2xsYXBzZXMgc3lzdGVtLWdlbmVyYXRlZCB6ZXJvLW5ldCByZXZlcnNhbC9UcnVlVXAgcGFpcnMgaW50byBTeXN0ZW1Db3JyZWN0aW9uIHJvd3MpLiBCYXNlICBjdXJyZW5jeSBjb2x1bW5zIGFyZSBvdXQgb2Ygc2NvcGUgZm9yIHRoaXMgdmFyaWFudCBhbmQgYXJlIG5vdCByZXR1cm5lZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeShyZXF1ZXN0UGFyYW1ldGVycz86IFF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3lSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeT47XG4gICAgcHVibGljIHF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3kocmVxdWVzdFBhcmFtZXRlcnM/OiBRdWVyeUNhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeT4+O1xuICAgIHB1YmxpYyBxdWVyeUNhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5KHJlcXVlc3RQYXJhbWV0ZXJzPzogUXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mRnVuZENhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5Pj47XG4gICAgcHVibGljIHF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3kocmVxdWVzdFBhcmFtZXRlcnM/OiBRdWVyeUNhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3kuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcXVlcnlGdW5kQ2FzaFN0YXRlbWVudFBhcmFtZXRlcnMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucXVlcnlGdW5kQ2FzaFN0YXRlbWVudFBhcmFtZXRlcnM7XG4gICAgICAgIGlmIChxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyA9PT0gbnVsbCB8fCBxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3kuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJvcGVydHlLZXlzO1xuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgcHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJvcGVydHlLZXlzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzL2Nhc2hzdGF0ZW1lbnRsb2NhbGN1cnJlbmN5LyRxdWVyeWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mRnVuZENhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5PigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcXVlcnlGdW5kQ2FzaFN0YXRlbWVudFBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIFJldmVydFZhbHVhdGlvblBvaW50VG9Fc3RpbWF0ZTogUmV2ZXJ0cyBhIEZpbmFsIFZhbHVhdGlvbiBQb2ludCB0byBFc3RpbWF0ZS5cbiAgICAgKiBNb3ZlcyBhIFxcJiMzOTtGaW5hbFxcJiMzOTsgc3RhdHVzIFZhbHVhdGlvbiBQb2ludCB0byBzdGF0dXMgXFwmIzM5O0VzdGltYXRlXFwmIzM5Oy5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlKHJlcXVlc3RQYXJhbWV0ZXJzPzogUmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50RGF0YVJlc3BvbnNlPjtcbiAgICBwdWJsaWMgcmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlKHJlcXVlc3RQYXJhbWV0ZXJzPzogUmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgcmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlKHJlcXVlc3RQYXJhbWV0ZXJzPzogUmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZhbHVhdGlvblBvaW50RGF0YVJlc3BvbnNlPj47XG4gICAgcHVibGljIHJldmVydFZhbHVhdGlvblBvaW50VG9Fc3RpbWF0ZShyZXF1ZXN0UGFyYW1ldGVycz86IFJldmVydFZhbHVhdGlvblBvaW50VG9Fc3RpbWF0ZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHJldmVydFZhbHVhdGlvblBvaW50VG9Fc3RpbWF0ZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHJldmVydFZhbHVhdGlvblBvaW50VG9Fc3RpbWF0ZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXZlcnRWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnJldmVydFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3Q7XG4gICAgICAgIGlmIChyZXZlcnRWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0ID09PSBudWxsIHx8IHJldmVydFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcmV2ZXJ0VmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHJldmVydFZhbHVhdGlvblBvaW50VG9Fc3RpbWF0ZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzLyRyZXZlcnR0b2VzdGltYXRlYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50RGF0YVJlc3BvbnNlPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcmV2ZXJ0VmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gU2V0U2hhcmVDbGFzc0luc3RydW1lbnRzOiBTZXQgdGhlIFNoYXJlQ2xhc3MgSW5zdHJ1bWVudHMgb24gYSBGdW5kLlxuICAgICAqIFVwZGF0ZSB0aGUgU2hhcmVDbGFzcyBJbnN0cnVtZW50cyBvbiBhbiBleGlzdGluZyBGdW5kIHdpdGggdGhlIHNldCBvZiBpbnN0cnVtZW50cyBwcm92aWRlZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgc2V0U2hhcmVDbGFzc0luc3RydW1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogU2V0U2hhcmVDbGFzc0luc3RydW1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZ1bmQ+O1xuICAgIHB1YmxpYyBzZXRTaGFyZUNsYXNzSW5zdHJ1bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBTZXRTaGFyZUNsYXNzSW5zdHJ1bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGdW5kPj47XG4gICAgcHVibGljIHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IFNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxGdW5kPj47XG4gICAgcHVibGljIHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IFNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZXRTaGFyZUNsYXNzSW5zdHJ1bWVudHNSZXF1ZXN0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3Q7XG4gICAgICAgIGlmIChzZXRTaGFyZUNsYXNzSW5zdHJ1bWVudHNSZXF1ZXN0ID09PSBudWxsIHx8IHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2V0U2hhcmVDbGFzc0luc3RydW1lbnRzUmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50cy4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3NoYXJlY2xhc3Nlc2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGdW5kPigncHV0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBzZXRTaGFyZUNsYXNzSW5zdHJ1bWVudHNSZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gVXBkYXRlVmFsdWF0aW9uUG9pbnQ6IFVwZGF0ZSBhIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBVcGRhdGVzIGFuIGV4aXN0aW5nIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBVcGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludD47XG4gICAgcHVibGljIHVwZGF0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludD4+O1xuICAgIHB1YmxpYyB1cGRhdGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IFVwZGF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZhbHVhdGlvblBvaW50Pj47XG4gICAgcHVibGljIHVwZGF0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cGRhdGVWYWx1YXRpb25Qb2ludC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwZGF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy51cGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3Q7XG4gICAgICAgIGlmICh1cGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3QgPT09IG51bGwgfHwgdXBkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHVwZGF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHNgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnQ+KCdwdXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHVwZGF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gVXBzZXJ0Qm9va21hcms6IFVwc2VydCBhIGJvb2ttYXJrLlxuICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgdXBkYXRlIG9yIHVwc2VydCBhIEJvb2ttYXJrIGZvciB0aGUgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBzZXJ0Qm9va21hcmsocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnRCb29rbWFya1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxGdW5kQ2FsZW5kYXJFbnRyeT47XG4gICAgcHVibGljIHVwc2VydEJvb2ttYXJrKHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0Qm9va21hcmtSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGdW5kQ2FsZW5kYXJFbnRyeT4+O1xuICAgIHB1YmxpYyB1cHNlcnRCb29rbWFyayhyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydEJvb2ttYXJrUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZ1bmRDYWxlbmRhckVudHJ5Pj47XG4gICAgcHVibGljIHVwc2VydEJvb2ttYXJrKHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0Qm9va21hcmtSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cHNlcnRCb29rbWFyay4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydEJvb2ttYXJrLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwc2VydEZ1bmRCb29rbWFya1JlcXVlc3QgPSByZXF1ZXN0UGFyYW1ldGVycz8udXBzZXJ0RnVuZEJvb2ttYXJrUmVxdWVzdDtcbiAgICAgICAgaWYgKHVwc2VydEZ1bmRCb29rbWFya1JlcXVlc3QgPT09IG51bGwgfHwgdXBzZXJ0RnVuZEJvb2ttYXJrUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB1cHNlcnRGdW5kQm9va21hcmtSZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBzZXJ0Qm9va21hcmsuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2Jvb2ttYXJrc2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGdW5kQ2FsZW5kYXJFbnRyeT4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHVwc2VydEZ1bmRCb29rbWFya1JlcXVlc3QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIFVwc2VydERpYXJ5RW50cnlUeXBlVmFsdWF0aW9uUG9pbnQ6IFVwc2VydCBhIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBJbnNlcnQgdGhlIGVzdGltYXRlIFZhbHVhdGlvbiBQb2ludC4gICAgICAgICAgICAgICAgSWYgdGhlIFZhbHVhdGlvbiBQb2ludCBkb2VzIG5vdCBleGlzdCwgdGhpcyBtZXRob2Qgd2lsbCBjcmVhdGUgaXQgaW4gZXN0aW1hdGUgc3RhdGUuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHVwc2VydERpYXJ5RW50cnlUeXBlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnREaWFyeUVudHJ5VHlwZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPERpYXJ5RW50cnk+O1xuICAgIHB1YmxpYyB1cHNlcnREaWFyeUVudHJ5VHlwZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0RGlhcnlFbnRyeVR5cGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPERpYXJ5RW50cnk+PjtcbiAgICBwdWJsaWMgdXBzZXJ0RGlhcnlFbnRyeVR5cGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydERpYXJ5RW50cnlUeXBlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RGlhcnlFbnRyeT4+O1xuICAgIHB1YmxpYyB1cHNlcnREaWFyeUVudHJ5VHlwZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0RGlhcnlFbnRyeVR5cGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydERpYXJ5RW50cnlUeXBlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cHNlcnREaWFyeUVudHJ5VHlwZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVwc2VydFZhbHVhdGlvblBvaW50UmVxdWVzdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy51cHNlcnRWYWx1YXRpb25Qb2ludFJlcXVlc3Q7XG4gICAgICAgIGlmICh1cHNlcnRWYWx1YXRpb25Qb2ludFJlcXVlc3QgPT09IG51bGwgfHwgdXBzZXJ0VmFsdWF0aW9uUG9pbnRSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHVwc2VydFZhbHVhdGlvblBvaW50UmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydERpYXJ5RW50cnlUeXBlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50c2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxEaWFyeUVudHJ5PigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdXBzZXJ0VmFsdWF0aW9uUG9pbnRSZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBVcHNlcnRGZWVQcm9wZXJ0aWVzOiBVcHNlcnQgRmVlIHByb3BlcnRpZXMuXG4gICAgICogVXBkYXRlIG9yIGluc2VydCBvbmUgb3IgbW9yZSBwcm9wZXJ0aWVzIG9udG8gYSBzaW5nbGUgRmVlLiBBIHByb3BlcnR5IHdpbGwgYmUgdXBkYXRlZCBpZiBpdCAgYWxyZWFkeSBleGlzdHMgYW5kIGluc2VydGVkIGlmIGl0IGRvZXMgbm90LiBBbGwgcHJvcGVydGllcyBtdXN0IGJlIG9mIHRoZSBkb21haW4gXFwmIzM5O0ZlZVxcJiMzOTsuICAgICAgICAgICAgICAgIFVwc2VydGluZyBhIHByb3BlcnR5IHRoYXQgZXhpc3RzIGZvciBhbiBGZWUsIHdpdGggYSBudWxsIHZhbHVlLCB3aWxsIGRlbGV0ZSB0aGUgaW5zdGFuY2Ugb2YgdGhlIHByb3BlcnR5IGZvciB0aGF0IGdyb3VwLiAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIGhhdmUgYW4gJmx0O2kmZ3Q7ZWZmZWN0aXZlRnJvbSZsdDsvaSZndDsgZGF0ZXRpbWUgZm9yIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyB2YWxpZCwgYW5kIGFuICZsdDtpJmd0O2VmZmVjdGl2ZVVudGlsJmx0Oy9pJmd0OyAgZGF0ZXRpbWUgdW50aWwgd2hpY2ggdGhlIHByb3BlcnR5IGlzIHZhbGlkLiBOb3Qgc3VwcGx5aW5nIGFuICZsdDtpJmd0O2VmZmVjdGl2ZVVudGlsJmx0Oy9pJmd0OyBkYXRldGltZSByZXN1bHRzIGluIHRoZSBwcm9wZXJ0eSBiZWluZyAgdmFsaWQgaW5kZWZpbml0ZWx5LCBvciB1bnRpbCB0aGUgbmV4dCAmbHQ7aSZndDtlZmZlY3RpdmVGcm9tJmx0Oy9pJmd0OyBkYXRldGltZSBvZiB0aGUgcHJvcGVydHkuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHVwc2VydEZlZVByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnRGZWVQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZlZVByb3BlcnRpZXM+O1xuICAgIHB1YmxpYyB1cHNlcnRGZWVQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0RmVlUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZlZVByb3BlcnRpZXM+PjtcbiAgICBwdWJsaWMgdXBzZXJ0RmVlUHJvcGVydGllcyhyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydEZlZVByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RmVlUHJvcGVydGllcz4+O1xuICAgIHB1YmxpYyB1cHNlcnRGZWVQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0RmVlUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydEZlZVByb3BlcnRpZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cHNlcnRGZWVQcm9wZXJ0aWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZlZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmVlQ29kZTtcbiAgICAgICAgaWYgKGZlZUNvZGUgPT09IG51bGwgfHwgZmVlQ29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmZWVDb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBzZXJ0RmVlUHJvcGVydGllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXF1ZXN0Qm9keSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5yZXF1ZXN0Qm9keTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9mZWVzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImZlZUNvZGVcIiwgdmFsdWU6IGZlZUNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3Byb3BlcnRpZXMvJHVwc2VydGA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGZWVQcm9wZXJ0aWVzPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBVcHNlcnRGdW5kUHJvcGVydGllczogVXBzZXJ0IEZ1bmQgcHJvcGVydGllcy5cbiAgICAgKiBVcGRhdGUgb3IgaW5zZXJ0IG9uZSBvciBtb3JlIHByb3BlcnRpZXMgb250byBhIHNpbmdsZSBGdW5kLiBBIHByb3BlcnR5IHdpbGwgYmUgdXBkYXRlZCBpZiBpdCAgYWxyZWFkeSBleGlzdHMgYW5kIGluc2VydGVkIGlmIGl0IGRvZXMgbm90LiBBbGwgcHJvcGVydGllcyBtdXN0IGJlIG9mIHRoZSBkb21haW4gXFwmIzM5O0Z1bmRcXCYjMzk7LiAgICAgICAgICAgICAgICBVcHNlcnRpbmcgYSBwcm9wZXJ0eSB0aGF0IGV4aXN0cyBmb3IgYW4gRnVuZCwgd2l0aCBhIG51bGwgdmFsdWUsIHdpbGwgZGVsZXRlIHRoZSBpbnN0YW5jZSBvZiB0aGUgcHJvcGVydHkgZm9yIHRoYXQgZ3JvdXAuICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgaGF2ZSBhbiAmbHQ7aSZndDtlZmZlY3RpdmVGcm9tJmx0Oy9pJmd0OyBkYXRldGltZSBmb3Igd2hpY2ggdGhlIHByb3BlcnR5IGlzIHZhbGlkLCBhbmQgYW4gJmx0O2kmZ3Q7ZWZmZWN0aXZlVW50aWwmbHQ7L2kmZ3Q7ICBkYXRldGltZSB1bnRpbCB3aGljaCB0aGUgcHJvcGVydHkgaXMgdmFsaWQuIE5vdCBzdXBwbHlpbmcgYW4gJmx0O2kmZ3Q7ZWZmZWN0aXZlVW50aWwmbHQ7L2kmZ3Q7IGRhdGV0aW1lIHJlc3VsdHMgaW4gdGhlIHByb3BlcnR5IGJlaW5nICB2YWxpZCBpbmRlZmluaXRlbHksIG9yIHVudGlsIHRoZSBuZXh0ICZsdDtpJmd0O2VmZmVjdGl2ZUZyb20mbHQ7L2kmZ3Q7IGRhdGV0aW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBzZXJ0RnVuZFByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnRGdW5kUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxGdW5kUHJvcGVydGllcz47XG4gICAgcHVibGljIHVwc2VydEZ1bmRQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0RnVuZFByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGdW5kUHJvcGVydGllcz4+O1xuICAgIHB1YmxpYyB1cHNlcnRGdW5kUHJvcGVydGllcyhyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydEZ1bmRQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZ1bmRQcm9wZXJ0aWVzPj47XG4gICAgcHVibGljIHVwc2VydEZ1bmRQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0RnVuZFByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cHNlcnRGdW5kUHJvcGVydGllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydEZ1bmRQcm9wZXJ0aWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnJlcXVlc3RCb2R5O1xuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3Byb3BlcnRpZXMvJHVwc2VydGA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGdW5kUHJvcGVydGllcz4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHJlcXVlc3RCb2R5LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gVXBzZXJ0TmF2QWN0aXZpdHlBZGp1c3RtZW50czogVXBzZXJ0IE5BViBhZGp1c3RtZW50IGFjdGl2aXRpZXMgdG8gYSB2YWx1YXRpb24gcG9pbnRcbiAgICAgKiBVcHNlcnRzIHRoZSBOQVYgYWRqdXN0bWVudCBhY3Rpdml0aWVzIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWF0aW9uIHBvaW50IGZvciBhIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIHVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnROYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPHN0cmluZz47XG4gICAgcHVibGljIHVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnROYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8c3RyaW5nPj47XG4gICAgcHVibGljIHVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnROYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PHN0cmluZz4+O1xuICAgIHB1YmxpYyB1cHNlcnROYXZBY3Rpdml0eUFkanVzdG1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0TmF2QWN0aXZpdHlBZGp1c3RtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cHNlcnROYXZBY3Rpdml0eUFkanVzdG1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50Q29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludENvZGU7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludENvZGUgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnRDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHZhbHVhdGlvblBvaW50Q29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2QWN0aXZpdHlBZGp1c3RtZW50ID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdkFjdGl2aXR5QWRqdXN0bWVudDtcbiAgICAgICAgaWYgKG5hdkFjdGl2aXR5QWRqdXN0bWVudCA9PT0gbnVsbCB8fCBuYXZBY3Rpdml0eUFkanVzdG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgbmF2QWN0aXZpdHlBZGp1c3RtZW50IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBzZXJ0TmF2QWN0aXZpdHlBZGp1c3RtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludENvZGVWYXJpYW50O1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVhdGlvblBvaW50Q29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnZhbHVhdGlvblBvaW50Q29kZSwgJ3ZhbHVhdGlvblBvaW50Q29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50ICE9PSB1bmRlZmluZWQgJiYgdmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQsICd2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9uYXZBZGp1c3RtZW50YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PHN0cmluZz4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IG5hdkFjdGl2aXR5QWRqdXN0bWVudCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG59XG4iXX0=
|
|
4440
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVuZHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2ZpbmJvdXJuZS9sdXNpZC1zZGstYW5ndWxhcjE4L3NyYy9saWIvLmdlbmVyYXRlZC9hcGkvZnVuZHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0dBU0c7QUFDSCx1REFBdUQ7QUFFdkQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQTJCLGVBQWUsQ0FBQztBQUNsRixPQUFPLEVBQWMsV0FBVyxFQUFFLFVBQVUsRUFDVSxXQUFXLEVBQ3hELE1BQVksc0JBQXNCLENBQUM7QUFDNUMsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQStCLFlBQVksQ0FBQztBQThHL0UsYUFBYTtBQUNiLE9BQU8sRUFBRSxTQUFTLEVBQXNCLE1BQTBCLGNBQWMsQ0FBQztBQUNqRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQTBDLGtCQUFrQixDQUFDOzs7O0FBcXZCckYsTUFBTSxPQUFPLFlBQVk7SUFPQztJQUxaLFFBQVEsR0FBRywyQkFBMkIsQ0FBQztJQUMxQyxjQUFjLEdBQUcsSUFBSSxXQUFXLEVBQUUsQ0FBQztJQUNuQyxhQUFhLEdBQUcsSUFBSSxhQUFhLEVBQUUsQ0FBQztJQUNwQyxPQUFPLENBQXFCO0lBRW5DLFlBQXNCLFVBQXNCLEVBQWdDLFFBQXlCLEVBQWMsYUFBNEI7UUFBekgsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQUN4QyxJQUFJLGFBQWEsRUFBRSxDQUFDO1lBQ2hCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO1FBQ3ZDLENBQUM7UUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7WUFDbEQsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENB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eEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQVFrRCxRQUFROzswQkFBRyxNQUFNOzJCQUFDLFNBQVM7OzBCQUE4QixRQUFRIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBMVVNJRCBBUElcbiAqICMgSW50cm9kdWN0aW9uICBUaGlzIHBhZ2UgZG9jdW1lbnRzIHRoZSBbTFVTSUQgQVBJc10oLi4vLi4vLi4vYXBpL3N3YWdnZXIpLCB3aGljaCBhbGxvd3MgYXV0aG9yaXNlZCBjbGllbnRzIHRvIHF1ZXJ5IGFuZCB1cGRhdGUgdGhlaXIgZGF0YSB3aXRoaW4gdGhlIExVU0lEIHBsYXRmb3JtLiAgU0RLcyB0byBpbnRlcmFjdCB3aXRoIHRoZSBMVVNJRCBBUElzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGZvbGxvd2luZyBsYW5ndWFnZXMgYW5kIGZyYW1ld29ya3M6ICAqIFtDI10oaHR0cHM6Ly9naXRodWIuY29tL2ZpbmJvdXJuZS9sdXNpZC1zZGstY3NoYXJwKSAqIFtKYXZhXShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1qYXZhKSAqIFtKYXZhU2NyaXB0XShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1qcykgKiBbUHl0aG9uXShodHRwczovL2dpdGh1Yi5jb20vZmluYm91cm5lL2x1c2lkLXNkay1weXRob24pICogW0FuZ3VsYXJdKGh0dHBzOi8vZ2l0aHViLmNvbS9maW5ib3VybmUvbHVzaWQtc2RrLWFuZ3VsYXIpICBUaGUgTFVTSUQgcGxhdGZvcm0gaXMgbWFkZSB1cCBvZiBhIG51bWJlciBvZiBzdWItYXBwbGljYXRpb25zLiBZb3UgY2FuIGZpbmQgdGhlIEFQSSAvIHN3YWdnZXIgZG9jdW1lbnRhdGlvbiBieSBmb2xsb3dpbmcgdGhlIGxpbmtzIGluIHRoZSB0YWJsZSBiZWxvdy4gICB8IEFwcGxpY2F0aW9uICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBUEkgLyBTd2FnZ2VyIERvY3VtZW50YXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgIHwgfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18IHwgTFVTSUQgICAgICAgICB8IE9wZW4sIEFQSS1maXJzdCwgZGV2ZWxvcGVyLWZyaWVuZGx5IGludmVzdG1lbnQgZGF0YSBwbGF0Zm9ybS4gICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9hcGkvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgICAgICAgfCB8IFdlYiBhcHAgICAgICAgfCBVc2VyLWZhY2luZyBmcm9udCBlbmQgZm9yIExVU0lELiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vYXBwL3N3YWdnZXIvaW5kZXguaHRtbCkgICAgICAgICAgIHwgfCBTY2hlZHVsZXIgICAgIHwgQXV0b21hdGVkIGpvYiBzY2hlZHVsZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL3NjaGVkdWxlcjIvc3dhZ2dlci9pbmRleC5odG1sKSAgICB8IHwgSW5zaWdodHMgICAgICB8IE1vbml0b3JpbmcgYW5kIHRyb3VibGVzaG9vdGluZyBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9pbnNpZ2h0cy9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICAgfCB8IElkZW50aXR5ICAgICAgfCBJZGVudGl0eSBtYW5hZ2VtZW50IGZvciBMVVNJRCAoaW4gY29uanVuY3Rpb24gd2l0aCBBY2Nlc3MpICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vaWRlbnRpdHkvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgIHwgfCBBY2Nlc3MgICAgICAgIHwgQWNjZXNzIGNvbnRyb2wgZm9yIExVU0lEIChpbiBjb25qdW5jdGlvbiB3aXRoIElkZW50aXR5KSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL2FjY2Vzcy9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICAgICB8IHwgRHJpdmUgICAgICAgICB8IFNlY3VyZSBmaWxlIHJlcG9zaXRvcnkgYW5kIG1hbmFnZXIgZm9yIGNvbGxhYm9yYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9kcml2ZS9zd2FnZ2VyL2luZGV4Lmh0bWwpICAgICAgICAgfCB8IEx1bWluZXNjZSAgICAgfCBEYXRhIHZpcnR1YWxpc2F0aW9uIHNlcnZpY2UgKHF1ZXJ5IGRhdGEgZnJvbSBtdWx0aXBsZSBwcm92aWRlcnMsIGluY2x1ZGluZyBMVVNJRCkgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vaG9uZXljb21iL3N3YWdnZXIvaW5kZXguaHRtbCkgICAgIHwgfCBOb3RpZmljYXRpb24gIHwgTm90aWZpY2F0aW9uIHNlcnZpY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgW1N3YWdnZXJdKC4uLy4uLy4uL25vdGlmaWNhdGlvbi9zd2FnZ2VyL2luZGV4Lmh0bWwpICB8IHwgQ29uZmlndXJhdGlvbiB8IEZpbGUgc3RvcmUgZm9yIHNlY3JldHMgYW5kIG90aGVyIHNlbnNpdGl2ZSBpbmZvcm1hdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICB8IFtTd2FnZ2VyXSguLi8uLi8uLi9jb25maWd1cmF0aW9uL3N3YWdnZXIvaW5kZXguaHRtbCkgfCB8IFdvcmtmbG93ICAgICAgfCBXb3JrZmxvdyBzZXJ2aWNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBbU3dhZ2dlcl0oLi4vLi4vLi4vd29ya2Zsb3cvc3dhZ2dlci9pbmRleC5odG1sKSAgICAgIHwgICAjIEVycm9yIENvZGVzICB8IENvZGV8TmFtZXxEZXNjcmlwdGlvbiB8IHwgLS0tfC0tLXwtLS0gfCB8IDxhIG5hbWU9XFxcIi0xMFxcXCI+LTEwPC9hPnxTZXJ2ZXIgQ29uZmlndXJhdGlvbiBFcnJvcnwgIHwgfCA8YSBuYW1lPVxcXCItMVxcXCI+LTE8L2E+fFVua25vd24gZXJyb3J8QW4gdW5leHBlY3RlZCBlcnJvciB3YXMgZW5jb3VudGVyZWQgb24gb3VyIHNpZGUuIHwgfCA8YSBuYW1lPVxcXCIxMDJcXFwiPjEwMjwvYT58VmVyc2lvbiBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTAzXFxcIj4xMDM8L2E+fEFwaSBSYXRlIExpbWl0IFZpb2xhdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCIxMDRcXFwiPjEwNDwvYT58SW5zdHJ1bWVudCBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTA1XFxcIj4xMDU8L2E+fFByb3BlcnR5IE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxMDZcXFwiPjEwNjwvYT58UG9ydGZvbGlvIFJlY3Vyc2lvbiBEZXB0aHwgIHwgfCA8YSBuYW1lPVxcXCIxMDhcXFwiPjEwODwvYT58R3JvdXAgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjEwOVxcXCI+MTA5PC9hPnxQb3J0Zm9saW8gTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMFxcXCI+MTEwPC9hPnxQcm9wZXJ0eSBTY2hlbWEgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMVxcXCI+MTExPC9hPnxQb3J0Zm9saW8gQW5jZXN0cnkgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjExMlxcXCI+MTEyPC9hPnxQb3J0Zm9saW8gV2l0aCBJZCBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxMTNcXFwiPjExMzwvYT58T3JwaGFuZWQgUG9ydGZvbGlvfCAgfCB8IDxhIG5hbWU9XFxcIjExOVxcXCI+MTE5PC9hPnxNaXNzaW5nIEJhc2UgQ2xhaW1zfCAgfCB8IDxhIG5hbWU9XFxcIjEyMVxcXCI+MTIxPC9hPnxQcm9wZXJ0eSBOb3QgRGVmaW5lZHwgIHwgfCA8YSBuYW1lPVxcXCIxMjJcXFwiPjEyMjwvYT58Q2Fubm90IERlbGV0ZSBTeXN0ZW0gUHJvcGVydHl8ICB8IHwgPGEgbmFtZT1cXFwiMTIzXFxcIj4xMjM8L2E+fENhbm5vdCBNb2RpZnkgSW1tdXRhYmxlIFByb3BlcnR5IEZpZWxkfCAgfCB8IDxhIG5hbWU9XFxcIjEyNFxcXCI+MTI0PC9hPnxQcm9wZXJ0eSBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxMjVcXFwiPjEyNTwvYT58SW52YWxpZCBQcm9wZXJ0eSBMaWZlIFRpbWV8ICB8IHwgPGEgbmFtZT1cXFwiMTI2XFxcIj4xMjY8L2E+fFByb3BlcnR5IENvbnN0cmFpbnQgU3R5bGUgRXhjbHVkZXMgUHJvcGVydGllc3wgIHwgfCA8YSBuYW1lPVxcXCIxMjdcXFwiPjEyNzwvYT58Q2Fubm90IE1vZGlmeSBEZWZhdWx0IERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMjhcXFwiPjEyODwvYT58R3JvdXAgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTI5XFxcIj4xMjk8L2E+fE5vIFN1Y2ggRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjEzMFxcXCI+MTMwPC9hPnxVbmRlZmluZWQgVmFsdWUgRm9yIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMzFcXFwiPjEzMTwvYT58VW5zdXBwb3J0ZWQgVmFsdWUgVHlwZSBEZWZpbmVkIE9uIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIxMzJcXFwiPjEzMjwvYT58VmFsaWRhdGlvbiBFcnJvcnwgIHwgfCA8YSBuYW1lPVxcXCIxMzNcXFwiPjEzMzwvYT58TG9vcCBEZXRlY3RlZCBJbiBHcm91cCBIaWVyYXJjaHl8ICB8IHwgPGEgbmFtZT1cXFwiMTM0XFxcIj4xMzQ8L2E+fFVuZGVmaW5lZCBBY2NlcHRhYmxlIFZhbHVlc3wgIHwgfCA8YSBuYW1lPVxcXCIxMzVcXFwiPjEzNTwvYT58U3ViIEdyb3VwIEFscmVhZHkgRXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjEzOFxcXCI+MTM4PC9hPnxQcmljZSBTb3VyY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjEzOVxcXCI+MTM5PC9hPnxBbmFseXRpYyBTdG9yZSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTQxXFxcIj4xNDE8L2E+fEFuYWx5dGljIFN0b3JlIEFscmVhZHkgRXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjE0M1xcXCI+MTQzPC9hPnxDbGllbnQgSW5zdHJ1bWVudCBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxNDRcXFwiPjE0NDwvYT58RHVwbGljYXRlIEluIFBhcmFtZXRlciBTZXR8ICB8IHwgPGEgbmFtZT1cXFwiMTQ3XFxcIj4xNDc8L2E+fFJlc3VsdHMgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE0OFxcXCI+MTQ4PC9hPnxPcmRlciBGaWVsZCBOb3QgSW4gUmVzdWx0IFNldHwgIHwgfCA8YSBuYW1lPVxcXCIxNDlcXFwiPjE0OTwvYT58T3BlcmF0aW9uIEZhaWxlZHwgIHwgfCA8YSBuYW1lPVxcXCIxNTBcXFwiPjE1MDwvYT58RWxhc3RpYyBTZWFyY2ggRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiMTUxXFxcIj4xNTE8L2E+fEludmFsaWQgUGFyYW1ldGVyIFZhbHVlfCAgfCB8IDxhIG5hbWU9XFxcIjE1M1xcXCI+MTUzPC9hPnxDb21tYW5kIFByb2Nlc3NpbmcgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNTRcXFwiPjE1NDwvYT58RW50aXR5IFN0YXRlIENvbnN0cnVjdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE1NVxcXCI+MTU1PC9hPnxFbnRpdHkgVGltZWxpbmUgRG9lcyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTU2XFxcIj4xNTY8L2E+fENvbmN1cnJlbmN5IENvbmZsaWN0IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTU3XFxcIj4xNTc8L2E+fEludmFsaWQgUmVxdWVzdHwgIHwgfCA8YSBuYW1lPVxcXCIxNThcXFwiPjE1ODwvYT58RXZlbnQgUHVibGlzaCBVbmtub3dufCAgfCB8IDxhIG5hbWU9XFxcIjE1OVxcXCI+MTU5PC9hPnxFdmVudCBRdWVyeSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE2MFxcXCI+MTYwPC9hPnxCbG9iIERpZCBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTYyXFxcIj4xNjI8L2E+fFN1YiBTeXN0ZW0gUmVxdWVzdCBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE2M1xcXCI+MTYzPC9hPnxTdWIgU3lzdGVtIENvbmZpZ3VyYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjVcXFwiPjE2NTwvYT58RmFpbGVkIFRvIERlbGV0ZXwgIHwgfCA8YSBuYW1lPVxcXCIxNjZcXFwiPjE2NjwvYT58VXBzZXJ0IENsaWVudCBJbnN0cnVtZW50IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTY3XFxcIj4xNjc8L2E+fElsbGVnYWwgQXMgQXQgSW50ZXJ2YWx8ICB8IHwgPGEgbmFtZT1cXFwiMTY4XFxcIj4xNjg8L2E+fElsbGVnYWwgQml0ZW1wb3JhbCBRdWVyeXwgIHwgfCA8YSBuYW1lPVxcXCIxNjlcXFwiPjE2OTwvYT58SW52YWxpZCBBbHRlcm5hdGUgSWR8ICB8IHwgPGEgbmFtZT1cXFwiMTcwXFxcIj4xNzA8L2E+fENhbm5vdCBBZGQgTm9uLVdyaXRhYmxlIFByb3BlcnRpZXMgVG8gRW50aXR5fCAgfCB8IDxhIG5hbWU9XFxcIjE3MVxcXCI+MTcxPC9hPnxFbnRpdHkgQWxyZWFkeSBFeGlzdHMgSW4gR3JvdXB8ICB8IHwgPGEgbmFtZT1cXFwiMTcyXFxcIj4xNzI8L2E+fEVudGl0eSBXaXRoIElkIERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjE3M1xcXCI+MTczPC9hPnxFbnRpdHkgV2l0aCBJZCBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCIxNzRcXFwiPjE3NDwvYT58RGVyaXZlZCBQb3J0Zm9saW8gRGV0YWlscyBEbyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMTc1XFxcIj4xNzU8L2E+fEVudGl0eSBOb3QgSW4gR3JvdXB8ICB8IHwgPGEgbmFtZT1cXFwiMTc2XFxcIj4xNzY8L2E+fFBvcnRmb2xpbyBXaXRoIE5hbWUgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMTc3XFxcIj4xNzc8L2E+fEludmFsaWQgVHJhbnNhY3Rpb25zfCAgfCB8IDxhIG5hbWU9XFxcIjE3OFxcXCI+MTc4PC9hPnxSZWZlcmVuY2UgUG9ydGZvbGlvIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxNzlcXFwiPjE3OTwvYT58RHVwbGljYXRlIElkfCAgfCB8IDxhIG5hbWU9XFxcIjE4MFxcXCI+MTgwPC9hPnxDb21tYW5kIFJldHJpZXZhbCBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE4MVxcXCI+MTgxPC9hPnxEYXRhIEZpbHRlciBBcHBsaWNhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjE4MlxcXCI+MTgyPC9hPnxTZWFyY2ggRmFpbGVkfCAgfCB8IDxhIG5hbWU9XFxcIjE4M1xcXCI+MTgzPC9hPnxNb3ZlbWVudHMgRW5naW5lIENvbmZpZ3VyYXRpb24gS2V5IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMTg0XFxcIj4xODQ8L2E+fEZ4IFJhdGUgU291cmNlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIxODVcXFwiPjE4NTwvYT58QWNjcnVhbCBTb3VyY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE4NlxcXCI+MTg2PC9hPnxBY2Nlc3MgRGVuaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjE4N1xcXCI+MTg3PC9hPnxJbnZhbGlkIElkZW50aXR5IFRva2VufCAgfCB8IDxhIG5hbWU9XFxcIjE4OFxcXCI+MTg4PC9hPnxJbnZhbGlkIFJlcXVlc3QgSGVhZGVyc3wgIHwgfCA8YSBuYW1lPVxcXCIxODlcXFwiPjE4OTwvYT58UHJpY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjE5MFxcXCI+MTkwPC9hPnxJbnZhbGlkIFN1YiBIb2xkaW5nIEtleXMgUHJvdmlkZWR8ICB8IHwgPGEgbmFtZT1cXFwiMTkxXFxcIj4xOTE8L2E+fER1cGxpY2F0ZSBTdWIgSG9sZGluZyBLZXlzIFByb3ZpZGVkfCAgfCB8IDxhIG5hbWU9XFxcIjE5MlxcXCI+MTkyPC9hPnxDdXQgRGVmaW5pdGlvbiBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMTkzXFxcIj4xOTM8L2E+fEN1dCBEZWZpbml0aW9uIEludmFsaWR8ICB8IHwgPGEgbmFtZT1cXFwiMTk0XFxcIj4xOTQ8L2E+fFRpbWUgVmFyaWFudCBQcm9wZXJ0eSBEZWxldGlvbiBEYXRlIFVuc3BlY2lmaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjE5NVxcXCI+MTk1PC9hPnxQZXJwZXR1YWwgUHJvcGVydHkgRGVsZXRpb24gRGF0ZSBTcGVjaWZpZWR8ICB8IHwgPGEgbmFtZT1cXFwiMTk2XFxcIj4xOTY8L2E+fFRpbWUgVmFyaWFudCBQcm9wZXJ0eSBVcHNlcnQgRGF0ZSBVbnNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIxOTdcXFwiPjE5NzwvYT58UGVycGV0dWFsIFByb3BlcnR5IFVwc2VydCBEYXRlIFNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIyMDBcXFwiPjIwMDwvYT58SW52YWxpZCBVbml0IEZvciBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjAxXFxcIj4yMDE8L2E+fEludmFsaWQgVHlwZSBGb3IgRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwMlxcXCI+MjAyPC9hPnxJbnZhbGlkIFZhbHVlIEZvciBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjAzXFxcIj4yMDM8L2E+fFVuaXQgTm90IERlZmluZWQgRm9yIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMDRcXFwiPjIwNDwvYT58VW5pdHMgTm90IFN1cHBvcnRlZCBPbiBEYXRhIFR5cGV8ICB8IHwgPGEgbmFtZT1cXFwiMjA1XFxcIj4yMDU8L2E+fENhbm5vdCBTcGVjaWZ5IFVuaXRzIE9uIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMDZcXFwiPjIwNjwvYT58VW5pdCBTY2hlbWEgSW5jb25zaXN0ZW50IFdpdGggRGF0YSBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIwN1xcXCI+MjA3PC9hPnxVbml0IERlZmluaXRpb24gTm90IFNwZWNpZmllZHwgIHwgfCA8YSBuYW1lPVxcXCIyMDhcXFwiPjIwODwvYT58RHVwbGljYXRlIFVuaXQgRGVmaW5pdGlvbnMgU3BlY2lmaWVkfCAgfCB8IDxhIG5hbWU9XFxcIjIwOVxcXCI+MjA5PC9hPnxJbnZhbGlkIFVuaXRzIERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiMjEwXFxcIj4yMTA8L2E+fEludmFsaWQgSW5zdHJ1bWVudCBJZGVudGlmaWVyIFVuaXR8ICB8IHwgPGEgbmFtZT1cXFwiMjExXFxcIj4yMTE8L2E+fEhvbGRpbmdzIEFkanVzdG1lbnQgRG9lcyBOb3QgRXhpc3R8ICB8IHwgPGEgbmFtZT1cXFwiMjEyXFxcIj4yMTI8L2E+fENvdWxkIE5vdCBCdWlsZCBFeGNlbCBVcmx8ICB8IHwgPGEgbmFtZT1cXFwiMjEzXFxcIj4yMTM8L2E+fENvdWxkIE5vdCBHZXQgRXhjZWwgVmVyc2lvbnwgIHwgfCA8YSBuYW1lPVxcXCIyMTRcXFwiPjIxNDwvYT58SW5zdHJ1bWVudCBCeSBDb2RlIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCIyMTVcXFwiPjIxNTwvYT58RW50aXR5IFNjaGVtYSBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCIyMTZcXFwiPjIxNjwvYT58RmVhdHVyZSBOb3QgU3VwcG9ydGVkIE9uIFBvcnRmb2xpbyBUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjIxN1xcXCI+MjE3PC9hPnxRdW90ZSBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMjE4XFxcIj4yMTg8L2E+fEludmFsaWQgUXVvdGUgSWRlbnRpZmllcnwgIHwgfCA8YSBuYW1lPVxcXCIyMTlcXFwiPjIxOTwvYT58SW52YWxpZCBNZXRyaWMgRm9yIERhdGEgVHlwZXwgIHwgfCA8YSBuYW1lPVxcXCIyMjBcXFwiPjIyMDwvYT58SW52YWxpZCBJbnN0cnVtZW50IERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiMjIxXFxcIj4yMjE8L2E+fEluc3RydW1lbnQgVXBzZXJ0IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMjIyXFxcIj4yMjI8L2E+fFJlZmVyZW5jZSBQb3J0Zm9saW8gUmVxdWVzdCBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjIyM1xcXCI+MjIzPC9hPnxUcmFuc2FjdGlvbiBQb3J0Zm9saW8gUmVxdWVzdCBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjIyNFxcXCI+MjI0PC9hPnxJbnZhbGlkIFByb3BlcnR5IFZhbHVlIEFzc2lnbm1lbnR8ICB8IHwgPGEgbmFtZT1cXFwiMjMwXFxcIj4yMzA8L2E+fFRyYW5zYWN0aW9uIFR5cGUgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjIzMVxcXCI+MjMxPC9hPnxUcmFuc2FjdGlvbiBUeXBlIER1cGxpY2F0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjIzMlxcXCI+MjMyPC9hPnxQb3J0Zm9saW8gRG9lcyBOb3QgRXhpc3QgQXQgR2l2ZW4gRGF0ZXwgIHwgfCA8YSBuYW1lPVxcXCIyMzNcXFwiPjIzMzwvYT58UXVlcnkgUGFyc2VyIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMjM0XFxcIj4yMzQ8L2E+fER1cGxpY2F0ZSBDb25zdGl0dWVudHwgIHwgfCA8YSBuYW1lPVxcXCIyMzVcXFwiPjIzNTwvYT58VW5yZXNvbHZlZCBJbnN0cnVtZW50IENvbnN0aXR1ZW50fCAgfCB8IDxhIG5hbWU9XFxcIjIzNlxcXCI+MjM2PC9hPnxVbnJlc29sdmVkIEluc3RydW1lbnQgSW4gVHJhbnNpdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCIyMzdcXFwiPjIzNzwvYT58TWlzc2luZyBTaWRlIERlZmluaXRpb25zfCAgfCB8IDxhIG5hbWU9XFxcIjI0MFxcXCI+MjQwPC9hPnxEdXBsaWNhdGUgQ2FsY3VsYXRpb25zIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMjk5XFxcIj4yOTk8L2E+fEludmFsaWQgUmVjaXBlfCAgfCB8IDxhIG5hbWU9XFxcIjMwMFxcXCI+MzAwPC9hPnxNaXNzaW5nIFJlY2lwZXwgIHwgfCA8YSBuYW1lPVxcXCIzMDFcXFwiPjMwMTwvYT58RGVwZW5kZW5jaWVzfCAgfCB8IDxhIG5hbWU9XFxcIjMwNFxcXCI+MzA0PC9hPnxQb3J0Zm9saW8gUHJlcHJvY2VzcyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMxMFxcXCI+MzEwPC9hPnxWYWx1YXRpb24gRW5naW5lIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzExXFxcIj4zMTE8L2E+fFRhc2sgRmFjdG9yeSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMxMlxcXCI+MzEyPC9hPnxUYXNrIEV2YWx1YXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMTNcXFwiPjMxMzwvYT58VGFzayBHZW5lcmF0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzE0XFxcIj4zMTQ8L2E+fEVuZ2luZSBDb25maWd1cmF0aW9uIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzE1XFxcIj4zMTU8L2E+fE1vZGVsIFNwZWNpZmljYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMjBcXFwiPjMyMDwvYT58TWFya2V0IERhdGEgS2V5IEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzIxXFxcIj4zMjE8L2E+fE1hcmtldCBSZXNvbHZlciBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMyMlxcXCI+MzIyPC9hPnxNYXJrZXQgRGF0YSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMzMFxcXCI+MzMwPC9hPnxDdXJ2ZSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjMzMVxcXCI+MzMxPC9hPnxWb2xhdGlsaXR5IFN1cmZhY2UgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzMzJcXFwiPjMzMjwvYT58Vm9sYXRpbGl0eSBDdWJlIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzUwXFxcIj4zNTA8L2E+fEluc3RydW1lbnQgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNTFcXFwiPjM1MTwvYT58Q2FzaCBGbG93cyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM1MlxcXCI+MzUyPC9hPnxSZWZlcmVuY2UgRGF0YSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM2MFxcXCI+MzYwPC9hPnxBZ2dyZWdhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM2MVxcXCI+MzYxPC9hPnxBZ2dyZWdhdGlvbiBNZWFzdXJlIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzcwXFxcIj4zNzA8L2E+fFJlc3VsdCBSZXRyaWV2YWwgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNzFcXFwiPjM3MTwvYT58UmVzdWx0IFByb2Nlc3NpbmcgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzNzJcXFwiPjM3MjwvYT58VmVuZG9yIFJlc3VsdCBQcm9jZXNzaW5nIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzczXFxcIj4zNzM8L2E+fFZlbmRvciBSZXN1bHQgTWFwcGluZyBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM3NFxcXCI+Mzc0PC9hPnxWZW5kb3IgTGlicmFyeSBVbmF1dGhvcmlzZWR8ICB8IHwgPGEgbmFtZT1cXFwiMzc1XFxcIj4zNzU8L2E+fFZlbmRvciBDb25uZWN0aXZpdHkgRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiMzc2XFxcIj4zNzY8L2E+fFZlbmRvciBJbnRlcmZhY2UgRXJyb3J8ICB8IHwgPGEgbmFtZT1cXFwiMzc3XFxcIj4zNzc8L2E+fFZlbmRvciBQcmljaW5nIEZhaWx1cmV8ICB8IHwgPGEgbmFtZT1cXFwiMzc4XFxcIj4zNzg8L2E+fFZlbmRvciBUcmFuc2xhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM3OVxcXCI+Mzc5PC9hPnxWZW5kb3IgS2V5IE1hcHBpbmcgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzODBcXFwiPjM4MDwvYT58VmVuZG9yIFJlZmxlY3Rpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzODFcXFwiPjM4MTwvYT58VmVuZG9yIFByb2Nlc3MgRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCIzODJcXFwiPjM4MjwvYT58VmVuZG9yIFN5c3RlbSBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjM5MFxcXCI+MzkwPC9hPnxBdHRlbXB0IFRvIFVwc2VydCBEdXBsaWNhdGUgUXVvdGVzfCAgfCB8IDxhIG5hbWU9XFxcIjM5MVxcXCI+MzkxPC9hPnxDb3Jwb3JhdGUgQWN0aW9uIFNvdXJjZSBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCIzOTJcXFwiPjM5MjwvYT58Q29ycG9yYXRlIEFjdGlvbiBTb3VyY2UgQWxyZWFkeSBFeGlzdHN8ICB8IHwgPGEgbmFtZT1cXFwiMzkzXFxcIj4zOTM8L2E+fEluc3RydW1lbnQgSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCIzOTRcXFwiPjM5NDwvYT58UHJvcGVydGllcyBOb3QgRm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiMzk1XFxcIj4zOTU8L2E+fEJhdGNoIE9wZXJhdGlvbiBBYm9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjQwMFxcXCI+NDAwPC9hPnxJbnZhbGlkIElzbzQyMTcgQ3VycmVuY3kgQ29kZXwgIHwgfCA8YSBuYW1lPVxcXCI0MDFcXFwiPjQwMTwvYT58Q2Fubm90IEFzc2lnbiBJbnN0cnVtZW50IElkZW50aWZpZXIgVG8gQ3VycmVuY3l8ICB8IHwgPGEgbmFtZT1cXFwiNDAyXFxcIj40MDI8L2E+fENhbm5vdCBBc3NpZ24gQ3VycmVuY3kgSWRlbnRpZmllciBUbyBOb24gQ3VycmVuY3l8ICB8IHwgPGEgbmFtZT1cXFwiNDAzXFxcIj40MDM8L2E+fEN1cnJlbmN5IEluc3RydW1lbnQgQ2Fubm90IEJlIERlbGV0ZWR8ICB8IHwgPGEgbmFtZT1cXFwiNDA0XFxcIj40MDQ8L2E+fEN1cnJlbmN5IEluc3RydW1lbnQgQ2Fubm90IEhhdmUgRWNvbm9taWMgRGVmaW5pdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI0MDVcXFwiPjQwNTwvYT58Q3VycmVuY3kgSW5zdHJ1bWVudCBDYW5ub3QgSGF2ZSBMb29rdGhyb3VnaCBQb3J0Zm9saW98ICB8IHwgPGEgbmFtZT1cXFwiNDA2XFxcIj40MDY8L2E+fENhbm5vdCBDcmVhdGUgQ3VycmVuY3kgSW5zdHJ1bWVudCBXaXRoIE11bHRpcGxlIElkZW50aWZpZXJzfCAgfCB8IDxhIG5hbWU9XFxcIjQwN1xcXCI+NDA3PC9hPnxTcGVjaWZpZWQgQ3VycmVuY3kgSXMgVW5kZWZpbmVkfCAgfCB8IDxhIG5hbWU9XFxcIjQxMFxcXCI+NDEwPC9hPnxJbmRleCBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI0MTFcXFwiPjQxMTwvYT58U29ydCBGaWVsZCBEb2VzIE5vdCBFeGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI0MTNcXFwiPjQxMzwvYT58TmVnYXRpdmUgUGFnaW5hdGlvbiBQYXJhbWV0ZXJzfCAgfCB8IDxhIG5hbWU9XFxcIjQxNFxcXCI+NDE0PC9hPnxJbnZhbGlkIFNlYXJjaCBTeW50YXh8ICB8IHwgPGEgbmFtZT1cXFwiNDE1XFxcIj40MTU8L2E+fEZpbHRlciBFeGVjdXRpb24gVGltZW91dHwgIHwgfCA8YSBuYW1lPVxcXCI0MjBcXFwiPjQyMDwvYT58U2lkZSBEZWZpbml0aW9uIEluY29uc2lzdGVudHwgIHwgfCA8YSBuYW1lPVxcXCI0NTBcXFwiPjQ1MDwvYT58SW52YWxpZCBRdW90ZSBBY2Nlc3MgTWV0YWRhdGEgUnVsZXwgIHwgfCA8YSBuYW1lPVxcXCI0NTFcXFwiPjQ1MTwvYT58QWNjZXNzIE1ldGFkYXRhIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI0NTJcXFwiPjQ1MjwvYT58SW52YWxpZCBBY2Nlc3MgTWV0YWRhdGEgSWRlbnRpZmllcnwgIHwgfCA8YSBuYW1lPVxcXCI0NjBcXFwiPjQ2MDwvYT58U3RhbmRhcmQgUmVzb3VyY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjQ2MVxcXCI+NDYxPC9hPnxTdGFuZGFyZCBSZXNvdXJjZSBDb25mbGljdHwgIHwgfCA8YSBuYW1lPVxcXCI0NjJcXFwiPjQ2MjwvYT58Q2FsZW5kYXIgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjQ2M1xcXCI+NDYzPC9hPnxEYXRlIEluIEEgQ2FsZW5kYXIgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjQ2NFxcXCI+NDY0PC9hPnxJbnZhbGlkIERhdGUgU291cmNlIERhdGF8ICB8IHwgPGEgbmFtZT1cXFwiNDY1XFxcIj40NjU8L2E+fEludmFsaWQgVGltZXpvbmV8ICB8IHwgPGEgbmFtZT1cXFwiNjAxXFxcIj42MDE8L2E+fFBlcnNvbiBJZGVudGlmaWVyIEFscmVhZHkgSW4gVXNlfCAgfCB8IDxhIG5hbWU9XFxcIjYwMlxcXCI+NjAyPC9hPnxQZXJzb24gTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjYwM1xcXCI+NjAzPC9hPnxDYW5ub3QgU2V0IElkZW50aWZpZXJ8ICB8IHwgPGEgbmFtZT1cXFwiNjE3XFxcIj42MTc8L2E+fEludmFsaWQgUmVjaXBlIFNwZWNpZmljYXRpb24gSW4gUmVxdWVzdHwgIHwgfCA8YSBuYW1lPVxcXCI2MThcXFwiPjYxODwvYT58SW5saW5lIFJlY2lwZSBEZXNlcmlhbGlzYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCI2MTlcXFwiPjYxOTwvYT58SWRlbnRpZmllciBUeXBlcyBOb3QgU2V0IEZvciBFbnRpdHl8ICB8IHwgPGEgbmFtZT1cXFwiNjIwXFxcIj42MjA8L2E+fENhbm5vdCBEZWxldGUgQWxsIENsaWVudCBEZWZpbmVkIElkZW50aWZpZXJzfCAgfCB8IDxhIG5hbWU9XFxcIjY1MFxcXCI+NjUwPC9hPnxUaGUgT3JkZXIgcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjY1NFxcXCI+NjU0PC9hPnxUaGUgQWxsb2NhdGlvbiByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNjU1XFxcIj42NTU8L2E+fENhbm5vdCBidWlsZCB0aGUgZnggZm9yd2FyZCB0YXJnZXQgd2l0aCB0aGUgZ2l2ZW4gaG9sZGluZ3MufCAgfCB8IDxhIG5hbWU9XFxcIjY1NlxcXCI+NjU2PC9hPnxHcm91cCBkb2VzIG5vdCBjb250YWluIGV4cGVjdGVkIGVudGl0aWVzLnwgIHwgfCA8YSBuYW1lPVxcXCI2NjVcXFwiPjY2NTwvYT58RGVzdGluYXRpb24gZGlyZWN0b3J5IG5vdCBmb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI2NjdcXFwiPjY2NzwvYT58UmVsYXRpb24gZGVmaW5pdGlvbiBhbHJlYWR5IGV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCI2NzJcXFwiPjY3MjwvYT58Q291bGQgbm90IHJldHJpZXZlIGZpbGUgY29udGVudHN8ICB8IHwgPGEgbmFtZT1cXFwiNjczXFxcIj42NzM8L2E+fE1pc3NpbmcgZW50aXRsZW1lbnRzIGZvciBlbnRpdGllcyBpbiBHcm91cHwgIHwgfCA8YSBuYW1lPVxcXCI2NzRcXFwiPjY3NDwvYT58TmV4dCBCZXN0IEFjdGlvbiBub3QgZm91bmR8ICB8IHwgPGEgbmFtZT1cXFwiNjc2XFxcIj42NzY8L2E+fFJlbGF0aW9uIGRlZmluaXRpb24gbm90IGRlZmluZWR8ICB8IHwgPGEgbmFtZT1cXFwiNjc3XFxcIj42Nzc8L2E+fEludmFsaWQgZW50aXR5IGlkZW50aWZpZXIgZm9yIHJlbGF0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjY4MVxcXCI+NjgxPC9hPnxTb3J0aW5nIGJ5IHNwZWNpZmllZCBmaWVsZCBub3Qgc3VwcG9ydGVkfE9uZSBvciBtb3JlIG9mIHRoZSBwcm92aWRlZCBmaWVsZHMgdG8gb3JkZXIgYnkgd2VyZSBlaXRoZXIgaW52YWxpZCBvciBub3Qgc3VwcG9ydGVkLiB8IHwgPGEgbmFtZT1cXFwiNjgyXFxcIj42ODI8L2E+fFRvbyBtYW55IGZpZWxkcyB0byBzb3J0IGJ5fFRoZSBudW1iZXIgb2YgZmllbGRzIHRvIHNvcnQgdGhlIGRhdGEgYnkgZXhjZWVkcyB0aGUgbnVtYmVyIGFsbG93ZWQgYnkgdGhlIGVuZHBvaW50IHwgfCA8YSBuYW1lPVxcXCI2ODRcXFwiPjY4NDwvYT58U2VxdWVuY2UgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjY4NVxcXCI+Njg1PC9hPnxTZXF1ZW5jZSBBbHJlYWR5IEV4aXN0c3wgIHwgfCA8YSBuYW1lPVxcXCI2ODZcXFwiPjY4NjwvYT58Tm9uLWN5Y2xpbmcgc2VxdWVuY2UgaGFzIGJlZW4gZXhoYXVzdGVkfCAgfCB8IDxhIG5hbWU9XFxcIjY4N1xcXCI+Njg3PC9hPnxMZWdhbCBFbnRpdHkgSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI2ODhcXFwiPjY4ODwvYT58TGVnYWwgRW50aXR5IE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI2ODlcXFwiPjY4OTwvYT58VGhlIHN1cHBsaWVkIHBhZ2luYXRpb24gdG9rZW4gaXMgaW52YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI2OTBcXFwiPjY5MDwvYT58UHJvcGVydHkgVHlwZSBJcyBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjY5MVxcXCI+NjkxPC9hPnxNdWx0aXBsZSBUYXgtbG90cyBGb3IgQ3VycmVuY3kgVHlwZSBJcyBOb3QgU3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjY5MlxcXCI+NjkyPC9hPnxUaGlzIGVuZHBvaW50IGRvZXMgbm90IHN1cHBvcnQgaW1wZXJzb25hdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI2OTNcXFwiPjY5MzwvYT58RW50aXR5IHR5cGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgUmVsYXRpb25zaGlwfCAgfCB8IDxhIG5hbWU9XFxcIjY5NFxcXCI+Njk0PC9hPnxSZWxhdGlvbnNoaXAgVmFsaWRhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjY5NVxcXCI+Njk1PC9hPnxSZWxhdGlvbnNoaXAgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjY5N1xcXCI+Njk3PC9hPnxEZXJpdmVkIFByb3BlcnR5IEZvcm11bGEgTm8gTG9uZ2VyIFZhbGlkfCAgfCB8IDxhIG5hbWU9XFxcIjY5OFxcXCI+Njk4PC9hPnxTdG9yeSBpcyBub3QgYXZhaWxhYmxlfCAgfCB8IDxhIG5hbWU9XFxcIjcwM1xcXCI+NzAzPC9hPnxDb3Jwb3JhdGUgQWN0aW9uIERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjcyMFxcXCI+NzIwPC9hPnxUaGUgcHJvdmlkZWQgc29ydCBhbmQgZmlsdGVyIGNvbWJpbmF0aW9uIGlzIG5vdCB2YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI3MjFcXFwiPjcyMTwvYT58QTJCIGdlbmVyYXRpb24gZmFpbGVkfCAgfCB8IDxhIG5hbWU9XFxcIjcyMlxcXCI+NzIyPC9hPnxBZ2dyZWdhdGVkIFJldHVybiBDYWxjdWxhdGlvbiBGYWlsdXJlfCAgfCB8IDxhIG5hbWU9XFxcIjcyM1xcXCI+NzIzPC9hPnxDdXN0b20gRW50aXR5IERlZmluaXRpb24gSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI3MjRcXFwiPjcyNDwvYT58Q3VzdG9tIEVudGl0eSBEZWZpbml0aW9uIE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI3MjVcXFwiPjcyNTwvYT58VGhlIFBsYWNlbWVudCByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzI2XFxcIj43MjY8L2E+fFRoZSBFeGVjdXRpb24gcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjcyN1xcXCI+NzI3PC9hPnxUaGUgQmxvY2sgcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjcyOFxcXCI+NzI4PC9hPnxUaGUgUGFydGljaXBhdGlvbiByZXF1ZXN0ZWQgd2FzIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzI5XFxcIj43Mjk8L2E+fFRoZSBQYWNrYWdlIHJlcXVlc3RlZCB3YXMgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3MzBcXFwiPjczMDwvYT58VGhlIE9yZGVySW5zdHJ1Y3Rpb24gcmVxdWVzdGVkIHdhcyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjczMlxcXCI+NzMyPC9hPnxDdXN0b20gRW50aXR5IG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiNzMzXFxcIj43MzM8L2E+fEN1c3RvbSBFbnRpdHkgSWRlbnRpZmllciBhbHJlYWR5IGluIHVzZS58ICB8IHwgPGEgbmFtZT1cXFwiNzM1XFxcIj43MzU8L2E+fENhbGN1bGF0aW9uIEZhaWxlZC58ICB8IHwgPGEgbmFtZT1cXFwiNzM2XFxcIj43MzY8L2E+fEFuIGV4cGVjdGVkIGtleSBvbiBIdHRwUmVzcG9uc2UgaXMgbWlzc2luZy58ICB8IHwgPGEgbmFtZT1cXFwiNzM3XFxcIj43Mzc8L2E+fEEgcmVxdWlyZWQgZmVlIGRldGFpbCBpcyBtaXNzaW5nLnwgIHwgfCA8YSBuYW1lPVxcXCI3MzhcXFwiPjczODwvYT58WmVybyByb3dzIHdlcmUgcmV0dXJuZWQgZnJvbSBMdW1pbmVzY2V8ICB8IHwgPGEgbmFtZT1cXFwiNzM5XFxcIj43Mzk8L2E+fFByb3ZpZGVkIFdlZWtlbmQgTWFzayB3YXMgaW52YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI3NDJcXFwiPjc0MjwvYT58Q3VzdG9tIEVudGl0eSBmaWVsZHMgZG8gbm90IG1hdGNoIHRoZSBkZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjc0NlxcXCI+NzQ2PC9hPnxUaGUgcHJvdmlkZWQgc2VxdWVuY2UgaXMgbm90IHZhbGlkLnwgIHwgfCA8YSBuYW1lPVxcXCI3NTFcXFwiPjc1MTwvYT58VGhlIHR5cGUgb2YgdGhlIEN1c3RvbSBFbnRpdHkgaXMgZGlmZmVyZW50IHRoYW4gdGhlIHR5cGUgcHJvdmlkZWQgaW4gdGhlIGRlZmluaXRpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjc1MlxcXCI+NzUyPC9hPnxMdW1pbmVzY2UgcHJvY2VzcyByZXR1cm5lZCBhbiBlcnJvci58ICB8IHwgPGEgbmFtZT1cXFwiNzUzXFxcIj43NTM8L2E+fEZpbGUgbmFtZSBvciBjb250ZW50IGluY29tcGF0aWJsZSB3aXRoIG9wZXJhdGlvbi58ICB8IHwgPGEgbmFtZT1cXFwiNzU1XFxcIj43NTU8L2E+fFNjaGVtYSBvZiByZXNwb25zZSBmcm9tIERyaXZlIGlzIG5vdCBhcyBleHBlY3RlZC58ICB8IHwgPGEgbmFtZT1cXFwiNzU3XFxcIj43NTc8L2E+fFNjaGVtYSBvZiByZXNwb25zZSBmcm9tIEx1bWluZXNjZSBpcyBub3QgYXMgZXhwZWN0ZWQufCAgfCB8IDxhIG5hbWU9XFxcIjc1OFxcXCI+NzU4PC9hPnxMdW1pbmVzY2UgdGltZWQgb3V0LnwgIHwgfCA8YSBuYW1lPVxcXCI3NjNcXFwiPjc2MzwvYT58SW52YWxpZCBMdXNpZCBFbnRpdHkgSWRlbnRpZmllciBVbml0fCAgfCB8IDxhIG5hbWU9XFxcIjc2OFxcXCI+NzY4PC9hPnxGZWUgcnVsZSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjc2OVxcXCI+NzY5PC9hPnxDYW5ub3QgdXBkYXRlIHRoZSBiYXNlIGN1cnJlbmN5IG9mIGEgcG9ydGZvbGlvIHdpdGggdHJhbnNhY3Rpb25zIGxvYWRlZHwgIHwgfCA8YSBuYW1lPVxcXCI3NzFcXFwiPjc3MTwvYT58VHJhbnNhY3Rpb24gY29uZmlndXJhdGlvbiBzb3VyY2Ugbm90IGZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjc3NFxcXCI+Nzc0PC9hPnxDb21wbGlhbmNlIHJ1bGUgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI3NzVcXFwiPjc3NTwvYT58RnVuZCBhY2NvdW50aW5nIGRvY3VtZW50IGNhbm5vdCBiZSBwcm9jZXNzZWQufCAgfCB8IDxhIG5hbWU9XFxcIjc3OFxcXCI+Nzc4PC9hPnxVbmFibGUgdG8gbG9vayB1cCBGWCByYXRlIGZyb20gdHJhZGUgY2N5IHRvIHBvcnRmb2xpbyBjY3kgZm9yIHNvbWUgb2YgdGhlIHRyYWRlcy58ICB8IHwgPGEgbmFtZT1cXFwiNzgyXFxcIj43ODI8L2E+fFRoZSBQcm9wZXJ0eSBkZWZpbml0aW9uIGRhdGFUeXBlIGlzIG5vdCBtYXRjaGluZyB0aGUgZGVyaXZhdGlvbiBmb3JtdWxhIGRhdGFUeXBlfCAgfCB8IDxhIG5hbWU9XFxcIjc4M1xcXCI+NzgzPC9hPnxUaGUgUHJvcGVydHkgZGVmaW5pdGlvbiBkb21haW4gaXMgbm90IHN1cHBvcnRlZCBmb3IgZGVyaXZlZCBwcm9wZXJ0aWVzfCAgfCB8IDxhIG5hbWU9XFxcIjc4OFxcXCI+Nzg4PC9hPnxDb21wbGlhbmNlIHJ1biBub3QgZm91bmQgZmFpbHVyZS58ICB8IHwgPGEgbmFtZT1cXFwiNzkwXFxcIj43OTA8L2E+fEN1c3RvbSBFbnRpdHkgaGFzIG1pc3Npbmcgb3IgaW52YWxpZCBpZGVudGlmaWVyc3wgIHwgfCA8YSBuYW1lPVxcXCI3OTFcXFwiPjc5MTwvYT58Q3VzdG9tIEVudGl0eSBkZWZpbml0aW9uIGFscmVhZHkgZXhpc3RzfCAgfCB8IDxhIG5hbWU9XFxcIjc5MlxcXCI+NzkyPC9hPnxDb21wbGlhbmNlIFByb3BlcnR5S2V5IGlzIG1pc3NpbmcufCAgfCB8IDxhIG5hbWU9XFxcIjc5M1xcXCI+NzkzPC9hPnxDb21wbGlhbmNlIENyaXRlcmlhIFZhbHVlIGZvciBtYXRjaGluZyBpcyBtaXNzaW5nLnwgIHwgfCA8YSBuYW1lPVxcXCI3OTVcXFwiPjc5NTwvYT58Q2Fubm90IGRlbGV0ZSBpZGVudGlmaWVyIGRlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiNzk2XFxcIj43OTY8L2E+fFRheCBydWxlIHNldCBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjc5N1xcXCI+Nzk3PC9hPnxBIHRheCBydWxlIHNldCB3aXRoIHRoaXMgaWQgYWxyZWFkeSBleGlzdHMufCAgfCB8IDxhIG5hbWU9XFxcIjc5OFxcXCI+Nzk4PC9hPnxNdWx0aXBsZSBydWxlIHNldHMgZm9yIHRoZSBzYW1lIHByb3BlcnR5IGtleSBhcmUgYXBwbGljYWJsZS58ICB8IHwgPGEgbmFtZT1cXFwiNzk5XFxcIj43OTk8L2E+fFRoZSByZXF1ZXN0IG11c3QgY29udGFpbiBhIGRhdGUgb3IgZGlhcnkgZW50cnkufCAgfCB8IDxhIG5hbWU9XFxcIjgwMFxcXCI+ODAwPC9hPnxDYW4gbm90IHVwc2VydCBhbiBpbnN0cnVtZW50IGV2ZW50IG9mIHRoaXMgdHlwZS58ICB8IHwgPGEgbmFtZT1cXFwiODAxXFxcIj44MDE8L2E+fFRoZSBpbnN0cnVtZW50IGV2ZW50IGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MDJcXFwiPjgwMjwvYT58VGhlIEluc3RydW1lbnQgZXZlbnQgaXMgbWlzc2luZyBzYWxpZW50IGluZm9ybWF0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI4MDNcXFwiPjgwMzwvYT58VGhlIEluc3RydW1lbnQgZXZlbnQgY291bGQgbm90IGJlIHByb2Nlc3NlZC58ICB8IHwgPGEgbmFtZT1cXFwiODA0XFxcIj44MDQ8L2E+fFNvbWUgZGF0YSByZXF1ZXN0ZWQgZG9lcyBub3QgZm9sbG93IHRoZSBvcmRlciBncmFwaCBhc3N1bXB0aW9ucy58ICB8IHwgPGEgbmFtZT1cXFwiODA1XFxcIj44MDU8L2E+fFRoZSBpbnN0cnVtZW50IGV2ZW50IHR5cGUgZG9lcyBub3QgZXhpc3QufCAgfCB8IDxhIG5hbWU9XFxcIjgwNlxcXCI+ODA2PC9hPnxUaGUgdHJhbnNhY3Rpb24gdGVtcGxhdGUgc3BlY2lmaWNhdGlvbiBkb2VzIG5vdCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODA3XFxcIj44MDc8L2E+fFRoZSBkZWZhdWx0IHRyYW5zYWN0aW9uIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MDhcXFwiPjgwODwvYT58VGhlIHRyYW5zYWN0aW9uIHRlbXBsYXRlIGRvZXMgbm90IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MTFcXFwiPjgxMTwvYT58QSBwcmljZSBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGFuIG9yZGVyLnwgIHwgfCA8YSBuYW1lPVxcXCI4MTJcXFwiPjgxMjwvYT58QSBwcmljZSBjb3VsZCBub3QgYmUgZm91bmQgZm9yIGFuIGFsbG9jYXRpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjgxM1xcXCI+ODEzPC9hPnxDaGFydCBvZiBBY2NvdW50cyBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgxNFxcXCI+ODE0PC9hPnxBY2NvdW50IG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODE1XFxcIj44MTU8L2E+fEFib3Igbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4MTZcXFwiPjgxNjwvYT58QWJvciBDb25maWd1cmF0aW9uIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODE3XFxcIj44MTc8L2E+fFJlY29uY2lsaWF0aW9uIG1hcHBpbmcgbm90IGZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjgxOFxcXCI+ODE4PC9hPnxBdHRyaWJ1dGUgdHlwZSBjb3VsZCBub3QgYmUgZGVsZXRlZCBiZWNhdXNlIGl0IGRvZXNuXFwndCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODE5XFxcIj44MTk8L2E+fFJlY29uY2lsaWF0aW9uIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODIwXFxcIj44MjA8L2E+fEN1c3RvZGlhbiBBY2NvdW50IG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODIxXFxcIj44MjE8L2E+fEFsbG9jYXRpb24gRmFpbHVyZXwgIHwgfCA8YSBuYW1lPVxcXCI4MjJcXFwiPjgyMjwvYT58UmVjb25jaWxpYXRpb24gcnVuIG5vdCBmb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI4MjNcXFwiPjgyMzwvYT58UmVjb25jaWxpYXRpb24gYnJlYWsgbm90IGZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjgyNFxcXCI+ODI0PC9hPnxFbnRpdHkgbGluayB0eXBlIGNvdWxkIG5vdCBiZSBkZWxldGVkIGJlY2F1c2UgaXQgZG9lc25cXCd0IGV4aXN0LnwgIHwgfCA8YSBuYW1lPVxcXCI4MjhcXFwiPjgyODwvYT58QWRkcmVzcyBrZXkgZGVmaW5pdGlvbiBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgyOVxcXCI+ODI5PC9hPnxDb21wbGlhbmNlIHRlbXBsYXRlIG5vdCBmb3VuZC58ICB8IHwgPGEgbmFtZT1cXFwiODMwXFxcIj44MzA8L2E+fEFjdGlvbiBub3Qgc3VwcG9ydGVkfCAgfCB8IDxhIG5hbWU9XFxcIjgzMVxcXCI+ODMxPC9hPnxSZWZlcmVuY2UgbGlzdCBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzMlxcXCI+ODMyPC9hPnxQb3N0aW5nIE1vZHVsZSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzM1xcXCI+ODMzPC9hPnxUaGUgdHlwZSBvZiBwYXJhbWV0ZXIgcHJvdmlkZWQgZGlkIG5vdCBtYXRjaCB0aGF0IHJlcXVpcmVkIGJ5IHRoZSBjb21wbGlhbmNlIHJ1bGUufCAgfCB8IDxhIG5hbWU9XFxcIjgzNFxcXCI+ODM0PC9hPnxUaGUgcGFyYW1ldGVycyBwcm92aWRlZCBieSBhIHJ1bGUgZGlkIG5vdCBtYXRjaCB0aG9zZSByZXF1aXJlZCBieSBpdHMgdGVtcGxhdGUufCAgfCB8IDxhIG5hbWU9XFxcIjgzNVxcXCI+ODM1PC9hPnxUaGUgZW50aXR5IGhhcyBhIHByb3BlcnR5IGluIGEgZG9tYWluIHRoYXQgaXMgbm90IHN1cHBydGVkIGZvciB0aGF0IGVudGl0eSB0eXBlLnwgIHwgfCA8YSBuYW1lPVxcXCI4MzZcXFwiPjgzNjwvYT58U3RydWN0dXJlZCByZXN1bHQgZGF0YSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzN1xcXCI+ODM3PC9hPnxEaWFyeSBlbnRyeSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjgzOFxcXCI+ODM4PC9hPnxEaWFyeSBlbnRyeSBjb3VsZCBub3QgYmUgY3JlYXRlZC58ICB8IHwgPGEgbmFtZT1cXFwiODM5XFxcIj44Mzk8L2E+fERpYXJ5IGVudHJ5IGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI4NjFcXFwiPjg2MTwvYT58Q29tcGxpYW5jZSBydW4gc3VtbWFyeSBub3QgZm91bmQufCAgfCB8IDxhIG5hbWU9XFxcIjg2OVxcXCI+ODY5PC9hPnxDb25mbGljdGluZyBpbnN0cnVtZW50IHByb3BlcnRpZXMgaW4gYmF0Y2gufCAgfCB8IDxhIG5hbWU9XFxcIjg3MFxcXCI+ODcwPC9hPnxDb21wbGlhbmNlIHJ1biBzdW1tYXJ5IGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI4NzFcXFwiPjg3MTwvYT58VGhlIHNwZWNpZmllZCBpbXBlcnNvbmF0ZWQgdXNlciBkb2VzIG5vdCBleGlzdHwgIHwgfCA8YSBuYW1lPVxcXCI4NzRcXFwiPjg3NDwvYT58UHJvdmlkZWQgUHJvcGVydHkgRG9tYWluIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIGVudGl0eSBmaWx0ZXIufCAgfCB8IDxhIG5hbWU9XFxcIjg3NVxcXCI+ODc1PC9hPnxDYW5ub3QgRGVsZXRlIFN5c3RlbSBSZWZlcmVuY2UgTGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiODc2XFxcIj44NzY8L2E+fENsZWFyZG93biBNb2R1bGUgbm90IGZvdW5kLnwgIHwgfCA8YSBuYW1lPVxcXCI4NzlcXFwiPjg3OTwvYT58UG9ydGZvbGlvcyBkbyBub3QgaGF2ZSB0aGUgc2FtZSBiYXNlIGN1cnJlbmN5fCAgfCB8IDxhIG5hbWU9XFxcIjg4MFxcXCI+ODgwPC9hPnxUaGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlIGNvbXBsaWFuY2UgZXhwcmVzc2lvbi58ICB8IHwgPGEgbmFtZT1cXFwiODgxXFxcIj44ODE8L2E+fEJsb2NrIG92ZXJwbGFjZWQufCAgfCB8IDxhIG5hbWU9XFxcIjg4MlxcXCI+ODgyPC9hPnxPcmRlciBub3QgYXBwcm92ZWQufCAgfCB8IDxhIG5hbWU9XFxcIjg4M1xcXCI+ODgzPC9hPnxDYW5ub3QgdXBkYXRlIHRoZSBzaGFyZWQgZmllbGRzIG9mIGEgYmxvY2sgd2l0aCBhc3NvY2lhdGVkIG9yZGVycy58ICB8IHwgPGEgbmFtZT1cXFwiODg2XFxcIj44ODY8L2E+fENhbm5vdCBsb2NrIHRoZSBwZXJpb2QufCAgfCB8IDxhIG5hbWU9XFxcIjg4N1xcXCI+ODg3PC9hPnxDYW5ub3QgYXBwbHkgY2xlYXIgZG93biBtb2R1bGUufCAgfCB8IDxhIG5hbWU9XFxcIjg4OFxcXCI+ODg4PC9hPnxDYW5ub3QgdXBzZXJ0IEluc3RydW1lbnQgRXZlbnQgSW5zdHJ1Y3Rpb24ufCAgfCB8IDxhIG5hbWU9XFxcIjg4OVxcXCI+ODg5PC9hPnxDYW5ub3QgcmVhZCBJbnN0cnVtZW50IEV2ZW50IEluc3RydWN0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI4OTVcXFwiPjg5NTwvYT58VGhlIENhcGl0YWwgUmF0aW8gQ2FsY3VsYXRpb24gSXMgV3JvbmcufCAgfCB8IDxhIG5hbWU9XFxcIjkxMFxcXCI+OTEwPC9hPnxDYW5ub3QgdXBkYXRlIGEgYmxvY2sgcmVmZXJlbmNlZCBieSBhIHBsYWNlbWVudC58ICB8IHwgPGEgbmFtZT1cXFwiOTExXFxcIj45MTE8L2E+fEEgRnVuZCB0aGF0IHJlZmVyZW5jZXMgdGhpcyBBYm9yIGFscmVhZHkgZXhpc3RzLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTJcXFwiPjkxMjwvYT58Q2Fubm90IGFkZCBkZWNpc2lvbiB0byBTdGFnZWQgTW9kaWZpY2F0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTNcXFwiPjkxMzwvYT58VGhlIFN0YWdlZCBNb2RpZmljYXRpb24gY291bGQgbm90IGJlIGFwcGxpZWQufCAgfCB8IDxhIG5hbWU9XFxcIjkxNFxcXCI+OTE0PC9hPnxBY3Rpb24gY2Fubm90IGJlIGV4ZWN1dGVkLnwgIHwgfCA8YSBuYW1lPVxcXCI5MTVcXFwiPjkxNTwvYT58Q2Fubm90IHVwc2VydCBtdWx0aXBsZSB2ZXJzaW9ucyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBpbiBvbmUgcmVxdWVzdC58ICB8IHwgPGEgbmFtZT1cXFwiOTE2XFxcIj45MTY8L2E+fFBsYWNlbWVudCBhbmQgZGlyZWN0IGRlc2NlbmRlbnRzIGhhdmUgbW9yZSBleGVjdXRlZCBxdWFudGl0eSB0aGFuIHRvdGFsIHBsYWNlbWVudCBxdWFudGl0eS58ICB8IHwgPGEgbmFtZT1cXFwiOTE3XFxcIj45MTc8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgd2l0aCB0aGlzIEVudHJ5VHlwZS58ICB8IHwgPGEgbmFtZT1cXFwiOTE4XFxcIj45MTg8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgaW4gdGhpcyBTdGF0ZS58ICB8IHwgPGEgbmFtZT1cXFwiOTE5XFxcIj45MTk8L2E+fFBsYWNlbWVudCBjb3VsZCBub3QgYmUgY2FuY2VsbGVkLnwgIHwgfCA8YSBuYW1lPVxcXCI5MjBcXFwiPjkyMDwvYT58U2hhcmUgQ2xhc3Mgbm90IGNvbmZpZ3VyZWQgaW4gRnVuZHwgIHwgfCA8YSBuYW1lPVxcXCI5MjFcXFwiPjkyMTwvYT58U2hhcmUgQ2xhc3MgU3ViIEhvbGRpbmcgS2V5IG5vdCBjb25maWd1cmVkIGluIFBvcnRmb2xpb3wgIHwgfCA8YSBuYW1lPVxcXCI5MjJcXFwiPjkyMjwvYT58Q291bGQgbm90IHVwZGF0ZSBhbiBvcmRlci58ICB8IHwgPGEgbmFtZT1cXFwiOTIzXFxcIj45MjM8L2E+fE11bHRpcGxlIHNldHMgb2YgU2hhcmUgQ2xhc3MgU3ViIEhvbGRpbmcgS2V5cyBjb25maWd1cmVkIGFjcm9zcyB0aGUgUG9ydGZvbGlvcyBvZiBhIEZ1bmQufCAgfCB8IDxhIG5hbWU9XFxcIjkyNFxcXCI+OTI0PC9hPnxPbmUgb3IgbW9yZSBtYXRyaXggY2VsbHMgY291bGQgbm90IGJlIGFkZGVkIHRvIHRoZSBtYXRyaXgufCAgfCB8IDxhIG5hbWU9XFxcIjkyNVxcXCI+OTI1PC9hPnxUaGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIHByb3ZpZGVkIG1hdHJpeCBkZWZpbml0aW9uLnwgIHwgfCA8YSBuYW1lPVxcXCI5MjZcXFwiPjkyNjwvYT58TWF0cml4IGRlZmluaXRpb24gZG9lcyBub3QgZXhpc3QufCAgfCB8IDxhIG5hbWU9XFxcIjkyN1xcXCI+OTI3PC9hPnxNYXRyaXggZGVmaW5pdGlvbiBjb3VsZCBub3QgYmUgZGVsZXRlZCBiZWNhdXNlIGl0IGRvZXNuXFwndCBleGlzdC58ICB8IHwgPGEgbmFtZT1cXFwiOTI4XFxcIj45Mjg8L2E+fERhdGFUeXBlIHdpdGggSWQgYWxyZWFkeSBleGlzdHMufCAgfCB8IDxhIG5hbWU9XFxcIjkyOVxcXCI+OTI5PC9hPnxTcXVhcmUgbWF0cml4IGlzIGluY29tcGxldGUufCAgfCB8IDxhIG5hbWU9XFxcIjkzMFxcXCI+OTMwPC9hPnxBIGNvbmRpdGlvbmFsIGxpY2Vuc2UgdGVybSBoYXMgYmVlbiBleGNlZWRlZC58ICB8IHwgPGEgbmFtZT1cXFwiOTMxXFxcIj45MzE8L2E+fFRoZSBDdXN0b20gRGF0YSBNb2RlbCByZXF1ZXN0ZWQgaXMgbm90IGludGVuZGVkIGZvciB0aGUgZW50aXR5IHByb3ZpZGVkLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzJcXFwiPjkzMjwvYT58VGhlIGVudGl0eSBwcm92aWRlZCBkb2VzIG5vdCBoYXZlIGEgbWFuZGF0b3J5IHByb3BlcnR5IHNwZWNpZmllZCBieSB0aGUgQ3VzdG9tIERhdGEgTW9kZWwufCAgfCB8IDxhIG5hbWU9XFxcIjkzM1xcXCI+OTMzPC9hPnxUaGUgZW50aXR5IHByb3ZpZGVkIGhhcyBhIHByb3BlcnR5IG5vdCBhbGxvd2VkIGJ5IHRoZSBzcGVjaWZpZWQgQ3VzdG9tIERhdGEgTW9kZWwufCAgfCB8IDxhIG5hbWU9XFxcIjkzNFxcXCI+OTM0PC9hPnxUaGUgZW50aXR5IHByb3ZpZGVkIGRvZXMgbm90IGhhdmUgYSBtYW5kYXRvcnkgaWRlbnRpZmllciBzcGVjaWZpZWQgYnkgdGhlIEN1c3RvbSBEYXRhIE1vZGVsLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzVcXFwiPjkzNTwvYT58VGhlIGVudGl0eSBwcm92aWRlZCBoYXMgYW4gaWRlbnRpZmllciBub3QgYWxsb3dlZCBieSB0aGUgc3BlY2lmaWVkIEN1c3RvbSBEYXRhIE1vZGVsLnwgIHwgfCA8YSBuYW1lPVxcXCI5MzZcXFwiPjkzNjwvYT58VGhlIEN1c3RvbSBEYXRhIE1vZGVsIGluY2x1ZGVkIGFuIGFsaWFzIG9yIHNvcnQtYnkgYXR0cmlidXRlIHRoYXQgd2FzIG5vdCBvbiB0aGUgZGVmaW5pdGlvbi58ICB8IHwgPGEgbmFtZT1cXFwiOTM3XFxcIj45Mzc8L2E+fFRoZSBDbG9zZWRQZXJpb2Qgd2l0aCB0aGUgSWQgYWxyZWFkeSBleGlzdHMgb24gdGhlIFRpbWVsaW5lfCAgfCB8IDxhIG5hbWU9XFxcIjkzOFxcXCI+OTM4PC9hPnxUaGUgbmV3IENsb3NlZCBQZXJpb2Qgd291bGQgY2F1c2UgdGhlIFRpbWVsaW5lIHRvIGhhdmUgbm9uLWNvbnRpZ3VvdXMgQ2xvc2VkIFBlcmlvZHN8ICB8IHwgPGEgbmFtZT1cXFwiOTM5XFxcIj45Mzk8L2E+fEJsb2NrZWQgYnkgYSBOZXR3b3JrIFpvbmV8ICB8IHwgPGEgbmFtZT1cXFwiOTQwXFxcIj45NDA8L2E+fFRoZSBlbnRpdHkgcHJvdmlkZWQgZG9lcyBub3QgbWVldCB0aGUgY29uZGl0aW9ucyBvZiB0aGUgQ3VzdG9tIERhdGEgTW9kZWwufCAgfCB8IDxhIG5hbWU9XFxcIjk0MVxcXCI+OTQxPC9hPnxPcmRlciBub3QgY29tcGxpYW50LnwgIHwgfCA8YSBuYW1lPVxcXCI5NDJcXFwiPjk0MjwvYT58QWN0aW9uIHdvdWxkIGNyZWF0ZSBhIGNpcmN1bGFyIGRlcGVuZGVuY3kufCAgfCB8IDxhIG5hbWU9XFxcIjk0NFxcXCI+OTQ0PC9hPnxEZXJpdmVkIFByb3BlcnR5IGNhbGN1bGF0aW9uIG5vdCBjb21wbGV0ZS58ICB8IHwgPGEgbmFtZT1cXFwiOTQ1XFxcIj45NDU8L2E+fERlcml2ZWQgUHJvcGVydHkgaXMgbm90IGZpbHRlcmFibGUufCAgfCB8IDxhIG5hbWU9XFxcIjk0NlxcXCI+OTQ2PC9hPnxUaGUgY29uZGl0aW9ucyBwcm92aWRlZCBoYXZlIG9uZSBvciBtb3JlIGVycm9ycy58ICB8IHwgPGEgbmFtZT1cXFwiOTQ3XFxcIj45NDc8L2E+fFRoZSBwcm9wZXJ0eS9pZGVudGlmaWVyIGRvbWFpbiBhbmQgZW50aXR5IGRvbWFpbiBkbyBub3QgbWF0Y2gufCAgfCB8IDxhIG5hbWU9XFxcIjk0OFxcXCI+OTQ4PC9hPnxJbnZhbGlkIFRpbWVsaW5lfCAgfCB8IDxhIG5hbWU9XFxcIjk0OVxcXCI+OTQ5PC9hPnxGaWx0ZXJhYmxlIERlcml2ZWQgUHJvcGVydHkgbGltaXQgcmVhY2hlZC58ICB8IHwgPGEgbmFtZT1cXFwiOTUwXFxcIj45NTA8L2E+fEludmVzdG9yIFJlY29yZCBJZGVudGlmaWVyIEFscmVhZHkgSW4gVXNlfCAgfCB8IDxhIG5hbWU9XFxcIjk1MVxcXCI+OTUxPC9hPnxJbnZlc3RvciBSZWNvcmQgTm90IEZvdW5kfCAgfCB8IDxhIG5hbWU9XFxcIjk1MlxcXCI+OTUyPC9hPnxJbnZlc3RtZW50IEFjY291bnQgSWRlbnRpZmllciBBbHJlYWR5IEluIFVzZXwgIHwgfCA8YSBuYW1lPVxcXCI5NTNcXFwiPjk1MzwvYT58SW52ZXN0bWVudCBBY2NvdW50IE5vdCBGb3VuZHwgIHwgfCA8YSBuYW1lPVxcXCI5NTRcXFwiPjk1NDwvYT58Q291bGQgTm90IFN3ZWVwIEJsb2NrfCAgfCB8IDxhIG5hbWU9XFxcIjk1NVxcXCI+OTU1PC9hPnxFbnRpdHkgVW5pcXVlIElkIGhhcyB0aGUgd3JvbmcgZm9ybWF0fCAgfCB8IDxhIG5hbWU9XFxcIjk1NlxcXCI+OTU2PC9hPnxQb3N0IENsb3NlIEFjdGl2aXR5IGlzIGludmFsaWR8ICB8IHwgPGEgbmFtZT1cXFwiOTU3XFxcIj45NTc8L2E+fFRoZSBDbG9zZWRQZXJpb2Qgd2l0aCB0aGUgSWQgZG9lcyBub3QgZXhpc3Qgb24gdGhlIFRpbWVsaW5lfCAgfCB8IDxhIG5hbWU9XFxcIjk1OFxcXCI+OTU4PC9hPnxJbnZhbGlkIFNldHRsZW1lbnQgSW5zdHJ1Y3Rpb25zfCAgfCB8IDxhIG5hbWU9XFxcIjk1OVxcXCI+OTU5PC9hPnxPcmRlciByZXF1aXJlcyBxdWFudGl0eS58ICB8IHwgPGEgbmFtZT1cXFwiOTYwXFxcIj45NjA8L2E+fEludmFsaWQgRGF0YVBvaW50IFZhbHVlIEFzc2lnbm1lbnR8ICB8IHwgPGEgbmFtZT1cXFwiOTYxXFxcIj45NjE8L2E+fEludmFsaWQgUmVsYXRpb25hbCBEYXRhc2V0IEZpZWxkIERlZmluaXRpb258ICB8IHwgPGEgbmFtZT1cXFwiOTYyXFxcIj45NjI8L2E+fFJlbGF0aW9uYWwgRGF0YXNldCBEZWZpbml0aW9uIERvZXMgTm90IEV4aXN0fCAgfCB8IDxhIG5hbWU9XFxcIjk2M1xcXCI+OTYzPC9hPnxUaW1lbGluZSBCb29rbWFyayBOb3QgSW4gT3BlbiBQZXJpb2R8ICB8IHwgPGEgbmFtZT1cXFwiOTY0XFxcIj45NjQ8L2E+fFRoZSBDdXN0b20gRGF0YSBNb2RlbCBzcGVjaWZpZWQgaWRlbnRpZmllcnMgYnV0IHRoZSBlbnRpdHkgZG9lcyBub3Qgc3VwcG9ydCBpZGVudGlmaWVyc3wgIHwgfCA8YSBuYW1lPVxcXCI5NjVcXFwiPjk2NTwvYT58VGhlIHNvcnQgYnkgcHJvdmlkZWQgaGFzIG9uZSBvciBtb3JlIGVycm9yc3wgIHwgfCA8YSBuYW1lPVxcXCI5NjZcXFwiPjk2NjwvYT58SW52YWxpZCBDdXN0b20gRGF0YSBNb2RlbCBEZWZpbml0aW9ufCAgfCB8IDxhIG5hbWU9XFxcIjk2N1xcXCI+OTY3PC9hPnxSdWxlIHNldCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgQ2hlY2sgRGVmaW5pdGlvbnwgIHwgfCA8YSBuYW1lPVxcXCI5NjhcXFwiPjk2ODwvYT58VGhlIENsb3NlZCBQZXJpb2QgaXMgaW52YWxpZHwgIHwgfCA8YSBuYW1lPVxcXCI5NjlcXFwiPjk2OTwvYT58Q2Fubm90IHVwZGF0ZSBhIHBsYWNlbWVudCB3aXRoIHRoaXMgU3RvcCBQcmljZS58ICB8IHwgPGEgbmFtZT1cXFwiOTcwXFxcIj45NzA8L2E+fENhbm5vdCB1cGRhdGUgYSBwbGFjZW1lbnQgd2l0aCB0aGlzIExpbWl0IFByaWNlLnwgIHwgfCA8YSBuYW1lPVxcXCI5NzFcXFwiPjk3MTwvYT58Q2Fubm90IHVwZGF0ZSBhIHBsYWNlbWVudCB3aXRoIHRoZSBjdXJyZW50IFR5cGUufCAgfCB8IDxhIG5hbWU9XFxcIjk3NFxcXCI+OTc0PC9hPnxDYW5ub3QgUGxhY2VCbG9ja3MgYWdhaW5zdCBhbiBcXCdVbnNvbGljaXRlZFxcJyBCbG9jayAoYmxvY2sgY29udGFpbmluZyAwIE9yZGVycykufCAgfCB8IDxhIG5hbWU9XFxcIjk3NVxcXCI+OTc1PC9hPnxObyBQb3J0Zm9saW8gR3JvdXAgU2VsZWN0ZWR8ICB8IHwgPGEgbmFtZT1cXFwiOTc2XFxcIj45NzY8L2E+fEFtYmlndW91cyBTY29wZXwgIHwgXG4gKlxuICogQ29udGFjdDogaW5mb0BmaW5ib3VybmUuY29tXG4gKlxuICogTk9URTogVGhpcyBjbGFzcyBpcyBhdXRvIGdlbmVyYXRlZCBieSBPcGVuQVBJIEdlbmVyYXRvciAoaHR0cHM6Ly9vcGVuYXBpLWdlbmVyYXRvci50ZWNoKS5cbiAqIGh0dHBzOi8vb3BlbmFwaS1nZW5lcmF0b3IudGVjaFxuICogRG8gbm90IGVkaXQgdGhlIGNsYXNzIG1hbnVhbGx5LlxuICovXG4vKiB0c2xpbnQ6ZGlzYWJsZTpuby11bnVzZWQtdmFyaWFibGUgbWVtYmVyLW9yZGVyaW5nICovXG5cbmltcG9ydCB7IEluamVjdCwgSW5qZWN0YWJsZSwgT3B0aW9uYWwgfSAgICAgICAgICAgICAgICAgICAgICBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEh0dHBDbGllbnQsIEh0dHBIZWFkZXJzLCBIdHRwUGFyYW1zLFxuICAgICAgICAgSHR0cFJlc3BvbnNlLCBIdHRwRXZlbnQsIEh0dHBQYXJhbWV0ZXJDb2RlYywgSHR0cENvbnRleHQgXG4gICAgICAgIH0gICAgICAgZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjIH0gICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL2VuY29kZXInO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJ3J4anMnO1xuXG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9hY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQWxsb2NhdGlvbkdyb3VwRGVmaW5pdGlvbiB9IGZyb20gJy4uL21vZGVsL2FsbG9jYXRpb25Hcm91cERlZmluaXRpb24nO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQ3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvY3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IERlbGV0ZWRFbnRpdHlSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL2RlbGV0ZWRFbnRpdHlSZXNwb25zZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBEaWFyeUVudHJ5IH0gZnJvbSAnLi4vbW9kZWwvZGlhcnlFbnRyeSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBGZWUgfSBmcm9tICcuLi9tb2RlbC9mZWUnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRmVlUHJvcGVydGllcyB9IGZyb20gJy4uL21vZGVsL2ZlZVByb3BlcnRpZXMnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRmVlUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL2ZlZVJlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRnVuZCB9IGZyb20gJy4uL21vZGVsL2Z1bmQnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRnVuZENhbGVuZGFyRW50cnkgfSBmcm9tICcuLi9tb2RlbC9mdW5kQ2FsZW5kYXJFbnRyeSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBGdW5kRGVmaW5pdGlvblJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC9mdW5kRGVmaW5pdGlvblJlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgRnVuZFByb3BlcnRpZXMgfSBmcm9tICcuLi9tb2RlbC9mdW5kUHJvcGVydGllcyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBGdW5kUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL2Z1bmRSZXF1ZXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IEZ1bmRWYWx1YXRpb25SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvZnVuZFZhbHVhdGlvblJlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgTGlzdEFnZ3JlZ2F0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9saXN0QWdncmVnYXRpb25SZXNwb25zZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBMdXNpZFByb2JsZW1EZXRhaWxzIH0gZnJvbSAnLi4vbW9kZWwvbHVzaWRQcm9ibGVtRGV0YWlscyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBMdXNpZFZhbGlkYXRpb25Qcm9ibGVtRGV0YWlscyB9IGZyb20gJy4uL21vZGVsL2x1c2lkVmFsaWRhdGlvblByb2JsZW1EZXRhaWxzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IE5hdkFjdGl2aXR5QWRqdXN0bWVudCB9IGZyb20gJy4uL21vZGVsL25hdkFjdGl2aXR5QWRqdXN0bWVudCc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBOYXZBY3Rpdml0eUFkanVzdG1lbnRSZXNwb25zZSB9IGZyb20gJy4uL21vZGVsL25hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IE9wZXJhdGlvbiB9IGZyb20gJy4uL21vZGVsL29wZXJhdGlvbic7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBQYWdlZFJlc291cmNlTGlzdE9mRmVlIH0gZnJvbSAnLi4vbW9kZWwvcGFnZWRSZXNvdXJjZUxpc3RPZkZlZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBQYWdlZFJlc291cmNlTGlzdE9mRnVuZCB9IGZyb20gJy4uL21vZGVsL3BhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kQ2FsZW5kYXJFbnRyaWVzIH0gZnJvbSAnLi4vbW9kZWwvcGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmRDYWxlbmRhckVudHJpZXMnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmRDYWxlbmRhckVudHJ5IH0gZnJvbSAnLi4vbW9kZWwvcGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmRDYWxlbmRhckVudHJ5Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFBhZ2VkUmVzb3VyY2VMaXN0T2ZWYWx1YXRpb25Qb2ludEluc3RydW1lbnQgfSBmcm9tICcuLi9tb2RlbC9wYWdlZFJlc291cmNlTGlzdE9mVmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFBhZ2VkUmVzb3VyY2VMaXN0T2ZWYWx1YXRpb25Qb2ludE92ZXJ2aWV3IH0gZnJvbSAnLi4vbW9kZWwvcGFnZWRSZXNvdXJjZUxpc3RPZlZhbHVhdGlvblBvaW50T3ZlcnZpZXcnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgUHJvcGVydHkgfSBmcm9tICcuLi9tb2RlbC9wcm9wZXJ0eSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBRdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyB9IGZyb20gJy4uL21vZGVsL3F1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFJlc291cmNlTGlzdE9mTmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbC9yZXNvdXJjZUxpc3RPZk5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFJldmVydFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC9yZXZlcnRWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFNlcmllc0RlZmluaXRpb25SZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvc2VyaWVzRGVmaW5pdGlvblJlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgU2V0U2hhcmVDbGFzc0luc3RydW1lbnRzUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL3NldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgU2luZ2xlVmFsdWF0aW9uUG9pbnRRdWVyeVBhcmFtZXRlcnMgfSBmcm9tICcuLi9tb2RlbC9zaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycyc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBVcGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC91cGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVXBzZXJ0RnVuZEJvb2ttYXJrUmVxdWVzdCB9IGZyb20gJy4uL21vZGVsL3Vwc2VydEZ1bmRCb29rbWFya1JlcXVlc3QnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVXBzZXJ0VmFsdWF0aW9uUG9pbnRSZXF1ZXN0IH0gZnJvbSAnLi4vbW9kZWwvdXBzZXJ0VmFsdWF0aW9uUG9pbnRSZXF1ZXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50IH0gZnJvbSAnLi4vbW9kZWwvdmFsdWF0aW9uUG9pbnQnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzIH0gZnJvbSAnLi4vbW9kZWwvdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgfSBmcm9tICcuLi9tb2RlbC92YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50RGF0YVJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWwvdmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2UnO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZENvbXBsZXhNYXJrZXREYXRhIH0gZnJvbSAnLi4vbW9kZWwvdmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZENvbXBsZXhNYXJrZXREYXRhJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRRdW90ZSB9IGZyb20gJy4uL21vZGVsL3ZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRRdW90ZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkVHJhbnNhY3Rpb24gfSBmcm9tICcuLi9tb2RlbC92YWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkVHJhbnNhY3Rpb24nO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeSB9IGZyb20gJy4uL21vZGVsL3ZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kQ2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3knO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRDYXNoU3RhdGVtZW50Um93IH0gZnJvbSAnLi4vbW9kZWwvdmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRDYXNoU3RhdGVtZW50Um93Jztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kSm91cm5hbEVudHJ5TGluZSB9IGZyb20gJy4uL21vZGVsL3ZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kSm91cm5hbEVudHJ5TGluZSc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mUG5sSm91cm5hbEVudHJ5TGluZSB9IGZyb20gJy4uL21vZGVsL3ZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZQbmxKb3VybmFsRW50cnlMaW5lJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZUcmlhbEJhbGFuY2UgfSBmcm9tICcuLi9tb2RlbC92YWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mVHJpYWxCYWxhbmNlJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZVbnNldHRsZWRUcmFuc2FjdGlvbiB9IGZyb20gJy4uL21vZGVsL3ZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZVbnNldHRsZWRUcmFuc2FjdGlvbic7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZkZ1bmRBMkJEYXRhUmVjb3JkIH0gZnJvbSAnLi4vbW9kZWwvdmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZGdW5kQTJCRGF0YVJlY29yZCc7XG4vLyBAdHMtaWdub3JlXG5pbXBvcnQgeyBWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZkZ1bmRBMkJNb3ZlbWVudFJlY29yZCB9IGZyb20gJy4uL21vZGVsL3ZlcnNpb25lZFJlc291cmNlTGlzdE9mRnVuZEEyQk1vdmVtZW50UmVjb3JkJztcbi8vIEB0cy1pZ25vcmVcbmltcG9ydCB7IFZlcnNpb25lZFJlc291cmNlTGlzdE9mSG9sZGluZ0NvbnRyaWJ1dG9yIH0gZnJvbSAnLi4vbW9kZWwvdmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZIb2xkaW5nQ29udHJpYnV0b3InO1xuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgVmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZQb3J0Zm9saW9Ib2xkaW5nIH0gZnJvbSAnLi4vbW9kZWwvdmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZQb3J0Zm9saW9Ib2xkaW5nJztcblxuLy8gQHRzLWlnbm9yZVxuaW1wb3J0IHsgQkFTRV9QQVRILCBDT0xMRUNUSU9OX0ZPUk1BVFMgfSAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29uZmlndXJhdGlvbic7XG5cblxuZXhwb3J0IGludGVyZmFjZSBBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIHZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3Qgd2hpY2ggY29udGFpbnMgdGhlIERpYXJ5IEVudHJ5IGNvZGUgZm9yIHRoZSBFc3RpbWF0ZSBWYWx1YXRpb24gUG9pbnQgdG8gbW92ZSB0byBDYW5kaWRhdGUgb3IgRmluYWwgc3RhdGUuICovXG4gICAgdmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdDogVmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdDtcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgYWNjZXB0cyB0aGUgVmFsdWF0aW9uIFBvaW50IG9mIHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQWRkQWxsb2NhdGlvbkdyb3Vwc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBkZWZpbml0aW9ucyBvZiB0aGUgQWxsb2NhdGlvbiBHcm91cHMgdG8gYWRkIHRvIHRoZSBGdW5kLiAqL1xuICAgIGFsbG9jYXRpb25Hcm91cERlZmluaXRpb246IEFycmF5PEFsbG9jYXRpb25Hcm91cERlZmluaXRpb24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFkZFNlcmllc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBkZWZpbml0aW9ucyBvZiB0aGUgU2VyaWVzIHRvIGFkZC4gKi9cbiAgICBzZXJpZXNEZWZpbml0aW9uUmVxdWVzdDogQXJyYXk8U2VyaWVzRGVmaW5pdGlvblJlcXVlc3Q+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUZlZVJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBGZWUgdG8gY3JlYXRlLiAqL1xuICAgIGZlZVJlcXVlc3Q6IEZlZVJlcXVlc3Q7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIGNyZWF0ZXMgdGhlIEZlZSBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlRnVuZFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGRlZmluaXRpb24gb2YgdGhlIEZ1bmQuICovXG4gICAgZnVuZFJlcXVlc3Q6IEZ1bmRSZXF1ZXN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUZ1bmRWMlJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGRlZmluaXRpb24gb2YgdGhlIEZ1bmQuICovXG4gICAgZnVuZERlZmluaXRpb25SZXF1ZXN0OiBGdW5kRGVmaW5pdGlvblJlcXVlc3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgVmFsdWF0aW9uIFBvaW50IEVzdGltYXRlIGRlZmluaXRpb24gdG8gY3JlYXRlLiAqL1xuICAgIGNyZWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdDogQ3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0O1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBjcmVhdGVzIHRoZSBWYWx1YXRpb24gUG9pbnQgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlYWN0aXZhdGVOYXZUeXBlc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlcyBvZiB0aGUgbmF2IHR5cGVzIHRvIGJlIGRlYWN0aXZhdGVkLiAqL1xuICAgIHJlcXVlc3RCb2R5OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKiBUaGUgZGVsZXRlIG1vZGUgdG8gdXNlLiBEZWZhdWx0IHZhbHVlOiBTb2Z0LiBBdmFpbGFibGUgdmFsdWVzOiBTb2Z0LCBIYXJkLiAqL1xuICAgIGRlbGV0ZU1vZGU/OiAnU29mdCcgfCAnSGFyZCc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlQm9va21hcmtSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYm9va21hcmsgY29kZSBmb3IgdGhlIGJvb2ttYXJrIHRvIGJlIGRlbGV0ZWQuICovXG4gICAgYm9va21hcmtDb2RlOiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIGRlbGV0ZXMgdGhlIEJvb2ttYXJrIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWxldGVGZWVSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRmVlIHRvIGJlIGRlbGV0ZWQuICovXG4gICAgZmVlQ29kZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERlbGV0ZUZ1bmRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kIHRvIGJlIGRlbGV0ZWQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQgdG8gYmUgZGVsZXRlZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWxldGVOYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgaXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZ2l2ZW4gRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2YWx1YXRpb24gcG9pbnQgQ29kZSB0byBkZWxldGUgdGhlIGFkanVzdG1lbnQgZnJvbSAqL1xuICAgIHZhbHVhdGlvblBvaW50Q29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgcmVxdWVzdCBkZXNjcmliaW5nIHRoZSBOYXYgYWN0aXZpdHkgYWRqdXN0bWVudHMgdG8gZGVsZXRlIGZyb20gYSBzcGVjaWZpYyB2YWx1YXRpb24gcG9pbnQgYW5kIG5hdiB0eXBlICovXG4gICAgbmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2U6IEFycmF5PE5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlPjtcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgcnVucyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2YXJpYW50IG9mIHRoZSB2YWx1YXRpb24gcG9pbnQgdXNlZCBpbiB0aGUgcmVxdWVzdC4gVG9nZXRoZXIgd2l0aCB0aGUgdmFsdWF0aW9uIHBvaW50IGNvZGUgbWFya3MgdGhlIHVuaXF1ZSBicmFuY2ggZm9yIHRoZSBOYXZUeXBlLiAqL1xuICAgIHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsZXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgZGlhcnkgZW50cnkgY29kZSBmb3IgdGhlIHZhbHVhdGlvbiBQb2ludCB0byBiZSBkZWxldGVkLiAqL1xuICAgIGRpYXJ5RW50cnlDb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2YXJpYW50IG9mIHRoZSB2YWx1YXRpb24gcG9pbnQgdXNlZCBpbiB0aGUgcmVxdWVzdC4gVG9nZXRoZXIgd2l0aCB0aGUgdmFsdWF0aW9uIHBvaW50IGNvZGUgbWFya3MgdGhlIHVuaXF1ZSBicmFuY2ggZm9yIHRoZSBOYXZUeXBlLiBUaGlzIGlzIHdvcmtpbmcgb25seSBmb3IgdGhlIEVzdGltYXRlcy4gKi9cbiAgICBkaWFyeUVudHJ5Q29kZVZhcmlhbnQ/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIGRlbGV0ZXMgdGhlIFZhbHVhdGlvbiBQb2ludCBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmluYWxpc2VDYW5kaWRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBkZXRhaWxzIG9mIHRoZSBWYWx1YXRpb24gUG9pbnQgdG8gbWFyayBhcyBmaW5hbC4gKi9cbiAgICB2YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0OiBWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0O1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBmaW5hbGlzZXMgdGhlIFZhbHVhdGlvbiBQb2ludCBvZiB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEEyQkRhdGFGb3JGdW5kUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGFyZ3VtZW50cyB0byB1c2UgZm9yIHF1ZXJ5aW5nIHRoZSBBMkIgZGF0YS4gVGhpcyBpbmNsdWRlcyBzdGFydCBhbmQgZW5kIGRhdGVzLiAqL1xuICAgIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVyczogVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmVzb2x2ZSB0aGUgZnVuZCBhbmQgdGhlIHRpbWVsaW5lLiBEZWZhdWx0cyAgICAgICAgICAgICAgdG8gcmV0dXJuIHRoZSBsYXRlc3QgdmVyc2lvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHQgc2V0LiBSZWFkIG1vcmUgYWJvdXQgZmlsdGVyaW5nIHJlc3VsdHMgZnJvbSBMVVNJRCBoZXJlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZmlsdGVyaW5nLXJlc3VsdHMtZnJvbS1sdXNpZC4gKi9cbiAgICBmaWx0ZXI/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIFxcJnF1b3Q7SW5zdHJ1bWVudFxcJnF1b3Q7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvICAgICAgICAgICAgICB0aGUgQTJCIGRhdGEuIFRoZXNlIHRha2UgdGhlIGZvcm1hdCB7ZG9tYWlufS97c2NvcGV9L3tjb2RlfSBlLmcuIFxcJnF1b3Q7SW5zdHJ1bWVudC9zeXN0ZW0vTmFtZVxcJnF1b3Q7LiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0QTJCTW92ZW1lbnRzRm9yRnVuZFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhcmd1bWVudHMgdG8gdXNlIGZvciBxdWVyeWluZyB0aGUgQTJCIG1vdmVtZW50cy4gVGhpcyBpbmNsdWRlcyBzdGFydCBhbmQgZW5kIGRhdGVzLiAqL1xuICAgIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVyczogVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmVzb2x2ZSB0aGUgZnVuZCBhbmQgdGhlIHRpbWVsaW5lLiBEZWZhdWx0cyAgICAgICAgICAgICAgdG8gcmV0dXJuIHRoZSBsYXRlc3QgdmVyc2lvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHQgc2V0LiBSZWFkIG1vcmUgYWJvdXQgZmlsdGVyaW5nIHJlc3VsdHMgZnJvbSBMVVNJRCBoZXJlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZmlsdGVyaW5nLXJlc3VsdHMtZnJvbS1sdXNpZC4gKi9cbiAgICBmaWx0ZXI/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIFxcJnF1b3Q7SW5zdHJ1bWVudFxcJnF1b3Q7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvICAgICAgICAgICAgICB0aGUgQTJCIG1vdmVtZW50cy4gVGhlc2UgdGFrZSB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9IGUuZy4gXFwmcXVvdDtJbnN0cnVtZW50L3N5c3RlbS9OYW1lXFwmcXVvdDsuICovXG4gICAgcHJvcGVydHlLZXlzPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRGZWVSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRmVlLiAqL1xuICAgIGZlZUNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGVmZmVjdGl2ZSBkYXRldGltZSBvciBjdXQgbGFiZWwgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIEZlZSBwcm9wZXJ0aWVzLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBMVVNJRCBzeXN0ZW0gZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBlZmZlY3RpdmVBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIEZlZS4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgRmVlIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0ZlZVxcJiMzOTsgZG9tYWluIHRvIGRlY29yYXRlIG9udG8gdGhlIEZlZS4gICAgICAgICAgICAgIFRoZXNlIG11c3QgdGFrZSB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9LCBmb3IgZXhhbXBsZSBcXCYjMzk7RmVlL0FjY291bnQvSWRcXCYjMzk7LiBJZiBubyBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQsIHRoZW4gbm8gcHJvcGVydGllcyB3aWxsIGJlIHJldHVybmVkLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RmVlUHJvcGVydGllc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGZWUgdG8gZ2V0IHRoZSBwcm9wZXJ0aWVzIGZvci4gKi9cbiAgICBmZWVDb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBlZmZlY3RpdmUgZGF0ZXRpbWUgb3IgY3V0IGxhYmVsIGF0IHdoaWNoIHRvIGxpc3QgdGhlIEZlZVxcJiMzOTtzIHByb3BlcnRpZXMuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IExVU0lEIHN5c3RlbSBkYXRldGltZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGVmZmVjdGl2ZUF0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBsaXN0IHRoZSBGZWVcXCYjMzk7cyBwcm9wZXJ0aWVzLiBEZWZhdWx0cyB0byByZXR1cm4gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggcHJvcGVydHkgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEZ1bmRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGV0aW1lIG9yIGN1dCBsYWJlbCBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgRnVuZCBwcm9wZXJ0aWVzLiBEZWZhdWx0cyB0byB0aGUgY3VycmVudCBMVVNJRCBzeXN0ZW0gZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBlZmZlY3RpdmVBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIEZ1bmQgZGVmaW5pdGlvbi4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgRnVuZCBkZWZpbml0aW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0Z1bmRcXCYjMzk7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvIHRoZSBGdW5kLiAgICAgICAgICAgICAgVGhlc2UgbXVzdCB0YWtlIHRoZSBmb3JtYXQge2RvbWFpbn0ve3Njb3BlfS97Y29kZX0sIGZvciBleGFtcGxlIFxcJiMzOTtGdW5kL01hbmFnZXIvSWRcXCYjMzk7LiBJZiBubyBwcm9wZXJ0aWVzIGFyZSBzcGVjaWZpZWQsIHRoZW4gbm8gcHJvcGVydGllcyB3aWxsIGJlIHJldHVybmVkLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RnVuZFByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kIHRvIGxpc3QgdGhlIHByb3BlcnRpZXMgZm9yLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kIHRvIGxpc3QgdGhlIHByb3BlcnRpZXMgZm9yLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGV0aW1lIG9yIGN1dCBsYWJlbCBhdCB3aGljaCB0byBsaXN0IHRoZSBGdW5kXFwmIzM5O3MgcHJvcGVydGllcy4gRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgTFVTSUQgc3lzdGVtIGRhdGV0aW1lIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgZWZmZWN0aXZlQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIGxpc3QgdGhlIEZ1bmRcXCYjMzk7cyBwcm9wZXJ0aWVzLiBEZWZhdWx0cyB0byByZXR1cm4gdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggcHJvcGVydHkgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIHVuaXF1ZSBob2xkaW5nIGlkZW50aWZpZXIgKi9cbiAgICBob2xkaW5nSWQ6IG51bWJlcjtcbiAgICAvKiogVGhlIGFyZ3VtZW50cyB0byB1c2UgZm9yIHF1ZXJ5aW5nIHRoZSBob2xkaW5ncy5UaGlzIGNhbiBiZSBhIGRhdGUsIHZhbHVhdGlvblBvaW50IG9yIGEgYm9va21hcmsuICovXG4gICAgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzOiBWYWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBJZiB0cnVlLCB0cmFuc2FjdGlvbnMgZnJvbSBwcmV2aW91c2x5IGNsb3NlZCBob2xkaW5ncyBhcmUgcmV0dXJuZWQuICAgICAgICAgICAgICBJZiBmYWxzZSwgb25seSB0cmFuc2FjdGlvbnMgZnJvbSBsYXN0IHRpbWUgcG9zaXRpb24gaXMgb3BlbmVkLiAqL1xuICAgIGluY2x1ZGVIaXN0b3JpYz86IGJvb2xlYW47XG4gICAgLyoqIENvbnN0cmFpbnMgdGhlIEhvbGRpbmcgQ29udHJpYnV0b3JzIHRvIHRob3NlIHdoaWNoIGNvbnRyaWJ1dGVkIHRvIHRoZSBzcGVjaWZpZWQgdGF4IGxvdC4gKi9cbiAgICB0YXhMb3RJZD86IHN0cmluZztcbiAgICAvKiogSWYgdHJ1ZSwgY29udHJpYnV0aW5nIHRyYW5zYWN0aW9uIHdoaWNoIGhhdmUgbm90IHNldHRsZWQgeWV0IHdpbGwgYWxzbyBiZSByZXR1cm5lZC4gRmFsc2UgYnkgZGVmYXVsdCAqL1xuICAgIGluY2x1ZGVVbnNldHRsZWRNb3ZlbWVudHM/OiBib29sZWFuO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBidWlsZCB0aGUgdHJhbnNhY3Rpb25zLiBEZWZhdWx0cyB0byByZXR1cm4gdGhlIGxhdGVzdCAgICAgICAgICAgICAgdmVyc2lvbiBvZiBlYWNoIHRyYW5zYWN0aW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgdHJhbnNhY3Rpb25zIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIEdldEhvbGRpbmdDb250cmlidXRvcnMuICovXG4gICAgcGFnZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRIb2xkaW5nc0ZvckZ1bmRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXJndW1lbnRzIHRvIHVzZSBmb3IgcXVlcnlpbmcgdGhlIGhvbGRpbmdzLiAqL1xuICAgIHNpbmdsZVZhbHVhdGlvblBvaW50UXVlcnlQYXJhbWV0ZXJzOiBTaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycztcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgcnVucyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBob2xkaW5ncyBvZiB0cmFuc2FjdGlvbiBwb3J0Zm9saW9zIGluIHRoZSBGdW5kLiBEZWZhdWx0cyAgICAgICAgICAgICAgdG8gcmV0dXJuIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgaG9sZGluZ3MgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBFeHByZXNzaW9uIHRvIGZpbHRlciB0aGUgcmVzdWx0IHNldC4gUmVhZCBtb3JlIGFib3V0IGZpbHRlcmluZyByZXN1bHRzIGZyb20gTFVTSUQgaGVyZSBodHRwczovL3N1cHBvcnQubHVzaWQuY29tL2ZpbHRlcmluZy1yZXN1bHRzLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBBIGxpc3Qgb2YgcHJvcGVydHkga2V5cyBmcm9tIHRoZSBcXCZxdW90O0luc3RydW1lbnRcXCZxdW90OywgXFwmcXVvdDtIb2xkaW5nXFwmcXVvdDsgb3IgXFwmcXVvdDtQb3J0Zm9saW9cXCZxdW90OyxcXCZxdW90O0N1c3RvZGlhbkFjY291bnRcXCZxdW90OyBvciBcXCZxdW90O0xlZ2FsRW50aXR5XFwmcXVvdDsgZG9tYWluIHRvIGRlY29yYXRlIG9udG8gZG9tYWluIHRvIGRlY29yYXRlIG9udG8gICAgICAgICAgICAgIHRoZSBob2xkaW5ncy4gVGhlc2UgdGFrZSB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9IGUuZy4gXFwmcXVvdDtJbnN0cnVtZW50L3N5c3RlbS9OYW1lXFwmcXVvdDsgb3IgXFwmcXVvdDtIb2xkaW5nL3N5c3RlbS9Db3N0XFwmcXVvdDsuICovXG4gICAgcHJvcGVydHlLZXlzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogV2hldGhlciB0byBleHBhbmQgdGhlIGhvbGRpbmdzIHRvIHJldHVybiB0aGUgdW5kZXJseWluZyB0YXgtbG90cy4gRGVmYXVsdHMgdG8gRmFsc2UuICovXG4gICAgYnlUYXhsb3RzPzogYm9vbGVhbjtcbiAgICAvKiogTnVtYmVyIG9mIGRheXMgYWhlYWQgdG8gYnJpbmcgYmFjayBzZXR0bGVtZW50cyBmcm9tLCBpbiByZWxhdGlvbiB0byB0aGUgc3BlY2lmaWVkIGVmZmVjdGl2ZUF0LiAqL1xuICAgIGluY2x1ZGVTZXR0bGVtZW50RXZlbnRzQWZ0ZXJEYXlzPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFZhbHVhdGlvbkZvckZ1bmRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIHJlcXVlc3Qgc3BlY2lmeWluZyB0aGUgZGF0ZXMgKG9yIERpYXJ5RW50cnkpIG9uIHdoaWNoIHRvIGNhbGN1bGF0ZSBhIHNldCBvZiB2YWx1YXRpb24gbWV0cmljcy4gKi9cbiAgICBmdW5kVmFsdWF0aW9uUmVxdWVzdD86IEZ1bmRWYWx1YXRpb25SZXF1ZXN0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhcmd1bWVudHMgdG8gdXNlIGZvciBxdWVyeWluZyB0aGUgVmFsdWF0aW9uIFBvaW50IGRhdGEuICovXG4gICAgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzOiBWYWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBGdW5kIGRlZmluaXRpb24uIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgdGhlIEZ1bmQgZGVmaW5pdGlvbiBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXJndW1lbnRzIHRvIHVzZSBmb3IgcXVlcnlpbmcgdGhlIEpvdXJuYWwgRW50cnkgTGluZXMuICovXG4gICAgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzOiBWYWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgLyoqIFRoZSBvcHRpb25hbCBjb2RlIG9mIGEgR2VuZXJhbCBMZWRnZXIgUHJvZmlsZSB1c2VkIHRvIGRlY29yYXRlIEpvdXJuYWwgRW50cnkgTGluZXMgd2l0aCBsZXZlbHMuICovXG4gICAgZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSBKb3VybmFsIEVudHJ5IExpbmVzLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdCBzZXQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyBKb3VybmFsIEVudHJ5IExpbmVzIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIEdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXMuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0luc3RydW1lbnRcXCYjMzk7LCBcXCYjMzk7VHJhbnNhY3Rpb25cXCYjMzk7LCBcXCYjMzk7UG9ydGZvbGlvXFwmIzM5OywgXFwmIzM5O0FjY291bnRcXCYjMzk7LCBcXCYjMzk7TGVnYWxFbnRpdHlcXCYjMzk7IG9yIFxcJiMzOTtDdXN0b2RpYW5BY2NvdW50XFwmIzM5OyAgICAgICAgICAgICAgIGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvIHRoZSBKb3VybmFsIEVudHJ5IExpbmVzLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBlYWNoIGxpbmVcXCYjMzk7cyBidWNrZXRNZW1iZXJzaGlwcyByZXBvcnQgb25seSB0aGlzIGJ1Y2tldCBzZXRcXCYjMzk7cyBjbGFzc2lmaWNhdGlvbiBvZiBpdC4gICAgICAgICAgICAgICBPdGhlcndpc2UsIGV2ZXJ5IGJ1Y2tldCBzZXQgY292ZXJpbmcgdGhlIE5BViBUeXBlIGlzIHJlcG9ydGVkLiAqL1xuICAgIGJ1Y2tldFNldENvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5UmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGFyZ3VtZW50cyB0byB1c2UgZm9yIGdlbmVyYXRpbmcgdGhlIFBuTCBzdW1tYXJ5LiAqL1xuICAgIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVyczogVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgY29kZSBvZiBhIEdlbmVyYWwgTGVkZ2VyIFByb2ZpbGUgdXNlZCB0byBkZWNvcmF0ZSBKb3VybmFsIEVudHJ5IExpbmVzIHdpdGggbGV2ZWxzLiAqL1xuICAgIGdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgUG5MIHN1bW1hcnkuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gICAgICAgICAgICAgIG9mIGVhY2ggdHJhbnNhY3Rpb24gaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBcXCZxdW90O0V4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHQgc2V0LlxcJnF1b3Q7ICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyByZXN1bHRzIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIEdldFZhbHVhdGlvblBvaW50UG5sU3VtbWFyeS4gKi9cbiAgICBwYWdlPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBHZXRWYWx1YXRpb25Qb2ludFF1b3Rlc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhcmd1bWVudHMgdG8gdXNlIGZvciBxdWVyeWluZyB0aGUgcXVvdGVzLiAqL1xuICAgIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVyczogVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSBxdW90ZXMuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gICAgICAgICAgICAgIG9mIGVhY2ggcXVvdGUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyBxdW90ZXMgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gR2V0VmFsdWF0aW9uUG9pbnRRdW90ZXMuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogV2hlbiBwcm92aWRlZCwgcnVucyBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXJndW1lbnRzIHRvIHVzZSBmb3IgcXVlcnlpbmcgdGhlIHRyYW5zYWN0aW9ucy4gKi9cbiAgICB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM6IFZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdHJhbnNhY3Rpb25zLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uICAgICAgICAgICAgICBvZiBlYWNoIHRyYW5zYWN0aW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdCBzZXQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyB0cmFuc2FjdGlvbnMgZnJvbSBhIHByZXZpb3VzIGNhbGwgdG8gR2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnMuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0luc3RydW1lbnRcXCYjMzk7LCBcXCYjMzk7VHJhbnNhY3Rpb25cXCYjMzk7LCBcXCYjMzk7UG9ydGZvbGlvXFwmIzM5OywgXFwmIzM5O0FjY291bnRcXCYjMzk7LCBcXCYjMzk7TGVnYWxFbnRpdHlcXCYjMzk7IG9yIFxcJiMzOTtDdXN0b2RpYW5BY2NvdW50XFwmIzM5OyAgICAgICAgICAgICAgZG9tYWluIHRvIGRlY29yYXRlIG9udG8gdGhlIHRyYW5zYWN0aW9ucy4gKi9cbiAgICBwcm9wZXJ0eUtleXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIG9wdGlvbmFsIHNjb3BlIG9mIGEgQ3VzdG9tIERhdGEgTW9kZWwgdG8gdXNlICovXG4gICAgZGF0YU1vZGVsU2NvcGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBvcHRpb25hbCBjb2RlIG9mIGEgQ3VzdG9tIERhdGEgTW9kZWwgdG8gdXNlICovXG4gICAgZGF0YU1vZGVsQ29kZT86IHN0cmluZztcbiAgICAvKiogT3B0aW9uIHRvIHNwZWNpZnkgd2hldGhlciBvciBub3QgdG8gaW5jbHVkZSBjYW5jZWxsZWQgdHJhbnNhY3Rpb25zLCAgICAgICAgICAgICAgaW5jbHVkaW5nIHByZXZpb3VzIHZlcnNpb25zIG9mIHRyYW5zYWN0aW9ucyB3aGljaCBoYXZlIHNpbmNlIGJlZW4gYW1lbmRlZC4gICAgICAgICAgICAgIERlZmF1bHRzIHRvIEZhbHNlIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgc2hvd0NhbmNlbGxlZFRyYW5zYWN0aW9ucz86IGJvb2xlYW47XG4gICAgLyoqIFRoZSBtZW1iZXJzaGlwIHR5cGVzIG9mIHRoZSBzcGVjaWZpZWQgQ3VzdG9tIERhdGEgTW9kZWwgdG8gcmV0dXJuLiBEZWZhdWx0IHZhbHVlOiBNZW1iZXIuIEF2YWlsYWJsZSB2YWx1ZXM6IEFsbCwgTWVtYmVyLCBDYW5kaWRhdGUuICovXG4gICAgbWVtYmVyc2hpcFR5cGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2VSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXJndW1lbnRzIHRvIHVzZSBmb3IgZ2VuZXJhdGluZyB0aGUgVHJpYWwgQmFsYW5jZS4gKi9cbiAgICB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM6IFZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAvKiogVGhlIG9wdGlvbmFsIGNvZGUgb2YgYSBHZW5lcmFsIExlZGdlciBQcm9maWxlIHVzZWQgdG8gZGVjb3JhdGUgSm91cm5hbCBFbnRyeSBMaW5lcyB3aXRoIGxldmVscy4gKi9cbiAgICBnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGU/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBUcmlhbCBCYWxhbmNlLiAgICAgICAgICAgICAgIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBFeHByZXNzaW9uIHRvIGZpbHRlciB0aGUgcmVzdWx0cyBieS4gICAgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmaWx0ZXJpbmcgcmVzdWx0cywgc2VlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZG9jcy9maWx0ZXJpbmctaW5mb3JtYXRpb24tcmV0cmlldmVkLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG51bWJlci4gICAgICAgICAgICAgICBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgVHJpYWwgQmFsYW5jZXMuICAgICAgICAgICAgICAgVGhpcyB0b2tlbiBpcyByZXR1cm5lZCBmcm9tIHRoZSBwcmV2aW91cyBjYWxsLiAgICAgICAgICAgICAgIElmIGEgcGFnaW5hdGlvbiB0b2tlbiBpcyBwcm92aWRlZCwgdGhlIGZpbHRlciwgZWZmZWN0aXZlQXQgYW5kIGFzQXQgZmllbGRzICAgICAgICAgICAgICAgbXVzdCBub3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvcmlnaW5hbCByZXF1ZXN0LiAqL1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIFxcJiMzOTtJbnN0cnVtZW50XFwmIzM5OywgXFwmIzM5O1RyYW5zYWN0aW9uXFwmIzM5OywgXFwmIzM5O1BvcnRmb2xpb1xcJiMzOTssIFxcJiMzOTtBY2NvdW50XFwmIzM5OywgXFwmIzM5O0xlZ2FsRW50aXR5XFwmIzM5OyBvciBcXCYjMzk7Q3VzdG9kaWFuQWNjb3VudFxcJiMzOTsgICAgICAgICAgICAgICBkb21haW4gdG8gZGVjb3JhdGUgb250byB0aGUgVHJpYWxCYWxhbmNlLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBJZiB0aGlzIGlzIHNldCB0byB0cnVlLCBubyBDbGVhcmRvd24gTW9kdWxlIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgVHJpYWwgQmFsYW5jZS4gRGVmYXVsdHMgdG8gZmFsc2UuICovXG4gICAgZXhjbHVkZUNsZWFyZG93bk1vZHVsZT86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2V0VmFsdWF0aW9uUG9pbnRVbnNldHRsZWRUcmFuc2FjdGlvbnNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSB0aGUgcmVwb3J0LiBEZWZhdWx0cyB0byBsYXRlc3QuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogV2hlbiBwYWdpbmF0aW5nLCBsaW1pdCB0aGUgbnVtYmVyIG9mIHJldHVybmVkIHJlc3VsdHMgdG8gdGhpcyBtYW55LiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgZnJvbSBhIHByZXZpb3VzIGNhbGwuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0luc3RydW1lbnRcXCYjMzk7LCBcXCYjMzk7VHJhbnNhY3Rpb25cXCYjMzk7LCBcXCYjMzk7UG9ydGZvbGlvXFwmIzM5Oywgb3IgXFwmIzM5O0FjY291bnRcXCYjMzk7ICAgICAgICAgICAgICBkb21haW4gdG8gZGVjb3JhdGUgb250byB0aGUgdHJhbnNhY3Rpb25zLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgZGF0ZSBvZiB0aGUgVmFsdWF0aW9uIFBvaW50IHRvIHJlcG9ydCBhZ2FpbnN0LCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBzdXBwbHlpbmcgICAgICAgICAgICAgIGl0IGluIHRoZSByZXF1ZXN0IGJvZHkuIE11c3Qgbm90IGJlIHN1cHBsaWVkIHRvZ2V0aGVyIHdpdGggZGlhcnlFbnRyeS4gKi9cbiAgICBkYXRlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgZGlhcnkgZW50cnkgY29kZSBvZiB0aGUgVmFsdWF0aW9uIFBvaW50IHRvIHJlcG9ydCBhZ2FpbnN0LCBhcyBhbiAgICAgICAgICAgICAgYWx0ZXJuYXRpdmUgdG8gc3VwcGx5aW5nIGl0IGluIHRoZSByZXF1ZXN0IGJvZHkuIE11c3Qgbm90IGJlIHN1cHBsaWVkIHRvZ2V0aGVyIHdpdGggZGF0ZS4gKi9cbiAgICBkaWFyeUVudHJ5Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgb3B0aW9uYWwgdmFyaWFudCBjb2RlIG9mIHRoZSBWYWx1YXRpb24gUG9pbnQgdG8gcmVwb3J0IGFnYWluc3QsIGFzIGFuIGFsdGVybmF0aXZlIHRvICAgICAgICAgICAgICBzdXBwbHlpbmcgaXQgaW4gdGhlIHJlcXVlc3QgYm9keS4gT25seSByZXF1aXJlZCB3aGVuIGl0IGlzIG5lY2Vzc2FyeSB0byBjaG9vc2UgYmV0d2VlbiBzY2VuYXJpb3Mgd2l0aCBtdWx0aXBsZSAgICAgICAgICAgICAgZXN0aW1hdGVzLiAqL1xuICAgIHZhcmlhbnQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgdG8gdXNlIGZvciBxdWVyeWluZyB0aGUgdW5zZXR0bGVkIHRyYW5zYWN0aW9ucy4gQ2FuIGJlICAgICAgICAgICAgICBvbWl0dGVkIHdoZW4gdGhlIFZhbHVhdGlvbiBQb2ludCBpcyBpZGVudGlmaWVkIGJ5IHRoZSBkYXRlIG9yIGRpYXJ5RW50cnkgcXVlcnkgcGFyYW1ldGVycy4gKi9cbiAgICBzaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycz86IFNpbmdsZVZhbHVhdGlvblBvaW50UXVlcnlQYXJhbWV0ZXJzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGZWVzUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGVmZmVjdGl2ZSBkYXRldGltZSBvciBjdXQgbGFiZWwgYXQgd2hpY2ggdG8gbGlzdCB0aGUgVGltZVZhcmlhbnQgcHJvcGVydGllcyBmb3IgdGhlIEZlZXMuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IExVU0lEICAgICAgICAgICAgICBzeXN0ZW0gZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBlZmZlY3RpdmVBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gbGlzdCB0aGUgRmVlcy4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlYWNoIEZlZSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwYWdpbmF0aW9uIHRva2VuIHRvIHVzZSB0byBjb250aW51ZSBsaXN0aW5nIGZlZXM7IHRoaXMgICAgICAgICAgICAgIHZhbHVlIGlzIHJldHVybmVkIGZyb20gdGhlIHByZXZpb3VzIGNhbGwuIElmIGEgcGFnaW5hdGlvbiB0b2tlbiBpcyBwcm92aWRlZCwgdGhlIGZpbHRlciwgZWZmZWN0aXZlQXQgICAgICAgICAgICAgIGFuZCBhc0F0IGZpZWxkcyBtdXN0IG5vdCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG9yaWdpbmFsIHJlcXVlc3QuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogV2hlbiBwYWdpbmF0aW5nLCBsaW1pdCB0aGUgcmVzdWx0cyB0byB0aGlzIG51bWJlci4gRGVmYXVsdHMgdG8gMTAwIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHRzLiAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRvIGZpbHRlciBvbiB0aGUgdHJlYXRtZW50LCBzcGVjaWZ5IFxcJnF1b3Q7dHJlYXRtZW50IGVxIFxcJiMzOTtNb250aGx5XFwmIzM5O1xcJnF1b3Q7LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmaWx0ZXJpbmcgICAgICAgICAgICAgIHJlc3VsdHMsIHNlZSBodHRwczovL3N1cHBvcnQubHVzaWQuY29tL2RvY3MvZmlsdGVyaW5nLWluZm9ybWF0aW9uLXJldHJpZXZlZC1mcm9tLWx1c2lkLiAqL1xuICAgIGZpbHRlcj86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIGZpZWxkIG5hbWVzIG9yIHByb3BlcnRpZXMgdG8gc29ydCBieSwgZWFjaCBzdWZmaXhlZCBieSBcXCZxdW90OyBBU0NcXCZxdW90OyBvciBcXCZxdW90OyBERVNDXFwmcXVvdDsgKi9cbiAgICBzb3J0Qnk/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKiBBIGxpc3Qgb2YgcHJvcGVydHkga2V5cyBmcm9tIHRoZSBcXCYjMzk7RmVlXFwmIzM5OyBkb21haW4gdG8gZGVjb3JhdGUgb250byBlYWNoIEZlZS4gICAgICAgICAgICAgIFRoZXNlIG11c3QgdGFrZSB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9LCBmb3IgZXhhbXBsZSBcXCYjMzk7RmVlL0FjY291bnQvSWRcXCYjMzk7LiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlzdEZ1bmRDYWxlbmRhclJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIGxpc3QgdGhlIENhbGVuZGFyLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uIG9mIGVhY2ggQ2FsZW5kYXIgRW50cnkgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyBDYWxlbmRhciBFbnRyaWVzOyB0aGlzICAgICAgICAgICAgICB2YWx1ZSBpcyByZXR1cm5lZCBmcm9tIHRoZSBwcmV2aW91cyBjYWxsLiBJZiBhIHBhZ2luYXRpb24gdG9rZW4gaXMgcHJvdmlkZWQsIHRoZSBmaWx0ZXIsIGVmZmVjdGl2ZUF0ICAgICAgICAgICAgICBhbmQgYXNBdCBmaWVsZHMgbXVzdCBub3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvcmlnaW5hbCByZXF1ZXN0LiAqL1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcGFnaW5hdGluZywgbGltaXQgdGhlIHJlc3VsdHMgdG8gdGhpcyBudW1iZXIuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBFeHByZXNzaW9uIHRvIGZpbHRlciB0aGUgcmVzdWx0cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgZmlsdGVyaW5nICAgICAgICAgICAgICByZXN1bHRzLCBzZWUgaHR0cHM6Ly9zdXBwb3J0Lmx1c2lkLmNvbS9kb2NzL2ZpbHRlcmluZy1pbmZvcm1hdGlvbi1yZXRyaWV2ZWQtZnJvbS1sdXNpZC4gKi9cbiAgICBmaWx0ZXI/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBmaWVsZCBuYW1lcyBvciBwcm9wZXJ0aWVzIHRvIHNvcnQgYnksIGVhY2ggc3VmZml4ZWQgYnkgXFwmcXVvdDsgQVNDXFwmcXVvdDsgb3IgXFwmcXVvdDsgREVTQ1xcJnF1b3Q7LiAqL1xuICAgIHNvcnRCeT86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIFxcJiMzOTtDbG9zZWRQZXJpb2RcXCYjMzk7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvIGVhY2ggaXRlbS4gKi9cbiAgICBwcm9wZXJ0eUtleXM/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGdW5kQ2FsZW5kYXJFbnRyaWVzUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gbGlzdCB0aGUgQ2FsZW5kYXIuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCBDYWxlbmRhciBFbnRyeSBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwYWdpbmF0aW9uIHRva2VuIHRvIHVzZSB0byBjb250aW51ZSBsaXN0aW5nIENhbGVuZGFyIEVudHJpZXM7IHRoaXMgICAgICAgICAgICAgIHZhbHVlIGlzIHJldHVybmVkIGZyb20gdGhlIHByZXZpb3VzIGNhbGwuIElmIGEgcGFnaW5hdGlvbiB0b2tlbiBpcyBwcm92aWRlZCwgdGhlIGZpbHRlciwgZWZmZWN0aXZlQXQgICAgICAgICAgICAgIGFuZCBhc0F0IGZpZWxkcyBtdXN0IG5vdCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG9yaWdpbmFsIHJlcXVlc3QuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogV2hlbiBwYWdpbmF0aW5nLCBsaW1pdCB0aGUgcmVzdWx0cyB0byB0aGlzIG51bWJlci4gRGVmYXVsdHMgdG8gMTAwIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHRzLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmaWx0ZXJpbmcgICAgICAgICAgICAgIHJlc3VsdHMsIHNlZSBodHRwczovL3N1cHBvcnQubHVzaWQuY29tL2RvY3MvZmlsdGVyaW5nLWluZm9ybWF0aW9uLXJldHJpZXZlZC1mcm9tLWx1c2lkLiAqL1xuICAgIGZpbHRlcj86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIGZpZWxkIG5hbWVzIG9yIHByb3BlcnRpZXMgdG8gc29ydCBieSwgZWFjaCBzdWZmaXhlZCBieSBcXCZxdW90OyBBU0NcXCZxdW90OyBvciBcXCZxdW90OyBERVNDXFwmcXVvdDsuICovXG4gICAgc29ydEJ5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0RpYXJ5RW50cnlcXCYjMzk7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvIGVhY2ggaXRlbS4gKi9cbiAgICBwcm9wZXJ0eUtleXM/OiBBcnJheTxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RGdW5kc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgZWZmZWN0aXZlIGRhdGV0aW1lIG9yIGN1dCBsYWJlbCBhdCB3aGljaCB0byBsaXN0IHRoZSBUaW1lVmFyaWFudCBwcm9wZXJ0aWVzIGZvciB0aGUgRnVuZHMuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IExVU0lEICAgICAgICAgICAgICBzeXN0ZW0gZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBlZmZlY3RpdmVBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gbGlzdCB0aGUgRnVuZHMuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCBGdW5kIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgRnVuZHM7IHRoaXMgICAgICAgICAgICAgIHZhbHVlIGlzIHJldHVybmVkIGZyb20gdGhlIHByZXZpb3VzIGNhbGwuIElmIGEgcGFnaW5hdGlvbiB0b2tlbiBpcyBwcm92aWRlZCwgdGhlIGZpbHRlciwgZWZmZWN0aXZlQXQgICAgICAgICAgICAgIGFuZCBhc0F0IGZpZWxkcyBtdXN0IG5vdCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG9yaWdpbmFsIHJlcXVlc3QuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogV2hlbiBwYWdpbmF0aW5nLCBsaW1pdCB0aGUgcmVzdWx0cyB0byB0aGlzIG51bWJlci4gRGVmYXVsdHMgdG8gMTAwIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHRzLiAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRvIGZpbHRlciBvbiB0aGUgRnVuZCBjb2RlLCBzcGVjaWZ5IFxcJnF1b3Q7aWQuQ29kZSBlcSBcXCYjMzk7RnVuZDFcXCYjMzk7XFwmcXVvdDsuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGZpbHRlcmluZyAgICAgICAgICAgICAgcmVzdWx0cywgc2VlIGh0dHBzOi8vc3VwcG9ydC5sdXNpZC5jb20vZG9jcy9maWx0ZXJpbmctaW5mb3JtYXRpb24tcmV0cmlldmVkLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBBIGxpc3Qgb2YgZmllbGQgbmFtZXMgb3IgcHJvcGVydGllcyB0byBzb3J0IGJ5LCBlYWNoIHN1ZmZpeGVkIGJ5IFxcJnF1b3Q7IEFTQ1xcJnF1b3Q7IG9yIFxcJnF1b3Q7IERFU0NcXCZxdW90OyAqL1xuICAgIHNvcnRCeT86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIGZyb20gdGhlIFxcJiMzOTtGdW5kXFwmIzM5OyBkb21haW4gdG8gZGVjb3JhdGUgb250byBlYWNoIEZ1bmQuICAgICAgICAgICAgICBUaGVzZSBtdXN0IHRha2UgdGhlIGZvcm1hdCB7ZG9tYWlufS97c2NvcGV9L3tjb2RlfSwgZm9yIGV4YW1wbGUgXFwmIzM5O0Z1bmQvTWFuYWdlci9JZFxcJiMzOTsuICovXG4gICAgcHJvcGVydHlLZXlzPzogQXJyYXk8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBMaXN0TmF2QWN0aXZpdHlBZGp1c3RtZW50c1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIGlzIHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGdpdmVuIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBGZXRjaCBhbGwgTkFWIGFkanVzdG1lbnQgYWN0aXZpdGllcyBmb3IgdGhpcyB2YWx1YXRpb24gcG9pbnQuICovXG4gICAgdmFsdWF0aW9uUG9pbnRDb2RlOiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBsaXN0IHRoZSBOYXYgYWN0aXZpdHkgYWRqdXN0bWVudHMuIERlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZWFjaCBhZGp1c3RtZW50IGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogVGhlIHBhZ2luYXRpb24gdG9rZW4gdG8gdXNlIHRvIGNvbnRpbnVlIGxpc3RpbmcgTmF2IGFjdGl2aXR5IGFkanVzdG1lbnRzOyB0aGlzICAgICAgICAgICAgICB2YWx1ZSBpcyByZXR1cm5lZCBmcm9tIHRoZSBwcmV2aW91cyBjYWxsLiBJZiBhIHBhZ2luYXRpb24gdG9rZW4gaXMgcHJvdmlkZWQsIHRoZSBmaWx0ZXIsICAgICAgICAgICAgICBhbmQgYXNBdCBmaWVsZHMgbXVzdCBub3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBvcmlnaW5hbCByZXF1ZXN0LiAqL1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcGFnaW5hdGluZywgbGltaXQgdGhlIHJlc3VsdHMgdG8gdGhpcyBudW1iZXIuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBFeHByZXNzaW9uIHRvIGZpbHRlciB0aGUgcmVzdWx0IHNldC4gUmVhZCBtb3JlIGFib3V0IGZpbHRlcmluZyByZXN1bHRzIGZyb20gTFVTSUQgaGVyZSBodHRwczovL3N1cHBvcnQubHVzaWQuY29tL2ZpbHRlcmluZy1yZXN1bHRzLWZyb20tbHVzaWQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgdmFyaWFudCBvZiB0aGUgdmFsdWF0aW9uIHBvaW50IHVzZWQgaW4gdGhlIHJlcXVlc3QuIFRvZ2V0aGVyIHdpdGggdGhlIHZhbHVhdGlvbiBwb2ludCBjb2RlIG1hcmtzIHRoZSB1bmlxdWUgYnJhbmNoIGZvciB0aGUgTmF2VHlwZS4gKi9cbiAgICB2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RWYWx1YXRpb25Qb2ludENvbXBsZXhNYXJrZXREYXRhUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGFyZ3VtZW50cyB0byB1c2UgZm9yIHF1ZXJ5aW5nIHRoZSBjb21wbGV4IG1hcmtldCBkYXRhLiAqL1xuICAgIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVyczogVmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byByZXRyaWV2ZSBjb21wbGV4IG1hcmtldCBkYXRhLiBEZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGxhdGVzdCB2ZXJzaW9uICAgICAgICAgICAgICBvZiBlYWNoIGl0ZW0gaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyBjb21wbGV4IG1hcmtldCBkYXRhIGZyb20gYSBwcmV2aW91cyBjYWxsIHRvIExpc3RWYWx1YXRpb25Qb2ludENvbXBsZXhNYXJrZXREYXRhLiAqL1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RWYWx1YXRpb25Qb2ludEluc3RydW1lbnRzUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgaXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZ2l2ZW4gRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIEZldGNoIGFsbCBpbnN0cnVtZW50cyBmb3IgdGhpcyB2YWx1YXRpb24gcG9pbnQuICovXG4gICAgdmFsdWF0aW9uUG9pbnRDb2RlOiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xuICAgIC8qKiBUaGUgYXNBdCBkYXRldGltZSBhdCB3aGljaCB0byBsaXN0IHRoZSBpbnN0cnVtZW50cy4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlYWNoIGluc3RydW1lbnQgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gY29udGludWUgbGlzdGluZyBpbnN0cnVtZW50czsgdGhpcyAgICAgICAgICAgICAgdmFsdWUgaXMgcmV0dXJuZWQgZnJvbSB0aGUgcHJldmlvdXMgY2FsbC4gSWYgYSBwYWdpbmF0aW9uIHRva2VuIGlzIHByb3ZpZGVkLCB0aGUgZmlsdGVyLCAgICAgICAgICAgICAgYW5kIGFzQXQgZmllbGRzIG11c3Qgbm90IGhhdmUgY2hhbmdlZCBzaW5jZSB0aGUgb3JpZ2luYWwgcmVxdWVzdC4gKi9cbiAgICBwYWdlPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSByZXN1bHRzIHRvIHRoaXMgbnVtYmVyLiBEZWZhdWx0cyB0byAxMDAgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBsaW1pdD86IG51bWJlcjtcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdCBzZXQuIFJlYWQgbW9yZSBhYm91dCBmaWx0ZXJpbmcgcmVzdWx0cyBmcm9tIExVU0lEIGhlcmUgaHR0cHM6Ly9zdXBwb3J0Lmx1c2lkLmNvbS9maWx0ZXJpbmctcmVzdWx0cy1mcm9tLWx1c2lkLiAqL1xuICAgIGZpbHRlcj86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIGZpZWxkIG5hbWVzIG9yIHByb3BlcnRpZXMgdG8gc29ydCBieSwgZWFjaCBzdWZmaXhlZCBieSBcXCZxdW90OyBBU0NcXCZxdW90OyBvciBcXCZxdW90OyBERVNDXFwmcXVvdDsuICovXG4gICAgc29ydEJ5PzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0luc3RydW1lbnRcXCYjMzk7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvICAgICAgICAgICAgICBpbnN0cnVtZW50cywgb3IgZnJvbSBhbnkgZG9tYWluIHRoYXQgc3VwcG9ydHMgcmVsYXRpb25zaGlwcyB0byBkZWNvcmF0ZSBvbnRvIHJlbGF0ZWQgZW50aXRpZXMuICAgICAgICAgICAgICBUaGVzZSBtdXN0IGhhdmUgdGhlIGZvcm1hdCB7ZG9tYWlufS97c2NvcGV9L3tjb2RlfSwgZm9yIGV4YW1wbGUgXFwmIzM5O0luc3RydW1lbnQvc3lzdGVtL05hbWVcXCYjMzk7LiAqL1xuICAgIGluc3RydW1lbnRQcm9wZXJ0eUtleXM/OiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKiBUaGUgdmFyaWFudCBvZiB0aGUgdmFsdWF0aW9uIHBvaW50IHVzZWQgaW4gdGhlIHJlcXVlc3QuIFRvZ2V0aGVyIHdpdGggdGhlIHZhbHVhdGlvbiBwb2ludCBjb2RlIG1hcmtzIHRoZSB1bmlxdWUgYnJhbmNoIGZvciB0aGUgTmF2VHlwZS4gKi9cbiAgICB2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIExpc3RWYWx1YXRpb25Qb2ludE92ZXJ2aWV3UmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGVmZmVjdGl2ZSBkYXRldGltZSBvciBjdXQgbGFiZWwgYXQgd2hpY2ggdG8gbGlzdCB0aGUgVGltZVZhcmlhbnQgcHJvcGVydGllcyBmb3IgdGhlIFZhbHVhdGlvbiBQb2ludHMuIERlZmF1bHRzIHRvIHRoZSBjdXJyZW50IExVU0lEICAgICAgICAgICAgICBzeXN0ZW0gZGF0ZXRpbWUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBlZmZlY3RpdmVBdD86IHN0cmluZztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gbGlzdCB0aGUgVmFsdWF0aW9uIFBvaW50cy4gRGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBlYWNoIFZhbHVhdGlvbiBQb2ludCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGFzQXQ/OiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwYWdpbmF0aW9uIHRva2VuIHRvIHVzZSB0byBjb250aW51ZSBsaXN0aW5nIFZhbHVhdGlvbiBQb2ludHM7IHRoaXMgICAgICAgICAgICAgIHZhbHVlIGlzIHJldHVybmVkIGZyb20gdGhlIHByZXZpb3VzIGNhbGwuIElmIGEgcGFnaW5hdGlvbiB0b2tlbiBpcyBwcm92aWRlZCwgdGhlIGZpbHRlciwgZWZmZWN0aXZlQXQgICAgICAgICAgICAgIGFuZCBhc0F0IGZpZWxkcyBtdXN0IG5vdCBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIG9yaWdpbmFsIHJlcXVlc3QuICovXG4gICAgcGFnZT86IHN0cmluZztcbiAgICAvKiogV2hlbiBwYWdpbmF0aW5nLCBsaW1pdCB0aGUgcmVzdWx0cyB0byB0aGlzIG51bWJlci4gRGVmYXVsdHMgdG8gMTAwIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgLyoqIEV4cHJlc3Npb24gdG8gZmlsdGVyIHRoZSByZXN1bHRzIGJ5LiAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRvIGZpbHRlciBvbiB0aGUgTkFWLCBzcGVjaWZ5IFxcJnF1b3Q7TkFWIGd0IDMwMFxcJnF1b3Q7LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBmaWx0ZXJpbmcgICAgICAgICAgICAgIHJlc3VsdHMsIHNlZSBodHRwczovL3N1cHBvcnQubHVzaWQuY29tL2RvY3MvZmlsdGVyaW5nLWluZm9ybWF0aW9uLXJldHJpZXZlZC1mcm9tLWx1c2lkLiAqL1xuICAgIGZpbHRlcj86IHN0cmluZztcbiAgICAvKiogQSBsaXN0IG9mIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgXFwmIzM5O0RpYXJ5RW50cnlcXCYjMzk7IGRvbWFpbiB0byBkZWNvcmF0ZSBvbnRvIGVhY2ggVmFsdWF0aW9uUG9pbnQuICAgICAgICAgICAgICBUaGVzZSBtdXN0IHRha2UgdGhlIGZvcm1hdCB7ZG9tYWlufS97c2NvcGV9L3tjb2RlfSwgZm9yIGV4YW1wbGUgXFwmIzM5O0RpYXJ5RW50cnkvVmFsdWF0aW9uUG9pbnQvSWRcXCYjMzk7LiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHJ1bnMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFBhdGNoRmVlUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZlZS4gKi9cbiAgICBmZWVDb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBqc29uIHBhdGNoIGRvY3VtZW50LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWU6IGh0dHBzOi8vZGF0YXRyYWNrZXIuaWV0Zi5vcmcvZG9jL2h0bWwvcmZjNjkwMi4gKi9cbiAgICBvcGVyYXRpb246IEFycmF5PE9wZXJhdGlvbj47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGF0Y2hGdW5kUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGpzb24gcGF0Y2ggZG9jdW1lbnQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZTogaHR0cHM6Ly9kYXRhdHJhY2tlci5pZXRmLm9yZy9kb2MvaHRtbC9yZmM2OTAyLiAqL1xuICAgIG9wZXJhdGlvbjogQXJyYXk8T3BlcmF0aW9uPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBRdWVyeUNhc2hTdGF0ZW1lbnRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgcXVlcnkgcGFyYW1ldGVycyBzcGVjaWZ5aW5nIHRoZSBkaWFyeSBlbnRyeSBwZXJpb2QgYW5kIGRpc3BsYXkgbW9kZS4gKi9cbiAgICBxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVyczogUXVlcnlGdW5kQ2FzaFN0YXRlbWVudFBhcmFtZXRlcnM7XG4gICAgLyoqIFRoZSBhc0F0IGRhdGV0aW1lIGF0IHdoaWNoIHRvIHJldHJpZXZlIHRoZSBjYXNoIHN0YXRlbWVudC4gRGVmYXVsdHMgdG8gdGhlIGxhdGVzdCB2ZXJzaW9uIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgYXNBdD86IHN0cmluZztcbiAgICAvKiogRXhwcmVzc2lvbiB0byBmaWx0ZXIgdGhlIHJlc3VsdCBzZXQuICovXG4gICAgZmlsdGVyPzogc3RyaW5nO1xuICAgIC8qKiBXaGVuIHBhZ2luYXRpbmcsIGxpbWl0IHRoZSBudW1iZXIgb2YgcmV0dXJuZWQgcmVzdWx0cyB0byB0aGlzIG1hbnkuIERlZmF1bHRzIHRvIDEwMCBpZiBub3Qgc3BlY2lmaWVkLiAqL1xuICAgIGxpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgcGFnaW5hdGlvbiB0b2tlbiB0byB1c2UgdG8gZ2V0IHRoZSBuZXh0IHBhZ2Ugb2YgcmVzdWx0cy4gKi9cbiAgICBwYWdlPzogc3RyaW5nO1xuICAgIC8qKiBBIGxpc3Qgb2YgcHJvcGVydHkga2V5cyB0byBkZWNvcmF0ZSBvbnRvIHRoZSBjYXNoIHN0YXRlbWVudCByb3dzLiAqL1xuICAgIHByb3BlcnR5S2V5cz86IEFycmF5PHN0cmluZz47XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBOQVYgdHlwZSB0byB1c2UuIERlZmF1bHRzIHRvIHRoZSBwcmltYXJ5IE5BViB0eXBlIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeVJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBxdWVyeSBwYXJhbWV0ZXJzIHNwZWNpZnlpbmcgdGhlIGRpYXJ5IGVudHJ5IHBlcmlvZCBhbmQgZGlzcGxheSBtb2RlLiAqL1xuICAgIHF1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzOiBRdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycztcbiAgICAvKiogVGhlIGFzQXQgZGF0ZXRpbWUgYXQgd2hpY2ggdG8gcmV0cmlldmUgdGhlIGNhc2ggc3RhdGVtZW50LiBEZWZhdWx0cyB0byB0aGUgbGF0ZXN0IHZlcnNpb24gaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBhc0F0Pzogc3RyaW5nO1xuICAgIC8qKiBFeHByZXNzaW9uIHRvIGZpbHRlciB0aGUgcmVzdWx0IHNldC4gKi9cbiAgICBmaWx0ZXI/OiBzdHJpbmc7XG4gICAgLyoqIFdoZW4gcGFnaW5hdGluZywgbGltaXQgdGhlIG51bWJlciBvZiByZXR1cm5lZCByZXN1bHRzIHRvIHRoaXMgbWFueS4gRGVmYXVsdHMgdG8gMTAwIGlmIG5vdCBzcGVjaWZpZWQuICovXG4gICAgbGltaXQ/OiBudW1iZXI7XG4gICAgLyoqIFRoZSBwYWdpbmF0aW9uIHRva2VuIHRvIHVzZSB0byBnZXQgdGhlIG5leHQgcGFnZSBvZiByZXN1bHRzLiAqL1xuICAgIHBhZ2U/OiBzdHJpbmc7XG4gICAgLyoqIEEgbGlzdCBvZiBwcm9wZXJ0eSBrZXlzIHRvIGRlY29yYXRlIG9udG8gdGhlIGNhc2ggc3RhdGVtZW50IHJvd3MuICovXG4gICAgcHJvcGVydHlLZXlzPzogQXJyYXk8c3RyaW5nPjtcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIE5BViB0eXBlIHRvIHVzZS4gRGVmYXVsdHMgdG8gdGhlIHByaW1hcnkgTkFWIHR5cGUgaWYgbm90IHNwZWNpZmllZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXZlcnRWYWx1YXRpb25Qb2ludFRvRXN0aW1hdGVSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgcmV2ZXJ0VmFsdWF0aW9uUG9pbnRSZXF1ZXN0IHdoaWNoIGNvbnRhaW5zIHRoZSBEaWFyeSBFbnRyeSBjb2RlIGZvciB0aGUgRmluYWwgVmFsdWF0aW9uIFBvaW50IHRvIG1vdmUgdG8gRXN0aW1hdGUgc3RhdHVzLiAqL1xuICAgIHJldmVydFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3Q6IFJldmVydFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3Q7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHNldHMgdGhlIHN0YXR1cyBvZiB0aGUgVmFsdWF0aW9uIFBvaW50IG9mIHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUgdG8gYmUgRXN0aW1hdGUuICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZXRTaGFyZUNsYXNzSW5zdHJ1bWVudHNSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgc2NvcGVzIGFuZCBpbnN0cnVtZW50IGlkZW50aWZpZXJzIGZvciB0aGUgaW5zdHJ1bWVudHMgdG8gYmUgc2V0LiAqL1xuICAgIHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3Q6IFNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3Q7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zIHtcbiAgICAvKiogVGhlIHNjb3BlIG9mIHRoZSBGdW5kLiAqL1xuICAgIHNjb3BlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGdW5kLiBUb2dldGhlciB3aXRoIHRoZSBzY29wZSB0aGlzIHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhlIEZ1bmQuICovXG4gICAgY29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgVmFsdWF0aW9uIFBvaW50IEVzdGltYXRlIGRlZmluaXRpb24gdG8gdXBzZXJ0LiAqL1xuICAgIHVwZGF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdDogVXBkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0O1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCB1cHNlcnRzIHRoZSBWYWx1YXRpb24gUG9pbnQgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIE5BViBUeXBlLCBvdGhlcndpc2UgdGhlIFByaW1hcnkgTkFWIFR5cGUgd2lsbCBiZSB1c2VkLiAqL1xuICAgIG5hdlR5cGVDb2RlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVwc2VydEJvb2ttYXJrUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgdGhpcyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBGdW5kLiAqL1xuICAgIGNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIGJvb2ttYXJrIGRlZmluaXRpb24gdG8gdXBzZXJ0LiAqL1xuICAgIHVwc2VydEZ1bmRCb29rbWFya1JlcXVlc3Q6IFVwc2VydEZ1bmRCb29rbWFya1JlcXVlc3Q7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHVwc2VydHMgdGhlIFZhbHVhdGlvbiBQb2ludCBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBzZXJ0RGlhcnlFbnRyeVR5cGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBWYWx1YXRpb24gUG9pbnQgRXN0aW1hdGUgZGVmaW5pdGlvbiB0byB1cHNlcnQuICovXG4gICAgdXBzZXJ0VmFsdWF0aW9uUG9pbnRSZXF1ZXN0OiBVcHNlcnRWYWx1YXRpb25Qb2ludFJlcXVlc3Q7XG4gICAgLyoqIFdoZW4gcHJvdmlkZWQsIHVwc2VydHMgdGhlIFZhbHVhdGlvbiBQb2ludCBhZ2FpbnN0IHRoZSBzcGVjaWZpZWQgTkFWIFR5cGUsIG90aGVyd2lzZSB0aGUgUHJpbWFyeSBOQVYgVHlwZSB3aWxsIGJlIHVzZWQuICovXG4gICAgbmF2VHlwZUNvZGU/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBzZXJ0RmVlUHJvcGVydGllc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBjb2RlIG9mIHRoZSBGZWUgdG8gdXBkYXRlIG9yIGluc2VydCB0aGUgcHJvcGVydGllcyBvbnRvLiAqL1xuICAgIGZlZUNvZGU6IHN0cmluZztcbiAgICAvKiogVGhlIHByb3BlcnRpZXMgdG8gYmUgdXBkYXRlZCBvciBpbnNlcnRlZCBvbnRvIHRoZSBGZWUuIEVhY2ggcHJvcGVydHkgaW4gICAgICAgICAgICAgICB0aGUgcmVxdWVzdCBtdXN0IGJlIGtleWVkIGJ5IGl0cyB1bmlxdWUgcHJvcGVydHkga2V5LiBUaGlzIGhhcyB0aGUgZm9ybWF0IHtkb21haW59L3tzY29wZX0ve2NvZGV9IGUuZy4gXFwmcXVvdDtGZWUvTWFuYWdlci9JZFxcJnF1b3Q7LiAqL1xuICAgIHJlcXVlc3RCb2R5PzogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eTsgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcHNlcnRGdW5kUHJvcGVydGllc1JlcXVlc3RQYXJhbXMge1xuICAgIC8qKiBUaGUgc2NvcGUgb2YgdGhlIEZ1bmQuICovXG4gICAgc2NvcGU6IHN0cmluZztcbiAgICAvKiogVGhlIGNvZGUgb2YgdGhlIEZ1bmQuIFRvZ2V0aGVyIHdpdGggdGhlIHNjb3BlIHRoaXMgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGUgRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSBwcm9wZXJ0aWVzIHRvIGJlIHVwZGF0ZWQgb3IgaW5zZXJ0ZWQgb250byB0aGUgRnVuZC4gRWFjaCBwcm9wZXJ0eSBpbiAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0IG11c3QgYmUga2V5ZWQgYnkgaXRzIHVuaXF1ZSBwcm9wZXJ0eSBrZXkuIFRoaXMgaGFzIHRoZSBmb3JtYXQge2RvbWFpbn0ve3Njb3BlfS97Y29kZX0gZS5nLiBcXCZxdW90O0Z1bmQvTWFuYWdlci9JZFxcJnF1b3Q7LiAqL1xuICAgIHJlcXVlc3RCb2R5PzogeyBba2V5OiBzdHJpbmddOiBQcm9wZXJ0eTsgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcHNlcnROYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcyB7XG4gICAgLyoqIFRoZSBzY29wZSBvZiB0aGUgRnVuZC4gKi9cbiAgICBzY29wZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgY29kZSBvZiB0aGUgRnVuZC4gVG9nZXRoZXIgd2l0aCB0aGUgc2NvcGUgaXMgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZ2l2ZW4gRnVuZC4gKi9cbiAgICBjb2RlOiBzdHJpbmc7XG4gICAgLyoqIFRoZSB2YWx1YXRpb24gcG9pbnQgQ29kZSB0byBhcHBseSB0aGUgYWRqdXN0bWVudCB0byAqL1xuICAgIHZhbHVhdGlvblBvaW50Q29kZTogc3RyaW5nO1xuICAgIC8qKiBUaGUgcmVxdWVzdCBkZXNjcmliaW5nIHRoZSBOYXYgYWN0aXZpdHkgYWRqdXN0bWVudHMgdG8gYXBwbHkgdG8gYSBzcGVjaWZpYyB2YWx1YXRpb24gcG9pbnQgYW5kIG5hdiB0eXBlICovXG4gICAgbmF2QWN0aXZpdHlBZGp1c3RtZW50OiBBcnJheTxOYXZBY3Rpdml0eUFkanVzdG1lbnQ+O1xuICAgIC8qKiBXaGVuIHByb3ZpZGVkLCBydW5zIGFnYWluc3QgdGhlIHNwZWNpZmllZCBOQVYgVHlwZSwgb3RoZXJ3aXNlIHRoZSBQcmltYXJ5IE5BViBUeXBlIHdpbGwgYmUgdXNlZC4gKi9cbiAgICBuYXZUeXBlQ29kZT86IHN0cmluZztcbiAgICAvKiogVGhlIHZhcmlhbnQgb2YgdGhlIHZhbHVhdGlvbiBwb2ludCB1c2VkIGluIHRoZSByZXF1ZXN0LiBUb2dldGhlciB3aXRoIHRoZSB2YWx1YXRpb24gcG9pbnQgY29kZSBtYXJrcyB0aGUgdW5pcXVlIGJyYW5jaCBmb3IgdGhlIE5hdlR5cGUuICovXG4gICAgdmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudD86IHN0cmluZztcbn1cblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBGdW5kc1NlcnZpY2Uge1xuXG4gICAgcHJvdGVjdGVkIGJhc2VQYXRoID0gJ2h0dHBzOi8vd3d3Lmx1c2lkLmNvbS9hcGknO1xuICAgIHB1YmxpYyBkZWZhdWx0SGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpO1xuICAgIHB1YmxpYyBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTtcbiAgICBwdWJsaWMgZW5jb2RlcjogSHR0cFBhcmFtZXRlckNvZGVjO1xuXG4gICAgY29uc3RydWN0b3IocHJvdGVjdGVkIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQsIEBPcHRpb25hbCgpQEluamVjdChCQVNFX1BBVEgpIGJhc2VQYXRoOiBzdHJpbmd8c3RyaW5nW10sIEBPcHRpb25hbCgpIGNvbmZpZ3VyYXRpb246IENvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjb25zdCBmaXJzdEJhc2VQYXRoID0gQXJyYXkuaXNBcnJheShiYXNlUGF0aCkgPyBiYXNlUGF0aFswXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmIChmaXJzdEJhc2VQYXRoICE9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGJhc2VQYXRoID0gZmlyc3RCYXNlUGF0aDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHR5cGVvZiBiYXNlUGF0aCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBiYXNlUGF0aCA9IHRoaXMuYmFzZVBhdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGggPSBiYXNlUGF0aDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVuY29kZXIgPSB0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlciB8fCBuZXcgQ3VzdG9tSHR0cFBhcmFtZXRlckNvZGVjKCk7XG4gICAgfVxuXG5cbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcHJpdmF0ZSBhZGRUb0h0dHBQYXJhbXMoaHR0cFBhcmFtczogSHR0cFBhcmFtcywgdmFsdWU6IGFueSwga2V5Pzogc3RyaW5nKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiYgdmFsdWUgaW5zdGFuY2VvZiBEYXRlID09PSBmYWxzZSkge1xuICAgICAgICAgICAgaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKGh0dHBQYXJhbXMsIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGh0dHBQYXJhbXMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zLCB2YWx1ZSwga2V5KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZFRvSHR0cFBhcmFtc1JlY3Vyc2l2ZShodHRwUGFyYW1zOiBIdHRwUGFyYW1zLCB2YWx1ZT86IGFueSwga2V5Pzogc3RyaW5nKTogSHR0cFBhcmFtcyB7XG4gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICh2YWx1ZSBhcyBhbnlbXSkuZm9yRWFjaCggZWxlbSA9PiBodHRwUGFyYW1zID0gdGhpcy5hZGRUb0h0dHBQYXJhbXNSZWN1cnNpdmUoaHR0cFBhcmFtcywgZWxlbSwga2V5KSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChrZXkgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoa2V5LCAodmFsdWUgYXMgRGF0ZSkudG9JU09TdHJpbmcoKS5zdWJzdHJpbmcoMCwgMTApKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKFwia2V5IG1heSBub3QgYmUgbnVsbCBpZiB2YWx1ZSBpcyBEYXRlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goIGsgPT4gaHR0cFBhcmFtcyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zUmVjdXJzaXZlKFxuICAgICAgICAgICAgICAgICAgICBodHRwUGFyYW1zLCB2YWx1ZVtrXSwga2V5ICE9IG51bGwgPyBgJHtrZXl9LiR7a31gIDogaykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGtleSAhPSBudWxsKSB7XG4gICAgICAgICAgICBodHRwUGFyYW1zID0gaHR0cFBhcmFtcy5hcHBlbmQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcImtleSBtYXkgbm90IGJlIG51bGwgaWYgdmFsdWUgaXMgbm90IG9iamVjdCBvciBhcnJheVwiKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHR0cFBhcmFtcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50OiBBY2NlcHRzIGFuIEVzdGltYXRlIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBBY2NlcHRzIHRoZSBzcGVjaWZpZWQgZXN0aW1hdGUgVmFsdWF0aW9uIFBvaW50LiAgU2hvdWxkIHRoZSBWYWx1YXRpb24gUG9pbnQgZGlmZmVyIHNpbmNlIHRoZSBWYWx1YXRpb24gUG9pbnQgd2FzIGxhc3QgcnVuLCBib3RoIFZhbHVhdGlvbiBQb2ludHMgd2lsbCBiZSByZXR1cm5lZCBhbmQgc3RhdHVzIHdpbGwgYmUgbWFya2VkIGFzIFxcJiMzOTtDYW5kaWRhdGVcXCYjMzk7LCAgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgbWFya2VkIGFzIFxcJiMzOTtGaW5hbFxcJiMzOTsuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnRSZXNwb25zZT47XG4gICAgcHVibGljIGFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8QWNjZXB0RXN0aW1hdGVWYWx1YXRpb25Qb2ludFJlc3BvbnNlPj47XG4gICAgcHVibGljIGFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnRSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBhY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogQWNjZXB0RXN0aW1hdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGFjY2VwdEVzdGltYXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdDtcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgYWNjZXB0RXN0aW1hdGVWYWx1YXRpb25Qb2ludC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzLyRhY2NlcHRlc3RpbWF0ZWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxBY2NlcHRFc3RpbWF0ZVZhbHVhdGlvblBvaW50UmVzcG9uc2U+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB2YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBBZGRBbGxvY2F0aW9uR3JvdXBzOiBBZGQgQWxsb2NhdGlvbiBHcm91cHMgdG8gYSBGdW5kLlxuICAgICAqIEFkZCB0aGUgZ2l2ZW4gQWxsb2NhdGlvbiBHcm91cCBkZWZpbml0aW9ucyB0byB0aGUgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkQWxsb2NhdGlvbkdyb3VwcyhyZXF1ZXN0UGFyYW1ldGVycz86IEFkZEFsbG9jYXRpb25Hcm91cHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RnVuZD47XG4gICAgcHVibGljIGFkZEFsbG9jYXRpb25Hcm91cHMocmVxdWVzdFBhcmFtZXRlcnM/OiBBZGRBbGxvY2F0aW9uR3JvdXBzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RnVuZD4+O1xuICAgIHB1YmxpYyBhZGRBbGxvY2F0aW9uR3JvdXBzKHJlcXVlc3RQYXJhbWV0ZXJzPzogQWRkQWxsb2NhdGlvbkdyb3Vwc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxGdW5kPj47XG4gICAgcHVibGljIGFkZEFsbG9jYXRpb25Hcm91cHMocmVxdWVzdFBhcmFtZXRlcnM/OiBBZGRBbGxvY2F0aW9uR3JvdXBzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgYWRkQWxsb2NhdGlvbkdyb3Vwcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGFkZEFsbG9jYXRpb25Hcm91cHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYWxsb2NhdGlvbkdyb3VwRGVmaW5pdGlvbiA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hbGxvY2F0aW9uR3JvdXBEZWZpbml0aW9uO1xuICAgICAgICBpZiAoYWxsb2NhdGlvbkdyb3VwRGVmaW5pdGlvbiA9PT0gbnVsbCB8fCBhbGxvY2F0aW9uR3JvdXBEZWZpbml0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGFsbG9jYXRpb25Hcm91cERlZmluaXRpb24gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhZGRBbGxvY2F0aW9uR3JvdXBzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vYWxsb2NhdGlvbmdyb3Vwc2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGdW5kPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogYWxsb2NhdGlvbkdyb3VwRGVmaW5pdGlvbixcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEFkZFNlcmllczogQWRkIFNlcmllcyB0byBhIEZ1bmQuXG4gICAgICogQWRkIHRoZSBnaXZlbiBTZXJpZXMgZGVmaW5pdGlvbnMgdG8gdGhlIHNwZWNpZmllZCBTaGFyZSBDbGFzc2VzIG9mIHRoZSBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRTZXJpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBBZGRTZXJpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RnVuZD47XG4gICAgcHVibGljIGFkZFNlcmllcyhyZXF1ZXN0UGFyYW1ldGVycz86IEFkZFNlcmllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZ1bmQ+PjtcbiAgICBwdWJsaWMgYWRkU2VyaWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogQWRkU2VyaWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZ1bmQ+PjtcbiAgICBwdWJsaWMgYWRkU2VyaWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogQWRkU2VyaWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgYWRkU2VyaWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgYWRkU2VyaWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNlcmllc0RlZmluaXRpb25SZXF1ZXN0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNlcmllc0RlZmluaXRpb25SZXF1ZXN0O1xuICAgICAgICBpZiAoc2VyaWVzRGVmaW5pdGlvblJlcXVlc3QgPT09IG51bGwgfHwgc2VyaWVzRGVmaW5pdGlvblJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2VyaWVzRGVmaW5pdGlvblJlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBhZGRTZXJpZXMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9zZXJpZXNgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8RnVuZD4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHNlcmllc0RlZmluaXRpb25SZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gQ3JlYXRlRmVlOiBDcmVhdGUgYSBGZWUuXG4gICAgICogQ3JlYXRlIHRoZSBnaXZlbiBGZWUuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZlZShyZXF1ZXN0UGFyYW1ldGVycz86IENyZWF0ZUZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxGZWU+O1xuICAgIHB1YmxpYyBjcmVhdGVGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGZWU+PjtcbiAgICBwdWJsaWMgY3JlYXRlRmVlKHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlRmVlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZlZT4+O1xuICAgIHB1YmxpYyBjcmVhdGVGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVGZWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVGZWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmVlUmVxdWVzdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5mZWVSZXF1ZXN0O1xuICAgICAgICBpZiAoZmVlUmVxdWVzdCA9PT0gbnVsbCB8fCBmZWVSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZlZVJlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVGZWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2ZlZXNgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8RmVlPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogZmVlUmVxdWVzdCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gQ3JlYXRlRnVuZDogQ3JlYXRlIGEgRnVuZC5cbiAgICAgKiBDcmVhdGUgdGhlIGdpdmVuIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGNyZWF0ZUZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZ1bmQ+O1xuICAgIHB1YmxpYyBjcmVhdGVGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZ1bmQ+PjtcbiAgICBwdWJsaWMgY3JlYXRlRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IENyZWF0ZUZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RnVuZD4+O1xuICAgIHB1YmxpYyBjcmVhdGVGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZUZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZnVuZFJlcXVlc3QgPSByZXF1ZXN0UGFyYW1ldGVycz8uZnVuZFJlcXVlc3Q7XG4gICAgICAgIGlmIChmdW5kUmVxdWVzdCA9PT0gbnVsbCB8fCBmdW5kUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmdW5kUmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZUZ1bmQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGdW5kPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogZnVuZFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBDcmVhdGVGdW5kVjI6IENyZWF0ZSBhIEZ1bmQgVjIgKFByZXZpZXcpLlxuICAgICAqIENyZWF0ZSB0aGUgZ2l2ZW4gVjIgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlRnVuZFYyKHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlRnVuZFYyUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZ1bmQ+O1xuICAgIHB1YmxpYyBjcmVhdGVGdW5kVjIocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVGdW5kVjJSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGdW5kPj47XG4gICAgcHVibGljIGNyZWF0ZUZ1bmRWMihyZXF1ZXN0UGFyYW1ldGVycz86IENyZWF0ZUZ1bmRWMlJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxGdW5kPj47XG4gICAgcHVibGljIGNyZWF0ZUZ1bmRWMihyZXF1ZXN0UGFyYW1ldGVycz86IENyZWF0ZUZ1bmRWMlJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZUZ1bmRWMi4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmdW5kRGVmaW5pdGlvblJlcXVlc3QgPSByZXF1ZXN0UGFyYW1ldGVycz8uZnVuZERlZmluaXRpb25SZXF1ZXN0O1xuICAgICAgICBpZiAoZnVuZERlZmluaXRpb25SZXF1ZXN0ID09PSBudWxsIHx8IGZ1bmREZWZpbml0aW9uUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmdW5kRGVmaW5pdGlvblJlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVGdW5kVjIuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvdjIvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGdW5kPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogZnVuZERlZmluaXRpb25SZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gQ3JlYXRlVmFsdWF0aW9uUG9pbnQ6IENyZWF0ZSBhIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBJbnNlcnQgdGhlIGVzdGltYXRlIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgY3JlYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBDcmVhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludD47XG4gICAgcHVibGljIGNyZWF0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludD4+O1xuICAgIHB1YmxpYyBjcmVhdGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IENyZWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZhbHVhdGlvblBvaW50Pj47XG4gICAgcHVibGljIGNyZWF0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogQ3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBjcmVhdGVWYWx1YXRpb25Qb2ludC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNyZWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jcmVhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3Q7XG4gICAgICAgIGlmIChjcmVhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3QgPT09IG51bGwgfHwgY3JlYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNyZWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGNyZWF0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvJGNyZWF0ZWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWYWx1YXRpb25Qb2ludD4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IGNyZWF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gRGVhY3RpdmF0ZU5hdlR5cGVzOiBEZWFjdGl2YXRlIE5BViB0eXBlcyBvbiBhIEZ1bmQuXG4gICAgICogRGVhY3RpdmF0ZSB0aGUgZ2l2ZW4gTkFWIHR5cGVzIG9uIHRoZSBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWFjdGl2YXRlTmF2VHlwZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWFjdGl2YXRlTmF2VHlwZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RnVuZD47XG4gICAgcHVibGljIGRlYWN0aXZhdGVOYXZUeXBlcyhyZXF1ZXN0UGFyYW1ldGVycz86IERlYWN0aXZhdGVOYXZUeXBlc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZ1bmQ+PjtcbiAgICBwdWJsaWMgZGVhY3RpdmF0ZU5hdlR5cGVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVhY3RpdmF0ZU5hdlR5cGVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZ1bmQ+PjtcbiAgICBwdWJsaWMgZGVhY3RpdmF0ZU5hdlR5cGVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVhY3RpdmF0ZU5hdlR5cGVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVhY3RpdmF0ZU5hdlR5cGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVhY3RpdmF0ZU5hdlR5cGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnJlcXVlc3RCb2R5O1xuICAgICAgICBpZiAocmVxdWVzdEJvZHkgPT09IG51bGwgfHwgcmVxdWVzdEJvZHkgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgcmVxdWVzdEJvZHkgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWFjdGl2YXRlTmF2VHlwZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGVsZXRlTW9kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5kZWxldGVNb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGRlbGV0ZU1vZGUgIT09IHVuZGVmaW5lZCAmJiBkZWxldGVNb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZGVsZXRlTW9kZSwgJ2RlbGV0ZU1vZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2RlYWN0aXZhdGVOYXZUeXBlc2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGdW5kPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIERlbGV0ZUJvb2ttYXJrOiBEZWxldGUgYSBCb29rbWFyay5cbiAgICAgKiBEZWxldGVzIHRoZSBnaXZlbiBCb29rbWFyay5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlQm9va21hcmsocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVCb29rbWFya1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxEZWxldGVkRW50aXR5UmVzcG9uc2U+O1xuICAgIHB1YmxpYyBkZWxldGVCb29rbWFyayhyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZUJvb2ttYXJrUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RGVsZXRlZEVudGl0eVJlc3BvbnNlPj47XG4gICAgcHVibGljIGRlbGV0ZUJvb2ttYXJrKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlQm9va21hcmtSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RGVsZXRlZEVudGl0eVJlc3BvbnNlPj47XG4gICAgcHVibGljIGRlbGV0ZUJvb2ttYXJrKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlQm9va21hcmtSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVCb29rbWFyay4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZUJvb2ttYXJrLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJvb2ttYXJrQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5ib29rbWFya0NvZGU7XG4gICAgICAgIGlmIChib29rbWFya0NvZGUgPT09IG51bGwgfHwgYm9va21hcmtDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGJvb2ttYXJrQ29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZUJvb2ttYXJrLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2Jvb2ttYXJrcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJib29rbWFya0NvZGVcIiwgdmFsdWU6IGJvb2ttYXJrQ29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8RGVsZXRlZEVudGl0eVJlc3BvbnNlPignZGVsZXRlJywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gRGVsZXRlRmVlOiBEZWxldGUgYSBGZWUuXG4gICAgICogRGVsZXRlIHRoZSBnaXZlbiBGZWUuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGRlbGV0ZUZlZShyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZUZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxEZWxldGVkRW50aXR5UmVzcG9uc2U+O1xuICAgIHB1YmxpYyBkZWxldGVGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxEZWxldGVkRW50aXR5UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZGVsZXRlRmVlKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlRmVlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PERlbGV0ZWRFbnRpdHlSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBkZWxldGVGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVGZWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVGZWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmVlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5mZWVDb2RlO1xuICAgICAgICBpZiAoZmVlQ29kZSA9PT0gbnVsbCB8fCBmZWVDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZlZUNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVGZWUuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2ZlZXMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZmVlQ29kZVwiLCB2YWx1ZTogZmVlQ29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8RGVsZXRlZEVudGl0eVJlc3BvbnNlPignZGVsZXRlJywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIERlbGV0ZUZ1bmQ6IERlbGV0ZSBhIEZ1bmQuXG4gICAgICogRGVsZXRlIHRoZSBnaXZlbiBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxEZWxldGVkRW50aXR5UmVzcG9uc2U+O1xuICAgIHB1YmxpYyBkZWxldGVGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPERlbGV0ZWRFbnRpdHlSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBkZWxldGVGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxEZWxldGVkRW50aXR5UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZGVsZXRlRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZUZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBkZWxldGVGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlRnVuZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8RGVsZXRlZEVudGl0eVJlc3BvbnNlPignZGVsZXRlJywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIERlbGV0ZU5hdkFjdGl2aXR5QWRqdXN0bWVudHM6IERlbGV0ZSBOYXYgYWN0aXZpdHkgYWRqdXN0bWVudHMuXG4gICAgICogRGVsZXRlIE5hdiBhY3Rpdml0eSBhZGp1c3RtZW50cyBvbiBhIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZU5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RGVsZXRlZEVudGl0eVJlc3BvbnNlPjtcbiAgICBwdWJsaWMgZGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZU5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxEZWxldGVkRW50aXR5UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZU5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RGVsZXRlZEVudGl0eVJlc3BvbnNlPj47XG4gICAgcHVibGljIGRlbGV0ZU5hdkFjdGl2aXR5QWRqdXN0bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVOYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZU5hdkFjdGl2aXR5QWRqdXN0bWVudHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnRDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50Q29kZTtcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZSA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludENvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnRDb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZBY3Rpdml0eUFkanVzdG1lbnRSZXNwb25zZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZBY3Rpdml0eUFkanVzdG1lbnRSZXNwb25zZTtcbiAgICAgICAgaWYgKG5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlID09PSBudWxsIHx8IG5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIG5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlTmF2QWN0aXZpdHlBZGp1c3RtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludENvZGVWYXJpYW50O1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVhdGlvblBvaW50Q29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnZhbHVhdGlvblBvaW50Q29kZSwgJ3ZhbHVhdGlvblBvaW50Q29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50ICE9PSB1bmRlZmluZWQgJiYgdmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQsICd2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9uYXZBZGp1c3RtZW50LyRkZWxldGVgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8RGVsZXRlZEVudGl0eVJlc3BvbnNlPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogbmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2UsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIERlbGV0ZVZhbHVhdGlvblBvaW50OiBEZWxldGUgYSBWYWx1YXRpb24gUG9pbnQuXG4gICAgICogRGVsZXRlcyB0aGUgZ2l2ZW4gVmFsdWF0aW9uIFBvaW50LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBkZWxldGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IERlbGV0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPERlbGV0ZWRFbnRpdHlSZXNwb25zZT47XG4gICAgcHVibGljIGRlbGV0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogRGVsZXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxEZWxldGVkRW50aXR5UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZGVsZXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxEZWxldGVkRW50aXR5UmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZGVsZXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBEZWxldGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZGVsZXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGlhcnlFbnRyeUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZGlhcnlFbnRyeUNvZGU7XG4gICAgICAgIGlmIChkaWFyeUVudHJ5Q29kZSA9PT0gbnVsbCB8fCBkaWFyeUVudHJ5Q29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBkaWFyeUVudHJ5Q29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGRlbGV0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRpYXJ5RW50cnlDb2RlVmFyaWFudCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5kaWFyeUVudHJ5Q29kZVZhcmlhbnQ7XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGRpYXJ5RW50cnlDb2RlVmFyaWFudCAhPT0gdW5kZWZpbmVkICYmIGRpYXJ5RW50cnlDb2RlVmFyaWFudCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmRpYXJ5RW50cnlDb2RlVmFyaWFudCwgJ2RpYXJ5RW50cnlDb2RlVmFyaWFudCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZGlhcnlFbnRyeUNvZGVcIiwgdmFsdWU6IGRpYXJ5RW50cnlDb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxEZWxldGVkRW50aXR5UmVzcG9uc2U+KCdkZWxldGUnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBGaW5hbGlzZUNhbmRpZGF0ZVZhbHVhdGlvblBvaW50OiBGaW5hbGlzZSBhIENhbmRpZGF0ZSBWYWx1YXRpb24gUG9pbnQuXG4gICAgICogTW92ZXMgYSBcXCYjMzk7Q2FuZGlkYXRlXFwmIzM5OyBzdGF0dXMgVmFsdWF0aW9uIFBvaW50IHRvIHN0YXR1cyBcXCYjMzk7RmluYWxcXCYjMzk7LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5hbGlzZUNhbmRpZGF0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogRmluYWxpc2VDYW5kaWRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludERhdGFSZXNwb25zZT47XG4gICAgcHVibGljIGZpbmFsaXNlQ2FuZGlkYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBGaW5hbGlzZUNhbmRpZGF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZmluYWxpc2VDYW5kaWRhdGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IEZpbmFsaXNlQ2FuZGlkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZmluYWxpc2VDYW5kaWRhdGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IEZpbmFsaXNlQ2FuZGlkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBmaW5hbGlzZUNhbmRpZGF0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZmluYWxpc2VDYW5kaWRhdGVWYWx1YXRpb25Qb2ludC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3Q7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0ID09PSBudWxsIHx8IHZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGZpbmFsaXNlQ2FuZGlkYXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy8kZmluYWxpc2VjYW5kaWRhdGVgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2U+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB2YWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBHZXRBMkJEYXRhRm9yRnVuZDogR2V0IEEyQiBkYXRhIGZvciBhIEZ1bmQuXG4gICAgICogR2V0IHRoZSBBMkIgZGF0YSBmb3IgdHJhbnNhY3Rpb24gcG9ydGZvbGlvcyBpbiBhIHNwZWNpZmllZCBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRBMkJEYXRhRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEEyQkRhdGFGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZlcnNpb25lZFJlc291cmNlTGlzdE9mRnVuZEEyQkRhdGFSZWNvcmQ+O1xuICAgIHB1YmxpYyBnZXRBMkJEYXRhRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEEyQkRhdGFGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZGdW5kQTJCRGF0YVJlY29yZD4+O1xuICAgIHB1YmxpYyBnZXRBMkJEYXRhRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEEyQkRhdGFGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZlcnNpb25lZFJlc291cmNlTGlzdE9mRnVuZEEyQkRhdGFSZWNvcmQ+PjtcbiAgICBwdWJsaWMgZ2V0QTJCRGF0YUZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRBMkJEYXRhRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEEyQkRhdGFGb3JGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QTJCRGF0YUZvckZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QTJCRGF0YUZvckZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbHRlcjtcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByb3BlcnR5S2V5cztcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy9hMmIvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZlcnNpb25lZFJlc291cmNlTGlzdE9mRnVuZEEyQkRhdGFSZWNvcmQ+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldEEyQk1vdmVtZW50c0ZvckZ1bmQ6IEdldCBBMkIgbW92ZW1lbnRzIGZvciB0cmFuc2FjdGlvbiBwb3J0Zm9saW9zIGluIGEgRnVuZC5cbiAgICAgKiBHZXQgdGhlIEEyQiBtb3ZlbWVudCByZWNvcmRzIG9mIHRyYW5zYWN0aW9uIHBvcnRmb2xpb3MgaW4gYSBzcGVjaWZpZWQgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0QTJCTW92ZW1lbnRzRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEEyQk1vdmVtZW50c0ZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZGdW5kQTJCTW92ZW1lbnRSZWNvcmQ+O1xuICAgIHB1YmxpYyBnZXRBMkJNb3ZlbWVudHNGb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0QTJCTW92ZW1lbnRzRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZlcnNpb25lZFJlc291cmNlTGlzdE9mRnVuZEEyQk1vdmVtZW50UmVjb3JkPj47XG4gICAgcHVibGljIGdldEEyQk1vdmVtZW50c0ZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRBMkJNb3ZlbWVudHNGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZlcnNpb25lZFJlc291cmNlTGlzdE9mRnVuZEEyQk1vdmVtZW50UmVjb3JkPj47XG4gICAgcHVibGljIGdldEEyQk1vdmVtZW50c0ZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRBMkJNb3ZlbWVudHNGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QTJCTW92ZW1lbnRzRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEEyQk1vdmVtZW50c0ZvckZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0QTJCTW92ZW1lbnRzRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJvcGVydHlLZXlzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgcHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJvcGVydHlLZXlzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzL2EyYm1vdmVtZW50cy8kcXVlcnlgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZGdW5kQTJCTW92ZW1lbnRSZWNvcmQ+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldEZlZTogR2V0IGEgRmVlIGZvciBhIHNwZWNpZmllZCBGdW5kLlxuICAgICAqIFJldHJpZXZlIGEgZmVlIGZvciBhIHNwZWNpZmllZCBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RmVlPjtcbiAgICBwdWJsaWMgZ2V0RmVlKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RmVlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RmVlPj47XG4gICAgcHVibGljIGdldEZlZShyZXF1ZXN0UGFyYW1ldGVycz86IEdldEZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxGZWU+PjtcbiAgICBwdWJsaWMgZ2V0RmVlKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RmVlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RmVlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RmVlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZlZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmVlQ29kZTtcbiAgICAgICAgaWYgKGZlZUNvZGUgPT09IG51bGwgfHwgZmVlQ29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmZWVDb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RmVlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUF0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVmZmVjdGl2ZUF0O1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZWZmZWN0aXZlQXQgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmVmZmVjdGl2ZUF0LCAnZWZmZWN0aXZlQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vZmVlcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJmZWVDb2RlXCIsIHZhbHVlOiBmZWVDb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGZWU+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBHZXRGZWVQcm9wZXJ0aWVzOiBHZXQgRmVlIHByb3BlcnRpZXMuXG4gICAgICogR2V0IGFsbCB0aGUgcHJvcGVydGllcyBvZiBhIHNpbmdsZSBmZWUuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEZlZVByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRGZWVQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZlZVByb3BlcnRpZXM+O1xuICAgIHB1YmxpYyBnZXRGZWVQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RmVlUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZlZVByb3BlcnRpZXM+PjtcbiAgICBwdWJsaWMgZ2V0RmVlUHJvcGVydGllcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldEZlZVByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RmVlUHJvcGVydGllcz4+O1xuICAgIHB1YmxpYyBnZXRGZWVQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RmVlUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEZlZVByb3BlcnRpZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRGZWVQcm9wZXJ0aWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZlZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmVlQ29kZTtcbiAgICAgICAgaWYgKGZlZUNvZGUgPT09IG51bGwgfHwgZmVlQ29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBmZWVDb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RmVlUHJvcGVydGllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZmZlY3RpdmVBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lZmZlY3RpdmVBdDtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUF0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5lZmZlY3RpdmVBdCwgJ2VmZmVjdGl2ZUF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vZmVlcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJmZWVDb2RlXCIsIHZhbHVlOiBmZWVDb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9wcm9wZXJ0aWVzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZlZVByb3BlcnRpZXM+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBHZXRGdW5kOiBHZXQgYSBGdW5kLlxuICAgICAqIFJldHJpZXZlIHRoZSBkZWZpbml0aW9uIG9mIGEgcGFydGljdWxhciBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxGdW5kPjtcbiAgICBwdWJsaWMgZ2V0RnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGdW5kPj47XG4gICAgcHVibGljIGdldEZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZ1bmQ+PjtcbiAgICBwdWJsaWMgZ2V0RnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZmZlY3RpdmVBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lZmZlY3RpdmVBdDtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJvcGVydHlLZXlzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUF0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5lZmZlY3RpdmVBdCwgJ2VmZmVjdGl2ZUF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXlzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUtleXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcm9wZXJ0eUtleXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZ1bmQ+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBHZXRGdW5kUHJvcGVydGllczogR2V0IEZ1bmQgcHJvcGVydGllcy5cbiAgICAgKiBHZXQgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIGEgc2luZ2xlIGZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEZ1bmRQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0RnVuZFByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RnVuZFByb3BlcnRpZXM+O1xuICAgIHB1YmxpYyBnZXRGdW5kUHJvcGVydGllcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldEZ1bmRQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RnVuZFByb3BlcnRpZXM+PjtcbiAgICBwdWJsaWMgZ2V0RnVuZFByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRGdW5kUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxGdW5kUHJvcGVydGllcz4+O1xuICAgIHB1YmxpYyBnZXRGdW5kUHJvcGVydGllcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldEZ1bmRQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0RnVuZFByb3BlcnRpZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRGdW5kUHJvcGVydGllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZmZlY3RpdmVBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lZmZlY3RpdmVBdDtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUF0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5lZmZlY3RpdmVBdCwgJ2VmZmVjdGl2ZUF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vcHJvcGVydGllc2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxGdW5kUHJvcGVydGllcz4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kOiBHZXQgaG9sZGluZ3MgY29udHJpYnV0b3JzIGZvciB0cmFuc2FjdGlvbiBwb3J0Zm9saW9zIGluIGEgRnVuZC5cbiAgICAgKiBHZXQgdGhlIGhvbGRpbmdzIG9mIHRyYW5zYWN0aW9uIHBvcnRmb2xpb3MgaW4gYSBzcGVjaWZpZWQgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0SG9sZGluZ0NvbnRyaWJ1dG9yc0ZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRIb2xkaW5nQ29udHJpYnV0b3JzRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZkhvbGRpbmdDb250cmlidXRvcj47XG4gICAgcHVibGljIGdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0SG9sZGluZ0NvbnRyaWJ1dG9yc0ZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZkhvbGRpbmdDb250cmlidXRvcj4+O1xuICAgIHB1YmxpYyBnZXRIb2xkaW5nQ29udHJpYnV0b3JzRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZlcnNpb25lZFJlc291cmNlTGlzdE9mSG9sZGluZ0NvbnRyaWJ1dG9yPj47XG4gICAgcHVibGljIGdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0SG9sZGluZ0NvbnRyaWJ1dG9yc0ZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRIb2xkaW5nQ29udHJpYnV0b3JzRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGhvbGRpbmdJZCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5ob2xkaW5nSWQ7XG4gICAgICAgIGlmIChob2xkaW5nSWQgPT09IG51bGwgfHwgaG9sZGluZ0lkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGhvbGRpbmdJZCB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEhvbGRpbmdDb250cmlidXRvcnNGb3JGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuICAgICAgICBjb25zdCBpbmNsdWRlSGlzdG9yaWMgPSByZXF1ZXN0UGFyYW1ldGVycz8uaW5jbHVkZUhpc3RvcmljO1xuICAgICAgICBjb25zdCB0YXhMb3RJZCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy50YXhMb3RJZDtcbiAgICAgICAgY29uc3QgaW5jbHVkZVVuc2V0dGxlZE1vdmVtZW50cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5pbmNsdWRlVW5zZXR0bGVkTW92ZW1lbnRzO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaW5jbHVkZUhpc3RvcmljICE9PSB1bmRlZmluZWQgJiYgaW5jbHVkZUhpc3RvcmljICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+aW5jbHVkZUhpc3RvcmljLCAnaW5jbHVkZUhpc3RvcmljJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRheExvdElkICE9PSB1bmRlZmluZWQgJiYgdGF4TG90SWQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT50YXhMb3RJZCwgJ3RheExvdElkJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVVbnNldHRsZWRNb3ZlbWVudHMgIT09IHVuZGVmaW5lZCAmJiBpbmNsdWRlVW5zZXR0bGVkTW92ZW1lbnRzICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+aW5jbHVkZVVuc2V0dGxlZE1vdmVtZW50cywgJ2luY2x1ZGVVbnNldHRsZWRNb3ZlbWVudHMnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9ob2xkaW5ncy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJob2xkaW5nSWRcIiwgdmFsdWU6IGhvbGRpbmdJZCwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcIm51bWJlclwiLCBkYXRhRm9ybWF0OiBcImludDY0XCJ9KX0vY29udHJpYnV0b3JzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZlcnNpb25lZFJlc291cmNlTGlzdE9mSG9sZGluZ0NvbnRyaWJ1dG9yPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBHZXRIb2xkaW5nc0ZvckZ1bmQ6IEdldCBob2xkaW5ncyBmb3IgdHJhbnNhY3Rpb24gcG9ydGZvbGlvcyBpbiBhIEZ1bmQuXG4gICAgICogR2V0IHRoZSBob2xkaW5ncyBvZiB0cmFuc2FjdGlvbiBwb3J0Zm9saW9zIGluIGEgc3BlY2lmaWVkIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldEhvbGRpbmdzRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldEhvbGRpbmdzRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZlBvcnRmb2xpb0hvbGRpbmc+O1xuICAgIHB1YmxpYyBnZXRIb2xkaW5nc0ZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRIb2xkaW5nc0ZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWZXJzaW9uZWRSZXNvdXJjZUxpc3RPZlBvcnRmb2xpb0hvbGRpbmc+PjtcbiAgICBwdWJsaWMgZ2V0SG9sZGluZ3NGb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0SG9sZGluZ3NGb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZlcnNpb25lZFJlc291cmNlTGlzdE9mUG9ydGZvbGlvSG9sZGluZz4+O1xuICAgIHB1YmxpYyBnZXRIb2xkaW5nc0ZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRIb2xkaW5nc0ZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRIb2xkaW5nc0ZvckZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRIb2xkaW5nc0ZvckZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2luZ2xlVmFsdWF0aW9uUG9pbnRRdWVyeVBhcmFtZXRlcnMgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2luZ2xlVmFsdWF0aW9uUG9pbnRRdWVyeVBhcmFtZXRlcnM7XG4gICAgICAgIGlmIChzaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycyA9PT0gbnVsbCB8fCBzaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzaW5nbGVWYWx1YXRpb25Qb2ludFF1ZXJ5UGFyYW1ldGVycyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldEhvbGRpbmdzRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJvcGVydHlLZXlzO1xuICAgICAgICBjb25zdCBieVRheGxvdHMgPSByZXF1ZXN0UGFyYW1ldGVycz8uYnlUYXhsb3RzO1xuICAgICAgICBjb25zdCBpbmNsdWRlU2V0dGxlbWVudEV2ZW50c0FmdGVyRGF5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5pbmNsdWRlU2V0dGxlbWVudEV2ZW50c0FmdGVyRGF5cztcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAoYnlUYXhsb3RzICE9PSB1bmRlZmluZWQgJiYgYnlUYXhsb3RzICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YnlUYXhsb3RzLCAnYnlUYXhsb3RzJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGluY2x1ZGVTZXR0bGVtZW50RXZlbnRzQWZ0ZXJEYXlzICE9PSB1bmRlZmluZWQgJiYgaW5jbHVkZVNldHRsZW1lbnRFdmVudHNBZnRlckRheXMgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5pbmNsdWRlU2V0dGxlbWVudEV2ZW50c0FmdGVyRGF5cywgJ2luY2x1ZGVTZXR0bGVtZW50RXZlbnRzQWZ0ZXJEYXlzJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8kaG9sZGluZ3NgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmVyc2lvbmVkUmVzb3VyY2VMaXN0T2ZQb3J0Zm9saW9Ib2xkaW5nPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogc2luZ2xlVmFsdWF0aW9uUG9pbnRRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldFZhbHVhdGlvbkZvckZ1bmQ6IFBlcmZvcm0gdmFsdWF0aW9uIGZvciBhIEZ1bmQuXG4gICAgICogUGVyZm9ybSB2YWx1YXRpb24gb24gYSBzcGVjaWZpZWQgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uRm9yRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvbkZvckZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8TGlzdEFnZ3JlZ2F0aW9uUmVzcG9uc2U+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Gb3JGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uRm9yRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPExpc3RBZ2dyZWdhdGlvblJlc3BvbnNlPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvbkZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Gb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PExpc3RBZ2dyZWdhdGlvblJlc3BvbnNlPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvbkZvckZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Gb3JGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uRm9yRnVuZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvbkZvckZ1bmQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG4gICAgICAgIGNvbnN0IGZ1bmRWYWx1YXRpb25SZXF1ZXN0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZ1bmRWYWx1YXRpb25SZXF1ZXN0O1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8kdmFsdWF0aW9uYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PExpc3RBZ2dyZWdhdGlvblJlc3BvbnNlPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogZnVuZFZhbHVhdGlvblJlcXVlc3QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldFZhbHVhdGlvblBvaW50RGF0YTogR2V0IFZhbHVhdGlvbiBQb2ludCBEYXRhIGZvciBhIEZ1bmQuXG4gICAgICogUmV0cmlldmVzIHRoZSBWYWx1YXRpb24gUG9pbnQgZGF0YSBiZXR3ZWVuIGdpdmVuIGRhdGVzIG9yIFZhbHVhdGlvbiBQb2ludCBjb2Rlcy4gIFRoZSBlbmRwb2ludCB3aWxsIGludGVybmFsbHkgZXh0cmFjdCBhbGwgXFwmIzM5O0Fzc2V0c1xcJiMzOTsgYW5kIFxcJiMzOTtMaWFiaWxpdGllc1xcJiMzOTsgZnJvbSB0aGUgRnVuZFxcJiMzOTtzIFRyaWFsIGJhbGFuY2UgdG8gcHJvZHVjZSBhIEdBVi4gIFN0YXJ0IGRhdGUgd2lsbCBiZSBhc3N1bWVkIGZyb20gdGhlIGxhc3QgXFwmIzM5O29mZmljaWFsXFwmIzM5OyBWYWx1YXRpb25Qb2ludCBhbmQgRW5kRGF0ZSB3aWxsIGJlIGFzIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludERhdGEocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2U+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludERhdGEocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludERhdGFSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludERhdGEocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnREYXRhKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnREYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnREYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50RGF0YS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy8kcXVlcnlgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2U+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXM6IEdldCB0aGUgSm91cm5hbCBFbnRyeSBMaW5lcyBmb3IgdGhlIGdpdmVuIEZ1bmQuXG4gICAgICogR2V0cyB0aGUgSm91cm5hbCBFbnRyeSBMaW5lcyBmb3IgdGhlIGdpdmVuIFZhbHVhdGlvbiBQb2ludCBmb3IgYSBGdW5kLiAgICAgICAgICAgICAgICBUaGUgSm91cm5hbCBFbnRyeSBMaW5lcyBoYXZlIGJlZW4gZ2VuZXJhdGVkIGZyb20gdHJhbnNhY3Rpb25zLCB0cmFuc2xhdGVkIHZpYSBwb3N0aW5nIHJ1bGVzIGFuZCB1c2VkIGluIHRoZSB2YWx1YXRpb24gcG9pbnQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludEpvdXJuYWxFbnRyeUxpbmVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kSm91cm5hbEVudHJ5TGluZT47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludEpvdXJuYWxFbnRyeUxpbmVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRKb3VybmFsRW50cnlMaW5lPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludEpvdXJuYWxFbnRyeUxpbmVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kSm91cm5hbEVudHJ5TGluZT4+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludEpvdXJuYWxFbnRyeUxpbmVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRKb3VybmFsRW50cnlMaW5lc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludEpvdXJuYWxFbnRyeUxpbmVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50Sm91cm5hbEVudHJ5TGluZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZTtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJvcGVydHlLZXlzO1xuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcbiAgICAgICAgY29uc3QgYnVja2V0U2V0Q29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5idWNrZXRTZXRDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZSAhPT0gdW5kZWZpbmVkICYmIGdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZSwgJ2dlbmVyYWxMZWRnZXJQcm9maWxlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgcHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJvcGVydHlLZXlzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChidWNrZXRTZXRDb2RlICE9PSB1bmRlZmluZWQgJiYgYnVja2V0U2V0Q29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmJ1Y2tldFNldENvZGUsICdidWNrZXRTZXRDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvam91cm5hbGVudHJ5bGluZXMvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kSm91cm5hbEVudHJ5TGluZT4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gR2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5OiBHZXQgYSBQbkwgc3VtbWFyeSBmb3IgdGhlIGdpdmVuIFZhbHVhdGlvbiBQb2ludCBpbiB0aGUgRnVuZC5cbiAgICAgKiBHZXRzIHRoZSBQbkwgU3VtbWFyeSBsaW5lcyBmcm9tIHRoZSBKb3VybmFsIEVudHJ5IExpbmVzIHByb2R1Y2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5KHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZQbmxKb3VybmFsRW50cnlMaW5lPjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5KHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZlBubEpvdXJuYWxFbnRyeUxpbmU+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5KHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRQbmxTdW1tYXJ5UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZQbmxKb3VybmFsRW50cnlMaW5lPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50UG5sU3VtbWFyeShyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50UG5sU3VtbWFyeVJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50UG5sU3VtbWFyeS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50UG5sU3VtbWFyeS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSBudWxsIHx8IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludFBubFN1bW1hcnkuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmdlbmVyYWxMZWRnZXJQcm9maWxlQ29kZTtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5nZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUsICdnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5maWx0ZXIsICdmaWx0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzL3BubHN1bW1hcnkvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZQbmxKb3VybmFsRW50cnlMaW5lPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBHZXRWYWx1YXRpb25Qb2ludFF1b3RlczogR2V0IHRoZSBRdW90ZXMgZm9yIHRoZSBnaXZlbiBGdW5kIGFuZCBWYWx1YXRpb24gUG9pbnQuXG4gICAgICogR2V0cyBhbGwgcXVvdGVzIHdpdGhpbiB0aGUgZWZmZWN0aXZlIGRhdGUgcmFuZ2Ugb2YgdGhlIHNwZWNpZmllZCBWYWx1YXRpb24gUG9pbnQgZm9yIGEgRnVuZCwgIGluY2x1ZGluZyBhbnkgcXVvdGVzIGFkZGVkIHZpYSBhIENvbXBsZXggQ2xvc2UgKFBvc3QtQ2xvc2UgQWN0aXZpdHkpLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFF1b3RlcyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50UXVvdGVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRRdW90ZT47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50UXVvdGVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRRdW90ZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkUXVvdGU+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRRdW90ZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFF1b3Rlc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkUXVvdGU+PjtcbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRRdW90ZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFF1b3Rlc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50UXVvdGVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRRdW90ZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRRdW90ZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy9xdW90ZXMvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRRdW90ZT4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gR2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnM6IEdldCB0aGUgVHJhbnNhY3Rpb25zIGZvciB0aGUgZ2l2ZW4gRnVuZC5cbiAgICAgKiBHZXRzIHRoZSBUcmFuc2FjdGlvbnMgZm9yIHRoZSBnaXZlbiBWYWx1YXRpb24gUG9pbnQgZm9yIGEgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFRyYW5zYWN0aW9uc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkVHJhbnNhY3Rpb24+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFRyYW5zYWN0aW9ucyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50VHJhbnNhY3Rpb25zUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZFRyYW5zYWN0aW9uPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50VHJhbnNhY3Rpb25zKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZFRyYW5zYWN0aW9uPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50VHJhbnNhY3Rpb25zKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRUcmFuc2FjdGlvbnNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludFRyYW5zYWN0aW9ucy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50VHJhbnNhY3Rpb25zLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnM7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50VHJhbnNhY3Rpb25zLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbHRlcjtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByb3BlcnR5S2V5cztcbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG4gICAgICAgIGNvbnN0IGRhdGFNb2RlbFNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmRhdGFNb2RlbFNjb3BlO1xuICAgICAgICBjb25zdCBkYXRhTW9kZWxDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmRhdGFNb2RlbENvZGU7XG4gICAgICAgIGNvbnN0IHNob3dDYW5jZWxsZWRUcmFuc2FjdGlvbnMgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2hvd0NhbmNlbGxlZFRyYW5zYWN0aW9ucztcbiAgICAgICAgY29uc3QgbWVtYmVyc2hpcFR5cGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubWVtYmVyc2hpcFR5cGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5maWx0ZXIsICdmaWx0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YU1vZGVsU2NvcGUgIT09IHVuZGVmaW5lZCAmJiBkYXRhTW9kZWxTY29wZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmRhdGFNb2RlbFNjb3BlLCAnZGF0YU1vZGVsU2NvcGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0YU1vZGVsQ29kZSAhPT0gdW5kZWZpbmVkICYmIGRhdGFNb2RlbENvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5kYXRhTW9kZWxDb2RlLCAnZGF0YU1vZGVsQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzaG93Q2FuY2VsbGVkVHJhbnNhY3Rpb25zICE9PSB1bmRlZmluZWQgJiYgc2hvd0NhbmNlbGxlZFRyYW5zYWN0aW9ucyAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnNob3dDYW5jZWxsZWRUcmFuc2FjdGlvbnMsICdzaG93Q2FuY2VsbGVkVHJhbnNhY3Rpb25zJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1lbWJlcnNoaXBUeXBlICE9PSB1bmRlZmluZWQgJiYgbWVtYmVyc2hpcFR5cGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5tZW1iZXJzaGlwVHlwZSwgJ21lbWJlcnNoaXBUeXBlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvdHJhbnNhY3Rpb25zLyRxdWVyeWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkVHJhbnNhY3Rpb24+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldFZhbHVhdGlvblBvaW50VHJpYWxCYWxhbmNlOiBHZXQgVHJpYWwgQmFsYW5jZSBmb3IgdGhlIGdpdmVuIEZ1bmQuXG4gICAgICogR2V0cyB0aGUgVHJpYWwgQmFsYW5jZSBmb3IgdGhlIGdpdmVuIFZhbHVhdGlvbiBQb2ludCBmb3IgYSBGdW5kLiAgICAgICAgICAgICAgICBUaGUgVHJpYWwgQmFsYW5jZSBoYXMgYmVlbiBnZW5lcmF0ZWQgZnJvbSB0cmFuc2FjdGlvbnMsIHRyYW5zbGF0ZWQgdmlhIFBvc3RpbmcgUnVsZXMgIGFuZCBhZ2dyZWdhdGVkIGJhc2VkIG9uIGEgR2VuZXJhbCBMZWRnZXIgUHJvZmlsZSAod2hlcmUgc3BlY2lmaWVkKS4gICAgICAgICAgICAgICAgU3VwcGx5aW5nIHRoZSBYLUxVU0lELVN1cHByZXNzSW1iYWxhbmNlVmFsaWRhdGlvbiBoZWFkZXIgc3VwcHJlc3NlcyB0aGUgaW1iYWxhbmNlIGNoZWNrLiAgQW55IGNhbGxlciB3aXRoIGFjY2VzcyB0byB0aGlzIGVuZHBvaW50IG1heSB1c2UgaXQ7IGl0IGlzIG5vdCByb2xlLXJlc3RyaWN0ZWQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50VHJpYWxCYWxhbmNlKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2VSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZlRyaWFsQmFsYW5jZT47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50VHJpYWxCYWxhbmNlKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2VSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mVHJpYWxCYWxhbmNlPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50VHJpYWxCYWxhbmNlKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2VSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZlRyaWFsQmFsYW5jZT4+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFRyaWFsQmFsYW5jZShyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50VHJpYWxCYWxhbmNlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgZ2V0VmFsdWF0aW9uUG9pbnRUcmlhbEJhbGFuY2UuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludFRyaWFsQmFsYW5jZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID09PSBudWxsIHx8IHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludFRyaWFsQmFsYW5jZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBnZW5lcmFsTGVkZ2VyUHJvZmlsZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlO1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuICAgICAgICBjb25zdCBleGNsdWRlQ2xlYXJkb3duTW9kdWxlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmV4Y2x1ZGVDbGVhcmRvd25Nb2R1bGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlICE9PSB1bmRlZmluZWQgJiYgZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+Z2VuZXJhbExlZGdlclByb2ZpbGVDb2RlLCAnZ2VuZXJhbExlZGdlclByb2ZpbGVDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXlzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUtleXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcm9wZXJ0eUtleXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4Y2x1ZGVDbGVhcmRvd25Nb2R1bGUgIT09IHVuZGVmaW5lZCAmJiBleGNsdWRlQ2xlYXJkb3duTW9kdWxlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZXhjbHVkZUNsZWFyZG93bk1vZHVsZSwgJ2V4Y2x1ZGVDbGVhcmRvd25Nb2R1bGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy90cmlhbGJhbGFuY2UvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZUcmlhbEJhbGFuY2U+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIEdldFZhbHVhdGlvblBvaW50VW5zZXR0bGVkVHJhbnNhY3Rpb25zOiBHZXQgVW5zZXR0bGVkIFRyYW5zYWN0aW9ucyBmb3IgdGhlIGdpdmVuIEZ1bmQuXG4gICAgICogR2V0cyBhbGwgdHJhbnNhY3Rpb25zIHRoYXQgcmVtYWluIHVuc2V0dGxlZCBhcyBhdCB0aGUgc3BlY2lmaWVkIFZhbHVhdGlvbiBQb2ludCBmb3IgYSBGdW5kLCAgbG9va2luZyBiYWNrIGZyb20gaW5jZXB0aW9uLiBTZXR0bGVtZW50IHN0YXR1cyBpcyBwb2ludC1pbi10aW1lOiBwb3N0LWN1dG9mZiBzZXR0bGVtZW50ICBhY3Rpdml0eSBkb2VzIG5vdCBhbHRlciB0aGUgcmVzdWx0LiAgVGhlIFZhbHVhdGlvbiBQb2ludCBtdXN0IGJlIGlkZW50aWZpZWQgZWl0aGVyIGJ5IHRoZSBkYXRlIG9yIGRpYXJ5RW50cnkgcXVlcnkgcGFyYW1ldGVycyBvciBieSB0aGUgIFxcJiMzOTtkYXRlT3JEaWFyeUVudHJ5XFwmIzM5OyBwYXJhbWV0ZXIgaW4gdGhlIHJlcXVlc3QgYm9keTsgd2hlbiBib3RoIGFyZSBzdXBwbGllZCB0aGUgcXVlcnkgcGFyYW1ldGVycyBhcmUgdXNlZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0VmFsdWF0aW9uUG9pbnRVbnNldHRsZWRUcmFuc2FjdGlvbnMocmVxdWVzdFBhcmFtZXRlcnM/OiBHZXRWYWx1YXRpb25Qb2ludFVuc2V0dGxlZFRyYW5zYWN0aW9uc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mVW5zZXR0bGVkVHJhbnNhY3Rpb24+O1xuICAgIHB1YmxpYyBnZXRWYWx1YXRpb25Qb2ludFVuc2V0dGxlZFRyYW5zYWN0aW9ucyhyZXF1ZXN0UGFyYW1ldGVycz86IEdldFZhbHVhdGlvblBvaW50VW5zZXR0bGVkVHJhbnNhY3Rpb25zUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZlVuc2V0dGxlZFRyYW5zYWN0aW9uPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50VW5zZXR0bGVkVHJhbnNhY3Rpb25zKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRVbnNldHRsZWRUcmFuc2FjdGlvbnNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZlVuc2V0dGxlZFRyYW5zYWN0aW9uPj47XG4gICAgcHVibGljIGdldFZhbHVhdGlvblBvaW50VW5zZXR0bGVkVHJhbnNhY3Rpb25zKHJlcXVlc3RQYXJhbWV0ZXJzPzogR2V0VmFsdWF0aW9uUG9pbnRVbnNldHRsZWRUcmFuc2FjdGlvbnNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBnZXRWYWx1YXRpb25Qb2ludFVuc2V0dGxlZFRyYW5zYWN0aW9ucy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGdldFZhbHVhdGlvblBvaW50VW5zZXR0bGVkVHJhbnNhY3Rpb25zLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByb3BlcnR5S2V5cztcbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG4gICAgICAgIGNvbnN0IGRhdGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uZGF0ZTtcbiAgICAgICAgY29uc3QgZGlhcnlFbnRyeSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5kaWFyeUVudHJ5O1xuICAgICAgICBjb25zdCB2YXJpYW50ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhcmlhbnQ7XG4gICAgICAgIGNvbnN0IHNpbmdsZVZhbHVhdGlvblBvaW50UXVlcnlQYXJhbWV0ZXJzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNpbmdsZVZhbHVhdGlvblBvaW50UXVlcnlQYXJhbWV0ZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGRhdGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5kYXRlLCAnZGF0ZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWFyeUVudHJ5ICE9PSB1bmRlZmluZWQgJiYgZGlhcnlFbnRyeSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmRpYXJ5RW50cnksICdkaWFyeUVudHJ5Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhcmlhbnQgIT09IHVuZGVmaW5lZCAmJiB2YXJpYW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dmFyaWFudCwgJ3ZhcmlhbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy91bnNldHRsZWR0cmFuc2FjdGlvbnMvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZVbnNldHRsZWRUcmFuc2FjdGlvbj4oJ3Bvc3QnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHNpbmdsZVZhbHVhdGlvblBvaW50UXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBMaXN0RmVlczogTGlzdCBGZWVzIGZvciBhIHNwZWNpZmllZCBGdW5kLlxuICAgICAqIExpc3QgYWxsIHRoZSBGZWVzIG1hdGNoaW5nIGEgcGFydGljdWxhciBjcml0ZXJpYS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGlzdEZlZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RmVlc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxQYWdlZFJlc291cmNlTGlzdE9mRmVlPjtcbiAgICBwdWJsaWMgbGlzdEZlZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RmVlc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFBhZ2VkUmVzb3VyY2VMaXN0T2ZGZWU+PjtcbiAgICBwdWJsaWMgbGlzdEZlZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RmVlc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxQYWdlZFJlc291cmNlTGlzdE9mRmVlPj47XG4gICAgcHVibGljIGxpc3RGZWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZlZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0RmVlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGxpc3RGZWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGVmZmVjdGl2ZUF0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmVmZmVjdGl2ZUF0O1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IHNvcnRCeSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zb3J0Qnk7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoZWZmZWN0aXZlQXQgIT09IHVuZGVmaW5lZCAmJiBlZmZlY3RpdmVBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmVmZmVjdGl2ZUF0LCAnZWZmZWN0aXZlQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwYWdlICE9PSB1bmRlZmluZWQgJiYgcGFnZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnBhZ2UsICdwYWdlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGZpbHRlciAhPT0gdW5kZWZpbmVkICYmIGZpbHRlciAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmZpbHRlciwgJ2ZpbHRlcicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzb3J0QnkpIHtcbiAgICAgICAgICAgIHNvcnRCeS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3NvcnRCeScpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXlzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUtleXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcm9wZXJ0eUtleXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2ZlZXNgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8UGFnZWRSZXNvdXJjZUxpc3RPZkZlZT4oJ2dldCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIExpc3RGdW5kQ2FsZW5kYXI6IExpc3QgRnVuZCBDYWxlbmRhci5cbiAgICAgKiBMaXN0IGFsbCB0aGUgQ2FsZW5kYXIgRW50cmllcyBhc3NvY2lhdGVkIHdpdGggdGhlIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGxpc3RGdW5kQ2FsZW5kYXIocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RnVuZENhbGVuZGFyUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kQ2FsZW5kYXJFbnRyeT47XG4gICAgcHVibGljIGxpc3RGdW5kQ2FsZW5kYXIocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RnVuZENhbGVuZGFyUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8UGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmRDYWxlbmRhckVudHJ5Pj47XG4gICAgcHVibGljIGxpc3RGdW5kQ2FsZW5kYXIocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RnVuZENhbGVuZGFyUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kQ2FsZW5kYXJFbnRyeT4+O1xuICAgIHB1YmxpYyBsaXN0RnVuZENhbGVuZGFyKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRDYWxlbmRhclJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGxpc3RGdW5kQ2FsZW5kYXIuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0RnVuZENhbGVuZGFyLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbHRlcjtcbiAgICAgICAgY29uc3Qgc29ydEJ5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNvcnRCeTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByb3BlcnR5S2V5cztcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvcnRCeSkge1xuICAgICAgICAgICAgc29ydEJ5LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAnc29ydEJ5Jyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vY2FsZW5kYXJgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8UGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmRDYWxlbmRhckVudHJ5PignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gTGlzdEZ1bmRDYWxlbmRhckVudHJpZXM6IExpc3QgRnVuZCBDYWxlbmRhciBFbnRyaWVzLlxuICAgICAqIExpc3QgYWxsIHRoZSBDYWxlbmRhciBFbnRyaWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGlzdEZ1bmRDYWxlbmRhckVudHJpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RnVuZENhbGVuZGFyRW50cmllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxQYWdlZFJlc291cmNlTGlzdE9mRnVuZENhbGVuZGFyRW50cmllcz47XG4gICAgcHVibGljIGxpc3RGdW5kQ2FsZW5kYXJFbnRyaWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRDYWxlbmRhckVudHJpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxQYWdlZFJlc291cmNlTGlzdE9mRnVuZENhbGVuZGFyRW50cmllcz4+O1xuICAgIHB1YmxpYyBsaXN0RnVuZENhbGVuZGFyRW50cmllcyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RGdW5kQ2FsZW5kYXJFbnRyaWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kQ2FsZW5kYXJFbnRyaWVzPj47XG4gICAgcHVibGljIGxpc3RGdW5kQ2FsZW5kYXJFbnRyaWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRDYWxlbmRhckVudHJpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0RnVuZENhbGVuZGFyRW50cmllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGxpc3RGdW5kQ2FsZW5kYXJFbnRyaWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbHRlcjtcbiAgICAgICAgY29uc3Qgc29ydEJ5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNvcnRCeTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByb3BlcnR5S2V5cztcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvcnRCeSkge1xuICAgICAgICAgICAgc29ydEJ5LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAnc29ydEJ5Jyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vY2FsZW5kYXJzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFBhZ2VkUmVzb3VyY2VMaXN0T2ZGdW5kQ2FsZW5kYXJFbnRyaWVzPignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gTGlzdEZ1bmRzOiBMaXN0IEZ1bmRzLlxuICAgICAqIExpc3QgYWxsIHRoZSBGdW5kcyBtYXRjaGluZyBwYXJ0aWN1bGFyIGNyaXRlcmlhLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsaXN0RnVuZHMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RnVuZHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8UGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmQ+O1xuICAgIHB1YmxpYyBsaXN0RnVuZHMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RnVuZHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxQYWdlZFJlc291cmNlTGlzdE9mRnVuZD4+O1xuICAgIHB1YmxpYyBsaXN0RnVuZHMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0RnVuZHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8UGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmQ+PjtcbiAgICBwdWJsaWMgbGlzdEZ1bmRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdEZ1bmRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBlZmZlY3RpdmVBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lZmZlY3RpdmVBdDtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBzb3J0QnkgPSByZXF1ZXN0UGFyYW1ldGVycz8uc29ydEJ5O1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJvcGVydHlLZXlzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGVmZmVjdGl2ZUF0ICE9PSB1bmRlZmluZWQgJiYgZWZmZWN0aXZlQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5lZmZlY3RpdmVBdCwgJ2VmZmVjdGl2ZUF0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5maWx0ZXIsICdmaWx0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc29ydEJ5KSB7XG4gICAgICAgICAgICBzb3J0QnkuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdzb3J0QnknKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgcHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJvcGVydHlLZXlzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHNgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8UGFnZWRSZXNvdXJjZUxpc3RPZkZ1bmQ+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBMaXN0TmF2QWN0aXZpdHlBZGp1c3RtZW50czogTGlzdCBOQVYgYWRqdXN0bWVudCBhY3Rpdml0aWVzIGFwcGxpZWQgdG8gYSB2YWx1YXRpb24gcG9pbnRcbiAgICAgKiBMaXN0cyB0aGUgTkFWIGFkanVzdG1lbnQgYWN0aXZpdGllcyBhcHBsaWVkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWF0aW9uIHBvaW50IGZvciBhIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGxpc3ROYXZBY3Rpdml0eUFkanVzdG1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdE5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8UmVzb3VyY2VMaXN0T2ZOYXZBY3Rpdml0eUFkanVzdG1lbnRSZXNwb25zZT47XG4gICAgcHVibGljIGxpc3ROYXZBY3Rpdml0eUFkanVzdG1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdE5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxSZXNvdXJjZUxpc3RPZk5hdkFjdGl2aXR5QWRqdXN0bWVudFJlc3BvbnNlPj47XG4gICAgcHVibGljIGxpc3ROYXZBY3Rpdml0eUFkanVzdG1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdE5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8UmVzb3VyY2VMaXN0T2ZOYXZBY3Rpdml0eUFkanVzdG1lbnRSZXNwb25zZT4+O1xuICAgIHB1YmxpYyBsaXN0TmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3ROYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdE5hdkFjdGl2aXR5QWRqdXN0bWVudHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0TmF2QWN0aXZpdHlBZGp1c3RtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludENvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8udmFsdWF0aW9uUG9pbnRDb2RlO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnRDb2RlID09PSBudWxsIHx8IHZhbHVhdGlvblBvaW50Q29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciB2YWx1YXRpb25Qb2ludENvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0TmF2QWN0aXZpdHlBZGp1c3RtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQ7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnRDb2RlICE9PSB1bmRlZmluZWQgJiYgdmFsdWF0aW9uUG9pbnRDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dmFsdWF0aW9uUG9pbnRDb2RlLCAndmFsdWF0aW9uUG9pbnRDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW1pdCAhPT0gdW5kZWZpbmVkICYmIGxpbWl0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bGltaXQsICdsaW1pdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5maWx0ZXIsICdmaWx0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCAhPT0gdW5kZWZpbmVkICYmIHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT52YWx1YXRpb25Qb2ludENvZGVWYXJpYW50LCAndmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS9uYXZBZGp1c3RtZW50YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFJlc291cmNlTGlzdE9mTmF2QWN0aXZpdHlBZGp1c3RtZW50UmVzcG9uc2U+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBMaXN0VmFsdWF0aW9uUG9pbnRDb21wbGV4TWFya2V0RGF0YTogTGlzdCB0aGUgQ29tcGxleCBNYXJrZXQgRGF0YSBmb3IgdGhlIGdpdmVuIEZ1bmQgYW5kIFZhbHVhdGlvbiBQb2ludC5cbiAgICAgKiBMaXN0cyBhbGwgY29tcGxleCBtYXJrZXQgZGF0YSB3aXRoaW4gdGhlIGVmZmVjdGl2ZSBkYXRlIHJhbmdlIG9mIHRoZSBzcGVjaWZpZWQgVmFsdWF0aW9uIFBvaW50IGZvciBhIEZ1bmQsICBpbmNsdWRpbmcgYW55IGl0ZW1zIGFkZGVkIHZpYSBhIENvbXBsZXggQ2xvc2UgKFBvc3QtQ2xvc2UgQWN0aXZpdHkpLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBsaXN0VmFsdWF0aW9uUG9pbnRDb21wbGV4TWFya2V0RGF0YShyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RWYWx1YXRpb25Qb2ludENvbXBsZXhNYXJrZXREYXRhUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZBY2NvdW50ZWRDb21wbGV4TWFya2V0RGF0YT47XG4gICAgcHVibGljIGxpc3RWYWx1YXRpb25Qb2ludENvbXBsZXhNYXJrZXREYXRhKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGFSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkQ29tcGxleE1hcmtldERhdGE+PjtcbiAgICBwdWJsaWMgbGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGEocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0VmFsdWF0aW9uUG9pbnRDb21wbGV4TWFya2V0RGF0YVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mQWNjb3VudGVkQ29tcGxleE1hcmtldERhdGE+PjtcbiAgICBwdWJsaWMgbGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGEocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0VmFsdWF0aW9uUG9pbnRDb21wbGV4TWFya2V0RGF0YVJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGxpc3RWYWx1YXRpb25Qb2ludENvbXBsZXhNYXJrZXREYXRhLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGEuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50RGF0YVF1ZXJ5UGFyYW1ldGVycyA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludERhdGFRdWVyeVBhcmFtZXRlcnMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdFZhbHVhdGlvblBvaW50Q29tcGxleE1hcmtldERhdGEuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBsaW1pdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5saW1pdDtcbiAgICAgICAgY29uc3QgcGFnZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wYWdlO1xuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy9jb21wbGV4bWFya2V0ZGF0YS8kcXVlcnlgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkFjY291bnRlZENvbXBsZXhNYXJrZXREYXRhPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdmFsdWF0aW9uUG9pbnREYXRhUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBMaXN0VmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50czogTGlzdCBJbnN0cnVtZW50cyBpbnNpZGUgYSB2YWx1YXRpb24gcG9pbnRcbiAgICAgKiBMaXN0cyB0aGUgSW5zdHJ1bWVudHMgbGlua2VkIHRvIFRyYW5zYWN0aW9ucyB3aXRoaW4gYSBWYWx1YXRpb24gUG9pbnQgZm9yIGEgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgbGlzdFZhbHVhdGlvblBvaW50SW5zdHJ1bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0VmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxQYWdlZFJlc291cmNlTGlzdE9mVmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50PjtcbiAgICBwdWJsaWMgbGlzdFZhbHVhdGlvblBvaW50SW5zdHJ1bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0VmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFBhZ2VkUmVzb3VyY2VMaXN0T2ZWYWx1YXRpb25Qb2ludEluc3RydW1lbnQ+PjtcbiAgICBwdWJsaWMgbGlzdFZhbHVhdGlvblBvaW50SW5zdHJ1bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0VmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxQYWdlZFJlc291cmNlTGlzdE9mVmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50Pj47XG4gICAgcHVibGljIGxpc3RWYWx1YXRpb25Qb2ludEluc3RydW1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdFZhbHVhdGlvblBvaW50SW5zdHJ1bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0VmFsdWF0aW9uUG9pbnRJbnN0cnVtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGxpc3RWYWx1YXRpb25Qb2ludEluc3RydW1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZhbHVhdGlvblBvaW50Q29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludENvZGU7XG4gICAgICAgIGlmICh2YWx1YXRpb25Qb2ludENvZGUgPT09IG51bGwgfHwgdmFsdWF0aW9uUG9pbnRDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHZhbHVhdGlvblBvaW50Q29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIGxpc3RWYWx1YXRpb25Qb2ludEluc3RydW1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IHNvcnRCeSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zb3J0Qnk7XG4gICAgICAgIGNvbnN0IGluc3RydW1lbnRQcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8uaW5zdHJ1bWVudFByb3BlcnR5S2V5cztcbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy52YWx1YXRpb25Qb2ludENvZGVWYXJpYW50O1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVhdGlvblBvaW50Q29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PnZhbHVhdGlvblBvaW50Q29kZSwgJ3ZhbHVhdGlvblBvaW50Q29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNvcnRCeSkge1xuICAgICAgICAgICAgc29ydEJ5LmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAnc29ydEJ5Jyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbnN0cnVtZW50UHJvcGVydHlLZXlzKSB7XG4gICAgICAgICAgICBpbnN0cnVtZW50UHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAnaW5zdHJ1bWVudFByb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCAhPT0gdW5kZWZpbmVkICYmIHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT52YWx1YXRpb25Qb2ludENvZGVWYXJpYW50LCAndmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvaW5zdHJ1bWVudHMvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFBhZ2VkUmVzb3VyY2VMaXN0T2ZWYWx1YXRpb25Qb2ludEluc3RydW1lbnQ+KCdnZXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBMaXN0VmFsdWF0aW9uUG9pbnRPdmVydmlldzogTGlzdCBWYWx1YXRpb24gUG9pbnRzIE92ZXJ2aWV3IGZvciBhIGdpdmVuIEZ1bmQuXG4gICAgICogTGlzdCB0aGUgb3ZlcnZpZXcgb2YgYWxsIHRoZSBWYWx1YXRpb24gUG9pbnRzIHRoYXQgbWF0Y2ggdGhlIGdpdmVuIGNyaXRlcmlhIGZvciBhIGdpdmVuIEZ1bmQuXG4gICAgICogQHBhcmFtIHJlcXVlc3RQYXJhbWV0ZXJzXG4gICAgICogQHBhcmFtIG9ic2VydmUgc2V0IHdoZXRoZXIgb3Igbm90IHRvIHJldHVybiB0aGUgZGF0YSBPYnNlcnZhYmxlIGFzIHRoZSBib2R5LCByZXNwb25zZSBvciBldmVudHMuIGRlZmF1bHRzIHRvIHJldHVybmluZyB0aGUgYm9keS5cbiAgICAgKiBAcGFyYW0gcmVwb3J0UHJvZ3Jlc3MgZmxhZyB0byByZXBvcnQgcmVxdWVzdCBhbmQgcmVzcG9uc2UgcHJvZ3Jlc3MuXG4gICAgICovXG4gICAgcHVibGljIGxpc3RWYWx1YXRpb25Qb2ludE92ZXJ2aWV3KHJlcXVlc3RQYXJhbWV0ZXJzPzogTGlzdFZhbHVhdGlvblBvaW50T3ZlcnZpZXdSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8UGFnZWRSZXNvdXJjZUxpc3RPZlZhbHVhdGlvblBvaW50T3ZlcnZpZXc+O1xuICAgIHB1YmxpYyBsaXN0VmFsdWF0aW9uUG9pbnRPdmVydmlldyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RWYWx1YXRpb25Qb2ludE92ZXJ2aWV3UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8UGFnZWRSZXNvdXJjZUxpc3RPZlZhbHVhdGlvblBvaW50T3ZlcnZpZXc+PjtcbiAgICBwdWJsaWMgbGlzdFZhbHVhdGlvblBvaW50T3ZlcnZpZXcocmVxdWVzdFBhcmFtZXRlcnM/OiBMaXN0VmFsdWF0aW9uUG9pbnRPdmVydmlld1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxQYWdlZFJlc291cmNlTGlzdE9mVmFsdWF0aW9uUG9pbnRPdmVydmlldz4+O1xuICAgIHB1YmxpYyBsaXN0VmFsdWF0aW9uUG9pbnRPdmVydmlldyhyZXF1ZXN0UGFyYW1ldGVycz86IExpc3RWYWx1YXRpb25Qb2ludE92ZXJ2aWV3UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgbGlzdFZhbHVhdGlvblBvaW50T3ZlcnZpZXcuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5jb2RlO1xuICAgICAgICBpZiAoY29kZSA9PT0gbnVsbCB8fCBjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBsaXN0VmFsdWF0aW9uUG9pbnRPdmVydmlldy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBlZmZlY3RpdmVBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5lZmZlY3RpdmVBdDtcbiAgICAgICAgY29uc3QgYXNBdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5hc0F0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSByZXF1ZXN0UGFyYW1ldGVycz8uZmlsdGVyO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUtleXMgPSByZXF1ZXN0UGFyYW1ldGVycz8ucHJvcGVydHlLZXlzO1xuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChlZmZlY3RpdmVBdCAhPT0gdW5kZWZpbmVkICYmIGVmZmVjdGl2ZUF0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZWZmZWN0aXZlQXQsICdlZmZlY3RpdmVBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhc0F0ICE9PSB1bmRlZmluZWQgJiYgYXNBdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmFzQXQsICdhc0F0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5S2V5cykge1xuICAgICAgICAgICAgcHJvcGVydHlLZXlzLmZvckVhY2goKGVsZW1lbnQpID0+IHtcbiAgICAgICAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgICAgPGFueT5lbGVtZW50LCAncHJvcGVydHlLZXlzJyk7XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25Qb2ludE92ZXJ2aWV3YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFBhZ2VkUmVzb3VyY2VMaXN0T2ZWYWx1YXRpb25Qb2ludE92ZXJ2aWV3PignZ2V0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gUGF0Y2hGZWU6IFBhdGNoIEZlZS5cbiAgICAgKiBDcmVhdGUgb3IgdXBkYXRlIGNlcnRhaW4gZmllbGRzIGZvciBhIHBhcnRpY3VsYXIgRmVlLiAgVGhlIGJlaGF2aW91ciBpcyBkZWZpbmVkIGJ5IHRoZSBKU09OIFBhdGNoIHNwZWNpZmljYXRpb24uICAgIEN1cnJlbnRseSBzdXBwb3J0ZWQgZmllbGRzIGFyZTogRW5kRGF0ZSwgU2hhcmVDbGFzc2VzLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXRjaEZlZShyZXF1ZXN0UGFyYW1ldGVycz86IFBhdGNoRmVlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZlZT47XG4gICAgcHVibGljIHBhdGNoRmVlKHJlcXVlc3RQYXJhbWV0ZXJzPzogUGF0Y2hGZWVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxGZWU+PjtcbiAgICBwdWJsaWMgcGF0Y2hGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBQYXRjaEZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxGZWU+PjtcbiAgICBwdWJsaWMgcGF0Y2hGZWUocmVxdWVzdFBhcmFtZXRlcnM/OiBQYXRjaEZlZVJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBhdGNoRmVlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcGF0Y2hGZWUuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmVlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5mZWVDb2RlO1xuICAgICAgICBpZiAoZmVlQ29kZSA9PT0gbnVsbCB8fCBmZWVDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZlZUNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwYXRjaEZlZS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBvcGVyYXRpb24gPSByZXF1ZXN0UGFyYW1ldGVycz8ub3BlcmF0aW9uO1xuICAgICAgICBpZiAob3BlcmF0aW9uID09PSBudWxsIHx8IG9wZXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBvcGVyYXRpb24gd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBwYXRjaEZlZS4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2ZlZXMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZmVlQ29kZVwiLCB2YWx1ZTogZmVlQ29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX1gO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8RmVlPigncGF0Y2gnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IG9wZXJhdGlvbixcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIFBhdGNoRnVuZDogUGF0Y2ggYSBGdW5kLlxuICAgICAqIFVwZGF0ZSBmaWVsZHMgb24gYSBGdW5kLiAgVGhlIGJlaGF2aW91ciBpcyBkZWZpbmVkIGJ5IHRoZSBKU09OIFBhdGNoIHNwZWNpZmljYXRpb24uICAgIEN1cnJlbnRseSBzdXBwb3J0ZWQgZmllbGRzIGFyZTogRGlzcGxheU5hbWUsIERlc2NyaXB0aW9uLCBCYXNlQ3VycmVuY3ksIFBvcnRmb2xpb0lkcywgRnVuZENvbmZpZ3VyYXRpb25JZCwgU2hhcmVDbGFzc0luc3RydW1lbnRzLCBUeXBlLCBJbmNlcHRpb25EYXRlLCBEZWNpbWFsUGxhY2VzLCBQcmltYXJ5TmF2VHlwZSwgQWRkaXRpb25hbE5hdlR5cGVzLCBBYm9ySWQsIFllYXJFbmREYXRlLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBwYXRjaEZ1bmQocmVxdWVzdFBhcmFtZXRlcnM/OiBQYXRjaEZ1bmRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RnVuZD47XG4gICAgcHVibGljIHBhdGNoRnVuZChyZXF1ZXN0UGFyYW1ldGVycz86IFBhdGNoRnVuZFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZ1bmQ+PjtcbiAgICBwdWJsaWMgcGF0Y2hGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogUGF0Y2hGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZ1bmQ+PjtcbiAgICBwdWJsaWMgcGF0Y2hGdW5kKHJlcXVlc3RQYXJhbWV0ZXJzPzogUGF0Y2hGdW5kUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcGF0Y2hGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcGF0Y2hGdW5kLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wZXJhdGlvbiA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5vcGVyYXRpb247XG4gICAgICAgIGlmIChvcGVyYXRpb24gPT09IG51bGwgfHwgb3BlcmF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIG9wZXJhdGlvbiB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHBhdGNoRnVuZC4nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZ1bmQ+KCdwYXRjaCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogb3BlcmF0aW9uLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0RFUFJFQ0FURURdIFF1ZXJ5Q2FzaFN0YXRlbWVudDogW0RFUFJFQ0FURURdIFF1ZXJ5Q2FzaFN0YXRlbWVudDogUXVlcnkgY2FzaCBzdGF0ZW1lbnQgZm9yIGEgRnVuZCB2YWx1YXRpb24gcG9pbnQuXG4gICAgICogRGVwcmVjYXRlZDogdXNlIFF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3kgaW5zdGVhZC4gUmV0dXJucyBzZXR0bGVkIGNhc2ggbW92ZW1lbnRzIHdpdGggIHJ1bm5pbmcgYmFsYW5jZSwgY29zdCBiYXNpcywgYXZlcmFnZSBGWCByYXRlLCBhbmQgcmVhbGlzZWQgRlggUG5MIGZvciB0aGUgc3BlY2lmaWVkIEZ1bmQgIHZhbHVhdGlvbiBwb2ludCBwZXJpb2QuIFRoZSBjYXNoIHN0YXRlbWVudCBpcyBkZXJpdmVkIGZyb20gSm91cm5hbCBFbnRyeSBMaW5lcyBmaWx0ZXJlZCB0byAgc2V0dGxlZCBjYXNoIChIb2xkVHlwZSYjeDNEO1xcJiMzOTtCXFwmIzM5OywgU291cmNlVHlwZSYjeDNEO0x1c2lkVHJhbnNhY3Rpb24pLiBVc2UgdGhlIERpc3BsYXlNb2RlIHBhcmFtZXRlciBvbiB0aGUgIHJlcXVlc3QgYm9keSB0byBjaG9vc2UgYmV0d2VlbiBTaG93UmV2ZXJzYWwgKGZ1bGwgcmV2ZXJzYWwvVHJ1ZVVwIGRldGFpbCkgYW5kIENvbnNvbGlkYXRlZCAgKGNvbGxhcHNlcyByZXZlcnNhbHMgaW50byBBdmdSYXRlQ29ycmVjdGlvbiByb3dzKS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcXVlcnlDYXNoU3RhdGVtZW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogUXVlcnlDYXNoU3RhdGVtZW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kQ2FzaFN0YXRlbWVudFJvdz47XG4gICAgcHVibGljIHF1ZXJ5Q2FzaFN0YXRlbWVudChyZXF1ZXN0UGFyYW1ldGVycz86IFF1ZXJ5Q2FzaFN0YXRlbWVudFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kQ2FzaFN0YXRlbWVudFJvdz4+O1xuICAgIHB1YmxpYyBxdWVyeUNhc2hTdGF0ZW1lbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBRdWVyeUNhc2hTdGF0ZW1lbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnRSZXNvdXJjZUxpc3RPZkZ1bmRDYXNoU3RhdGVtZW50Um93Pj47XG4gICAgcHVibGljIHF1ZXJ5Q2FzaFN0YXRlbWVudChyZXF1ZXN0UGFyYW1ldGVycz86IFF1ZXJ5Q2FzaFN0YXRlbWVudFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHF1ZXJ5Q2FzaFN0YXRlbWVudC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHF1ZXJ5Q2FzaFN0YXRlbWVudC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5xdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHF1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzID09PSBudWxsIHx8IHF1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHF1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcXVlcnlDYXNoU3RhdGVtZW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFzQXQgPSByZXF1ZXN0UGFyYW1ldGVycz8uYXNBdDtcbiAgICAgICAgY29uc3QgZmlsdGVyID0gcmVxdWVzdFBhcmFtZXRlcnM/LmZpbHRlcjtcbiAgICAgICAgY29uc3QgbGltaXQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubGltaXQ7XG4gICAgICAgIGNvbnN0IHBhZ2UgPSByZXF1ZXN0UGFyYW1ldGVycz8ucGFnZTtcbiAgICAgICAgY29uc3QgcHJvcGVydHlLZXlzID0gcmVxdWVzdFBhcmFtZXRlcnM/LnByb3BlcnR5S2V5cztcbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAoYXNBdCAhPT0gdW5kZWZpbmVkICYmIGFzQXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5hc0F0LCAnYXNBdCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChmaWx0ZXIgIT09IHVuZGVmaW5lZCAmJiBmaWx0ZXIgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5maWx0ZXIsICdmaWx0ZXInKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobGltaXQgIT09IHVuZGVmaW5lZCAmJiBsaW1pdCAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55PmxpbWl0LCAnbGltaXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGFnZSAhPT0gdW5kZWZpbmVkICYmIHBhZ2UgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5wYWdlLCAncGFnZScpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9wZXJ0eUtleXMpIHtcbiAgICAgICAgICAgIHByb3BlcnR5S2V5cy5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICAgIDxhbnk+ZWxlbWVudCwgJ3Byb3BlcnR5S2V5cycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50cy9jYXNoc3RhdGVtZW50LyRxdWVyeWA7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mRnVuZENhc2hTdGF0ZW1lbnRSb3c+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gUXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeTogW0VYUEVSSU1FTlRBTF0gUXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeTogUXVlcnkgdGhlIGxvY2FsLWN1cnJlbmN5IGNhc2ggc3RhdGVtZW50IGZvciBhIEZ1bmQgdmFsdWF0aW9uIHBvaW50LlxuICAgICAqIFJldHVybnMgc2V0dGxlZCBjYXNoIG1vdmVtZW50cyB3aXRoIGEgcnVubmluZyBiYWxhbmNlIGluIGxvY2FsIGN1cnJlbmN5IGZvciB0aGUgc3BlY2lmaWVkIEZ1bmQgIHZhbHVhdGlvbiBwb2ludCBwZXJpb2QuIFRoZSBjYXNoIHN0YXRlbWVudCBpcyBkZXJpdmVkIGZyb20gSm91cm5hbCBFbnRyeSBMaW5lcyBmaWx0ZXJlZCB0byAgc2V0dGxlZCBjYXNoIChIb2xkVHlwZSYjeDNEO1xcJiMzOTtCXFwmIzM5OywgU291cmNlVHlwZSYjeDNEO0x1c2lkVHJhbnNhY3Rpb24pLiBVc2UgdGhlIERpc3BsYXlNb2RlIHBhcmFtZXRlciBvbiB0aGUgIHJlcXVlc3QgYm9keSB0byBjaG9vc2UgYmV0d2VlbiBTaG93UmV2ZXJzYWwgKGZ1bGwgcmV2ZXJzYWwvVHJ1ZVVwIGRldGFpbCkgYW5kIENvbnNvbGlkYXRlZCAgKGNvbGxhcHNlcyBzeXN0ZW0tZ2VuZXJhdGVkIHplcm8tbmV0IHJldmVyc2FsL1RydWVVcCBwYWlycyBpbnRvIFN5c3RlbUNvcnJlY3Rpb24gcm93cykuIEJhc2UgIGN1cnJlbmN5IGNvbHVtbnMgYXJlIG91dCBvZiBzY29wZSBmb3IgdGhpcyB2YXJpYW50IGFuZCBhcmUgbm90IHJldHVybmVkLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBxdWVyeUNhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5KHJlcXVlc3RQYXJhbWV0ZXJzPzogUXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeVJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnYm9keScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mRnVuZENhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5PjtcbiAgICBwdWJsaWMgcXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeShyZXF1ZXN0UGFyYW1ldGVycz86IFF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3lSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludFJlc291cmNlTGlzdE9mRnVuZENhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5Pj47XG4gICAgcHVibGljIHF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3kocmVxdWVzdFBhcmFtZXRlcnM/OiBRdWVyeUNhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kQ2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3k+PjtcbiAgICBwdWJsaWMgcXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeShyZXF1ZXN0UGFyYW1ldGVycz86IFF1ZXJ5Q2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3lSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlOiBhbnkgPSAnYm9keScsIHJlcG9ydFByb2dyZXNzOiBib29sZWFuID0gZmFsc2UsIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIGNvbnN0IHNjb3BlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnNjb3BlO1xuICAgICAgICBpZiAoc2NvcGUgPT09IG51bGwgfHwgc2NvcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgc2NvcGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyBxdWVyeUNhc2hTdGF0ZW1lbnRMb2NhbEN1cnJlbmN5LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5xdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycztcbiAgICAgICAgaWYgKHF1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzID09PSBudWxsIHx8IHF1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHF1ZXJ5RnVuZENhc2hTdGF0ZW1lbnRQYXJhbWV0ZXJzIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcXVlcnlDYXNoU3RhdGVtZW50TG9jYWxDdXJyZW5jeS4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhc0F0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmFzQXQ7XG4gICAgICAgIGNvbnN0IGZpbHRlciA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5maWx0ZXI7XG4gICAgICAgIGNvbnN0IGxpbWl0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LmxpbWl0O1xuICAgICAgICBjb25zdCBwYWdlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnBhZ2U7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5S2V5cyA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5wcm9wZXJ0eUtleXM7XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKGFzQXQgIT09IHVuZGVmaW5lZCAmJiBhc0F0ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+YXNBdCwgJ2FzQXQnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZmlsdGVyICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+ZmlsdGVyLCAnZmlsdGVyJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxpbWl0ICE9PSB1bmRlZmluZWQgJiYgbGltaXQgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5saW1pdCwgJ2xpbWl0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UgIT09IHVuZGVmaW5lZCAmJiBwYWdlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+cGFnZSwgJ3BhZ2UnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvcGVydHlLZXlzKSB7XG4gICAgICAgICAgICBwcm9wZXJ0eUtleXMuZm9yRWFjaCgoZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgICA8YW55PmVsZW1lbnQsICdwcm9wZXJ0eUtleXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvY2FzaHN0YXRlbWVudGxvY2FsY3VycmVuY3kvJHF1ZXJ5YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PFZhbHVhdGlvblBvaW50UmVzb3VyY2VMaXN0T2ZGdW5kQ2FzaFN0YXRlbWVudExvY2FsQ3VycmVuY3k+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiBxdWVyeUZ1bmRDYXNoU3RhdGVtZW50UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gUmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlOiBSZXZlcnRzIGEgRmluYWwgVmFsdWF0aW9uIFBvaW50IHRvIEVzdGltYXRlLlxuICAgICAqIE1vdmVzIGEgXFwmIzM5O0ZpbmFsXFwmIzM5OyBzdGF0dXMgVmFsdWF0aW9uIFBvaW50IHRvIHN0YXR1cyBcXCYjMzk7RXN0aW1hdGVcXCYjMzk7LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyByZXZlcnRWYWx1YXRpb25Qb2ludFRvRXN0aW1hdGUocmVxdWVzdFBhcmFtZXRlcnM/OiBSZXZlcnRWYWx1YXRpb25Qb2ludFRvRXN0aW1hdGVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8VmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2U+O1xuICAgIHB1YmxpYyByZXZlcnRWYWx1YXRpb25Qb2ludFRvRXN0aW1hdGUocmVxdWVzdFBhcmFtZXRlcnM/OiBSZXZlcnRWYWx1YXRpb25Qb2ludFRvRXN0aW1hdGVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxWYWx1YXRpb25Qb2ludERhdGFSZXNwb25zZT4+O1xuICAgIHB1YmxpYyByZXZlcnRWYWx1YXRpb25Qb2ludFRvRXN0aW1hdGUocmVxdWVzdFBhcmFtZXRlcnM/OiBSZXZlcnRWYWx1YXRpb25Qb2ludFRvRXN0aW1hdGVSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2U+PjtcbiAgICBwdWJsaWMgcmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlKHJlcXVlc3RQYXJhbWV0ZXJzPzogUmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJldmVydFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgPSByZXF1ZXN0UGFyYW1ldGVycz8ucmV2ZXJ0VmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdDtcbiAgICAgICAgaWYgKHJldmVydFZhbHVhdGlvblBvaW50RGF0YVJlcXVlc3QgPT09IG51bGwgfHwgcmV2ZXJ0VmFsdWF0aW9uUG9pbnREYXRhUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciByZXZlcnRWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgcmV2ZXJ0VmFsdWF0aW9uUG9pbnRUb0VzdGltYXRlLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuXG4gICAgICAgIGxldCBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IG5ldyBIdHRwUGFyYW1zKHtlbmNvZGVyOiB0aGlzLmVuY29kZXJ9KTtcbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIZWFkZXJzID0gdGhpcy5kZWZhdWx0SGVhZGVycztcblxuICAgICAgICBsZXQgbG9jYWxWYXJDcmVkZW50aWFsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIC8vIGF1dGhlbnRpY2F0aW9uIChvYXV0aDIpIHJlcXVpcmVkXG4gICAgICAgIGxvY2FsVmFyQ3JlZGVudGlhbCA9IHRoaXMuY29uZmlndXJhdGlvbi5sb29rdXBDcmVkZW50aWFsKCdvYXV0aDInKTtcbiAgICAgICAgaWYgKGxvY2FsVmFyQ3JlZGVudGlhbCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQXV0aG9yaXphdGlvbicsICdCZWFyZXIgJyArIGxvY2FsVmFyQ3JlZGVudGlhbCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5odHRwSGVhZGVyQWNjZXB0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBBY2NlcHQgaGVhZGVyXG4gICAgICAgICAgICBjb25zdCBodHRwSGVhZGVyQWNjZXB0czogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAgICAgJ3RleHQvcGxhaW4nLFxuICAgICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAndGV4dC9qc29uJ1xuICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckFjY2VwdChodHRwSGVhZGVyQWNjZXB0cyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0FjY2VwdCcsIGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBDb250ZXh0OiBIdHRwQ29udGV4dCB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5jb250ZXh0O1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwQ29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBDb250ZXh0ID0gbmV3IEh0dHBDb250ZXh0KCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJUcmFuc2ZlckNhY2hlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLnRyYW5zZmVyQ2FjaGU7XG4gICAgICAgIGlmIChsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJUcmFuc2ZlckNhY2hlID0gdHJ1ZTtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gdG8gZGV0ZXJtaW5lIHRoZSBDb250ZW50LVR5cGUgaGVhZGVyXG4gICAgICAgIGNvbnN0IGNvbnN1bWVzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uLXBhdGNoK2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgJ3RleHQvanNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vKitqc29uJ1xuICAgICAgICBdO1xuICAgICAgICBjb25zdCBodHRwQ29udGVudFR5cGVTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gdGhpcy5jb25maWd1cmF0aW9uLnNlbGVjdEhlYWRlckNvbnRlbnRUeXBlKGNvbnN1bWVzKTtcbiAgICAgICAgaWYgKGh0dHBDb250ZW50VHlwZVNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0NvbnRlbnQtVHlwZScsIGh0dHBDb250ZW50VHlwZVNlbGVjdGVkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXNwb25zZVR5cGVfOiAndGV4dCcgfCAnanNvbicgfCAnYmxvYicgPSAnanNvbic7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkge1xuICAgICAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkLnN0YXJ0c1dpdGgoJ3RleHQnKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAndGV4dCc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuY29uZmlndXJhdGlvbi5pc0pzb25NaW1lKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSkge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnanNvbic7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZV8gPSAnYmxvYic7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJQYXRoID0gYC9hcGkvZnVuZHMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwic2NvcGVcIiwgdmFsdWU6IHNjb3BlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJjb2RlXCIsIHZhbHVlOiBjb2RlLCBpbjogXCJwYXRoXCIsIHN0eWxlOiBcInNpbXBsZVwiLCBleHBsb2RlOiBmYWxzZSwgZGF0YVR5cGU6IFwic3RyaW5nXCIsIGRhdGFGb3JtYXQ6IHVuZGVmaW5lZH0pfS92YWx1YXRpb25wb2ludHMvJHJldmVydHRvZXN0aW1hdGVgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8VmFsdWF0aW9uUG9pbnREYXRhUmVzcG9uc2U+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiByZXZlcnRWYWx1YXRpb25Qb2ludERhdGFSZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBTZXRTaGFyZUNsYXNzSW5zdHJ1bWVudHM6IFNldCB0aGUgU2hhcmVDbGFzcyBJbnN0cnVtZW50cyBvbiBhIEZ1bmQuXG4gICAgICogVXBkYXRlIHRoZSBTaGFyZUNsYXNzIEluc3RydW1lbnRzIG9uIGFuIGV4aXN0aW5nIEZ1bmQgd2l0aCB0aGUgc2V0IG9mIGluc3RydW1lbnRzIHByb3ZpZGVkLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRTaGFyZUNsYXNzSW5zdHJ1bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBTZXRTaGFyZUNsYXNzSW5zdHJ1bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RnVuZD47XG4gICAgcHVibGljIHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IFNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZ1bmQ+PjtcbiAgICBwdWJsaWMgc2V0U2hhcmVDbGFzc0luc3RydW1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogU2V0U2hhcmVDbGFzc0luc3RydW1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdldmVudHMnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cEV2ZW50PEZ1bmQ+PjtcbiAgICBwdWJsaWMgc2V0U2hhcmVDbGFzc0luc3RydW1lbnRzKHJlcXVlc3RQYXJhbWV0ZXJzPzogU2V0U2hhcmVDbGFzc0luc3RydW1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgc2V0U2hhcmVDbGFzc0luc3RydW1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgc2V0U2hhcmVDbGFzc0luc3RydW1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3QgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2V0U2hhcmVDbGFzc0luc3RydW1lbnRzUmVxdWVzdDtcbiAgICAgICAgaWYgKHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3QgPT09IG51bGwgfHwgc2V0U2hhcmVDbGFzc0luc3RydW1lbnRzUmVxdWVzdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzZXRTaGFyZUNsYXNzSW5zdHJ1bWVudHNSZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgc2V0U2hhcmVDbGFzc0luc3RydW1lbnRzLicpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vc2hhcmVjbGFzc2VzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZ1bmQ+KCdwdXQnLCBgJHt0aGlzLmNvbmZpZ3VyYXRpb24uYmFzZVBhdGh9JHtsb2NhbFZhclBhdGh9YCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiBsb2NhbFZhckh0dHBDb250ZXh0LFxuICAgICAgICAgICAgICAgIGJvZHk6IHNldFNoYXJlQ2xhc3NJbnN0cnVtZW50c1JlcXVlc3QsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBVcGRhdGVWYWx1YXRpb25Qb2ludDogVXBkYXRlIGEgVmFsdWF0aW9uIFBvaW50LlxuICAgICAqIFVwZGF0ZXMgYW4gZXhpc3RpbmcgVmFsdWF0aW9uIFBvaW50LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cGRhdGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IFVwZGF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPFZhbHVhdGlvblBvaW50PjtcbiAgICBwdWJsaWMgdXBkYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBVcGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPFZhbHVhdGlvblBvaW50Pj47XG4gICAgcHVibGljIHVwZGF0ZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8VmFsdWF0aW9uUG9pbnQ+PjtcbiAgICBwdWJsaWMgdXBkYXRlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBVcGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwZGF0ZVZhbHVhdGlvblBvaW50LicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnVwZGF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdDtcbiAgICAgICAgaWYgKHVwZGF0ZVZhbHVhdGlvblBvaW50UmVxdWVzdCA9PT0gbnVsbCB8fCB1cGRhdGVWYWx1YXRpb25Qb2ludFJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdXBkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBkYXRlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2VHlwZUNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2VHlwZUNvZGU7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAobmF2VHlwZUNvZGUgIT09IHVuZGVmaW5lZCAmJiBuYXZUeXBlQ29kZSAhPT0gbnVsbCkge1xuICAgICAgICAgIGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gdGhpcy5hZGRUb0h0dHBQYXJhbXMobG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICA8YW55Pm5hdlR5cGVDb2RlLCAnbmF2VHlwZUNvZGUnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L3ZhbHVhdGlvbnBvaW50c2A7XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdDxWYWx1YXRpb25Qb2ludD4oJ3B1dCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdXBkYXRlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBVcHNlcnRCb29rbWFyazogVXBzZXJ0IGEgYm9va21hcmsuXG4gICAgICogVGhpcyBtZXRob2Qgd2lsbCB1cGRhdGUgb3IgdXBzZXJ0IGEgQm9va21hcmsgZm9yIHRoZSBGdW5kLlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cHNlcnRCb29rbWFyayhyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydEJvb2ttYXJrUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZ1bmRDYWxlbmRhckVudHJ5PjtcbiAgICBwdWJsaWMgdXBzZXJ0Qm9va21hcmsocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnRCb29rbWFya1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZ1bmRDYWxlbmRhckVudHJ5Pj47XG4gICAgcHVibGljIHVwc2VydEJvb2ttYXJrKHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0Qm9va21hcmtSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RnVuZENhbGVuZGFyRW50cnk+PjtcbiAgICBwdWJsaWMgdXBzZXJ0Qm9va21hcmsocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnRCb29rbWFya1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydEJvb2ttYXJrLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBzZXJ0Qm9va21hcmsuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBzZXJ0RnVuZEJvb2ttYXJrUmVxdWVzdCA9IHJlcXVlc3RQYXJhbWV0ZXJzPy51cHNlcnRGdW5kQm9va21hcmtSZXF1ZXN0O1xuICAgICAgICBpZiAodXBzZXJ0RnVuZEJvb2ttYXJrUmVxdWVzdCA9PT0gbnVsbCB8fCB1cHNlcnRGdW5kQm9va21hcmtSZXF1ZXN0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHVwc2VydEZ1bmRCb29rbWFya1JlcXVlc3Qgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cHNlcnRCb29rbWFyay4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vYm9va21hcmtzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZ1bmRDYWxlbmRhckVudHJ5PigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogdXBzZXJ0RnVuZEJvb2ttYXJrUmVxdWVzdCxcbiAgICAgICAgICAgICAgICBwYXJhbXM6IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogPGFueT5yZXNwb25zZVR5cGVfLFxuICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWd1cmF0aW9uLndpdGhDcmVkZW50aWFscyxcbiAgICAgICAgICAgICAgICBoZWFkZXJzOiBsb2NhbFZhckhlYWRlcnMsXG4gICAgICAgICAgICAgICAgb2JzZXJ2ZTogb2JzZXJ2ZSxcbiAgICAgICAgICAgICAgICB0cmFuc2ZlckNhY2hlOiBsb2NhbFZhclRyYW5zZmVyQ2FjaGUsXG4gICAgICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IHJlcG9ydFByb2dyZXNzXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogW0VBUkxZIEFDQ0VTU10gVXBzZXJ0RGlhcnlFbnRyeVR5cGVWYWx1YXRpb25Qb2ludDogVXBzZXJ0IGEgVmFsdWF0aW9uIFBvaW50LlxuICAgICAqIEluc2VydCB0aGUgZXN0aW1hdGUgVmFsdWF0aW9uIFBvaW50LiAgICAgICAgICAgICAgICBJZiB0aGUgVmFsdWF0aW9uIFBvaW50IGRvZXMgbm90IGV4aXN0LCB0aGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBpdCBpbiBlc3RpbWF0ZSBzdGF0ZS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBzZXJ0RGlhcnlFbnRyeVR5cGVWYWx1YXRpb25Qb2ludChyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydERpYXJ5RW50cnlUeXBlVmFsdWF0aW9uUG9pbnRSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RGlhcnlFbnRyeT47XG4gICAgcHVibGljIHVwc2VydERpYXJ5RW50cnlUeXBlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnREaWFyeUVudHJ5VHlwZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RGlhcnlFbnRyeT4+O1xuICAgIHB1YmxpYyB1cHNlcnREaWFyeUVudHJ5VHlwZVZhbHVhdGlvblBvaW50KHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0RGlhcnlFbnRyeVR5cGVWYWx1YXRpb25Qb2ludFJlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxEaWFyeUVudHJ5Pj47XG4gICAgcHVibGljIHVwc2VydERpYXJ5RW50cnlUeXBlVmFsdWF0aW9uUG9pbnQocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnREaWFyeUVudHJ5VHlwZVZhbHVhdGlvblBvaW50UmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBzZXJ0RGlhcnlFbnRyeVR5cGVWYWx1YXRpb25Qb2ludC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydERpYXJ5RW50cnlUeXBlVmFsdWF0aW9uUG9pbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdXBzZXJ0VmFsdWF0aW9uUG9pbnRSZXF1ZXN0ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnVwc2VydFZhbHVhdGlvblBvaW50UmVxdWVzdDtcbiAgICAgICAgaWYgKHVwc2VydFZhbHVhdGlvblBvaW50UmVxdWVzdCA9PT0gbnVsbCB8fCB1cHNlcnRWYWx1YXRpb25Qb2ludFJlcXVlc3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdXBzZXJ0VmFsdWF0aW9uUG9pbnRSZXF1ZXN0IHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBzZXJ0RGlhcnlFbnRyeVR5cGVWYWx1YXRpb25Qb2ludC4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZUeXBlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5uYXZUeXBlQ29kZTtcblxuICAgICAgICBsZXQgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSBuZXcgSHR0cFBhcmFtcyh7ZW5jb2RlcjogdGhpcy5lbmNvZGVyfSk7XG4gICAgICAgIGlmIChuYXZUeXBlQ29kZSAhPT0gdW5kZWZpbmVkICYmIG5hdlR5cGVDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+bmF2VHlwZUNvZGUsICduYXZUeXBlQ29kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vdmFsdWF0aW9ucG9pbnRzYDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PERpYXJ5RW50cnk+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiB1cHNlcnRWYWx1YXRpb25Qb2ludFJlcXVlc3QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIFVwc2VydEZlZVByb3BlcnRpZXM6IFVwc2VydCBGZWUgcHJvcGVydGllcy5cbiAgICAgKiBVcGRhdGUgb3IgaW5zZXJ0IG9uZSBvciBtb3JlIHByb3BlcnRpZXMgb250byBhIHNpbmdsZSBGZWUuIEEgcHJvcGVydHkgd2lsbCBiZSB1cGRhdGVkIGlmIGl0ICBhbHJlYWR5IGV4aXN0cyBhbmQgaW5zZXJ0ZWQgaWYgaXQgZG9lcyBub3QuIEFsbCBwcm9wZXJ0aWVzIG11c3QgYmUgb2YgdGhlIGRvbWFpbiBcXCYjMzk7RmVlXFwmIzM5Oy4gICAgICAgICAgICAgICAgVXBzZXJ0aW5nIGEgcHJvcGVydHkgdGhhdCBleGlzdHMgZm9yIGFuIEZlZSwgd2l0aCBhIG51bGwgdmFsdWUsIHdpbGwgZGVsZXRlIHRoZSBpbnN0YW5jZSBvZiB0aGUgcHJvcGVydHkgZm9yIHRoYXQgZ3JvdXAuICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgaGF2ZSBhbiAmbHQ7aSZndDtlZmZlY3RpdmVGcm9tJmx0Oy9pJmd0OyBkYXRldGltZSBmb3Igd2hpY2ggdGhlIHByb3BlcnR5IGlzIHZhbGlkLCBhbmQgYW4gJmx0O2kmZ3Q7ZWZmZWN0aXZlVW50aWwmbHQ7L2kmZ3Q7ICBkYXRldGltZSB1bnRpbCB3aGljaCB0aGUgcHJvcGVydHkgaXMgdmFsaWQuIE5vdCBzdXBwbHlpbmcgYW4gJmx0O2kmZ3Q7ZWZmZWN0aXZlVW50aWwmbHQ7L2kmZ3Q7IGRhdGV0aW1lIHJlc3VsdHMgaW4gdGhlIHByb3BlcnR5IGJlaW5nICB2YWxpZCBpbmRlZmluaXRlbHksIG9yIHVudGlsIHRoZSBuZXh0ICZsdDtpJmd0O2VmZmVjdGl2ZUZyb20mbHQ7L2kmZ3Q7IGRhdGV0aW1lIG9mIHRoZSBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBzZXJ0RmVlUHJvcGVydGllcyhyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydEZlZVByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8RmVlUHJvcGVydGllcz47XG4gICAgcHVibGljIHVwc2VydEZlZVByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnRGZWVQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdyZXNwb25zZScsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwUmVzcG9uc2U8RmVlUHJvcGVydGllcz4+O1xuICAgIHB1YmxpYyB1cHNlcnRGZWVQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0RmVlUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAnZXZlbnRzJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxGZWVQcm9wZXJ0aWVzPj47XG4gICAgcHVibGljIHVwc2VydEZlZVByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnRGZWVQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBzZXJ0RmVlUHJvcGVydGllcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydEZlZVByb3BlcnRpZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZmVlQ29kZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5mZWVDb2RlO1xuICAgICAgICBpZiAoZmVlQ29kZSA9PT0gbnVsbCB8fCBmZWVDb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIGZlZUNvZGUgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cHNlcnRGZWVQcm9wZXJ0aWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlcXVlc3RCb2R5ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnJlcXVlc3RCb2R5O1xuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L2ZlZXMvJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiZmVlQ29kZVwiLCB2YWx1ZTogZmVlQ29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vcHJvcGVydGllcy8kdXBzZXJ0YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZlZVByb3BlcnRpZXM+KCdwb3N0JywgYCR7dGhpcy5jb25maWd1cmF0aW9uLmJhc2VQYXRofSR7bG9jYWxWYXJQYXRofWAsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29udGV4dDogbG9jYWxWYXJIdHRwQ29udGV4dCxcbiAgICAgICAgICAgICAgICBib2R5OiByZXF1ZXN0Qm9keSxcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGU6IDxhbnk+cmVzcG9uc2VUeXBlXyxcbiAgICAgICAgICAgICAgICB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlndXJhdGlvbi53aXRoQ3JlZGVudGlhbHMsXG4gICAgICAgICAgICAgICAgaGVhZGVyczogbG9jYWxWYXJIZWFkZXJzLFxuICAgICAgICAgICAgICAgIG9ic2VydmU6IG9ic2VydmUsXG4gICAgICAgICAgICAgICAgdHJhbnNmZXJDYWNoZTogbG9jYWxWYXJUcmFuc2ZlckNhY2hlLFxuICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiByZXBvcnRQcm9ncmVzc1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtFQVJMWSBBQ0NFU1NdIFVwc2VydEZ1bmRQcm9wZXJ0aWVzOiBVcHNlcnQgRnVuZCBwcm9wZXJ0aWVzLlxuICAgICAqIFVwZGF0ZSBvciBpbnNlcnQgb25lIG9yIG1vcmUgcHJvcGVydGllcyBvbnRvIGEgc2luZ2xlIEZ1bmQuIEEgcHJvcGVydHkgd2lsbCBiZSB1cGRhdGVkIGlmIGl0ICBhbHJlYWR5IGV4aXN0cyBhbmQgaW5zZXJ0ZWQgaWYgaXQgZG9lcyBub3QuIEFsbCBwcm9wZXJ0aWVzIG11c3QgYmUgb2YgdGhlIGRvbWFpbiBcXCYjMzk7RnVuZFxcJiMzOTsuICAgICAgICAgICAgICAgIFVwc2VydGluZyBhIHByb3BlcnR5IHRoYXQgZXhpc3RzIGZvciBhbiBGdW5kLCB3aXRoIGEgbnVsbCB2YWx1ZSwgd2lsbCBkZWxldGUgdGhlIGluc3RhbmNlIG9mIHRoZSBwcm9wZXJ0eSBmb3IgdGhhdCBncm91cC4gICAgICAgICAgICAgICAgUHJvcGVydGllcyBoYXZlIGFuICZsdDtpJmd0O2VmZmVjdGl2ZUZyb20mbHQ7L2kmZ3Q7IGRhdGV0aW1lIGZvciB3aGljaCB0aGUgcHJvcGVydHkgaXMgdmFsaWQsIGFuZCBhbiAmbHQ7aSZndDtlZmZlY3RpdmVVbnRpbCZsdDsvaSZndDsgIGRhdGV0aW1lIHVudGlsIHdoaWNoIHRoZSBwcm9wZXJ0eSBpcyB2YWxpZC4gTm90IHN1cHBseWluZyBhbiAmbHQ7aSZndDtlZmZlY3RpdmVVbnRpbCZsdDsvaSZndDsgZGF0ZXRpbWUgcmVzdWx0cyBpbiB0aGUgcHJvcGVydHkgYmVpbmcgIHZhbGlkIGluZGVmaW5pdGVseSwgb3IgdW50aWwgdGhlIG5leHQgJmx0O2kmZ3Q7ZWZmZWN0aXZlRnJvbSZsdDsvaSZndDsgZGF0ZXRpbWUgb2YgdGhlIHByb3BlcnR5LlxuICAgICAqIEBwYXJhbSByZXF1ZXN0UGFyYW1ldGVyc1xuICAgICAqIEBwYXJhbSBvYnNlcnZlIHNldCB3aGV0aGVyIG9yIG5vdCB0byByZXR1cm4gdGhlIGRhdGEgT2JzZXJ2YWJsZSBhcyB0aGUgYm9keSwgcmVzcG9uc2Ugb3IgZXZlbnRzLiBkZWZhdWx0cyB0byByZXR1cm5pbmcgdGhlIGJvZHkuXG4gICAgICogQHBhcmFtIHJlcG9ydFByb2dyZXNzIGZsYWcgdG8gcmVwb3J0IHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2dyZXNzLlxuICAgICAqL1xuICAgIHB1YmxpYyB1cHNlcnRGdW5kUHJvcGVydGllcyhyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydEZ1bmRQcm9wZXJ0aWVzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZT86ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEZ1bmRQcm9wZXJ0aWVzPjtcbiAgICBwdWJsaWMgdXBzZXJ0RnVuZFByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnRGdW5kUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU/OiAncmVzcG9uc2UnLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8SHR0cFJlc3BvbnNlPEZ1bmRQcm9wZXJ0aWVzPj47XG4gICAgcHVibGljIHVwc2VydEZ1bmRQcm9wZXJ0aWVzKHJlcXVlc3RQYXJhbWV0ZXJzPzogVXBzZXJ0RnVuZFByb3BlcnRpZXNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8RnVuZFByb3BlcnRpZXM+PjtcbiAgICBwdWJsaWMgdXBzZXJ0RnVuZFByb3BlcnRpZXMocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnRGdW5kUHJvcGVydGllc1JlcXVlc3RQYXJhbXMsIG9ic2VydmU6IGFueSA9ICdib2R5JywgcmVwb3J0UHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZSwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgY29uc3Qgc2NvcGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uc2NvcGU7XG4gICAgICAgIGlmIChzY29wZSA9PT0gbnVsbCB8fCBzY29wZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBzY29wZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydEZ1bmRQcm9wZXJ0aWVzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvZGUgPSByZXF1ZXN0UGFyYW1ldGVycz8uY29kZTtcbiAgICAgICAgaWYgKGNvZGUgPT09IG51bGwgfHwgY29kZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBjb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBzZXJ0RnVuZFByb3BlcnRpZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmVxdWVzdEJvZHkgPSByZXF1ZXN0UGFyYW1ldGVycz8ucmVxdWVzdEJvZHk7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySGVhZGVycyA9IHRoaXMuZGVmYXVsdEhlYWRlcnM7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyQ3JlZGVudGlhbDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgICAvLyBhdXRoZW50aWNhdGlvbiAob2F1dGgyKSByZXF1aXJlZFxuICAgICAgICBsb2NhbFZhckNyZWRlbnRpYWwgPSB0aGlzLmNvbmZpZ3VyYXRpb24ubG9va3VwQ3JlZGVudGlhbCgnb2F1dGgyJyk7XG4gICAgICAgIGlmIChsb2NhbFZhckNyZWRlbnRpYWwpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySGVhZGVycyA9IGxvY2FsVmFySGVhZGVycy5zZXQoJ0F1dGhvcml6YXRpb24nLCAnQmVhcmVyICcgKyBsb2NhbFZhckNyZWRlbnRpYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuaHR0cEhlYWRlckFjY2VwdDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQWNjZXB0IGhlYWRlclxuICAgICAgICAgICAgY29uc3QgaHR0cEhlYWRlckFjY2VwdHM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgICAgICd0ZXh0L3BsYWluJyxcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgJ3RleHQvanNvbidcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgICBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJBY2NlcHQoaHR0cEhlYWRlckFjY2VwdHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBY2NlcHQnLCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbG9jYWxWYXJIdHRwQ29udGV4dDogSHR0cENvbnRleHQgfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMuY29udGV4dDtcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cENvbnRleHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwQ29udGV4dCA9IG5ldyBIdHRwQ29udGV4dCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyVHJhbnNmZXJDYWNoZTogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IG9wdGlvbnMgJiYgb3B0aW9ucy50cmFuc2ZlckNhY2hlO1xuICAgICAgICBpZiAobG9jYWxWYXJUcmFuc2ZlckNhY2hlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9IHRydWU7XG4gICAgICAgIH1cblxuXG4gICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgQ29udGVudC1UeXBlIGhlYWRlclxuICAgICAgICBjb25zdCBjb25zdW1lczogc3RyaW5nW10gPSBbXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbi1wYXRjaCtqc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICd0ZXh0L2pzb24nLFxuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uLyoranNvbidcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3QgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQ6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHRoaXMuY29uZmlndXJhdGlvbi5zZWxlY3RIZWFkZXJDb250ZW50VHlwZShjb25zdW1lcyk7XG4gICAgICAgIGlmIChodHRwQ29udGVudFR5cGVTZWxlY3RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdDb250ZW50LVR5cGUnLCBodHRwQ29udGVudFR5cGVTZWxlY3RlZCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzcG9uc2VUeXBlXzogJ3RleHQnIHwgJ2pzb24nIHwgJ2Jsb2InID0gJ2pzb24nO1xuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpIHtcbiAgICAgICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZC5zdGFydHNXaXRoKCd0ZXh0JykpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ3RleHQnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbmZpZ3VyYXRpb24uaXNKc29uTWltZShsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCkpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2pzb24nO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVR5cGVfID0gJ2Jsb2InO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUGF0aCA9IGAvYXBpL2Z1bmRzLyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcInNjb3BlXCIsIHZhbHVlOiBzY29wZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vJHt0aGlzLmNvbmZpZ3VyYXRpb24uZW5jb2RlUGFyYW0oe25hbWU6IFwiY29kZVwiLCB2YWx1ZTogY29kZSwgaW46IFwicGF0aFwiLCBzdHlsZTogXCJzaW1wbGVcIiwgZXhwbG9kZTogZmFsc2UsIGRhdGFUeXBlOiBcInN0cmluZ1wiLCBkYXRhRm9ybWF0OiB1bmRlZmluZWR9KX0vcHJvcGVydGllcy8kdXBzZXJ0YDtcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5yZXF1ZXN0PEZ1bmRQcm9wZXJ0aWVzPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogcmVxdWVzdEJvZHksXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbRUFSTFkgQUNDRVNTXSBVcHNlcnROYXZBY3Rpdml0eUFkanVzdG1lbnRzOiBVcHNlcnQgTkFWIGFkanVzdG1lbnQgYWN0aXZpdGllcyB0byBhIHZhbHVhdGlvbiBwb2ludFxuICAgICAqIFVwc2VydHMgdGhlIE5BViBhZGp1c3RtZW50IGFjdGl2aXRpZXMgdG8gdGhlIHNwZWNpZmllZCB2YWx1YXRpb24gcG9pbnQgZm9yIGEgRnVuZC5cbiAgICAgKiBAcGFyYW0gcmVxdWVzdFBhcmFtZXRlcnNcbiAgICAgKiBAcGFyYW0gb2JzZXJ2ZSBzZXQgd2hldGhlciBvciBub3QgdG8gcmV0dXJuIHRoZSBkYXRhIE9ic2VydmFibGUgYXMgdGhlIGJvZHksIHJlc3BvbnNlIG9yIGV2ZW50cy4gZGVmYXVsdHMgdG8gcmV0dXJuaW5nIHRoZSBib2R5LlxuICAgICAqIEBwYXJhbSByZXBvcnRQcm9ncmVzcyBmbGFnIHRvIHJlcG9ydCByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9ncmVzcy5cbiAgICAgKi9cbiAgICBwdWJsaWMgdXBzZXJ0TmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2JvZHknLCByZXBvcnRQcm9ncmVzcz86IGJvb2xlYW4sIG9wdGlvbnM/OiB7aHR0cEhlYWRlckFjY2VwdD86ICd0ZXh0L3BsYWluJyB8ICdhcHBsaWNhdGlvbi9qc29uJyB8ICd0ZXh0L2pzb24nLCBjb250ZXh0PzogSHR0cENvbnRleHQsIHRyYW5zZmVyQ2FjaGU/OiBib29sZWFufSk6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBwdWJsaWMgdXBzZXJ0TmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ3Jlc3BvbnNlJywgcmVwb3J0UHJvZ3Jlc3M/OiBib29sZWFuLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPEh0dHBSZXNwb25zZTxzdHJpbmc+PjtcbiAgICBwdWJsaWMgdXBzZXJ0TmF2QWN0aXZpdHlBZGp1c3RtZW50cyhyZXF1ZXN0UGFyYW1ldGVycz86IFVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHNSZXF1ZXN0UGFyYW1zLCBvYnNlcnZlPzogJ2V2ZW50cycsIHJlcG9ydFByb2dyZXNzPzogYm9vbGVhbiwgb3B0aW9ucz86IHtodHRwSGVhZGVyQWNjZXB0PzogJ3RleHQvcGxhaW4nIHwgJ2FwcGxpY2F0aW9uL2pzb24nIHwgJ3RleHQvanNvbicsIGNvbnRleHQ/OiBIdHRwQ29udGV4dCwgdHJhbnNmZXJDYWNoZT86IGJvb2xlYW59KTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8c3RyaW5nPj47XG4gICAgcHVibGljIHVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHMocmVxdWVzdFBhcmFtZXRlcnM/OiBVcHNlcnROYXZBY3Rpdml0eUFkanVzdG1lbnRzUmVxdWVzdFBhcmFtcywgb2JzZXJ2ZTogYW55ID0gJ2JvZHknLCByZXBvcnRQcm9ncmVzczogYm9vbGVhbiA9IGZhbHNlLCBvcHRpb25zPzoge2h0dHBIZWFkZXJBY2NlcHQ/OiAndGV4dC9wbGFpbicgfCAnYXBwbGljYXRpb24vanNvbicgfCAndGV4dC9qc29uJywgY29udGV4dD86IEh0dHBDb250ZXh0LCB0cmFuc2ZlckNhY2hlPzogYm9vbGVhbn0pOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgICAgICBjb25zdCBzY29wZSA9IHJlcXVlc3RQYXJhbWV0ZXJzPy5zY29wZTtcbiAgICAgICAgaWYgKHNjb3BlID09PSBudWxsIHx8IHNjb3BlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVxdWlyZWQgcGFyYW1ldGVyIHNjb3BlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBzZXJ0TmF2QWN0aXZpdHlBZGp1c3RtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LmNvZGU7XG4gICAgICAgIGlmIChjb2RlID09PSBudWxsIHx8IGNvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgY29kZSB3YXMgbnVsbCBvciB1bmRlZmluZWQgd2hlbiBjYWxsaW5nIHVwc2VydE5hdkFjdGl2aXR5QWRqdXN0bWVudHMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdmFsdWF0aW9uUG9pbnRDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50Q29kZTtcbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZSA9PT0gbnVsbCB8fCB2YWx1YXRpb25Qb2ludENvZGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1aXJlZCBwYXJhbWV0ZXIgdmFsdWF0aW9uUG9pbnRDb2RlIHdhcyBudWxsIG9yIHVuZGVmaW5lZCB3aGVuIGNhbGxpbmcgdXBzZXJ0TmF2QWN0aXZpdHlBZGp1c3RtZW50cy4nKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuYXZBY3Rpdml0eUFkanVzdG1lbnQgPSByZXF1ZXN0UGFyYW1ldGVycz8ubmF2QWN0aXZpdHlBZGp1c3RtZW50O1xuICAgICAgICBpZiAobmF2QWN0aXZpdHlBZGp1c3RtZW50ID09PSBudWxsIHx8IG5hdkFjdGl2aXR5QWRqdXN0bWVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JlcXVpcmVkIHBhcmFtZXRlciBuYXZBY3Rpdml0eUFkanVzdG1lbnQgd2FzIG51bGwgb3IgdW5kZWZpbmVkIHdoZW4gY2FsbGluZyB1cHNlcnROYXZBY3Rpdml0eUFkanVzdG1lbnRzLicpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5hdlR5cGVDb2RlID0gcmVxdWVzdFBhcmFtZXRlcnM/Lm5hdlR5cGVDb2RlO1xuICAgICAgICBjb25zdCB2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50ID0gcmVxdWVzdFBhcmFtZXRlcnM/LnZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQ7XG5cbiAgICAgICAgbGV0IGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzID0gbmV3IEh0dHBQYXJhbXMoe2VuY29kZXI6IHRoaXMuZW5jb2Rlcn0pO1xuICAgICAgICBpZiAodmFsdWF0aW9uUG9pbnRDb2RlICE9PSB1bmRlZmluZWQgJiYgdmFsdWF0aW9uUG9pbnRDb2RlICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dmFsdWF0aW9uUG9pbnRDb2RlLCAndmFsdWF0aW9uUG9pbnRDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hdlR5cGVDb2RlICE9PSB1bmRlZmluZWQgJiYgbmF2VHlwZUNvZGUgIT09IG51bGwpIHtcbiAgICAgICAgICBsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyA9IHRoaXMuYWRkVG9IdHRwUGFyYW1zKGxvY2FsVmFyUXVlcnlQYXJhbWV0ZXJzLFxuICAgICAgICAgICAgPGFueT5uYXZUeXBlQ29kZSwgJ25hdlR5cGVDb2RlJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQgIT09IHVuZGVmaW5lZCAmJiB2YWx1YXRpb25Qb2ludENvZGVWYXJpYW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMgPSB0aGlzLmFkZFRvSHR0cFBhcmFtcyhsb2NhbFZhclF1ZXJ5UGFyYW1ldGVycyxcbiAgICAgICAgICAgIDxhbnk+dmFsdWF0aW9uUG9pbnRDb2RlVmFyaWFudCwgJ3ZhbHVhdGlvblBvaW50Q29kZVZhcmlhbnQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckhlYWRlcnMgPSB0aGlzLmRlZmF1bHRIZWFkZXJzO1xuXG4gICAgICAgIGxldCBsb2NhbFZhckNyZWRlbnRpYWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgLy8gYXV0aGVudGljYXRpb24gKG9hdXRoMikgcmVxdWlyZWRcbiAgICAgICAgbG9jYWxWYXJDcmVkZW50aWFsID0gdGhpcy5jb25maWd1cmF0aW9uLmxvb2t1cENyZWRlbnRpYWwoJ29hdXRoMicpO1xuICAgICAgICBpZiAobG9jYWxWYXJDcmVkZW50aWFsKSB7XG4gICAgICAgICAgICBsb2NhbFZhckhlYWRlcnMgPSBsb2NhbFZhckhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgbG9jYWxWYXJDcmVkZW50aWFsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZDogc3RyaW5nIHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmh0dHBIZWFkZXJBY2NlcHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBIZWFkZXJBY2NlcHRTZWxlY3RlZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIEFjY2VwdCBoZWFkZXJcbiAgICAgICAgICAgIGNvbnN0IGh0dHBIZWFkZXJBY2NlcHRzOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICAgICAndGV4dC9wbGFpbicsXG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgICd0ZXh0L2pzb24nXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQWNjZXB0KGh0dHBIZWFkZXJBY2NlcHRzKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQWNjZXB0JywgbG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvY2FsVmFySHR0cENvbnRleHQ6IEh0dHBDb250ZXh0IHwgdW5kZWZpbmVkID0gb3B0aW9ucyAmJiBvcHRpb25zLmNvbnRleHQ7XG4gICAgICAgIGlmIChsb2NhbFZhckh0dHBDb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxvY2FsVmFySHR0cENvbnRleHQgPSBuZXcgSHR0cENvbnRleHQoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclRyYW5zZmVyQ2FjaGU6IGJvb2xlYW4gfCB1bmRlZmluZWQgPSBvcHRpb25zICYmIG9wdGlvbnMudHJhbnNmZXJDYWNoZTtcbiAgICAgICAgaWYgKGxvY2FsVmFyVHJhbnNmZXJDYWNoZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2NhbFZhclRyYW5zZmVyQ2FjaGUgPSB0cnVlO1xuICAgICAgICB9XG5cblxuICAgICAgICAvLyB0byBkZXRlcm1pbmUgdGhlIENvbnRlbnQtVHlwZSBoZWFkZXJcbiAgICAgICAgY29uc3QgY29uc3VtZXM6IHN0cmluZ1tdID0gW1xuICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbicsXG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAndGV4dC9qc29uJyxcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi8qK2pzb24nXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IGh0dHBDb250ZW50VHlwZVNlbGVjdGVkOiBzdHJpbmcgfCB1bmRlZmluZWQgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2VsZWN0SGVhZGVyQ29udGVudFR5cGUoY29uc3VtZXMpO1xuICAgICAgICBpZiAoaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbG9jYWxWYXJIZWFkZXJzID0gbG9jYWxWYXJIZWFkZXJzLnNldCgnQ29udGVudC1UeXBlJywgaHR0cENvbnRlbnRUeXBlU2VsZWN0ZWQpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlVHlwZV86ICd0ZXh0JyB8ICdqc29uJyB8ICdibG9iJyA9ICdqc29uJztcbiAgICAgICAgaWYgKGxvY2FsVmFySHR0cEhlYWRlckFjY2VwdFNlbGVjdGVkKSB7XG4gICAgICAgICAgICBpZiAobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQuc3RhcnRzV2l0aCgndGV4dCcpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICd0ZXh0JztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5jb25maWd1cmF0aW9uLmlzSnNvbk1pbWUobG9jYWxWYXJIdHRwSGVhZGVyQWNjZXB0U2VsZWN0ZWQpKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdqc29uJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlXyA9ICdibG9iJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsb2NhbFZhclBhdGggPSBgL2FwaS9mdW5kcy8ke3RoaXMuY29uZmlndXJhdGlvbi5lbmNvZGVQYXJhbSh7bmFtZTogXCJzY29wZVwiLCB2YWx1ZTogc2NvcGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9LyR7dGhpcy5jb25maWd1cmF0aW9uLmVuY29kZVBhcmFtKHtuYW1lOiBcImNvZGVcIiwgdmFsdWU6IGNvZGUsIGluOiBcInBhdGhcIiwgc3R5bGU6IFwic2ltcGxlXCIsIGV4cGxvZGU6IGZhbHNlLCBkYXRhVHlwZTogXCJzdHJpbmdcIiwgZGF0YUZvcm1hdDogdW5kZWZpbmVkfSl9L25hdkFkanVzdG1lbnRgO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnJlcXVlc3Q8c3RyaW5nPigncG9zdCcsIGAke3RoaXMuY29uZmlndXJhdGlvbi5iYXNlUGF0aH0ke2xvY2FsVmFyUGF0aH1gLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IGxvY2FsVmFySHR0cENvbnRleHQsXG4gICAgICAgICAgICAgICAgYm9keTogbmF2QWN0aXZpdHlBZGp1c3RtZW50LFxuICAgICAgICAgICAgICAgIHBhcmFtczogbG9jYWxWYXJRdWVyeVBhcmFtZXRlcnMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiA8YW55PnJlc3BvbnNlVHlwZV8sXG4gICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZ3VyYXRpb24ud2l0aENyZWRlbnRpYWxzLFxuICAgICAgICAgICAgICAgIGhlYWRlcnM6IGxvY2FsVmFySGVhZGVycyxcbiAgICAgICAgICAgICAgICBvYnNlcnZlOiBvYnNlcnZlLFxuICAgICAgICAgICAgICAgIHRyYW5zZmVyQ2FjaGU6IGxvY2FsVmFyVHJhbnNmZXJDYWNoZSxcbiAgICAgICAgICAgICAgICByZXBvcnRQcm9ncmVzczogcmVwb3J0UHJvZ3Jlc3NcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbn1cbiJdfQ==
|