@mikarinneoracle/oci-cdk-code-only-preview 0.0.13 → 0.0.15

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.
@@ -48,6 +48,7 @@ const apigateway_gateway_1 = require("../.gen/providers/oci/apigateway-gateway")
48
48
  const apigateway_deployment_1 = require("../.gen/providers/oci/apigateway-deployment");
49
49
  const functions_application_1 = require("../.gen/providers/oci/functions-application");
50
50
  const functions_function_1 = require("../.gen/providers/oci/functions-function");
51
+ const data_oci_functions_functions_1 = require("../.gen/providers/oci/data-oci-functions-functions");
51
52
  const logging_log_group_1 = require("../.gen/providers/oci/logging-log-group");
52
53
  const logging_log_1 = require("../.gen/providers/oci/logging-log");
53
54
  const identity_policy_1 = require("../.gen/providers/oci/identity-policy");
@@ -158,8 +159,9 @@ class OciStack extends cdktf_1.TerraformStack {
158
159
  // OCI_STACK_ACTION: "function-only" (or legacy "function") => no API Gateway; "full-stack" or unset => full stack including API Gateway.
159
160
  const stackActionRaw = (process.env.OCI_STACK_ACTION || '').trim().toLowerCase();
160
161
  const codeOnly = process.env.OCI_CODE_ONLY === '1' || process.env['code-only'] === '1';
161
- // The preview archive function is created by OCI CLI, so its OCID is not available to CDKTF for API Gateway wiring.
162
- const stackAction = codeOnly || stackActionRaw === 'function-only' || stackActionRaw === 'function' ? 'function-only' : 'full-stack';
162
+ // Code-only functions are created by OCI CLI. When the full stack is requested,
163
+ // their OCID is looked up by Terraform before wiring the API Gateway route.
164
+ const stackAction = stackActionRaw === 'function-only' || stackActionRaw === 'function' ? 'function-only' : 'full-stack';
163
165
  // OCIR Container Repository (root compartment allowed if explicitly set).
164
166
  const ocirCompartmentId = config.ocirCompartmentId || config.compartmentId;
165
167
  const ocirRepoName = config.ocirRepositoryName || config.functionName || 'oci-function';
@@ -448,7 +450,15 @@ tail-function-logs.js
448
450
  });
449
451
  ociFunction.addOverride('depends_on', [`null_resource.${buildAndPushImageId}`]);
450
452
  }
451
- if (stackAction === 'full-stack' && apiGateway && ociFunction) {
453
+ let functionIdForGateway = ociFunction?.id;
454
+ if (stackAction === 'full-stack' && apiGateway && codeOnly) {
455
+ const codeOnlyFunction = new data_oci_functions_functions_1.DataOciFunctionsFunctions(this, 'CodeOnlyFunction', {
456
+ applicationId: functionApp.id,
457
+ displayName: config.functionName,
458
+ });
459
+ functionIdForGateway = codeOnlyFunction.functions.get(0).id;
460
+ }
461
+ if (stackAction === 'full-stack' && apiGateway && functionIdForGateway) {
452
462
  const pathPrefix = config.apiGwPathPrefix ?? '/';
453
463
  let routes;
454
464
  if (config.apiGwDeploymentJsonPath && fs.existsSync(config.apiGwDeploymentJsonPath)) {
@@ -459,8 +469,8 @@ tail-function-logs.js
459
469
  const b = r.backend ?? {};
460
470
  const functionIdRaw = (b.functionId ?? b.function_id);
461
471
  const functionId = typeof functionIdRaw === 'string' && functionIdRaw.includes('${function_id}')
462
- ? ociFunction.id
463
- : (functionIdRaw ?? ociFunction.id);
472
+ ? functionIdForGateway
473
+ : (functionIdRaw ?? functionIdForGateway);
464
474
  const readTimeout = (b.readTimeoutInSeconds ?? b.read_timeout_in_seconds);
465
475
  return {
466
476
  path: r.path ?? '/{path*}',
@@ -482,7 +492,7 @@ tail-function-logs.js
482
492
  methods,
483
493
  backend: {
484
494
  type: 'ORACLE_FUNCTIONS_BACKEND',
485
- functionId: ociFunction.id,
495
+ functionId: functionIdForGateway,
486
496
  readTimeoutInSeconds: config.functionTimeoutSeconds ?? 30,
487
497
  },
488
498
  },
@@ -497,7 +507,8 @@ tail-function-logs.js
497
507
  routes,
498
508
  },
499
509
  });
500
- apiDeployment.node.addDependency(ociFunction);
510
+ if (ociFunction)
511
+ apiDeployment.node.addDependency(ociFunction);
501
512
  }
502
513
  // Functions execution log: SERVICE log for the Functions application (category invoke)
503
514
  const executionLog = new logging_log_1.LoggingLog(this, 'ExecutionLog', {
@@ -540,4 +551,4 @@ tail-function-logs.js
540
551
  }
541
552
  }
542
553
  exports.OciStack = OciStack;
