cdk-serverless 3.2.1 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. package/README.md +111 -0
  2. package/docs/constructs/assets/hierarchy.js +1 -1
  3. package/docs/constructs/assets/navigation.js +1 -1
  4. package/docs/constructs/assets/search.js +1 -1
  5. package/docs/constructs/classes/McpAuth.html +43 -0
  6. package/docs/constructs/classes/McpCognitoAuth.html +43 -0
  7. package/docs/constructs/classes/RestApi.html +6 -3
  8. package/docs/constructs/classes/SingleTableDatastore.html +1 -1
  9. package/docs/constructs/classes/Workflow.html +1 -1
  10. package/docs/constructs/hierarchy.html +1 -1
  11. package/docs/constructs/index.html +112 -1
  12. package/docs/constructs/interfaces/McpAuthCognitoOptions.html +17 -0
  13. package/docs/constructs/interfaces/McpAuthFunctions.html +14 -0
  14. package/docs/constructs/interfaces/McpAuthGenericOptions.html +11 -0
  15. package/docs/constructs/interfaces/McpAuthOptions.html +33 -0
  16. package/docs/constructs/interfaces/McpAuthProps.html +43 -0
  17. package/docs/constructs/interfaces/McpCognitoAuthProps.html +49 -0
  18. package/docs/constructs/interfaces/RestApiProps.html +24 -6
  19. package/docs/constructs/modules.html +1 -1
  20. package/docs/lambda/index.html +112 -1
  21. package/docs/projen/index.html +112 -1
  22. package/lib/constructs/index.d.ts +2 -0
  23. package/lib/constructs/index.js +3 -1
  24. package/lib/constructs/mcp-auth.d.ts +117 -0
  25. package/lib/constructs/mcp-auth.js +127 -0
  26. package/lib/constructs/mcp-cognito-auth.d.ts +110 -0
  27. package/lib/constructs/mcp-cognito-auth.js +76 -0
  28. package/lib/constructs/rest-api.d.ts +136 -0
  29. package/lib/constructs/rest-api.js +159 -1
  30. package/lib/mcp-auth/config.d.ts +39 -0
  31. package/lib/mcp-auth/config.js +3 -0
  32. package/lib/mcp-auth/handlers/authorization-server.d.ts +7 -0
  33. package/lib/mcp-auth/handlers/authorization-server.js +34 -0
  34. package/lib/mcp-auth/handlers/authorize.d.ts +8 -0
  35. package/lib/mcp-auth/handlers/authorize.js +32 -0
  36. package/lib/mcp-auth/handlers/index.d.ts +7 -0
  37. package/lib/mcp-auth/handlers/index.js +24 -0
  38. package/lib/mcp-auth/handlers/protected-resource.d.ts +7 -0
  39. package/lib/mcp-auth/handlers/protected-resource.js +26 -0
  40. package/lib/mcp-auth/handlers/register.d.ts +7 -0
  41. package/lib/mcp-auth/handlers/register.js +68 -0
  42. package/lib/mcp-auth/handlers/token.d.ts +8 -0
  43. package/lib/mcp-auth/handlers/token.js +74 -0
  44. package/lib/mcp-auth/handlers/types.d.ts +21 -0
  45. package/lib/mcp-auth/handlers/types.js +3 -0
  46. package/lib/mcp-auth/handlers/validate-redirect-uris.d.ts +10 -0
  47. package/lib/mcp-auth/handlers/validate-redirect-uris.js +22 -0
  48. package/lib/mcp-auth/index.d.ts +3 -0
  49. package/lib/mcp-auth/index.js +20 -0
  50. package/lib/mcp-auth/lambda-handlers/authorization-server.handler.d.ts +2 -0
  51. package/lib/mcp-auth/lambda-handlers/authorization-server.handler.js +23 -0
  52. package/lib/mcp-auth/lambda-handlers/authorize.handler.d.ts +2 -0
  53. package/lib/mcp-auth/lambda-handlers/authorize.handler.js +23 -0
  54. package/lib/mcp-auth/lambda-handlers/env-config.d.ts +7 -0
  55. package/lib/mcp-auth/lambda-handlers/env-config.js +37 -0
  56. package/lib/mcp-auth/lambda-handlers/protected-resource.handler.d.ts +2 -0
  57. package/lib/mcp-auth/lambda-handlers/protected-resource.handler.js +23 -0
  58. package/lib/mcp-auth/lambda-handlers/register.handler.d.ts +2 -0
  59. package/lib/mcp-auth/lambda-handlers/register.handler.js +23 -0
  60. package/lib/mcp-auth/lambda-handlers/token.handler.d.ts +2 -0
  61. package/lib/mcp-auth/lambda-handlers/token.handler.js +23 -0
  62. package/lib/mcp-auth/mcp/errors.d.ts +8 -0
  63. package/lib/mcp-auth/mcp/errors.js +20 -0
  64. package/lib/mcp-auth/mcp/index.d.ts +4 -0
  65. package/lib/mcp-auth/mcp/index.js +21 -0
  66. package/lib/mcp-auth/mcp/jsonrpc.d.ts +21 -0
  67. package/lib/mcp-auth/mcp/jsonrpc.js +56 -0
  68. package/lib/mcp-auth/mcp/server.d.ts +9 -0
  69. package/lib/mcp-auth/mcp/server.js +107 -0
  70. package/lib/mcp-auth/mcp/types.d.ts +32 -0
  71. package/lib/mcp-auth/mcp/types.js +3 -0
  72. package/llm.md +214 -0
  73. package/package.json +1 -1
@@ -40,6 +40,8 @@ const cdk = __importStar(require("aws-cdk-lib"));
40
40
  const yaml = __importStar(require("js-yaml"));
41
41
  const base_api_1 = require("./base-api");
42
42
  const func_1 = require("./func");
43
+ const mcp_auth_1 = require("./mcp-auth");
44
+ const mcp_cognito_auth_1 = require("./mcp-cognito-auth");
43
45
  const outputs_1 = require("../shared/outputs");