543
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vb2NpLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLGlDQUF3RDtBQUN4RCw2REFBNkQ7QUFDN0QseUdBQW9HO0FBQ3BHLDZEQUF5RDtBQUN6RCxtRUFBK0Q7QUFDL0QsaUZBQTRFO0FBQzVFLHFGQUFnRjtBQUNoRix5RkFBbUY7QUFDbkYsNkVBQXdFO0FBQ3hFLHVGQUFrRjtBQUNsRixpRkFBNkU7QUFDN0UsdUZBQW1GO0FBQ25GLHVGQUFtRjtBQUNuRixpRkFBNkU7QUFDN0UsK0VBQTBFO0FBQzFFLG1FQUErRDtBQUMvRCwyRUFBdUU7QUFDdkUscURBQXFGO0FBQ3JGLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0IsTUFBTSx1QkFBdUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBMkIvQixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRzs7Ozs7Ozs7RUFROUIsQ0FBQztBQUVILE1BQU0sdUJBQXVCLEdBQUc7Ozs7O0NBSy9CLENBQUM7QUFFRixNQUFNLHVCQUF1QixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBbUIvQixDQUFDO0FBMENGLE1BQWEsUUFBUyxTQUFRLHNCQUFjO0lBQzFDLFlBQVksS0FBZ0IsRUFBRSxFQUFVLEVBQUUsTUFBc0I7UUFDOUQsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVqQiw2Q0FBNkM7UUFDN0MsSUFBSSxNQUFNLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO1lBQ3RELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2xDLHFCQUFxQjtnQkFDckIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRTtvQkFDcEMs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Q29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjaywgVGVycmFmb3JtT3V0cHV0IH0gZnJvbSAnY2RrdGYnO1xuaW1wb3J0IHsgT2NpUHJvdmlkZXIgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvcHJvdmlkZXInO1xuaW1wb3J0IHsgQXJ0aWZhY3RzQ29udGFpbmVyUmVwb3NpdG9yeSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9hcnRpZmFjdHMtY29udGFpbmVyLXJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29yZVZjbiB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9jb3JlLXZjbic7XG5pbXBvcnQgeyBDb3JlU3VibmV0IH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2NvcmUtc3VibmV0JztcbmltcG9ydCB7IENvcmVTZWN1cml0eUxpc3QgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvY29yZS1zZWN1cml0eS1saXN0JztcbmltcG9ydCB7IENvcmVTZXJ2aWNlR2F0ZXdheSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9jb3JlLXNlcnZpY2UtZ2F0ZXdheSc7XG5pbXBvcnQgeyBEYXRhT2NpQ29yZVNlcnZpY2VzIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2RhdGEtb2NpLWNvcmUtc2VydmljZXMnO1xuaW1wb3J0IHsgQ29yZVJvdXRlVGFibGUgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvY29yZS1yb3V0ZS10YWJsZSc7XG5pbXBvcnQgeyBDb3JlSW50ZXJuZXRHYXRld2F5IH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2NvcmUtaW50ZXJuZXQtZ2F0ZXdheSc7XG5pbXBvcnQgeyBBcGlnYXRld2F5R2F0ZXdheSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9hcGlnYXRld2F5LWdhdGV3YXknO1xuaW1wb3J0IHsgQXBpZ2F0ZXdheURlcGxveW1lbnQgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvYXBpZ2F0ZXdheS1kZXBsb3ltZW50JztcbmltcG9ydCB7IEZ1bmN0aW9uc0FwcGxpY2F0aW9uIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2Z1bmN0aW9ucy1hcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBGdW5jdGlvbnNGdW5jdGlvbiB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9mdW5jdGlvbnMtZnVuY3Rpb24nO1xuaW1wb3J0IHsgTG9nZ2luZ0xvZ0dyb3VwIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2xvZ2dpbmctbG9nLWdyb3VwJztcbmltcG9ydCB7IExvZ2dpbmdMb2cgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvbG9nZ2luZy1sb2cnO1xuaW1wb3J0IHsgSWRlbnRpdHlQb2xpY3kgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvaWRlbnRpdHktcG9saWN5JztcbmltcG9ydCB7IE9jaUJhY2tlbmRDb25maWcsIG9jaXJIb3N0S2V5LCBnZXRPY2lJbWFnZVVybCB9IGZyb20gJy4uL2NvbmZpZy9vY2ktY29uZmlnJztcbmltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmNvbnN0IEdSQUFMVk1fSkFWQV9ET0NLRVJGSUxFID0gYEZST00gZG9ja2VyLmlvL2ZucHJvamVjdC9mbi1qYXZhLWZkay1idWlsZDpqZGsxNy0xLjAtbGF0ZXN0IGFzIGJ1aWxkLXN0YWdlXG5XT1JLRElSIC9mdW5jdGlvblxuRU5WIE1BVkVOX09QVFMgLURodHRwLnByb3h5SG9zdD0gLURodHRwLnByb3h5UG9ydD0gLURodHRwcy5wcm94eUhvc3Q9IC1EaHR0cHMucHJveHlQb3J0PSAtRGh0dHAubm9uUHJveHlIb3N0cz0gLURtYXZlbi5yZXBvLmxvY2FsPS91c3Ivc2hhcmUvbWF2ZW4vcmVmL3JlcG9zaXRvcnlcbkFERCBwb20ueG1sIC9mdW5jdGlvbi9wb20ueG1sXG5SVU4gW1wibXZuXCIsIFwicGFja2FnZVwiLCBcImRlcGVuZGVuY3k6Y29weS1kZXBlbmRlbmNpZXNcIiwgXCItRGluY2x1ZGVTY29wZT1ydW50aW1lXCIsIFwiLURza2lwVGVzdHM9dHJ1ZVwiLCBcIi1EbWRlcC5wcmVwZW5kR3JvdXBJZD10cnVlXCIsIFwiLURvdXRwdXREaXJlY3Rvcnk9dGFyZ2V0XCIsIFwiLS1mYWlsLW5ldmVyXCJdXG5BREQgc3JjIC9mdW5jdGlvbi9zcmNcblJVTiBbXCJtdm5cIiwgXCJwYWNrYWdlXCJdXG5cbkZST00gY29udGFpbmVyLXJlZ2lzdHJ5Lm9yYWNsZS5jb20vZ3JhYWx2bS9uYXRpdmUtaW1hZ2U6MjMtb2w4IEFTIG5hdGl2ZVxuV09SS0RJUiAvYXBwXG5DT1BZIC0tZnJvbT1idWlsZC1zdGFnZSAvZnVuY3Rpb24vdGFyZ2V0IC5cbkFERCByZWZsZWN0aW9uLmpzb24gLlxuXG5SVU4gbmF0aXZlLWltYWdlIFxcXFxcbiAgICAgLUg6UmVmbGVjdGlvbkNvbmZpZ3VyYXRpb25GaWxlcz0vYXBwL3JlZmxlY3Rpb24uanNvbiBcXFxcXG4gICAgIC1PYiBcXFxcXG4gICAgIC1IOk5hbWU9SGVsbG8gXFxcXFxuICAgICAtY3AgXCIvYXBwL2hlbGxvLTEuMC4wLmphcjovYXBwLypcIiAgXFxcXFxuICAgICAgICBjb20uZm5wcm9qZWN0LmZuLnJ1bnRpbWUuRW50cnlQb2ludFxuXG5GUk9NIGRvY2tlci5pby9mbnByb2plY3QvZm4tamF2YS1mZGs6anJlMTctbGF0ZXN0IGFzIGZka1xuXG5GUk9NIGNvbnRhaW5lci1yZWdpc3RyeS5vcmFjbGUuY29tL29zL29yYWNsZWxpbnV4Ojgtc2xpbVxuQ09QWSAtLWZyb209bmF0aXZlIC9hcHAvSGVsbG8gLlxuQ09QWSAtLWZyb209ZmRrIC9mdW5jdGlvbi9ydW50aW1lLyogLi9cbkVOVFJZUE9JTlQgWyBcIi4vSGVsbG9cIiBdXG5DTUQgWyBcImNvbS5leGFtcGxlLmZuLkhlbGxvRnVuY3Rpb246OmhhbmRsZVJlcXVlc3RcIiwgXCItRGphdmEubGlicmFyeS5wYXRoPS9saWJcIl1cbmA7XG5cbmNvbnN0IEdSQUFMVk1fUkVGTEVDVElPTl9KU09OID0gYFtcbiAgICB7XG4gICAgICBcIm5hbWVcIjogXCJjb20uZXhhbXBsZS5mbi5IZWxsb0Z1bmN0aW9uXCIsXG4gICAgICBcImFsbERlY2xhcmVkTWV0aG9kc1wiOiB0cnVlLFxuICAgICAgXCJtZXRob2RzXCI6IFtcbiAgICAgICAgeyBcIm5hbWVcIjogXCI8aW5pdD5cIiwgXCJwYXJhbWV0ZXJUeXBlc1wiOiBbXSB9XG4gICAgICBdXG4gICAgfVxuXWA7XG5cbmNvbnN0IEdSQUFMVk1fUE9NX1JVTlRJTUVfREVQID0gYCAgICAgICAgPGRlcGVuZGVuY3k+XG4gICAgICAgICAgICA8Z3JvdXBJZD5jb20uZm5wcm9qZWN0LmZuPC9ncm91cElkPlxuICAgICAgICAgICAgPGFydGlmYWN0SWQ+cnVudGltZTwvYXJ0aWZhY3RJZD5cbiAgICAgICAgICAgIDx2ZXJzaW9uPlxcJHtmZGsudmVyc2lvbn08L3ZlcnNpb24+XG4gICAgICAgIDwvZGVwZW5kZW5jeT5cbmA7XG5cbmNvbnN0IEdSQUFMVk1fUE9NX0JVSUxEX0JMT0NLID0gYCAgICA8YnVpbGQ+XG4gICAgICAgIDxwbHVnaW5zPlxuICAgICAgICAgICAgPHBsdWdpbj5cbiAgICAgICAgICAgICAgICA8IS0tIENvcHkgZGVwZW5kZW5jaWVzIC0tPlxuICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPlxuICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPlxuICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmluc3RhbGw8L3BoYXNlPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNvcHktZGVwZW5kZW5jaWVzPC9nb2FsPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+XFwke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9saWI8L291dHB1dERpcmVjdG9yeT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+XG4gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPlxuICAgICAgICAgICAgPC9wbHVnaW4+XG4gICAgICAgIDwvcGx1Z2lucz5cbiAgICA8L2J1aWxkPlxuYDtcblxuZXhwb3J0IGludGVyZmFjZSBPY2lTdGFja0NvbmZpZyB7XG4gIGNvbXBhcnRtZW50SWQ6IHN0cmluZztcbiAgb2NpckNvbXBhcnRtZW50SWQ/OiBzdHJpbmc7XG4gIHRlbmFuY3lJZDogc3RyaW5nO1xuICByZWdpb246IHN0cmluZztcbiAgbmFtZXNwYWNlOiBzdHJpbmc7XG4gIC8qKiBXaGVuIHRydWUsIGNyZWF0ZSBJQU0gcG9saWN5IHNvIEFQSSBHYXRld2F5IGNhbiBpbnZva2UgRnVuY3Rpb25zLiAqL1xuICBjcmVhdGVBcGlnd1BvbGljeT86IGJvb2xlYW47XG4gIC8qKiBPQ0kgRnVuY3Rpb25zIGFwcGxpY2F0aW9uIG5hbWUgKGUuZy4gbXktYXBwKS4gU2V0IHZpYSBPQ0lfRlVOQ1RJT05fQVBQX05BTUUgb3IgcGFzcyBpbiBjb25maWcuICovXG4gIGZ1bmN0aW9uQXBwTmFtZTogc3RyaW5nO1xuICAvKiogT0NJIEZ1bmN0aW9uIG5hbWUgKGUuZy4gbXktZnVuY3Rpb24pLiBTZXQgdmlhIE9DSV9GVU5DVElPTl9OQU1FIG9yIHBhc3MgaW4gY29uZmlnLiAqL1xuICBmdW5jdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqIE9wdGlvbmFsIHBhdGggdG8gSkFSIChvciBEb2NrZXJmaWxlIGNvbnRleHQpIHRvIGJ1aWxkIGFuZCBkZXBsb3kgYXMgdGhlIGZ1bmN0aW9uIGltYWdlLiBTZXQgdmlhIE9DSV9GVU5DVElPTl9KQVJfUEFUSC4gRW1wdHkgPSBubyBmdW5jdGlvbi9pbWFnZSBidWlsZC4gKi9cbiAgZnVuY3Rpb25KYXJQYXRoPzogc3RyaW5nO1xuICAvKiogRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGFyZ2V0LyAoRG9ja2VyZmlsZSBpcyBnZW5lcmF0ZWQgaW4gbG9jYWwtZXhlYykuIFdoZW4gc2V0IHdpdGggZnVuY3Rpb25OYW1lLCBjcmVhdGVzIFZDTiwgRnVuY3Rpb24sIEFQSSBHYXRld2F5LiAqL1xuICBkb2NrZXJDb250ZXh0UGF0aD86IHN0cmluZztcbiAgLyoqIEltYWdlIHRhZyBmb3IgT0NJUiAoZnJvbSBmdW5jLnlhbWwgdmVyc2lvbiBvciBPQ0lfSU1BR0VfVEFHOyBkZWZhdWx0ICdsYXRlc3QnKS4gKi9cbiAgaW1hZ2VUYWc/OiBzdHJpbmc7XG4gIC8qKiBKYXZhIEZESyBDTUQgaGFuZGxlciAoZnJvbSBmdW5jLnlhbWwgb3IgT0NJX0ZVTkNUSU9OX0hBTkRMRVIpLiAqL1xuICBoYW5kbGVyPzogc3RyaW5nO1xuICBvY2lyUmVwb3NpdG9yeU5hbWU/OiBzdHJpbmc7XG4gIC8qKiBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHBhdGggcHJlZml4LiBEZWZhdWx0ICcvJy4gKi9cbiAgYXBpR3dQYXRoUHJlZml4Pzogc3RyaW5nO1xuICAvKiogQVBJIEdhdGV3YXkgcm91dGUgcGF0aC4gRGVmYXVsdCAnL3twYXRoKn0nLiAqL1xuICBhcGlHd1JvdXRlUGF0aD86IHN0cmluZztcbiAgLyoqIEFQSSBHYXRld2F5IHJvdXRlIG1ldGhvZHMuIERlZmF1bHQgWydHRVQnLCAnUE9TVCcsICdPUFRJT05TJ10uICovXG4gIGFwaUd3TWV0aG9kcz86IHN0cmluZ1tdO1xuICAvKiogRnVuY3Rpb24gbWVtb3J5IGluIE1CIChlLmcuICcyNTYnKS4gRnJvbSBmdW5jLnlhbWwgb3IgT0NJX0ZVTkNUSU9OX01FTU9SWV9NQi4gKi9cbiAgZnVuY3Rpb25NZW1vcnlNYj86IHN0cmluZztcbiAgLyoqIEZ1bmN0aW9uIHRpbWVvdXQgaW4gc2Vjb25kcy4gRnJvbSBmdW5jLnlhbWwgb3IgT0NJX0ZVTkNUSU9OX1RJTUVPVVRfU0VDT05EUy4gKi9cbiAgZnVuY3Rpb25UaW1lb3V0U2Vjb25kcz86IG51bWJlcjtcbiAgLyoqIEZ1bmN0aW9uIGNvbmZpZy9lbnYga2V5LXZhbHVlLiBGcm9tIGZ1bmMueWFtbCBjb25maWcgb3IgT0NJX0ZVTkNUSU9OX0NPTkZJRy4gKi9cbiAgZnVuY3Rpb25Db25maWc/OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuICAvKiogUGF0aCB0byBBUEkgR2F0ZXdheSBkZXBsb3ltZW50IHNwZWMgSlNPTiAocm91dGVzKS4gRGVmYXVsdCBvY2lfYXBpZ2F0ZXdheV9kZXBsb3ltZW50Lmpzb24gaW4gcHJvamVjdCByb290LiAqL1xuICBhcGlHd0RlcGxveW1lbnRKc29uUGF0aD86IHN0cmluZztcbiAgLyoqIFJ1bnRpbWUgZnJvbSBmdW5jLnlhbWwgKGUuZy4gJ2phdmEnLCAncHl0aG9uJyk7IGNvbnRyb2xzIERvY2tlcmZpbGUgZ2VuZXJhdGlvbi4gKi9cbiAgcnVudGltZT86IHN0cmluZztcbiAgYmFja2VuZD86IE9jaUJhY2tlbmRDb25maWc7XG59XG5cbmV4cG9ydCBjbGFzcyBPY2lTdGFjayBleHRlbmRzIFRlcnJhZm9ybVN0YWNrIHtcbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgY29uZmlnOiBPY2lTdGFja0NvbmZpZykge1xuICAgIHN1cGVyKHNjb3BlLCBpZCk7XG5cbiAgICAvLyBDb25maWd1cmUgVGVycmFmb3JtIGJhY2tlbmQgKGlmIG5vdCBsb2NhbClcbiAgICBpZiAoY29uZmlnLmJhY2tlbmQgJiYgY29uZmlnLmJhY2tlbmQudHlwZSAhPT0gJ2xvY2FsJykge1xuICAgICAgaWYgKGNvbmZpZy5iYWNrZW5kLnR5cGUgPT09ICdvY2knKSB7XG4gICAgICAgIC8vIE9DSSBuYXRpdmUgYmFja2VuZFxuICAgICAgICB0aGlzLmFkZE92ZXJyaWRlKCd0ZXJyYWZvcm0uYmFja2VuZCcsIHtcbiAgICAgICAgICBvY2k6IHtcbiAgICAgICAgICAgIGJ1Y2tldDogY29uZmlnLmJhY2tlbmQuYnVja2V0LFxuICAgICAgICAgICAgbmFtZXNwYWNlOiBjb25maWcubmFtZXNwYWNlLFxuICAgICAgICAgICAga2V5OiBjb25maWcuYmFja2VuZC5rZXkgfHwgYCR7aWR9L3RlcnJhZm9ybS50ZnN0YXRlYCxcbiAgICAgICAgICAgIHJlZ2lvbjogY29uZmlnLnJlZ2lvbixcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoY29uZmlnLmJhY2tlbmQudHlwZSA9PT0gJ2h0dHAnKSB7XG4gICAgICAgIC8vIEhUVFAgYmFja2VuZCAoZm9yIE9DSSBPYmplY3QgU3RvcmFnZSB2aWEgUkVTVCBBUEkpXG4gICAgICAgIGNvbnN0IGh0dHBCYWNrZW5kOiBhbnkgPSB7XG4gICAgICAgICAgYWRkcmVzczogY29uZmlnLmJhY2tlbmQuYWRkcmVzcyxcbiAgICAgICAgICB1cGRhdGVfbWV0aG9kOiBjb25maWcuYmFja2VuZC51cGRhdGVNZXRob2QgfHwgJ1BVVCcsXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb25maWcuYmFja2VuZC5sb2NrQWRkcmVzcykge1xuICAgICAgICAgIGh0dHBCYWNrZW5kLmxvY2tfYWRkcmVzcyA9IGNvbmZpZy5iYWNrZW5kLmxvY2tBZGRyZXNzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWcuYmFja2VuZC51bmxvY2tBZGRyZXNzKSB7XG4gICAgICAgICAgaHR0cEJhY2tlbmQudW5sb2NrX2FkZHJlc3MgPSBjb25maWcuYmFja2VuZC51bmxvY2tBZGRyZXNzO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuYWRkT3ZlcnJpZGUoJ3RlcnJhZm9ybS5iYWNrZW5kJywge1xuICAgICAgICAgIGh0dHA6IGh0dHBCYWNrZW5kLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBPQ0kgUHJvdmlkZXJcbiAgICBuZXcgT2NpUHJvdmlkZXIodGhpcywgJ29jaScsIHtcbiAgICAgIHJlZ2lvbjogY29uZmlnLnJlZ2lvbixcbiAgICAgIHRlbmFuY3lPY2lkOiBjb25maWcudGVuYW5jeUlkLFxuICAgIH0pO1xuXG4gICAgLy8gT0NJX1NUQUNLX0FDVElPTjogXCJmdW5jdGlvbi1vbmx5XCIgKG9yIGxlZ2FjeSBcImZ1bmN0aW9uXCIpID0+IG5vIEFQSSBHYXRld2F5OyBcImZ1bGwtc3RhY2tcIiBvciB1bnNldCA9PiBmdWxsIHN0YWNrIGluY2x1ZGluZyBBUEkgR2F0ZXdheS5cbiAgICBjb25zdCBzdGFja0FjdGlvblJhdyA9IChwcm9jZXNzLmVudi5PQ0lfU1RBQ0tfQUNUSU9OIHx8ICcnKS50cmltKCkudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCBjb2RlT25seSA9IHByb2Nlc3MuZW52Lk9DSV9DT0RFX09OTFkgPT09ICcxJyB8fCBwcm9jZXNzLmVudlsnY29kZS1vbmx5J10gPT09ICcxJztcbiAgICAvLyBUaGUgcHJldmlldyBhcmNoaXZlIGZ1bmN0aW9uIGlzIGNyZWF0ZWQgYnkgT0NJIENMSSwgc28gaXRzIE9DSUQgaXMgbm90IGF2YWlsYWJsZSB0byBDREtURiBmb3IgQVBJIEdhdGV3YXkgd2lyaW5nLlxuICAgIGNvbnN0IHN0YWNrQWN0aW9uID0gY29kZU9ubHkgfHwgc3RhY2tBY3Rpb25SYXcgPT09ICdmdW5jdGlvbi1vbmx5JyB8fCBzdGFja0FjdGlvblJhdyA9PT0gJ2Z1bmN0aW9uJyA/ICdmdW5jdGlvbi1vbmx5JyA6ICdmdWxsLXN0YWNrJztcblxuICAgIC8vIE9DSVIgQ29udGFpbmVyIFJlcG9zaXRvcnkgKHJvb3QgY29tcGFydG1lbnQgYWxsb3dlZCBpZiBleHBsaWNpdGx5IHNldCkuXG4gICAgY29uc3Qgb2NpckNvbXBhcnRtZW50SWQgPSBjb25maWcub2NpckNvbXBhcnRtZW50SWQgfHwgY29uZmlnLmNvbXBhcnRtZW50SWQ7XG4gICAgY29uc3Qgb2NpclJlcG9OYW1lID0gY29uZmlnLm9jaXJSZXBvc2l0b3J5TmFtZSB8fCBjb25maWcuZnVuY3Rpb25OYW1lIHx8ICdvY2ktZnVuY3Rpb24nO1xuICAgIGNvbnN0IG9jaXJSZXBvc2l0b3J5ID0gY29kZU9ubHkgPyB1bmRlZmluZWQgOiBuZXcgQXJ0aWZhY3RzQ29udGFpbmVyUmVwb3NpdG9yeSh0aGlzLCAnT2NpclJlcG9zaXRvcnknLCB7XG4gICAgICBjb21wYXJ0bWVudElkOiBvY2lyQ29tcGFydG1lbnRJZCxcbiAgICAgIGRpc3BsYXlOYW1lOiBvY2lyUmVwb05hbWUsXG4gICAgICBpc1B1YmxpYzogZmFsc2UsXG4gICAgICBpc0ltbXV0YWJsZTogZmFsc2UsXG4gICAgfSk7XG5cbiAgICBjb25zdCBkb2NrZXJDb250ZXh0UGF0aCA9IChjb25maWcuZG9ja2VyQ29udGV4dFBhdGggfHwgY29uZmlnLmZ1bmN0aW9uSmFyUGF0aCk/LnRyaW0oKTtcbiAgICBjb25zdCBjcmVhdGVGdWxsU3RhY2sgPSBjb25maWcuZnVuY3Rpb25OYW1lICYmIChkb2NrZXJDb250ZXh0UGF0aCB8fCBjb2RlT25seSk7XG5cbiAgICBpZiAoY3JlYXRlRnVsbFN0YWNrKSB7XG4gICAgICBpZiAoIWNvZGVPbmx5ICYmIG9jaXJDb21wYXJ0bWVudElkLmluY2x1ZGVzKCdyb290JykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdGdWxsIHN0YWNrIChGdW5jdGlvbiArIEFQSSBHYXRld2F5KSByZXF1aXJlcyBhIG5vbi1yb290IGNvbXBhcnRtZW50IGZvciBPQ0lSLiBTZXQgT0NJX09DSVJfQ09NUEFSVE1FTlRfSUQgdG8geW91ciBob21lIGNvbXBhcnRtZW50IE9DSUQuJ1xuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY29uc3QgYXBwTmFtZSA9IGNvbmZpZy5mdW5jdGlvbkFwcE5hbWUgfHwgY29uZmlnLmZ1bmN0aW9uTmFtZSE7XG4gICAgICBjb25zdCByZXNvdXJjZU5hbWUgPSBhcHBOYW1lO1xuXG4gICAgICBjb25zdCBwcml2YXRlU3VibmV0SWRGcm9tRW52ID0gKHByb2Nlc3MuZW52Lk9DSV9QUklWQVRFX1NVQk5FVF9JRCB8fCBwcm9jZXNzLmVudi5PQ0lfUFJJVkFURV9TVUJORVRfT0NJRCB8fCBwcm9jZXNzLmVudi5PQ0lfRlVOQ1RJT05fU1VCTkVUX0lEIHx8ICcnKS50cmltKCk7XG4gICAgICBjb25zdCBwdWJsaWNTdWJuZXRJZEZyb21FbnYgPSAocHJvY2Vzcy5lbnYuT0NJX1BVQkxJQ19TVUJORVRfSUQgfHwgcHJvY2Vzcy5lbnYuT0NJX1BVQkxJQ19TVUJORVRfT0NJRCB8fCBwcm9jZXNzLmVudi5PQ0lfQVBJR0FURVdBWV9TVUJORVRfSUQgfHwgJycpLnRyaW0oKTtcblxuICAgICAgbGV0IGltYWdlVXJsOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgYnVpbGRBbmRQdXNoSW1hZ2VJZDogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFjb2RlT25seSkge1xuICAgICAgY29uc3QgZnVuY3Rpb25Db2RlUGF0aCA9IHBhdGgucmVzb2x2ZShkb2NrZXJDb250ZXh0UGF0aCEpO1xuICAgICAgY29uc3QgaW1hZ2VUYWcgPSBjb25maWcuaW1hZ2VUYWcgfHwgJ2xhdGVzdCc7XG4gICAgICBjb25zdCBvY2lyUmVnaXN0cnkgPSBgJHtvY2lySG9zdEtleShjb25maWcucmVnaW9uKX0ub2Npci5pb2A7XG4gICAgICBpbWFnZVVybCA9IGdldE9jaUltYWdlVXJsKGNvbmZpZyk7XG4gICAgICB0aGlzLmFkZE92ZXJyaWRlKCd0ZXJyYWZvcm0ucmVxdWlyZWRfcHJvdmlkZXJzLm51bGwnLCB7XG4gICAgICAgIHNvdXJjZTogJ2hhc2hpY29ycC9udWxsJyxcbiAgICAgICAgdmVyc2lvbjogJ34+IDMuMCcsXG4gICAgICB9KTtcbiAgICAgIGJ1aWxkQW5kUHVzaEltYWdlSWQgPSAnQnVpbGRBbmRQdXNoSW1hZ2UnO1xuICAgICAgdGhpcy5hZGRPdmVycmlkZShgcmVzb3VyY2UubnVsbF9yZXNvdXJjZS4ke2J1aWxkQW5kUHVzaEltYWdlSWR9LmRlcGVuZHNfb25gLCBbXG4gICAgICAgICdvY2lfYXJ0aWZhY3RzX2NvbnRhaW5lcl9yZXBvc2l0b3J5Lk9jaXJSZXBvc2l0b3J5JyxcbiAgICAgIF0pO1xuICAgICAgdGhpcy5hZGRPdmVycmlkZShgcmVzb3VyY2UubnVsbF9yZXNvdXJjZS4ke2J1aWxkQW5kUHVzaEltYWdlSWR9LnRyaWdnZXJzYCwge1xuICAgICAgICByZXBvX25hbWU6IG9jaXJSZXBvTmFtZSxcbiAgICAgICAgaW1hZ2VfdXJsOiBpbWFnZVVybCxcbiAgICAgICAgaW1hZ2VfdGFnOiBpbWFnZVRhZyxcbiAgICAgICAgaGFuZGxlcjogY29uZmlnLmhhbmRsZXIgfHwgJycsXG4gICAgICAgIG5hbWVzcGFjZTogY29uZmlnLm5hbWVzcGFjZSxcbiAgICAgICAgcmVnaW9uOiBjb25maWcucmVnaW9uLFxuICAgICAgfSk7XG4gICAgICBjb25zdCByZWdpb25QID0gY29uZmlnLnJlZ2lvbjtcbiAgICAgIGNvbnN0IG5hbWVzcGFjZVAgPSBjb25maWcubmFtZXNwYWNlO1xuICAgICAgY29uc3Qgb2NpclVzZXIgPSBwcm9jZXNzLmVudi5PQ0lfT0NJUl9VU0VSTkFNRSB8fCAnQVVUT19ERVRFQ1QnO1xuICAgICAgY29uc3Qgb2NpQ2xpUGF0aCA9IChwcm9jZXNzLmVudi5PQ0lfQ0xJX1BBVEggfHwgJ29jaScpLnRyaW0oKSB8fCAnb2NpJztcbiAgICAgIGNvbnN0IG9jaUNsaUNvbW1hbmQgPSBgJyR7b2NpQ2xpUGF0aC5yZXBsYWNlKC8nL2csIFwiJ1xcXFwnJ1wiKX0nYDtcbiAgICAgIGNvbnN0IGxvZ2luU2NyaXB0ID0gcHJvY2Vzcy5lbnYuT0NJX0FVVEhfVE9LRU5cbiAgICAgICAgPyBgZXhwb3J0IE9DSVJfQVVUSF9UT0tFTj1cIiR7cHJvY2Vzcy5lbnYuT0NJX0FVVEhfVE9LRU59XCI7IE9DSVJfVVNFUj1cIiR7b2NpclVzZXJ9XCI7IFsgXCIkT0NJUl9VU0VSXCIgPSBcIkFVVE9fREVURUNUXCIgXSAmJiBPQ0lSX1VTRVI9XCIke25hbWVzcGFjZVB9L3VzZXJcIjsgZWNobyBcIiRPQ0lSX0FVVEhfVE9LRU5cIiB8IGRvY2tlciBsb2dpbiAke29jaXJSZWdpc3RyeX0gLXUgXCIkT0NJUl9VU0VSXCIgLS1wYXNzd29yZC1zdGRpbiB8fCBleGl0IDFgXG4gICAgICAgIDogYCR7b2NpQ2xpQ29tbWFuZH0gcmF3LXJlcXVlc3QgLS1yZWdpb24gJHtyZWdpb25QfSAtLWh0dHAtbWV0aG9kIEdFVCAtLXRhcmdldC11cmkgXCJodHRwczovLyR7b2NpclJlZ2lzdHJ5fS8yMDE4MDQxOS9kb2NrZXIvdG9rZW5cIiAyPi9kZXYvbnVsbCB8IChjb21tYW5kIC12IGpxID4vZGV2L251bGwgJiYganEgLXIgLmRhdGEudG9rZW4gfHwgZ3JlcCAtbyAnXCJ0b2tlblwiOlwiW15cIl0qXCInIHwgY3V0IC1kJ1wiJyAtZjQpIHwgZG9ja2VyIGxvZ2luIC11IEJFQVJFUl9UT0tFTiAtLXBhc3N3b3JkLXN0ZGluICR7b2NpclJlZ2lzdHJ5fSB8fCAoZWNobyBcIlNldCBPQ0lfQVVUSF9UT0tFTiBvciBjb25maWd1cmUgT0NJIENMSVwiID4mMjsgZXhpdCAxKWA7XG4gICAgICBjb25zdCBoYW5kbGVyID0gY29uZmlnLmhhbmRsZXIgfHwgJ2NvbS5leGFtcGxlLmZuLkhlbGxvRnVuY3Rpb246OmhhbmRsZVJlcXVlc3QnO1xuICAgICAgY29uc3QgcnVudGltZSA9IGNvbmZpZy5ydW50aW1lPy50b0xvd2VyQ2FzZSgpO1xuICAgICAgbGV0IGRvY2tlcmZpbGVDb250ZW50ID0gJyc7XG4gICAgICBpZiAocnVudGltZSAmJiBydW50aW1lLnN0YXJ0c1dpdGgoJ3B5dGhvbicpKSB7XG4gICAgICAgIGRvY2tlcmZpbGVDb250ZW50ID0gYEZST00gZG9ja2VyLmlvL2ZucHJvamVjdC9weXRob246My4xMi1kZXYgYXMgYnVpbGQtc3RhZ2VcbldPUktESVIgL2Z1bmN0aW9uXG5BREQgcmVxdWlyZW1lbnRzLnR4dCAvZnVuY3Rpb24vXG5SVU4gcGlwMyBpbnN0YWxsIC0tdGFyZ2V0IC9weXRob24vIC0tbm8tY2FjaGUgLS1uby1jYWNoZS1kaXIgLXIgcmVxdWlyZW1lbnRzLnR4dCAmJlxcXG5cdFx0XHQgICAgcm0gLWZyIH4vLmNhY2hlL3BpcCAvdG1wKiByZXF1aXJlbWVudHMudHh0IGZ1bmMueWFtbCBEb2NrZXJmaWxlIC52ZW52ICYmXFxcblx0XHRcdCAgICBjaG1vZCAtUiBvK3IgL3B5dGhvblxuQUREIC4gL2Z1bmN0aW9uL1xuUlVOIHJtIC1mciAvZnVuY3Rpb24vLnBpcF9jYWNoZVxuRlJPTSBkb2NrZXIuaW8vZm5wcm9qZWN0L3B5dGhvbjozLjEyXG5XT1JLRElSIC9mdW5jdGlvblxuQ09QWSAtLWZyb209YnVpbGQtc3RhZ2UgL3B5dGhvbiAvcHl0aG9uXG5DT1BZIC0tZnJvbT1idWlsZC1zdGFnZSAvZnVuY3Rpb24gL2Z1bmN0aW9uXG5SVU4gY2htb2QgLVIgbytyIC9mdW5jdGlvblxuRU5WIFBZVEhPTlBBVEg9L2Z1bmN0aW9uOi9weXRob25cbkVOVFJZUE9JTlQgW1wiL3B5dGhvbi9iaW4vZmRrXCIsIFwiL2Z1bmN0aW9uL2Z1bmMucHlcIiwgXCJoYW5kbGVyXCJdXG5gO1xuICAgICAgfSBlbHNlIGlmIChydW50aW1lICYmIHJ1bnRpbWUuc3RhcnRzV2l0aCgnbm9kZScpKSB7XG4gICAgICAgIGRvY2tlcmZpbGVDb250ZW50ID0gYEZST00gZG9ja2VyLmlvL2ZucHJvamVjdC9ub2RlOjI0LWRldiBhcyBidWlsZC1zdGFnZVxuV09SS0RJUiAvZnVuY3Rpb25cbkFERCBwYWNrYWdlLmpzb24gL2Z1bmN0aW9uL1xuUlVOIG5wbSBwa2cgZGVsZXRlIFwiZGVwZW5kZW5jaWVzLkBtaWthcmlubmVvcmFjbGUvb2NpLWNka1wiXG5SVU4gbnBtIGluc3RhbGwgICYmIGNob3duIC1SICQoaWQgLXUpOiQoaWQgLWcpIG5vZGVfbW9kdWxlc1xuRlJPTSBkb2NrZXIuaW8vZm5wcm9qZWN0L25vZGU6MjRcbldPUktESVIgL2Z1bmN0aW9uXG5BREQgLiAvZnVuY3Rpb24vXG5DT1BZIC0tZnJvbT1idWlsZC1zdGFnZSAvZnVuY3Rpb24vbm9kZV9tb2R1bGVzLyAvZnVuY3Rpb24vbm9kZV9tb2R1bGVzL1xuUlVOIGNobW9kIC1SIG8rciAvZnVuY3Rpb25cbkVOVFJZUE9JTlQgW1wibm9kZVwiLCBcImZ1bmMuanNcIl1cbmA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB1c2VHcmFhbFZtID0gKHByb2Nlc3MuZW52Lk9DSV9VU0VfR1JBQUxWTV9KQVZBIHx8ICcnKS50cmltKCkgPT09ICcxJztcbiAgICAgICAgaWYgKHVzZUdyYWFsVm0pIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVXNlIGJha2VkLWluIEdyYWFsVk0gRG9ja2VyZmlsZSB0ZW1wbGF0ZVxuICAgICAgICAgICAgZG9ja2VyZmlsZUNvbnRlbnQgPSBHUkFBTFZNX0pBVkFfRE9DS0VSRklMRTtcblxuICAgICAgICAgICAgLy8gRW5zdXJlIHJlZmxlY3Rpb24uanNvbiBleGlzdHMgaW4gcHJvamVjdCByb290XG4gICAgICAgICAgICBjb25zdCByZWZsZWN0aW9uVGFyZ2V0UGF0aCA9IHBhdGguam9pbihmdW5jdGlvbkNvZGVQYXRoLCAncmVmbGVjdGlvbi5qc29uJyk7XG4gICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmVmbGVjdGlvblRhcmdldFBhdGgpKSB7XG4gICAgICAgICAgICAgIGZzLndyaXRlRmlsZVN5bmMocmVmbGVjdGlvblRhcmdldFBhdGgsIEdSQUFMVk1fUkVGTEVDVElPTl9KU09OLCAndXRmOCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBFbnN1cmUgcG9tLnhtbCBoYXMgcnVudGltZSBkZXBlbmRlbmN5IGZvciBHcmFhbFZNIG5hdGl2ZSBpbWFnZVxuICAgICAgICAgICAgY29uc3QgcHJvamVjdFBvbVBhdGggPSBwYXRoLmpvaW4oZnVuY3Rpb25Db2RlUGF0aCwgJ3BvbS54bWwnKTtcbiAgICAgICAgICAgIGlmIChmcy5leGlzdHNTeW5jKHByb2plY3RQb21QYXRoKSkge1xuICAgICAgICAgICAgICBsZXQgcG9tQ29udGVudCA9IGZzLnJlYWRGaWxlU3luYyhwcm9qZWN0UG9tUGF0aCwgJ3V0ZjgnKTtcblxuICAgICAgICAgICAgICBpZiAoIXBvbUNvbnRlbnQuaW5jbHVkZXMoJzxhcnRpZmFjdElkPnJ1bnRpbWU8L2FydGlmYWN0SWQ+JykgJiYgcG9tQ29udGVudC5pbmNsdWRlcygnPC9kZXBlbmRlbmNpZXM+JykpIHtcbiAgICAgICAgICAgICAgICBwb21Db250ZW50ID0gcG9tQ29udGVudC5yZXBsYWNlKCc8L2RlcGVuZGVuY2llcz4nLCBgJHtHUkFBTFZNX1BPTV9SVU5USU1FX0RFUH0gICAgPC9kZXBlbmRlbmNpZXM+YCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhwcm9qZWN0UG9tUGF0aCwgcG9tQ29udGVudCwgJ3V0ZjgnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgIC8vIElnbm9yZSBhbmQgZmFsbCBiYWNrIHRvIHN0YW5kYXJkIEphdmEgRG9ja2VyZmlsZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoIWRvY2tlcmZpbGVDb250ZW50KSB7XG4gICAgICAgICAgZG9ja2VyZmlsZUNvbnRlbnQgPSBgRlJPTSBkb2NrZXIuaW8vZm5wcm9qZWN0L2ZuLWphdmEtZmRrLWJ1aWxkOmpkazE3LTEuMS43IGFzIGJ1aWxkLXN0YWdlXG5XT1JLRElSIC9mdW5jdGlvblxuRU5WIE1BVkVOX09QVFMgLURodHRwLnByb3h5SG9zdD0gLURodHRwLnByb3h5UG9ydD0gLURodHRwcy5wcm94eUhvc3Q9IC1EaHR0cHMucHJveHlQb3J0PSAtRGh0dHAubm9uUHJveHlIb3N0cz0gLURtYXZlbi5yZXBvLmxvY2FsPS91c3Ivc2hhcmUvbWF2ZW4vcmVmL3JlcG9zaXRvcnlcbkFERCBwb20ueG1sIC9mdW5jdGlvbi9wb20ueG1sXG5SVU4gW1wibXZuXCIsIFwicGFja2FnZVwiLCBcImRlcGVuZGVuY3k6Y29weS1kZXBlbmRlbmNpZXNcIiwgXCItRGluY2x1ZGVTY29wZT1ydW50aW1lXCIsIFwiLURza2lwVGVzdHM9dHJ1ZVwiLCBcIi1EbWRlcC5wcmVwZW5kR3JvdXBJZD10cnVlXCIsIFwiLURvdXRwdXREaXJlY3Rvcnk9dGFyZ2V0XCIsIFwiLS1mYWlsLW5ldmVyXCJdXG5BREQgc3JjIC9mdW5jdGlvbi9zcmNcblJVTiBbXCJtdm5cIiwgXCJwYWNrYWdlXCJdXG5GUk9NIGRvY2tlci5pby9mbnByb2plY3QvZm4tamF2YS1mZGs6anJlMTctMS4xLjdcbldPUktESVIgL2Z1bmN0aW9uXG5DT1BZIC0tZnJvbT1idWlsZC1zdGFnZSAvZnVuY3Rpb24vdGFyZ2V0LyouamFyIC9mdW5jdGlvbi9hcHAvXG5DTUQgW1wiJHtoYW5kbGVyLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX1cIl1gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkb2NrZXJpZ25vcmVDb250ZW50ID0gYG5vZGVfbW9kdWxlc1xuLmdpdFxuKi5tZFxuLmVudlxuLmlkZWFcbi52c2NvZGVcbioubG9nXG5vY2lfYXBpZ2F0ZXdheV9kZXBsb3ltZW50Lmpzb25cbi5vY2RrLW91dHB1dHMuanNvblxudGFpbC1mdW5jdGlvbi1sb2dzLmpzXG5gO1xuICAgICAgY29uc3QgZG9ja2VyZmlsZUI2NCA9IEJ1ZmZlci5mcm9tKGRvY2tlcmZpbGVDb250ZW50LCAndXRmOCcpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgICAgIGNvbnN0IGRvY2tlcmlnbm9yZUI2NCA9IEJ1ZmZlci5mcm9tKGRvY2tlcmlnbm9yZUNvbnRlbnQsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgLy8gR2VuZXJhdGUgRG9ja2VyZmlsZSBhbmQgLmRvY2tlcmlnbm9yZSBpbiBsb2NhbC1leGVjIG9ubHkgaWYgbWlzc2luZzsgaWYgdGhleSBleGlzdCB1c2UgYXMtaXMuIFRoZW4gbG9naW4sIGJ1aWxkLCBwdXNoLlxuICAgICAgdGhpcy5hZGRPdmVycmlkZShgcmVzb3VyY2UubnVsbF9yZXNvdXJjZS4ke2J1aWxkQW5kUHVzaEltYWdlSWR9LnByb3Zpc2lvbmVyYCwgW1xuICAgICAgICB7XG4gICAgICAgICAgJ2xvY2FsLWV4ZWMnOiB7XG4gICAgICAgICAgICBjb21tYW5kOiAnY2QgXCIkRlVOQ1RJT05fQ09ERV9QQVRIXCIgJiYgKFsgLWYgRG9ja2VyZmlsZSBdIHx8IChlY2hvIFwiJERPQ0tFUkZJTEVfQjY0XCIgfCBiYXNlNjQgLWQgPiBEb2NrZXJmaWxlKSkgJiYgKFsgLWYgLmRvY2tlcmlnbm9yZSBdIHx8IChlY2hvIFwiJERPQ0tFUklHTk9SRV9CNjRcIiB8IGJhc2U2NCAtZCA+IC5kb2NrZXJpZ25vcmUpKScsXG4gICAgICAgICAgICBlbnZpcm9ubWVudDoge1xuICAgICAgICAgICAgICBGVU5DVElPTl9DT0RFX1BBVEg6IGZ1bmN0aW9uQ29kZVBhdGgsXG4gICAgICAgICAgICAgIERPQ0tFUkZJTEVfQjY0OiBkb2NrZXJmaWxlQjY0LFxuICAgICAgICAgICAgICBET0NLRVJJR05PUkVfQjY0OiBkb2NrZXJpZ25vcmVCNjQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIHsgJ2xvY2FsLWV4ZWMnOiB7IGNvbW1hbmQ6IGxvZ2luU2NyaXB0LCBvbl9mYWlsdXJlOiAnY29udGludWUnIH0gfSxcbiAgICAgICAgeyAnbG9jYWwtZXhlYyc6IHsgY29tbWFuZDogYGNkIFwiJHtmdW5jdGlvbkNvZGVQYXRoLnJlcGxhY2UoL1wiL2csICdcXFxcXCInKX1cIiAmJiBkb2NrZXIgYnVpbGQgLS1wbGF0Zm9ybSBsaW51eC9hbWQ2NCAtdCAke2ltYWdlVXJsfSAuYCB9IH0sXG4gICAgICAgIHsgJ2xvY2FsLWV4ZWMnOiB7IGNvbW1hbmQ6IGBkb2NrZXIgcHVzaCAke2ltYWdlVXJsfWAgfSB9LFxuICAgICAgXSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBwdWJsaWNTdWJuZXQ6IENvcmVTdWJuZXQgfCB1bmRlZmluZWQ7XG4gICAgICBsZXQgcHJpdmF0ZVN1Ym5ldDogQ29yZVN1Ym5ldCB8IHVuZGVmaW5lZDtcbiAgICAgIC8vIEZ1bmN0aW9uLW9ubHk6IGNyZWF0ZSBWQ04gb25seSB3aGVuIHdlIG5lZWQgdG8gY3JlYXRlIHRoZSBwcml2YXRlIHN1Ym5ldC4gRnVsbC1zdGFjazogY3JlYXRlIHdoZW4gd2UgbmVlZCBlaXRoZXIgc3VibmV0LlxuICAgICAgY29uc3QgY3JlYXRlTmV0d29ya2luZyA9XG4gICAgICAgIHN0YWNrQWN0aW9uID09PSAnZnVuY3Rpb24tb25seSdcbiAgICAgICAgICA/ICFwcml2YXRlU3VibmV0SWRGcm9tRW52XG4gICAgICAgICAgOiAhcHJpdmF0ZVN1Ym5ldElkRnJvbUVudiB8fCAhcHVibGljU3VibmV0SWRGcm9tRW52O1xuICAgICAgaWYgKGNyZWF0ZU5ldHdvcmtpbmcpIHtcbiAgICAgICAgY29uc3QgdmNuID0gbmV3IENvcmVWY24odGhpcywgJ1ZjbicsIHtcbiAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS12Y25gLFxuICAgICAgICAgIGNpZHJCbG9ja3M6IFsnMTAuMC4wLjAvMTYnXSxcbiAgICAgICAgICBkbnNMYWJlbDogJ2FwcGZuJyxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChzdGFja0FjdGlvbiA9PT0gJ2Z1bGwtc3RhY2snICYmICFwdWJsaWNTdWJuZXRJZEZyb21FbnYpIHtcbiAgICAgICAgICBwdWJsaWNTdWJuZXQgPSBuZXcgQ29yZVN1Ym5ldCh0aGlzLCAnUHVibGljU3VibmV0Jywge1xuICAgICAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tcHVibGljYCxcbiAgICAgICAgICAgIGNpZHJCbG9jazogJzEwLjAuMS4wLzI0JyxcbiAgICAgICAgICAgIGRuc0xhYmVsOiAncHVibGljJyxcbiAgICAgICAgICAgIHByb2hpYml0UHVibGljSXBPblZuaWM6IGZhbHNlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHB1YmxpY1NsID0gbmV3IENvcmVTZWN1cml0eUxpc3QodGhpcywgJ1B1YmxpY1NlY3VyaXR5TGlzdCcsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICAgICAgdmNuSWQ6IHZjbi5pZCxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LXB1YmxpYy1zbGAsXG4gICAgICAgICAgICBpbmdyZXNzU2VjdXJpdHlSdWxlczogW1xuICAgICAgICAgICAgICB7IHByb3RvY29sOiAnNicsIHNvdXJjZTogJzAuMC4wLjAvMCcsIGRlc2NyaXB0aW9uOiAnSFRUUCcsIHRjcE9wdGlvbnM6IHsgbWluOiA4MCwgbWF4OiA4MCB9IH0sXG4gICAgICAgICAgICAgIHsgcHJvdG9jb2w6ICc2Jywgc291cmNlOiAnMC4wLjAuMC8wJywgZGVzY3JpcHRpb246ICdIVFRQUycsIHRjcE9wdGlvbnM6IHsgbWluOiA0NDMsIG1heDogNDQzIH0gfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBlZ3Jlc3NTZWN1cml0eVJ1bGVzOiBbeyBwcm90b2NvbDogJ2FsbCcsIGRlc3RpbmF0aW9uOiAnMC4wLjAuMC8wJywgZGVzY3JpcHRpb246ICdBbGwnIH1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHB1YmxpY1N1Ym5ldC5hZGRPdmVycmlkZSgnc2VjdXJpdHlfbGlzdF9pZHMnLCBbcHVibGljU2wuaWRdKTtcbiAgICAgICAgICBjb25zdCBpZ3cgPSBuZXcgQ29yZUludGVybmV0R2F0ZXdheSh0aGlzLCAnSW50ZXJuZXRHYXRld2F5Jywge1xuICAgICAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0taWd3YCxcbiAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcHViUnQgPSBuZXcgQ29yZVJvdXRlVGFibGUodGhpcywgJ1B1YmxpY1JvdXRlVGFibGUnLCB7XG4gICAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1wdWJsaWMtcnRgLFxuICAgICAgICAgICAgcm91dGVSdWxlczogW1xuICAgICAgICAgICAgICB7IG5ldHdvcmtFbnRpdHlJZDogaWd3LmlkLCBkZXN0aW5hdGlvbjogJzAuMC4wLjAvMCcsIGRlc3RpbmF0aW9uVHlwZTogJ0NJRFJfQkxPQ0snLCBkZXNjcmlwdGlvbjogJ0ludGVybmV0JyB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwdWJsaWNTdWJuZXQuYWRkT3ZlcnJpZGUoJ3JvdXRlX3RhYmxlX2lkJywgcHViUnQuaWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghcHJpdmF0ZVN1Ym5ldElkRnJvbUVudikge1xuICAgICAgICAgIHByaXZhdGVTdWJuZXQgPSBuZXcgQ29yZVN1Ym5ldCh0aGlzLCAnUHJpdmF0ZVN1Ym5ldCcsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICAgICAgdmNuSWQ6IHZjbi5pZCxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LXByaXZhdGVgLFxuICAgICAgICAgICAgY2lkckJsb2NrOiAnMTAuMC4yLjAvMjQnLFxuICAgICAgICAgICAgZG5zTGFiZWw6ICdwcml2YXRlJyxcbiAgICAgICAgICAgIHByb2hpYml0UHVibGljSXBPblZuaWM6IHRydWUsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcHJpdmF0ZVNsID0gbmV3IENvcmVTZWN1cml0eUxpc3QodGhpcywgJ1ByaXZhdGVTZWN1cml0eUxpc3QnLCB7XG4gICAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1wcml2YXRlLXNsYCxcbiAgICAgICAgICAgIGluZ3Jlc3NTZWN1cml0eVJ1bGVzOiBbXG4gICAgICAgICAgICAgIHsgcHJvdG9jb2w6ICc2Jywgc291cmNlOiAnMTAuMC4yLjAvMjQnLCBkZXNjcmlwdGlvbjogJ1BHJywgdGNwT3B0aW9uczogeyBtaW46IDU0MzIsIG1heDogNTQzMiB9IH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgZWdyZXNzU2VjdXJpdHlSdWxlczogW3sgcHJvdG9jb2w6ICdhbGwnLCBkZXN0aW5hdGlvbjogJzAuMC4wLjAvMCcsIGRlc2NyaXB0aW9uOiAnQWxsJyB9XSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwcml2YXRlU3VibmV0LmFkZE92ZXJyaWRlKCdzZWN1cml0eV9saXN0X2lkcycsIFtwcml2YXRlU2wuaWRdKTtcbiAgICAgICAgICBjb25zdCBhbGxTZXJ2aWNlcyA9IG5ldyBEYXRhT2NpQ29yZVNlcnZpY2VzKHRoaXMsICdBbGxTZXJ2aWNlcycsIHt9KTtcbiAgICAgICAgICBjb25zdCBzdmNHdyA9IG5ldyBDb3JlU2VydmljZUdhdGV3YXkodGhpcywgJ1NlcnZpY2VHYXRld2F5Jywge1xuICAgICAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tc2d3YCxcbiAgICAgICAgICAgIHNlcnZpY2VzOiBbeyBzZXJ2aWNlSWQ6IGFsbFNlcnZpY2VzLnNlcnZpY2VzLmdldCgwKS5pZCB9XSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwcml2UnQgPSBuZXcgQ29yZVJvdXRlVGFibGUodGhpcywgJ1ByaXZhdGVSb3V0ZVRhYmxlJywge1xuICAgICAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tcHJpdmF0ZS1ydGAsXG4gICAgICAgICAgICByb3V0ZVJ1bGVzOiBbXG4gICAgICAgICAgICAgIHsgbmV0d29ya0VudGl0eUlkOiBzdmNHdy5pZCwgZGVzdGluYXRpb246IGFsbFNlcnZpY2VzLnNlcnZpY2VzLmdldCgwKS5jaWRyQmxvY2ssIGRlc3RpbmF0aW9uVHlwZTogJ1NFUlZJQ0VfQ0lEUl9CTE9DSycsIGRlc2NyaXB0aW9uOiAnT0NJUicgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcHJpdmF0ZVN1Ym5ldC5hZGRPdmVycmlkZSgncm91dGVfdGFibGVfaWQnLCBwcml2UnQuaWQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGZ1bmN0aW9uQXBwU3VibmV0SWQgPSBwcml2YXRlU3VibmV0SWRGcm9tRW52IHx8IChwcml2YXRlU3VibmV0Py5pZCA/PyAnJyk7XG4gICAgICBjb25zdCBwdWJsaWNTdWJuZXRJZEZvckFwaUd3ID0gcHVibGljU3VibmV0SWRGcm9tRW52IHx8IChwdWJsaWNTdWJuZXQ/LmlkID8/ICcnKTtcblxuICAgICAgbGV0IGFwaUdhdGV3YXk6IEFwaWdhdGV3YXlHYXRld2F5IHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKHN0YWNrQWN0aW9uID09PSAnZnVsbC1zdGFjaycgJiYgcHVibGljU3VibmV0SWRGb3JBcGlHdykge1xuICAgICAgICBhcGlHYXRld2F5ID0gbmV3IEFwaWdhdGV3YXlHYXRld2F5KHRoaXMsICdBcGlHYXRld2F5Jywge1xuICAgICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICAgIHN1Ym5ldElkOiBwdWJsaWNTdWJuZXRJZEZvckFwaUd3LFxuICAgICAgICAgIGVuZHBvaW50VHlwZTogJ1BVQkxJQycsXG4gICAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tYXBpLWdhdGV3YXlgLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgLy8gT3B0aW9uYWwgSUFNOiBhbGxvdyBBUEkgR2F0ZXdheSB0byBpbnZva2UgRnVuY3Rpb25zIGluIHRoaXMgY29tcGFydG1lbnQuXG4gICAgICAvLyBPQ0kgZG9jczogQUxMT1cgYW55LXVzZXIgdG8gdXNlIGZ1bmN0aW9ucy1mYW1pbHkgaW4gY29tcGFydG1lbnQgPGZ1bmN0aW9ucy1jb21wYXJ0bWVudD5cbiAgICAgIC8vICAgd2hlcmUgQUxMIHtyZXF1ZXN0LnByaW5jaXBhbC50eXBlPSdBcGlHYXRld2F5JywgcmVxdWVzdC5yZXNvdXJjZS5jb21wYXJ0bWVudC5pZD0nPGFwaWd3LWNvbXBhcnRtZW50LW9jaWQ+J31cbiAgICAgIGNvbnN0IGNyZWF0ZUFwaWd3UG9saWN5ID0gISFjb25maWcuY3JlYXRlQXBpZ3dQb2xpY3kgfHwgKHByb2Nlc3MuZW52Lk9DSV9DUkVBVEVfQVBJR1dfUE9MSUNZIHx8ICcnKS50cmltKCkgPT09ICcxJztcbiAgICAgIGlmIChjcmVhdGVBcGlnd1BvbGljeSAmJiBzdGFja0FjdGlvbiA9PT0gJ2Z1bGwtc3RhY2snKSB7XG4gICAgICAgIGNvbnN0IGFwaWd3UG9saWN5TmFtZSA9IGAke3Jlc291cmNlTmFtZX0tYXBpZ3ctZnVuY3Rpb25zLWFjY2Vzc2A7XG4gICAgICAgIG5ldyBJZGVudGl0eVBvbGljeSh0aGlzLCAnQXBpR2F0ZXdheUZ1bmN0aW9uc1BvbGljeScsIHtcbiAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcudGVuYW5jeUlkLFxuICAgICAgICAgIG5hbWU6IGFwaWd3UG9saWN5TmFtZSxcbiAgICAgICAgICBkZXNjcmlwdGlvbjogYEFsbG93IEFQSSBHYXRld2F5cyBpbiAke2NvbmZpZy5jb21wYXJ0bWVudElkfSB0byBpbnZva2UgRnVuY3Rpb25zIGluICR7Y29uZmlnLmNvbXBhcnRtZW50SWR9YCxcbiAgICAgICAgICBzdGF0ZW1lbnRzOiBbXG4gICAgICAgICAgICBgQUxMT1cgYW55LXVzZXIgdG8gdXNlIGZ1bmN0aW9ucy1mYW1pbHkgaW4gY29tcGFydG1lbnQgaWQgJHtjb25maWcuY29tcGFydG1lbnRJZH0gd2hlcmUgQUxMIHtyZXF1ZXN0LnByaW5jaXBhbC50eXBlPSAnQXBpR2F0ZXdheScsIHJlcXVlc3QucmVzb3VyY2UuY29tcGFydG1lbnQuaWQgPSAnJHtjb25maWcuY29tcGFydG1lbnRJZH0nfWAsXG4gICAgICAgICAgXSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBsb2dHcm91cCA9IG5ldyBMb2dnaW5nTG9nR3JvdXAodGhpcywgJ0xvZ0dyb3VwJywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGFwcE5hbWUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBgTG9nIGdyb3VwIGZvciAke2FwcE5hbWV9YCxcbiAgICAgIH0pO1xuICAgICAgY29uc3QgZnVuY3Rpb25BcHAgPSBuZXcgRnVuY3Rpb25zQXBwbGljYXRpb24odGhpcywgJ0Z1bmN0aW9uQXBwJywge1xuICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgZGlzcGxheU5hbWU6IGFwcE5hbWUsXG4gICAgICAgIHN1Ym5ldElkczogW2Z1bmN0aW9uQXBwU3VibmV0SWRdLFxuICAgICAgfSk7XG4gICAgICBsZXQgb2NpRnVuY3Rpb246IEZ1bmN0aW9uc0Z1bmN0aW9uIHwgdW5kZWZpbmVkO1xuICAgICAgaWYgKCFjb2RlT25seSkge1xuICAgICAgICBvY2lGdW5jdGlvbiA9IG5ldyBGdW5jdGlvbnNGdW5jdGlvbih0aGlzLCAnRnVuY3Rpb24nLCB7XG4gICAgICAgICAgYXBwbGljYXRpb25JZDogZnVuY3Rpb25BcHAuaWQsXG4gICAgICAgICAgZGlzcGxheU5hbWU6IGNvbmZpZy5mdW5jdGlvbk5hbWUhLFxuICAgICAgICAgIGltYWdlOiBpbWFnZVVybCEsXG4gICAgICAgICAgbWVtb3J5SW5NYnM6IGNvbmZpZy5mdW5jdGlvbk1lbW9yeU1iID8/ICcyNTYnLFxuICAgICAgICAgIHRpbWVvdXRJblNlY29uZHM6IGNvbmZpZy5mdW5jdGlvblRpbWVvdXRTZWNvbmRzID8/IDMwLFxuICAgICAgICAgIC4uLihjb25maWcuZnVuY3Rpb25Db25maWcgJiYgT2JqZWN0LmtleXMoY29uZmlnLmZ1bmN0aW9uQ29uZmlnKS5sZW5ndGggPiAwID8geyBjb25maWc6IGNvbmZpZy5mdW5jdGlvbkNvbmZpZyB9IDoge30pLFxuICAgICAgICB9KTtcbiAgICAgICAgb2NpRnVuY3Rpb24uYWRkT3ZlcnJpZGUoJ2RlcGVuZHNfb24nLCBbYG51bGxfcmVzb3VyY2UuJHtidWlsZEFuZFB1c2hJbWFnZUlkIX1gXSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RhY2tBY3Rpb24gPT09ICdmdWxsLXN0YWNrJyAmJiBhcGlHYXRld2F5ICYmIG9jaUZ1bmN0aW9uKSB7XG4gICAgICAgIGNvbnN0IHBhdGhQcmVmaXggPSBjb25maWcuYXBpR3dQYXRoUHJlZml4ID8/ICcvJztcbiAgICAgICAgbGV0IHJvdXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmc7IG1ldGhvZHM6IHN0cmluZ1tdOyBiYWNrZW5kOiB7IHR5cGU6IHN0cmluZzsgZnVuY3Rpb25JZDogdHlwZW9mIG9jaUZ1bmN0aW9uLmlkOyByZWFkVGltZW91dEluU2Vjb25kcz86IG51bWJlciB9IH0+O1xuICAgICAgICBpZiAoY29uZmlnLmFwaUd3RGVwbG95bWVudEpzb25QYXRoICYmIGZzLmV4aXN0c1N5bmMoY29uZmlnLmFwaUd3RGVwbG95bWVudEpzb25QYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhjb25maWcuYXBpR3dEZXBsb3ltZW50SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3Qgc3BlYyA9IEpTT04ucGFyc2UocmF3KSBhcyB7IHJvdXRlcz86IEFycmF5PHsgcGF0aD86IHN0cmluZzsgbWV0aG9kcz86IHN0cmluZ1tdOyBiYWNrZW5kPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4gfTtcbiAgICAgICAgICBjb25zdCByb3V0ZUxpc3QgPSBzcGVjPy5yb3V0ZXMgPz8gW107XG4gICAgICAgICAgcm91dGVzID0gcm91dGVMaXN0Lm1hcCgocikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYiA9IHIuYmFja2VuZCA/PyB7fTtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uSWRSYXcgPSAoYi5mdW5jdGlvbklkID8/IGIuZnVuY3Rpb25faWQpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uSWQgPSB0eXBlb2YgZnVuY3Rpb25JZFJhdyA9PT0gJ3N0cmluZycgJiYgZnVuY3Rpb25JZFJhdy5pbmNsdWRlcygnJHtmdW5jdGlvbl9pZH0nKVxuICAgICAgICAgICAgICA/IG9jaUZ1bmN0aW9uLmlkXG4gICAgICAgICAgICAgIDogKGZ1bmN0aW9uSWRSYXcgPz8gb2NpRnVuY3Rpb24uaWQpO1xuICAgICAgICAgICAgY29uc3QgcmVhZFRpbWVvdXQgPSAoYi5yZWFkVGltZW91dEluU2Vjb25kcyA/PyBiLnJlYWRfdGltZW91dF9pbl9zZWNvbmRzKSBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBwYXRoOiByLnBhdGggPz8gJy97cGF0aCp9JyxcbiAgICAgICAgICAgICAgbWV0aG9kczogQXJyYXkuaXNBcnJheShyLm1ldGhvZHMpID8gci5tZXRob2RzIDogWydHRVQnLCAnUE9TVCcsICdPUFRJT05TJ10sXG4gICAgICAgICAgICAgIGJhY2tlbmQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAoYi50eXBlIGFzIHN0cmluZykgPz8gJ09SQUNMRV9GVU5DVElPTlNfQkFDS0VORCcsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAuLi4ocmVhZFRpbWVvdXQgIT0gbnVsbCA/IHsgcmVhZFRpbWVvdXRJblNlY29uZHM6IHJlYWRUaW1lb3V0IH0gOiB7fSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IGNvbmZpZy5hcGlHd1JvdXRlUGF0aCA/PyAnL3twYXRoKn0nO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZHMgPSBjb25maWcuYXBpR3dNZXRob2RzPy5sZW5ndGggPyBjb25maWcuYXBpR3dNZXRob2RzIDogWydHRVQnLCAnUE9TVCcsICdPUFRJT05TJ107XG4gICAgICAgICAgcm91dGVzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiByb3V0ZVBhdGgsXG4gICAgICAgICAgICAgIG1ldGhvZHMsXG4gICAgICAgICAgICAgIGJhY2tlbmQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnT1JBQ0xFX0ZVTkNUSU9OU19CQUNLRU5EJyxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbklkOiBvY2lGdW5jdGlvbi5pZCxcbiAgICAgICAgICAgICAgICByZWFkVGltZW91dEluU2Vjb25kczogY29uZmlnLmZ1bmN0aW9uVGltZW91dFNlY29uZHMgPz8gMzAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpRGVwbG95bWVudCA9IG5ldyBBcGlnYXRld2F5RGVwbG95bWVudCh0aGlzLCAnQXBpRGVwbG95bWVudCcsIHtcbiAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgICBnYXRld2F5SWQ6IGFwaUdhdGV3YXkuaWQsXG4gICAgICAgICAgcGF0aFByZWZpeCxcbiAgICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1kZXBsb3ltZW50YCxcbiAgICAgICAgICBzcGVjaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICByb3V0ZXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGFwaURlcGxveW1lbnQubm9kZS5hZGREZXBlbmRlbmN5KG9jaUZ1bmN0aW9uKTtcbiAgICAgIH1cblxuICAgICAgLy8gRnVuY3Rpb25zIGV4ZWN1dGlvbiBsb2c6IFNFUlZJQ0UgbG9nIGZvciB0aGUgRnVuY3Rpb25zIGFwcGxpY2F0aW9uIChjYXRlZ29yeSBpbnZva2UpXG4gICAgICBjb25zdCBleGVjdXRpb25Mb2cgPSBuZXcgTG9nZ2luZ0xvZyh0aGlzLCAnRXhlY3V0aW9uTG9nJywge1xuICAgICAgICBkaXNwbGF5TmFtZTogYCR7YXBwTmFtZX0taW52b2tlYCxcbiAgICAgICAgbG9nR3JvdXBJZDogbG9nR3JvdXAuaWQsXG4gICAgICAgIGxvZ1R5cGU6ICdTRVJWSUNFJyxcbiAgICAgICAgY29uZmlndXJhdGlvbjoge1xuICAgICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICAgIHNvdXJjZToge1xuICAgICAgICAgICAgY2F0ZWdvcnk6ICdpbnZva2UnLFxuICAgICAgICAgICAgLy8gQXNzb2NpYXRlIHRoaXMgc2VydmljZSBsb2cgd2l0aCB0aGUgRnVuY3Rpb25zIGFwcGxpY2F0aW9uXG4gICAgICAgICAgICByZXNvdXJjZTogZnVuY3Rpb25BcHAuaWQsXG4gICAgICAgICAgICBzZXJ2aWNlOiAnZnVuY3Rpb25zJyxcbiAgICAgICAgICAgIHNvdXJjZVR5cGU6ICdPQ0lTRVJWSUNFJyxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgICBleGVjdXRpb25Mb2cubm9kZS5hZGREZXBlbmRlbmN5KGZ1bmN0aW9uQXBwKTtcblxuICAgICAgLy8gdGFpbC1mdW5jdGlvbi1sb2dzLmpzIGlzIHdyaXR0ZW4gYnk6IG5weCBvY2RrIHdyaXRlLWxvZy1jb25maWcgKHJ1biBhZnRlciBkZXBsb3kpLlxuXG4gICAgICBpZiAob2NpclJlcG9zaXRvcnkpIHtcbiAgICAgICAgbmV3IFRlcnJhZm9ybU91dHB1dCh0aGlzLCAnb2Npcl9yZXBvc2l0b3J5X25hbWUnLCB7IHZhbHVlOiBvY2lyUmVwb3NpdG9yeS5kaXNwbGF5TmFtZSwgZGVzY3JpcHRpb246ICdPQ0lSIHJlcG9zaXRvcnkgbmFtZScgfSk7XG4gICAgICB9XG4gICAgICBpZiAoYXBpR2F0ZXdheSkge1xuICAgICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdhcGlfZ2F0ZXdheV9ob3N0JywgeyB2YWx1ZTogYXBpR2F0ZXdheS5ob3N0bmFtZSwgZGVzY3JpcHRpb246ICdBUEkgR2F0ZXdheSBob3N0bmFtZScgfSk7XG4gICAgICAgIG5ldyBUZXJyYWZvcm1PdXRwdXQodGhpcywgJ2Z1bmN0aW9uX2ludm9rZV91cmwnLCB7IHZhbHVlOiBgaHR0cHM6Ly8ke2FwaUdhdGV3YXkuaG9zdG5hbWV9YCwgZGVzY3JpcHRpb246ICdCYXNlIFVSTCB0byBpbnZva2UgdGhlIGZ1bmN0aW9uJyB9KTtcbiAgICAgIH1cbiAgICAgIG5ldyBUZXJyYWZvcm1PdXRwdXQodGhpcywgJ2Z1bmN0aW9uX2FwcF9pZCcsIHsgdmFsdWU6IGZ1bmN0aW9uQXBwLmlkLCBkZXNjcmlwdGlvbjogJ09DSSBGdW5jdGlvbnMgQXBwbGljYXRpb24gT0NJRCcgfSk7XG4gICAgICBpZiAob2NpRnVuY3Rpb24pIHtcbiAgICAgICAgbmV3IFRlcnJhZm9ybU91dHB1dCh0aGlzLCAnZnVuY3Rpb25faWQnLCB7IHZhbHVlOiBvY2lGdW5jdGlvbi5pZCwgZGVzY3JpcHRpb246ICdPQ0kgRnVuY3Rpb24gT0NJRCcgfSk7XG4gICAgICB9XG4gICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdsb2dfZ3JvdXBfaWQnLCB7IHZhbHVlOiBsb2dHcm91cC5pZCwgZGVzY3JpcHRpb246ICdPQ0kgTG9nIEdyb3VwIE9DSUQgZm9yIHRoZSBhcHBsaWNhdGlvbicgfSk7XG4gICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdleGVjdXRpb25fbG9nX2lkJywgeyB2YWx1ZTogZXhlY3V0aW9uTG9nLmlkLCBkZXNjcmlwdGlvbjogJ09DSSBGdW5jdGlvbnMgZXhlY3V0aW9uIGxvZyBPQ0lEJyB9KTtcbiAgICB9XG5cbiAgICAvLyBGb3JjZSBvcmFjbGUvb2NpIChUZXJyYWZvcm0gUmVnaXN0cnkpIHNvIHRlcnJhZm9ybSBpbml0IHVzZXMgaXQgb24gT0w4IGFuZCBlbHNld2hlcmU7IG11c3QgcnVuIGFmdGVyIHByb3ZpZGVyIGlzIGFkZGVkXG4gICAgdGhpcy5hZGRPdmVycmlkZSgndGVycmFmb3JtLnJlcXVpcmVkX3Byb3ZpZGVycy5vY2knLCB7XG4gICAgICBzb3VyY2U6ICdvcmFjbGUvb2NpJyxcbiAgICAgIC8vIFBpbiB0byA8IDUuNDcuMDogNS40Ny4wIGNyYXNoZXMgb24gZGFyd2luX2FybTY0OyA1LjQ2LnggYW5kIExpbnV4IChPTDgpIHdvcmtcbiAgICAgIHZlcnNpb246ICc+PSA1LjAuMCwgPCA1LjQ3LjAnLFxuICAgIH0pO1xuICB9XG59XG4iXX0=
554
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NpLXN0YWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vb2NpLXN0YWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUNBLGlDQUF3RDtBQUN4RCw2REFBNkQ7QUFDN0QseUdBQW9HO0FBQ3BHLDZEQUF5RDtBQUN6RCxtRUFBK0Q7QUFDL0QsaUZBQTRFO0FBQzVFLHFGQUFnRjtBQUNoRix5RkFBbUY7QUFDbkYsNkVBQXdFO0FBQ3hFLHVGQUFrRjtBQUNsRixpRkFBNkU7QUFDN0UsdUZBQW1GO0FBQ25GLHVGQUFtRjtBQUNuRixpRkFBNkU7QUFDN0UscUdBQStGO0FBQy9GLCtFQUEwRTtBQUMxRSxtRUFBK0Q7QUFDL0QsMkVBQXVFO0FBQ3ZFLHFEQUFxRjtBQUNyRix1Q0FBeUI7QUFDekIsMkNBQTZCO0FBRTdCLE1BQU0sdUJBQXVCLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQTJCL0IsQ0FBQztBQUVGLE1BQU0sdUJBQXVCLEdBQUc7Ozs7Ozs7O0VBUTlCLENBQUM7QUFFSCxNQUFNLHVCQUF1QixHQUFHOzs7OztDQUsvQixDQUFDO0FBRUYsTUFBTSx1QkFBdUIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQW1CL0IsQ0FBQztBQTBDRixNQUFhLFFBQVMsU0FBUSxzQkFBYztJQUMxQyxZQUFZLEtBQWdCLEVBQUUsRUFBVSxFQUFFLE1BQXNCO1FBQzlELEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFakIsNkNBQTZDO1FBQzdDLElBQUksTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxPQUFPLEVBQUUsQ0FBQztZQUN0RCxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUNsQyxxQkFBcUI7Z0JBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsbUJBQW1C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RUFBRSxXQUFXLEVBQUUsd0NBQXdDLEVBQUUsQ0FBQyxDQUFDO1lBQ3pILElBQUksdUJBQWUsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDO1FBQzdILENBQUM7UUFFRCx5SEFBeUg7UUFDekgsSUFBSSxDQUFDLFdBQVcsQ0FBQyxrQ0FBa0MsRUFBRTtZQUNuRCxNQUFNLEVBQUUsWUFBWTtZQUNwQiwrRUFBK0U7WUFDL0UsT0FBTyxFQUFFLG9CQUFvQjtTQUM5QixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUEvYkQsNEJBK2JDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQgeyBUZXJyYWZvcm1TdGFjaywgVGVycmFmb3JtT3V0cHV0IH0gZnJvbSAnY2RrdGYnO1xuaW1wb3J0IHsgT2NpUHJvdmlkZXIgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvcHJvdmlkZXInO1xuaW1wb3J0IHsgQXJ0aWZhY3RzQ29udGFpbmVyUmVwb3NpdG9yeSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9hcnRpZmFjdHMtY29udGFpbmVyLXJlcG9zaXRvcnknO1xuaW1wb3J0IHsgQ29yZVZjbiB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9jb3JlLXZjbic7XG5pbXBvcnQgeyBDb3JlU3VibmV0IH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2NvcmUtc3VibmV0JztcbmltcG9ydCB7IENvcmVTZWN1cml0eUxpc3QgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvY29yZS1zZWN1cml0eS1saXN0JztcbmltcG9ydCB7IENvcmVTZXJ2aWNlR2F0ZXdheSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9jb3JlLXNlcnZpY2UtZ2F0ZXdheSc7XG5pbXBvcnQgeyBEYXRhT2NpQ29yZVNlcnZpY2VzIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2RhdGEtb2NpLWNvcmUtc2VydmljZXMnO1xuaW1wb3J0IHsgQ29yZVJvdXRlVGFibGUgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvY29yZS1yb3V0ZS10YWJsZSc7XG5pbXBvcnQgeyBDb3JlSW50ZXJuZXRHYXRld2F5IH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2NvcmUtaW50ZXJuZXQtZ2F0ZXdheSc7XG5pbXBvcnQgeyBBcGlnYXRld2F5R2F0ZXdheSB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9hcGlnYXRld2F5LWdhdGV3YXknO1xuaW1wb3J0IHsgQXBpZ2F0ZXdheURlcGxveW1lbnQgfSBmcm9tICcuLi8uZ2VuL3Byb3ZpZGVycy9vY2kvYXBpZ2F0ZXdheS1kZXBsb3ltZW50JztcbmltcG9ydCB7IEZ1bmN0aW9uc0FwcGxpY2F0aW9uIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2Z1bmN0aW9ucy1hcHBsaWNhdGlvbic7XG5pbXBvcnQgeyBGdW5jdGlvbnNGdW5jdGlvbiB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9mdW5jdGlvbnMtZnVuY3Rpb24nO1xuaW1wb3J0IHsgRGF0YU9jaUZ1bmN0aW9uc0Z1bmN0aW9ucyB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9kYXRhLW9jaS1mdW5jdGlvbnMtZnVuY3Rpb25zJztcbmltcG9ydCB7IExvZ2dpbmdMb2dHcm91cCB9IGZyb20gJy4uLy5nZW4vcHJvdmlkZXJzL29jaS9sb2dnaW5nLWxvZy1ncm91cCc7XG5pbXBvcnQgeyBMb2dnaW5nTG9nIH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2xvZ2dpbmctbG9nJztcbmltcG9ydCB7IElkZW50aXR5UG9saWN5IH0gZnJvbSAnLi4vLmdlbi9wcm92aWRlcnMvb2NpL2lkZW50aXR5LXBvbGljeSc7XG5pbXBvcnQgeyBPY2lCYWNrZW5kQ29uZmlnLCBvY2lySG9zdEtleSwgZ2V0T2NpSW1hZ2VVcmwgfSBmcm9tICcuLi9jb25maWcvb2NpLWNvbmZpZyc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5jb25zdCBHUkFBTFZNX0pBVkFfRE9DS0VSRklMRSA9IGBGUk9NIGRvY2tlci5pby9mbnByb2plY3QvZm4tamF2YS1mZGstYnVpbGQ6amRrMTctMS4wLWxhdGVzdCBhcyBidWlsZC1zdGFnZVxuV09SS0RJUiAvZnVuY3Rpb25cbkVOViBNQVZFTl9PUFRTIC1EaHR0cC5wcm94eUhvc3Q9IC1EaHR0cC5wcm94eVBvcnQ9IC1EaHR0cHMucHJveHlIb3N0PSAtRGh0dHBzLnByb3h5UG9ydD0gLURodHRwLm5vblByb3h5SG9zdHM9IC1EbWF2ZW4ucmVwby5sb2NhbD0vdXNyL3NoYXJlL21hdmVuL3JlZi9yZXBvc2l0b3J5XG5BREQgcG9tLnhtbCAvZnVuY3Rpb24vcG9tLnhtbFxuUlVOIFtcIm12blwiLCBcInBhY2thZ2VcIiwgXCJkZXBlbmRlbmN5OmNvcHktZGVwZW5kZW5jaWVzXCIsIFwiLURpbmNsdWRlU2NvcGU9cnVudGltZVwiLCBcIi1Ec2tpcFRlc3RzPXRydWVcIiwgXCItRG1kZXAucHJlcGVuZEdyb3VwSWQ9dHJ1ZVwiLCBcIi1Eb3V0cHV0RGlyZWN0b3J5PXRhcmdldFwiLCBcIi0tZmFpbC1uZXZlclwiXVxuQUREIHNyYyAvZnVuY3Rpb24vc3JjXG5SVU4gW1wibXZuXCIsIFwicGFja2FnZVwiXVxuXG5GUk9NIGNvbnRhaW5lci1yZWdpc3RyeS5vcmFjbGUuY29tL2dyYWFsdm0vbmF0aXZlLWltYWdlOjIzLW9sOCBBUyBuYXRpdmVcbldPUktESVIgL2FwcFxuQ09QWSAtLWZyb209YnVpbGQtc3RhZ2UgL2Z1bmN0aW9uL3RhcmdldCAuXG5BREQgcmVmbGVjdGlvbi5qc29uIC5cblxuUlVOIG5hdGl2ZS1pbWFnZSBcXFxcXG4gICAgIC1IOlJlZmxlY3Rpb25Db25maWd1cmF0aW9uRmlsZXM9L2FwcC9yZWZsZWN0aW9uLmpzb24gXFxcXFxuICAgICAtT2IgXFxcXFxuICAgICAtSDpOYW1lPUhlbGxvIFxcXFxcbiAgICAgLWNwIFwiL2FwcC9oZWxsby0xLjAuMC5qYXI6L2FwcC8qXCIgIFxcXFxcbiAgICAgICAgY29tLmZucHJvamVjdC5mbi5ydW50aW1lLkVudHJ5UG9pbnRcblxuRlJPTSBkb2NrZXIuaW8vZm5wcm9qZWN0L2ZuLWphdmEtZmRrOmpyZTE3LWxhdGVzdCBhcyBmZGtcblxuRlJPTSBjb250YWluZXItcmVnaXN0cnkub3JhY2xlLmNvbS9vcy9vcmFjbGVsaW51eDo4LXNsaW1cbkNPUFkgLS1mcm9tPW5hdGl2ZSAvYXBwL0hlbGxvIC5cbkNPUFkgLS1mcm9tPWZkayAvZnVuY3Rpb24vcnVudGltZS8qIC4vXG5FTlRSWVBPSU5UIFsgXCIuL0hlbGxvXCIgXVxuQ01EIFsgXCJjb20uZXhhbXBsZS5mbi5IZWxsb0Z1bmN0aW9uOjpoYW5kbGVSZXF1ZXN0XCIsIFwiLURqYXZhLmxpYnJhcnkucGF0aD0vbGliXCJdXG5gO1xuXG5jb25zdCBHUkFBTFZNX1JFRkxFQ1RJT05fSlNPTiA9IGBbXG4gICAge1xuICAgICAgXCJuYW1lXCI6IFwiY29tLmV4YW1wbGUuZm4uSGVsbG9GdW5jdGlvblwiLFxuICAgICAgXCJhbGxEZWNsYXJlZE1ldGhvZHNcIjogdHJ1ZSxcbiAgICAgIFwibWV0aG9kc1wiOiBbXG4gICAgICAgIHsgXCJuYW1lXCI6IFwiPGluaXQ+XCIsIFwicGFyYW1ldGVyVHlwZXNcIjogW10gfVxuICAgICAgXVxuICAgIH1cbl1gO1xuXG5jb25zdCBHUkFBTFZNX1BPTV9SVU5USU1FX0RFUCA9IGAgICAgICAgIDxkZXBlbmRlbmN5PlxuICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZucHJvamVjdC5mbjwvZ3JvdXBJZD5cbiAgICAgICAgICAgIDxhcnRpZmFjdElkPnJ1bnRpbWU8L2FydGlmYWN0SWQ+XG4gICAgICAgICAgICA8dmVyc2lvbj5cXCR7ZmRrLnZlcnNpb259PC92ZXJzaW9uPlxuICAgICAgICA8L2RlcGVuZGVuY3k+XG5gO1xuXG5jb25zdCBHUkFBTFZNX1BPTV9CVUlMRF9CTE9DSyA9IGAgICAgPGJ1aWxkPlxuICAgICAgICA8cGx1Z2lucz5cbiAgICAgICAgICAgIDxwbHVnaW4+XG4gICAgICAgICAgICAgICAgPCEtLSBDb3B5IGRlcGVuZGVuY2llcyAtLT5cbiAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD5cbiAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz5cbiAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5pbnN0YWxsPC9waGFzZT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb3B5LWRlcGVuZGVuY2llczwvZ29hbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+XG4gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PlxcJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbGliPC9vdXRwdXREaXJlY3Rvcnk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPlxuICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz5cbiAgICAgICAgICAgIDwvcGx1Z2luPlxuICAgICAgICA8L3BsdWdpbnM+XG4gICAgPC9idWlsZD5cbmA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgT2NpU3RhY2tDb25maWcge1xuICBjb21wYXJ0bWVudElkOiBzdHJpbmc7XG4gIG9jaXJDb21wYXJ0bWVudElkPzogc3RyaW5nO1xuICB0ZW5hbmN5SWQ6IHN0cmluZztcbiAgcmVnaW9uOiBzdHJpbmc7XG4gIG5hbWVzcGFjZTogc3RyaW5nO1xuICAvKiogV2hlbiB0cnVlLCBjcmVhdGUgSUFNIHBvbGljeSBzbyBBUEkgR2F0ZXdheSBjYW4gaW52b2tlIEZ1bmN0aW9ucy4gKi9cbiAgY3JlYXRlQXBpZ3dQb2xpY3k/OiBib29sZWFuO1xuICAvKiogT0NJIEZ1bmN0aW9ucyBhcHBsaWNhdGlvbiBuYW1lIChlLmcuIG15LWFwcCkuIFNldCB2aWEgT0NJX0ZVTkNUSU9OX0FQUF9OQU1FIG9yIHBhc3MgaW4gY29uZmlnLiAqL1xuICBmdW5jdGlvbkFwcE5hbWU6IHN0cmluZztcbiAgLyoqIE9DSSBGdW5jdGlvbiBuYW1lIChlLmcuIG15LWZ1bmN0aW9uKS4gU2V0IHZpYSBPQ0lfRlVOQ1RJT05fTkFNRSBvciBwYXNzIGluIGNvbmZpZy4gKi9cbiAgZnVuY3Rpb25OYW1lOiBzdHJpbmc7XG4gIC8qKiBPcHRpb25hbCBwYXRoIHRvIEpBUiAob3IgRG9ja2VyZmlsZSBjb250ZXh0KSB0byBidWlsZCBhbmQgZGVwbG95IGFzIHRoZSBmdW5jdGlvbiBpbWFnZS4gU2V0IHZpYSBPQ0lfRlVOQ1RJT05fSkFSX1BBVEguIEVtcHR5ID0gbm8gZnVuY3Rpb24vaW1hZ2UgYnVpbGQuICovXG4gIGZ1bmN0aW9uSmFyUGF0aD86IHN0cmluZztcbiAgLyoqIERpcmVjdG9yeSBjb250YWluaW5nIHRhcmdldC8gKERvY2tlcmZpbGUgaXMgZ2VuZXJhdGVkIGluIGxvY2FsLWV4ZWMpLiBXaGVuIHNldCB3aXRoIGZ1bmN0aW9uTmFtZSwgY3JlYXRlcyBWQ04sIEZ1bmN0aW9uLCBBUEkgR2F0ZXdheS4gKi9cbiAgZG9ja2VyQ29udGV4dFBhdGg/OiBzdHJpbmc7XG4gIC8qKiBJbWFnZSB0YWcgZm9yIE9DSVIgKGZyb20gZnVuYy55YW1sIHZlcnNpb24gb3IgT0NJX0lNQUdFX1RBRzsgZGVmYXVsdCAnbGF0ZXN0JykuICovXG4gIGltYWdlVGFnPzogc3RyaW5nO1xuICAvKiogSmF2YSBGREsgQ01EIGhhbmRsZXIgKGZyb20gZnVuYy55YW1sIG9yIE9DSV9GVU5DVElPTl9IQU5ETEVSKS4gKi9cbiAgaGFuZGxlcj86IHN0cmluZztcbiAgb2NpclJlcG9zaXRvcnlOYW1lPzogc3RyaW5nO1xuICAvKiogQVBJIEdhdGV3YXkgZGVwbG95bWVudCBwYXRoIHByZWZpeC4gRGVmYXVsdCAnLycuICovXG4gIGFwaUd3UGF0aFByZWZpeD86IHN0cmluZztcbiAgLyoqIEFQSSBHYXRld2F5IHJvdXRlIHBhdGguIERlZmF1bHQgJy97cGF0aCp9Jy4gKi9cbiAgYXBpR3dSb3V0ZVBhdGg/OiBzdHJpbmc7XG4gIC8qKiBBUEkgR2F0ZXdheSByb3V0ZSBtZXRob2RzLiBEZWZhdWx0IFsnR0VUJywgJ1BPU1QnLCAnT1BUSU9OUyddLiAqL1xuICBhcGlHd01ldGhvZHM/OiBzdHJpbmdbXTtcbiAgLyoqIEZ1bmN0aW9uIG1lbW9yeSBpbiBNQiAoZS5nLiAnMjU2JykuIEZyb20gZnVuYy55YW1sIG9yIE9DSV9GVU5DVElPTl9NRU1PUllfTUIuICovXG4gIGZ1bmN0aW9uTWVtb3J5TWI/OiBzdHJpbmc7XG4gIC8qKiBGdW5jdGlvbiB0aW1lb3V0IGluIHNlY29uZHMuIEZyb20gZnVuYy55YW1sIG9yIE9DSV9GVU5DVElPTl9USU1FT1VUX1NFQ09ORFMuICovXG4gIGZ1bmN0aW9uVGltZW91dFNlY29uZHM/OiBudW1iZXI7XG4gIC8qKiBGdW5jdGlvbiBjb25maWcvZW52IGtleS12YWx1ZS4gRnJvbSBmdW5jLnlhbWwgY29uZmlnIG9yIE9DSV9GVU5DVElPTl9DT05GSUcuICovXG4gIGZ1bmN0aW9uQ29uZmlnPzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgLyoqIFBhdGggdG8gQVBJIEdhdGV3YXkgZGVwbG95bWVudCBzcGVjIEpTT04gKHJvdXRlcykuIERlZmF1bHQgb2NpX2FwaWdhdGV3YXlfZGVwbG95bWVudC5qc29uIGluIHByb2plY3Qgcm9vdC4gKi9cbiAgYXBpR3dEZXBsb3ltZW50SnNvblBhdGg/OiBzdHJpbmc7XG4gIC8qKiBSdW50aW1lIGZyb20gZnVuYy55YW1sIChlLmcuICdqYXZhJywgJ3B5dGhvbicpOyBjb250cm9scyBEb2NrZXJmaWxlIGdlbmVyYXRpb24uICovXG4gIHJ1bnRpbWU/OiBzdHJpbmc7XG4gIGJhY2tlbmQ/OiBPY2lCYWNrZW5kQ29uZmlnO1xufVxuXG5leHBvcnQgY2xhc3MgT2NpU3RhY2sgZXh0ZW5kcyBUZXJyYWZvcm1TdGFjayB7XG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBDb25zdHJ1Y3QsIGlkOiBzdHJpbmcsIGNvbmZpZzogT2NpU3RhY2tDb25maWcpIHtcbiAgICBzdXBlcihzY29wZSwgaWQpO1xuXG4gICAgLy8gQ29uZmlndXJlIFRlcnJhZm9ybSBiYWNrZW5kIChpZiBub3QgbG9jYWwpXG4gICAgaWYgKGNvbmZpZy5iYWNrZW5kICYmIGNvbmZpZy5iYWNrZW5kLnR5cGUgIT09ICdsb2NhbCcpIHtcbiAgICAgIGlmIChjb25maWcuYmFja2VuZC50eXBlID09PSAnb2NpJykge1xuICAgICAgICAvLyBPQ0kgbmF0aXZlIGJhY2tlbmRcbiAgICAgICAgdGhpcy5hZGRPdmVycmlkZSgndGVycmFmb3JtLmJhY2tlbmQnLCB7XG4gICAgICAgICAgb2NpOiB7XG4gICAgICAgICAgICBidWNrZXQ6IGNvbmZpZy5iYWNrZW5kLmJ1Y2tldCxcbiAgICAgICAgICAgIG5hbWVzcGFjZTogY29uZmlnLm5hbWVzcGFjZSxcbiAgICAgICAgICAgIGtleTogY29uZmlnLmJhY2tlbmQua2V5IHx8IGAke2lkfS90ZXJyYWZvcm0udGZzdGF0ZWAsXG4gICAgICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNvbmZpZy5iYWNrZW5kLnR5cGUgPT09ICdodHRwJykge1xuICAgICAgICAvLyBIVFRQIGJhY2tlbmQgKGZvciBPQ0kgT2JqZWN0IFN0b3JhZ2UgdmlhIFJFU1QgQVBJKVxuICAgICAgICBjb25zdCBodHRwQmFja2VuZDogYW55ID0ge1xuICAgICAgICAgIGFkZHJlc3M6IGNvbmZpZy5iYWNrZW5kLmFkZHJlc3MsXG4gICAgICAgICAgdXBkYXRlX21ldGhvZDogY29uZmlnLmJhY2tlbmQudXBkYXRlTWV0aG9kIHx8ICdQVVQnLFxuICAgICAgICB9O1xuICAgICAgICBpZiAoY29uZmlnLmJhY2tlbmQubG9ja0FkZHJlc3MpIHtcbiAgICAgICAgICBodHRwQmFja2VuZC5sb2NrX2FkZHJlc3MgPSBjb25maWcuYmFja2VuZC5sb2NrQWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29uZmlnLmJhY2tlbmQudW5sb2NrQWRkcmVzcykge1xuICAgICAgICAgIGh0dHBCYWNrZW5kLnVubG9ja19hZGRyZXNzID0gY29uZmlnLmJhY2tlbmQudW5sb2NrQWRkcmVzcztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFkZE92ZXJyaWRlKCd0ZXJyYWZvcm0uYmFja2VuZCcsIHtcbiAgICAgICAgICBodHRwOiBodHRwQmFja2VuZCxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gT0NJIFByb3ZpZGVyXG4gICAgbmV3IE9jaVByb3ZpZGVyKHRoaXMsICdvY2knLCB7XG4gICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICB0ZW5hbmN5T2NpZDogY29uZmlnLnRlbmFuY3lJZCxcbiAgICB9KTtcblxuICAgIC8vIE9DSV9TVEFDS19BQ1RJT046IFwiZnVuY3Rpb24tb25seVwiIChvciBsZWdhY3kgXCJmdW5jdGlvblwiKSA9PiBubyBBUEkgR2F0ZXdheTsgXCJmdWxsLXN0YWNrXCIgb3IgdW5zZXQgPT4gZnVsbCBzdGFjayBpbmNsdWRpbmcgQVBJIEdhdGV3YXkuXG4gICAgY29uc3Qgc3RhY2tBY3Rpb25SYXcgPSAocHJvY2Vzcy5lbnYuT0NJX1NUQUNLX0FDVElPTiB8fCAnJykudHJpbSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgY29uc3QgY29kZU9ubHkgPSBwcm9jZXNzLmVudi5PQ0lfQ09ERV9PTkxZID09PSAnMScgfHwgcHJvY2Vzcy5lbnZbJ2NvZGUtb25seSddID09PSAnMSc7XG4gICAgLy8gQ29kZS1vbmx5IGZ1bmN0aW9ucyBhcmUgY3JlYXRlZCBieSBPQ0kgQ0xJLiBXaGVuIHRoZSBmdWxsIHN0YWNrIGlzIHJlcXVlc3RlZCxcbiAgICAvLyB0aGVpciBPQ0lEIGlzIGxvb2tlZCB1cCBieSBUZXJyYWZvcm0gYmVmb3JlIHdpcmluZyB0aGUgQVBJIEdhdGV3YXkgcm91dGUuXG4gICAgY29uc3Qgc3RhY2tBY3Rpb24gPSBzdGFja0FjdGlvblJhdyA9PT0gJ2Z1bmN0aW9uLW9ubHknIHx8IHN0YWNrQWN0aW9uUmF3ID09PSAnZnVuY3Rpb24nID8gJ2Z1bmN0aW9uLW9ubHknIDogJ2Z1bGwtc3RhY2snO1xuXG4gICAgLy8gT0NJUiBDb250YWluZXIgUmVwb3NpdG9yeSAocm9vdCBjb21wYXJ0bWVudCBhbGxvd2VkIGlmIGV4cGxpY2l0bHkgc2V0KS5cbiAgICBjb25zdCBvY2lyQ29tcGFydG1lbnRJZCA9IGNvbmZpZy5vY2lyQ29tcGFydG1lbnRJZCB8fCBjb25maWcuY29tcGFydG1lbnRJZDtcbiAgICBjb25zdCBvY2lyUmVwb05hbWUgPSBjb25maWcub2NpclJlcG9zaXRvcnlOYW1lIHx8IGNvbmZpZy5mdW5jdGlvbk5hbWUgfHwgJ29jaS1mdW5jdGlvbic7XG4gICAgY29uc3Qgb2NpclJlcG9zaXRvcnkgPSBjb2RlT25seSA/IHVuZGVmaW5lZCA6IG5ldyBBcnRpZmFjdHNDb250YWluZXJSZXBvc2l0b3J5KHRoaXMsICdPY2lyUmVwb3NpdG9yeScsIHtcbiAgICAgIGNvbXBhcnRtZW50SWQ6IG9jaXJDb21wYXJ0bWVudElkLFxuICAgICAgZGlzcGxheU5hbWU6IG9jaXJSZXBvTmFtZSxcbiAgICAgIGlzUHVibGljOiBmYWxzZSxcbiAgICAgIGlzSW1tdXRhYmxlOiBmYWxzZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IGRvY2tlckNvbnRleHRQYXRoID0gKGNvbmZpZy5kb2NrZXJDb250ZXh0UGF0aCB8fCBjb25maWcuZnVuY3Rpb25KYXJQYXRoKT8udHJpbSgpO1xuICAgIGNvbnN0IGNyZWF0ZUZ1bGxTdGFjayA9IGNvbmZpZy5mdW5jdGlvbk5hbWUgJiYgKGRvY2tlckNvbnRleHRQYXRoIHx8IGNvZGVPbmx5KTtcblxuICAgIGlmIChjcmVhdGVGdWxsU3RhY2spIHtcbiAgICAgIGlmICghY29kZU9ubHkgJiYgb2NpckNvbXBhcnRtZW50SWQuaW5jbHVkZXMoJ3Jvb3QnKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Z1bGwgc3RhY2sgKEZ1bmN0aW9uICsgQVBJIEdhdGV3YXkpIHJlcXVpcmVzIGEgbm9uLXJvb3QgY29tcGFydG1lbnQgZm9yIE9DSVIuIFNldCBPQ0lfT0NJUl9DT01QQVJUTUVOVF9JRCB0byB5b3VyIGhvbWUgY29tcGFydG1lbnQgT0NJRC4nXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBhcHBOYW1lID0gY29uZmlnLmZ1bmN0aW9uQXBwTmFtZSB8fCBjb25maWcuZnVuY3Rpb25OYW1lITtcbiAgICAgIGNvbnN0IHJlc291cmNlTmFtZSA9IGFwcE5hbWU7XG5cbiAgICAgIGNvbnN0IHByaXZhdGVTdWJuZXRJZEZyb21FbnYgPSAocHJvY2Vzcy5lbnYuT0NJX1BSSVZBVEVfU1VCTkVUX0lEIHx8IHByb2Nlc3MuZW52Lk9DSV9QUklWQVRFX1NVQk5FVF9PQ0lEIHx8IHByb2Nlc3MuZW52Lk9DSV9GVU5DVElPTl9TVUJORVRfSUQgfHwgJycpLnRyaW0oKTtcbiAgICAgIGNvbnN0IHB1YmxpY1N1Ym5ldElkRnJvbUVudiA9IChwcm9jZXNzLmVudi5PQ0lfUFVCTElDX1NVQk5FVF9JRCB8fCBwcm9jZXNzLmVudi5PQ0lfUFVCTElDX1NVQk5FVF9PQ0lEIHx8IHByb2Nlc3MuZW52Lk9DSV9BUElHQVRFV0FZX1NVQk5FVF9JRCB8fCAnJykudHJpbSgpO1xuXG4gICAgICBsZXQgaW1hZ2VVcmw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBidWlsZEFuZFB1c2hJbWFnZUlkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWNvZGVPbmx5KSB7XG4gICAgICBjb25zdCBmdW5jdGlvbkNvZGVQYXRoID0gcGF0aC5yZXNvbHZlKGRvY2tlckNvbnRleHRQYXRoISk7XG4gICAgICBjb25zdCBpbWFnZVRhZyA9IGNvbmZpZy5pbWFnZVRhZyB8fCAnbGF0ZXN0JztcbiAgICAgIGNvbnN0IG9jaXJSZWdpc3RyeSA9IGAke29jaXJIb3N0S2V5KGNvbmZpZy5yZWdpb24pfS5vY2lyLmlvYDtcbiAgICAgIGltYWdlVXJsID0gZ2V0T2NpSW1hZ2VVcmwoY29uZmlnKTtcbiAgICAgIHRoaXMuYWRkT3ZlcnJpZGUoJ3RlcnJhZm9ybS5yZXF1aXJlZF9wcm92aWRlcnMubnVsbCcsIHtcbiAgICAgICAgc291cmNlOiAnaGFzaGljb3JwL251bGwnLFxuICAgICAgICB2ZXJzaW9uOiAnfj4gMy4wJyxcbiAgICAgIH0pO1xuICAgICAgYnVpbGRBbmRQdXNoSW1hZ2VJZCA9ICdCdWlsZEFuZFB1c2hJbWFnZSc7XG4gICAgICB0aGlzLmFkZE92ZXJyaWRlKGByZXNvdXJjZS5udWxsX3Jlc291cmNlLiR7YnVpbGRBbmRQdXNoSW1hZ2VJZH0uZGVwZW5kc19vbmAsIFtcbiAgICAgICAgJ29jaV9hcnRpZmFjdHNfY29udGFpbmVyX3JlcG9zaXRvcnkuT2NpclJlcG9zaXRvcnknLFxuICAgICAgXSk7XG4gICAgICB0aGlzLmFkZE92ZXJyaWRlKGByZXNvdXJjZS5udWxsX3Jlc291cmNlLiR7YnVpbGRBbmRQdXNoSW1hZ2VJZH0udHJpZ2dlcnNgLCB7XG4gICAgICAgIHJlcG9fbmFtZTogb2NpclJlcG9OYW1lLFxuICAgICAgICBpbWFnZV91cmw6IGltYWdlVXJsLFxuICAgICAgICBpbWFnZV90YWc6IGltYWdlVGFnLFxuICAgICAgICBoYW5kbGVyOiBjb25maWcuaGFuZGxlciB8fCAnJyxcbiAgICAgICAgbmFtZXNwYWNlOiBjb25maWcubmFtZXNwYWNlLFxuICAgICAgICByZWdpb246IGNvbmZpZy5yZWdpb24sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHJlZ2lvblAgPSBjb25maWcucmVnaW9uO1xuICAgICAgY29uc3QgbmFtZXNwYWNlUCA9IGNvbmZpZy5uYW1lc3BhY2U7XG4gICAgICBjb25zdCBvY2lyVXNlciA9IHByb2Nlc3MuZW52Lk9DSV9PQ0lSX1VTRVJOQU1FIHx8ICdBVVRPX0RFVEVDVCc7XG4gICAgICBjb25zdCBvY2lDbGlQYXRoID0gKHByb2Nlc3MuZW52Lk9DSV9DTElfUEFUSCB8fCAnb2NpJykudHJpbSgpIHx8ICdvY2knO1xuICAgICAgY29uc3Qgb2NpQ2xpQ29tbWFuZCA9IGAnJHtvY2lDbGlQYXRoLnJlcGxhY2UoLycvZywgXCInXFxcXCcnXCIpfSdgO1xuICAgICAgY29uc3QgbG9naW5TY3JpcHQgPSBwcm9jZXNzLmVudi5PQ0lfQVVUSF9UT0tFTlxuICAgICAgICA/IGBleHBvcnQgT0NJUl9BVVRIX1RPS0VOPVwiJHtwcm9jZXNzLmVudi5PQ0lfQVVUSF9UT0tFTn1cIjsgT0NJUl9VU0VSPVwiJHtvY2lyVXNlcn1cIjsgWyBcIiRPQ0lSX1VTRVJcIiA9IFwiQVVUT19ERVRFQ1RcIiBdICYmIE9DSVJfVVNFUj1cIiR7bmFtZXNwYWNlUH0vdXNlclwiOyBlY2hvIFwiJE9DSVJfQVVUSF9UT0tFTlwiIHwgZG9ja2VyIGxvZ2luICR7b2NpclJlZ2lzdHJ5fSAtdSBcIiRPQ0lSX1VTRVJcIiAtLXBhc3N3b3JkLXN0ZGluIHx8IGV4aXQgMWBcbiAgICAgICAgOiBgJHtvY2lDbGlDb21tYW5kfSByYXctcmVxdWVzdCAtLXJlZ2lvbiAke3JlZ2lvblB9IC0taHR0cC1tZXRob2QgR0VUIC0tdGFyZ2V0LXVyaSBcImh0dHBzOi8vJHtvY2lyUmVnaXN0cnl9LzIwMTgwNDE5L2RvY2tlci90b2tlblwiIDI+L2Rldi9udWxsIHwgKGNvbW1hbmQgLXYganEgPi9kZXYvbnVsbCAmJiBqcSAtciAuZGF0YS50b2tlbiB8fCBncmVwIC1vICdcInRva2VuXCI6XCJbXlwiXSpcIicgfCBjdXQgLWQnXCInIC1mNCkgfCBkb2NrZXIgbG9naW4gLXUgQkVBUkVSX1RPS0VOIC0tcGFzc3dvcmQtc3RkaW4gJHtvY2lyUmVnaXN0cnl9IHx8IChlY2hvIFwiU2V0IE9DSV9BVVRIX1RPS0VOIG9yIGNvbmZpZ3VyZSBPQ0kgQ0xJXCIgPiYyOyBleGl0IDEpYDtcbiAgICAgIGNvbnN0IGhhbmRsZXIgPSBjb25maWcuaGFuZGxlciB8fCAnY29tLmV4YW1wbGUuZm4uSGVsbG9GdW5jdGlvbjo6aGFuZGxlUmVxdWVzdCc7XG4gICAgICBjb25zdCBydW50aW1lID0gY29uZmlnLnJ1bnRpbWU/LnRvTG93ZXJDYXNlKCk7XG4gICAgICBsZXQgZG9ja2VyZmlsZUNvbnRlbnQgPSAnJztcbiAgICAgIGlmIChydW50aW1lICYmIHJ1bnRpbWUuc3RhcnRzV2l0aCgncHl0aG9uJykpIHtcbiAgICAgICAgZG9ja2VyZmlsZUNvbnRlbnQgPSBgRlJPTSBkb2NrZXIuaW8vZm5wcm9qZWN0L3B5dGhvbjozLjEyLWRldiBhcyBidWlsZC1zdGFnZVxuV09SS0RJUiAvZnVuY3Rpb25cbkFERCByZXF1aXJlbWVudHMudHh0IC9mdW5jdGlvbi9cblJVTiBwaXAzIGluc3RhbGwgLS10YXJnZXQgL3B5dGhvbi8gLS1uby1jYWNoZSAtLW5vLWNhY2hlLWRpciAtciByZXF1aXJlbWVudHMudHh0ICYmXFxcblx0XHRcdCAgICBybSAtZnIgfi8uY2FjaGUvcGlwIC90bXAqIHJlcXVpcmVtZW50cy50eHQgZnVuYy55YW1sIERvY2tlcmZpbGUgLnZlbnYgJiZcXFxuXHRcdFx0ICAgIGNobW9kIC1SIG8rciAvcHl0aG9uXG5BREQgLiAvZnVuY3Rpb24vXG5SVU4gcm0gLWZyIC9mdW5jdGlvbi8ucGlwX2NhY2hlXG5GUk9NIGRvY2tlci5pby9mbnByb2plY3QvcHl0aG9uOjMuMTJcbldPUktESVIgL2Z1bmN0aW9uXG5DT1BZIC0tZnJvbT1idWlsZC1zdGFnZSAvcHl0aG9uIC9weXRob25cbkNPUFkgLS1mcm9tPWJ1aWxkLXN0YWdlIC9mdW5jdGlvbiAvZnVuY3Rpb25cblJVTiBjaG1vZCAtUiBvK3IgL2Z1bmN0aW9uXG5FTlYgUFlUSE9OUEFUSD0vZnVuY3Rpb246L3B5dGhvblxuRU5UUllQT0lOVCBbXCIvcHl0aG9uL2Jpbi9mZGtcIiwgXCIvZnVuY3Rpb24vZnVuYy5weVwiLCBcImhhbmRsZXJcIl1cbmA7XG4gICAgICB9IGVsc2UgaWYgKHJ1bnRpbWUgJiYgcnVudGltZS5zdGFydHNXaXRoKCdub2RlJykpIHtcbiAgICAgICAgZG9ja2VyZmlsZUNvbnRlbnQgPSBgRlJPTSBkb2NrZXIuaW8vZm5wcm9qZWN0L25vZGU6MjQtZGV2IGFzIGJ1aWxkLXN0YWdlXG5XT1JLRElSIC9mdW5jdGlvblxuQUREIHBhY2thZ2UuanNvbiAvZnVuY3Rpb24vXG5SVU4gbnBtIHBrZyBkZWxldGUgXCJkZXBlbmRlbmNpZXMuQG1pa2FyaW5uZW9yYWNsZS9vY2ktY2RrXCJcblJVTiBucG0gaW5zdGFsbCAgJiYgY2hvd24gLVIgJChpZCAtdSk6JChpZCAtZykgbm9kZV9tb2R1bGVzXG5GUk9NIGRvY2tlci5pby9mbnByb2plY3Qvbm9kZToyNFxuV09SS0RJUiAvZnVuY3Rpb25cbkFERCAuIC9mdW5jdGlvbi9cbkNPUFkgLS1mcm9tPWJ1aWxkLXN0YWdlIC9mdW5jdGlvbi9ub2RlX21vZHVsZXMvIC9mdW5jdGlvbi9ub2RlX21vZHVsZXMvXG5SVU4gY2htb2QgLVIgbytyIC9mdW5jdGlvblxuRU5UUllQT0lOVCBbXCJub2RlXCIsIFwiZnVuYy5qc1wiXVxuYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHVzZUdyYWFsVm0gPSAocHJvY2Vzcy5lbnYuT0NJX1VTRV9HUkFBTFZNX0pBVkEgfHwgJycpLnRyaW0oKSA9PT0gJzEnO1xuICAgICAgICBpZiAodXNlR3JhYWxWbSkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBVc2UgYmFrZWQtaW4gR3JhYWxWTSBEb2NrZXJmaWxlIHRlbXBsYXRlXG4gICAgICAgICAgICBkb2NrZXJmaWxlQ29udGVudCA9IEdSQUFMVk1fSkFWQV9ET0NLRVJGSUxFO1xuXG4gICAgICAgICAgICAvLyBFbnN1cmUgcmVmbGVjdGlvbi5qc29uIGV4aXN0cyBpbiBwcm9qZWN0IHJvb3RcbiAgICAgICAgICAgIGNvbnN0IHJlZmxlY3Rpb25UYXJnZXRQYXRoID0gcGF0aC5qb2luKGZ1bmN0aW9uQ29kZVBhdGgsICdyZWZsZWN0aW9uLmpzb24nKTtcbiAgICAgICAgICAgIGlmICghZnMuZXhpc3RzU3luYyhyZWZsZWN0aW9uVGFyZ2V0UGF0aCkpIHtcbiAgICAgICAgICAgICAgZnMud3JpdGVGaWxlU3luYyhyZWZsZWN0aW9uVGFyZ2V0UGF0aCwgR1JBQUxWTV9SRUZMRUNUSU9OX0pTT04sICd1dGY4Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEVuc3VyZSBwb20ueG1sIGhhcyBydW50aW1lIGRlcGVuZGVuY3kgZm9yIEdyYWFsVk0gbmF0aXZlIGltYWdlXG4gICAgICAgICAgICBjb25zdCBwcm9qZWN0UG9tUGF0aCA9IHBhdGguam9pbihmdW5jdGlvbkNvZGVQYXRoLCAncG9tLnhtbCcpO1xuICAgICAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocHJvamVjdFBvbVBhdGgpKSB7XG4gICAgICAgICAgICAgIGxldCBwb21Db250ZW50ID0gZnMucmVhZEZpbGVTeW5jKHByb2plY3RQb21QYXRoLCAndXRmOCcpO1xuXG4gICAgICAgICAgICAgIGlmICghcG9tQ29udGVudC5pbmNsdWRlcygnPGFydGlmYWN0SWQ+cnVudGltZTwvYXJ0aWZhY3RJZD4nKSAmJiBwb21Db250ZW50LmluY2x1ZGVzKCc8L2RlcGVuZGVuY2llcz4nKSkge1xuICAgICAgICAgICAgICAgIHBvbUNvbnRlbnQgPSBwb21Db250ZW50LnJlcGxhY2UoJzwvZGVwZW5kZW5jaWVzPicsIGAke0dSQUFMVk1fUE9NX1JVTlRJTUVfREVQfSAgICA8L2RlcGVuZGVuY2llcz5gKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmcy53cml0ZUZpbGVTeW5jKHByb2plY3RQb21QYXRoLCBwb21Db250ZW50LCAndXRmOCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gSWdub3JlIGFuZCBmYWxsIGJhY2sgdG8gc3RhbmRhcmQgSmF2YSBEb2NrZXJmaWxlXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghZG9ja2VyZmlsZUNvbnRlbnQpIHtcbiAgICAgICAgICBkb2NrZXJmaWxlQ29udGVudCA9IGBGUk9NIGRvY2tlci5pby9mbnByb2plY3QvZm4tamF2YS1mZGstYnVpbGQ6amRrMTctMS4xLjcgYXMgYnVpbGQtc3RhZ2VcbldPUktESVIgL2Z1bmN0aW9uXG5FTlYgTUFWRU5fT1BUUyAtRGh0dHAucHJveHlIb3N0PSAtRGh0dHAucHJveHlQb3J0PSAtRGh0dHBzLnByb3h5SG9zdD0gLURodHRwcy5wcm94eVBvcnQ9IC1EaHR0cC5ub25Qcm94eUhvc3RzPSAtRG1hdmVuLnJlcG8ubG9jYWw9L3Vzci9zaGFyZS9tYXZlbi9yZWYvcmVwb3NpdG9yeVxuQUREIHBvbS54bWwgL2Z1bmN0aW9uL3BvbS54bWxcblJVTiBbXCJtdm5cIiwgXCJwYWNrYWdlXCIsIFwiZGVwZW5kZW5jeTpjb3B5LWRlcGVuZGVuY2llc1wiLCBcIi1EaW5jbHVkZVNjb3BlPXJ1bnRpbWVcIiwgXCItRHNraXBUZXN0cz10cnVlXCIsIFwiLURtZGVwLnByZXBlbmRHcm91cElkPXRydWVcIiwgXCItRG91dHB1dERpcmVjdG9yeT10YXJnZXRcIiwgXCItLWZhaWwtbmV2ZXJcIl1cbkFERCBzcmMgL2Z1bmN0aW9uL3NyY1xuUlVOIFtcIm12blwiLCBcInBhY2thZ2VcIl1cbkZST00gZG9ja2VyLmlvL2ZucHJvamVjdC9mbi1qYXZhLWZkazpqcmUxNy0xLjEuN1xuV09SS0RJUiAvZnVuY3Rpb25cbkNPUFkgLS1mcm9tPWJ1aWxkLXN0YWdlIC9mdW5jdGlvbi90YXJnZXQvKi5qYXIgL2Z1bmN0aW9uL2FwcC9cbkNNRCBbXCIke2hhbmRsZXIucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiXWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGRvY2tlcmlnbm9yZUNvbnRlbnQgPSBgbm9kZV9tb2R1bGVzXG4uZ2l0XG4qLm1kXG4uZW52XG4uaWRlYVxuLnZzY29kZVxuKi5sb2dcbm9jaV9hcGlnYXRld2F5X2RlcGxveW1lbnQuanNvblxuLm9jZGstb3V0cHV0cy5qc29uXG50YWlsLWZ1bmN0aW9uLWxvZ3MuanNcbmA7XG4gICAgICBjb25zdCBkb2NrZXJmaWxlQjY0ID0gQnVmZmVyLmZyb20oZG9ja2VyZmlsZUNvbnRlbnQsICd1dGY4JykudG9TdHJpbmcoJ2Jhc2U2NCcpO1xuICAgICAgY29uc3QgZG9ja2VyaWdub3JlQjY0ID0gQnVmZmVyLmZyb20oZG9ja2VyaWdub3JlQ29udGVudCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0Jyk7XG4gICAgICAvLyBHZW5lcmF0ZSBEb2NrZXJmaWxlIGFuZCAuZG9ja2VyaWdub3JlIGluIGxvY2FsLWV4ZWMgb25seSBpZiBtaXNzaW5nOyBpZiB0aGV5IGV4aXN0IHVzZSBhcy1pcy4gVGhlbiBsb2dpbiwgYnVpbGQsIHB1c2guXG4gICAgICB0aGlzLmFkZE92ZXJyaWRlKGByZXNvdXJjZS5udWxsX3Jlc291cmNlLiR7YnVpbGRBbmRQdXNoSW1hZ2VJZH0ucHJvdmlzaW9uZXJgLCBbXG4gICAgICAgIHtcbiAgICAgICAgICAnbG9jYWwtZXhlYyc6IHtcbiAgICAgICAgICAgIGNvbW1hbmQ6ICdjZCBcIiRGVU5DVElPTl9DT0RFX1BBVEhcIiAmJiAoWyAtZiBEb2NrZXJmaWxlIF0gfHwgKGVjaG8gXCIkRE9DS0VSRklMRV9CNjRcIiB8IGJhc2U2NCAtZCA+IERvY2tlcmZpbGUpKSAmJiAoWyAtZiAuZG9ja2VyaWdub3JlIF0gfHwgKGVjaG8gXCIkRE9DS0VSSUdOT1JFX0I2NFwiIHwgYmFzZTY0IC1kID4gLmRvY2tlcmlnbm9yZSkpJyxcbiAgICAgICAgICAgIGVudmlyb25tZW50OiB7XG4gICAgICAgICAgICAgIEZVTkNUSU9OX0NPREVfUEFUSDogZnVuY3Rpb25Db2RlUGF0aCxcbiAgICAgICAgICAgICAgRE9DS0VSRklMRV9CNjQ6IGRvY2tlcmZpbGVCNjQsXG4gICAgICAgICAgICAgIERPQ0tFUklHTk9SRV9CNjQ6IGRvY2tlcmlnbm9yZUI2NCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgeyAnbG9jYWwtZXhlYyc6IHsgY29tbWFuZDogbG9naW5TY3JpcHQsIG9uX2ZhaWx1cmU6ICdjb250aW51ZScgfSB9LFxuICAgICAgICB7ICdsb2NhbC1leGVjJzogeyBjb21tYW5kOiBgY2QgXCIke2Z1bmN0aW9uQ29kZVBhdGgucmVwbGFjZSgvXCIvZywgJ1xcXFxcIicpfVwiICYmIGRvY2tlciBidWlsZCAtLXBsYXRmb3JtIGxpbnV4L2FtZDY0IC10ICR7aW1hZ2VVcmx9IC5gIH0gfSxcbiAgICAgICAgeyAnbG9jYWwtZXhlYyc6IHsgY29tbWFuZDogYGRvY2tlciBwdXNoICR7aW1hZ2VVcmx9YCB9IH0sXG4gICAgICBdKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHB1YmxpY1N1Ym5ldDogQ29yZVN1Ym5ldCB8IHVuZGVmaW5lZDtcbiAgICAgIGxldCBwcml2YXRlU3VibmV0OiBDb3JlU3VibmV0IHwgdW5kZWZpbmVkO1xuICAgICAgLy8gRnVuY3Rpb24tb25seTogY3JlYXRlIFZDTiBvbmx5IHdoZW4gd2UgbmVlZCB0byBjcmVhdGUgdGhlIHByaXZhdGUgc3VibmV0LiBGdWxsLXN0YWNrOiBjcmVhdGUgd2hlbiB3ZSBuZWVkIGVpdGhlciBzdWJuZXQuXG4gICAgICBjb25zdCBjcmVhdGVOZXR3b3JraW5nID1cbiAgICAgICAgc3RhY2tBY3Rpb24gPT09ICdmdW5jdGlvbi1vbmx5J1xuICAgICAgICAgID8gIXByaXZhdGVTdWJuZXRJZEZyb21FbnZcbiAgICAgICAgICA6ICFwcml2YXRlU3VibmV0SWRGcm9tRW52IHx8ICFwdWJsaWNTdWJuZXRJZEZyb21FbnY7XG4gICAgICBpZiAoY3JlYXRlTmV0d29ya2luZykge1xuICAgICAgICBjb25zdCB2Y24gPSBuZXcgQ29yZVZjbih0aGlzLCAnVmNuJywge1xuICAgICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LXZjbmAsXG4gICAgICAgICAgY2lkckJsb2NrczogWycxMC4wLjAuMC8xNiddLFxuICAgICAgICAgIGRuc0xhYmVsOiAnYXBwZm4nLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHN0YWNrQWN0aW9uID09PSAnZnVsbC1zdGFjaycgJiYgIXB1YmxpY1N1Ym5ldElkRnJvbUVudikge1xuICAgICAgICAgIHB1YmxpY1N1Ym5ldCA9IG5ldyBDb3JlU3VibmV0KHRoaXMsICdQdWJsaWNTdWJuZXQnLCB7XG4gICAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1wdWJsaWNgLFxuICAgICAgICAgICAgY2lkckJsb2NrOiAnMTAuMC4xLjAvMjQnLFxuICAgICAgICAgICAgZG5zTGFiZWw6ICdwdWJsaWMnLFxuICAgICAgICAgICAgcHJvaGliaXRQdWJsaWNJcE9uVm5pYzogZmFsc2UsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgY29uc3QgcHVibGljU2wgPSBuZXcgQ29yZVNlY3VyaXR5TGlzdCh0aGlzLCAnUHVibGljU2VjdXJpdHlMaXN0Jywge1xuICAgICAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tcHVibGljLXNsYCxcbiAgICAgICAgICAgIGluZ3Jlc3NTZWN1cml0eVJ1bGVzOiBbXG4gICAgICAgICAgICAgIHsgcHJvdG9jb2w6ICc2Jywgc291cmNlOiAnMC4wLjAuMC8wJywgZGVzY3JpcHRpb246ICdIVFRQJywgdGNwT3B0aW9uczogeyBtaW46IDgwLCBtYXg6IDgwIH0gfSxcbiAgICAgICAgICAgICAgeyBwcm90b2NvbDogJzYnLCBzb3VyY2U6ICcwLjAuMC4wLzAnLCBkZXNjcmlwdGlvbjogJ0hUVFBTJywgdGNwT3B0aW9uczogeyBtaW46IDQ0MywgbWF4OiA0NDMgfSB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIGVncmVzc1NlY3VyaXR5UnVsZXM6IFt7IHByb3RvY29sOiAnYWxsJywgZGVzdGluYXRpb246ICcwLjAuMC4wLzAnLCBkZXNjcmlwdGlvbjogJ0FsbCcgfV0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcHVibGljU3VibmV0LmFkZE92ZXJyaWRlKCdzZWN1cml0eV9saXN0X2lkcycsIFtwdWJsaWNTbC5pZF0pO1xuICAgICAgICAgIGNvbnN0IGlndyA9IG5ldyBDb3JlSW50ZXJuZXRHYXRld2F5KHRoaXMsICdJbnRlcm5ldEdhdGV3YXknLCB7XG4gICAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1pZ3dgLFxuICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwdWJSdCA9IG5ldyBDb3JlUm91dGVUYWJsZSh0aGlzLCAnUHVibGljUm91dGVUYWJsZScsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICAgICAgdmNuSWQ6IHZjbi5pZCxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LXB1YmxpYy1ydGAsXG4gICAgICAgICAgICByb3V0ZVJ1bGVzOiBbXG4gICAgICAgICAgICAgIHsgbmV0d29ya0VudGl0eUlkOiBpZ3cuaWQsIGRlc3RpbmF0aW9uOiAnMC4wLjAuMC8wJywgZGVzdGluYXRpb25UeXBlOiAnQ0lEUl9CTE9DSycsIGRlc2NyaXB0aW9uOiAnSW50ZXJuZXQnIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHB1YmxpY1N1Ym5ldC5hZGRPdmVycmlkZSgncm91dGVfdGFibGVfaWQnLCBwdWJSdC5pZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFwcml2YXRlU3VibmV0SWRGcm9tRW52KSB7XG4gICAgICAgICAgcHJpdmF0ZVN1Ym5ldCA9IG5ldyBDb3JlU3VibmV0KHRoaXMsICdQcml2YXRlU3VibmV0Jywge1xuICAgICAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgICAgICB2Y25JZDogdmNuLmlkLFxuICAgICAgICAgICAgZGlzcGxheU5hbWU6IGAke3Jlc291cmNlTmFtZX0tcHJpdmF0ZWAsXG4gICAgICAgICAgICBjaWRyQmxvY2s6ICcxMC4wLjIuMC8yNCcsXG4gICAgICAgICAgICBkbnNMYWJlbDogJ3ByaXZhdGUnLFxuICAgICAgICAgICAgcHJvaGliaXRQdWJsaWNJcE9uVm5pYzogdHJ1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjb25zdCBwcml2YXRlU2wgPSBuZXcgQ29yZVNlY3VyaXR5TGlzdCh0aGlzLCAnUHJpdmF0ZVNlY3VyaXR5TGlzdCcsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICAgICAgdmNuSWQ6IHZjbi5pZCxcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBgJHtyZXNvdXJjZU5hbWV9LXByaXZhdGUtc2xgLFxuICAgICAgICAgICAgaW5ncmVzc1NlY3VyaXR5UnVsZXM6IFtcbiAgICAgICAgICAgICAgeyBwcm90b2NvbDogJzYnLCBzb3VyY2U6ICcxMC4wLjIuMC8yNCcsIGRlc2NyaXB0aW9uOiAnUEcnLCB0Y3BPcHRpb25zOiB7IG1pbjogNTQzMiwgbWF4OiA1NDMyIH0gfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBlZ3Jlc3NTZWN1cml0eVJ1bGVzOiBbeyBwcm90b2NvbDogJ2FsbCcsIGRlc3RpbmF0aW9uOiAnMC4wLjAuMC8wJywgZGVzY3JpcHRpb246ICdBbGwnIH1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHByaXZhdGVTdWJuZXQuYWRkT3ZlcnJpZGUoJ3NlY3VyaXR5X2xpc3RfaWRzJywgW3ByaXZhdGVTbC5pZF0pO1xuICAgICAgICAgIGNvbnN0IGFsbFNlcnZpY2VzID0gbmV3IERhdGFPY2lDb3JlU2VydmljZXModGhpcywgJ0FsbFNlcnZpY2VzJywge30pO1xuICAgICAgICAgIGNvbnN0IHN2Y0d3ID0gbmV3IENvcmVTZXJ2aWNlR2F0ZXdheSh0aGlzLCAnU2VydmljZUdhdGV3YXknLCB7XG4gICAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1zZ3dgLFxuICAgICAgICAgICAgc2VydmljZXM6IFt7IHNlcnZpY2VJZDogYWxsU2VydmljZXMuc2VydmljZXMuZ2V0KDApLmlkIH1dLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHByaXZSdCA9IG5ldyBDb3JlUm91dGVUYWJsZSh0aGlzLCAnUHJpdmF0ZVJvdXRlVGFibGUnLCB7XG4gICAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgICAgIHZjbklkOiB2Y24uaWQsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1wcml2YXRlLXJ0YCxcbiAgICAgICAgICAgIHJvdXRlUnVsZXM6IFtcbiAgICAgICAgICAgICAgeyBuZXR3b3JrRW50aXR5SWQ6IHN2Y0d3LmlkLCBkZXN0aW5hdGlvbjogYWxsU2VydmljZXMuc2VydmljZXMuZ2V0KDApLmNpZHJCbG9jaywgZGVzdGluYXRpb25UeXBlOiAnU0VSVklDRV9DSURSX0JMT0NLJywgZGVzY3JpcHRpb246ICdPQ0lSJyB9LFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBwcml2YXRlU3VibmV0LmFkZE92ZXJyaWRlKCdyb3V0ZV90YWJsZV9pZCcsIHByaXZSdC5pZCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgZnVuY3Rpb25BcHBTdWJuZXRJZCA9IHByaXZhdGVTdWJuZXRJZEZyb21FbnYgfHwgKHByaXZhdGVTdWJuZXQ/LmlkID8/ICcnKTtcbiAgICAgIGNvbnN0IHB1YmxpY1N1Ym5ldElkRm9yQXBpR3cgPSBwdWJsaWNTdWJuZXRJZEZyb21FbnYgfHwgKHB1YmxpY1N1Ym5ldD8uaWQgPz8gJycpO1xuXG4gICAgICBsZXQgYXBpR2F0ZXdheTogQXBpZ2F0ZXdheUdhdGV3YXkgfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoc3RhY2tBY3Rpb24gPT09ICdmdWxsLXN0YWNrJyAmJiBwdWJsaWNTdWJuZXRJZEZvckFwaUd3KSB7XG4gICAgICAgIGFwaUdhdGV3YXkgPSBuZXcgQXBpZ2F0ZXdheUdhdGV3YXkodGhpcywgJ0FwaUdhdGV3YXknLCB7XG4gICAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgICAgc3VibmV0SWQ6IHB1YmxpY1N1Ym5ldElkRm9yQXBpR3csXG4gICAgICAgICAgZW5kcG9pbnRUeXBlOiAnUFVCTElDJyxcbiAgICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1hcGktZ2F0ZXdheWAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvLyBPcHRpb25hbCBJQU06IGFsbG93IEFQSSBHYXRld2F5IHRvIGludm9rZSBGdW5jdGlvbnMgaW4gdGhpcyBjb21wYXJ0bWVudC5cbiAgICAgIC8vIE9DSSBkb2NzOiBBTExPVyBhbnktdXNlciB0byB1c2UgZnVuY3Rpb25zLWZhbWlseSBpbiBjb21wYXJ0bWVudCA8ZnVuY3Rpb25zLWNvbXBhcnRtZW50PlxuICAgICAgLy8gICB3aGVyZSBBTEwge3JlcXVlc3QucHJpbmNpcGFsLnR5cGU9J0FwaUdhdGV3YXknLCByZXF1ZXN0LnJlc291cmNlLmNvbXBhcnRtZW50LmlkPSc8YXBpZ3ctY29tcGFydG1lbnQtb2NpZD4nfVxuICAgICAgY29uc3QgY3JlYXRlQXBpZ3dQb2xpY3kgPSAhIWNvbmZpZy5jcmVhdGVBcGlnd1BvbGljeSB8fCAocHJvY2Vzcy5lbnYuT0NJX0NSRUFURV9BUElHV19QT0xJQ1kgfHwgJycpLnRyaW0oKSA9PT0gJzEnO1xuICAgICAgaWYgKGNyZWF0ZUFwaWd3UG9saWN5ICYmIHN0YWNrQWN0aW9uID09PSAnZnVsbC1zdGFjaycpIHtcbiAgICAgICAgY29uc3QgYXBpZ3dQb2xpY3lOYW1lID0gYCR7cmVzb3VyY2VOYW1lfS1hcGlndy1mdW5jdGlvbnMtYWNjZXNzYDtcbiAgICAgICAgbmV3IElkZW50aXR5UG9saWN5KHRoaXMsICdBcGlHYXRld2F5RnVuY3Rpb25zUG9saWN5Jywge1xuICAgICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy50ZW5hbmN5SWQsXG4gICAgICAgICAgbmFtZTogYXBpZ3dQb2xpY3lOYW1lLFxuICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQWxsb3cgQVBJIEdhdGV3YXlzIGluICR7Y29uZmlnLmNvbXBhcnRtZW50SWR9IHRvIGludm9rZSBGdW5jdGlvbnMgaW4gJHtjb25maWcuY29tcGFydG1lbnRJZH1gLFxuICAgICAgICAgIHN0YXRlbWVudHM6IFtcbiAgICAgICAgICAgIGBBTExPVyBhbnktdXNlciB0byB1c2UgZnVuY3Rpb25zLWZhbWlseSBpbiBjb21wYXJ0bWVudCBpZCAke2NvbmZpZy5jb21wYXJ0bWVudElkfSB3aGVyZSBBTEwge3JlcXVlc3QucHJpbmNpcGFsLnR5cGU9ICdBcGlHYXRld2F5JywgcmVxdWVzdC5yZXNvdXJjZS5jb21wYXJ0bWVudC5pZCA9ICcke2NvbmZpZy5jb21wYXJ0bWVudElkfSd9YCxcbiAgICAgICAgICBdLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGxvZ0dyb3VwID0gbmV3IExvZ2dpbmdMb2dHcm91cCh0aGlzLCAnTG9nR3JvdXAnLCB7XG4gICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICBkaXNwbGF5TmFtZTogYXBwTmFtZSxcbiAgICAgICAgZGVzY3JpcHRpb246IGBMb2cgZ3JvdXAgZm9yICR7YXBwTmFtZX1gLFxuICAgICAgfSk7XG4gICAgICBjb25zdCBmdW5jdGlvbkFwcCA9IG5ldyBGdW5jdGlvbnNBcHBsaWNhdGlvbih0aGlzLCAnRnVuY3Rpb25BcHAnLCB7XG4gICAgICAgIGNvbXBhcnRtZW50SWQ6IGNvbmZpZy5jb21wYXJ0bWVudElkLFxuICAgICAgICBkaXNwbGF5TmFtZTogYXBwTmFtZSxcbiAgICAgICAgc3VibmV0SWRzOiBbZnVuY3Rpb25BcHBTdWJuZXRJZF0sXG4gICAgICB9KTtcbiAgICAgIGxldCBvY2lGdW5jdGlvbjogRnVuY3Rpb25zRnVuY3Rpb24gfCB1bmRlZmluZWQ7XG4gICAgICBpZiAoIWNvZGVPbmx5KSB7XG4gICAgICAgIG9jaUZ1bmN0aW9uID0gbmV3IEZ1bmN0aW9uc0Z1bmN0aW9uKHRoaXMsICdGdW5jdGlvbicsIHtcbiAgICAgICAgICBhcHBsaWNhdGlvbklkOiBmdW5jdGlvbkFwcC5pZCxcbiAgICAgICAgICBkaXNwbGF5TmFtZTogY29uZmlnLmZ1bmN0aW9uTmFtZSEsXG4gICAgICAgICAgaW1hZ2U6IGltYWdlVXJsISxcbiAgICAgICAgICBtZW1vcnlJbk1iczogY29uZmlnLmZ1bmN0aW9uTWVtb3J5TWIgPz8gJzI1NicsXG4gICAgICAgICAgdGltZW91dEluU2Vjb25kczogY29uZmlnLmZ1bmN0aW9uVGltZW91dFNlY29uZHMgPz8gMzAsXG4gICAgICAgICAgLi4uKGNvbmZpZy5mdW5jdGlvbkNvbmZpZyAmJiBPYmplY3Qua2V5cyhjb25maWcuZnVuY3Rpb25Db25maWcpLmxlbmd0aCA+IDAgPyB7IGNvbmZpZzogY29uZmlnLmZ1bmN0aW9uQ29uZmlnIH0gOiB7fSksXG4gICAgICAgIH0pO1xuICAgICAgICBvY2lGdW5jdGlvbi5hZGRPdmVycmlkZSgnZGVwZW5kc19vbicsIFtgbnVsbF9yZXNvdXJjZS4ke2J1aWxkQW5kUHVzaEltYWdlSWQhfWBdKTtcbiAgICAgIH1cbiAgICAgIGxldCBmdW5jdGlvbklkRm9yR2F0ZXdheTogc3RyaW5nIHwgdW5kZWZpbmVkID0gb2NpRnVuY3Rpb24/LmlkO1xuICAgICAgaWYgKHN0YWNrQWN0aW9uID09PSAnZnVsbC1zdGFjaycgJiYgYXBpR2F0ZXdheSAmJiBjb2RlT25seSkge1xuICAgICAgICBjb25zdCBjb2RlT25seUZ1bmN0aW9uID0gbmV3IERhdGFPY2lGdW5jdGlvbnNGdW5jdGlvbnModGhpcywgJ0NvZGVPbmx5RnVuY3Rpb24nLCB7XG4gICAgICAgICAgYXBwbGljYXRpb25JZDogZnVuY3Rpb25BcHAuaWQsXG4gICAgICAgICAgZGlzcGxheU5hbWU6IGNvbmZpZy5mdW5jdGlvbk5hbWUhLFxuICAgICAgICB9KTtcbiAgICAgICAgZnVuY3Rpb25JZEZvckdhdGV3YXkgPSBjb2RlT25seUZ1bmN0aW9uLmZ1bmN0aW9ucy5nZXQoMCkuaWQ7XG4gICAgICB9XG4gICAgICBpZiAoc3RhY2tBY3Rpb24gPT09ICdmdWxsLXN0YWNrJyAmJiBhcGlHYXRld2F5ICYmIGZ1bmN0aW9uSWRGb3JHYXRld2F5KSB7XG4gICAgICAgIGNvbnN0IHBhdGhQcmVmaXggPSBjb25maWcuYXBpR3dQYXRoUHJlZml4ID8/ICcvJztcbiAgICAgICAgbGV0IHJvdXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmc7IG1ldGhvZHM6IHN0cmluZ1tdOyBiYWNrZW5kOiB7IHR5cGU6IHN0cmluZzsgZnVuY3Rpb25JZDogc3RyaW5nOyByZWFkVGltZW91dEluU2Vjb25kcz86IG51bWJlciB9IH0+O1xuICAgICAgICBpZiAoY29uZmlnLmFwaUd3RGVwbG95bWVudEpzb25QYXRoICYmIGZzLmV4aXN0c1N5bmMoY29uZmlnLmFwaUd3RGVwbG95bWVudEpzb25QYXRoKSkge1xuICAgICAgICAgIGNvbnN0IHJhdyA9IGZzLnJlYWRGaWxlU3luYyhjb25maWcuYXBpR3dEZXBsb3ltZW50SnNvblBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3Qgc3BlYyA9IEpTT04ucGFyc2UocmF3KSBhcyB7IHJvdXRlcz86IEFycmF5PHsgcGF0aD86IHN0cmluZzsgbWV0aG9kcz86IHN0cmluZ1tdOyBiYWNrZW5kPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfT4gfTtcbiAgICAgICAgICBjb25zdCByb3V0ZUxpc3QgPSBzcGVjPy5yb3V0ZXMgPz8gW107XG4gICAgICAgICAgcm91dGVzID0gcm91dGVMaXN0Lm1hcCgocikgPT4ge1xuICAgICAgICAgICAgY29uc3QgYiA9IHIuYmFja2VuZCA/PyB7fTtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uSWRSYXcgPSAoYi5mdW5jdGlvbklkID8/IGIuZnVuY3Rpb25faWQpIGFzIHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uSWQgPSB0eXBlb2YgZnVuY3Rpb25JZFJhdyA9PT0gJ3N0cmluZycgJiYgZnVuY3Rpb25JZFJhdy5pbmNsdWRlcygnJHtmdW5jdGlvbl9pZH0nKVxuICAgICAgICAgICAgICA/IGZ1bmN0aW9uSWRGb3JHYXRld2F5XG4gICAgICAgICAgICAgIDogKGZ1bmN0aW9uSWRSYXcgPz8gZnVuY3Rpb25JZEZvckdhdGV3YXkpO1xuICAgICAgICAgICAgY29uc3QgcmVhZFRpbWVvdXQgPSAoYi5yZWFkVGltZW91dEluU2Vjb25kcyA/PyBiLnJlYWRfdGltZW91dF9pbl9zZWNvbmRzKSBhcyBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBwYXRoOiByLnBhdGggPz8gJy97cGF0aCp9JyxcbiAgICAgICAgICAgICAgbWV0aG9kczogQXJyYXkuaXNBcnJheShyLm1ldGhvZHMpID8gci5tZXRob2RzIDogWydHRVQnLCAnUE9TVCcsICdPUFRJT05TJ10sXG4gICAgICAgICAgICAgIGJhY2tlbmQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAoYi50eXBlIGFzIHN0cmluZykgPz8gJ09SQUNMRV9GVU5DVElPTlNfQkFDS0VORCcsXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25JZCxcbiAgICAgICAgICAgICAgICAuLi4ocmVhZFRpbWVvdXQgIT0gbnVsbCA/IHsgcmVhZFRpbWVvdXRJblNlY29uZHM6IHJlYWRUaW1lb3V0IH0gOiB7fSksXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHJvdXRlUGF0aCA9IGNvbmZpZy5hcGlHd1JvdXRlUGF0aCA/PyAnL3twYXRoKn0nO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZHMgPSBjb25maWcuYXBpR3dNZXRob2RzPy5sZW5ndGggPyBjb25maWcuYXBpR3dNZXRob2RzIDogWydHRVQnLCAnUE9TVCcsICdPUFRJT05TJ107XG4gICAgICAgICAgcm91dGVzID0gW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBwYXRoOiByb3V0ZVBhdGgsXG4gICAgICAgICAgICAgIG1ldGhvZHMsXG4gICAgICAgICAgICAgIGJhY2tlbmQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnT1JBQ0xFX0ZVTkNUSU9OU19CQUNLRU5EJyxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbklkOiBmdW5jdGlvbklkRm9yR2F0ZXdheSxcbiAgICAgICAgICAgICAgICByZWFkVGltZW91dEluU2Vjb25kczogY29uZmlnLmZ1bmN0aW9uVGltZW91dFNlY29uZHMgPz8gMzAsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYXBpRGVwbG95bWVudCA9IG5ldyBBcGlnYXRld2F5RGVwbG95bWVudCh0aGlzLCAnQXBpRGVwbG95bWVudCcsIHtcbiAgICAgICAgICBjb21wYXJ0bWVudElkOiBjb25maWcuY29tcGFydG1lbnRJZCxcbiAgICAgICAgICBnYXRld2F5SWQ6IGFwaUdhdGV3YXkuaWQsXG4gICAgICAgICAgcGF0aFByZWZpeCxcbiAgICAgICAgICBkaXNwbGF5TmFtZTogYCR7cmVzb3VyY2VOYW1lfS1kZXBsb3ltZW50YCxcbiAgICAgICAgICBzcGVjaWZpY2F0aW9uOiB7XG4gICAgICAgICAgICByb3V0ZXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmIChvY2lGdW5jdGlvbikgYXBpRGVwbG95bWVudC5ub2RlLmFkZERlcGVuZGVuY3kob2NpRnVuY3Rpb24pO1xuICAgICAgfVxuXG4gICAgICAvLyBGdW5jdGlvbnMgZXhlY3V0aW9uIGxvZzogU0VSVklDRSBsb2cgZm9yIHRoZSBGdW5jdGlvbnMgYXBwbGljYXRpb24gKGNhdGVnb3J5IGludm9rZSlcbiAgICAgIGNvbnN0IGV4ZWN1dGlvbkxvZyA9IG5ldyBMb2dnaW5nTG9nKHRoaXMsICdFeGVjdXRpb25Mb2cnLCB7XG4gICAgICAgIGRpc3BsYXlOYW1lOiBgJHthcHBOYW1lfS1pbnZva2VgLFxuICAgICAgICBsb2dHcm91cElkOiBsb2dHcm91cC5pZCxcbiAgICAgICAgbG9nVHlwZTogJ1NFUlZJQ0UnLFxuICAgICAgICBjb25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgY29tcGFydG1lbnRJZDogY29uZmlnLmNvbXBhcnRtZW50SWQsXG4gICAgICAgICAgc291cmNlOiB7XG4gICAgICAgICAgICBjYXRlZ29yeTogJ2ludm9rZScsXG4gICAgICAgICAgICAvLyBBc3NvY2lhdGUgdGhpcyBzZXJ2aWNlIGxvZyB3aXRoIHRoZSBGdW5jdGlvbnMgYXBwbGljYXRpb25cbiAgICAgICAgICAgIHJlc291cmNlOiBmdW5jdGlvbkFwcC5pZCxcbiAgICAgICAgICAgIHNlcnZpY2U6ICdmdW5jdGlvbnMnLFxuICAgICAgICAgICAgc291cmNlVHlwZTogJ09DSVNFUlZJQ0UnLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICAgIGV4ZWN1dGlvbkxvZy5ub2RlLmFkZERlcGVuZGVuY3koZnVuY3Rpb25BcHApO1xuXG4gICAgICAvLyB0YWlsLWZ1bmN0aW9uLWxvZ3MuanMgaXMgd3JpdHRlbiBieTogbnB4IG9jZGsgd3JpdGUtbG9nLWNvbmZpZyAocnVuIGFmdGVyIGRlcGxveSkuXG5cbiAgICAgIGlmIChvY2lyUmVwb3NpdG9yeSkge1xuICAgICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdvY2lyX3JlcG9zaXRvcnlfbmFtZScsIHsgdmFsdWU6IG9jaXJSZXBvc2l0b3J5LmRpc3BsYXlOYW1lLCBkZXNjcmlwdGlvbjogJ09DSVIgcmVwb3NpdG9yeSBuYW1lJyB9KTtcbiAgICAgIH1cbiAgICAgIGlmIChhcGlHYXRld2F5KSB7XG4gICAgICAgIG5ldyBUZXJyYWZvcm1PdXRwdXQodGhpcywgJ2FwaV9nYXRld2F5X2hvc3QnLCB7IHZhbHVlOiBhcGlHYXRld2F5Lmhvc3RuYW1lLCBkZXNjcmlwdGlvbjogJ0FQSSBHYXRld2F5IGhvc3RuYW1lJyB9KTtcbiAgICAgICAgbmV3IFRlcnJhZm9ybU91dHB1dCh0aGlzLCAnZnVuY3Rpb25faW52b2tlX3VybCcsIHsgdmFsdWU6IGBodHRwczovLyR7YXBpR2F0ZXdheS5ob3N0bmFtZX1gLCBkZXNjcmlwdGlvbjogJ0Jhc2UgVVJMIHRvIGludm9rZSB0aGUgZnVuY3Rpb24nIH0pO1xuICAgICAgfVxuICAgICAgbmV3IFRlcnJhZm9ybU91dHB1dCh0aGlzLCAnZnVuY3Rpb25fYXBwX2lkJywgeyB2YWx1ZTogZnVuY3Rpb25BcHAuaWQsIGRlc2NyaXB0aW9uOiAnT0NJIEZ1bmN0aW9ucyBBcHBsaWNhdGlvbiBPQ0lEJyB9KTtcbiAgICAgIGlmIChvY2lGdW5jdGlvbikge1xuICAgICAgICBuZXcgVGVycmFmb3JtT3V0cHV0KHRoaXMsICdmdW5jdGlvbl9pZCcsIHsgdmFsdWU6IG9jaUZ1bmN0aW9uLmlkLCBkZXNjcmlwdGlvbjogJ09DSSBGdW5jdGlvbiBPQ0lEJyB9KTtcbiAgICAgIH1cbiAgICAgIG5ldyBUZXJyYWZvcm1PdXRwdXQodGhpcywgJ2xvZ19ncm91cF9pZCcsIHsgdmFsdWU6IGxvZ0dyb3VwLmlkLCBkZXNjcmlwdGlvbjogJ09DSSBMb2cgR3JvdXAgT0NJRCBmb3IgdGhlIGFwcGxpY2F0aW9uJyB9KTtcbiAgICAgIG5ldyBUZXJyYWZvcm1PdXRwdXQodGhpcywgJ2V4ZWN1dGlvbl9sb2dfaWQnLCB7IHZhbHVlOiBleGVjdXRpb25Mb2cuaWQsIGRlc2NyaXB0aW9uOiAnT0NJIEZ1bmN0aW9ucyBleGVjdXRpb24gbG9nIE9DSUQnIH0pO1xuICAgIH1cblxuICAgIC8vIEZvcmNlIG9yYWNsZS9vY2kgKFRlcnJhZm9ybSBSZWdpc3RyeSkgc28gdGVycmFmb3JtIGluaXQgdXNlcyBpdCBvbiBPTDggYW5kIGVsc2V3aGVyZTsgbXVzdCBydW4gYWZ0ZXIgcHJvdmlkZXIgaXMgYWRkZWRcbiAgICB0aGlzLmFkZE92ZXJyaWRlKCd0ZXJyYWZvcm0ucmVxdWlyZWRfcHJvdmlkZXJzLm9jaScsIHtcbiAgICAgIHNvdXJjZTogJ29yYWNsZS9vY2knLFxuICAgICAgLy8gUGluIHRvIDwgNS40Ny4wOiA1LjQ3LjAgY3Jhc2hlcyBvbiBkYXJ3aW5fYXJtNjQ7IDUuNDYueCBhbmQgTGludXggKE9MOCkgd29ya1xuICAgICAgdmVyc2lvbjogJz49IDUuMC4wLCA8IDUuNDcuMCcsXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
package/lib/oci-stack.ts CHANGED
@@ -13,6 +13,7 @@ import { ApigatewayGateway } from '../.gen/providers/oci/apigateway-gateway';
13
13
  import { ApigatewayDeployment } from '../.gen/providers/oci/apigateway-deployment';
14
14
  import { FunctionsApplication } from '../.gen/providers/oci/functions-application';
15
15
  import { FunctionsFunction } from '../.gen/providers/oci/functions-function';
16
+ import { DataOciFunctionsFunctions } from '../.gen/providers/oci/data-oci-functions-functions';
16
17
  import { LoggingLogGroup } from '../.gen/providers/oci/logging-log-group';
17
18
  import { LoggingLog } from '../.gen/providers/oci/logging-log';
18
19
  import { IdentityPolicy } from '../.gen/providers/oci/identity-policy';
@@ -170,8 +171,9 @@ export class OciStack extends TerraformStack {
170
171
  // OCI_STACK_ACTION: "function-only" (or legacy "function") => no API Gateway; "full-stack" or unset => full stack including API Gateway.
171
172
  const stackActionRaw = (process.env.OCI_STACK_ACTION || '').trim().toLowerCase();
172
173
  const codeOnly = process.env.OCI_CODE_ONLY === '1' || process.env['code-only'] === '1';
173
- // The preview archive function is created by OCI CLI, so its OCID is not available to CDKTF for API Gateway wiring.
174
- const stackAction = codeOnly || stackActionRaw === 'function-only' || stackActionRaw === 'function' ? 'function-only' : 'full-stack';
174
+ // Code-only functions are created by OCI CLI. When the full stack is requested,
175
+ // their OCID is looked up by Terraform before wiring the API Gateway route.
176
+ const stackAction = stackActionRaw === 'function-only' || stackActionRaw === 'function' ? 'function-only' : 'full-stack';
175
177
 
176
178
  // OCIR Container Repository (root compartment allowed if explicitly set).
177
179
  const ocirCompartmentId = config.ocirCompartmentId || config.compartmentId;
@@ -472,9 +474,17 @@ tail-function-logs.js
472
474
  });