44
46
  /**
45
47
  * The RestApi construct sets up an AWS API Gateway REST API using OpenAPI specification.
@@ -229,6 +231,13 @@ class RestApi extends base_api_1.BaseApi {
229
231
  this._anonymousOperations.add(opId);
230
232
  }
231
233
  }
234
+ // Inject MCP auth paths into the OpenAPI spec.
235
+ // IMPORTANT: This MUST happen before patchSecurity() so that the MCP auth
236
+ // operation IDs are already in _anonymousOperations when security is distributed.
237
+ if (props.mcpAuth) {
238
+ this._mcpAuth = this.createMcpAuth(props.mcpAuth);
239
+ this.injectMcpAuthPaths(this._mcpAuth);
240
+ }
232
241
  this.patchSecurity(this.apiSpec);
233
242
  // TODO patch spec for Cognito user pool
234
243
  this.api = new aws_cdk_lib_1.aws_apigateway.SpecRestApi(this, 'Resource', {
@@ -253,6 +262,20 @@ class RestApi extends base_api_1.BaseApi {
253
262
  sourceArn: this.api.arnForExecuteApi(),
254
263
  });
255
264
  }
265
+ // Grant API Gateway permission to invoke MCP auth Lambda functions.
266
+ // These need explicit addPermission because they are injected directly into
267
+ // the OpenAPI spec (via injectMcpAuthPaths), not through addRestResource which
268
+ // would register them in this._functions for the bulk grant above.
269
+ if (this._mcpAuth) {
270
+ const mcpFunctions = this._mcpAuth.functions;
271
+ for (const [name, fn] of Object.entries(mcpFunctions)) {
272
+ fn.addPermission(`McpAuth${name}Invoke`, {
273
+ principal: new aws_cdk_lib_1.aws_iam.ServicePrincipal('apigateway.amazonaws.com'),
274
+ action: 'lambda:InvokeFunction',
275
+ sourceArn: this.api.arnForExecuteApi(),
276
+ });
277
+ }
278
+ }
256
279
  if (customDomainName && this.api.domainName) {
257
280
  new aws_cdk_lib_1.aws_route53.ARecord(this, 'DnsRecord', {
258
281
  zone: this.hostedZone,
@@ -540,6 +563,141 @@ class RestApi extends base_api_1.BaseApi {
540
563
  }
541
564
  }
542
565
  }
566
+ /**
567
+ * Returns the MCP auth construct if mcpAuth was configured.
568
+ * Useful for accessing the created Lambda functions or env vars.
569
+ */
570
+ getMcpAuth() {
571
+ return this._mcpAuth;
572
+ }
573
+ /**
574
+ * Creates the McpAuth construct from the provided options.
575
+ * Derives apiDomain from the RestApi's own domain config.
576
+ * For Cognito, creates a user pool client automatically.
577
+ */
578
+ createMcpAuth(options) {
579
+ const apiDomain = this.apiFQDN;
580
+ if (!apiDomain) {
581
+ throw new Error('mcpAuth requires a domain name to be configured on the RestApi (domainName or hostedZone + apiHostname)');
582
+ }
583
+ if (options.cognito && options.generic) {
584
+ throw new Error('mcpAuth: provide either cognito or generic, not both');
585
+ }
586
+ if (!options.cognito && !options.generic) {
587
+ throw new Error('mcpAuth: provide either cognito or generic configuration');
588
+ }
589
+ const allowedRedirectUris = options.allowedRedirectUris ?? [
590
+ 'https://claude.ai/oauth/callback',
591
+ 'https://claude.ai/api/mcp/auth_callback',
592
+ 'https://chatgpt.com/oauth/callback',
593
+ ];
594
+ if (options.cognito) {
595
+ const cognitoOpts = options.cognito;
596
+ // Delegate to McpCognitoAuth which handles user pool client creation
597
+ const mcpCognito = new mcp_cognito_auth_1.McpCognitoAuth(this, 'McpCognitoAuth', {
598
+ auth: cognitoOpts.auth,
599
+ apiDomain,
600
+ authDomain: cognitoOpts.authDomain,
601
+ allowedRedirectUris,
602
+ serverInfo: options.serverInfo,
603
+ protocolVersions: options.protocolVersions,
604
+ scopes: options.scopes,
605
+ lambdaOptions: options.lambdaOptions,
606
+ stageName: this.props.stageName,
607
+ clientConstructId: cognitoOpts.clientConstructId,
608
+ additionalCallbackUrls: cognitoOpts.additionalCallbackUrls,
609
+ });
610
+ return mcpCognito.mcpAuth;
611
+ }
612
+ else {
613
+ const genericOpts = options.generic;
614
+ return new mcp_auth_1.McpAuth(this, 'McpAuth', {
615
+ apiDomain,
616
+ authorizeEndpoint: genericOpts.authorizeEndpoint,
617
+ tokenEndpoint: genericOpts.tokenEndpoint,
618
+ allowedRedirectUris,
619
+ clientId: genericOpts.clientId,
620
+ serverInfo: options.serverInfo,
621
+ protocolVersions: options.protocolVersions,
622
+ scopes: options.scopes,
623
+ stripParameters: options.stripParameters,
624
+ lambdaOptions: options.lambdaOptions,
625
+ stageName: this.props.stageName,
626
+ });
627
+ }
628
+ }
629
+ /**
630
+ * Injects MCP OAuth paths into the OpenAPI spec with Lambda proxy integrations
631
+ * pointing to the MCP auth construct's functions. All paths are anonymous (security: []).
632
+ */
633
+ injectMcpAuthPaths(mcpAuth) {
634
+ const fns = mcpAuth.functions;
635
+ const mcpPaths = {
636
+ '/.well-known/oauth-protected-resource': {
637
+ fn: fns.protectedResource,
638
+ method: 'get',
639
+ operationId: 'mcpOAuthProtectedResource',
640
+ summary: 'OAuth Protected Resource Metadata (RFC 9728)',
641
+ },
642
+ '/.well-known/oauth-authorization-server': {
643
+ fn: fns.authorizationServer,
644
+ method: 'get',
645
+ operationId: 'mcpOAuthAuthorizationServer',
646
+ summary: 'OAuth Authorization Server Metadata (RFC 8414)',
647
+ },
648
+ '/oauth/authorize': {
649
+ fn: fns.authorize,
650
+ method: 'get',
651
+ operationId: 'mcpOAuthAuthorize',
652
+ summary: 'OAuth Authorize Proxy',
653
+ },
654
+ '/oauth/token': {
655
+ fn: fns.token,
656
+ method: 'post',
657
+ operationId: 'mcpOAuthToken',
658
+ summary: 'OAuth Token Proxy',
659
+ },
660
+ '/oauth/register': {
661
+ fn: fns.register,
662
+ method: 'post',
663
+ operationId: 'mcpOAuthRegister',
664
+ summary: 'OAuth Dynamic Client Registration (RFC 7591)',
665
+ },
666
+ };
667
+ for (const [path, config] of Object.entries(mcpPaths)) {
668
+ if (!this.apiSpec.paths) {
669
+ this.apiSpec.paths = {};
670
+ }
671
+ const operation = {
672
+ 'summary': config.summary,
673
+ 'operationId': config.operationId,
674
+ 'security': [], // Anonymous — no authorizer
675
+ 'responses': {
676
+ 200: { description: 'Success' },
677
+ 302: { description: 'Redirect' },
678
+ },
679
+ 'x-amazon-apigateway-integration': {
680
+ type: 'aws_proxy',
681
+ httpMethod: 'POST',
682
+ uri: cdk.Stack.of(this).formatArn({
683
+ resource: 'path',
684
+ service: 'apigateway',
685
+ account: 'lambda',
686
+ arnFormat: cdk.ArnFormat.SLASH_RESOURCE_NAME,
687
+ resourceName: `2015-03-31/functions/${config.fn.functionArn}/invocations`,
688
+ }),
689
+ passthroughBehavior: 'when_no_templates',
690
+ payloadFormatVersion: '1.0',
691
+ },
692
+ };
693
+ if (!this.apiSpec.paths[path]) {
694
+ this.apiSpec.paths[path] = {};
695
+ }
696
+ this.apiSpec.paths[path][config.method] = operation;
697
+ // Mark as anonymous so patchSecurity doesn't override it
698
+ this._anonymousOperations.add(config.operationId);
699
+ }
700
+ }
543
701
  /**
544
702
  * Returns the security-scheme container for the spec, creating it if needed.
545
703
  * OpenAPI 3.x stores schemes under `components.securitySchemes`; Swagger 2.0
@@ -627,4 +785,4 @@ class RestApi extends base_api_1.BaseApi {
627
785
  }
628
786
  }
629
787
  exports.RestApi = RestApi;
630
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RydWN0cy9yZXN0LWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBOEI7QUFDOUIsNkNBTXFCO0FBQ3JCLGlEQUFtQztBQUVuQyw4Q0FBZ0M7QUFHaEMseUNBQW1EO0FBQ25ELGlDQUF1RDtBQUN2RCwrQ0FBd0c7QUE4RnhHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILE1BQWEsT0FBb0IsU0FBUSxrQkFBTztJQXlDOUM7Ozs7OztPQU1HO0lBQ0gsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBVSxLQUF3QjtRQUN4RSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUR3QixVQUFLLEdBQUwsS0FBSyxDQUFtQjtRQXBDMUU7OztXQUdHO1FBQ0ssZUFBVSxHQUE4QyxFQUFFLENBQUM7UUFFbEQsZUFBVSxHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFTM0Y7OztXQUdHO1FBQ0sseUJBQW9CLEdBQWdCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFdEQ7Ozs7O1dBS0c7UUFDSywrQkFBMEIsR0FBdUIsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQVlqRSxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBYSxDQUFDO1FBRTNGLElBQUksZ0JBQThELENBQUM7UUFDbkUsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDakIsZ0JBQWdCLEdBQUc7Z0JBQ2pCLFVBQVUsRUFBRSxJQUFJLENBQUMsT0FB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UUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDO1lBQzdCLENBQUM7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FFRjtBQWpvQkQsMEJBaW9CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgYXdzX2NlcnRpZmljYXRlbWFuYWdlcixcbiAgYXdzX2lhbSxcbiAgYXdzX3JvdXRlNTMsXG4gIGF3c19yb3V0ZTUzX3RhcmdldHMsXG4gIGF3c19hcGlnYXRld2F5LFxufSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBjZGsgZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IHsgT3BlbkFQSTMsIE9wZXJhdGlvbk9iamVjdCwgUGF0aEl0ZW1PYmplY3QgfSBmcm9tICdvcGVuYXBpLXR5cGVzY3JpcHQnO1xuaW1wb3J0IHsgSUNvZ25pdG9BdXRoZW50aWNhdGlvbiwgSUp3dEF1dGhlbnRpY2F0aW9uIH0gZnJvbSAnLi9hdXRoZW50aWNhdGlvbic7XG5pbXBvcnQgeyBCYXNlQXBpLCBCYXNlQXBpUHJvcHMgfSBmcm9tICcuL2Jhc2UtYXBpJztcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uLCBMYW1iZGFPcHRpb25zIH0gZnJvbSAnLi9mdW5jJztcbmltcG9ydCB7IENGTl9PVVRQVVRfU1VGRklYX1JFU1RBUElfRE9NQUlOTkFNRSwgQ0ZOX09VVFBVVF9TVUZGSVhfUkVTVEFQSV9VUkwgfSBmcm9tICcuLi9zaGFyZWQvb3V0cHV0cyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdEFwaVByb3BzPE9QUz4gZXh0ZW5kcyBCYXNlQXBpUHJvcHMge1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSByb3V0ZXMgZm9yIGFsbCBlbmRwb2ludHMgY29uZmlndXJlZCBpbiB0aGUgb3BlbmFwaS55YW1sIGZpbGVcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgYXV0b0dlbmVyYXRlUm91dGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogY3VzdG9tIG9wdGlvbnMgZm9yIHRoZSBjcmVhdGVkIEh0dHBBcGlcbiAgICpcbiAgICogQGRlZmF1bHQgLVxuICAgKi9cbiAgcmVzdEFwaVByb3BzPzogYXdzX2FwaWdhdGV3YXkuUmVzdEFwaUJhc2VQcm9wcztcblxuICAvKipcbiAgICogYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgdW5kZXJseWluZyBMYW1iZGEgZnVuY3Rpb24gY29uc3RydWN0IHBlciBvcGVyYXRpb25JZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtXG4gICAqL1xuICBsYW1iZGFPcHRpb25zQnlPcGVyYXRpb24/OiB7IFtvcGVyYXRpb25JZCBpbiBrZXlvZiBPUFNdPzogTGFtYmRhT3B0aW9ucyB9O1xuXG4gIGRlZmluaXRpb25GaWxlTmFtZTogc3RyaW5nO1xuXG4gIGNvcnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBvcGVyYXRpb24gSURzIHRoYXQgc2hvdWxkIHNraXAgdGhlIGF1dGhvcml6ZXIgZW50aXJlbHkuXG4gICAqIFRoZXNlIG9wZXJhdGlvbnMgd2lsbCBoYXZlIGBzZWN1cml0eTogW11gIGluIHRoZSBPcGVuQVBJIHNwZWMsIG1lYW5pbmdcbiAgICogdGhleSBhcmUgcHVibGljbHkgYWNjZXNzaWJsZSB3aXRob3V0IGF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFub255bW91cyBvcGVyYXRpb25zXG4gICAqL1xuICBhbm9ueW1vdXNPcGVyYXRpb25zPzogKGtleW9mIE9QUylbXTtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB0aGUgSldUIExhbWJkYSBhdXRob3JpemVyIHVzZXMgdGhlIFRPS0VOIG9yIFJFUVVFU1QgdHlwZS5cbiAgICpcbiAgICogKip0b2tlbiAoZGVmYXVsdCk6KiogVGhlIEFQSSBHYXRld2F5IHZhbGlkYXRlcyB0aGF0IHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBpcyBwcmVzZW50XG4gICAqIGJlZm9yZSBpbnZva2luZyB0aGUgTGFtYmRhIGF1dGhvcml6ZXIuIElmIHRoZSBoZWFkZXIgaXMgbWlzc2luZywgQVBJIEdhdGV3YXkgaW1tZWRpYXRlbHlcbiAgICogcmV0dXJucyA0MDEgd2l0aG91dCBpbnZva2luZyB0aGUgTGFtYmRhLiBUaGlzIGlzIGNoZWFwZXIgZm9yIHVuYXV0aGVudGljYXRlZCByZXF1ZXN0c1xuICAgKiBiZWNhdXNlIG5vIExhbWJkYSBpbnZvY2F0aW9uIG9jY3VycywgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnQgb3B0aW9uYWwgYXV0aGVudGljYXRpb25cbiAgICogKGV2ZXJ5IHJlcXVlc3QgbXVzdCBjYXJyeSBhIHRva2VuIG9yIGJlIHJlamVjdGVkKS5cbiAgICpcbiAgICogKipyZXF1ZXN0OioqIFRoZSBBUEkgR2F0ZXdheSBhbHdheXMgaW52b2tlcyB0aGUgTGFtYmRhIGF1dGhvcml6ZXIgcmVnYXJkbGVzcyBvZiB3aGV0aGVyXG4gICAqIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBpcyBwcmVzZW50LiBUaGlzIGVuYWJsZXMgb3B0aW9uYWwgYXV0aGVudGljYXRpb246IHRoZSBMYW1iZGFcbiAgICogY2FuIGluc3BlY3QgdGhlIHJlcXVlc3QsIHJldHVybiBBbGxvdyB3aXRoIGFuIGFub255bW91cyBwcmluY2lwYWwgd2hlbiBubyB0b2tlbiBpc1xuICAgKiBwcm92aWRlZCwgYW5kIHJldHVybiBBbGxvdyB3aXRoIHVzZXIgY2xhaW1zIHdoZW4gYSB2YWxpZCB0b2tlbiBpcyBwcmVzZW50LiBUaGUgdHJhZGUtb2ZmXG4gICAqIGlzIHRoYXQgeW91IHBheSBmb3IgYSBMYW1iZGEgaW52b2NhdGlvbiBvbiBldmVyeSByZXF1ZXN0LCBpbmNsdWRpbmcgdW5hdXRoZW50aWNhdGVkIG9uZXMuXG4gICAqXG4gICAqIFVzZSAncmVxdWVzdCcgd2hlbiB5b3UgbmVlZCBlbmRwb2ludHMgdGhhdCBiZWhhdmUgZGlmZmVyZW50bHkgZm9yIGF1dGhlbnRpY2F0ZWQgdnNcbiAgICogYW5vbnltb3VzIHVzZXJzIChlLmcuLCBwZXJzb25hbGl6ZWQgcmVzcG9uc2VzIGZvciBsb2dnZWQtaW4gdXNlcnMsIGdlbmVyaWMgcmVzcG9uc2VzXG4gICAqIGZvciBndWVzdHMpIHdpdGhvdXQgc3BsaXR0aW5nIHRoZW0gaW50byBzZXBhcmF0ZSBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAndG9rZW4nXG4gICAqL1xuICBqd3RBdXRob3JpemVyVHlwZT86ICd0b2tlbicgfCAncmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIEdsb2JhbCBPQXV0aDIgc2NvcGVzIHJlcXVpcmVkIGJ5IHRoZSBDb2duaXRvIGF1dGhvcml6ZXIuXG4gICAqXG4gICAqIFdoZW4gc2NvcGVzIGFyZSBwcmVzZW50LCBBUEkgR2F0ZXdheSB2YWxpZGF0ZXMgdGhlICoqYWNjZXNzIHRva2VuKiogYW5kIGNoZWNrc1xuICAgKiB0aGF0IGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIHNjb3Blcy4gQW4gZW1wdHkgYXJyYXkgbWVhbnMgbm9cbiAgICogc2NvcGVzIGFyZSByZXF1aXJlZDsgQVBJIEdhdGV3YXkgdGhlbiB2YWxpZGF0ZXMgdGhlICoqSUQgdG9rZW4qKiBpbnN0ZWFkLFxuICAgKiByZWplY3RpbmcgYWNjZXNzIHRva2VucyB3aXRoIGEgNDAxLlxuICAgKlxuICAgKiBVc2UgcGVyLW9wZXJhdGlvbiBvdmVycmlkZXMgdmlhIGBhdXRob3JpemF0aW9uU2NvcGVzQnlPcGVyYXRpb25gIHRvIHNldFxuICAgKiBkaWZmZXJlbnQgc2NvcGVzIG9uIGluZGl2aWR1YWwgb3BlcmF0aW9ucy5cbiAgICpcbiAgICogQGRlZmF1bHQgWydvcGVuaWQnXVxuICAgKi9cbiAgYXV0aG9yaXphdGlvblNjb3Blcz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBQZXItb3BlcmF0aW9uIE9BdXRoMiBzY29wZSBvdmVycmlkZXMgZm9yIHRoZSBDb2duaXRvIGF1dGhvcml6ZXIuXG4gICAqXG4gICAqIE9wZXJhdGlvbnMgbGlzdGVkIGhlcmUgdXNlIHRoZSBzcGVjaWZpZWQgc2NvcGVzIGluc3RlYWQgb2YgdGhlIGdsb2JhbFxuICAgKiBgYXV0aG9yaXphdGlvblNjb3Blc2AgZGVmYXVsdC4gT3BlcmF0aW9ucyBub3QgbGlzdGVkIGZhbGwgYmFjayB0byB0aGVcbiAgICogZ2xvYmFsIGRlZmF1bHQuXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIGF1dGhvcml6YXRpb25TY29wZXNCeU9wZXJhdGlvbjoge1xuICAgKiAgIGNyZWF0ZUl0ZW06IFsnb3BlbmlkJywgJ2l0ZW1zOndyaXRlJ10sXG4gICAqICAgZGVsZXRlSXRlbTogWydvcGVuaWQnLCAnaXRlbXM6ZGVsZXRlJ10sXG4gICAqIH1cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBwZXItb3BlcmF0aW9uIG92ZXJyaWRlczsgYWxsIG9wZXJhdGlvbnMgdXNlIGF1dGhvcml6YXRpb25TY29wZXNcbiAgICovXG4gIGF1dGhvcml6YXRpb25TY29wZXNCeU9wZXJhdGlvbj86IHsgW29wZXJhdGlvbklkIGluIGtleW9mIE9QU10/OiBzdHJpbmdbXSB9O1xufVxuXG4vKipcbiAqIFRoZSBSZXN0QXBpIGNvbnN0cnVjdCBzZXRzIHVwIGFuIEFXUyBBUEkgR2F0ZXdheSBSRVNUIEFQSSB1c2luZyBPcGVuQVBJIHNwZWNpZmljYXRpb24uXG4gKiBUaGlzIGNvbnN0cnVjdCBmYWNpbGl0YXRlcyB0aGUgY3JlYXRpb24gb2YgYSBSRVNUIEFQSSB3aXRoIHZhcmlvdXMgY29uZmlndXJhdGlvbnMsIGluY2x1ZGluZyBjdXN0b20gZG9tYWluLCBDT1JTIHN1cHBvcnQsIGFuZCBpbnRlZ3JhdGlvbiB3aXRoIExhbWJkYSBmdW5jdGlvbnMuXG4gKiBJdCBhbGxvd3MgYXV0by1nZW5lcmF0aW5nIHJvdXRlcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgT3BlbkFQSSBkZWZpbml0aW9uIGFuZCBwcm92aWRlcyBtZXRob2RzIHRvIGR5bmFtaWNhbGx5IGFkZCBjdXN0b20gcm91dGVzIGFuZCBtYW5hZ2UgTGFtYmRhIGZ1bmN0aW9uIGludGVncmF0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgUEFUSFMgLSBUaGUgdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgQVBJIHBhdGhzLlxuICogQHRlbXBsYXRlIE9QUyAtIFRoZSB0eXBlIGRlZmluaXRpb24gZm9yIHRoZSBBUEkgb3BlcmF0aW9ucy5cbiAqXG4gKiBAZXhhbXBsZVxuICogY29uc3QgYXBpID0gbmV3IFJlc3RBcGkodGhpcywgJ015UmVzdEFwaScsIHtcbiAqICAgYXBpTmFtZTogJ015QVBJJyxcbiAqICAgc3RhZ2VOYW1lOiAnZGV2JyxcbiAqICAgZGVmaW5pdGlvbkZpbGVOYW1lOiAnb3BlbmFwaS55YW1sJyxcbiAqICAgYXV0aGVudGljYXRpb246IG15Q29nbml0b0F1dGgsXG4gKiAgIHNpbmdsZVRhYmxlRGF0YXN0b3JlOiBteUR5bmFtb0RCVGFibGUsXG4gKiAgIGF1dG9HZW5lcmF0ZVJvdXRlczogdHJ1ZSxcbiAqIH0pO1xuICpcbiAqIC8vIEFkZCBhIGN1c3RvbSBSRVNUIHJlc291cmNlXG4gKiBhcGkuYWRkUmVzdFJlc291cmNlKCcvaXRlbXMnLCAnZ2V0Jyk7XG4gKlxuICogLy8gR2V0IHRoZSBMYW1iZGEgZnVuY3Rpb24gZm9yIGEgc3BlY2lmaWMgb3BlcmF0aW9uXG4gKiBjb25zdCBsYW1iZGFGdW5jdGlvbiA9IGFwaS5nZXRGdW5jdGlvbkZvck9wZXJhdGlvbignZ2V0SXRlbXMnKTtcbiAqL1xuZXhwb3J0IGNsYXNzIFJlc3RBcGk8UEFUSFMsIE9QUz4gZXh0ZW5kcyBCYXNlQXBpIHtcblxuICAvKipcbiAgICogVGhlIEFXUyBBUEkgR2F0ZXdheSBSRVNUIEFQSSBpbnN0YW5jZS5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSBhcGk6IGF3c19hcGlnYXRld2F5LlNwZWNSZXN0QXBpO1xuXG4gIC8qKlxuICAgKiBUaGUgT3BlbkFQSSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgUkVTVCBBUEkuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpU3BlYzogT3BlbkFQSTM7XG5cbiAgLyoqXG4gICAqIEEgY29sbGVjdGlvbiBvZiBMYW1iZGEgZnVuY3Rpb25zIHVzZWQgYXMgaW50ZWdyYXRpb25zIGZvciB0aGUgQVBJIG9wZXJhdGlvbnMuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9mdW5jdGlvbnM6IHsgW29wZXJhdGlvbklkOiBzdHJpbmddOiBMYW1iZGFGdW5jdGlvbiB9ID0ge307XG5cbiAgcHJpdmF0ZSByZWFkb25seSBhcGlNZXRob2RzID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJywgJ29wdGlvbnMnLCAnaGVhZCddO1xuXG4gIC8qKlxuICAgKiBUaGUgSldUIGF1dGhvcml6ZXIgTGFtYmRhIGZ1bmN0aW9uLCBpZiBKV1QgYXV0aGVudGljYXRpb24gaXMgY29uZmlndXJlZC5cbiAgICogU3RvcmVkIHNvIHRoZSBpbnZva2UgcGVybWlzc2lvbiBjYW4gYmUgZ3JhbnRlZCBhZnRlciB0aGUgU3BlY1Jlc3RBcGkgaXMgY3JlYXRlZC5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgX2F1dGhvcml6ZXJGbj86IExhbWJkYUZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBTZXQgb2Ygb3BlcmF0aW9uSWRzIHRoYXQgc2hvdWxkIGhhdmUgc2VjdXJpdHkgZGlzYWJsZWQgKHNlY3VyaXR5OiBbXSkuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9hbm9ueW1vdXNPcGVyYXRpb25zOiBTZXQ8c3RyaW5nPiA9IG5ldyBTZXQoKTtcblxuICAvKipcbiAgICogU3RvcmVzIHRoZSBvcmlnaW5hbCBwZXItb3BlcmF0aW9uIHNlY3VyaXR5IGFycmF5cyBhcyBhc3NpZ25lZCBieSBwYXRjaFNlY3VyaXR5LFxuICAgKiBrZXllZCBieSBvcGVyYXRpb25JZC4gVXNlZCBieSBzZXRBbm9ueW1vdXNPcGVyYXRpb25zIHRvIHJlc3RvcmUgc2VjdXJpdHkgb25cbiAgICogb3BlcmF0aW9ucyByZW1vdmVkIGZyb20gdGhlIGFub255bW91cyBzZXQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9vcmlnaW5hbE9wZXJhdGlvblNlY3VyaXR5OiBNYXA8c3RyaW5nLCBhbnlbXT4gPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgUmVzdEFwaS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIC0gVGhlIHNjb3BlIGluIHdoaWNoIHRoaXMgY29uc3RydWN0IGlzIGRlZmluZWQuXG4gICAqIEBwYXJhbSBpZCAtIFRoZSBzY29wZWQgY29uc3RydWN0IElELlxuICAgKiBAcGFyYW0gcHJvcHMgLSBUaGUgcHJvcGVydGllcyBvZiB0aGUgUmVzdEFwaSBjb25zdHJ1Y3QuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcml2YXRlIHByb3BzOiBSZXN0QXBpUHJvcHM8T1BTPikge1xuICAgIHN1cGVyKHNjb3BlLCBpZCwgcHJvcHMpO1xuXG4gICAgdGhpcy5hcGlTcGVjID0geWFtbC5sb2FkKGZzLnJlYWRGaWxlU3luYyhwcm9wcy5kZWZpbml0aW9uRmlsZU5hbWUpLnRvU3RyaW5nKCkpIGFzIE9wZW5BUEkzO1xuXG4gICAgbGV0IGN1c3RvbURvbWFpbk5hbWU6IGF3c19hcGlnYXRld2F5LkRvbWFpbk5hbWVPcHRpb25zIHwgdW5kZWZpbmVkO1xuICAgIGlmICh0aGlzLmFwaUZRRE4pIHtcbiAgICAgIGN1c3RvbURvbWFpbk5hbWUgPSB7XG4gICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuYXBpRlFETixcbiAgICAgICAgY2VydGlmaWNhdGU6IG5ldyBhd3NfY2VydGlmaWNhdGVtYW5hZ2VyLkNlcnRpZmljYXRlKHRoaXMsICdDZXJ0Jywge1xuICAgICAgICAgIGRvbWFpbk5hbWU6IHRoaXMuYXBpRlFETixcbiAgICAgICAgICB2YWxpZGF0aW9uOiBhd3NfY2VydGlmaWNhdGVtYW5hZ2VyLkNlcnRpZmljYXRlVmFsaWRhdGlvbi5mcm9tRG5zKHRoaXMuaG9zdGVkWm9uZSksXG4gICAgICAgIH0pLFxuICAgICAgfTtcbiAgICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdSZXN0QXBpRG9tYWluTmFtZScsIHtcbiAgICAgICAga2V5OiBgJHt0aGlzLnByb3BzLmFwaU5hbWV9JHtDRk5fT1VUUFVUX1NVRkZJWF9SRVNUQVBJX0RPTUFJTk5BTUV9YCxcbiAgICAgICAgdmFsdWU6IHRoaXMuYXBpRlFETixcbiAgICAgIH0pO1xuICAgICAgbmV3IGNkay5DZm5PdXRwdXQodGhpcywgJ1Jlc3RBcGlVcmxPdXRwdXQnLCB7XG4gICAgICAgIGtleTogYCR7dGhpcy5wcm9wcy5hcGlOYW1lfSR7Q0ZOX09VVFBVVF9TVUZGSVhfUkVTVEFQSV9VUkx9YCxcbiAgICAgICAgdmFsdWU6ICdodHRwczovLycgKyB0aGlzLmFwaUZRRE4sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBpZiAoKHByb3BzLm1vbml0b3JpbmcgPz8gdHJ1ZSkgJiYgdGhpcy5tb25pdG9yaW5nKSB7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcuYXBpRXJyb3JzV2lkZ2V0LmFkZExlZnRNZXRyaWModGhpcy5hcGkubWV0cmljU2VydmVyRXJyb3Ioe1xuICAgIC8vICAgICBzdGF0aXN0aWM6ICdzdW0nLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUVycm9yc1dpZGdldC5hZGRMZWZ0TWV0cmljKHRoaXMuYXBpLm1ldHJpY0NsaWVudEVycm9yKHtcbiAgICAvLyAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAvLyAgIH0pKTtcblxuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lXaWRnZXQuYWRkTGVmdE1ldHJpYyh0aGlzLmFwaS5tZXRyaWNMYXRlbmN5KHtcbiAgICAvLyAgICAgc3RhdGlzdGljOiAnQXZlcmFnZScsXG4gICAgLy8gICB9KSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcuYXBpTGF0ZW5jeVdpZGdldC5hZGRMZWZ0TWV0cmljKHRoaXMuYXBpLm1ldHJpY0xhdGVuY3koe1xuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTAnLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lUYWlsV2lkZ2V0LmFkZExlZnRNZXRyaWModGhpcy5hcGkubWV0cmljTGF0ZW5jeSh7XG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ3A5NScsXG4gICAgLy8gICB9KSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcuYXBpTGF0ZW5jeVRhaWxXaWRnZXQuYWRkTGVmdE1ldHJpYyh0aGlzLmFwaS5tZXRyaWNMYXRlbmN5KHtcbiAgICAvLyAgICAgc3RhdGlzdGljOiAncDk5JyxcbiAgICAvLyAgIH0pKTtcbiAgICAvLyB9XG5cbiAgICBpZiAocHJvcHMuYXV0b0dlbmVyYXRlUm91dGVzID8/IHRydWUpIHtcbiAgICAgIGZvciAoY29uc3QgcGF0aCBpbiB0aGlzLmFwaVNwZWMucGF0aHMpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmFwaVNwZWMucGF0aHMsIHBhdGgpKSB7XG4gICAgICAgICAgY29uc3QgcGF0aEl0ZW0gPSB0aGlzLmFwaVNwZWMucGF0aHNbcGF0aF07XG4gICAgICAgICAgZm9yIChjb25zdCBtZXRob2QgaW4gcGF0aEl0ZW0pIHtcbiAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwocGF0aEl0ZW0sIG1ldGhvZCkgJiZcbiAgICAgICAgICAgICAgWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJywgJ29wdGlvbnMnLCAnaGVhZCddLmluZGV4T2YobWV0aG9kKSA+PSAwKSB7XG4gICAgICAgICAgICAgIC8vIEFkZCBhbGwgb3BlcmF0aW9uc1xuICAgICAgICAgICAgICB0aGlzLmFkZFJlc3RSZXNvdXJjZShwYXRoIGFzIGFueSwgbWV0aG9kIGFzIGFueSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIF9zcGVjIEVuZHBvaW50XG4gICAgdGhpcy5hcGlTcGVjLnBhdGhzIVsnL29wZW5hcGkuanNvbiddID0ge1xuICAgICAgZ2V0OiB7XG4gICAgICAgICdzdW1tYXJ5JzogJ1JldHVybnMgdGhlIHJhdyBPcGVuQVBJIHNwZWMgb2YgdGhpcyBBUEknLFxuICAgICAgICAnZGVzY3JpcHRpb24nOiAnUmV0dXJucyB0aGUgcmF3IE9wZW5BUEkgc3BlYyBvZiB0aGlzIEFQSScsXG4gICAgICAgICdvcGVyYXRpb25JZCc6ICdfc3BlYycsXG4gICAgICAgICdyZXNwb25zZXMnOiB7XG4gICAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJ09wZW5BUEkgc3BlYyBvZiB0aGlzIEFQSScsXG4gICAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9vcGVuYXBpK2pzb24nOiB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgLy8gQHRzLWlnbm9yZSBDdXN0b20gcHJvcGVydHkgZm9yIEFXU1xuICAgICAgICAneC1hbWF6b24tYXBpZ2F0ZXdheS1pbnRlZ3JhdGlvbic6IHtcbiAgICAgICAgICB0eXBlOiAnbW9jaycsXG4gICAgICAgICAgaHR0cE1ldGhvZDogJ0dFVCcsXG4gICAgICAgICAgcGF5bG9hZEZvcm1hdFZlcnNpb246ICcxLjAnLFxuICAgICAgICAgIHJlcXVlc3RUZW1wbGF0ZXM6IHtcbiAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogJ3tcXCdzdGF0dXNDb2RlXFwnOiAyMDB9JyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAgICAgMjAwOiB7XG4gICAgICAgICAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgICAgICAgICAgcmVzcG9uc2VUZW1wbGF0ZXM6IHtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vb3BlbmFwaStqc29uJzogSlNPTi5zdHJpbmdpZnkodGhpcy5jbGVhbnVwU3BlYyhKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KCh0aGlzLmFwaVNwZWMpKSkpKSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGlmIChwcm9wcy5jb3JzKSB7XG4gICAgICB0aGlzLmFwaVNwZWMucGF0aHMhWycve3Byb3h5K30nXSA9IHtcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICdzdW1tYXJ5JzogJ0NPUlMgc3VwcG9ydCcsXG4gICAgICAgICAgJ2Rlc2NyaXB0aW9uJzogJ0VuYWJsZSBDT1JTIGJ5IHJldHVybmluZyBjb3JyZWN0IGhlYWRlcnMnLFxuICAgICAgICAgICd0YWdzJzogWydDT1JTJ10sXG4gICAgICAgICAgJ3NlY3VyaXR5JzogW10sXG4gICAgICAgICAgJ3Jlc3BvbnNlcyc6IHtcbiAgICAgICAgICAgIDIwMDoge1xuICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogJ0RlZmF1bHQgcmVzcG9uc2UgZm9yIENPUlMgbWV0aG9kJyxcbiAgICAgICAgICAgICAgaGVhZGVyczoge1xuICAgICAgICAgICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiB7IHNjaGVtYTogeyB0eXBlOiAnc3RyaW5nJyB9IH0sXG4gICAgICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiB7IHNjaGVtYTogeyB0eXBlOiAnc3RyaW5nJyB9IH0sXG4gICAgICAgICAgICAgICAgJ0FjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJzogeyBzY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSB9LFxuICAgICAgICAgICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogeyBzY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSB9LFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBjb250ZW50OiB7fSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICAneC1hbWF6b24tYXBpZ2F0ZXdheS1pbnRlZ3JhdGlvbic6IHtcbiAgICAgICAgICAgIHR5cGU6ICdtb2NrJyxcbiAgICAgICAgICAgIHJlcXVlc3RUZW1wbGF0ZXM6IHtcbiAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nOiAnI3NldCgkY29udGV4dC5yZXF1ZXN0T3ZlcnJpZGUuaGVhZGVyLm9yaWdpbiA9ICRtZXRob2QucmVxdWVzdC5oZWFkZXIub3JpZ2luKVxcbntcXG4gIFwic3RhdHVzQ29kZVwiIDogMjAwXFxufVxcbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcmVzcG9uc2VzOiB7XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAnMjAwJyxcbiAgICAgICAgICAgICAgICByZXNwb25zZVBhcmFtZXRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICdtZXRob2QucmVzcG9uc2UuaGVhZGVyLkFjY2Vzcy1Db250cm9sLUFsbG93LUhlYWRlcnMnOiBcIidDb250ZW50LVR5cGUsWC1BbXotRGF0ZSxBdXRob3JpemF0aW9uLFgtQXBpLUtleSdcIixcbiAgICAgICAgICAgICAgICAgICdtZXRob2QucmVzcG9uc2UuaGVhZGVyLkFjY2Vzcy1Db250cm9sLUFsbG93LUNyZWRlbnRpYWxzJzogXCIndHJ1ZSdcIixcbiAgICAgICAgICAgICAgICAgICdtZXRob2QucmVzcG9uc2UuaGVhZGVyLkFjY2Vzcy1Db250cm9sLUFsbG93LU1ldGhvZHMnOiBcIidQVVQsR0VULFBPU1QsREVMRVRFLFBBVENILEhFQUQsT1BUSU9OUydcIixcbiAgICAgICAgICAgICAgICAgICdtZXRob2QucmVzcG9uc2UuaGVhZGVyLkFjY2Vzcy1Db250cm9sLUFsbG93LU9yaWdpbic6ICdjb250ZXh0LnJlcXVlc3RPdmVycmlkZS5oZWFkZXIub3JpZ2luJyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlVGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6ICd7fScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgdGhpcy5wYXRjaFNlY3VyaXR5U2NoZW1lcyh0aGlzLmFwaVNwZWMpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbm9ueW1vdXMgb3BlcmF0aW9ucyBmcm9tIHByb3BzIGJlZm9yZSBwYXRjaFNlY3VyaXR5IGRpc3RyaWJ1dGVzIHNlY3VyaXR5XG4gICAgaWYgKHByb3BzLmFub255bW91c09wZXJhdGlvbnMpIHtcbiAgICAgIGZvciAoY29uc3Qgb3BJZCBvZiBwcm9wcy5hbm9ueW1vdXNPcGVyYXRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Fub255bW91c09wZXJhdGlvbnMuYWRkKG9wSWQgYXMgc3RyaW5nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhdGNoU2VjdXJpdHkodGhpcy5hcGlTcGVjKTtcblxuICAgIC8vIFRPRE8gcGF0Y2ggc3BlYyBmb3IgQ29nbml0byB1c2VyIHBvb2xcblxuICAgIHRoaXMuYXBpID0gbmV3IGF3c19hcGlnYXRld2F5LlNwZWNSZXN0QXBpKHRoaXMsICdSZXNvdXJjZScsIHtcbiAgICAgIHJlc3RBcGlOYW1lOiBgJHtwcm9wcy5hcGlOYW1lfSBbJHtwcm9wcy5zdGFnZU5hbWV9XWAsXG4gICAgICBkb21haW5OYW1lOiBjdXN0b21Eb21haW5OYW1lLFxuICAgICAgYXBpRGVmaW5pdGlvbjogYXdzX2FwaWdhdGV3YXkuQXBpRGVmaW5pdGlvbi5mcm9tSW5saW5lKHRoaXMuYXBpU3BlYyksXG4gICAgICAuLi5wcm9wcy5yZXN0QXBpUHJvcHMsXG4gICAgfSk7XG5cbiAgICAvLyBhZGQgaW52b2tlIHBlcm1pc3Npb25zIHRvIExhbWJkYSBmdW5jdGlvbnNcbiAgICBmb3IgKGNvbnN0IGZuIG9mIE9iamVjdC52YWx1ZXModGhpcy5fZnVuY3Rpb25zKSkge1xuICAgICAgZm4uYWRkUGVybWlzc2lvbignUmVzdEFwaUludm9rZScsIHtcbiAgICAgICAgcHJpbmNpcGFsOiBuZXcgYXdzX2lhbS5TZXJ2aWNlUHJpbmNpcGFsKCdhcGlnYXRld2F5LmFtYXpvbmF3cy5jb20nKSxcbiAgICAgICAgYWN0aW9uOiAnbGFtYmRhOkludm9rZUZ1bmN0aW9uJyxcbiAgICAgICAgc291cmNlQXJuOiB0aGlzLmFwaS5hcm5Gb3JFeGVjdXRlQXBpKCksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBHcmFudCBBUEkgR2F0ZXdheSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGUgSldUIGF1dGhvcml6ZXIgTGFtYmRhXG4gICAgaWYgKHRoaXMuX2F1dGhvcml6ZXJGbikge1xuICAgICAgdGhpcy5fYXV0aG9yaXplckZuLmFkZFBlcm1pc3Npb24oJ0FwaUdhdGV3YXlBdXRob3JpemVySW52b2tlJywge1xuICAgICAgICBwcmluY2lwYWw6IG5ldyBhd3NfaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2FwaWdhdGV3YXkuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBhY3Rpb246ICdsYW1iZGE6SW52b2tlRnVuY3Rpb24nLFxuICAgICAgICBzb3VyY2VBcm46IHRoaXMuYXBpLmFybkZvckV4ZWN1dGVBcGkoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjdXN0b21Eb21haW5OYW1lICYmIHRoaXMuYXBpLmRvbWFpbk5hbWUpIHtcbiAgICAgIG5ldyBhd3Nfcm91dGU1My5BUmVjb3JkKHRoaXMsICdEbnNSZWNvcmQnLCB7XG4gICAgICAgIHpvbmU6IHRoaXMuaG9zdGVkWm9uZSEsXG4gICAgICAgIHJlY29yZE5hbWU6IGN1c3RvbURvbWFpbk5hbWUuZG9tYWluTmFtZSxcbiAgICAgICAgdGFyZ2V0OiBhd3Nfcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICAgIG5ldyBhd3Nfcm91dGU1M190YXJnZXRzLkFwaUdhdGV3YXlEb21haW4odGhpcy5hcGkuZG9tYWluTmFtZSksXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhbnVwU3BlYyhzcGVjOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgT2JqZWN0LmVudHJpZXMoc3BlYykuZm9yRWFjaCgoW3Byb3AsIHZhbHVlXTogW3N0cmluZywgYW55XSkgPT4ge1xuICAgICAgaWYgKHByb3Auc3RhcnRzV2l0aCgneC0nKSkge1xuICAgICAgICBkZWxldGUgc3BlY1twcm9wXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0aGlzLmNsZWFudXBTcGVjKHNwZWNbcHJvcF0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNwZWM7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIHRoZSBnZW5lcmF0ZWQgTGFtYmRhIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEFQSSBvcGVyYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXRGdW5jdGlvbkZvck9wZXJhdGlvbihvcGVyYXRpb25JZDoga2V5b2YgT1BTKTogTGFtYmRhRnVuY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9mdW5jdGlvbnNbb3BlcmF0aW9uSWQgYXMgc3RyaW5nXTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBsaXN0IG9mIGFsbCBnZW5lcmF0ZWQgTGFtYmRhIGZ1bmN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldEZ1bmN0aW9ucygpOiBMYW1iZGFGdW5jdGlvbltdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9mdW5jdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0b3IgbWV0aG9kIHRvIG1vZGlmeSB0aGUgZ2l2ZW4gZnVuY3Rpb25zXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb25JZHMgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIHZpc2l0XG4gICAqIEBwYXJhbSBvcCB0aGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZXZlcnkgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBtb2RpZnlPcGVyYXRpb25GdW5jdGlvbnMob3BlcmF0aW9uSWRzOiAoa2V5b2YgT1BTKVtdLCBvcDogKGZuOiBMYW1iZGFGdW5jdGlvbikgPT4gdm9pZCkge1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uSWQgb2Ygb3BlcmF0aW9uSWRzKSB7XG4gICAgICBvcCh0aGlzLmdldEZ1bmN0aW9uRm9yT3BlcmF0aW9uKG9wZXJhdGlvbklkKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIGZ1bGwgc2V0IG9mIGFub255bW91cyBvcGVyYXRpb25zLlxuICAgKiBBbm9ueW1vdXMgb3BlcmF0aW9ucyB3aWxsIGhhdmUgYHNlY3VyaXR5OiBbXWAgYXBwbGllZCBpbiB0aGUgT3BlbkFQSSBzcGVjLFxuICAgKiBtYWtpbmcgdGhlbSBwdWJsaWNseSBhY2Nlc3NpYmxlIHdpdGhvdXQgYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIFNpbmNlIENESyBzZXJpYWxpemVzIHRoZSBPcGVuQVBJIHNwZWMgYXQgc3ludGggdGltZSAoZnJvbUlubGluZSBzdG9yZXMgdGhlXG4gICAqIG9iamVjdCByZWZlcmVuY2UpLCBtdXRhdGlvbnMgYWZ0ZXIgU3BlY1Jlc3RBcGkgY29uc3RydWN0aW9uIHN0aWxsIHRha2UgZWZmZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uSWRzIC0gVGhlIG9wZXJhdGlvbiBJRHMgdG8gbWFyayBhcyBhbm9ueW1vdXMuIFJlcGxhY2VzIGFueSBwcmV2aW91c2x5IHNldCBhbm9ueW1vdXMgb3BlcmF0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzZXRBbm9ueW1vdXNPcGVyYXRpb25zKG9wZXJhdGlvbklkczogKGtleW9mIE9QUylbXSkge1xuICAgIHRoaXMuX2Fub255bW91c09wZXJhdGlvbnMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IG9wSWQgb2Ygb3BlcmF0aW9uSWRzKSB7XG4gICAgICB0aGlzLl9hbm9ueW1vdXNPcGVyYXRpb25zLmFkZChvcElkIGFzIHN0cmluZyk7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlBbm9ueW1vdXNTZWN1cml0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgdG8gdGhlIHNldCBvZiBhbm9ueW1vdXMgb3BlcmF0aW9ucy5cbiAgICogTmV3bHkgYWRkZWQgb3BlcmF0aW9ucyB3aWxsIGhhdmUgYHNlY3VyaXR5OiBbXWAgYXBwbGllZCBpbiB0aGUgT3BlbkFQSSBzcGVjLlxuICAgKlxuICAgKiBTaW5jZSBDREsgc2VyaWFsaXplcyB0aGUgT3BlbkFQSSBzcGVjIGF0IHN5bnRoIHRpbWUgKGZyb21JbmxpbmUgc3RvcmVzIHRoZVxuICAgKiBvYmplY3QgcmVmZXJlbmNlKSwgbXV0YXRpb25zIGFmdGVyIFNwZWNSZXN0QXBpIGNvbnN0cnVjdGlvbiBzdGlsbCB0YWtlIGVmZmVjdC5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbklkcyAtIFRoZSBvcGVyYXRpb24gSURzIHRvIGFkZCB0byB0aGUgYW5vbnltb3VzIHNldC5cbiAgICovXG4gIHB1YmxpYyBhZGRBbm9ueW1vdXNPcGVyYXRpb25zKG9wZXJhdGlvbklkczogKGtleW9mIE9QUylbXSkge1xuICAgIGZvciAoY29uc3Qgb3BJZCBvZiBvcGVyYXRpb25JZHMpIHtcbiAgICAgIHRoaXMuX2Fub255bW91c09wZXJhdGlvbnMuYWRkKG9wSWQgYXMgc3RyaW5nKTtcbiAgICB9XG4gICAgdGhpcy5hcHBseUFub255bW91c1NlY3VyaXR5Rm9yT3BzKG9wZXJhdGlvbklkcy5tYXAob3AgPT4gb3AgYXMgc3RyaW5nKSk7XG4gIH1cblxuICAvKipcbiAgICogUmUtYXBwbGllcyBzZWN1cml0eSBzZXR0aW5ncyB0byBhbGwgb3BlcmF0aW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudCBhbm9ueW1vdXMgc2V0LlxuICAgKiBPcGVyYXRpb25zIGluIHRoZSBhbm9ueW1vdXMgc2V0IGdldCBgc2VjdXJpdHk6IFtdYDsgb3BlcmF0aW9ucyByZW1vdmVkIGZyb20gdGhlIHNldFxuICAgKiBoYXZlIHRoZWlyIG9yaWdpbmFsIHNlY3VyaXR5IHJlc3RvcmVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUFub255bW91c1NlY3VyaXR5KCkge1xuICAgIGZvciAoY29uc3Qgc3BlY1BhdGggb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmFwaVNwZWMucGF0aHMgfHwgW10pKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzcGVjUGF0aCkge1xuICAgICAgICBpZiAoIXRoaXMuYXBpTWV0aG9kcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlY01ldGhvZCA9IChzcGVjUGF0aCBhcyBQYXRoSXRlbU9iamVjdClba2V5IGFzIGtleW9mIFBhdGhJdGVtT2JqZWN0XSEgYXMgT3BlcmF0aW9uT2JqZWN0O1xuICAgICAgICBpZiAoc3BlY01ldGhvZC5vcGVyYXRpb25JZCAmJiB0aGlzLl9hbm9ueW1vdXNPcGVyYXRpb25zLmhhcyhzcGVjTWV0aG9kLm9wZXJhdGlvbklkKSkge1xuICAgICAgICAgIHNwZWNNZXRob2Quc2VjdXJpdHkgPSBbXTtcbiAgICAgICAgfSBlbHNlIGlmIChzcGVjTWV0aG9kLm9wZXJhdGlvbklkICYmIHRoaXMuX29yaWdpbmFsT3BlcmF0aW9uU2VjdXJpdHkuaGFzKHNwZWNNZXRob2Qub3BlcmF0aW9uSWQpKSB7XG4gICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzZWN1cml0eSBmb3Igb3BlcmF0aW9ucyByZW1vdmVkIGZyb20gdGhlIGFub255bW91cyBzZXRcbiAgICAgICAgICBzcGVjTWV0aG9kLnNlY3VyaXR5ID0gdGhpcy5fb3JpZ2luYWxPcGVyYXRpb25TZWN1cml0eS5nZXQoc3BlY01ldGhvZC5vcGVyYXRpb25JZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBgc2VjdXJpdHk6IFtdYCBvbmx5IHRvIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9ucy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXBwbHlBbm9ueW1vdXNTZWN1cml0eUZvck9wcyhvcGVyYXRpb25JZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3Qgb3BzU2V0ID0gbmV3IFNldChvcGVyYXRpb25JZHMpO1xuICAgIGZvciAoY29uc3Qgc3BlY1BhdGggb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmFwaVNwZWMucGF0aHMgfHwgW10pKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzcGVjUGF0aCkge1xuICAgICAgICBpZiAoIXRoaXMuYXBpTWV0aG9kcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlY01ldGhvZCA9IChzcGVjUGF0aCBhcyBQYXRoSXRlbU9iamVjdClba2V5IGFzIGtleW9mIFBhdGhJdGVtT2JqZWN0XSEgYXMgT3BlcmF0aW9uT2JqZWN0O1xuICAgICAgICBpZiAoc3BlY01ldGhvZC5vcGVyYXRpb25JZCAmJiBvcHNTZXQuaGFzKHNwZWNNZXRob2Qub3BlcmF0aW9uSWQpKSB7XG4gICAgICAgICAgc3BlY01ldGhvZC5zZWN1cml0eSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZFJlc3RSZXNvdXJjZTxQIGV4dGVuZHMga2V5b2YgUEFUSFM+KHBhdGg6IFAsIG1ldGhvZDoga2V5b2YgUEFUSFNbUF0pIHtcbiAgICBjb25zdCBvYVBhdGggPSB0aGlzLmFwaVNwZWMucGF0aHMhW3BhdGggYXMgc3RyaW5nXSBhcyBQYXRoSXRlbU9iamVjdDtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBvYVBhdGhbbWV0aG9kIGFzIGtleW9mIFBhdGhJdGVtT2JqZWN0XSBhcyBPcGVyYXRpb25PYmplY3Q7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBvcGVyYXRpb24ub3BlcmF0aW9uSWQhO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYCR7bWV0aG9kIGFzIHN0cmluZ30gJHtwYXRoIGFzIHN0cmluZ30gLSAke29wZXJhdGlvbi5zdW1tYXJ5fWA7XG5cbiAgICBjb25zdCBjdXN0b21MYW1iZGFPcHRpb25zID0gdGhpcy5wcm9wcy5sYW1iZGFPcHRpb25zQnlPcGVyYXRpb24gPyB0aGlzLnByb3BzLmxhbWJkYU9wdGlvbnNCeU9wZXJhdGlvbltvcGVyYXRpb25JZCBhcyBrZXlvZiBPUFNdIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmFkZEN1c3RvbVJlc3RSZXNvdXJjZShvcGVyYXRpb24sIG1ldGhvZCBhcyBzdHJpbmcsIGRlc2NyaXB0aW9uLCBjdXN0b21MYW1iZGFPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRDdXN0b21SZXN0UmVzb3VyY2Uob3BlcmF0aW9uOiBPcGVyYXRpb25PYmplY3QsIG1ldGhvZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBhZGRpdGlvbmFsTGFtYmRhT3B0aW9uczogTGFtYmRhT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCd4LWFtYXpvbi1hcGlnYXRld2F5LWludGVncmF0aW9uJyBpbiBvcGVyYXRpb24pIHtcbiAgICAgIHJldHVybjsgLy8gU2tpcCBpZiBvcGVyYXRpb24gd2FzIGRlY2xhcmVkIGluIHNwZWMgZmlsZSBhbHJlYWR5IVxuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGAuL3NyYy9sYW1iZGEvcmVzdC4ke3RoaXMucHJvcHMuYXBpTmFtZS50b0xvd2VyQ2FzZSgpfS4ke29wZXJhdGlvbi5vcGVyYXRpb25JZH0udHNgO1xuXG4gICAgY29uc3QgbGFtYmRhT3B0aW9ucyA9IHtcbiAgICAgIC4uLnRoaXMucHJvcHMubGFtYmRhT3B0aW9ucyAmJiB7XG4gICAgICAgIC4uLnRoaXMucHJvcHMubGFtYmRhT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgICAuLi5hZGRpdGlvbmFsTGFtYmRhT3B0aW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgYXV0aGVudGljYXRpb24gPSB0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uICYmICh0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uLmhhc093blByb3BlcnR5KCd1c2VycG9vbCcpXG4gICAgICA/IHsgdXNlclBvb2w6ICh0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIElDb2duaXRvQXV0aGVudGljYXRpb24pLnVzZXJwb29sIH1cbiAgICAgIDogeyBqd3Q6IHRoaXMucHJvcHMuYXV0aGVudGljYXRpb24gYXMgSUp3dEF1dGhlbnRpY2F0aW9uIH0pO1xuXG4gICAgY29uc3QgZm4gPSBuZXcgTGFtYmRhRnVuY3Rpb24odGhpcywgYEZuJHtvcGVyYXRpb24ub3BlcmF0aW9uSWR9YCwge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLnByb3BzLnN0YWdlTmFtZSxcbiAgICAgIGFkZGl0aW9uYWxFbnY6IHtcbiAgICAgICAgLi4udGhpcy5wcm9wcy5kb21haW5OYW1lICYmIHtcbiAgICAgICAgICBET01BSU5fTkFNRTogdGhpcy5wcm9wcy5kb21haW5OYW1lLFxuICAgICAgICB9LFxuICAgICAgICAuLi50aGlzLnByb3BzLmFkZGl0aW9uYWxFbnYsXG4gICAgICB9LFxuICAgICAgZW50cnk6IGVudHJ5RmlsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgWyR7dGhpcy5wcm9wcy5zdGFnZU5hbWV9XSAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAuLi5hdXRoZW50aWNhdGlvbixcbiAgICAgIC4uLnRoaXMucHJvcHMuc2luZ2xlVGFibGVEYXRhc3RvcmUgJiYge1xuICAgICAgICB0YWJsZTogdGhpcy5wcm9wcy5zaW5nbGVUYWJsZURhdGFzdG9yZS50YWJsZSxcbiAgICAgICAgdGFibGVXcml0ZXM6IHRoaXMudGFibGVXcml0ZUFjY2Vzc0Zvck1ldGhvZChtZXRob2QpLFxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMucHJvcHMuYXNzZXRDZG4gJiYge1xuICAgICAgICBhc3NldERvbWFpbk5hbWU6IHRoaXMucHJvcHMuYXNzZXRDZG4uYXNzZXREb21haW5OYW1lLFxuICAgICAgICBhc3NldEJ1Y2tldDogdGhpcy5wcm9wcy5hc3NldENkbi5hc3NldEJ1Y2tldCxcbiAgICAgIH0sXG4gICAgICBsYW1iZGFPcHRpb25zLFxuICAgICAgbGFtYmRhVHJhY2luZzogdGhpcy5wcm9wcy5sYW1iZGFUcmFjaW5nLFxuICAgIH0pO1xuICAgIHRoaXMuX2Z1bmN0aW9uc1tvcGVyYXRpb24ub3BlcmF0aW9uSWQhXSA9IGZuO1xuICAgIGNkay5UYWdzLm9mKGZuKS5hZGQoJ09wZW5BUEknLCBkZXNjcmlwdGlvbi5yZXBsYWNlKC9bXlxcd1xcc1xcZF8uOi89K1xcLUBdL2csICcnKSk7XG5cbiAgICAvLyBpZiAodGhpcy5tb25pdG9yaW5nKSB7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcubGFtYmRhRHVyYXRpb25zV2lkZ2V0LmFkZExlZnRNZXRyaWMoZm4ubWV0cmljRHVyYXRpb24oKSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcubGFtYmRhSW52b2tlc1dpZGdldC5hZGRMZWZ0TWV0cmljKGZuLm1ldHJpY0ludm9jYXRpb25zKCkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmxhbWJkYUVycm9yc1dpZGdldC5hZGRMZWZ0TWV0cmljKGZuLm1ldHJpY0Vycm9ycygpKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5sYW1iZGFFcnJvcnNXaWRnZXQuYWRkTGVmdE1ldHJpYyhmbi5tZXRyaWNUaHJvdHRsZXMoKSk7XG4gICAgLy8gfVxuXG4gICAgY29uc3QgaGFzVmVyc2lvbkNvbmZpZyA9IGxhbWJkYU9wdGlvbnMuY3VycmVudFZlcnNpb25PcHRpb25zICE9IHVuZGVmaW5lZDtcblxuICAgIG9wZXJhdGlvblsneC1hbWF6b24tYXBpZ2F0ZXdheS1pbnRlZ3JhdGlvbiddID0ge1xuICAgICAgdHlwZTogJ2F3c19wcm94eScsXG4gICAgICBodHRwTWV0aG9kOiAnUE9TVCcsXG4gICAgICB1cmk6IGNkay5TdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgICByZXNvdXJjZTogJ3BhdGgnLFxuICAgICAgICBzZXJ2aWNlOiAnYXBpZ2F0ZXdheScsXG4gICAgICAgIGFjY291bnQ6ICdsYW1iZGEnLFxuICAgICAgICBhcm5Gb3JtYXQ6IGNkay5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiBgMjAxNS0wMy0zMS9mdW5jdGlvbnMvJHsoaGFzVmVyc2lvbkNvbmZpZyA/IGZuLmN1cnJlbnRWZXJzaW9uIDogZm4pLmZ1bmN0aW9uQXJufS9pbnZvY2F0aW9uc2AsXG4gICAgICAgIC8vICAgICAgICAgICAgIF5eXl5eXl5eXl4gLSBUSElTIE5FRURTIFRPIEJFIFRISVMgREFURS4gRVhBQ1RMWSFcbiAgICAgIH0pLFxuICAgICAgcGFzc3Rocm91Z2hCZWhhdmlvcjogJ3doZW5fbm9fdGVtcGxhdGVzJyxcbiAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiAnMS4wJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgcHJpdmF0ZSB0YWJsZVdyaXRlQWNjZXNzRm9yTWV0aG9kKG1ldGhvZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChtZXRob2QudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgIGNhc2UgJ3Bvc3QnOlxuICAgICAgY2FzZSAncHV0JzpcbiAgICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdvcHRpb25zJzpcbiAgICAgIGNhc2UgJ2dldCc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0cyB0aGUgYXV0aG9yaXplciBzZWN1cml0eSBzY2hlbWUgaW50byB0aGUgT3BlbkFQSSBzcGVjIGJhc2VkIG9uIHRoZVxuICAgKiBhdXRoZW50aWNhdGlvbiB0eXBlLCBwbGFjaW5nIGl0IHdoZXJlIEFQSSBHYXRld2F5IGV4cGVjdHMgaXQgZm9yIHRoZSBzcGVjXG4gICAqIHZlcnNpb246IGBjb21wb25lbnRzLnNlY3VyaXR5U2NoZW1lc2AgZm9yIE9wZW5BUEkgMy54LCBvciB0aGUgcm9vdFxuICAgKiBgc2VjdXJpdHlEZWZpbml0aW9uc2AgZm9yIFN3YWdnZXIgMi4wLiBBbiBhdXRob3JpemVyIHdyaXR0ZW4gdG8gdGhlIHdyb25nXG4gICAqIGxvY2F0aW9uIGlzIHNpbGVudGx5IGlnbm9yZWQgb24gaW1wb3J0LCBkZXBsb3lpbmcgYW4gdW5hdXRoZW50aWNhdGVkIEFQSS5cbiAgICpcbiAgICogRm9yIENvZ25pdG86IGFkZHMgYSBjb2duaXRvX3VzZXJfcG9vbHMgYXV0aG9yaXplciByZWZlcmVuY2luZyB0aGUgdXNlciBwb29sIEFSTi5cbiAgICogRm9yIEpXVDogY3JlYXRlcyBhIExhbWJkYSBhdXRob3JpemVyIGZ1bmN0aW9uIGFuZCBhZGRzIGEgdG9rZW4gYXV0aG9yaXplciByZWZlcmVuY2luZyBpdHMgQVJOLlxuICAgKi9cbiAgcHJvdGVjdGVkIHBhdGNoU2VjdXJpdHlTY2hlbWVzKHNwZWM6IE9wZW5BUEkzKSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1lcyA9IHRoaXMuc2VjdXJpdHlTY2hlbWVDb250YWluZXIoc3BlYyk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5hdXRoZW50aWNhdGlvbi5oYXNPd25Qcm9wZXJ0eSgndXNlcnBvb2wnKSkge1xuICAgICAgLy8gQ29nbml0byBVc2VyIFBvb2wgYXV0aG9yaXplclxuICAgICAgY29uc3QgY29nbml0b0F1dGggPSB0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIElDb2duaXRvQXV0aGVudGljYXRpb247XG4gICAgICBjb25zdCBhdXRob3JpemVyTmFtZSA9ICdDb2duaXRvQXV0aG9yaXplcic7XG5cbiAgICAgIHNjaGVtZXNbYXV0aG9yaXplck5hbWVdID0ge1xuICAgICAgICAndHlwZSc6ICdhcGlLZXknLFxuICAgICAgICAnbmFtZSc6ICdBdXRob3JpemF0aW9uJyxcbiAgICAgICAgJ2luJzogJ2hlYWRlcicsXG4gICAgICAgICd4LWFtYXpvbi1hcGlnYXRld2F5LWF1dGh0eXBlJzogJ2NvZ25pdG9fdXNlcl9wb29scycsXG4gICAgICAgICd4LWFtYXpvbi1hcGlnYXRld2F5LWF1dGhvcml6ZXInOiB7XG4gICAgICAgICAgdHlwZTogJ2NvZ25pdG9fdXNlcl9wb29scycsXG4gICAgICAgICAgcHJvdmlkZXJBUk5zOiBbY29nbml0b0F1dGgudXNlcnBvb2wudXNlclBvb2xBcm5dLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gUmVzb2x2ZSBnbG9iYWwgYXV0aG9yaXphdGlvbiBzY29wZXMgZm9yIHRoZSBDb2duaXRvIGF1dGhvcml6ZXIuXG4gICAgICAvLyBXaGVuIHNjb3BlcyBhcmUgcHJlc2VudCwgQVBJIEdhdGV3YXkgdmFsaWRhdGVzIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIGNoZWNrc1xuICAgICAgLy8gdGhlIHRva2VuIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBvZiB0aGUgbGlzdGVkIHNjb3Blcy4gQW4gZW1wdHkgYXJyYXkgbWVhbnNcbiAgICAgIC8vIG5vIHNjb3BlcyBhcmUgcmVxdWlyZWQgYW5kIEFQSSBHYXRld2F5IHZhbGlkYXRlcyB0aGUgSUQgdG9rZW4gaW5zdGVhZC5cbiAgICAgIGNvbnN0IGdsb2JhbFNjb3BlcyA9IHRoaXMucHJvcHMuYXV0aG9yaXphdGlvblNjb3BlcyA/PyBbJ29wZW5pZCddO1xuXG4gICAgICAvLyBFbnN1cmUgZ2xvYmFsIHNlY3VyaXR5IHJlZmVyZW5jZXMgdGhlIGF1dGhvcml6ZXIgc28gcGF0Y2hTZWN1cml0eSBkaXN0cmlidXRlcyBpdFxuICAgICAgaWYgKCFzcGVjLnNlY3VyaXR5KSB7XG4gICAgICAgIHNwZWMuc2VjdXJpdHkgPSBbeyBbYXV0aG9yaXplck5hbWVdOiBnbG9iYWxTY29wZXMgfV07XG4gICAgICB9IGVsc2UgaWYgKGdsb2JhbFNjb3Blcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFRoZSBzcGVjIGFscmVhZHkgaGFzIGdsb2JhbCBzZWN1cml0eSBkZWZpbmVkIOKAlCBwYXRjaCB0aGUgYXV0aG9yaXplcidzIHNjb3Blc1xuICAgICAgICAvLyBzbyB0aGF0IHRoZSBjb25maWd1cmVkIHNjb3BlcyBhcmUgZGlzdHJpYnV0ZWQgdG8gYWxsIG9wZXJhdGlvbnMuXG4gICAgICAgIGZvciAoY29uc3QgcmVxdWlyZW1lbnQgb2Ygc3BlYy5zZWN1cml0eSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+KSB7XG4gICAgICAgICAgaWYgKGF1dGhvcml6ZXJOYW1lIGluIHJlcXVpcmVtZW50KSB7XG4gICAgICAgICAgICByZXF1aXJlbWVudFthdXRob3JpemVyTmFtZV0gPSBnbG9iYWxTY29wZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEpXVCAoTGFtYmRhKSBhdXRob3JpemVyXG4gICAgICBjb25zdCBqd3RBdXRoID0gdGhpcy5wcm9wcy5hdXRoZW50aWNhdGlvbiBhcyBJSnd0QXV0aGVudGljYXRpb247XG4gICAgICBjb25zdCBhdXRob3JpemVyTmFtZSA9ICdKd3RBdXRob3JpemVyJztcblxuICAgICAgY29uc3QgYXV0aG9yaXplckZuID0gbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMsICdKd3RBdXRob3JpemVyRm4nLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5wcm9wcy5zdGFnZU5hbWUsXG4gICAgICAgIGVudHJ5OiAnc3JjL2xhbWJkYS9yZXN0LWFwaS5qd3QtYXV0aG9yaXplci50cycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgWyR7dGhpcy5wcm9wcy5zdGFnZU5hbWV9XSBKV1QgQXV0aG9yaXplciBmb3IgJHt0aGlzLnByb3BzLmFwaU5hbWV9YCxcbiAgICAgICAgand0OiBqd3RBdXRoLFxuICAgICAgICBsYW1iZGFPcHRpb25zOiB0aGlzLnByb3BzLmxhbWJkYU9wdGlvbnMsXG4gICAgICAgIGxhbWJkYVRyYWNpbmc6IHRoaXMucHJvcHMubGFtYmRhVHJhY2luZyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhdXRob3JpemVyVXJpID0gY2RrLlN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICAgIHJlc291cmNlOiAncGF0aCcsXG4gICAgICAgIHNlcnZpY2U6ICdhcGlnYXRld2F5JyxcbiAgICAgICAgYWNjb3VudDogJ2xhbWJkYScsXG4gICAgICAgIGFybkZvcm1hdDogY2RrLkFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGAyMDE1LTAzLTMxL2Z1bmN0aW9ucy8ke2F1dGhvcml6ZXJGbi5mdW5jdGlvbkFybn0vaW52b2NhdGlvbnNgLFxuICAgICAgfSk7XG5cbiAgICAgIHNjaGVtZXNbYXV0aG9yaXplck5hbWVdID0ge1xuICAgICAgICAndHlwZSc6ICdhcGlLZXknLFxuICAgICAgICAnbmFtZSc6ICdBdXRob3JpemF0aW9uJyxcbiAgICAgICAgJ2luJzogJ2hlYWRlcicsXG4gICAgICAgICd4LWFtYXpvbi1hcGlnYXRld2F5LWF1dGh0eXBlJzogJ2N1c3RvbScsXG4gICAgICAgICd4LWFtYXpvbi1hcGlnYXRld2F5LWF1dGhvcml6ZXInOiB7XG4gICAgICAgICAgdHlwZTogdGhpcy5wcm9wcy5qd3RBdXRob3JpemVyVHlwZSA9PT0gJ3JlcXVlc3QnID8gJ3JlcXVlc3QnIDogJ3Rva2VuJyxcbiAgICAgICAgICBhdXRob3JpemVyVXJpOiBhdXRob3JpemVyVXJpLFxuICAgICAgICAgIGF1dGhvcml6ZXJSZXN1bHRUdGxJblNlY29uZHM6IHRoaXMucHJvcHMuand0QXV0aG9yaXplclR5cGUgPT09ICdyZXF1ZXN0JyA/IDAgOiAzMDAsXG4gICAgICAgICAgLi4uKHRoaXMucHJvcHMuand0QXV0aG9yaXplclR5cGUgIT09ICdyZXF1ZXN0JyAmJiB7XG4gICAgICAgICAgICBpZGVudGl0eVNvdXJjZTogJ21ldGhvZC5yZXF1ZXN0LmhlYWRlci5BdXRob3JpemF0aW9uJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBhdXRob3JpemVyIGZ1bmN0aW9uIHNvIHdlIGNhbiBncmFudCBwZXJtaXNzaW9uIGFmdGVyIHRoZSBTcGVjUmVzdEFwaSBpcyBjcmVhdGVkXG4gICAgICB0aGlzLl9hdXRob3JpemVyRm4gPSBhdXRob3JpemVyRm47XG5cbiAgICAgIC8vIEVuc3VyZSBnbG9iYWwgc2VjdXJpdHkgcmVmZXJlbmNlcyB0aGUgYXV0aG9yaXplciBzbyBwYXRjaFNlY3VyaXR5IGRpc3RyaWJ1dGVzIGl0XG4gICAgICBpZiAoIXNwZWMuc2VjdXJpdHkpIHtcbiAgICAgICAgc3BlYy5zZWN1cml0eSA9IFt7IFthdXRob3JpemVyTmFtZV06IFtdIH1dO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBzZWN1cml0eS1zY2hlbWUgY29udGFpbmVyIGZvciB0aGUgc3BlYywgY3JlYXRpbmcgaXQgaWYgbmVlZGVkLlxuICAgKiBPcGVuQVBJIDMueCBzdG9yZXMgc2NoZW1lcyB1bmRlciBgY29tcG9uZW50cy5zZWN1cml0eVNjaGVtZXNgOyBTd2FnZ2VyIDIuMFxuICAgKiB1c2VzIHRoZSByb290IGBzZWN1cml0eURlZmluaXRpb25zYC4gQVBJIEdhdGV3YXkgcmVhZHMgb25seSB0aGUgbG9jYXRpb24gdGhhdFxuICAgKiBtYXRjaGVzIHRoZSBkb2N1bWVudCdzIGRlY2xhcmVkIHZlcnNpb24sIHNvIHRoZSBhdXRob3JpemVyIG11c3QgZ28gdGhlcmUuXG4gICAqL1xuICBwcml2YXRlIHNlY3VyaXR5U2NoZW1lQ29udGFpbmVyKHNwZWM6IE9wZW5BUEkzKTogeyBbbmFtZTogc3RyaW5nXTogYW55IH0ge1xuICAgIGNvbnN0IHNwZWNBbnkgPSBzcGVjIGFzIGFueTtcbiAgICBjb25zdCBpc09wZW5BcGlWMyA9IHR5cGVvZiBzcGVjQW55Lm9wZW5hcGkgPT09ICdzdHJpbmcnICYmIHNwZWNBbnkub3BlbmFwaS5zdGFydHNXaXRoKCczJyk7XG4gICAgaWYgKGlzT3BlbkFwaVYzKSB7XG4gICAgICBzcGVjQW55LmNvbXBvbmVudHMgPSBzcGVjQW55LmNvbXBvbmVudHMgPz8ge307XG4gICAgICBzcGVjQW55LmNvbXBvbmVudHMuc2VjdXJpdHlTY2hlbWVzID0gc3BlY0FueS5jb21wb25lbnRzLnNlY3VyaXR5U2NoZW1lcyA/PyB7fTtcbiAgICAgIHJldHVybiBzcGVjQW55LmNvbXBvbmVudHMuc2VjdXJpdHlTY2hlbWVzO1xuICAgIH1cbiAgICBzcGVjQW55LnNlY3VyaXR5RGVmaW5pdGlvbnMgPSBzcGVjQW55LnNlY3VyaXR5RGVmaW5pdGlvbnMgPz8ge307XG4gICAgcmV0dXJuIHNwZWNBbnkuc2VjdXJpdHlEZWZpbml0aW9ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBBV1MgZG9lcyBub3QgcHJvcGVybHkgYXBwbHkgdGhlICdzZWN1cml0eScgb3B0aW9uIHRvIGV2ZXJ5IHNpbmdsZSBwYXRoLW1ldGhvZC5cbiAgICogQWNjb3JkaW5nIHRvIGRvY3VtZW50YXRpb24sIGdsb2JhbCBzZWN1cml0eSBnZXRzIGFwcGxpZWQsIGlmIHRoZXJlIGlzIG5vIHNlY3VyaXR5XG4gICAqIHNldCBmb3IgdGhlIHBhcnRpY3VsYXIgcGF0aC1tZXRob2QuIElmIHRoZXJlIGlzIGFueSwgZXZlbiBlbXB0eSwgaXQgd2lsbCBnZXQgcHJlY2VkZW5jZS5cbiAgICogVEhJUyBET0VTIE5PVCBIQVBQRU4gT04gQVdTLiBJVCBKVVNUIEFMV0FZUyBVU0VTIFRIRSBHTE9CQUwgU0VUVElORyFcbiAgICpcbiAgICogJ3NlY3VyaXR5IGFwcGxpZXMgWy4uLl0gc2NoZW1lcyBnbG9iYWxseSB0byBhbGwgQVBJIG9wZXJhdGlvbnMsIHVubGVzcyBvdmVycmlkZGVuIG9uIHRoZSBvcGVyYXRpb24gbGV2ZWwnXG4gICAqIEBzZWUgaHR0cHM6Ly9zd2FnZ2VyLmlvL2RvY3Mvc3BlY2lmaWNhdGlvbi9hdXRoZW50aWNhdGlvbi9cbiAgICovXG4gIHByb3RlY3RlZCBwYXRjaFNlY3VyaXR5KHNwZWM6IE9wZW5BUEkzKSB7XG4gICAgaWYgKCdzZWN1cml0eScgaW4gc3BlYykge1xuICAgICAgLy8gUmVzb2x2ZSBwZXItb3BlcmF0aW9uIHNjb3BlIG92ZXJyaWRlcyBmcm9tIHRoZSBkZWRpY2F0ZWQgcHJvcC5cbiAgICAgIGNvbnN0IHBlck9wZXJhdGlvblNjb3BlczogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+IHwgdW5kZWZpbmVkID1cbiAgICAgICAgdGhpcy5wcm9wcy5hdXRob3JpemF0aW9uU2NvcGVzQnlPcGVyYXRpb25cbiAgICAgICAgICA/IHRoaXMucHJvcHMuYXV0aG9yaXphdGlvblNjb3Blc0J5T3BlcmF0aW9uIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPlxuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBmb3IgKGNvbnN0IHNwZWNQYXRoIG9mIE9iamVjdC52YWx1ZXMoc3BlYy5wYXRocyB8fCBbXSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3BlY1BhdGgpIHtcbiAgICAgICAgICBpZiAoIXRoaXMuYXBpTWV0aG9kcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgICBjb250aW51ZTsgLy8gU2tpcCBpZiBub3QgaHR0cCBtZXRob2QgZGVmaW5pdGlvblxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNwZWNNZXRob2QgPSAoc3BlY1BhdGggYXMgUGF0aEl0ZW1PYmplY3QpW2tleSBhcyBrZXlvZiBQYXRoSXRlbU9iamVjdF0hO1xuICAgICAgICAgIGlmICghKCdzZWN1cml0eScgaW4gc3BlY01ldGhvZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gKHNwZWNNZXRob2QgYXMgT3BlcmF0aW9uT2JqZWN0KS5vcGVyYXRpb25JZDtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb25JZCAmJiB0aGlzLl9hbm9ueW1vdXNPcGVyYXRpb25zLmhhcyhvcGVyYXRpb25JZCkpIHtcbiAgICAgICAgICAgICAgLy8gU3RvcmUgd2hhdCBzZWN1cml0eSB3b3VsZCBoYXZlIGJlZW4gYXBwbGllZCBzbyB3ZSBjYW4gcmVzdG9yZSBsYXRlclxuICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE9wZXJhdGlvblNlY3VyaXR5LnNldChvcGVyYXRpb25JZCwgc3BlYy5zZWN1cml0eSBhcyBhbnlbXSk7XG4gICAgICAgICAgICAgIHNwZWNNZXRob2Quc2VjdXJpdHkgPSBbXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIEFwcGx5IHBlci1vcGVyYXRpb24gc2NvcGUgb3ZlcnJpZGUgaWYgY29uZmlndXJlZFxuICAgICAgICAgICAgICBjb25zdCBvcGVyYXRpb25TZWN1cml0eSA9IHRoaXMuYXBwbHlPcGVyYXRpb25TY29wZXMoXG4gICAgICAgICAgICAgICAgc3BlYy5zZWN1cml0eSBhcyBhbnlbXSxcbiAgICAgICAgICAgICAgICBvcGVyYXRpb25JZCxcbiAgICAgICAgICAgICAgICBwZXJPcGVyYXRpb25TY29wZXMsXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIHNwZWNNZXRob2Quc2VjdXJpdHkgPSBvcGVyYXRpb25TZWN1cml0eTtcbiAgICAgICAgICAgICAgaWYgKG9wZXJhdGlvbklkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxPcGVyYXRpb25TZWN1cml0eS5zZXQob3BlcmF0aW9uSWQsIG9wZXJhdGlvblNlY3VyaXR5KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBPcGVyYXRpb24gYWxyZWFkeSBoYXMgZXhwbGljaXQgc2VjdXJpdHkgZGVmaW5lZCBpbiB0aGUgc3BlY1xuICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uSWQgPSAoc3BlY01ldGhvZCBhcyBPcGVyYXRpb25PYmplY3QpLm9wZXJhdGlvbklkO1xuICAgICAgICAgICAgaWYgKG9wZXJhdGlvbklkKSB7XG4gICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsT3BlcmF0aW9uU2VjdXJpdHkuc2V0KG9wZXJhdGlvbklkLCBzcGVjTWV0aG9kLnNlY3VyaXR5IGFzIGFueVtdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBzcGVjLnNlY3VyaXR5O1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHBlci1vcGVyYXRpb24gc2NvcGUgb3ZlcnJpZGVzIHRvIGEgc2VjdXJpdHkgcmVxdWlyZW1lbnQgYXJyYXkuXG4gICAqIElmIHRoZSBvcGVyYXRpb24gaGFzIGEgc3BlY2lmaWMgc2NvcGUgb3ZlcnJpZGUgaW4gdGhlIG1hcCwgdGhlIGF1dGhvcml6ZXInc1xuICAgKiBzY29wZSBsaXN0IGlzIHJlcGxhY2VkIHdpdGggdGhlIG92ZXJyaWRlLiBPdGhlcndpc2UgdGhlIGdsb2JhbCBzZWN1cml0eSBpcyB1c2VkIGFzLWlzLlxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseU9wZXJhdGlvblNjb3BlcyhcbiAgICBnbG9iYWxTZWN1cml0eTogYW55W10sXG4gICAgb3BlcmF0aW9uSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICBwZXJPcGVyYXRpb25TY29wZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZCxcbiAgKTogYW55W10ge1xuICAgIGlmICghb3BlcmF0aW9uSWQgfHwgIXBlck9wZXJhdGlvblNjb3BlcyB8fCAhKG9wZXJhdGlvbklkIGluIHBlck9wZXJhdGlvblNjb3BlcykpIHtcbiAgICAgIHJldHVybiBnbG9iYWxTZWN1cml0eTtcbiAgICB9XG5cbiAgICBjb25zdCBzY29wZXMgPSBwZXJPcGVyYXRpb25TY29wZXNbb3BlcmF0aW9uSWRdO1xuICAgIC8vIENsb25lIHRoZSBnbG9iYWwgc2VjdXJpdHkgYW5kIHJlcGxhY2UgdGhlIGF1dGhvcml6ZXIgc2NvcGVzXG4gICAgcmV0dXJuIGdsb2JhbFNlY3VyaXR5Lm1hcCgocmVxdWlyZW1lbnQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPikgPT4ge1xuICAgICAgY29uc3QgcGF0Y2hlZDogUmVjb3JkPHN0cmluZywgc3RyaW5nW10+ID0ge307XG4gICAgICBmb3IgKGNvbnN0IFthdXRoTmFtZSwgX2F1dGhTY29wZXNdIG9mIE9iamVjdC5lbnRyaWVzKHJlcXVpcmVtZW50KSkge1xuICAgICAgICBwYXRjaGVkW2F1dGhOYW1lXSA9IHNjb3BlcztcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXRjaGVkO1xuICAgIH0pO1xuICB9XG5cbn1cbiJdfQ==
788
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzdC1hcGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY29uc3RydWN0cy9yZXN0LWFwaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw0Q0FBOEI7QUFDOUIsNkNBTXFCO0FBQ3JCLGlEQUFtQztBQUVuQyw4Q0FBZ0M7QUFHaEMseUNBQW1EO0FBQ25ELGlDQUF1RDtBQUN2RCx5Q0FBcUM7QUFDckMseURBQW9EO0FBQ3BELCtDQUF3RztBQTROeEc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBYSxPQUFvQixTQUFRLGtCQUFPO0lBK0M5Qzs7Ozs7O09BTUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFVLEtBQXdCO1FBQ3hFLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRHdCLFVBQUssR0FBTCxLQUFLLENBQW1CO1FBMUMxRTs7O1dBR0c7UUFDSyxlQUFVLEdBQThDLEVBQUUsQ0FBQztRQUVsRCxlQUFVLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQWUzRjs7O1dBR0c7UUFDSyx5QkFBb0IsR0FBZ0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUV0RDs7Ozs7V0FLRztRQUNLLCtCQUEwQixHQUF1QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBWWpFLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFhLENBQUM7UUFFM0YsSUFBSSxnQkFBOEQsQ0FBQztRQUNuRSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNqQixnQkFBZ0IsR0FBRztnQkFD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LENBQUMsUUFBUSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLG9CQUFvQixDQUMxQixjQUFxQixFQUNyQixXQUErQixFQUMvQixrQkFBd0Q7UUFFeEQsSUFBSSxDQUFDLFdBQVcsSUFBSSxDQUFDLGtCQUFrQixJQUFJLENBQUMsQ0FBQyxXQUFXLElBQUksa0JBQWtCLENBQUMsRUFBRSxDQUFDO1lBQ2hGLE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUMvQyw4REFBOEQ7UUFDOUQsT0FBTyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsV0FBcUMsRUFBRSxFQUFFO1lBQ2xFLE1BQU0sT0FBTyxHQUE2QixFQUFFLENBQUM7WUFDN0MsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztnQkFDbEUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUM3QixDQUFDO1lBQ0QsT0FBTyxPQUFPLENBQUM7UUFDakIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBRUY7QUFuekJELDBCQW16QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7XG4gIGF3c19jZXJ0aWZpY2F0ZW1hbmFnZXIsXG4gIGF3c19pYW0sXG4gIGF3c19yb3V0ZTUzLFxuICBhd3Nfcm91dGU1M190YXJnZXRzLFxuICBhd3NfYXBpZ2F0ZXdheSxcbn0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB7IENvbnN0cnVjdCB9IGZyb20gJ2NvbnN0cnVjdHMnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICdqcy15YW1sJztcbmltcG9ydCB7IE9wZW5BUEkzLCBPcGVyYXRpb25PYmplY3QsIFBhdGhJdGVtT2JqZWN0IH0gZnJvbSAnb3BlbmFwaS10eXBlc2NyaXB0JztcbmltcG9ydCB7IENvZ25pdG9BdXRoZW50aWNhdGlvbiwgSUNvZ25pdG9BdXRoZW50aWNhdGlvbiwgSUp3dEF1dGhlbnRpY2F0aW9uIH0gZnJvbSAnLi9hdXRoZW50aWNhdGlvbic7XG5pbXBvcnQgeyBCYXNlQXBpLCBCYXNlQXBpUHJvcHMgfSBmcm9tICcuL2Jhc2UtYXBpJztcbmltcG9ydCB7IExhbWJkYUZ1bmN0aW9uLCBMYW1iZGFPcHRpb25zIH0gZnJvbSAnLi9mdW5jJztcbmltcG9ydCB7IE1jcEF1dGggfSBmcm9tICcuL21jcC1hdXRoJztcbmltcG9ydCB7IE1jcENvZ25pdG9BdXRoIH0gZnJvbSAnLi9tY3AtY29nbml0by1hdXRoJztcbmltcG9ydCB7IENGTl9PVVRQVVRfU1VGRklYX1JFU1RBUElfRE9NQUlOTkFNRSwgQ0ZOX09VVFBVVF9TVUZGSVhfUkVTVEFQSV9VUkwgfSBmcm9tICcuLi9zaGFyZWQvb3V0cHV0cyc7XG5cbi8qKlxuICogQ29nbml0by1zcGVjaWZpYyBNQ1AgYXV0aCBjb25maWd1cmF0aW9uLlxuICogQ3JlYXRlcyBhIGRlZGljYXRlZCB1c2VyIHBvb2wgY2xpZW50IGZvciBNQ1AgY29ubmVjdG9ycyBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1jcEF1dGhDb2duaXRvT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgQ29nbml0b0F1dGhlbnRpY2F0aW9uIGNvbnN0cnVjdCBtYW5hZ2luZyB0aGUgdXNlciBwb29sLlxuICAgKiBBIGRlZGljYXRlZCBjbGllbnQgd2l0aCBhdXRoIGNvZGUgKyBQS0NFIHdpbGwgYmUgY3JlYXRlZC5cbiAgICovXG4gIHJlYWRvbmx5IGF1dGg6IENvZ25pdG9BdXRoZW50aWNhdGlvbjtcblxuICAvKipcbiAgICogVGhlIENvZ25pdG8gYXV0aCBkb21haW4gKGN1c3RvbSBvciBDb2duaXRvLWhvc3RlZCkuXG4gICAqIFJlcXVpcmVkIOKAlCBuZXZlciBpbmZlcnJlZCBmcm9tIGFwaURvbWFpbi5cbiAgICogRXhhbXBsZTogJ2F1dGguZXhhbXBsZS5jb20nXG4gICAqL1xuICByZWFkb25seSBhdXRoRG9tYWluOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBJRCBmb3IgdGhlIHVzZXIgcG9vbCBjbGllbnQgKGFmZmVjdHMgQ2xvdWRGb3JtYXRpb24gbG9naWNhbCBJRCkuXG4gICAqIEBkZWZhdWx0ICdtY3BDb25uZWN0b3InXG4gICAqL1xuICByZWFkb25seSBjbGllbnRDb25zdHJ1Y3RJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBPQXV0aCBjYWxsYmFjayBVUkxzIGZvciB0aGUgQ29nbml0byBjbGllbnQgYmV5b25kIHRoZSBhbGxvd2VkUmVkaXJlY3RVcmlzLlxuICAgKi9cbiAgcmVhZG9ubHkgYWRkaXRpb25hbENhbGxiYWNrVXJscz86IHN0cmluZ1tdO1xufVxuXG4vKipcbiAqIEdlbmVyaWMgKG5vbi1Db2duaXRvKSBNQ1AgYXV0aCBjb25maWd1cmF0aW9uLlxuICogUmVxdWlyZXMgZXhwbGljaXQgYXV0aG9yaXplIGFuZCB0b2tlbiBlbmRwb2ludCBVUkxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1jcEF1dGhHZW5lcmljT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgdXBzdHJlYW0gT0F1dGggYXV0aG9yaXplIGVuZHBvaW50IFVSTC5cbiAgICogRXhhbXBsZTogJ2h0dHBzOi8vYXV0aC5leGFtcGxlLmNvbS9vYXV0aDIvYXV0aG9yaXplJ1xuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaXplRW5kcG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHVwc3RyZWFtIE9BdXRoIHRva2VuIGVuZHBvaW50IFVSTC5cbiAgICogRXhhbXBsZTogJ2h0dHBzOi8vYXV0aC5leGFtcGxlLmNvbS9vYXV0aDIvdG9rZW4nXG4gICAqL1xuICByZWFkb25seSB0b2tlbkVuZHBvaW50OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwcmUtcHJvdmlzaW9uZWQgT0F1dGggY2xpZW50IElEIHJldHVybmVkIGJ5IHRoZSByZWdpc3RlciBlbmRwb2ludC5cbiAgICovXG4gIHJlYWRvbmx5IGNsaWVudElkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogTUNQIGF1dGggY29uZmlndXJhdGlvbiBmb3IgdGhlIFJlc3RBcGkuXG4gKiBQcm92aWRlIGVpdGhlciBgY29nbml0b2AgKGZvciBDb2duaXRvLWJhY2tlZCBhdXRoKSBvciBgZ2VuZXJpY2AgKGZvciBhbnkgT0F1dGgyIHByb3ZpZGVyKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNY3BBdXRoT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBDb2duaXRvLXNwZWNpZmljIGNvbmZpZ3VyYXRpb24uIE11dHVhbGx5IGV4Y2x1c2l2ZSB3aXRoIGBnZW5lcmljYC5cbiAgICogQ3JlYXRlcyBhIHVzZXIgcG9vbCBjbGllbnQgYW5kIGRlcml2ZXMgZW5kcG9pbnRzIGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICByZWFkb25seSBjb2duaXRvPzogTWNwQXV0aENvZ25pdG9PcHRpb25zO1xuXG4gIC8qKlxuICAgKiBHZW5lcmljIE9BdXRoMiBwcm92aWRlciBjb25maWd1cmF0aW9uLiBNdXR1YWxseSBleGNsdXNpdmUgd2l0aCBgY29nbml0b2AuXG4gICAqIFJlcXVpcmVzIGV4cGxpY2l0IGVuZHBvaW50IFVSTHMgYW5kIGNsaWVudCBJRC5cbiAgICovXG4gIHJlYWRvbmx5IGdlbmVyaWM/OiBNY3BBdXRoR2VuZXJpY09wdGlvbnM7XG5cbiAgLyoqXG4gICAqIE1DUCBzZXJ2ZXIgaW5mbyByZXR1cm5lZCBpbiB0aGUgJ2luaXRpYWxpemUnIHJlc3BvbnNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVySW5mbzogeyByZWFkb25seSBuYW1lOiBzdHJpbmc7IHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBBbGxvd2VkIHJlZGlyZWN0IFVSSXMgZm9yIGR5bmFtaWMgY2xpZW50IHJlZ2lzdHJhdGlvbi5cbiAgICogQGRlZmF1bHQgWydodHRwczovL2NsYXVkZS5haS9vYXV0aC9jYWxsYmFjaycsICdodHRwczovL2NsYXVkZS5haS9hcGkvbWNwL2F1dGhfY2FsbGJhY2snLCAnaHR0cHM6Ly9jaGF0Z3B0LmNvbS9vYXV0aC9jYWxsYmFjayddXG4gICAqL1xuICByZWFkb25seSBhbGxvd2VkUmVkaXJlY3RVcmlzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFN1cHBvcnRlZCBNQ1AgcHJvdG9jb2wgdmVyc2lvbnMgKG5ld2VzdCBmaXJzdCkuXG4gICAqIEBkZWZhdWx0IFsnMjAyNS0xMS0yNScsICcyMDI1LTAzLTI2JywgJzIwMjQtMTEtMDUnXVxuICAgKi9cbiAgcmVhZG9ubHkgcHJvdG9jb2xWZXJzaW9ucz86IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBPQXV0aCBzY29wZXMgdG8gYWR2ZXJ0aXNlIGluIGRpc2NvdmVyeSBtZXRhZGF0YS5cbiAgICogQGRlZmF1bHQgWydvcGVuaWQnLCAnZW1haWwnLCAncHJvZmlsZSddXG4gICAqL1xuICByZWFkb25seSBzY29wZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUGFyYW1ldGVycyB0byBzdHJpcCBmcm9tIGF1dGhvcml6ZS90b2tlbiBwcm94eSByZXF1ZXN0cy5cbiAgICogQGRlZmF1bHQgWydyZXNvdXJjZSddXG4gICAqL1xuICByZWFkb25seSBzdHJpcFBhcmFtZXRlcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogTGFtYmRhIGZ1bmN0aW9uIG9wdGlvbnMgZm9yIE1DUCBhdXRoIGhhbmRsZXJzLlxuICAgKi9cbiAgcmVhZG9ubHkgbGFtYmRhT3B0aW9ucz86IExhbWJkYU9wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVzdEFwaVByb3BzPE9QUz4gZXh0ZW5kcyBCYXNlQXBpUHJvcHMge1xuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSByb3V0ZXMgZm9yIGFsbCBlbmRwb2ludHMgY29uZmlndXJlZCBpbiB0aGUgb3BlbmFwaS55YW1sIGZpbGVcbiAgICpcbiAgICogQGRlZmF1bHQgdHJ1ZVxuICAgKi9cbiAgYXV0b0dlbmVyYXRlUm91dGVzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogY3VzdG9tIG9wdGlvbnMgZm9yIHRoZSBjcmVhdGVkIEh0dHBBcGlcbiAgICpcbiAgICogQGRlZmF1bHQgLVxuICAgKi9cbiAgcmVzdEFwaVByb3BzPzogYXdzX2FwaWdhdGV3YXkuUmVzdEFwaUJhc2VQcm9wcztcblxuICAvKipcbiAgICogYWRkaXRpb25hbCBvcHRpb25zIGZvciB0aGUgdW5kZXJseWluZyBMYW1iZGEgZnVuY3Rpb24gY29uc3RydWN0IHBlciBvcGVyYXRpb25JZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtXG4gICAqL1xuICBsYW1iZGFPcHRpb25zQnlPcGVyYXRpb24/OiB7IFtvcGVyYXRpb25JZCBpbiBrZXlvZiBPUFNdPzogTGFtYmRhT3B0aW9ucyB9O1xuXG4gIGRlZmluaXRpb25GaWxlTmFtZTogc3RyaW5nO1xuXG4gIGNvcnM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBvcGVyYXRpb24gSURzIHRoYXQgc2hvdWxkIHNraXAgdGhlIGF1dGhvcml6ZXIgZW50aXJlbHkuXG4gICAqIFRoZXNlIG9wZXJhdGlvbnMgd2lsbCBoYXZlIGBzZWN1cml0eTogW11gIGluIHRoZSBPcGVuQVBJIHNwZWMsIG1lYW5pbmdcbiAgICogdGhleSBhcmUgcHVibGljbHkgYWNjZXNzaWJsZSB3aXRob3V0IGF1dGhlbnRpY2F0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIG5vIGFub255bW91cyBvcGVyYXRpb25zXG4gICAqL1xuICBhbm9ueW1vdXNPcGVyYXRpb25zPzogKGtleW9mIE9QUylbXTtcblxuICAvKipcbiAgICogQ29udHJvbHMgd2hldGhlciB0aGUgSldUIExhbWJkYSBhdXRob3JpemVyIHVzZXMgdGhlIFRPS0VOIG9yIFJFUVVFU1QgdHlwZS5cbiAgICpcbiAgICogKip0b2tlbiAoZGVmYXVsdCk6KiogVGhlIEFQSSBHYXRld2F5IHZhbGlkYXRlcyB0aGF0IHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBpcyBwcmVzZW50XG4gICAqIGJlZm9yZSBpbnZva2luZyB0aGUgTGFtYmRhIGF1dGhvcml6ZXIuIElmIHRoZSBoZWFkZXIgaXMgbWlzc2luZywgQVBJIEdhdGV3YXkgaW1tZWRpYXRlbHlcbiAgICogcmV0dXJucyA0MDEgd2l0aG91dCBpbnZva2luZyB0aGUgTGFtYmRhLiBUaGlzIGlzIGNoZWFwZXIgZm9yIHVuYXV0aGVudGljYXRlZCByZXF1ZXN0c1xuICAgKiBiZWNhdXNlIG5vIExhbWJkYSBpbnZvY2F0aW9uIG9jY3VycywgYnV0IGl0IGRvZXMgbm90IHN1cHBvcnQgb3B0aW9uYWwgYXV0aGVudGljYXRpb25cbiAgICogKGV2ZXJ5IHJlcXVlc3QgbXVzdCBjYXJyeSBhIHRva2VuIG9yIGJlIHJlamVjdGVkKS5cbiAgICpcbiAgICogKipyZXF1ZXN0OioqIFRoZSBBUEkgR2F0ZXdheSBhbHdheXMgaW52b2tlcyB0aGUgTGFtYmRhIGF1dGhvcml6ZXIgcmVnYXJkbGVzcyBvZiB3aGV0aGVyXG4gICAqIHRoZSBBdXRob3JpemF0aW9uIGhlYWRlciBpcyBwcmVzZW50LiBUaGlzIGVuYWJsZXMgb3B0aW9uYWwgYXV0aGVudGljYXRpb246IHRoZSBMYW1iZGFcbiAgICogY2FuIGluc3BlY3QgdGhlIHJlcXVlc3QsIHJldHVybiBBbGxvdyB3aXRoIGFuIGFub255bW91cyBwcmluY2lwYWwgd2hlbiBubyB0b2tlbiBpc1xuICAgKiBwcm92aWRlZCwgYW5kIHJldHVybiBBbGxvdyB3aXRoIHVzZXIgY2xhaW1zIHdoZW4gYSB2YWxpZCB0b2tlbiBpcyBwcmVzZW50LiBUaGUgdHJhZGUtb2ZmXG4gICAqIGlzIHRoYXQgeW91IHBheSBmb3IgYSBMYW1iZGEgaW52b2NhdGlvbiBvbiBldmVyeSByZXF1ZXN0LCBpbmNsdWRpbmcgdW5hdXRoZW50aWNhdGVkIG9uZXMuXG4gICAqXG4gICAqIFVzZSAncmVxdWVzdCcgd2hlbiB5b3UgbmVlZCBlbmRwb2ludHMgdGhhdCBiZWhhdmUgZGlmZmVyZW50bHkgZm9yIGF1dGhlbnRpY2F0ZWQgdnNcbiAgICogYW5vbnltb3VzIHVzZXJzIChlLmcuLCBwZXJzb25hbGl6ZWQgcmVzcG9uc2VzIGZvciBsb2dnZWQtaW4gdXNlcnMsIGdlbmVyaWMgcmVzcG9uc2VzXG4gICAqIGZvciBndWVzdHMpIHdpdGhvdXQgc3BsaXR0aW5nIHRoZW0gaW50byBzZXBhcmF0ZSBvcGVyYXRpb25zLlxuICAgKlxuICAgKiBAZGVmYXVsdCAndG9rZW4nXG4gICAqL1xuICBqd3RBdXRob3JpemVyVHlwZT86ICd0b2tlbicgfCAncmVxdWVzdCc7XG5cbiAgLyoqXG4gICAqIE1DUCBBdXRoIGNvbmZpZ3VyYXRpb24gdG8gd2lyZSBpbnRvIHRoaXMgQVBJLlxuICAgKiBXaGVuIHByb3ZpZGVkLCB0aGUgZm9sbG93aW5nIHBhdGhzIGFyZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvIHRoZSBPcGVuQVBJIHNwZWNcbiAgICogd2l0aCBMYW1iZGEgcHJveHkgaW50ZWdyYXRpb25zOlxuICAgKlxuICAgKiAtIEdFVCAgLy53ZWxsLWtub3duL29hdXRoLXByb3RlY3RlZC1yZXNvdXJjZVxuICAgKiAtIEdFVCAgLy53ZWxsLWtub3duL29hdXRoLWF1dGhvcml6YXRpb24tc2VydmVyXG4gICAqIC0gR0VUICAvb2F1dGgvYXV0aG9yaXplXG4gICAqIC0gUE9TVCAvb2F1dGgvdG9rZW5cbiAgICogLSBQT1NUIC9vYXV0aC9yZWdpc3RlclxuICAgKlxuICAgKiBBbGwgTUNQIGF1dGggZW5kcG9pbnRzIGFyZSBhbm9ueW1vdXMgKG5vIGF1dGhvcml6ZXIpLlxuICAgKiBUaGUgQVBJIGRvbWFpbiBpcyBkZXJpdmVkIGZyb20gdGhlIFJlc3RBcGkncyBvd24gZG9tYWluIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFByb3ZpZGUgZWl0aGVyIGBjb2duaXRvYCAoY3JlYXRlcyBhIENvZ25pdG8gY2xpZW50IGF1dG9tYXRpY2FsbHkpIG9yXG4gICAqIGBnZW5lcmljYCAoZm9yIGFueSBPQXV0aDIgcHJvdmlkZXIgd2l0aCBleHBsaWNpdCBlbmRwb2ludCBVUkxzKS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBubyBNQ1AgYXV0aFxuICAgKi9cbiAgbWNwQXV0aD86IE1jcEF1dGhPcHRpb25zO1xuXG4gIC8qKlxuICAgKiBHbG9iYWwgT0F1dGgyIHNjb3BlcyByZXF1aXJlZCBieSB0aGUgQ29nbml0byBhdXRob3JpemVyLlxuICAgKlxuICAgKiBXaGVuIHNjb3BlcyBhcmUgcHJlc2VudCwgQVBJIEdhdGV3YXkgdmFsaWRhdGVzIHRoZSAqKmFjY2VzcyB0b2tlbioqIGFuZCBjaGVja3NcbiAgICogdGhhdCBpdCBjb250YWlucyBhdCBsZWFzdCBvbmUgb2YgdGhlIHNwZWNpZmllZCBzY29wZXMuIEFuIGVtcHR5IGFycmF5IG1lYW5zIG5vXG4gICAqIHNjb3BlcyBhcmUgcmVxdWlyZWQ7IEFQSSBHYXRld2F5IHRoZW4gdmFsaWRhdGVzIHRoZSAqKklEIHRva2VuKiogaW5zdGVhZCxcbiAgICogcmVqZWN0aW5nIGFjY2VzcyB0b2tlbnMgd2l0aCBhIDQwMS5cbiAgICpcbiAgICogVXNlIHBlci1vcGVyYXRpb24gb3ZlcnJpZGVzIHZpYSBgYXV0aG9yaXphdGlvblNjb3Blc0J5T3BlcmF0aW9uYCB0byBzZXRcbiAgICogZGlmZmVyZW50IHNjb3BlcyBvbiBpbmRpdmlkdWFsIG9wZXJhdGlvbnMuXG4gICAqXG4gICAqIEBkZWZhdWx0IFsnb3BlbmlkJ11cbiAgICovXG4gIGF1dGhvcml6YXRpb25TY29wZXM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogUGVyLW9wZXJhdGlvbiBPQXV0aDIgc2NvcGUgb3ZlcnJpZGVzIGZvciB0aGUgQ29nbml0byBhdXRob3JpemVyLlxuICAgKlxuICAgKiBPcGVyYXRpb25zIGxpc3RlZCBoZXJlIHVzZSB0aGUgc3BlY2lmaWVkIHNjb3BlcyBpbnN0ZWFkIG9mIHRoZSBnbG9iYWxcbiAgICogYGF1dGhvcml6YXRpb25TY29wZXNgIGRlZmF1bHQuIE9wZXJhdGlvbnMgbm90IGxpc3RlZCBmYWxsIGJhY2sgdG8gdGhlXG4gICAqIGdsb2JhbCBkZWZhdWx0LlxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKiBhdXRob3JpemF0aW9uU2NvcGVzQnlPcGVyYXRpb246IHtcbiAgICogICBjcmVhdGVJdGVtOiBbJ29wZW5pZCcsICdpdGVtczp3cml0ZSddLFxuICAgKiAgIGRlbGV0ZUl0ZW06IFsnb3BlbmlkJywgJ2l0ZW1zOmRlbGV0ZSddLFxuICAgKiB9XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm8gcGVyLW9wZXJhdGlvbiBvdmVycmlkZXM7IGFsbCBvcGVyYXRpb25zIHVzZSBhdXRob3JpemF0aW9uU2NvcGVzXG4gICAqL1xuICBhdXRob3JpemF0aW9uU2NvcGVzQnlPcGVyYXRpb24/OiB7IFtvcGVyYXRpb25JZCBpbiBrZXlvZiBPUFNdPzogc3RyaW5nW10gfTtcbn1cblxuLyoqXG4gKiBUaGUgUmVzdEFwaSBjb25zdHJ1Y3Qgc2V0cyB1cCBhbiBBV1MgQVBJIEdhdGV3YXkgUkVTVCBBUEkgdXNpbmcgT3BlbkFQSSBzcGVjaWZpY2F0aW9uLlxuICogVGhpcyBjb25zdHJ1Y3QgZmFjaWxpdGF0ZXMgdGhlIGNyZWF0aW9uIG9mIGEgUkVTVCBBUEkgd2l0aCB2YXJpb3VzIGNvbmZpZ3VyYXRpb25zLCBpbmNsdWRpbmcgY3VzdG9tIGRvbWFpbiwgQ09SUyBzdXBwb3J0LCBhbmQgaW50ZWdyYXRpb24gd2l0aCBMYW1iZGEgZnVuY3Rpb25zLlxuICogSXQgYWxsb3dzIGF1dG8tZ2VuZXJhdGluZyByb3V0ZXMgYmFzZWQgb24gdGhlIHByb3ZpZGVkIE9wZW5BUEkgZGVmaW5pdGlvbiBhbmQgcHJvdmlkZXMgbWV0aG9kcyB0byBkeW5hbWljYWxseSBhZGQgY3VzdG9tIHJvdXRlcyBhbmQgbWFuYWdlIExhbWJkYSBmdW5jdGlvbiBpbnRlZ3JhdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFBBVEhTIC0gVGhlIHR5cGUgZGVmaW5pdGlvbiBmb3IgdGhlIEFQSSBwYXRocy5cbiAqIEB0ZW1wbGF0ZSBPUFMgLSBUaGUgdHlwZSBkZWZpbml0aW9uIGZvciB0aGUgQVBJIG9wZXJhdGlvbnMuXG4gKlxuICogQGV4YW1wbGVcbiAqIGNvbnN0IGFwaSA9IG5ldyBSZXN0QXBpKHRoaXMsICdNeVJlc3RBcGknLCB7XG4gKiAgIGFwaU5hbWU6ICdNeUFQSScsXG4gKiAgIHN0YWdlTmFtZTogJ2RldicsXG4gKiAgIGRlZmluaXRpb25GaWxlTmFtZTogJ29wZW5hcGkueWFtbCcsXG4gKiAgIGF1dGhlbnRpY2F0aW9uOiBteUNvZ25pdG9BdXRoLFxuICogICBzaW5nbGVUYWJsZURhdGFzdG9yZTogbXlEeW5hbW9EQlRhYmxlLFxuICogICBhdXRvR2VuZXJhdGVSb3V0ZXM6IHRydWUsXG4gKiB9KTtcbiAqXG4gKiAvLyBBZGQgYSBjdXN0b20gUkVTVCByZXNvdXJjZVxuICogYXBpLmFkZFJlc3RSZXNvdXJjZSgnL2l0ZW1zJywgJ2dldCcpO1xuICpcbiAqIC8vIEdldCB0aGUgTGFtYmRhIGZ1bmN0aW9uIGZvciBhIHNwZWNpZmljIG9wZXJhdGlvblxuICogY29uc3QgbGFtYmRhRnVuY3Rpb24gPSBhcGkuZ2V0RnVuY3Rpb25Gb3JPcGVyYXRpb24oJ2dldEl0ZW1zJyk7XG4gKi9cbmV4cG9ydCBjbGFzcyBSZXN0QXBpPFBBVEhTLCBPUFM+IGV4dGVuZHMgQmFzZUFwaSB7XG5cbiAgLyoqXG4gICAqIFRoZSBBV1MgQVBJIEdhdGV3YXkgUkVTVCBBUEkgaW5zdGFuY2UuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgYXBpOiBhd3NfYXBpZ2F0ZXdheS5TcGVjUmVzdEFwaTtcblxuICAvKipcbiAgICogVGhlIE9wZW5BUEkgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIFJFU1QgQVBJLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGFwaVNwZWM6IE9wZW5BUEkzO1xuXG4gIC8qKlxuICAgKiBBIGNvbGxlY3Rpb24gb2YgTGFtYmRhIGZ1bmN0aW9ucyB1c2VkIGFzIGludGVncmF0aW9ucyBmb3IgdGhlIEFQSSBvcGVyYXRpb25zLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfZnVuY3Rpb25zOiB7IFtvcGVyYXRpb25JZDogc3RyaW5nXTogTGFtYmRhRnVuY3Rpb24gfSA9IHt9O1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpTWV0aG9kcyA9IFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCcsICdvcHRpb25zJywgJ2hlYWQnXTtcblxuICAvKipcbiAgICogVGhlIEpXVCBhdXRob3JpemVyIExhbWJkYSBmdW5jdGlvbiwgaWYgSldUIGF1dGhlbnRpY2F0aW9uIGlzIGNvbmZpZ3VyZWQuXG4gICAqIFN0b3JlZCBzbyB0aGUgaW52b2tlIHBlcm1pc3Npb24gY2FuIGJlIGdyYW50ZWQgYWZ0ZXIgdGhlIFNwZWNSZXN0QXBpIGlzIGNyZWF0ZWQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9hdXRob3JpemVyRm4/OiBMYW1iZGFGdW5jdGlvbjtcblxuICAvKipcbiAgICogVGhlIE1DUCBhdXRoIGNvbnN0cnVjdCwgaWYgbWNwQXV0aCBvcHRpb25zIHdlcmUgcHJvdmlkZWQuXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBwcml2YXRlIF9tY3BBdXRoPzogTWNwQXV0aDtcblxuICAvKipcbiAgICogU2V0IG9mIG9wZXJhdGlvbklkcyB0aGF0IHNob3VsZCBoYXZlIHNlY3VyaXR5IGRpc2FibGVkIChzZWN1cml0eTogW10pLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfYW5vbnltb3VzT3BlcmF0aW9uczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbiAgLyoqXG4gICAqIFN0b3JlcyB0aGUgb3JpZ2luYWwgcGVyLW9wZXJhdGlvbiBzZWN1cml0eSBhcnJheXMgYXMgYXNzaWduZWQgYnkgcGF0Y2hTZWN1cml0eSxcbiAgICoga2V5ZWQgYnkgb3BlcmF0aW9uSWQuIFVzZWQgYnkgc2V0QW5vbnltb3VzT3BlcmF0aW9ucyB0byByZXN0b3JlIHNlY3VyaXR5IG9uXG4gICAqIG9wZXJhdGlvbnMgcmVtb3ZlZCBmcm9tIHRoZSBhbm9ueW1vdXMgc2V0LlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBfb3JpZ2luYWxPcGVyYXRpb25TZWN1cml0eTogTWFwPHN0cmluZywgYW55W10+ID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIFJlc3RBcGkuXG4gICAqXG4gICAqIEBwYXJhbSBzY29wZSAtIFRoZSBzY29wZSBpbiB3aGljaCB0aGlzIGNvbnN0cnVjdCBpcyBkZWZpbmVkLlxuICAgKiBAcGFyYW0gaWQgLSBUaGUgc2NvcGVkIGNvbnN0cnVjdCBJRC5cbiAgICogQHBhcmFtIHByb3BzIC0gVGhlIHByb3BlcnRpZXMgb2YgdGhlIFJlc3RBcGkgY29uc3RydWN0LlxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJpdmF0ZSBwcm9wczogUmVzdEFwaVByb3BzPE9QUz4pIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuYXBpU3BlYyA9IHlhbWwubG9hZChmcy5yZWFkRmlsZVN5bmMocHJvcHMuZGVmaW5pdGlvbkZpbGVOYW1lKS50b1N0cmluZygpKSBhcyBPcGVuQVBJMztcblxuICAgIGxldCBjdXN0b21Eb21haW5OYW1lOiBhd3NfYXBpZ2F0ZXdheS5Eb21haW5OYW1lT3B0aW9ucyB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGhpcy5hcGlGUUROKSB7XG4gICAgICBjdXN0b21Eb21haW5OYW1lID0ge1xuICAgICAgICBkb21haW5OYW1lOiB0aGlzLmFwaUZRRE4sXG4gICAgICAgIGNlcnRpZmljYXRlOiBuZXcgYXdzX2NlcnRpZmljYXRlbWFuYWdlci5DZXJ0aWZpY2F0ZSh0aGlzLCAnQ2VydCcsIHtcbiAgICAgICAgICBkb21haW5OYW1lOiB0aGlzLmFwaUZRRE4sXG4gICAgICAgICAgdmFsaWRhdGlvbjogYXdzX2NlcnRpZmljYXRlbWFuYWdlci5DZXJ0aWZpY2F0ZVZhbGlkYXRpb24uZnJvbURucyh0aGlzLmhvc3RlZFpvbmUpLFxuICAgICAgICB9KSxcbiAgICAgIH07XG4gICAgICBuZXcgY2RrLkNmbk91dHB1dCh0aGlzLCAnUmVzdEFwaURvbWFpbk5hbWUnLCB7XG4gICAgICAgIGtleTogYCR7dGhpcy5wcm9wcy5hcGlOYW1lfSR7Q0ZOX09VVFBVVF9TVUZGSVhfUkVTVEFQSV9ET01BSU5OQU1FfWAsXG4gICAgICAgIHZhbHVlOiB0aGlzLmFwaUZRRE4sXG4gICAgICB9KTtcbiAgICAgIG5ldyBjZGsuQ2ZuT3V0cHV0KHRoaXMsICdSZXN0QXBpVXJsT3V0cHV0Jywge1xuICAgICAgICBrZXk6IGAke3RoaXMucHJvcHMuYXBpTmFtZX0ke0NGTl9PVVRQVVRfU1VGRklYX1JFU1RBUElfVVJMfWAsXG4gICAgICAgIHZhbHVlOiAnaHR0cHM6Ly8nICsgdGhpcy5hcGlGUUROLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gaWYgKChwcm9wcy5tb25pdG9yaW5nID8/IHRydWUpICYmIHRoaXMubW9uaXRvcmluZykge1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUVycm9yc1dpZGdldC5hZGRMZWZ0TWV0cmljKHRoaXMuYXBpLm1ldHJpY1NlcnZlckVycm9yKHtcbiAgICAvLyAgICAgc3RhdGlzdGljOiAnc3VtJyxcbiAgICAvLyAgIH0pKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5hcGlFcnJvcnNXaWRnZXQuYWRkTGVmdE1ldHJpYyh0aGlzLmFwaS5tZXRyaWNDbGllbnRFcnJvcih7XG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ3N1bScsXG4gICAgLy8gICB9KSk7XG5cbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5hcGlMYXRlbmN5V2lkZ2V0LmFkZExlZnRNZXRyaWModGhpcy5hcGkubWV0cmljTGF0ZW5jeSh7XG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ0F2ZXJhZ2UnLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lXaWRnZXQuYWRkTGVmdE1ldHJpYyh0aGlzLmFwaS5tZXRyaWNMYXRlbmN5KHtcbiAgICAvLyAgICAgc3RhdGlzdGljOiAncDkwJyxcbiAgICAvLyAgIH0pKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5hcGlMYXRlbmN5VGFpbFdpZGdldC5hZGRMZWZ0TWV0cmljKHRoaXMuYXBpLm1ldHJpY0xhdGVuY3koe1xuICAgIC8vICAgICBzdGF0aXN0aWM6ICdwOTUnLFxuICAgIC8vICAgfSkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmFwaUxhdGVuY3lUYWlsV2lkZ2V0LmFkZExlZnRNZXRyaWModGhpcy5hcGkubWV0cmljTGF0ZW5jeSh7XG4gICAgLy8gICAgIHN0YXRpc3RpYzogJ3A5OScsXG4gICAgLy8gICB9KSk7XG4gICAgLy8gfVxuXG4gICAgaWYgKHByb3BzLmF1dG9HZW5lcmF0ZVJvdXRlcyA/PyB0cnVlKSB7XG4gICAgICBmb3IgKGNvbnN0IHBhdGggaW4gdGhpcy5hcGlTcGVjLnBhdGhzKSB7XG4gICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5hcGlTcGVjLnBhdGhzLCBwYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHBhdGhJdGVtID0gdGhpcy5hcGlTcGVjLnBhdGhzW3BhdGhdO1xuICAgICAgICAgIGZvciAoY29uc3QgbWV0aG9kIGluIHBhdGhJdGVtKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhdGhJdGVtLCBtZXRob2QpICYmXG4gICAgICAgICAgICAgIFsnZ2V0JywgJ3Bvc3QnLCAncHV0JywgJ2RlbGV0ZScsICdwYXRjaCcsICdvcHRpb25zJywgJ2hlYWQnXS5pbmRleE9mKG1ldGhvZCkgPj0gMCkge1xuICAgICAgICAgICAgICAvLyBBZGQgYWxsIG9wZXJhdGlvbnNcbiAgICAgICAgICAgICAgdGhpcy5hZGRSZXN0UmVzb3VyY2UocGF0aCBhcyBhbnksIG1ldGhvZCBhcyBhbnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBfc3BlYyBFbmRwb2ludFxuICAgIHRoaXMuYXBpU3BlYy5wYXRocyFbJy9vcGVuYXBpLmpzb24nXSA9IHtcbiAgICAgIGdldDoge1xuICAgICAgICAnc3VtbWFyeSc6ICdSZXR1cm5zIHRoZSByYXcgT3BlbkFQSSBzcGVjIG9mIHRoaXMgQVBJJyxcbiAgICAgICAgJ2Rlc2NyaXB0aW9uJzogJ1JldHVybnMgdGhlIHJhdyBPcGVuQVBJIHNwZWMgb2YgdGhpcyBBUEknLFxuICAgICAgICAnb3BlcmF0aW9uSWQnOiAnX3NwZWMnLFxuICAgICAgICAncmVzcG9uc2VzJzoge1xuICAgICAgICAgIDIwMDoge1xuICAgICAgICAgICAgZGVzY3JpcHRpb246ICdPcGVuQVBJIHNwZWMgb2YgdGhpcyBBUEknLFxuICAgICAgICAgICAgY29udGVudDoge1xuICAgICAgICAgICAgICAnYXBwbGljYXRpb24vb3BlbmFwaStqc29uJzoge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgQ3VzdG9tIHByb3BlcnR5IGZvciBBV1NcbiAgICAgICAgJ3gtYW1hem9uLWFwaWdhdGV3YXktaW50ZWdyYXRpb24nOiB7XG4gICAgICAgICAgdHlwZTogJ21vY2snLFxuICAgICAgICAgIGh0dHBNZXRob2Q6ICdHRVQnLFxuICAgICAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiAnMS4wJyxcbiAgICAgICAgICByZXF1ZXN0VGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAnYXBwbGljYXRpb24vanNvbic6ICd7XFwnc3RhdHVzQ29kZVxcJzogMjAwfScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXNwb25zZXM6IHtcbiAgICAgICAgICAgIDIwMDoge1xuICAgICAgICAgICAgICBzdGF0dXNDb2RlOiAyMDAsXG4gICAgICAgICAgICAgIHJlc3BvbnNlVGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL29wZW5hcGkranNvbic6IEpTT04uc3RyaW5naWZ5KHRoaXMuY2xlYW51cFNwZWMoSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSgodGhpcy5hcGlTcGVjKSkpKSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBpZiAocHJvcHMuY29ycykge1xuICAgICAgdGhpcy5hcGlTcGVjLnBhdGhzIVsnL3twcm94eSt9J10gPSB7XG4gICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAnc3VtbWFyeSc6ICdDT1JTIHN1cHBvcnQnLFxuICAgICAgICAgICdkZXNjcmlwdGlvbic6ICdFbmFibGUgQ09SUyBieSByZXR1cm5pbmcgY29ycmVjdCBoZWFkZXJzJyxcbiAgICAgICAgICAndGFncyc6IFsnQ09SUyddLFxuICAgICAgICAgICdzZWN1cml0eSc6IFtdLFxuICAgICAgICAgICdyZXNwb25zZXMnOiB7XG4gICAgICAgICAgICAyMDA6IHtcbiAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdEZWZhdWx0IHJlc3BvbnNlIGZvciBDT1JTIG1ldGhvZCcsXG4gICAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctT3JpZ2luJzogeyBzY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSB9LFxuICAgICAgICAgICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogeyBzY2hlbWE6IHsgdHlwZTogJ3N0cmluZycgfSB9LFxuICAgICAgICAgICAgICAgICdBY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyc6IHsgc2NoZW1hOiB7IHR5cGU6ICdzdHJpbmcnIH0gfSxcbiAgICAgICAgICAgICAgICAnQWNjZXNzLUNvbnRyb2wtQWxsb3ctSGVhZGVycyc6IHsgc2NoZW1hOiB7IHR5cGU6ICdzdHJpbmcnIH0gfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgY29udGVudDoge30sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgJ3gtYW1hem9uLWFwaWdhdGV3YXktaW50ZWdyYXRpb24nOiB7XG4gICAgICAgICAgICB0eXBlOiAnbW9jaycsXG4gICAgICAgICAgICByZXF1ZXN0VGVtcGxhdGVzOiB7XG4gICAgICAgICAgICAgICdhcHBsaWNhdGlvbi9qc29uJzogJyNzZXQoJGNvbnRleHQucmVxdWVzdE92ZXJyaWRlLmhlYWRlci5vcmlnaW4gPSAkbWV0aG9kLnJlcXVlc3QuaGVhZGVyLm9yaWdpbilcXG57XFxuICBcInN0YXR1c0NvZGVcIiA6IDIwMFxcbn1cXG4nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc3BvbnNlczoge1xuICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogJzIwMCcsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VQYXJhbWV0ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAnbWV0aG9kLnJlc3BvbnNlLmhlYWRlci5BY2Nlc3MtQ29udHJvbC1BbGxvdy1IZWFkZXJzJzogXCInQ29udGVudC1UeXBlLFgtQW16LURhdGUsQXV0aG9yaXphdGlvbixYLUFwaS1LZXknXCIsXG4gICAgICAgICAgICAgICAgICAnbWV0aG9kLnJlc3BvbnNlLmhlYWRlci5BY2Nlc3MtQ29udHJvbC1BbGxvdy1DcmVkZW50aWFscyc6IFwiJ3RydWUnXCIsXG4gICAgICAgICAgICAgICAgICAnbWV0aG9kLnJlc3BvbnNlLmhlYWRlci5BY2Nlc3MtQ29udHJvbC1BbGxvdy1NZXRob2RzJzogXCInUFVULEdFVCxQT1NULERFTEVURSxQQVRDSCxIRUFELE9QVElPTlMnXCIsXG4gICAgICAgICAgICAgICAgICAnbWV0aG9kLnJlc3BvbnNlLmhlYWRlci5BY2Nlc3MtQ29udHJvbC1BbGxvdy1PcmlnaW4nOiAnY29udGV4dC5yZXF1ZXN0T3ZlcnJpZGUuaGVhZGVyLm9yaWdpbicsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXNwb25zZVRlbXBsYXRlczoge1xuICAgICAgICAgICAgICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nOiAne30nLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIHRoaXMucGF0Y2hTZWN1cml0eVNjaGVtZXModGhpcy5hcGlTcGVjKTtcblxuICAgIC8vIEluaXRpYWxpemUgYW5vbnltb3VzIG9wZXJhdGlvbnMgZnJvbSBwcm9wcyBiZWZvcmUgcGF0Y2hTZWN1cml0eSBkaXN0cmlidXRlcyBzZWN1cml0eVxuICAgIGlmIChwcm9wcy5hbm9ueW1vdXNPcGVyYXRpb25zKSB7XG4gICAgICBmb3IgKGNvbnN0IG9wSWQgb2YgcHJvcHMuYW5vbnltb3VzT3BlcmF0aW9ucykge1xuICAgICAgICB0aGlzLl9hbm9ueW1vdXNPcGVyYXRpb25zLmFkZChvcElkIGFzIHN0cmluZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IE1DUCBhdXRoIHBhdGhzIGludG8gdGhlIE9wZW5BUEkgc3BlYy5cbiAgICAvLyBJTVBPUlRBTlQ6IFRoaXMgTVVTVCBoYXBwZW4gYmVmb3JlIHBhdGNoU2VjdXJpdHkoKSBzbyB0aGF0IHRoZSBNQ1AgYXV0aFxuICAgIC8vIG9wZXJhdGlvbiBJRHMgYXJlIGFscmVhZHkgaW4gX2Fub255bW91c09wZXJhdGlvbnMgd2hlbiBzZWN1cml0eSBpcyBkaXN0cmlidXRlZC5cbiAgICBpZiAocHJvcHMubWNwQXV0aCkge1xuICAgICAgdGhpcy5fbWNwQXV0aCA9IHRoaXMuY3JlYXRlTWNwQXV0aChwcm9wcy5tY3BBdXRoKTtcbiAgICAgIHRoaXMuaW5qZWN0TWNwQXV0aFBhdGhzKHRoaXMuX21jcEF1dGgpO1xuICAgIH1cblxuICAgIHRoaXMucGF0Y2hTZWN1cml0eSh0aGlzLmFwaVNwZWMpO1xuXG4gICAgLy8gVE9ETyBwYXRjaCBzcGVjIGZvciBDb2duaXRvIHVzZXIgcG9vbFxuXG4gICAgdGhpcy5hcGkgPSBuZXcgYXdzX2FwaWdhdGV3YXkuU3BlY1Jlc3RBcGkodGhpcywgJ1Jlc291cmNlJywge1xuICAgICAgcmVzdEFwaU5hbWU6IGAke3Byb3BzLmFwaU5hbWV9IFske3Byb3BzLnN0YWdlTmFtZX1dYCxcbiAgICAgIGRvbWFpbk5hbWU6IGN1c3RvbURvbWFpbk5hbWUsXG4gICAgICBhcGlEZWZpbml0aW9uOiBhd3NfYXBpZ2F0ZXdheS5BcGlEZWZpbml0aW9uLmZyb21JbmxpbmUodGhpcy5hcGlTcGVjKSxcbiAgICAgIC4uLnByb3BzLnJlc3RBcGlQcm9wcyxcbiAgICB9KTtcblxuICAgIC8vIGFkZCBpbnZva2UgcGVybWlzc2lvbnMgdG8gTGFtYmRhIGZ1bmN0aW9uc1xuICAgIGZvciAoY29uc3QgZm4gb2YgT2JqZWN0LnZhbHVlcyh0aGlzLl9mdW5jdGlvbnMpKSB7XG4gICAgICBmbi5hZGRQZXJtaXNzaW9uKCdSZXN0QXBpSW52b2tlJywge1xuICAgICAgICBwcmluY2lwYWw6IG5ldyBhd3NfaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2FwaWdhdGV3YXkuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICBhY3Rpb246ICdsYW1iZGE6SW52b2tlRnVuY3Rpb24nLFxuICAgICAgICBzb3VyY2VBcm46IHRoaXMuYXBpLmFybkZvckV4ZWN1dGVBcGkoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEdyYW50IEFQSSBHYXRld2F5IHBlcm1pc3Npb24gdG8gaW52b2tlIHRoZSBKV1QgYXV0aG9yaXplciBMYW1iZGFcbiAgICBpZiAodGhpcy5fYXV0aG9yaXplckZuKSB7XG4gICAgICB0aGlzLl9hdXRob3JpemVyRm4uYWRkUGVybWlzc2lvbignQXBpR2F0ZXdheUF1dGhvcml6ZXJJbnZva2UnLCB7XG4gICAgICAgIHByaW5jaXBhbDogbmV3IGF3c19pYW0uU2VydmljZVByaW5jaXBhbCgnYXBpZ2F0ZXdheS5hbWF6b25hd3MuY29tJyksXG4gICAgICAgIGFjdGlvbjogJ2xhbWJkYTpJbnZva2VGdW5jdGlvbicsXG4gICAgICAgIHNvdXJjZUFybjogdGhpcy5hcGkuYXJuRm9yRXhlY3V0ZUFwaSgpLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gR3JhbnQgQVBJIEdhdGV3YXkgcGVybWlzc2lvbiB0byBpbnZva2UgTUNQIGF1dGggTGFtYmRhIGZ1bmN0aW9ucy5cbiAgICAvLyBUaGVzZSBuZWVkIGV4cGxpY2l0IGFkZFBlcm1pc3Npb24gYmVjYXVzZSB0aGV5IGFyZSBpbmplY3RlZCBkaXJlY3RseSBpbnRvXG4gICAgLy8gdGhlIE9wZW5BUEkgc3BlYyAodmlhIGluamVjdE1jcEF1dGhQYXRocyksIG5vdCB0aHJvdWdoIGFkZFJlc3RSZXNvdXJjZSB3aGljaFxuICAgIC8vIHdvdWxkIHJlZ2lzdGVyIHRoZW0gaW4gdGhpcy5fZnVuY3Rpb25zIGZvciB0aGUgYnVsayBncmFudCBhYm92ZS5cbiAgICBpZiAodGhpcy5fbWNwQXV0aCkge1xuICAgICAgY29uc3QgbWNwRnVuY3Rpb25zID0gdGhpcy5fbWNwQXV0aC5mdW5jdGlvbnM7XG4gICAgICBmb3IgKGNvbnN0IFtuYW1lLCBmbl0gb2YgT2JqZWN0LmVudHJpZXMobWNwRnVuY3Rpb25zKSkge1xuICAgICAgICBmbi5hZGRQZXJtaXNzaW9uKGBNY3BBdXRoJHtuYW1lfUludm9rZWAsIHtcbiAgICAgICAgICBwcmluY2lwYWw6IG5ldyBhd3NfaWFtLlNlcnZpY2VQcmluY2lwYWwoJ2FwaWdhdGV3YXkuYW1hem9uYXdzLmNvbScpLFxuICAgICAgICAgIGFjdGlvbjogJ2xhbWJkYTpJbnZva2VGdW5jdGlvbicsXG4gICAgICAgICAgc291cmNlQXJuOiB0aGlzLmFwaS5hcm5Gb3JFeGVjdXRlQXBpKCksXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjdXN0b21Eb21haW5OYW1lICYmIHRoaXMuYXBpLmRvbWFpbk5hbWUpIHtcbiAgICAgIG5ldyBhd3Nfcm91dGU1My5BUmVjb3JkKHRoaXMsICdEbnNSZWNvcmQnLCB7XG4gICAgICAgIHpvbmU6IHRoaXMuaG9zdGVkWm9uZSEsXG4gICAgICAgIHJlY29yZE5hbWU6IGN1c3RvbURvbWFpbk5hbWUuZG9tYWluTmFtZSxcbiAgICAgICAgdGFyZ2V0OiBhd3Nfcm91dGU1My5SZWNvcmRUYXJnZXQuZnJvbUFsaWFzKFxuICAgICAgICAgIG5ldyBhd3Nfcm91dGU1M190YXJnZXRzLkFwaUdhdGV3YXlEb21haW4odGhpcy5hcGkuZG9tYWluTmFtZSksXG4gICAgICAgICksXG4gICAgICB9KTtcbiAgICB9XG5cbiAgfVxuXG4gIHByb3RlY3RlZCBjbGVhbnVwU3BlYyhzcGVjOiB7IFtrZXk6IHN0cmluZ106IGFueSB9KTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB7XG4gICAgT2JqZWN0LmVudHJpZXMoc3BlYykuZm9yRWFjaCgoW3Byb3AsIHZhbHVlXTogW3N0cmluZywgYW55XSkgPT4ge1xuICAgICAgaWYgKHByb3Auc3RhcnRzV2l0aCgneC0nKSkge1xuICAgICAgICBkZWxldGUgc3BlY1twcm9wXTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0Jykge1xuICAgICAgICB0aGlzLmNsZWFudXBTcGVjKHNwZWNbcHJvcF0pO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNwZWM7XG4gIH1cblxuICAvKipcbiAgICogcmV0dXJuIHRoZSBnZW5lcmF0ZWQgTGFtYmRhIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEFQSSBvcGVyYXRpb25cbiAgICovXG4gIHB1YmxpYyBnZXRGdW5jdGlvbkZvck9wZXJhdGlvbihvcGVyYXRpb25JZDoga2V5b2YgT1BTKTogTGFtYmRhRnVuY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9mdW5jdGlvbnNbb3BlcmF0aW9uSWQgYXMgc3RyaW5nXTtcbiAgfVxuXG4gIC8qKlxuICAgKiByZXR1cm4gYSBsaXN0IG9mIGFsbCBnZW5lcmF0ZWQgTGFtYmRhIGZ1bmN0aW9uc1xuICAgKi9cbiAgcHVibGljIGdldEZ1bmN0aW9ucygpOiBMYW1iZGFGdW5jdGlvbltdIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh0aGlzLl9mdW5jdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZpc2l0b3IgbWV0aG9kIHRvIG1vZGlmeSB0aGUgZ2l2ZW4gZnVuY3Rpb25zXG4gICAqXG4gICAqIEBwYXJhbSBvcGVyYXRpb25JZHMgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIHZpc2l0XG4gICAqIEBwYXJhbSBvcCB0aGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZXZlcnkgZnVuY3Rpb25cbiAgICovXG4gIHB1YmxpYyBtb2RpZnlPcGVyYXRpb25GdW5jdGlvbnMob3BlcmF0aW9uSWRzOiAoa2V5b2YgT1BTKVtdLCBvcDogKGZuOiBMYW1iZGFGdW5jdGlvbikgPT4gdm9pZCkge1xuICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uSWQgb2Ygb3BlcmF0aW9uSWRzKSB7XG4gICAgICBvcCh0aGlzLmdldEZ1bmN0aW9uRm9yT3BlcmF0aW9uKG9wZXJhdGlvbklkKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIGZ1bGwgc2V0IG9mIGFub255bW91cyBvcGVyYXRpb25zLlxuICAgKiBBbm9ueW1vdXMgb3BlcmF0aW9ucyB3aWxsIGhhdmUgYHNlY3VyaXR5OiBbXWAgYXBwbGllZCBpbiB0aGUgT3BlbkFQSSBzcGVjLFxuICAgKiBtYWtpbmcgdGhlbSBwdWJsaWNseSBhY2Nlc3NpYmxlIHdpdGhvdXQgYXV0aGVudGljYXRpb24uXG4gICAqXG4gICAqIFNpbmNlIENESyBzZXJpYWxpemVzIHRoZSBPcGVuQVBJIHNwZWMgYXQgc3ludGggdGltZSAoZnJvbUlubGluZSBzdG9yZXMgdGhlXG4gICAqIG9iamVjdCByZWZlcmVuY2UpLCBtdXRhdGlvbnMgYWZ0ZXIgU3BlY1Jlc3RBcGkgY29uc3RydWN0aW9uIHN0aWxsIHRha2UgZWZmZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gb3BlcmF0aW9uSWRzIC0gVGhlIG9wZXJhdGlvbiBJRHMgdG8gbWFyayBhcyBhbm9ueW1vdXMuIFJlcGxhY2VzIGFueSBwcmV2aW91c2x5IHNldCBhbm9ueW1vdXMgb3BlcmF0aW9ucy5cbiAgICovXG4gIHB1YmxpYyBzZXRBbm9ueW1vdXNPcGVyYXRpb25zKG9wZXJhdGlvbklkczogKGtleW9mIE9QUylbXSkge1xuICAgIHRoaXMuX2Fub255bW91c09wZXJhdGlvbnMuY2xlYXIoKTtcbiAgICBmb3IgKGNvbnN0IG9wSWQgb2Ygb3BlcmF0aW9uSWRzKSB7XG4gICAgICB0aGlzLl9hbm9ueW1vdXNPcGVyYXRpb25zLmFkZChvcElkIGFzIHN0cmluZyk7XG4gICAgfVxuICAgIHRoaXMuYXBwbHlBbm9ueW1vdXNTZWN1cml0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhZGRpdGlvbmFsIG9wZXJhdGlvbnMgdG8gdGhlIHNldCBvZiBhbm9ueW1vdXMgb3BlcmF0aW9ucy5cbiAgICogTmV3bHkgYWRkZWQgb3BlcmF0aW9ucyB3aWxsIGhhdmUgYHNlY3VyaXR5OiBbXWAgYXBwbGllZCBpbiB0aGUgT3BlbkFQSSBzcGVjLlxuICAgKlxuICAgKiBTaW5jZSBDREsgc2VyaWFsaXplcyB0aGUgT3BlbkFQSSBzcGVjIGF0IHN5bnRoIHRpbWUgKGZyb21JbmxpbmUgc3RvcmVzIHRoZVxuICAgKiBvYmplY3QgcmVmZXJlbmNlKSwgbXV0YXRpb25zIGFmdGVyIFNwZWNSZXN0QXBpIGNvbnN0cnVjdGlvbiBzdGlsbCB0YWtlIGVmZmVjdC5cbiAgICpcbiAgICogQHBhcmFtIG9wZXJhdGlvbklkcyAtIFRoZSBvcGVyYXRpb24gSURzIHRvIGFkZCB0byB0aGUgYW5vbnltb3VzIHNldC5cbiAgICovXG4gIHB1YmxpYyBhZGRBbm9ueW1vdXNPcGVyYXRpb25zKG9wZXJhdGlvbklkczogKGtleW9mIE9QUylbXSkge1xuICAgIGZvciAoY29uc3Qgb3BJZCBvZiBvcGVyYXRpb25JZHMpIHtcbiAgICAgIHRoaXMuX2Fub255bW91c09wZXJhdGlvbnMuYWRkKG9wSWQgYXMgc3RyaW5nKTtcbiAgICB9XG4gICAgdGhpcy5hcHBseUFub255bW91c1NlY3VyaXR5Rm9yT3BzKG9wZXJhdGlvbklkcy5tYXAob3AgPT4gb3AgYXMgc3RyaW5nKSk7XG4gIH1cblxuICAvKipcbiAgICogUmUtYXBwbGllcyBzZWN1cml0eSBzZXR0aW5ncyB0byBhbGwgb3BlcmF0aW9ucyBiYXNlZCBvbiB0aGUgY3VycmVudCBhbm9ueW1vdXMgc2V0LlxuICAgKiBPcGVyYXRpb25zIGluIHRoZSBhbm9ueW1vdXMgc2V0IGdldCBgc2VjdXJpdHk6IFtdYDsgb3BlcmF0aW9ucyByZW1vdmVkIGZyb20gdGhlIHNldFxuICAgKiBoYXZlIHRoZWlyIG9yaWdpbmFsIHNlY3VyaXR5IHJlc3RvcmVkLlxuICAgKiBAcHJpdmF0ZVxuICAgKi9cbiAgcHJpdmF0ZSBhcHBseUFub255bW91c1NlY3VyaXR5KCkge1xuICAgIGZvciAoY29uc3Qgc3BlY1BhdGggb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmFwaVNwZWMucGF0aHMgfHwgW10pKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzcGVjUGF0aCkge1xuICAgICAgICBpZiAoIXRoaXMuYXBpTWV0aG9kcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlY01ldGhvZCA9IChzcGVjUGF0aCBhcyBQYXRoSXRlbU9iamVjdClba2V5IGFzIGtleW9mIFBhdGhJdGVtT2JqZWN0XSEgYXMgT3BlcmF0aW9uT2JqZWN0O1xuICAgICAgICBpZiAoc3BlY01ldGhvZC5vcGVyYXRpb25JZCAmJiB0aGlzLl9hbm9ueW1vdXNPcGVyYXRpb25zLmhhcyhzcGVjTWV0aG9kLm9wZXJhdGlvbklkKSkge1xuICAgICAgICAgIHNwZWNNZXRob2Quc2VjdXJpdHkgPSBbXTtcbiAgICAgICAgfSBlbHNlIGlmIChzcGVjTWV0aG9kLm9wZXJhdGlvbklkICYmIHRoaXMuX29yaWdpbmFsT3BlcmF0aW9uU2VjdXJpdHkuaGFzKHNwZWNNZXRob2Qub3BlcmF0aW9uSWQpKSB7XG4gICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzZWN1cml0eSBmb3Igb3BlcmF0aW9ucyByZW1vdmVkIGZyb20gdGhlIGFub255bW91cyBzZXRcbiAgICAgICAgICBzcGVjTWV0aG9kLnNlY3VyaXR5ID0gdGhpcy5fb3JpZ2luYWxPcGVyYXRpb25TZWN1cml0eS5nZXQoc3BlY01ldGhvZC5vcGVyYXRpb25JZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBgc2VjdXJpdHk6IFtdYCBvbmx5IHRvIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9ucy5cbiAgICogQHByaXZhdGVcbiAgICovXG4gIHByaXZhdGUgYXBwbHlBbm9ueW1vdXNTZWN1cml0eUZvck9wcyhvcGVyYXRpb25JZHM6IHN0cmluZ1tdKSB7XG4gICAgY29uc3Qgb3BzU2V0ID0gbmV3IFNldChvcGVyYXRpb25JZHMpO1xuICAgIGZvciAoY29uc3Qgc3BlY1BhdGggb2YgT2JqZWN0LnZhbHVlcyh0aGlzLmFwaVNwZWMucGF0aHMgfHwgW10pKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBzcGVjUGF0aCkge1xuICAgICAgICBpZiAoIXRoaXMuYXBpTWV0aG9kcy5pbmNsdWRlcyhrZXkpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlY01ldGhvZCA9IChzcGVjUGF0aCBhcyBQYXRoSXRlbU9iamVjdClba2V5IGFzIGtleW9mIFBhdGhJdGVtT2JqZWN0XSEgYXMgT3BlcmF0aW9uT2JqZWN0O1xuICAgICAgICBpZiAoc3BlY01ldGhvZC5vcGVyYXRpb25JZCAmJiBvcHNTZXQuaGFzKHNwZWNNZXRob2Qub3BlcmF0aW9uSWQpKSB7XG4gICAgICAgICAgc3BlY01ldGhvZC5zZWN1cml0eSA9IFtdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFkZFJlc3RSZXNvdXJjZTxQIGV4dGVuZHMga2V5b2YgUEFUSFM+KHBhdGg6IFAsIG1ldGhvZDoga2V5b2YgUEFUSFNbUF0pIHtcbiAgICBjb25zdCBvYVBhdGggPSB0aGlzLmFwaVNwZWMucGF0aHMhW3BhdGggYXMgc3RyaW5nXSBhcyBQYXRoSXRlbU9iamVjdDtcbiAgICBjb25zdCBvcGVyYXRpb24gPSBvYVBhdGhbbWV0aG9kIGFzIGtleW9mIFBhdGhJdGVtT2JqZWN0XSBhcyBPcGVyYXRpb25PYmplY3Q7XG4gICAgY29uc3Qgb3BlcmF0aW9uSWQgPSBvcGVyYXRpb24ub3BlcmF0aW9uSWQhO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gYCR7bWV0aG9kIGFzIHN0cmluZ30gJHtwYXRoIGFzIHN0cmluZ30gLSAke29wZXJhdGlvbi5zdW1tYXJ5fWA7XG5cbiAgICBjb25zdCBjdXN0b21MYW1iZGFPcHRpb25zID0gdGhpcy5wcm9wcy5sYW1iZGFPcHRpb25zQnlPcGVyYXRpb24gPyB0aGlzLnByb3BzLmxhbWJkYU9wdGlvbnNCeU9wZXJhdGlvbltvcGVyYXRpb25JZCBhcyBrZXlvZiBPUFNdIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiB0aGlzLmFkZEN1c3RvbVJlc3RSZXNvdXJjZShvcGVyYXRpb24sIG1ldGhvZCBhcyBzdHJpbmcsIGRlc2NyaXB0aW9uLCBjdXN0b21MYW1iZGFPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRDdXN0b21SZXN0UmVzb3VyY2Uob3BlcmF0aW9uOiBPcGVyYXRpb25PYmplY3QsIG1ldGhvZDogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCBhZGRpdGlvbmFsTGFtYmRhT3B0aW9uczogTGFtYmRhT3B0aW9ucyA9IHt9KSB7XG4gICAgaWYgKCd4LWFtYXpvbi1hcGlnYXRld2F5LWludGVncmF0aW9uJyBpbiBvcGVyYXRpb24pIHtcbiAgICAgIHJldHVybjsgLy8gU2tpcCBpZiBvcGVyYXRpb24gd2FzIGRlY2xhcmVkIGluIHNwZWMgZmlsZSBhbHJlYWR5IVxuICAgIH1cblxuICAgIGNvbnN0IGVudHJ5RmlsZSA9IGAuL3NyYy9sYW1iZGEvcmVzdC4ke3RoaXMucHJvcHMuYXBpTmFtZS50b0xvd2VyQ2FzZSgpfS4ke29wZXJhdGlvbi5vcGVyYXRpb25JZH0udHNgO1xuXG4gICAgY29uc3QgbGFtYmRhT3B0aW9ucyA9IHtcbiAgICAgIC4uLnRoaXMucHJvcHMubGFtYmRhT3B0aW9ucyAmJiB7XG4gICAgICAgIC4uLnRoaXMucHJvcHMubGFtYmRhT3B0aW9ucyxcbiAgICAgIH0sXG4gICAgICAuLi5hZGRpdGlvbmFsTGFtYmRhT3B0aW9ucyxcbiAgICB9O1xuXG4gICAgY29uc3QgYXV0aGVudGljYXRpb24gPSB0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uICYmICh0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uLmhhc093blByb3BlcnR5KCd1c2VycG9vbCcpXG4gICAgICA/IHsgdXNlclBvb2w6ICh0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIElDb2duaXRvQXV0aGVudGljYXRpb24pLnVzZXJwb29sIH1cbiAgICAgIDogeyBqd3Q6IHRoaXMucHJvcHMuYXV0aGVudGljYXRpb24gYXMgSUp3dEF1dGhlbnRpY2F0aW9uIH0pO1xuXG4gICAgY29uc3QgZm4gPSBuZXcgTGFtYmRhRnVuY3Rpb24odGhpcywgYEZuJHtvcGVyYXRpb24ub3BlcmF0aW9uSWR9YCwge1xuICAgICAgc3RhZ2VOYW1lOiB0aGlzLnByb3BzLnN0YWdlTmFtZSxcbiAgICAgIGFkZGl0aW9uYWxFbnY6IHtcbiAgICAgICAgLi4udGhpcy5wcm9wcy5kb21haW5OYW1lICYmIHtcbiAgICAgICAgICBET01BSU5fTkFNRTogdGhpcy5wcm9wcy5kb21haW5OYW1lLFxuICAgICAgICB9LFxuICAgICAgICAuLi50aGlzLnByb3BzLmFkZGl0aW9uYWxFbnYsXG4gICAgICB9LFxuICAgICAgZW50cnk6IGVudHJ5RmlsZSxcbiAgICAgIGRlc2NyaXB0aW9uOiBgWyR7dGhpcy5wcm9wcy5zdGFnZU5hbWV9XSAke2Rlc2NyaXB0aW9ufWAsXG4gICAgICAuLi5hdXRoZW50aWNhdGlvbixcbiAgICAgIC4uLnRoaXMucHJvcHMuc2luZ2xlVGFibGVEYXRhc3RvcmUgJiYge1xuICAgICAgICB0YWJsZTogdGhpcy5wcm9wcy5zaW5nbGVUYWJsZURhdGFzdG9yZS50YWJsZSxcbiAgICAgICAgdGFibGVXcml0ZXM6IHRoaXMudGFibGVXcml0ZUFjY2Vzc0Zvck1ldGhvZChtZXRob2QpLFxuICAgICAgfSxcbiAgICAgIC4uLnRoaXMucHJvcHMuYXNzZXRDZG4gJiYge1xuICAgICAgICBhc3NldERvbWFpbk5hbWU6IHRoaXMucHJvcHMuYXNzZXRDZG4uYXNzZXREb21haW5OYW1lLFxuICAgICAgICBhc3NldEJ1Y2tldDogdGhpcy5wcm9wcy5hc3NldENkbi5hc3NldEJ1Y2tldCxcbiAgICAgIH0sXG4gICAgICBsYW1iZGFPcHRpb25zLFxuICAgICAgbGFtYmRhVHJhY2luZzogdGhpcy5wcm9wcy5sYW1iZGFUcmFjaW5nLFxuICAgIH0pO1xuICAgIHRoaXMuX2Z1bmN0aW9uc1tvcGVyYXRpb24ub3BlcmF0aW9uSWQhXSA9IGZuO1xuICAgIGNkay5UYWdzLm9mKGZuKS5hZGQoJ09wZW5BUEknLCBkZXNjcmlwdGlvbi5yZXBsYWNlKC9bXlxcd1xcc1xcZF8uOi89K1xcLUBdL2csICcnKSk7XG5cbiAgICAvLyBpZiAodGhpcy5tb25pdG9yaW5nKSB7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcubGFtYmRhRHVyYXRpb25zV2lkZ2V0LmFkZExlZnRNZXRyaWMoZm4ubWV0cmljRHVyYXRpb24oKSk7XG4gICAgLy8gICB0aGlzLm1vbml0b3JpbmcubGFtYmRhSW52b2tlc1dpZGdldC5hZGRMZWZ0TWV0cmljKGZuLm1ldHJpY0ludm9jYXRpb25zKCkpO1xuICAgIC8vICAgdGhpcy5tb25pdG9yaW5nLmxhbWJkYUVycm9yc1dpZGdldC5hZGRMZWZ0TWV0cmljKGZuLm1ldHJpY0Vycm9ycygpKTtcbiAgICAvLyAgIHRoaXMubW9uaXRvcmluZy5sYW1iZGFFcnJvcnNXaWRnZXQuYWRkTGVmdE1ldHJpYyhmbi5tZXRyaWNUaHJvdHRsZXMoKSk7XG4gICAgLy8gfVxuXG4gICAgY29uc3QgaGFzVmVyc2lvbkNvbmZpZyA9IGxhbWJkYU9wdGlvbnMuY3VycmVudFZlcnNpb25PcHRpb25zICE9IHVuZGVmaW5lZDtcblxuICAgIG9wZXJhdGlvblsneC1hbWF6b24tYXBpZ2F0ZXdheS1pbnRlZ3JhdGlvbiddID0ge1xuICAgICAgdHlwZTogJ2F3c19wcm94eScsXG4gICAgICBodHRwTWV0aG9kOiAnUE9TVCcsXG4gICAgICB1cmk6IGNkay5TdGFjay5vZih0aGlzKS5mb3JtYXRBcm4oe1xuICAgICAgICByZXNvdXJjZTogJ3BhdGgnLFxuICAgICAgICBzZXJ2aWNlOiAnYXBpZ2F0ZXdheScsXG4gICAgICAgIGFjY291bnQ6ICdsYW1iZGEnLFxuICAgICAgICBhcm5Gb3JtYXQ6IGNkay5Bcm5Gb3JtYXQuU0xBU0hfUkVTT1VSQ0VfTkFNRSxcbiAgICAgICAgcmVzb3VyY2VOYW1lOiBgMjAxNS0wMy0zMS9mdW5jdGlvbnMvJHsoaGFzVmVyc2lvbkNvbmZpZyA/IGZuLmN1cnJlbnRWZXJzaW9uIDogZm4pLmZ1bmN0aW9uQXJufS9pbnZvY2F0aW9uc2AsXG4gICAgICAgIC8vICAgICAgICAgICAgIF5eXl5eXl5eXl4gLSBUSElTIE5FRURTIFRPIEJFIFRISVMgREFURS4gRVhBQ1RMWSFcbiAgICAgIH0pLFxuICAgICAgcGFzc3Rocm91Z2hCZWhhdmlvcjogJ3doZW5fbm9fdGVtcGxhdGVzJyxcbiAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiAnMS4wJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgcHJpdmF0ZSB0YWJsZVdyaXRlQWNjZXNzRm9yTWV0aG9kKG1ldGhvZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgc3dpdGNoIChtZXRob2QudG9Mb3dlckNhc2UoKSkge1xuICAgICAgY2FzZSAnZGVsZXRlJzpcbiAgICAgIGNhc2UgJ3Bvc3QnOlxuICAgICAgY2FzZSAncHV0JzpcbiAgICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICBjYXNlICdvcHRpb25zJzpcbiAgICAgIGNhc2UgJ2dldCc6XG4gICAgICBjYXNlICdoZWFkJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0cyB0aGUgYXV0aG9yaXplciBzZWN1cml0eSBzY2hlbWUgaW50byB0aGUgT3BlbkFQSSBzcGVjIGJhc2VkIG9uIHRoZVxuICAgKiBhdXRoZW50aWNhdGlvbiB0eXBlLCBwbGFjaW5nIGl0IHdoZXJlIEFQSSBHYXRld2F5IGV4cGVjdHMgaXQgZm9yIHRoZSBzcGVjXG4gICAqIHZlcnNpb246IGBjb21wb25lbnRzLnNlY3VyaXR5U2NoZW1lc2AgZm9yIE9wZW5BUEkgMy54LCBvciB0aGUgcm9vdFxuICAgKiBgc2VjdXJpdHlEZWZpbml0aW9uc2AgZm9yIFN3YWdnZXIgMi4wLiBBbiBhdXRob3JpemVyIHdyaXR0ZW4gdG8gdGhlIHdyb25nXG4gICAqIGxvY2F0aW9uIGlzIHNpbGVudGx5IGlnbm9yZWQgb24gaW1wb3J0LCBkZXBsb3lpbmcgYW4gdW5hdXRoZW50aWNhdGVkIEFQSS5cbiAgICpcbiAgICogRm9yIENvZ25pdG86IGFkZHMgYSBjb2duaXRvX3VzZXJfcG9vbHMgYXV0aG9yaXplciByZWZlcmVuY2luZyB0aGUgdXNlciBwb29sIEFSTi5cbiAgICogRm9yIEpXVDogY3JlYXRlcyBhIExhbWJkYSBhdXRob3JpemVyIGZ1bmN0aW9uIGFuZCBhZGRzIGEgdG9rZW4gYXV0aG9yaXplciByZWZlcmVuY2luZyBpdHMgQVJOLlxuICAgKi9cbiAgcHJvdGVjdGVkIHBhdGNoU2VjdXJpdHlTY2hlbWVzKHNwZWM6IE9wZW5BUEkzKSB7XG4gICAgaWYgKCF0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2NoZW1lcyA9IHRoaXMuc2VjdXJpdHlTY2hlbWVDb250YWluZXIoc3BlYyk7XG5cbiAgICBpZiAodGhpcy5wcm9wcy5hdXRoZW50aWNhdGlvbi5oYXNPd25Qcm9wZXJ0eSgndXNlcnBvb2wnKSkge1xuICAgICAgLy8gQ29nbml0byBVc2VyIFBvb2wgYXV0aG9yaXplclxuICAgICAgY29uc3QgY29nbml0b0F1dGggPSB0aGlzLnByb3BzLmF1dGhlbnRpY2F0aW9uIGFzIElDb2duaXRvQXV0aGVudGljYXRpb247XG4gICAgICBjb25zdCBhdXRob3JpemVyTmFtZSA9ICdDb2duaXRvQXV0aG9yaXplcic7XG5cbiAgICAgIHNjaGVtZXNbYXV0aG9yaXplck5hbWVdID0ge1xuICAgICAgICAndHlwZSc6ICdhcGlLZXknLFxuICAgICAgICAnbmFtZSc6ICdBdXRob3JpemF0aW9uJyxcbiAgICAgICAgJ2luJzogJ2hlYWRlcicsXG4gICAgICAgICd4LWFtYXpvbi1hcGlnYXRld2F5LWF1dGh0eXBlJzogJ2NvZ25pdG9fdXNlcl9wb29scycsXG4gICAgICAgICd4LWFtYXpvbi1hcGlnYXRld2F5LWF1dGhvcml6ZXInOiB7XG4gICAgICAgICAgdHlwZTogJ2NvZ25pdG9fdXNlcl9wb29scycsXG4gICAgICAgICAgcHJvdmlkZXJBUk5zOiBbY29nbml0b0F1dGgudXNlcnBvb2wudXNlclBvb2xBcm5dLFxuICAgICAgICB9LFxuICAgICAgfTtcblxuICAgICAgLy8gUmVzb2x2ZSBnbG9iYWwgYXV0aG9yaXphdGlvbiBzY29wZXMgZm9yIHRoZSBDb2duaXRvIGF1dGhvcml6ZXIuXG4gICAgICAvLyBXaGVuIHNjb3BlcyBhcmUgcHJlc2VudCwgQVBJIEdhdGV3YXkgdmFsaWRhdGVzIHRoZSBhY2Nlc3MgdG9rZW4gYW5kIGNoZWNrc1xuICAgICAgLy8gdGhlIHRva2VuIGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBvZiB0aGUgbGlzdGVkIHNjb3Blcy4gQW4gZW1wdHkgYXJyYXkgbWVhbnNcbiAgICAgIC8vIG5vIHNjb3BlcyBhcmUgcmVxdWlyZWQgYW5kIEFQSSBHYXRld2F5IHZhbGlkYXRlcyB0aGUgSUQgdG9rZW4gaW5zdGVhZC5cbiAgICAgIGNvbnN0IGdsb2JhbFNjb3BlcyA9IHRoaXMucHJvcHMuYXV0aG9yaXphdGlvblNjb3BlcyA/PyBbJ29wZW5pZCddO1xuXG4gICAgICAvLyBFbnN1cmUgZ2xvYmFsIHNlY3VyaXR5IHJlZmVyZW5jZXMgdGhlIGF1dGhvcml6ZXIgc28gcGF0Y2hTZWN1cml0eSBkaXN0cmlidXRlcyBpdFxuICAgICAgaWYgKCFzcGVjLnNlY3VyaXR5KSB7XG4gICAgICAgIHNwZWMuc2VjdXJpdHkgPSBbeyBbYXV0aG9yaXplck5hbWVdOiBnbG9iYWxTY29wZXMgfV07XG4gICAgICB9IGVsc2UgaWYgKGdsb2JhbFNjb3Blcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIC8vIFRoZSBzcGVjIGFscmVhZHkgaGFzIGdsb2JhbCBzZWN1cml0eSBkZWZpbmVkIOKAlCBwYXRjaCB0aGUgYXV0aG9yaXplcidzIHNjb3Blc1xuICAgICAgICAvLyBzbyB0aGF0IHRoZSBjb25maWd1cmVkIHNjb3BlcyBhcmUgZGlzdHJpYnV0ZWQgdG8gYWxsIG9wZXJhdGlvbnMuXG4gICAgICAgIGZvciAoY29uc3QgcmVxdWlyZW1lbnQgb2Ygc3BlYy5zZWN1cml0eSBhcyBBcnJheTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4+KSB7XG4gICAgICAgICAgaWYgKGF1dGhvcml6ZXJOYW1lIGluIHJlcXVpcmVtZW50KSB7XG4gICAgICAgICAgICByZXF1aXJlbWVudFthdXRob3JpemVyTmFtZV0gPSBnbG9iYWxTY29wZXM7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEpXVCAoTGFtYmRhKSBhdXRob3JpemVyXG4gICAgICBjb25zdCBqd3RBdXRoID0gdGhpcy5wcm9wcy5hdXRoZW50aWNhdGlvbiBhcyBJSnd0QXV0aGVudGljYXRpb247XG4gICAgICBjb25zdCBhdXRob3JpemVyTmFtZSA9ICdKd3RBdXRob3JpemVyJztcblxuICAgICAgY29uc3QgYXV0aG9yaXplckZuID0gbmV3IExhbWJkYUZ1bmN0aW9uKHRoaXMsICdKd3RBdXRob3JpemVyRm4nLCB7XG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5wcm9wcy5zdGFnZU5hbWUsXG4gICAgICAgIGVudHJ5OiAnc3JjL2xhbWJkYS9yZXN0LWFwaS5qd3QtYXV0aG9yaXplci50cycsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgWyR7dGhpcy5wcm9wcy5zdGFnZU5hbWV9XSBKV1QgQXV0aG9yaXplciBmb3IgJHt0aGlzLnByb3BzLmFwaU5hbWV9YCxcbiAgICAgICAgand0OiBqd3RBdXRoLFxuICAgICAgICBsYW1iZGFPcHRpb25zOiB0aGlzLnByb3BzLmxhbWJkYU9wdGlvbnMsXG4gICAgICAgIGxhbWJkYVRyYWNpbmc6IHRoaXMucHJvcHMubGFtYmRhVHJhY2luZyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBhdXRob3JpemVyVXJpID0gY2RrLlN0YWNrLm9mKHRoaXMpLmZvcm1hdEFybih7XG4gICAgICAgIHJlc291cmNlOiAncGF0aCcsXG4gICAgICAgIHNlcnZpY2U6ICdhcGlnYXRld2F5JyxcbiAgICAgICAgYWNjb3VudDogJ2xhbWJkYScsXG4gICAgICAgIGFybkZvcm1hdDogY2RrLkFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgICAgICByZXNvdXJjZU5hbWU6IGAyMDE1LTAzLTMxL2Z1bmN0aW9ucy8ke2F1dGhvcml6ZXJGbi5mdW5jdGlvbkFybn0vaW52b2NhdGlvbnNgLFxuICAgICAgfSk7XG5cbiAgICAgIHNjaGVtZXNbYXV0aG9yaXplck5hbWVdID0ge1xuICAgICAgICAndHlwZSc6ICdhcGlLZXknLFxuICAgICAgICAnbmFtZSc6ICdBdXRob3JpemF0aW9uJyxcbiAgICAgICAgJ2luJzogJ2hlYWRlcicsXG4gICAgICAgICd4LWFtYXpvbi1hcGlnYXRld2F5LWF1dGh0eXBlJzogJ2N1c3RvbScsXG4gICAgICAgICd4LWFtYXpvbi1hcGlnYXRld2F5LWF1dGhvcml6ZXInOiB7XG4gICAgICAgICAgdHlwZTogdGhpcy5wcm9wcy5qd3RBdXRob3JpemVyVHlwZSA9PT0gJ3JlcXVlc3QnID8gJ3JlcXVlc3QnIDogJ3Rva2VuJyxcbiAgICAgICAgICBhdXRob3JpemVyVXJpOiBhdXRob3JpemVyVXJpLFxuICAgICAgICAgIGF1dGhvcml6ZXJSZXN1bHRUdGxJblNlY29uZHM6IHRoaXMucHJvcHMuand0QXV0aG9yaXplclR5cGUgPT09ICdyZXF1ZXN0JyA/IDAgOiAzMDAsXG4gICAgICAgICAgLi4uKHRoaXMucHJvcHMuand0QXV0aG9yaXplclR5cGUgIT09ICdyZXF1ZXN0JyAmJiB7XG4gICAgICAgICAgICBpZGVudGl0eVNvdXJjZTogJ21ldGhvZC5yZXF1ZXN0LmhlYWRlci5BdXRob3JpemF0aW9uJyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFN0b3JlIHRoZSBhdXRob3JpemVyIGZ1bmN0aW9uIHNvIHdlIGNhbiBncmFudCBwZXJtaXNzaW9uIGFmdGVyIHRoZSBTcGVjUmVzdEFwaSBpcyBjcmVhdGVkXG4gICAgICB0aGlzLl9hdXRob3JpemVyRm4gPSBhdXRob3JpemVyRm47XG5cbiAgICAgIC8vIEVuc3VyZSBnbG9iYWwgc2VjdXJpdHkgcmVmZXJlbmNlcyB0aGUgYXV0aG9yaXplciBzbyBwYXRjaFNlY3VyaXR5IGRpc3RyaWJ1dGVzIGl0XG4gICAgICBpZiAoIXNwZWMuc2VjdXJpdHkpIHtcbiAgICAgICAgc3BlYy5zZWN1cml0eSA9IFt7IFthdXRob3JpemVyTmFtZV06IFtdIH1dO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBNQ1AgYXV0aCBjb25zdHJ1Y3QgaWYgbWNwQXV0aCB3YXMgY29uZmlndXJlZC5cbiAgICogVXNlZnVsIGZvciBhY2Nlc3NpbmcgdGhlIGNyZWF0ZWQgTGFtYmRhIGZ1bmN0aW9ucyBvciBlbnYgdmFycy5cbiAgICovXG4gIHB1YmxpYyBnZXRNY3BBdXRoKCk6IE1jcEF1dGggfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9tY3BBdXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgdGhlIE1jcEF1dGggY29uc3RydWN0IGZyb20gdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gICAqIERlcml2ZXMgYXBpRG9tYWluIGZyb20gdGhlIFJlc3RBcGkncyBvd24gZG9tYWluIGNvbmZpZy5cbiAgICogRm9yIENvZ25pdG8sIGNyZWF0ZXMgYSB1c2VyIHBvb2wgY2xpZW50IGF1dG9tYXRpY2FsbHkuXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZU1jcEF1dGgob3B0aW9uczogTWNwQXV0aE9wdGlvbnMpOiBNY3BBdXRoIHtcbiAgICBjb25zdCBhcGlEb21haW4gPSB0aGlzLmFwaUZRRE47XG4gICAgaWYgKCFhcGlEb21haW4pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbWNwQXV0aCByZXF1aXJlcyBhIGRvbWFpbiBuYW1lIHRvIGJlIGNvbmZpZ3VyZWQgb24gdGhlIFJlc3RBcGkgKGRvbWFpbk5hbWUgb3IgaG9zdGVkWm9uZSArIGFwaUhvc3RuYW1lKScpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmNvZ25pdG8gJiYgb3B0aW9ucy5nZW5lcmljKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ21jcEF1dGg6IHByb3ZpZGUgZWl0aGVyIGNvZ25pdG8gb3IgZ2VuZXJpYywgbm90IGJvdGgnKTtcbiAgICB9XG4gICAgaWYgKCFvcHRpb25zLmNvZ25pdG8gJiYgIW9wdGlvbnMuZ2VuZXJpYykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtY3BBdXRoOiBwcm92aWRlIGVpdGhlciBjb2duaXRvIG9yIGdlbmVyaWMgY29uZmlndXJhdGlvbicpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbG93ZWRSZWRpcmVjdFVyaXMgPSBvcHRpb25zLmFsbG93ZWRSZWRpcmVjdFVyaXMgPz8gW1xuICAgICAgJ2h0dHBzOi8vY2xhdWRlLmFpL29hdXRoL2NhbGxiYWNrJyxcbiAgICAgICdodHRwczovL2NsYXVkZS5haS9hcGkvbWNwL2F1dGhfY2FsbGJhY2snLFxuICAgICAgJ2h0dHBzOi8vY2hhdGdwdC5jb20vb2F1dGgvY2FsbGJhY2snLFxuICAgIF07XG5cbiAgICBpZiAob3B0aW9ucy5jb2duaXRvKSB7XG4gICAgICBjb25zdCBjb2duaXRvT3B0cyA9IG9wdGlvbnMuY29nbml0bztcblxuICAgICAgLy8gRGVsZWdhdGUgdG8gTWNwQ29nbml0b0F1dGggd2hpY2ggaGFuZGxlcyB1c2VyIHBvb2wgY2xpZW50IGNyZWF0aW9uXG4gICAgICBjb25zdCBtY3BDb2duaXRvID0gbmV3IE1jcENvZ25pdG9BdXRoKHRoaXMsICdNY3BDb2duaXRvQXV0aCcsIHtcbiAgICAgICAgYXV0aDogY29nbml0b09wdHMuYXV0aCxcbiAgICAgICAgYXBpRG9tYWluLFxuICAgICAgICBhdXRoRG9tYWluOiBjb2duaXRvT3B0cy5hdXRoRG9tYWluLFxuICAgICAgICBhbGxvd2VkUmVkaXJlY3RVcmlzLFxuICAgICAgICBzZXJ2ZXJJbmZvOiBvcHRpb25zLnNlcnZlckluZm8sXG4gICAgICAgIHByb3RvY29sVmVyc2lvbnM6IG9wdGlvbnMucHJvdG9jb2xWZXJzaW9ucyxcbiAgICAgICAgc2NvcGVzOiBvcHRpb25zLnNjb3BlcyxcbiAgICAgICAgbGFtYmRhT3B0aW9uczogb3B0aW9ucy5sYW1iZGFPcHRpb25zLFxuICAgICAgICBzdGFnZU5hbWU6IHRoaXMucHJvcHMuc3RhZ2VOYW1lLFxuICAgICAgICBjbGllbnRDb25zdHJ1Y3RJZDogY29nbml0b09wdHMuY2xpZW50Q29uc3RydWN0SWQsXG4gICAgICAgIGFkZGl0aW9uYWxDYWxsYmFja1VybHM6IGNvZ25pdG9PcHRzLmFkZGl0aW9uYWxDYWxsYmFja1VybHMsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIG1jcENvZ25pdG8ubWNwQXV0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ2VuZXJpY09wdHMgPSBvcHRpb25zLmdlbmVyaWMhO1xuXG4gICAgICByZXR1cm4gbmV3IE1jcEF1dGgodGhpcywgJ01jcEF1dGgnLCB7XG4gICAgICAgIGFwaURvbWFpbixcbiAgICAgICAgYXV0aG9yaXplRW5kcG9pbnQ6IGdlbmVyaWNPcHRzLmF1dGhvcml6ZUVuZHBvaW50LFxuICAgICAgICB0b2tlbkVuZHBvaW50OiBnZW5lcmljT3B0cy50b2tlbkVuZHBvaW50LFxuICAgICAgICBhbGxvd2VkUmVkaXJlY3RVcmlzLFxuICAgICAgICBjbGllbnRJZDogZ2VuZXJpY09wdHMuY2xpZW50SWQsXG4gICAgICAgIHNlcnZlckluZm86IG9wdGlvbnMuc2VydmVySW5mbyxcbiAgICAgICAgcHJvdG9jb2xWZXJzaW9uczogb3B0aW9ucy5wcm90b2NvbFZlcnNpb25zLFxuICAgICAgICBzY29wZXM6IG9wdGlvbnMuc2NvcGVzLFxuICAgICAgICBzdHJpcFBhcmFtZXRlcnM6IG9wdGlvbnMuc3RyaXBQYXJhbWV0ZXJzLFxuICAgICAgICBsYW1iZGFPcHRpb25zOiBvcHRpb25zLmxhbWJkYU9wdGlvbnMsXG4gICAgICAgIHN0YWdlTmFtZTogdGhpcy5wcm9wcy5zdGFnZU5hbWUsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5qZWN0cyBNQ1AgT0F1dGggcGF0aHMgaW50byB0aGUgT3BlbkFQSSBzcGVjIHdpdGggTGFtYmRhIHByb3h5IGludGVncmF0aW9uc1xuICAgKiBwb2ludGluZyB0byB0aGUgTUNQIGF1dGggY29uc3RydWN0J3MgZnVuY3Rpb25zLiBBbGwgcGF0aHMgYXJlIGFub255bW91cyAoc2VjdXJpdHk6IFtdKS5cbiAgICovXG4gIHByaXZhdGUgaW5qZWN0TWNwQXV0aFBhdGhzKG1jcEF1dGg6IE1jcEF1dGgpIHtcbiAgICBjb25zdCBmbnMgPSBtY3BBdXRoLmZ1bmN0aW9ucztcblxuICAgIGNvbnN0IG1jcFBhdGhzOiBSZWNvcmQ8c3RyaW5nLCB7IGZuOiBMYW1iZGFGdW5jdGlvbjsgbWV0aG9kOiBzdHJpbmc7IG9wZXJhdGlvbklkOiBzdHJpbmc7IHN1bW1hcnk6IHN0cmluZyB9PiA9IHtcbiAgICAgICcvLndlbGwta25vd24vb2F1dGgtcHJvdGVjdGVkLXJlc291cmNlJzoge1xuICAgICAgICBmbjogZm5zLnByb3RlY3RlZFJlc291cmNlLFxuICAgICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgICBvcGVyYXRpb25JZDogJ21jcE9BdXRoUHJvdGVjdGVkUmVzb3VyY2UnLFxuICAgICAgICBzdW1tYXJ5OiAnT0F1dGggUHJvdGVjdGVkIFJlc291cmNlIE1ldGFkYXRhIChSRkMgOTcyOCknLFxuICAgICAgfSxcbiAgICAgICcvLndlbGwta25vd24vb2F1dGgtYXV0aG9yaXphdGlvbi1zZXJ2ZXInOiB7XG4gICAgICAgIGZuOiBmbnMuYXV0aG9yaXphdGlvblNlcnZlcixcbiAgICAgICAgbWV0aG9kOiAnZ2V0JyxcbiAgICAgICAgb3BlcmF0aW9uSWQ6ICdtY3BPQXV0aEF1dGhvcml6YXRpb25TZXJ2ZXInLFxuICAgICAgICBzdW1tYXJ5OiAnT0F1dGggQXV0aG9yaXphdGlvbiBTZXJ2ZXIgTWV0YWRhdGEgKFJGQyA4NDE0KScsXG4gICAgICB9LFxuICAgICAgJy9vYXV0aC9hdXRob3JpemUnOiB7XG4gICAgICAgIGZuOiBmbnMuYXV0aG9yaXplLFxuICAgICAgICBtZXRob2Q6ICdnZXQnLFxuICAgICAgICBvcGVyYXRpb25JZDogJ21jcE9BdXRoQXV0aG9yaXplJyxcbiAgICAgICAgc3VtbWFyeTogJ09BdXRoIEF1dGhvcml6ZSBQcm94eScsXG4gICAgICB9LFxuICAgICAgJy9vYXV0aC90b2tlbic6IHtcbiAgICAgICAgZm46IGZucy50b2tlbixcbiAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgIG9wZXJhdGlvbklkOiAnbWNwT0F1dGhUb2tlbicsXG4gICAgICAgIHN1bW1hcnk6ICdPQXV0aCBUb2tlbiBQcm94eScsXG4gICAgICB9LFxuICAgICAgJy9vYXV0aC9yZWdpc3Rlcic6IHtcbiAgICAgICAgZm46IGZucy5yZWdpc3RlcixcbiAgICAgICAgbWV0aG9kOiAncG9zdCcsXG4gICAgICAgIG9wZXJhdGlvbklkOiAnbWNwT0F1dGhSZWdpc3RlcicsXG4gICAgICAgIHN1bW1hcnk6ICdPQXV0aCBEeW5hbWljIENsaWVudCBSZWdpc3RyYXRpb24gKFJGQyA3NTkxKScsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IFtwYXRoLCBjb25maWddIG9mIE9iamVjdC5lbnRyaWVzKG1jcFBhdGhzKSkge1xuICAgICAgaWYgKCF0aGlzLmFwaVNwZWMucGF0aHMpIHtcbiAgICAgICAgdGhpcy5hcGlTcGVjLnBhdGhzID0ge307XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG9wZXJhdGlvbjogYW55ID0ge1xuICAgICAgICAnc3VtbWFyeSc6IGNvbmZpZy5zdW1tYXJ5LFxuICAgICAgICAnb3BlcmF0aW9uSWQnOiBjb25maWcub3BlcmF0aW9uSWQsXG4gICAgICAgICdzZWN1cml0eSc6IFtdLCAvLyBBbm9ueW1vdXMg4oCUIG5vIGF1dGhvcml6ZXJcbiAgICAgICAgJ3Jlc3BvbnNlcyc6IHtcbiAgICAgICAgICAyMDA6IHsgZGVzY3JpcHRpb246ICdTdWNjZXNzJyB9LFxuICAgICAgICAgIDMwMjogeyBkZXNjcmlwdGlvbjogJ1JlZGlyZWN0JyB9LFxuICAgICAgICB9LFxuICAgICAgICAneC1hbWF6b24tYXBpZ2F0ZXdheS1pbnRlZ3JhdGlvbic6IHtcbiAgICAgICAgICB0eXBlOiAnYXdzX3Byb3h5JyxcbiAgICAgICAgICBodHRwTWV0aG9kOiAnUE9TVCcsXG4gICAgICAgICAgdXJpOiBjZGsuU3RhY2sub2YodGhpcykuZm9ybWF0QXJuKHtcbiAgICAgICAgICAgIHJlc291cmNlOiAncGF0aCcsXG4gICAgICAgICAgICBzZXJ2aWNlOiAnYXBpZ2F0ZXdheScsXG4gICAgICAgICAgICBhY2NvdW50OiAnbGFtYmRhJyxcbiAgICAgICAgICAgIGFybkZvcm1hdDogY2RrLkFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FLFxuICAgICAgICAgICAgcmVzb3VyY2VOYW1lOiBgMjAxNS0wMy0zMS9mdW5jdGlvbnMvJHtjb25maWcuZm4uZnVuY3Rpb25Bcm59L2ludm9jYXRpb25zYCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBwYXNzdGhyb3VnaEJlaGF2aW9yOiAnd2hlbl9ub190ZW1wbGF0ZXMnLFxuICAgICAgICAgIHBheWxvYWRGb3JtYXRWZXJzaW9uOiAnMS4wJyxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGlmICghdGhpcy5hcGlTcGVjLnBhdGhzW3BhdGhdKSB7XG4gICAgICAgIHRoaXMuYXBpU3BlYy5wYXRoc1twYXRoXSA9IHt9O1xuICAgICAgfVxuXG4gICAgICAodGhpcy5hcGlTcGVjLnBhdGhzW3BhdGhdIGFzIGFueSlbY29uZmlnLm1ldGhvZF0gPSBvcGVyYXRpb247XG5cbiAgICAgIC8vIE1hcmsgYXMgYW5vbnltb3VzIHNvIHBhdGNoU2VjdXJpdHkgZG9lc24ndCBvdmVycmlkZSBpdFxuICAgICAgdGhpcy5fYW5vbnltb3VzT3BlcmF0aW9ucy5hZGQoY29uZmlnLm9wZXJhdGlvbklkKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgc2VjdXJpdHktc2NoZW1lIGNvbnRhaW5lciBmb3IgdGhlIHNwZWMsIGNyZWF0aW5nIGl0IGlmIG5lZWRlZC5cbiAgICogT3BlbkFQSSAzLnggc3RvcmVzIHNjaGVtZXMgdW5kZXIgYGNvbXBvbmVudHMuc2VjdXJpdHlTY2hlbWVzYDsgU3dhZ2dlciAyLjBcbiAgICogdXNlcyB0aGUgcm9vdCBgc2VjdXJpdHlEZWZpbml0aW9uc2AuIEFQSSBHYXRld2F5IHJlYWRzIG9ubHkgdGhlIGxvY2F0aW9uIHRoYXRcbiAgICogbWF0Y2hlcyB0aGUgZG9jdW1lbnQncyBkZWNsYXJlZCB2ZXJzaW9uLCBzbyB0aGUgYXV0aG9yaXplciBtdXN0IGdvIHRoZXJlLlxuICAgKi9cbiAgcHJpdmF0ZSBzZWN1cml0eVNjaGVtZUNvbnRhaW5lcihzcGVjOiBPcGVuQVBJMyk6IHsgW25hbWU6IHN0cmluZ106IGFueSB9IHtcbiAgICBjb25zdCBzcGVjQW55ID0gc3BlYyBhcyBhbnk7XG4gICAgY29uc3QgaXNPcGVuQXBpVjMgPSB0eXBlb2Ygc3BlY0FueS5vcGVuYXBpID09PSAnc3RyaW5nJyAmJiBzcGVjQW55Lm9wZW5hcGkuc3RhcnRzV2l0aCgnMycpO1xuICAgIGlmIChpc09wZW5BcGlWMykge1xuICAgICAgc3BlY0FueS5jb21wb25lbnRzID0gc3BlY0FueS5jb21wb25lbnRzID8/IHt9O1xuICAgICAgc3BlY0FueS5jb21wb25lbnRzLnNlY3VyaXR5U2NoZW1lcyA9IHNwZWNBbnkuY29tcG9uZW50cy5zZWN1cml0eVNjaGVtZXMgPz8ge307XG4gICAgICByZXR1cm4gc3BlY0FueS5jb21wb25lbnRzLnNlY3VyaXR5U2NoZW1lcztcbiAgICB9XG4gICAgc3BlY0FueS5zZWN1cml0eURlZmluaXRpb25zID0gc3BlY0FueS5zZWN1cml0eURlZmluaXRpb25zID8/IHt9O1xuICAgIHJldHVybiBzcGVjQW55LnNlY3VyaXR5RGVmaW5pdGlvbnM7XG4gIH1cblxuICAvKipcbiAgICogQVdTIGRvZXMgbm90IHByb3Blcmx5IGFwcGx5IHRoZSAnc2VjdXJpdHknIG9wdGlvbiB0byBldmVyeSBzaW5nbGUgcGF0aC1tZXRob2QuXG4gICAqIEFjY29yZGluZyB0byBkb2N1bWVudGF0aW9uLCBnbG9iYWwgc2VjdXJpdHkgZ2V0cyBhcHBsaWVkLCBpZiB0aGVyZSBpcyBubyBzZWN1cml0eVxuICAgKiBzZXQgZm9yIHRoZSBwYXJ0aWN1bGFyIHBhdGgtbWV0aG9kLiBJZiB0aGVyZSBpcyBhbnksIGV2ZW4gZW1wdHksIGl0IHdpbGwgZ2V0IHByZWNlZGVuY2UuXG4gICAqIFRISVMgRE9FUyBOT1QgSEFQUEVOIE9OIEFXUy4gSVQgSlVTVCBBTFdBWVMgVVNFUyBUSEUgR0xPQkFMIFNFVFRJTkchXG4gICAqXG4gICAqICdzZWN1cml0eSBhcHBsaWVzIFsuLi5dIHNjaGVtZXMgZ2xvYmFsbHkgdG8gYWxsIEFQSSBvcGVyYXRpb25zLCB1bmxlc3Mgb3ZlcnJpZGRlbiBvbiB0aGUgb3BlcmF0aW9uIGxldmVsJ1xuICAgKiBAc2VlIGh0dHBzOi8vc3dhZ2dlci5pby9kb2NzL3NwZWNpZmljYXRpb24vYXV0aGVudGljYXRpb24vXG4gICAqL1xuICBwcm90ZWN0ZWQgcGF0Y2hTZWN1cml0eShzcGVjOiBPcGVuQVBJMykge1xuICAgIGlmICgnc2VjdXJpdHknIGluIHNwZWMpIHtcbiAgICAgIC8vIFJlc29sdmUgcGVyLW9wZXJhdGlvbiBzY29wZSBvdmVycmlkZXMgZnJvbSB0aGUgZGVkaWNhdGVkIHByb3AuXG4gICAgICBjb25zdCBwZXJPcGVyYXRpb25TY29wZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiB8IHVuZGVmaW5lZCA9XG4gICAgICAgIHRoaXMucHJvcHMuYXV0aG9yaXphdGlvblNjb3Blc0J5T3BlcmF0aW9uXG4gICAgICAgICAgPyB0aGlzLnByb3BzLmF1dGhvcml6YXRpb25TY29wZXNCeU9wZXJhdGlvbiBhcyBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT5cbiAgICAgICAgICA6IHVuZGVmaW5lZDtcblxuICAgICAgZm9yIChjb25zdCBzcGVjUGF0aCBvZiBPYmplY3QudmFsdWVzKHNwZWMucGF0aHMgfHwgW10pKSB7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNwZWNQYXRoKSB7XG4gICAgICAgICAgaWYgKCF0aGlzLmFwaU1ldGhvZHMuaW5jbHVkZXMoa2V5KSkge1xuICAgICAgICAgICAgY29udGludWU7IC8vIFNraXAgaWYgbm90IGh0dHAgbWV0aG9kIGRlZmluaXRpb25cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzcGVjTWV0aG9kID0gKHNwZWNQYXRoIGFzIFBhdGhJdGVtT2JqZWN0KVtrZXkgYXMga2V5b2YgUGF0aEl0ZW1PYmplY3RdITtcbiAgICAgICAgICBpZiAoISgnc2VjdXJpdHknIGluIHNwZWNNZXRob2QpKSB7XG4gICAgICAgICAgICBjb25zdCBvcGVyYXRpb25JZCA9IChzcGVjTWV0aG9kIGFzIE9wZXJhdGlvbk9iamVjdCkub3BlcmF0aW9uSWQ7XG4gICAgICAgICAgICBpZiAob3BlcmF0aW9uSWQgJiYgdGhpcy5fYW5vbnltb3VzT3BlcmF0aW9ucy5oYXMob3BlcmF0aW9uSWQpKSB7XG4gICAgICAgICAgICAgIC8vIFN0b3JlIHdoYXQgc2VjdXJpdHkgd291bGQgaGF2ZSBiZWVuIGFwcGxpZWQgc28gd2UgY2FuIHJlc3RvcmUgbGF0ZXJcbiAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luYWxPcGVyYXRpb25TZWN1cml0eS5zZXQob3BlcmF0aW9uSWQsIHNwZWMuc2VjdXJpdHkgYXMgYW55W10pO1xuICAgICAgICAgICAgICBzcGVjTWV0aG9kLnNlY3VyaXR5ID0gW107XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBBcHBseSBwZXItb3BlcmF0aW9uIHNjb3BlIG92ZXJyaWRlIGlmIGNvbmZpZ3VyZWRcbiAgICAgICAgICAgICAgY29uc3Qgb3BlcmF0aW9uU2VjdXJpdHkgPSB0aGlzLmFwcGx5T3BlcmF0aW9uU2NvcGVzKFxuICAgICAgICAgICAgICAgIHNwZWMuc2VjdXJpdHkgYXMgYW55W10sXG4gICAgICAgICAgICAgICAgb3BlcmF0aW9uSWQsXG4gICAgICAgICAgICAgICAgcGVyT3BlcmF0aW9uU2NvcGVzLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBzcGVjTWV0aG9kLnNlY3VyaXR5ID0gb3BlcmF0aW9uU2VjdXJpdHk7XG4gICAgICAgICAgICAgIGlmIChvcGVyYXRpb25JZCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX29yaWdpbmFsT3BlcmF0aW9uU2VjdXJpdHkuc2V0KG9wZXJhdGlvbklkLCBvcGVyYXRpb25TZWN1cml0eSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gT3BlcmF0aW9uIGFscmVhZHkgaGFzIGV4cGxpY2l0IHNlY3VyaXR5IGRlZmluZWQgaW4gdGhlIHNwZWNcbiAgICAgICAgICAgIGNvbnN0IG9wZXJhdGlvbklkID0gKHNwZWNNZXRob2QgYXMgT3BlcmF0aW9uT2JqZWN0KS5vcGVyYXRpb25JZDtcbiAgICAgICAgICAgIGlmIChvcGVyYXRpb25JZCkge1xuICAgICAgICAgICAgICB0aGlzLl9vcmlnaW5hbE9wZXJhdGlvblNlY3VyaXR5LnNldChvcGVyYXRpb25JZCwgc3BlY01ldGhvZC5zZWN1cml0eSBhcyBhbnlbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZWxldGUgc3BlYy5zZWN1cml0eTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBwZXItb3BlcmF0aW9uIHNjb3BlIG92ZXJyaWRlcyB0byBhIHNlY3VyaXR5IHJlcXVpcmVtZW50IGFycmF5LlxuICAgKiBJZiB0aGUgb3BlcmF0aW9uIGhhcyBhIHNwZWNpZmljIHNjb3BlIG92ZXJyaWRlIGluIHRoZSBtYXAsIHRoZSBhdXRob3JpemVyJ3NcbiAgICogc2NvcGUgbGlzdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBvdmVycmlkZS4gT3RoZXJ3aXNlIHRoZSBnbG9iYWwgc2VjdXJpdHkgaXMgdXNlZCBhcy1pcy5cbiAgICovXG4gIHByaXZhdGUgYXBwbHlPcGVyYXRpb25TY29wZXMoXG4gICAgZ2xvYmFsU2VjdXJpdHk6IGFueVtdLFxuICAgIG9wZXJhdGlvbklkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgcGVyT3BlcmF0aW9uU2NvcGVzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4gfCB1bmRlZmluZWQsXG4gICk6IGFueVtdIHtcbiAgICBpZiAoIW9wZXJhdGlvbklkIHx8ICFwZXJPcGVyYXRpb25TY29wZXMgfHwgIShvcGVyYXRpb25JZCBpbiBwZXJPcGVyYXRpb25TY29wZXMpKSB7XG4gICAgICByZXR1cm4gZ2xvYmFsU2VjdXJpdHk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2NvcGVzID0gcGVyT3BlcmF0aW9uU2NvcGVzW29wZXJhdGlvbklkXTtcbiAgICAvLyBDbG9uZSB0aGUgZ2xvYmFsIHNlY3VyaXR5IGFuZCByZXBsYWNlIHRoZSBhdXRob3JpemVyIHNjb3Blc1xuICAgIHJldHVybiBnbG9iYWxTZWN1cml0eS5tYXAoKHJlcXVpcmVtZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT4pID0+IHtcbiAgICAgIGNvbnN0IHBhdGNoZWQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZ1tdPiA9IHt9O1xuICAgICAgZm9yIChjb25zdCBbYXV0aE5hbWUsIF9hdXRoU2NvcGVzXSBvZiBPYmplY3QuZW50cmllcyhyZXF1aXJlbWVudCkpIHtcbiAgICAgICAgcGF0Y2hlZFthdXRoTmFtZV0gPSBzY29wZXM7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0Y2hlZDtcbiAgICB9KTtcbiAgfVxuXG59XG4iXX0=
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Configuration for the MCP OAuth façade.
3
+ * Service-agnostic: works with any OAuth2/OIDC provider that exposes
4
+ * a standard authorize + token endpoint.
5
+ */
6
+ export interface McpAuthConfig {
7
+ /** The API domain serving as the OAuth issuer (e.g. 'api.example.com') */
8
+ readonly apiDomain: string;
9
+ /**
10
+ * The upstream OAuth authorize endpoint URL.
11
+ * The authorize handler proxies requests here (302 redirect).
12
+ * Example: 'https://auth.example.com/oauth2/authorize'
13
+ */
14
+ readonly authorizeEndpoint: string;
15
+ /**
16
+ * The upstream OAuth token endpoint URL.
17
+ * The token handler proxies requests here.
18
+ * Example: 'https://auth.example.com/oauth2/token'
19
+ */
20
+ readonly tokenEndpoint: string;
21
+ /** Allowed redirect URIs for dynamic client registration */
22
+ readonly allowedRedirectUris: string[];
23
+ /** The pre-provisioned OAuth client ID returned by registration */
24
+ readonly clientId: string;
25
+ /** MCP server info for the initialize response */
26
+ readonly serverInfo: {
27
+ readonly name: string;
28
+ readonly version: string;
29
+ };
30
+ /** Supported MCP protocol versions */
31
+ readonly protocolVersions: string[];
32
+ /** OAuth scopes to advertise in discovery metadata */
33
+ readonly scopes?: string[];
34
+ /**
35
+ * Parameters to strip from authorize/token requests before proxying.
36
+ * Defaults to ['resource'] (RFC 8707 not supported by most providers).
37
+ */
38
+ readonly stripParameters?: string[];
39
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21jcC1hdXRoL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciB0aGUgTUNQIE9BdXRoIGZhw6dhZGUuXG4gKiBTZXJ2aWNlLWFnbm9zdGljOiB3b3JrcyB3aXRoIGFueSBPQXV0aDIvT0lEQyBwcm92aWRlciB0aGF0IGV4cG9zZXNcbiAqIGEgc3RhbmRhcmQgYXV0aG9yaXplICsgdG9rZW4gZW5kcG9pbnQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWNwQXV0aENvbmZpZyB7XG4gIC8qKiBUaGUgQVBJIGRvbWFpbiBzZXJ2aW5nIGFzIHRoZSBPQXV0aCBpc3N1ZXIgKGUuZy4gJ2FwaS5leGFtcGxlLmNvbScpICovXG4gIHJlYWRvbmx5IGFwaURvbWFpbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdXBzdHJlYW0gT0F1dGggYXV0aG9yaXplIGVuZHBvaW50IFVSTC5cbiAgICogVGhlIGF1dGhvcml6ZSBoYW5kbGVyIHByb3hpZXMgcmVxdWVzdHMgaGVyZSAoMzAyIHJlZGlyZWN0KS5cbiAgICogRXhhbXBsZTogJ2h0dHBzOi8vYXV0aC5leGFtcGxlLmNvbS9vYXV0aDIvYXV0aG9yaXplJ1xuICAgKi9cbiAgcmVhZG9ubHkgYXV0aG9yaXplRW5kcG9pbnQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHVwc3RyZWFtIE9BdXRoIHRva2VuIGVuZHBvaW50IFVSTC5cbiAgICogVGhlIHRva2VuIGhhbmRsZXIgcHJveGllcyByZXF1ZXN0cyBoZXJlLlxuICAgKiBFeGFtcGxlOiAnaHR0cHM6Ly9hdXRoLmV4YW1wbGUuY29tL29hdXRoMi90b2tlbidcbiAgICovXG4gIHJlYWRvbmx5IHRva2VuRW5kcG9pbnQ6IHN0cmluZztcblxuICAvKiogQWxsb3dlZCByZWRpcmVjdCBVUklzIGZvciBkeW5hbWljIGNsaWVudCByZWdpc3RyYXRpb24gKi9cbiAgcmVhZG9ubHkgYWxsb3dlZFJlZGlyZWN0VXJpczogc3RyaW5nW107XG5cbiAgLyoqIFRoZSBwcmUtcHJvdmlzaW9uZWQgT0F1dGggY2xpZW50IElEIHJldHVybmVkIGJ5IHJlZ2lzdHJhdGlvbiAqL1xuICByZWFkb25seSBjbGllbnRJZDogc3RyaW5nO1xuXG4gIC8qKiBNQ1Agc2VydmVyIGluZm8gZm9yIHRoZSBpbml0aWFsaXplIHJlc3BvbnNlICovXG4gIHJlYWRvbmx5IHNlcnZlckluZm86IHsgcmVhZG9ubHkgbmFtZTogc3RyaW5nOyByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmcgfTtcblxuICAvKiogU3VwcG9ydGVkIE1DUCBwcm90b2NvbCB2ZXJzaW9ucyAqL1xuICByZWFkb25seSBwcm90b2NvbFZlcnNpb25zOiBzdHJpbmdbXTtcblxuICAvKiogT0F1dGggc2NvcGVzIHRvIGFkdmVydGlzZSBpbiBkaXNjb3ZlcnkgbWV0YWRhdGEgKi9cbiAgcmVhZG9ubHkgc2NvcGVzPzogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFBhcmFtZXRlcnMgdG8gc3RyaXAgZnJvbSBhdXRob3JpemUvdG9rZW4gcmVxdWVzdHMgYmVmb3JlIHByb3h5aW5nLlxuICAgKiBEZWZhdWx0cyB0byBbJ3Jlc291cmNlJ10gKFJGQyA4NzA3IG5vdCBzdXBwb3J0ZWQgYnkgbW9zdCBwcm92aWRlcnMpLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RyaXBQYXJhbWV0ZXJzPzogc3RyaW5nW107XG59XG4iXX0=
@@ -0,0 +1,7 @@
1
+ import type { McpAuthConfig } from '../config';
2
+ import type { McpOAuthHandler } from './types';
3
+ /**
4
+ * Factory for the `/.well-known/oauth-authorization-server` endpoint (RFC 8414).
5
+ * Returns OAuth server metadata with all endpoint URLs pointing to the API domain.
6
+ */
7
+ export declare function createAuthorizationServerHandler(config: McpAuthConfig): McpOAuthHandler;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createAuthorizationServerHandler = createAuthorizationServerHandler;
4
+ /**
5
+ * Factory for the `/.well-known/oauth-authorization-server` endpoint (RFC 8414).
6
+ * Returns OAuth server metadata with all endpoint URLs pointing to the API domain.
7
+ */
8
+ function createAuthorizationServerHandler(config) {
9
+ return async (event) => {
10
+ console.log(JSON.stringify({
11
+ event: 'oauth-authorization-server',
12
+ method: event.httpMethod,
13
+ path: event.path,
14
+ }));
15
+ const scopes = config.scopes ?? ['openid', 'email', 'profile'];
16
+ const body = {
17
+ issuer: `https://${config.apiDomain}`,
18
+ authorization_endpoint: `https://${config.apiDomain}/oauth/authorize`,
19
+ token_endpoint: `https://${config.apiDomain}/oauth/token`,
20
+ registration_endpoint: `https://${config.apiDomain}/oauth/register`,
21
+ scopes_supported: scopes,
22
+ response_types_supported: ['code'],
23
+ grant_types_supported: ['authorization_code', 'refresh_token'],
24
+ code_challenge_methods_supported: ['S256'],
25
+ token_endpoint_auth_methods_supported: ['none'],
26
+ };
27
+ return {
28
+ statusCode: 200,
29
+ headers: { 'Content-Type': 'application/json' },
30
+ body: JSON.stringify(body),
31
+ };
32
+ };
33
+ }
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aG9yaXphdGlvbi1zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWNwLWF1dGgvaGFuZGxlcnMvYXV0aG9yaXphdGlvbi1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFPQSw0RUEyQkM7QUEvQkQ7OztHQUdHO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQUMsTUFBcUI7SUFDcEUsT0FBTyxLQUFLLEVBQUUsS0FBSyxFQUE2QixFQUFFO1FBQ2hELE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQztZQUN6QixLQUFLLEVBQUUsNEJBQTRCO1lBQ25DLE1BQU0sRUFBRSxLQUFLLENBQUMsVUFBVTtZQUN4QixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7U0FDakIsQ0FBQyxDQUFDLENBQUM7UUFFSixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMvRCxNQUFNLElBQUksR0FBRztZQUNYLE1BQU0sRUFBRSxXQUFXLE1BQU0sQ0FBQyxTQUFTLEVBQUU7WUFDckMsc0JBQXNCLEVBQUUsV0FBVyxNQUFNLENBQUMsU0FBUyxrQkFBa0I7WUFDckUsY0FBYyxFQUFFLFdBQVcsTUFBTSxDQUFDLFNBQVMsY0FBYztZQUN6RCxxQkFBcUIsRUFBRSxXQUFXLE1BQU0sQ0FBQyxTQUFTLGlCQUFpQjtZQUNuRSxnQkFBZ0IsRUFBRSxNQUFNO1lBQ3hCLHdCQUF3QixFQUFFLENBQUMsTUFBTSxDQUFDO1lBQ2xDLHFCQUFxQixFQUFFLENBQUMsb0JBQW9CLEVBQUUsZUFBZSxDQUFDO1lBQzlELGdDQUFnQyxFQUFFLENBQUMsTUFBTSxDQUFDO1lBQzFDLHFDQUFxQyxFQUFFLENBQUMsTUFBTSxDQUFDO1NBQ2hELENBQUM7UUFFRixPQUFPO1lBQ0wsVUFBVSxFQUFFLEdBQUc7WUFDZixPQUFPLEVBQUUsRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUU7WUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1NBQzNCLENBQUM7SUFDSixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBNY3BBdXRoQ29uZmlnIH0gZnJvbSAnLi4vY29uZmlnJztcbmltcG9ydCB0eXBlIHsgTWNwT0F1dGhIYW5kbGVyLCBNY3BPQXV0aFJlc3BvbnNlIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgdGhlIGAvLndlbGwta25vd24vb2F1dGgtYXV0aG9yaXphdGlvbi1zZXJ2ZXJgIGVuZHBvaW50IChSRkMgODQxNCkuXG4gKiBSZXR1cm5zIE9BdXRoIHNlcnZlciBtZXRhZGF0YSB3aXRoIGFsbCBlbmRwb2ludCBVUkxzIHBvaW50aW5nIHRvIHRoZSBBUEkgZG9tYWluLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQXV0aG9yaXphdGlvblNlcnZlckhhbmRsZXIoY29uZmlnOiBNY3BBdXRoQ29uZmlnKTogTWNwT0F1dGhIYW5kbGVyIHtcbiAgcmV0dXJuIGFzeW5jIChldmVudCk6IFByb21pc2U8TWNwT0F1dGhSZXNwb25zZT4gPT4ge1xuICAgIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KHtcbiAgICAgIGV2ZW50OiAnb2F1dGgtYXV0aG9yaXphdGlvbi1zZXJ2ZXInLFxuICAgICAgbWV0aG9kOiBldmVudC5odHRwTWV0aG9kLFxuICAgICAgcGF0aDogZXZlbnQucGF0aCxcbiAgICB9KSk7XG5cbiAgICBjb25zdCBzY29wZXMgPSBjb25maWcuc2NvcGVzID8/IFsnb3BlbmlkJywgJ2VtYWlsJywgJ3Byb2ZpbGUnXTtcbiAgICBjb25zdCBib2R5ID0ge1xuICAgICAgaXNzdWVyOiBgaHR0cHM6Ly8ke2NvbmZpZy5hcGlEb21haW59YCxcbiAgICAgIGF1dGhvcml6YXRpb25fZW5kcG9pbnQ6IGBodHRwczovLyR7Y29uZmlnLmFwaURvbWFpbn0vb2F1dGgvYXV0aG9yaXplYCxcbiAgICAgIHRva2VuX2VuZHBvaW50OiBgaHR0cHM6Ly8ke2NvbmZpZy5hcGlEb21haW59L29hdXRoL3Rva2VuYCxcbiAgICAgIHJlZ2lzdHJhdGlvbl9lbmRwb2ludDogYGh0dHBzOi8vJHtjb25maWcuYXBpRG9tYWlufS9vYXV0aC9yZWdpc3RlcmAsXG4gICAgICBzY29wZXNfc3VwcG9ydGVkOiBzY29wZXMsXG4gICAgICByZXNwb25zZV90eXBlc19zdXBwb3J0ZWQ6IFsnY29kZSddLFxuICAgICAgZ3JhbnRfdHlwZXNfc3VwcG9ydGVkOiBbJ2F1dGhvcml6YXRpb25fY29kZScsICdyZWZyZXNoX3Rva2VuJ10sXG4gICAgICBjb2RlX2NoYWxsZW5nZV9tZXRob2RzX3N1cHBvcnRlZDogWydTMjU2J10sXG4gICAgICB0b2tlbl9lbmRwb2ludF9hdXRoX21ldGhvZHNfc3VwcG9ydGVkOiBbJ25vbmUnXSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXR1c0NvZGU6IDIwMCxcbiAgICAgIGhlYWRlcnM6IHsgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyB9LFxuICAgICAgYm9keTogSlNPTi5zdHJpbmdpZnkoYm9keSksXG4gICAgfTtcbiAgfTtcbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ import type { McpAuthConfig } from '../config';
2
+ import type { McpOAuthHandler } from './types';
3
+ /**
4
+ * Factory for the `/oauth/authorize` proxy endpoint.
5
+ * Strips configured parameters (default: 'resource') before redirecting
6
+ * to the upstream authorization endpoint.
7
+ */
8
+ export declare function createAuthorizeHandler(config: McpAuthConfig): McpOAuthHandler;