473
475
  ociFunction.addOverride('depends_on', [`null_resource.${buildAndPushImageId!}`]);
474
476
  }
475
- if (stackAction === 'full-stack' && apiGateway && ociFunction) {
477
+ let functionIdForGateway: string | undefined = ociFunction?.id;
478
+ if (stackAction === 'full-stack' && apiGateway && codeOnly) {
479
+ const codeOnlyFunction = new DataOciFunctionsFunctions(this, 'CodeOnlyFunction', {
480
+ applicationId: functionApp.id,
481
+ displayName: config.functionName!,
482
+ });
483
+ functionIdForGateway = codeOnlyFunction.functions.get(0).id;
484
+ }
485
+ if (stackAction === 'full-stack' && apiGateway && functionIdForGateway) {
476
486
  const pathPrefix = config.apiGwPathPrefix ?? '/';
477
- let routes: Array<{ path: string; methods: string[]; backend: { type: string; functionId: typeof ociFunction.id; readTimeoutInSeconds?: number } }>;
487
+ let routes: Array<{ path: string; methods: string[]; backend: { type: string; functionId: string; readTimeoutInSeconds?: number } }>;
478
488
  if (config.apiGwDeploymentJsonPath && fs.existsSync(config.apiGwDeploymentJsonPath)) {
479
489
  const raw = fs.readFileSync(config.apiGwDeploymentJsonPath, 'utf8');
480
490
  const spec = JSON.parse(raw) as { routes?: Array<{ path?: string; methods?: string[]; backend?: Record<string, unknown> }> };
@@ -483,8 +493,8 @@ tail-function-logs.js
483
493
  const b = r.backend ?? {};
484
494
  const functionIdRaw = (b.functionId ?? b.function_id) as string | undefined;
485
495
  const functionId = typeof functionIdRaw === 'string' && functionIdRaw.includes('${function_id}')
486
- ? ociFunction.id
487
- : (functionIdRaw ?? ociFunction.id);
496
+ ? functionIdForGateway
497
+ : (functionIdRaw ?? functionIdForGateway);
488
498
  const readTimeout = (b.readTimeoutInSeconds ?? b.read_timeout_in_seconds) as number | undefined;
489
499
  return {
490
500
  path: r.path ?? '/{path*}',
@@ -505,7 +515,7 @@ tail-function-logs.js
505
515
  methods,
506
516
  backend: {
507
517
  type: 'ORACLE_FUNCTIONS_BACKEND',
508
- functionId: ociFunction.id,
518
+ functionId: functionIdForGateway,
509
519
  readTimeoutInSeconds: config.functionTimeoutSeconds ?? 30,
510
520
  },
511
521
  },
@@ -520,7 +530,7 @@ tail-function-logs.js
520
530
  routes,
521
531
  },
522
532
  });
523
- apiDeployment.node.addDependency(ociFunction);
533
+ if (ociFunction) apiDeployment.node.addDependency(ociFunction);
524
534
  }
525
535
 
526
536
  // Functions execution log: SERVICE log for the Functions application (category invoke)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mikarinneoracle/oci-cdk-code-only-preview",
3
- "version": "0.0.13",
3
+ "version": "0.0.15",
4
4
  "description": "OCI CDK stack for OCI Functions, API Gateway, and related infrastructure",
5
5
  "main": "lib/index.js",
6
6
  "bin": {
@@ -64,7 +64,6 @@
64
64
  "typescript": "^5.0.0"
65
65
  },
66
66
  "overrides": {
67
- "uuid": "^9.0.0",
68
67
  "jssha": "^3.3.0",
69
68
  "glob": "^13.0.0"
70
69
  }