@aws-cdk/aws-glue-alpha 2.268.0-alpha.0 → 2.270.0-alpha.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 (46) hide show
  1. package/.jsii +1820 -1612
  2. package/.jsii.tabl.json.gz +0 -0
  3. package/.warnings.jsii.js +1649 -10
  4. package/README.md +105 -35
  5. package/adr/job-arguments.md +212 -0
  6. package/lib/catalog.js +88 -4
  7. package/lib/code.js +59 -4
  8. package/lib/connection.d.ts +44 -29
  9. package/lib/connection.js +147 -31
  10. package/lib/constants.d.ts +17 -0
  11. package/lib/constants.js +20 -2
  12. package/lib/data-format.js +43 -6
  13. package/lib/data-quality-ruleset.js +60 -4
  14. package/lib/database.js +48 -2
  15. package/lib/external-table.js +48 -2
  16. package/lib/jobs/job.d.ts +90 -9
  17. package/lib/jobs/job.js +219 -38
  18. package/lib/jobs/pyspark-etl-job.d.ts +1 -3
  19. package/lib/jobs/pyspark-etl-job.js +28 -14
  20. package/lib/jobs/pyspark-flex-etl-job.d.ts +1 -3
  21. package/lib/jobs/pyspark-flex-etl-job.js +28 -14
  22. package/lib/jobs/pyspark-streaming-job.d.ts +1 -3
  23. package/lib/jobs/pyspark-streaming-job.js +28 -14
  24. package/lib/jobs/python-shell-job.d.ts +20 -7
  25. package/lib/jobs/python-shell-job.js +49 -33
  26. package/lib/jobs/ray-job.js +8 -13
  27. package/lib/jobs/scala-spark-etl-job.d.ts +1 -3
  28. package/lib/jobs/scala-spark-etl-job.js +29 -14
  29. package/lib/jobs/scala-spark-flex-etl-job.d.ts +1 -3
  30. package/lib/jobs/scala-spark-flex-etl-job.js +29 -14
  31. package/lib/jobs/scala-spark-streaming-job.d.ts +1 -3
  32. package/lib/jobs/scala-spark-streaming-job.js +29 -14
  33. package/lib/jobs/spark-job.d.ts +9 -7
  34. package/lib/jobs/spark-job.js +26 -32
  35. package/lib/partition-projection.d.ts +36 -47
  36. package/lib/partition-projection.js +34 -40
  37. package/lib/s3-table.js +106 -5
  38. package/lib/schema.js +50 -3
  39. package/lib/security-configuration.js +60 -5
  40. package/lib/storage-parameter.js +91 -2
  41. package/lib/table-base.js +32 -2
  42. package/lib/triggers/trigger-options.d.ts +102 -42
  43. package/lib/triggers/trigger-options.js +242 -3
  44. package/lib/triggers/workflow.d.ts +31 -47
  45. package/lib/triggers/workflow.js +87 -142
  46. package/package.json +10 -10
package/lib/table-base.js CHANGED
@@ -48,8 +48,17 @@ const partition_index_provider_generated_1 = require("../custom-resource-handler
48
48
  * A Glue table.
49
49
  */
50
50
  class TableBase extends core_1.Resource {
51
- static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.TableBase", version: "2.268.0-alpha.0" };
51
+ static [JSII_RTTI_SYMBOL_1] = { fqn: "@aws-cdk/aws-glue-alpha.TableBase", version: "2.270.0-alpha.0" };
52
52
  static fromTableArn(scope, id, tableArn) {
53
+ try {
54
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase#fromTableArn", "");
55
+ }
56
+ catch (error) {
57
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
58
+ Error.captureStackTrace(error, this.fromTableArn);
59
+ }
60
+ throw error;
61
+ }
53
62
  const tableName = core_1.Fn.select(1, core_1.Fn.split('/', core_1.Stack.of(scope).splitArn(tableArn, core_1.ArnFormat.SLASH_RESOURCE_NAME).resourceName));
54
63
  return TableBase.fromTableAttributes(scope, id, {
55
64
  tableArn,
@@ -65,6 +74,7 @@ class TableBase extends core_1.Resource {
65
74
  */
66
75
  static fromTableAttributes(scope, id, attrs) {
67
76
  try {
77
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase#fromTableAttributes", "");
68
78
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_TableAttributes(attrs);
69
79
  }
70
80
  catch (error) {
@@ -131,6 +141,7 @@ class TableBase extends core_1.Resource {
131
141
  }),
132
142
  });
133
143
  try {
144
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase", "");
134
145
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_TableBaseProps(props);
135
146
  }
136
147
  catch (error) {
@@ -161,6 +172,7 @@ class TableBase extends core_1.Resource {
161
172
  */
162
173
  addPartitionIndex(index) {
163
174
  try {
175
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase#addPartitionIndex", "");
164
176
  jsiiDeprecationWarnings._aws_cdk_aws_glue_alpha_PartitionIndex(index);
165
177
  }
166
178
  catch (error) {
@@ -340,6 +352,15 @@ class TableBase extends core_1.Resource {
340
352
  * @param actions the set of Glue actions to allow (for example `glue:GetTable`)
341
353
  */
342
354
  grant(grantee, actions) {
355
+ try {
356
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase#grant", "");
357
+ }
358
+ catch (error) {
359
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
360
+ Error.captureStackTrace(error, this.grant);
361
+ }
362
+ throw error;
363
+ }
343
364
  return iam.Grant.addToPrincipal({
344
365
  grantee,
345
366
  resourceArns: [this.tableArn],
@@ -363,6 +384,15 @@ class TableBase extends core_1.Resource {
363
384
  * @param actions the set of Glue actions to allow (for example `glue:GetTable`)
364
385
  */
365
386
  grantToUnderlyingResources(grantee, actions) {
387
+ try {
388
+ jsiiDeprecationWarnings.print("@aws-cdk/aws-glue-alpha.TableBase#grantToUnderlyingResources", "");
389
+ }
390
+ catch (error) {
391
+ if (process.env.JSII_DEBUG !== "1" && error.name === "DeprecationError") {
392
+ Error.captureStackTrace(error, this.grantToUnderlyingResources);
393
+ }
394
+ throw error;
395
+ }
366
396
  return iam.Grant.addToPrincipal({
367
397
  grantee,
368
398
  resourceArns: [
@@ -437,4 +467,4 @@ function validateSchema(columns, partitionKeys) {
437
467
  names.add(column.name);
438
468
  });
439
469
  }
440
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRhYmxlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx5REFBMkM7QUFDM0MsaURBQWdEO0FBR2hELDJDQUEwSjtBQUMxSiw0RUFBcUU7QUFDckUsaUVBQW1EO0FBQ25ELDJDQUF1QztBQUd2QyxpRUFBeUc7QUFHekcsMklBQXFLO0FBcUxySzs7R0FFRztBQUNILE1BQXNCLFNBQVUsU0FBUSxlQUFROztJQUN2QyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQWdCO1FBQ3ZFLE1BQU0sU0FBUyxHQUFHLFNBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFlBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxnQkFBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBYSxDQUFDLENBQUMsQ0FBQztRQUUvSCxPQUFPLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQzlDLFFBQVE7WUFDUixTQUFTO1NBQ1YsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7Ozs7Ozs7Ozs7UUFDcEYsTUFBTSxNQUFPLFNBQVEsZUFBUTtZQUNYLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDO1lBQzFCLFNBQVMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDO1NBQzdDO1FBRUQsT0FBTyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7S0FDOUI7SUFPRDs7T0FFRztJQUNhLFFBQVEsQ0FBWTtJQUVwQzs7T0FFRztJQUNhLFVBQVUs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RSxDQUFDO1lBQzNCLE1BQU0sSUFBSSw4QkFBdUIsQ0FBQyxJQUFBLHNCQUFHLEVBQUEscUJBQXFCLEVBQUUseURBQXlELE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUFDLENBQUM7UUFDdEosQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2ZuVGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBLZXlHcmFudHMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB0eXBlICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IEFybkZvcm1hdCwgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBGbiwgTGF6eSwgTmFtZXMsIFJlc291cmNlLCBTdGFjaywgVG9rZW4sIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCwgbWQ1aGFzaCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0ICogYXMgY3IgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgRGF0YUZvcm1hdCB9IGZyb20gJy4vZGF0YS1mb3JtYXQnO1xuaW1wb3J0IHR5cGUgeyBJRGF0YWJhc2UgfSBmcm9tICcuL2RhdGFiYXNlJztcbmltcG9ydCB7IGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMsIHR5cGUgUGFydGl0aW9uUHJvamVjdGlvbiB9IGZyb20gJy4vcGFydGl0aW9uLXByb2plY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW4gfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VQYXJhbWV0ZXIgfSBmcm9tICcuL3N0b3JhZ2UtcGFyYW1ldGVyJztcbmltcG9ydCB7IFBhcnRpdGlvbkluZGV4SXNDb21wbGV0ZUZ1bmN0aW9uLCBQYXJ0aXRpb25JbmRleE9uRXZlbnRGdW5jdGlvbiB9IGZyb20gJy4uL2N1c3RvbS1yZXNvdXJjZS1oYW5kbGVycy9kaXN0L2F3cy1nbHVlLWFscGhhL3BhcnRpdGlvbi1pbmRleC1wcm92aWRlci5nZW5lcmF0ZWQnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBQYXJ0aXRpb24gSW5kZXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydGl0aW9uSW5kZXgge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBhcnRpdGlvbiBpbmRleC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5hbWUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHlvdS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcnRpdGlvbiBrZXkgbmFtZXMgdGhhdCBjb21wcmlzZSB0aGUgcGFydGl0aW9uXG4gICAqIGluZGV4LiBUaGUgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIGEgbmFtZSBpbiB0aGVcbiAgICogdGFibGUncyBwYXJ0aXRpb24ga2V5cy5cbiAgICovXG4gIHJlYWRvbmx5IGtleU5hbWVzOiBzdHJpbmdbXTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVRhYmxlIGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQXR0cmlidXRlcyB7XG4gIHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGdlbmVyYXRlZCBieSBDREsuXG4gICAqL1xuICByZWFkb25seSB0YWJsZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YWJhc2UgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U6IElEYXRhYmFzZTtcblxuICAvKipcbiAgICogQ29sdW1ucyBvZiB0aGUgdGFibGUuXG4gICAqL1xuICByZWFkb25seSBjb2x1bW5zOiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGNvbHVtbnMgb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0YWJsZSBpcyBub3QgcGFydGl0aW9uZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGluZGV4ZXMgb24gdGhlIHRhYmxlLiBBIG1heGltdW0gb2YgMyBpbmRleGVzXG4gICAqIGFyZSBhbGxvd2VkIG9uIGEgdGFibGUuIEtleXMgaW4gdGhlIGluZGV4IG11c3QgYmUgcGFydFxuICAgKiBvZiB0aGUgdGFibGUncyBwYXJ0aXRpb24ga2V5cy5cbiAgICpcbiAgICogQGRlZmF1bHQgdGFibGUgaGFzIG5vIHBhcnRpdGlvbiBpbmRleGVzXG4gICAqL1xuICByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICAvKipcbiAgICogU3RvcmFnZSB0eXBlIG9mIHRoZSB0YWJsZSdzIGRhdGEuXG4gICAqL1xuICByZWFkb25seSBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFibGUncyBkYXRhIGlzIGNvbXByZXNzZWQgb3Igbm90LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHJlc3NlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIHN0b3JlZCBpbiBzdWJkaXJlY3Rvcmllcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlZEFzU3ViRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHBhcnRpdGlvbiBmaWx0ZXJpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvZ2x1ZS1iZXN0LXByYWN0aWNlcy5odG1sI2dsdWUtYmVzdC1wcmFjdGljZXMtcGFydGl0aW9uLWluZGV4XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIHBhcmFtZXRlciBpcyBub3QgZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUGFydGl0aW9uRmlsdGVyaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHVzZXItc3VwcGxpZWQgcHJvcGVydGllcyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwaHlzaWNhbCBzdG9yYWdlIG9mIHRoaXMgdGFibGUuIFRoZXNlIHByb3BlcnRpZXMgaGVscCBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIHRoYXQgaXMgc3RvcmVkIHdpdGhpbiB0aGUgY3Jhd2xlZCBkYXRhIHNvdXJjZXMuXG4gICAqXG4gICAqIFRoZSBrZXkvdmFsdWUgcGFpcnMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBzdWJtaXR0ZWQgYXJlIG5vdCBsaW1pdGVkLCBob3dldmVyIHRoZWlyIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGd1YXJhbnRlZWQuXG4gICAqXG4gICAqIFNvbWUga2V5cyB3aWxsIGJlIGF1dG8tcG9wdWxhdGVkIGJ5IGdsdWUgY3Jhd2xlcnMsIGhvd2V2ZXIsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlbSBieSBzcGVjaWZ5aW5nIHRoZSBrZXkgYW5kIHZhbHVlIGluIHRoaXMgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL3RhYmxlLXByb3BlcnRpZXMtY3Jhd2xlci5odG1sXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9yX0NSRUFURV9FWFRFUk5BTF9UQUJMRS5odG1sI3JfQ1JFQVRFX0VYVEVSTkFMX1RBQkxFLXBhcmFtZXRlcnMgLSB1bmRlciBfXCJUQUJMRSBQUk9QRVJUSUVTXCJfXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3QgZ2x1ZURhdGFiYXNlOiBnbHVlLklEYXRhYmFzZTtcbiAgICogICAgY29uc3QgdGFibGUgPSBuZXcgZ2x1ZS5TM1RhYmxlKHRoaXMsICdUYWJsZScsIHtcbiAgICogICAgICBzdG9yYWdlUGFyYW1ldGVyczogW1xuICAgKiAgICAgICAgICBnbHVlLlN0b3JhZ2VQYXJhbWV0ZXIuc2tpcEhlYWRlckxpbmVDb3VudCgxKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmNvbXByZXNzaW9uVHlwZShnbHVlLkNvbXByZXNzaW9uVHlwZS5HWklQKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmN1c3RvbSgnZm9vJywgJ2JhcicpLCAvLyBXaWxsIGhhdmUgbm8gZWZmZWN0XG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oJ3NlcGFyYXRvckNoYXInLCAnLCcpLCAvLyBXaWxsIGRlc2NyaWJlIHRoZSBzZXBhcmF0b3IgY2hhciB1c2VkIGluIHRoZSBkYXRhXG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oZ2x1ZS5TdG9yYWdlUGFyYW1ldGVycy5XUklURV9QQVJBTExFTCwgJ29mZicpLFxuICAgKiAgICAgIF0sXG4gICAqICAgICAgLy8gLi4uXG4gICAqICAgICAgZGF0YWJhc2U6IGdsdWVEYXRhYmFzZSxcbiAgICogICAgICBjb2x1bW5zOiBbe1xuICAgKiAgICAgICAgICBuYW1lOiAnY29sMScsXG4gICAqICAgICAgICAgIHR5cGU6IGdsdWUuU2NoZW1hLlNUUklORyxcbiAgICogICAgICB9XSxcbiAgICogICAgICBkYXRhRm9ybWF0OiBnbHVlLkRhdGFGb3JtYXQuQ1NWLFxuICAgKiAgICB9KTtcbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlUGFyYW1ldGVycz86IFN0b3JhZ2VQYXJhbWV0ZXJbXTtcblxuICAvKipcbiAgICogVGhlIGtleS92YWx1ZSBwYWlycyBkZWZpbmUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhYmxlLlxuICAgKiBUaGUga2V5L3ZhbHVlIHBhaXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgc3VibWl0dGVkIGFyZSBub3QgbGltaXRlZCwgaG93ZXZlciB0aGVpciBmdW5jdGlvbmFsaXR5IGlzIG5vdCBndWFyYW50ZWVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWdsdWUtdGFibGUtdGFibGVpbnB1dC5odG1sI2Nmbi1nbHVlLXRhYmxlLXRhYmxlaW5wdXQtcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBwYXJhbWV0ZXIgaXMgbm90IGRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkLlxuICAgKlxuICAgKiBUaGlzIHNldHMgdGhlIGBoYXNfZW5jcnlwdGVkX2RhdGFgIHRhYmxlIHBhcmFtZXRlci4gQXRoZW5hIHJlYWRzIGl0IHdoZW5cbiAgICogcXVlcnlpbmcgY2xpZW50LXNpZGUgKENTRS1LTVMpIGVuY3J5cHRlZCBkYXRhc2V0czsgZm9yIHNlcnZlci1zaWRlXG4gICAqIGVuY3J5cHRlZCAoU1NFLVMzIC8gU1NFLUtNUykgb3IgdW5lbmNyeXB0ZWQgZGF0YSBpdCBoYXMgbm8gZWZmZWN0LCBzaW5jZVxuICAgKiBBbWF6b24gUzMgZGVjcnlwdHMgc2VydmVyLXNpZGUgZW5jcnlwdGVkIG9iamVjdHMgdHJhbnNwYXJlbnRseS5cbiAgICpcbiAgICogRG8gbm90IGFsc28gc2V0IGBoYXNfZW5jcnlwdGVkX2RhdGFgIHRocm91Z2ggYHBhcmFtZXRlcnNgIC0gdXNlIHRoaXNcbiAgICogcHJvcGVydHkgaW5zdGVhZC4gQSBjb25mbGljdGluZyB2YWx1ZSBpbiBgcGFyYW1ldGVyc2AgaXMgcmVqZWN0ZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvY3JlYXRpbmctdGFibGVzLWJhc2VkLW9uLWVuY3J5cHRlZC1kYXRhc2V0cy1pbi1zMy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGhhc0VuY3J5cHRlZERhdGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBhbGxvd3MgQXRoZW5hIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyBwYXJ0aXRpb25zXG4gICAqIHdpdGhvdXQgcmVxdWlyaW5nIGBBTFRFUiBUQUJMRSBBREQgUEFSVElUSU9OYCBzdGF0ZW1lbnRzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwYXJ0aXRpb24gcHJvamVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG59XG5cbi8qKlxuICogQSBHbHVlIHRhYmxlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCB0YWJsZUFybjogc3RyaW5nKTogSVRhYmxlIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBGbi5zZWxlY3QoMSwgRm4uc3BsaXQoJy8nLCBTdGFjay5vZihzY29wZSkuc3BsaXRBcm4odGFibGVBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhKSk7XG5cbiAgICByZXR1cm4gVGFibGVCYXNlLmZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICB0YWJsZUFybixcbiAgICAgIHRhYmxlTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVGFibGUgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBpZC5cbiAgICogQHBhcmFtIGF0dHJzIEltcG9ydCBhdHRyaWJ1dGVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFRhYmxlQXR0cmlidXRlcyk6IElUYWJsZSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHRhYmxlQXJuID0gYXR0cnMudGFibGVBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lID0gYXR0cnMudGFibGVOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVSZXNvdXJjZTogQ2ZuVGFibGU7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICAvKipcbiAgICogRGF0YWJhc2UgdGhpcyB0YWJsZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlOiBJRGF0YWJhc2U7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSdzIGRhdGEgaXMgY29tcHJlc3NlZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHJlc3NlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9ybWF0IG9mIHRoaXMgdGFibGUncyBkYXRhIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHRhYmxlJ3MgcGFydGl0aW9uIGtleXMgaWYgdGhlIHRhYmxlIGlzIHBhcnRpdGlvbmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogVGhlIHRhYmxlcycgc3RvcmFnZSBkZXNjcmlwdG9yIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RvcmFnZVBhcmFtZXRlcnM/OiBTdG9yYWdlUGFyYW1ldGVyW107XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGlmIGVuYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0YWJsZXMnIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWJsZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1nbHVlLXRhYmxlLXRhYmxlaW5wdXQuaHRtbCNjZm4tZ2x1ZS10YWJsZS10YWJsZWlucHV0LXBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkLiBFbWl0dGVkIGFzIHRoZVxuICAgKiBgaGFzX2VuY3J5cHRlZF9kYXRhYCB0YWJsZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzRW5jcnlwdGVkRGF0YTogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGluZGV4ZXMgbXVzdCBiZSBjcmVhdGVkIG9uZSBhdCBhIHRpbWUuIFRvIGF2b2lkXG4gICAqIHJhY2UgY29uZGl0aW9ucywgd2Ugc3RvcmUgdGhlIHJlc291cmNlIGFuZCBhZGQgZGVwZW5kZW5jaWVzXG4gICAqIGVhY2ggdGltZSBhIG5ldyBwYXJ0aXRpb24gaW5kZXggaXMgY3JlYXRlZC5cbiAgICovXG4gIHByaXZhdGUgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXM6IEN1c3RvbVJlc291cmNlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVGFibGVCYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMudGFibGVOYW1lID8/XG4gICAgICAgIExhenkuc3RyaW5nKHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PiBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge30pLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kYXRhYmFzZSA9IHByb3BzLmRhdGFiYXNlO1xuICAgIHRoaXMuZGF0YUZvcm1hdCA9IHByb3BzLmRhdGFGb3JtYXQ7XG5cbiAgICB2YWxpZGF0ZVNjaGVtYShwcm9wcy5jb2x1bW5zLCBwcm9wcy5wYXJ0aXRpb25LZXlzKTtcbiAgICB0aGlzLmNvbHVtbnMgPSBwcm9wcy5jb2x1bW5zO1xuICAgIHRoaXMucGFydGl0aW9uS2V5cyA9IHByb3BzLnBhcnRpdGlvbktleXM7XG4gICAgdGhpcy5zdG9yYWdlUGFyYW1ldGVycyA9IHByb3BzLnN0b3JhZ2VQYXJhbWV0ZXJzO1xuICAgIHRoaXMucGFydGl0aW9uUHJvamVjdGlvbiA9IHByb3BzLnBhcnRpdGlvblByb2plY3Rpb247XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gcHJvcHMucGFyYW1ldGVycyA/PyB7fTtcblxuICAgIHRoaXMuaGFzRW5jcnlwdGVkRGF0YSA9IHByb3BzLmhhc0VuY3J5cHRlZERhdGEgPz8gdHJ1ZTtcbiAgICB0aGlzLnJlY29uY2lsZUhhc0VuY3J5cHRlZERhdGEoKTtcblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IHByb3BzLmNvbXByZXNzZWQgPz8gZmFsc2U7XG5cbiAgICB0aGlzLnZhbGlkYXRlQW5kR2VuZXJhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbiAgcHVibGljIGFic3RyYWN0IGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXJ0aXRpb24gaW5kZXggdG8gdGhlIHRhYmxlLiBZb3UgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDMgcGFydGl0aW9uXG4gICAqIGluZGV4ZXMgdG8gYSB0YWJsZS4gUGFydGl0aW9uIGluZGV4IGtleXMgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgdGFibGUnc1xuICAgKiBwYXJ0aXRpb24ga2V5cy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvcGFydGl0aW9uLWluZGV4ZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIGFkZFBhcnRpdGlvbkluZGV4KGluZGV4OiBQYXJ0aXRpb25JbmRleCkge1xuICAgIGNvbnN0IG51bVBhcnRpdGlvbnMgPSB0aGlzLnBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2VzLmxlbmd0aDtcbiAgICBpZiAobnVtUGFydGl0aW9ucyA+PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBNYXhQYXJ0aXRpb25JbmRleGVzRXhjZWVkZWRgLCAnTWF4aW11bSBudW1iZXIgb2YgcGFydGl0aW9uIGluZGV4ZXMgYWxsb3dlZCBpcyAzJywgdGhpcyk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVQYXJ0aXRpb25JbmRleChpbmRleCk7XG5cbiAgICBjb25zdCBpbmRleE5hbWUgPSBpbmRleC5pbmRleE5hbWUgPz8gdGhpcy5nZW5lcmF0ZUluZGV4TmFtZShpbmRleC5rZXlOYW1lcyk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBQYXJ0aXRpb25JbmRleFByb3ZpZGVyLmdldE9yQ3JlYXRlKHRoaXMpO1xuXG4gICAgLy8gVGhlIGdyYW50cyBhcmUgaWRlbnRpY2FsIGZvciBldmVyeSBpbmRleCBvbiB0aGlzIHRhYmxlLCBzbyBvbmx5IGFkZCB0aGVtXG4gICAgLy8gb25jZS5cbiAgICBpZiAobnVtUGFydGl0aW9ucyA9PT0gMCkge1xuICAgICAgLy8gQWRkIHNjb3BlZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyB0YWJsZSdzIEdsdWUgcmVzb3VyY2VzXG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hd3NnbHVlLmh0bWxcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IFt0aGlzLnRhYmxlQXJuLCB0aGlzLmRhdGFiYXNlLmRhdGFiYXNlQXJuLCB0aGlzLmRhdGFiYXNlLmNhdGFsb2cuY2F0YWxvZ0Fybl07XG5cbiAgICAgIC8vIFRoZSBjYXRhbG9nJ3MgZW5jcnlwdGlvbiBpcyBmaXhlZCBhdCBjb25zdHJ1Y3Rpb24sIHNvIHRoZSBlbmNyeXB0aW9uIGtleVxuICAgICAgLy8gKGlmIGFueSkgaXMga25vd24gaGVyZS4gR3JhbnQgdGhlIGhhbmRsZXJzIGFjY2VzcyB0byBpdC4gTm8tb3Agd2hlbiB0aGVcbiAgICAgIC8vIGNhdGFsb2cgdXNlcyBhbiBBV1MtbWFuYWdlZCBrZXkgb3Igbm8gZW5jcnlwdGlvbi5cbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuZGF0YWJhc2UuY2F0YWxvZy5lbmNyeXB0aW9uS2V5O1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBncmFudHMgPSBLZXlHcmFudHMuZnJvbUtleShrZXkpO1xuICAgICAgICBncmFudHMuZGVjcnlwdChwcm92aWRlci5vbkV2ZW50SGFuZGxlcik7XG4gICAgICAgIGdyYW50cy5kZWNyeXB0KHByb3ZpZGVyLmlzQ29tcGxldGVIYW5kbGVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gQm90aCBoYW5kbGVycyBjcmVhdGUsIGRlbGV0ZSwgYW5kIGluc3BlY3QgaW5kZXhlczogb25FdmVudCBjcmVhdGVzL2RlbGV0ZXMgb25cbiAgICAgIC8vIENyZWF0ZS9EZWxldGUvVXBkYXRlLCBhbmQgaXNDb21wbGV0ZSByZWNyZWF0ZXMgdGhlIGluZGV4IHdoaWxlIGRyaXZpbmcgYVxuICAgICAgLy8ga2V5LWNoYW5nZSB1cGRhdGUgKGRlbGV0ZSAtPiByZWNyZWF0ZSAtPiBBQ1RJVkUpLiBVcGRhdGVUYWJsZS9HZXRUYWJsZSBhcmVcbiAgICAgIC8vIHJlcXVpcmVkIGJ5IHRoZSBDcmVhdGVQYXJ0aXRpb25JbmRleC9EZWxldGVQYXJ0aXRpb25JbmRleCBBUElzLlxuICAgICAgY29uc3QgYWN0aW9ucyA9IFtcbiAgICAgICAgJ2dsdWU6R2V0UGFydGl0aW9uSW5kZXhlcycsXG4gICAgICAgICdnbHVlOkNyZWF0ZVBhcnRpdGlvbkluZGV4JyxcbiAgICAgICAgJ2dsdWU6RGVsZXRlUGFydGl0aW9uSW5kZXgnLFxuICAgICAgICAnZ2x1ZTpHZXRUYWJsZScsXG4gICAgICAgICdnbHVlOlVwZGF0ZVRhYmxlJyxcbiAgICAgIF07XG4gICAgICBwcm92aWRlci5vbkV2ZW50SGFuZGxlci5hZGRUb1JvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zLCByZXNvdXJjZXMgfSkpO1xuICAgICAgcHJvdmlkZXIuaXNDb21wbGV0ZUhhbmRsZXIuYWRkVG9Sb2xlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9ucywgcmVzb3VyY2VzIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIGBwYXJ0aXRpb24taW5kZXgtJHtpbmRleE5hbWV9YCwge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpHbHVlUGFydGl0aW9uSW5kZXgnLFxuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIERhdGFiYXNlTmFtZTogdGhpcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUsXG4gICAgICAgIFRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICAgIEluZGV4TmFtZTogaW5kZXhOYW1lLFxuICAgICAgICBLZXlzOiBpbmRleC5rZXlOYW1lcyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBFbnN1cmUgSUFNIHBvbGljaWVzIGFyZSBjcmVhdGVkIGJlZm9yZSB0aGUgY3VzdG9tIHJlc291cmNlIGludm9rZXMgdGhlIGhhbmRsZXJzXG4gICAgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kocHJvdmlkZXIub25FdmVudEhhbmRsZXIucm9sZSEpO1xuICAgIHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHByb3ZpZGVyLmlzQ29tcGxldGVIYW5kbGVyLnJvbGUhKTtcblxuICAgIC8vIERlcGVuZCBvbiBwcmV2aW91cyBwYXJ0aXRpb24gaW5kZXggdG8gYXZvaWQgcmFjZSBjb25kaXRpb25cbiAgICBpZiAobnVtUGFydGl0aW9ucyA+IDApIHtcbiAgICAgIHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXNbbnVtUGFydGl0aW9ucy0xXSk7XG4gICAgfVxuICAgIHRoaXMucGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXMucHVzaChwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVJbmRleE5hbWUoa2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1heEluZGV4TGVuZ3RoID0gODA7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChrZXlzKSB8fCBrZXlzLnNvbWUoayA9PiBUb2tlbi5pc1VucmVzb2x2ZWQoaykpKSB7XG4gICAgICAvLyBUaGUgaW5kZXggbmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlIGtleSBuYW1lcywgc28gdG9rZW5pemVkIGtleXMgbGVhdmVcbiAgICAgIC8vIG5vdGhpbmcgc3RhYmxlIHRvIGdlbmVyYXRlIGZyb206IGFueSBhdXRvLWdlbmVyYXRlZCBuYW1lIHdvdWxkIGhhdmUgdG9cbiAgICAgIC8vIGZhbGwgYmFjayB0byB0aGUgaW5kZXgncyBwb3NpdGlvbiBvbiB0aGUgdGFibGUsIHdoaWNoIHNoaWZ0cyBpZiBpbmRleGVzXG4gICAgICAvLyBhcmUgYWRkZWQsIHJlbW92ZWQsIG9yIHJlb3JkZXJlZCAtIHNpbGVudGx5IHJlcGxhY2luZyBpbmRleGVzIHRoYXQgZGlkXG4gICAgICAvLyBub3QgYWN0dWFsbHkgY2hhbmdlLiBSZXF1aXJlIGFuIGV4cGxpY2l0LCBzdGFibGUgbmFtZSBpbnN0ZWFkLlxuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YFRva2VuaXplZEluZGV4S2V5c1JlcXVpcmVOYW1lYCxcbiAgICAgICAgJ2Nhbm5vdCBhdXRvLWdlbmVyYXRlIGEgc3RhYmxlIHBhcnRpdGlvbiBpbmRleCBuYW1lIGZyb20gdG9rZW5pemVkIGtleSBuYW1lczsgJyArXG4gICAgICAgICAgJ3NwZWNpZnkgYGluZGV4TmFtZWAgZXhwbGljaXRseSB3aGVuIGluZGV4IGtleXMgYXJlIG5vdCBrbm93biBhdCBzeW50aGVzaXMgdGltZScsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwcmVmaXggPSBrZXlzLmpvaW4oJy0nKSArICctJztcbiAgICBjb25zdCB1bmlxdWVJZCA9IE5hbWVzLnVuaXF1ZUlkKHRoaXMpO1xuICAgIGlmIChwcmVmaXgubGVuZ3RoIDwgbWF4SW5kZXhMZW5ndGgpIHtcbiAgICAgIC8vIENvbW1vbiBjYXNlOiB0cmltIHRoZSB1bmlxdWVJZCB0YWlsIHNvIHRoZSB3aG9sZSBuYW1lIGZpdHMgdW5kZXIgdGhlIGNhcC5cbiAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBNYXRoLm1heCgwLCB1bmlxdWVJZC5sZW5ndGggLSAobWF4SW5kZXhMZW5ndGggLSBwcmVmaXgubGVuZ3RoKSk7XG4gICAgICByZXR1cm4gcHJlZml4ICsgdW5pcXVlSWQuc3Vic3RyaW5nKHN0YXJ0SW5kZXgpO1xuICAgIH1cbiAgICAvLyBUaGUgam9pbmVkIGtleSBuYW1lcyBhbG9uZSBleGNlZWQgdGhlIGJ1ZGdldCAobG9uZyBrZXkgbmFtZXMpLCBzbyB0cmltbWluZ1xuICAgIC8vIHRoZSB1bmlxdWVJZCBpcyBub3QgZW5vdWdoLiBUcnVuY2F0ZSB0aGUgcHJlZml4IGFuZCBhcHBlbmQgYSBoYXNoIG9mIHRoZVxuICAgIC8vIHRhYmxlIHBhdGggcGx1cyB0aGUgZnVsbCBrZXkgbGlzdCwgc28gdHdvIGRpZmZlcmVudCAobG9uZykga2V5IHNldHMgY2Fubm90XG4gICAgLy8gY29sbGlkZSBhZnRlciB0cnVuY2F0aW9uLlxuICAgIGNvbnN0IGhhc2ggPSBtZDVoYXNoKHVuaXF1ZUlkICsgJy0nICsga2V5cy5qb2luKCctJykpLnNsaWNlKDAsIDgpO1xuICAgIHJldHVybiBwcmVmaXguc3Vic3RyaW5nKDAsIG1heEluZGV4TGVuZ3RoIC0gaGFzaC5sZW5ndGggLSAxKSArICctJyArIGhhc2g7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25jaWxlIGEgYGhhc19lbmNyeXB0ZWRfZGF0YWAgdmFsdWUgc3VwcGxpZWQgdGhyb3VnaCB0aGUgZnJlZS1mb3JtXG4gICAqIGBwYXJhbWV0ZXJzYCBtYXAgd2l0aCB0aGUgdHlwZWQgYGhhc0VuY3J5cHRlZERhdGFgIHByb3BlcnR5LlxuICAgKlxuICAgKiBgaGFzX2VuY3J5cHRlZF9kYXRhYCBpcyBtYW5hZ2VkIGJ5IHRoaXMgY29uc3RydWN0IGFuZCBlbWl0dGVkIGF1dGhvcml0YXRpdmVseVxuICAgKiBmcm9tIGBoYXNFbmNyeXB0ZWREYXRhYC4gU3VwcGx5aW5nIGl0IHRocm91Z2ggYHBhcmFtZXRlcnNgIGFzIHdlbGwgaXMgb25seVxuICAgKiB0b2xlcmF0ZWQgd2hlbiB0aGUgdmFsdWUgaXMgaWRlbnRpY2FsOyBhIGRpZmZlcmluZyAob3IgdW5yZXNvbHZlZCkgdmFsdWUgaXNcbiAgICogcmVqZWN0ZWQgc28gdGhlIHR3byBpbnB1dHMgY2FuIG5ldmVyIHNpbGVudGx5IGRpc2FncmVlLiBPbiBzdWNjZXNzIHRoZSBrZXkgaXNcbiAgICogcmVtb3ZlZCBmcm9tIHRoZSBmcmVlLWZvcm0gbWFwIHNvIHRoZSBtYW5hZ2VkIHZhbHVlIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mXG4gICAqIHRydXRoLlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvbmNpbGVIYXNFbmNyeXB0ZWREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9ICdoYXNfZW5jcnlwdGVkX2RhdGEnO1xuICAgIGlmICghKGtleSBpbiB0aGlzLnBhcmFtZXRlcnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN1cHBsaWVkID0gdGhpcy5wYXJhbWV0ZXJzW2tleV07XG4gICAgY29uc3QgbWFuYWdlZCA9IFN0cmluZyh0aGlzLmhhc0VuY3J5cHRlZERhdGEpO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoc3VwcGxpZWQpIHx8IHN1cHBsaWVkICE9PSBtYW5hZ2VkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgSGFzRW5jcnlwdGVkRGF0YUNvbmZsaWN0YCxcbiAgICAgICAgYHRoZSBcXGAke2tleX1cXGAgdGFibGUgcGFyYW1ldGVyIGlzIG1hbmFnZWQgYnkgdGhlIFxcYGhhc0VuY3J5cHRlZERhdGFcXGAgcHJvcGVydHk7IGAgK1xuICAgICAgICAgIGByZW1vdmUgaXQgZnJvbSBcXGBwYXJhbWV0ZXJzXFxgIGFuZCB1c2UgdGhlIGJvb2xlYW4gXFxgaGFzRW5jcnlwdGVkRGF0YVxcYCBwcm9wZXJ0eSBpbnN0ZWFkIChnb3QgJHtKU09OLnN0cmluZ2lmeShzdXBwbGllZCl9LCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KG1hbmFnZWQpfSlgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMucGFyYW1ldGVyc1trZXldO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcnRpdGlvbkluZGV4KGluZGV4OiBQYXJ0aXRpb25JbmRleCkge1xuICAgIGlmIChpbmRleC5pbmRleE5hbWUgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGluZGV4LmluZGV4TmFtZSkgJiYgKGluZGV4LmluZGV4TmFtZS5sZW5ndGggPCAxIHx8IGluZGV4LmluZGV4TmFtZS5sZW5ndGggPiAyNTUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBJbmRleE5hbWVMZW5ndGhJbnZhbGlkYCwgYEluZGV4IG5hbWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBjaGFyYWN0ZXJzLCBidXQgZ290ICR7aW5kZXguaW5kZXhOYW1lLmxlbmd0aH1gLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhcnRpdGlvbktleXMgfHwgdGhpcy5wYXJ0aXRpb25LZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgTm9QYXJ0aXRpb25LZXlzRm9ySW5kZXhgLCAnVGhlIHRhYmxlIG11c3QgaGF2ZSBwYXJ0aXRpb24ga2V5cyB0byBjcmVhdGUgYSBwYXJ0aXRpb24gaW5kZXgnLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoaW5kZXgua2V5TmFtZXMpKSB7XG4gICAgICBjb25zdCBrZXlOYW1lcyA9IHRoaXMucGFydGl0aW9uS2V5cy5tYXAocGsgPT4gcGsubmFtZSk7XG4gICAgICBjb25zdCBjb25jcmV0ZUtleXMgPSBpbmRleC5rZXlOYW1lcy5maWx0ZXIoayA9PiAhVG9rZW4uaXNVbnJlc29sdmVkKGspKTtcbiAgICAgIGlmIChjb25jcmV0ZUtleXMubGVuZ3RoID4gMCAmJiAhY29uY3JldGVLZXlzLmV2ZXJ5KGsgPT4ga2V5TmFtZXMuaW5jbHVkZXMoaykpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEluZGV4S2V5c05vdFBhcnRpdGlvbktleXNgLCBgQWxsIGluZGV4IGtleXMgbXVzdCBhbHNvIGJlIHBhcnRpdGlvbiBrZXlzLiBHb3QgJHtpbmRleC5rZXlOYW1lc30gYnV0IHBhcnRpdGlvbiBrZXkgbmFtZXMgYXJlICR7a2V5TmFtZXN9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIG1lcmdlIGdlbmVyYXRlZCBwYXJhbWV0ZXJzIGludG8gdGhpcy5wYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFuZEdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFydGl0aW9uUHJvamVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgcGFydGl0aW9uIGtleXMgZXhpc3RcbiAgICBpZiAoIXRoaXMucGFydGl0aW9uS2V5cyB8fCB0aGlzLnBhcnRpdGlvbktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTm9QYXJ0aXRpb25LZXlzRm9yUHJvamVjdGlvbmAsXG4gICAgICAgICdUaGUgdGFibGUgbXVzdCBoYXZlIHBhcnRpdGlvbiBrZXlzIHRvIHVzZSBwYXJ0aXRpb24gcHJvamVjdGlvbicsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpdGlvbktleU5hbWVzID0gdGhpcy5wYXJ0aXRpb25LZXlzLm1hcChwayA9PiBway5uYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wYXJ0aXRpb25Qcm9qZWN0aW9uKSkge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCBjb2x1bW4gaXMgYSBwYXJ0aXRpb24ga2V5XG4gICAgICBpZiAoIXBhcnRpdGlvbktleU5hbWVzLmluY2x1ZGVzKGNvbHVtbk5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFByb2plY3Rpb25Db2x1bW5Ob3RQYXJ0aXRpb25LZXlgLFxuICAgICAgICAgIGBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb2x1bW4gXCIke2NvbHVtbk5hbWV9XCIgbXVzdCBiZSBhIHBhcnRpdGlvbiBrZXkuIGAgK1xuICAgICAgICAgIGBQYXJ0aXRpb24ga2V5cyBhcmU6ICR7cGFydGl0aW9uS2V5TmFtZXMuam9pbignLCAnKX1gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnNcbiAgICAgIGNvbnN0IGdlbmVyYXRlZFBhcmFtcyA9IGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMoY29sdW1uTmFtZSwgY29uZmlnKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbmZsaWN0cyB3aXRoIG1hbnVhbGx5IHNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCBjb25mbGljdGluZ0tleXMgPSBPYmplY3Qua2V5cyhnZW5lcmF0ZWRQYXJhbXMpLmZpbHRlcihrZXkgPT4ga2V5IGluIHRoaXMucGFyYW1ldGVycyk7XG4gICAgICBpZiAoY29uZmxpY3RpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUHJvamVjdGlvblBhcmFtZXRlcnNDb25mbGljdGAsXG4gICAgICAgICAgYFBhcnRpdGlvbiBwcm9qZWN0aW9uIHBhcmFtZXRlcnMgY29uZmxpY3Qgd2l0aCBtYW51YWxseSBzcGVjaWZpZWQgcGFyYW1ldGVyczogJHtjb25mbGljdGluZ0tleXMuam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICdVc2UgdGhlIHBhcnRpdGlvblByb2plY3Rpb24gcHJvcGVydHkgaW5zdGVhZCBvZiBtYW51YWxseSBzcGVjaWZ5aW5nIHByb2plY3Rpb24gcGFyYW1ldGVycy4nLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIGludG8gdGhpcy5wYXJhbWV0ZXJzXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMucGFyYW1ldGVycywgZ2VuZXJhdGVkUGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgY29uZmxpY3Qgd2l0aCBwcm9qZWN0aW9uLmVuYWJsZWRcbiAgICBpZiAoJ3Byb2plY3Rpb24uZW5hYmxlZCcgaW4gdGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgUHJvamVjdGlvbkVuYWJsZWRDb25mbGljdGAsXG4gICAgICAgICdQYXJhbWV0ZXIgXCJwcm9qZWN0aW9uLmVuYWJsZWRcIiBjb25mbGljdHMgd2l0aCBwYXJ0aXRpb25Qcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uICcgK1xuICAgICAgICAnVXNlIHRoZSBwYXJ0aXRpb25Qcm9qZWN0aW9uIHByb3BlcnR5IGluc3RlYWQgb2YgbWFudWFsbHkgc3BlY2lmeWluZyBwcm9qZWN0aW9uLmVuYWJsZWQuJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGdsb2JhbGx5XG4gICAgdGhpcy5wYXJhbWV0ZXJzWydwcm9qZWN0aW9uLmVuYWJsZWQnXSA9ICd0cnVlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgY3VzdG9tIHBlcm1pc3Npb25zIG9uIHRoaXMgdGFibGUuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZXNjYXBlIGhhdGNoOiB0aGUgYGFjdGlvbnNgIGFyZSBhcHBsaWVkIHZlcmJhdGltLFxuICAgKiBzY29wZWQgdG8gdGhpcyB0YWJsZSdzIEFSTi4gUHJlZmVyIHRoZSBpbnRlbnQtYmFzZWQgYGdyYW50UmVhZGAgL1xuICAgKiBgZ3JhbnRXcml0ZWAgLyBgZ3JhbnRSZWFkV3JpdGVgIG1ldGhvZHMsIHdoaWNoIGdyYW50IGEgY3VyYXRlZCBzZXQgb2ZcbiAgICogYWN0aW9ucyBhbmQgYWxzbyBjb3ZlciB0aGUgdW5kZXJseWluZyBTMyBkYXRhLiBPbmx5IHBhc3MgdGhlIHNwZWNpZmljXG4gICAqIGFjdGlvbnMgdGhlIGdyYW50ZWUgbmVlZHMgLSBhdm9pZCBzZXJ2aWNlIHdpbGRjYXJkcyBzdWNoIGFzIGBnbHVlOipgLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gYWN0aW9ucyB0aGUgc2V0IG9mIEdsdWUgYWN0aW9ucyB0byBhbGxvdyAoZm9yIGV4YW1wbGUgYGdsdWU6R2V0VGFibGVgKVxuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCBhY3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMudGFibGVBcm5dLFxuICAgICAgYWN0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgY3VzdG9tIHBlcm1pc3Npb25zIG9uIHRoaXMgdGFibGUgQU5EIGl0cyBwYXJlbnRcbiAgICogY2F0YWxvZyBhbmQgZGF0YWJhc2UuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZXNjYXBlIGhhdGNoIGZvciBhY3Rpb25zIChzdWNoIGFzIGNlcnRhaW4gTGFrZVxuICAgKiBGb3JtYXRpb24gb3IgY3Jhd2xlciBvcGVyYXRpb25zKSB0aGF0IG11c3QgYmUgYXV0aG9yaXplZCBhZ2FpbnN0IHRoZVxuICAgKiBjYXRhbG9nIGFuZCBkYXRhYmFzZSBpbiBhZGRpdGlvbiB0byB0aGUgdGFibGUuIFRoZSBgYWN0aW9uc2AgYXJlIGFwcGxpZWRcbiAgICogdmVyYmF0aW0gdG8gYWxsIHRocmVlIEFSTnMgKHRhYmxlLCBjYXRhbG9nLCBkYXRhYmFzZSksIHNvIHNjb3BlIHRoZW1cbiAgICogdGlnaHRseTogcGFzcyBvbmx5IHRoZSBzcGVjaWZpYyBhY3Rpb25zIHRoZSBncmFudGVlIG5lZWRzIGFuZCBhdm9pZFxuICAgKiBzZXJ2aWNlIHdpbGRjYXJkcyBzdWNoIGFzIGBnbHVlOipgLCB3aGljaCB3b3VsZCBncmFudCBicm9hZCBhY2Nlc3MgYWNyb3NzXG4gICAqIGV2ZXJ5IHJlc291cmNlIGluIHRoZSBjYXRhbG9nIGFuZCBkYXRhYmFzZS5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIHRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgdGhlIHNldCBvZiBHbHVlIGFjdGlvbnMgdG8gYWxsb3cgKGZvciBleGFtcGxlIGBnbHVlOkdldFRhYmxlYClcbiAgICovXG4gIHB1YmxpYyBncmFudFRvVW5kZXJseWluZ1Jlc291cmNlcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgYWN0aW9uczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICByZXNvdXJjZUFybnM6IFtcbiAgICAgICAgdGhpcy50YWJsZUFybixcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5jYXRhbG9nLmNhdGFsb2dBcm4sXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGF0YWJhc2VBcm4sXG4gICAgICBdLFxuICAgICAgYWN0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc3RhY2stc2luZ2xldG9uIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlciB0aGF0IG1hbmFnZXMgR2x1ZSBwYXJ0aXRpb24gaW5kZXhlcy5cbiAqXG4gKiBBbGwgcGFydGl0aW9uLWluZGV4ZWQgdGFibGVzIGluIGEgc3RhY2sgc2hhcmUgYSBzaW5nbGUgcHJvdmlkZXIgKGFuZCBpdHMgdHdvXG4gKiBMYW1iZGEgaGFuZGxlcnMpIHRvIGF2b2lkIHByb3Zpc2lvbmluZyBhIHByb3ZpZGVyIGZyYW1ld29yayBwZXIgdGFibGUuIFRoZVxuICogcHJvdmlkZXIgYW5kIGhhbmRsZXJzIGFyZSBncm91cGVkIHVuZGVyIHRoaXMgc2luZ2xlIGNvbnN0cnVjdCBzbyBvbmx5IG9uZVxuICogaWQgaXMgcGxhY2VkIGF0IHN0YWNrIHNjb3BlLlxuICovXG5jbGFzcyBQYXJ0aXRpb25JbmRleFByb3ZpZGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YWNrLXNpbmdsZXRvbiBwcm92aWRlciwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRPckNyZWF0ZShzY29wZTogQ29uc3RydWN0KTogUGFydGl0aW9uSW5kZXhQcm92aWRlciB7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gICAgLy8gQSBmaXhlZCwgbmFtZXNwYWNlZCBpZCBtYWtlcyB0aGlzIGEgc3RhY2sgc2luZ2xldG9uOiBldmVyeSBjYWxsIHdpdGhpbiB0aGVcbiAgICAvLyBzYW1lIHN0YWNrIHJlc29sdmVzIHRvIHRoZSBzYW1lIGNoaWxkIHZpYSBgdHJ5RmluZENoaWxkYC5cbiAgICBjb25zdCBpZCA9ICdAYXdzLWNkay9hd3MtZ2x1ZS1hbHBoYS5QYXJ0aXRpb25JbmRleFByb3ZpZGVyJztcbiAgICByZXR1cm4gKHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGlkKSBhcyBQYXJ0aXRpb25JbmRleFByb3ZpZGVyKSA/PyBuZXcgUGFydGl0aW9uSW5kZXhQcm92aWRlcihzdGFjaywgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IG9uRXZlbnRIYW5kbGVyOiBsYW1iZGEuRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBpc0NvbXBsZXRlSGFuZGxlcjogbGFtYmRhLkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVyOiBjci5Qcm92aWRlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIFRoZSBoYW5kbGVyIHNvdXJjZSBsaXZlcyBpbiBgQGF3cy1jZGsvY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzYCBhbmQgaXMgY29kZVxuICAgIC8vIGdlbmVyYXRlZCArIGFpcmxpZnRlZCBpbnRvIHRoaXMgcGFja2FnZSBhdCBidWlsZCB0aW1lIChzZWVcbiAgICAvLyBzY3JpcHRzL2FpcmxpZnQtY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzLnNoKSwgZm9sbG93aW5nIHRoZSBwYXR0ZXJuIHVzZWQgYnkgdGhlXG4gICAgLy8gb3RoZXIgYWxwaGEgbW9kdWxlcyAoYXdzLWFtcGxpZnktYWxwaGEsIGF3cy1yZWRzaGlmdC1hbHBoYSkuIFRoZSBAYXdzLXNkay9jbGllbnQtZ2x1ZVxuICAgIC8vIG1vZHVsZSBpcyBwcm92aWRlZCBieSB0aGUgTGFtYmRhIHJ1bnRpbWUgcmF0aGVyIHRoYW4gYnVuZGxlZCBpbnRvIHRoZSBhc3NldC5cbiAgICB0aGlzLm9uRXZlbnRIYW5kbGVyID0gbmV3IFBhcnRpdGlvbkluZGV4T25FdmVudEZ1bmN0aW9uKHRoaXMsICdIYW5kbGVyJywge1xuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICB9KTtcbiAgICB0aGlzLmlzQ29tcGxldGVIYW5kbGVyID0gbmV3IFBhcnRpdGlvbkluZGV4SXNDb21wbGV0ZUZ1bmN0aW9uKHRoaXMsICdJc0NvbXBsZXRlJywge1xuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvdmlkZXIgPSBuZXcgY3IuUHJvdmlkZXIodGhpcywgJ1Byb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IHRoaXMub25FdmVudEhhbmRsZXIsXG4gICAgICBpc0NvbXBsZXRlSGFuZGxlcjogdGhpcy5pc0NvbXBsZXRlSGFuZGxlcixcbiAgICAgIHF1ZXJ5SW50ZXJ2YWw6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgdG90YWxUaW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSB0b2tlbiB0byB3aXJlIGludG8gcGFydGl0aW9uIGluZGV4IGN1c3RvbSByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VUb2tlbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbjtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNjaGVtYShjb2x1bW5zOiBDb2x1bW5bXSwgcGFydGl0aW9uS2V5cz86IENvbHVtbltdKTogdm9pZCB7XG4gIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTm9Db2x1bW5zU3BlY2lmaWVkYCwgJ3lvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGNvbHVtbiBmb3IgdGhlIHRhYmxlJyk7XG4gIH1cbiAgLy8gQ2hlY2sgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbHVtbiBhbmQgbm8gZHVwbGljYXRlZCBjb2x1bW4gbmFtZXMgb3IgcGFydGl0aW9uIGtleXMuXG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIChjb2x1bW5zLmNvbmNhdChwYXJ0aXRpb25LZXlzIHx8IFtdKSkuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgIGlmIChuYW1lcy5oYXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YER1cGxpY2F0ZUNvbHVtbk5hbWVgLCBgY29sdW1uIG5hbWVzIGFuZCBwYXJ0aXRpb24ga2V5cyBtdXN0IGJlIHVuaXF1ZSwgYnV0IFxcJyR7Y29sdW1uLm5hbWV9XFwnIGlzIGR1cGxpY2F0ZWRgKTtcbiAgICB9XG4gICAgbmFtZXMuYWRkKGNvbHVtbi5uYW1lKTtcbiAgfSk7XG59XG4iXX0=
470
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUtYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbInRhYmxlLWJhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFDQSx5REFBMkM7QUFDM0MsaURBQWdEO0FBR2hELDJDQUEwSjtBQUMxSiw0RUFBcUU7QUFDckUsaUVBQW1EO0FBQ25ELDJDQUF1QztBQUd2QyxpRUFBeUc7QUFHekcsMklBQXFLO0FBcUxySzs7R0FFRztBQUNILE1BQXNCLFNBQVUsU0FBUSxlQUFROztJQUN2QyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQWdCLEVBQUUsRUFBVSxFQUFFLFFBQWdCOzs7Ozs7Ozs7O1FBQ3ZFLE1BQU0sU0FBUyxHQUFHLFNBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLFNBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLFlBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxnQkFBUyxDQUFDLG1CQUFtQixDQUFDLENBQUMsWUFBYSxDQUFDLENBQUMsQ0FBQztRQUUvSCxPQUFPLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLEVBQUUsRUFBRSxFQUFFO1lBQzlDLFFBQVE7WUFDUixTQUFTO1NBQ1YsQ0FBQyxDQUFDO0tBQ0o7SUFFRDs7Ozs7O09BTUc7SUFDSSxNQUFNLENBQUMsbUJBQW1CLENBQUMsS0FBZ0IsRUFBRSxFQUFVLEVBQUUsS0FBc0I7Ozs7Ozs7Ozs7O1FBQ3BGLE1BQU0sTUFBTyxTQUFRLGVBQVE7WUFDWCxRQUFRLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQztZQUMxQixTQUFTLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQztTQUM3QztRQUVELE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBT0Q7O09BRUc7SUFDYSxRQUFRLENBQVk7SUFFcEM7O09BRUc7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RyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSw4QkFBdUIsQ0FBQyxJQUFBLHNCQUFHLEVBQUEscUJBQXFCLEVBQUUseURBQXlELE1BQU0sQ0FBQyxJQUFJLGtCQUFrQixDQUFDLENBQUM7UUFDdEosQ0FBQztRQUNELEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQ2ZuVGFibGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtZ2x1ZSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBLZXlHcmFudHMgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB0eXBlICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHR5cGUgeyBJUmVzb3VyY2UgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IEFybkZvcm1hdCwgQ3VzdG9tUmVzb3VyY2UsIER1cmF0aW9uLCBGbiwgTGF6eSwgTmFtZXMsIFJlc291cmNlLCBTdGFjaywgVG9rZW4sIFVuc2NvcGVkVmFsaWRhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICdhd3MtY2RrLWxpYi9jb3JlJztcbmltcG9ydCB7IGxpdCwgbWQ1aGFzaCB9IGZyb20gJ2F3cy1jZGstbGliL2NvcmUvbGliL2hlbHBlcnMtaW50ZXJuYWwnO1xuaW1wb3J0ICogYXMgY3IgZnJvbSAnYXdzLWNkay1saWIvY3VzdG9tLXJlc291cmNlcyc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB0eXBlIHsgRGF0YUZvcm1hdCB9IGZyb20gJy4vZGF0YS1mb3JtYXQnO1xuaW1wb3J0IHR5cGUgeyBJRGF0YWJhc2UgfSBmcm9tICcuL2RhdGFiYXNlJztcbmltcG9ydCB7IGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMsIHR5cGUgUGFydGl0aW9uUHJvamVjdGlvbiB9IGZyb20gJy4vcGFydGl0aW9uLXByb2plY3Rpb24nO1xuaW1wb3J0IHR5cGUgeyBDb2x1bW4gfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgdHlwZSB7IFN0b3JhZ2VQYXJhbWV0ZXIgfSBmcm9tICcuL3N0b3JhZ2UtcGFyYW1ldGVyJztcbmltcG9ydCB7IFBhcnRpdGlvbkluZGV4SXNDb21wbGV0ZUZ1bmN0aW9uLCBQYXJ0aXRpb25JbmRleE9uRXZlbnRGdW5jdGlvbiB9IGZyb20gJy4uL2N1c3RvbS1yZXNvdXJjZS1oYW5kbGVycy9kaXN0L2F3cy1nbHVlLWFscGhhL3BhcnRpdGlvbi1pbmRleC1wcm92aWRlci5nZW5lcmF0ZWQnO1xuXG4vKipcbiAqIFByb3BlcnRpZXMgb2YgYSBQYXJ0aXRpb24gSW5kZXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFydGl0aW9uSW5kZXgge1xuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIHBhcnRpdGlvbiBpbmRleC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBhIG5hbWUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHlvdS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4TmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBhcnRpdGlvbiBrZXkgbmFtZXMgdGhhdCBjb21wcmlzZSB0aGUgcGFydGl0aW9uXG4gICAqIGluZGV4LiBUaGUgbmFtZXMgbXVzdCBjb3JyZXNwb25kIHRvIGEgbmFtZSBpbiB0aGVcbiAgICogdGFibGUncyBwYXJ0aXRpb24ga2V5cy5cbiAgICovXG4gIHJlYWRvbmx5IGtleU5hbWVzOiBzdHJpbmdbXTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSVRhYmxlIGV4dGVuZHMgSVJlc291cmNlIHtcbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBhdHRyaWJ1dGVcbiAgICovXG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQXR0cmlidXRlcyB7XG4gIHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHRhYmxlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlQmFzZVByb3BzIHtcbiAgLyoqXG4gICAqIE5hbWUgb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIGdlbmVyYXRlZCBieSBDREsuXG4gICAqL1xuICByZWFkb25seSB0YWJsZU5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIERlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZ2VuZXJhdGVkXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbj86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YWJhc2UgaW4gd2hpY2ggdG8gc3RvcmUgdGhlIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YWJhc2U6IElEYXRhYmFzZTtcblxuICAvKipcbiAgICogQ29sdW1ucyBvZiB0aGUgdGFibGUuXG4gICAqL1xuICByZWFkb25seSBjb2x1bW5zOiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGNvbHVtbnMgb2YgdGhlIHRhYmxlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0YWJsZSBpcyBub3QgcGFydGl0aW9uZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGluZGV4ZXMgb24gdGhlIHRhYmxlLiBBIG1heGltdW0gb2YgMyBpbmRleGVzXG4gICAqIGFyZSBhbGxvd2VkIG9uIGEgdGFibGUuIEtleXMgaW4gdGhlIGluZGV4IG11c3QgYmUgcGFydFxuICAgKiBvZiB0aGUgdGFibGUncyBwYXJ0aXRpb24ga2V5cy5cbiAgICpcbiAgICogQGRlZmF1bHQgdGFibGUgaGFzIG5vIHBhcnRpdGlvbiBpbmRleGVzXG4gICAqL1xuICByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICAvKipcbiAgICogU3RvcmFnZSB0eXBlIG9mIHRoZSB0YWJsZSdzIGRhdGEuXG4gICAqL1xuICByZWFkb25seSBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdGFibGUncyBkYXRhIGlzIGNvbXByZXNzZWQgb3Igbm90LlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgY29tcHJlc3NlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSBkYXRhIGlzIHN0b3JlZCBpbiBzdWJkaXJlY3Rvcmllcy5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHN0b3JlZEFzU3ViRGlyZWN0b3JpZXM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFbmFibGVzIHBhcnRpdGlvbiBmaWx0ZXJpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvZ2x1ZS1iZXN0LXByYWN0aWNlcy5odG1sI2dsdWUtYmVzdC1wcmFjdGljZXMtcGFydGl0aW9uLWluZGV4XG4gICAqXG4gICAqIEBkZWZhdWx0IC0gVGhlIHBhcmFtZXRlciBpcyBub3QgZGVmaW5lZFxuICAgKi9cbiAgcmVhZG9ubHkgZW5hYmxlUGFydGl0aW9uRmlsdGVyaW5nPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHVzZXItc3VwcGxpZWQgcHJvcGVydGllcyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwaHlzaWNhbCBzdG9yYWdlIG9mIHRoaXMgdGFibGUuIFRoZXNlIHByb3BlcnRpZXMgaGVscCBkZXNjcmliZSB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIHRoYXQgaXMgc3RvcmVkIHdpdGhpbiB0aGUgY3Jhd2xlZCBkYXRhIHNvdXJjZXMuXG4gICAqXG4gICAqIFRoZSBrZXkvdmFsdWUgcGFpcnMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBzdWJtaXR0ZWQgYXJlIG5vdCBsaW1pdGVkLCBob3dldmVyIHRoZWlyIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGd1YXJhbnRlZWQuXG4gICAqXG4gICAqIFNvbWUga2V5cyB3aWxsIGJlIGF1dG8tcG9wdWxhdGVkIGJ5IGdsdWUgY3Jhd2xlcnMsIGhvd2V2ZXIsIHlvdSBjYW4gb3ZlcnJpZGUgdGhlbSBieSBzcGVjaWZ5aW5nIHRoZSBrZXkgYW5kIHZhbHVlIGluIHRoaXMgcHJvcGVydHkuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2dsdWUvbGF0ZXN0L2RnL3RhYmxlLXByb3BlcnRpZXMtY3Jhd2xlci5odG1sXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL3JlZHNoaWZ0L2xhdGVzdC9kZy9yX0NSRUFURV9FWFRFUk5BTF9UQUJMRS5odG1sI3JfQ1JFQVRFX0VYVEVSTkFMX1RBQkxFLXBhcmFtZXRlcnMgLSB1bmRlciBfXCJUQUJMRSBQUk9QRVJUSUVTXCJfXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGRlY2xhcmUgY29uc3QgZ2x1ZURhdGFiYXNlOiBnbHVlLklEYXRhYmFzZTtcbiAgICogICAgY29uc3QgdGFibGUgPSBuZXcgZ2x1ZS5TM1RhYmxlKHRoaXMsICdUYWJsZScsIHtcbiAgICogICAgICBzdG9yYWdlUGFyYW1ldGVyczogW1xuICAgKiAgICAgICAgICBnbHVlLlN0b3JhZ2VQYXJhbWV0ZXIuc2tpcEhlYWRlckxpbmVDb3VudCgxKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmNvbXByZXNzaW9uVHlwZShnbHVlLkNvbXByZXNzaW9uVHlwZS5HWklQKSxcbiAgICogICAgICAgICAgZ2x1ZS5TdG9yYWdlUGFyYW1ldGVyLmN1c3RvbSgnZm9vJywgJ2JhcicpLCAvLyBXaWxsIGhhdmUgbm8gZWZmZWN0XG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oJ3NlcGFyYXRvckNoYXInLCAnLCcpLCAvLyBXaWxsIGRlc2NyaWJlIHRoZSBzZXBhcmF0b3IgY2hhciB1c2VkIGluIHRoZSBkYXRhXG4gICAqICAgICAgICAgIGdsdWUuU3RvcmFnZVBhcmFtZXRlci5jdXN0b20oZ2x1ZS5TdG9yYWdlUGFyYW1ldGVycy5XUklURV9QQVJBTExFTCwgJ29mZicpLFxuICAgKiAgICAgIF0sXG4gICAqICAgICAgLy8gLi4uXG4gICAqICAgICAgZGF0YWJhc2U6IGdsdWVEYXRhYmFzZSxcbiAgICogICAgICBjb2x1bW5zOiBbe1xuICAgKiAgICAgICAgICBuYW1lOiAnY29sMScsXG4gICAqICAgICAgICAgIHR5cGU6IGdsdWUuU2NoZW1hLlNUUklORyxcbiAgICogICAgICB9XSxcbiAgICogICAgICBkYXRhRm9ybWF0OiBnbHVlLkRhdGFGb3JtYXQuQ1NWLFxuICAgKiAgICB9KTtcbiAgICpcbiAgICogQGRlZmF1bHQgLSBUaGUgcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkXG4gICAqL1xuICByZWFkb25seSBzdG9yYWdlUGFyYW1ldGVycz86IFN0b3JhZ2VQYXJhbWV0ZXJbXTtcblxuICAvKipcbiAgICogVGhlIGtleS92YWx1ZSBwYWlycyBkZWZpbmUgcHJvcGVydGllcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhYmxlLlxuICAgKiBUaGUga2V5L3ZhbHVlIHBhaXJzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgc3VibWl0dGVkIGFyZSBub3QgbGltaXRlZCwgaG93ZXZlciB0aGVpciBmdW5jdGlvbmFsaXR5IGlzIG5vdCBndWFyYW50ZWVkLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9BV1NDbG91ZEZvcm1hdGlvbi9sYXRlc3QvVXNlckd1aWRlL2F3cy1wcm9wZXJ0aWVzLWdsdWUtdGFibGUtdGFibGVpbnB1dC5odG1sI2Nmbi1nbHVlLXRhYmxlLXRhYmxlaW5wdXQtcGFyYW1ldGVyc1xuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBwYXJhbWV0ZXIgaXMgbm90IGRlZmluZWRcbiAgICovXG4gIHJlYWRvbmx5IHBhcmFtZXRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkLlxuICAgKlxuICAgKiBUaGlzIHNldHMgdGhlIGBoYXNfZW5jcnlwdGVkX2RhdGFgIHRhYmxlIHBhcmFtZXRlci4gQXRoZW5hIHJlYWRzIGl0IHdoZW5cbiAgICogcXVlcnlpbmcgY2xpZW50LXNpZGUgKENTRS1LTVMpIGVuY3J5cHRlZCBkYXRhc2V0czsgZm9yIHNlcnZlci1zaWRlXG4gICAqIGVuY3J5cHRlZCAoU1NFLVMzIC8gU1NFLUtNUykgb3IgdW5lbmNyeXB0ZWQgZGF0YSBpdCBoYXMgbm8gZWZmZWN0LCBzaW5jZVxuICAgKiBBbWF6b24gUzMgZGVjcnlwdHMgc2VydmVyLXNpZGUgZW5jcnlwdGVkIG9iamVjdHMgdHJhbnNwYXJlbnRseS5cbiAgICpcbiAgICogRG8gbm90IGFsc28gc2V0IGBoYXNfZW5jcnlwdGVkX2RhdGFgIHRocm91Z2ggYHBhcmFtZXRlcnNgIC0gdXNlIHRoaXNcbiAgICogcHJvcGVydHkgaW5zdGVhZC4gQSBjb25mbGljdGluZyB2YWx1ZSBpbiBgcGFyYW1ldGVyc2AgaXMgcmVqZWN0ZWQuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9kb2NzLmF3cy5hbWF6b24uY29tL2F0aGVuYS9sYXRlc3QvdWcvY3JlYXRpbmctdGFibGVzLWJhc2VkLW9uLWVuY3J5cHRlZC1kYXRhc2V0cy1pbi1zMy5odG1sXG4gICAqXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IGhhc0VuY3J5cHRlZERhdGE/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGZvciB0aGlzIHRhYmxlLlxuICAgKlxuICAgKiBQYXJ0aXRpb24gcHJvamVjdGlvbiBhbGxvd3MgQXRoZW5hIHRvIGF1dG9tYXRpY2FsbHkgYWRkIG5ldyBwYXJ0aXRpb25zXG4gICAqIHdpdGhvdXQgcmVxdWlyaW5nIGBBTFRFUiBUQUJMRSBBREQgUEFSVElUSU9OYCBzdGF0ZW1lbnRzLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vZG9jcy5hd3MuYW1hem9uLmNvbS9hdGhlbmEvbGF0ZXN0L3VnL3BhcnRpdGlvbi1wcm9qZWN0aW9uLmh0bWxcbiAgICpcbiAgICogQGRlZmF1bHQgLSBObyBwYXJ0aXRpb24gcHJvamVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG59XG5cbi8qKlxuICogQSBHbHVlIHRhYmxlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGFibGVCYXNlIGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUFybihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCB0YWJsZUFybjogc3RyaW5nKTogSVRhYmxlIHtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSBGbi5zZWxlY3QoMSwgRm4uc3BsaXQoJy8nLCBTdGFjay5vZihzY29wZSkuc3BsaXRBcm4odGFibGVBcm4sIEFybkZvcm1hdC5TTEFTSF9SRVNPVVJDRV9OQU1FKS5yZXNvdXJjZU5hbWUhKSk7XG5cbiAgICByZXR1cm4gVGFibGVCYXNlLmZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGUsIGlkLCB7XG4gICAgICB0YWJsZUFybixcbiAgICAgIHRhYmxlTmFtZSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgVGFibGUgY29uc3RydWN0IHRoYXQgcmVwcmVzZW50cyBhbiBleHRlcm5hbCB0YWJsZS5cbiAgICpcbiAgICogQHBhcmFtIHNjb3BlIFRoZSBzY29wZSBjcmVhdGluZyBjb25zdHJ1Y3QgKHVzdWFsbHkgYHRoaXNgKS5cbiAgICogQHBhcmFtIGlkIFRoZSBjb25zdHJ1Y3QncyBpZC5cbiAgICogQHBhcmFtIGF0dHJzIEltcG9ydCBhdHRyaWJ1dGVzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGZyb21UYWJsZUF0dHJpYnV0ZXMoc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgYXR0cnM6IFRhYmxlQXR0cmlidXRlcyk6IElUYWJsZSB7XG4gICAgY2xhc3MgSW1wb3J0IGV4dGVuZHMgUmVzb3VyY2UgaW1wbGVtZW50cyBJVGFibGUge1xuICAgICAgcHVibGljIHJlYWRvbmx5IHRhYmxlQXJuID0gYXR0cnMudGFibGVBcm47XG4gICAgICBwdWJsaWMgcmVhZG9ubHkgdGFibGVOYW1lID0gYXR0cnMudGFibGVOYW1lO1xuICAgIH1cblxuICAgIHJldHVybiBuZXcgSW1wb3J0KHNjb3BlLCBpZCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgdGFibGVSZXNvdXJjZTogQ2ZuVGFibGU7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSB0YWJsZU5hbWU6IHN0cmluZztcbiAgcHVibGljIGFic3RyYWN0IHJlYWRvbmx5IHRhYmxlQXJuOiBzdHJpbmc7XG4gIHB1YmxpYyBhYnN0cmFjdCByZWFkb25seSBwYXJ0aXRpb25JbmRleGVzPzogUGFydGl0aW9uSW5kZXhbXTtcblxuICAvKipcbiAgICogRGF0YWJhc2UgdGhpcyB0YWJsZSBiZWxvbmdzIHRvLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFiYXNlOiBJRGF0YWJhc2U7XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSB0YWJsZSdzIGRhdGEgaXMgY29tcHJlc3NlZCBvciBub3QuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgY29tcHJlc3NlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogRm9ybWF0IG9mIHRoaXMgdGFibGUncyBkYXRhIGZpbGVzLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBjb2x1bW5zLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IGNvbHVtbnM6IENvbHVtbltdO1xuXG4gIC8qKlxuICAgKiBUaGlzIHRhYmxlJ3MgcGFydGl0aW9uIGtleXMgaWYgdGhlIHRhYmxlIGlzIHBhcnRpdGlvbmVkLlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHBhcnRpdGlvbktleXM/OiBDb2x1bW5bXTtcblxuICAvKipcbiAgICogVGhlIHRhYmxlcycgc3RvcmFnZSBkZXNjcmlwdG9yIHByb3BlcnRpZXMuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgc3RvcmFnZVBhcmFtZXRlcnM/OiBTdG9yYWdlUGFyYW1ldGVyW107XG5cbiAgLyoqXG4gICAqIFRoaXMgdGFibGUncyBwYXJ0aXRpb24gcHJvamVjdGlvbiBjb25maWd1cmF0aW9uIGlmIGVuYWJsZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGFydGl0aW9uUHJvamVjdGlvbj86IFBhcnRpdGlvblByb2plY3Rpb247XG5cbiAgLyoqXG4gICAqIFRoZSB0YWJsZXMnIHByb3BlcnRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0YWJsZS5cbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vQVdTQ2xvdWRGb3JtYXRpb24vbGF0ZXN0L1VzZXJHdWlkZS9hd3MtcHJvcGVydGllcy1nbHVlLXRhYmxlLXRhYmxlaW5wdXQuaHRtbCNjZm4tZ2x1ZS10YWJsZS10YWJsZWlucHV0LXBhcmFtZXRlcnNcbiAgICovXG4gIHByb3RlY3RlZCByZWFkb25seSBwYXJhbWV0ZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBkYXRhIHN0b3JlZCBpbiB0aGUgdGFibGUgaXMgZW5jcnlwdGVkLiBFbWl0dGVkIGFzIHRoZVxuICAgKiBgaGFzX2VuY3J5cHRlZF9kYXRhYCB0YWJsZSBwYXJhbWV0ZXIuXG4gICAqL1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaGFzRW5jcnlwdGVkRGF0YTogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGFydGl0aW9uIGluZGV4ZXMgbXVzdCBiZSBjcmVhdGVkIG9uZSBhdCBhIHRpbWUuIFRvIGF2b2lkXG4gICAqIHJhY2UgY29uZGl0aW9ucywgd2Ugc3RvcmUgdGhlIHJlc291cmNlIGFuZCBhZGQgZGVwZW5kZW5jaWVzXG4gICAqIGVhY2ggdGltZSBhIG5ldyBwYXJ0aXRpb24gaW5kZXggaXMgY3JlYXRlZC5cbiAgICovXG4gIHByaXZhdGUgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXM6IEN1c3RvbVJlc291cmNlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nLCBwcm9wczogVGFibGVCYXNlUHJvcHMpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHtcbiAgICAgIHBoeXNpY2FsTmFtZTogcHJvcHMudGFibGVOYW1lID8/XG4gICAgICAgIExhenkuc3RyaW5nKHtcbiAgICAgICAgICBwcm9kdWNlOiAoKSA9PiBOYW1lcy51bmlxdWVSZXNvdXJjZU5hbWUodGhpcywge30pLnRvTG93ZXJDYXNlKCksXG4gICAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgdGhpcy5kYXRhYmFzZSA9IHByb3BzLmRhdGFiYXNlO1xuICAgIHRoaXMuZGF0YUZvcm1hdCA9IHByb3BzLmRhdGFGb3JtYXQ7XG5cbiAgICB2YWxpZGF0ZVNjaGVtYShwcm9wcy5jb2x1bW5zLCBwcm9wcy5wYXJ0aXRpb25LZXlzKTtcbiAgICB0aGlzLmNvbHVtbnMgPSBwcm9wcy5jb2x1bW5zO1xuICAgIHRoaXMucGFydGl0aW9uS2V5cyA9IHByb3BzLnBhcnRpdGlvbktleXM7XG4gICAgdGhpcy5zdG9yYWdlUGFyYW1ldGVycyA9IHByb3BzLnN0b3JhZ2VQYXJhbWV0ZXJzO1xuICAgIHRoaXMucGFydGl0aW9uUHJvamVjdGlvbiA9IHByb3BzLnBhcnRpdGlvblByb2plY3Rpb247XG4gICAgdGhpcy5wYXJhbWV0ZXJzID0gcHJvcHMucGFyYW1ldGVycyA/PyB7fTtcblxuICAgIHRoaXMuaGFzRW5jcnlwdGVkRGF0YSA9IHByb3BzLmhhc0VuY3J5cHRlZERhdGEgPz8gdHJ1ZTtcbiAgICB0aGlzLnJlY29uY2lsZUhhc0VuY3J5cHRlZERhdGEoKTtcblxuICAgIHRoaXMuY29tcHJlc3NlZCA9IHByb3BzLmNvbXByZXNzZWQgPz8gZmFsc2U7XG5cbiAgICB0aGlzLnZhbGlkYXRlQW5kR2VuZXJhdGVQYXJ0aXRpb25Qcm9qZWN0aW9uKCk7XG4gIH1cblxuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRSZWFkKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuICBwdWJsaWMgYWJzdHJhY3QgZ3JhbnRXcml0ZShncmFudGVlOiBpYW0uSUdyYW50YWJsZSk6IGlhbS5HcmFudDtcbiAgcHVibGljIGFic3RyYWN0IGdyYW50UmVhZFdyaXRlKGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlKTogaWFtLkdyYW50O1xuXG4gIC8qKlxuICAgKiBBZGQgYSBwYXJ0aXRpb24gaW5kZXggdG8gdGhlIHRhYmxlLiBZb3UgY2FuIGhhdmUgYSBtYXhpbXVtIG9mIDMgcGFydGl0aW9uXG4gICAqIGluZGV4ZXMgdG8gYSB0YWJsZS4gUGFydGl0aW9uIGluZGV4IGtleXMgbXVzdCBiZSBhIHN1YnNldCBvZiB0aGUgdGFibGUnc1xuICAgKiBwYXJ0aXRpb24ga2V5cy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vZ2x1ZS9sYXRlc3QvZGcvcGFydGl0aW9uLWluZGV4ZXMuaHRtbFxuICAgKi9cbiAgcHVibGljIGFkZFBhcnRpdGlvbkluZGV4KGluZGV4OiBQYXJ0aXRpb25JbmRleCkge1xuICAgIGNvbnN0IG51bVBhcnRpdGlvbnMgPSB0aGlzLnBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2VzLmxlbmd0aDtcbiAgICBpZiAobnVtUGFydGl0aW9ucyA+PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBNYXhQYXJ0aXRpb25JbmRleGVzRXhjZWVkZWRgLCAnTWF4aW11bSBudW1iZXIgb2YgcGFydGl0aW9uIGluZGV4ZXMgYWxsb3dlZCBpcyAzJywgdGhpcyk7XG4gICAgfVxuICAgIHRoaXMudmFsaWRhdGVQYXJ0aXRpb25JbmRleChpbmRleCk7XG5cbiAgICBjb25zdCBpbmRleE5hbWUgPSBpbmRleC5pbmRleE5hbWUgPz8gdGhpcy5nZW5lcmF0ZUluZGV4TmFtZShpbmRleC5rZXlOYW1lcyk7XG4gICAgY29uc3QgcHJvdmlkZXIgPSBQYXJ0aXRpb25JbmRleFByb3ZpZGVyLmdldE9yQ3JlYXRlKHRoaXMpO1xuXG4gICAgLy8gVGhlIGdyYW50cyBhcmUgaWRlbnRpY2FsIGZvciBldmVyeSBpbmRleCBvbiB0aGlzIHRhYmxlLCBzbyBvbmx5IGFkZCB0aGVtXG4gICAgLy8gb25jZS5cbiAgICBpZiAobnVtUGFydGl0aW9ucyA9PT0gMCkge1xuICAgICAgLy8gQWRkIHNjb3BlZCBwZXJtaXNzaW9ucyBmb3IgdGhpcyB0YWJsZSdzIEdsdWUgcmVzb3VyY2VzXG4gICAgICAvLyBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vc2VydmljZS1hdXRob3JpemF0aW9uL2xhdGVzdC9yZWZlcmVuY2UvbGlzdF9hd3NnbHVlLmh0bWxcbiAgICAgIGNvbnN0IHJlc291cmNlcyA9IFt0aGlzLnRhYmxlQXJuLCB0aGlzLmRhdGFiYXNlLmRhdGFiYXNlQXJuLCB0aGlzLmRhdGFiYXNlLmNhdGFsb2cuY2F0YWxvZ0Fybl07XG5cbiAgICAgIC8vIFRoZSBjYXRhbG9nJ3MgZW5jcnlwdGlvbiBpcyBmaXhlZCBhdCBjb25zdHJ1Y3Rpb24sIHNvIHRoZSBlbmNyeXB0aW9uIGtleVxuICAgICAgLy8gKGlmIGFueSkgaXMga25vd24gaGVyZS4gR3JhbnQgdGhlIGhhbmRsZXJzIGFjY2VzcyB0byBpdC4gTm8tb3Agd2hlbiB0aGVcbiAgICAgIC8vIGNhdGFsb2cgdXNlcyBhbiBBV1MtbWFuYWdlZCBrZXkgb3Igbm8gZW5jcnlwdGlvbi5cbiAgICAgIGNvbnN0IGtleSA9IHRoaXMuZGF0YWJhc2UuY2F0YWxvZy5lbmNyeXB0aW9uS2V5O1xuICAgICAgaWYgKGtleSkge1xuICAgICAgICBjb25zdCBncmFudHMgPSBLZXlHcmFudHMuZnJvbUtleShrZXkpO1xuICAgICAgICBncmFudHMuZGVjcnlwdChwcm92aWRlci5vbkV2ZW50SGFuZGxlcik7XG4gICAgICAgIGdyYW50cy5kZWNyeXB0KHByb3ZpZGVyLmlzQ29tcGxldGVIYW5kbGVyKTtcbiAgICAgIH1cblxuICAgICAgLy8gQm90aCBoYW5kbGVycyBjcmVhdGUsIGRlbGV0ZSwgYW5kIGluc3BlY3QgaW5kZXhlczogb25FdmVudCBjcmVhdGVzL2RlbGV0ZXMgb25cbiAgICAgIC8vIENyZWF0ZS9EZWxldGUvVXBkYXRlLCBhbmQgaXNDb21wbGV0ZSByZWNyZWF0ZXMgdGhlIGluZGV4IHdoaWxlIGRyaXZpbmcgYVxuICAgICAgLy8ga2V5LWNoYW5nZSB1cGRhdGUgKGRlbGV0ZSAtPiByZWNyZWF0ZSAtPiBBQ1RJVkUpLiBVcGRhdGVUYWJsZS9HZXRUYWJsZSBhcmVcbiAgICAgIC8vIHJlcXVpcmVkIGJ5IHRoZSBDcmVhdGVQYXJ0aXRpb25JbmRleC9EZWxldGVQYXJ0aXRpb25JbmRleCBBUElzLlxuICAgICAgY29uc3QgYWN0aW9ucyA9IFtcbiAgICAgICAgJ2dsdWU6R2V0UGFydGl0aW9uSW5kZXhlcycsXG4gICAgICAgICdnbHVlOkNyZWF0ZVBhcnRpdGlvbkluZGV4JyxcbiAgICAgICAgJ2dsdWU6RGVsZXRlUGFydGl0aW9uSW5kZXgnLFxuICAgICAgICAnZ2x1ZTpHZXRUYWJsZScsXG4gICAgICAgICdnbHVlOlVwZGF0ZVRhYmxlJyxcbiAgICAgIF07XG4gICAgICBwcm92aWRlci5vbkV2ZW50SGFuZGxlci5hZGRUb1JvbGVQb2xpY3kobmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoeyBhY3Rpb25zLCByZXNvdXJjZXMgfSkpO1xuICAgICAgcHJvdmlkZXIuaXNDb21wbGV0ZUhhbmRsZXIuYWRkVG9Sb2xlUG9saWN5KG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHsgYWN0aW9ucywgcmVzb3VyY2VzIH0pKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlID0gbmV3IEN1c3RvbVJlc291cmNlKHRoaXMsIGBwYXJ0aXRpb24taW5kZXgtJHtpbmRleE5hbWV9YCwge1xuICAgICAgcmVzb3VyY2VUeXBlOiAnQ3VzdG9tOjpHbHVlUGFydGl0aW9uSW5kZXgnLFxuICAgICAgc2VydmljZVRva2VuOiBwcm92aWRlci5zZXJ2aWNlVG9rZW4sXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIERhdGFiYXNlTmFtZTogdGhpcy5kYXRhYmFzZS5kYXRhYmFzZU5hbWUsXG4gICAgICAgIFRhYmxlTmFtZTogdGhpcy50YWJsZU5hbWUsXG4gICAgICAgIEluZGV4TmFtZTogaW5kZXhOYW1lLFxuICAgICAgICBLZXlzOiBpbmRleC5rZXlOYW1lcyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBFbnN1cmUgSUFNIHBvbGljaWVzIGFyZSBjcmVhdGVkIGJlZm9yZSB0aGUgY3VzdG9tIHJlc291cmNlIGludm9rZXMgdGhlIGhhbmRsZXJzXG4gICAgcGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZS5ub2RlLmFkZERlcGVuZGVuY3kocHJvdmlkZXIub25FdmVudEhhbmRsZXIucm9sZSEpO1xuICAgIHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHByb3ZpZGVyLmlzQ29tcGxldGVIYW5kbGVyLnJvbGUhKTtcblxuICAgIC8vIERlcGVuZCBvbiBwcmV2aW91cyBwYXJ0aXRpb24gaW5kZXggdG8gYXZvaWQgcmFjZSBjb25kaXRpb25cbiAgICBpZiAobnVtUGFydGl0aW9ucyA+IDApIHtcbiAgICAgIHBhcnRpdGlvbkluZGV4Q3VzdG9tUmVzb3VyY2Uubm9kZS5hZGREZXBlbmRlbmN5KHRoaXMucGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXNbbnVtUGFydGl0aW9ucy0xXSk7XG4gICAgfVxuICAgIHRoaXMucGFydGl0aW9uSW5kZXhDdXN0b21SZXNvdXJjZXMucHVzaChwYXJ0aXRpb25JbmRleEN1c3RvbVJlc291cmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2VuZXJhdGVJbmRleE5hbWUoa2V5czogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGNvbnN0IG1heEluZGV4TGVuZ3RoID0gODA7XG4gICAgaWYgKFRva2VuLmlzVW5yZXNvbHZlZChrZXlzKSB8fCBrZXlzLnNvbWUoayA9PiBUb2tlbi5pc1VucmVzb2x2ZWQoaykpKSB7XG4gICAgICAvLyBUaGUgaW5kZXggbmFtZSBpcyBkZXJpdmVkIGZyb20gdGhlIGtleSBuYW1lcywgc28gdG9rZW5pemVkIGtleXMgbGVhdmVcbiAgICAgIC8vIG5vdGhpbmcgc3RhYmxlIHRvIGdlbmVyYXRlIGZyb206IGFueSBhdXRvLWdlbmVyYXRlZCBuYW1lIHdvdWxkIGhhdmUgdG9cbiAgICAgIC8vIGZhbGwgYmFjayB0byB0aGUgaW5kZXgncyBwb3NpdGlvbiBvbiB0aGUgdGFibGUsIHdoaWNoIHNoaWZ0cyBpZiBpbmRleGVzXG4gICAgICAvLyBhcmUgYWRkZWQsIHJlbW92ZWQsIG9yIHJlb3JkZXJlZCAtIHNpbGVudGx5IHJlcGxhY2luZyBpbmRleGVzIHRoYXQgZGlkXG4gICAgICAvLyBub3QgYWN0dWFsbHkgY2hhbmdlLiBSZXF1aXJlIGFuIGV4cGxpY2l0LCBzdGFibGUgbmFtZSBpbnN0ZWFkLlxuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgbGl0YFRva2VuaXplZEluZGV4S2V5c1JlcXVpcmVOYW1lYCxcbiAgICAgICAgJ2Nhbm5vdCBhdXRvLWdlbmVyYXRlIGEgc3RhYmxlIHBhcnRpdGlvbiBpbmRleCBuYW1lIGZyb20gdG9rZW5pemVkIGtleSBuYW1lczsgJyArXG4gICAgICAgICAgJ3NwZWNpZnkgYGluZGV4TmFtZWAgZXhwbGljaXRseSB3aGVuIGluZGV4IGtleXMgYXJlIG5vdCBrbm93biBhdCBzeW50aGVzaXMgdGltZScsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCBwcmVmaXggPSBrZXlzLmpvaW4oJy0nKSArICctJztcbiAgICBjb25zdCB1bmlxdWVJZCA9IE5hbWVzLnVuaXF1ZUlkKHRoaXMpO1xuICAgIGlmIChwcmVmaXgubGVuZ3RoIDwgbWF4SW5kZXhMZW5ndGgpIHtcbiAgICAgIC8vIENvbW1vbiBjYXNlOiB0cmltIHRoZSB1bmlxdWVJZCB0YWlsIHNvIHRoZSB3aG9sZSBuYW1lIGZpdHMgdW5kZXIgdGhlIGNhcC5cbiAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBNYXRoLm1heCgwLCB1bmlxdWVJZC5sZW5ndGggLSAobWF4SW5kZXhMZW5ndGggLSBwcmVmaXgubGVuZ3RoKSk7XG4gICAgICByZXR1cm4gcHJlZml4ICsgdW5pcXVlSWQuc3Vic3RyaW5nKHN0YXJ0SW5kZXgpO1xuICAgIH1cbiAgICAvLyBUaGUgam9pbmVkIGtleSBuYW1lcyBhbG9uZSBleGNlZWQgdGhlIGJ1ZGdldCAobG9uZyBrZXkgbmFtZXMpLCBzbyB0cmltbWluZ1xuICAgIC8vIHRoZSB1bmlxdWVJZCBpcyBub3QgZW5vdWdoLiBUcnVuY2F0ZSB0aGUgcHJlZml4IGFuZCBhcHBlbmQgYSBoYXNoIG9mIHRoZVxuICAgIC8vIHRhYmxlIHBhdGggcGx1cyB0aGUgZnVsbCBrZXkgbGlzdCwgc28gdHdvIGRpZmZlcmVudCAobG9uZykga2V5IHNldHMgY2Fubm90XG4gICAgLy8gY29sbGlkZSBhZnRlciB0cnVuY2F0aW9uLlxuICAgIGNvbnN0IGhhc2ggPSBtZDVoYXNoKHVuaXF1ZUlkICsgJy0nICsga2V5cy5qb2luKCctJykpLnNsaWNlKDAsIDgpO1xuICAgIHJldHVybiBwcmVmaXguc3Vic3RyaW5nKDAsIG1heEluZGV4TGVuZ3RoIC0gaGFzaC5sZW5ndGggLSAxKSArICctJyArIGhhc2g7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25jaWxlIGEgYGhhc19lbmNyeXB0ZWRfZGF0YWAgdmFsdWUgc3VwcGxpZWQgdGhyb3VnaCB0aGUgZnJlZS1mb3JtXG4gICAqIGBwYXJhbWV0ZXJzYCBtYXAgd2l0aCB0aGUgdHlwZWQgYGhhc0VuY3J5cHRlZERhdGFgIHByb3BlcnR5LlxuICAgKlxuICAgKiBgaGFzX2VuY3J5cHRlZF9kYXRhYCBpcyBtYW5hZ2VkIGJ5IHRoaXMgY29uc3RydWN0IGFuZCBlbWl0dGVkIGF1dGhvcml0YXRpdmVseVxuICAgKiBmcm9tIGBoYXNFbmNyeXB0ZWREYXRhYC4gU3VwcGx5aW5nIGl0IHRocm91Z2ggYHBhcmFtZXRlcnNgIGFzIHdlbGwgaXMgb25seVxuICAgKiB0b2xlcmF0ZWQgd2hlbiB0aGUgdmFsdWUgaXMgaWRlbnRpY2FsOyBhIGRpZmZlcmluZyAob3IgdW5yZXNvbHZlZCkgdmFsdWUgaXNcbiAgICogcmVqZWN0ZWQgc28gdGhlIHR3byBpbnB1dHMgY2FuIG5ldmVyIHNpbGVudGx5IGRpc2FncmVlLiBPbiBzdWNjZXNzIHRoZSBrZXkgaXNcbiAgICogcmVtb3ZlZCBmcm9tIHRoZSBmcmVlLWZvcm0gbWFwIHNvIHRoZSBtYW5hZ2VkIHZhbHVlIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mXG4gICAqIHRydXRoLlxuICAgKi9cbiAgcHJpdmF0ZSByZWNvbmNpbGVIYXNFbmNyeXB0ZWREYXRhKCk6IHZvaWQge1xuICAgIGNvbnN0IGtleSA9ICdoYXNfZW5jcnlwdGVkX2RhdGEnO1xuICAgIGlmICghKGtleSBpbiB0aGlzLnBhcmFtZXRlcnMpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHN1cHBsaWVkID0gdGhpcy5wYXJhbWV0ZXJzW2tleV07XG4gICAgY29uc3QgbWFuYWdlZCA9IFN0cmluZyh0aGlzLmhhc0VuY3J5cHRlZERhdGEpO1xuICAgIGlmIChUb2tlbi5pc1VucmVzb2x2ZWQoc3VwcGxpZWQpIHx8IHN1cHBsaWVkICE9PSBtYW5hZ2VkKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgSGFzRW5jcnlwdGVkRGF0YUNvbmZsaWN0YCxcbiAgICAgICAgYHRoZSBcXGAke2tleX1cXGAgdGFibGUgcGFyYW1ldGVyIGlzIG1hbmFnZWQgYnkgdGhlIFxcYGhhc0VuY3J5cHRlZERhdGFcXGAgcHJvcGVydHk7IGAgK1xuICAgICAgICAgIGByZW1vdmUgaXQgZnJvbSBcXGBwYXJhbWV0ZXJzXFxgIGFuZCB1c2UgdGhlIGJvb2xlYW4gXFxgaGFzRW5jcnlwdGVkRGF0YVxcYCBwcm9wZXJ0eSBpbnN0ZWFkIChnb3QgJHtKU09OLnN0cmluZ2lmeShzdXBwbGllZCl9LCBleHBlY3RlZCAke0pTT04uc3RyaW5naWZ5KG1hbmFnZWQpfSlgLFxuICAgICAgICB0aGlzLFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVsZXRlIHRoaXMucGFyYW1ldGVyc1trZXldO1xuICB9XG5cbiAgcHJpdmF0ZSB2YWxpZGF0ZVBhcnRpdGlvbkluZGV4KGluZGV4OiBQYXJ0aXRpb25JbmRleCkge1xuICAgIGlmIChpbmRleC5pbmRleE5hbWUgIT09IHVuZGVmaW5lZCAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKGluZGV4LmluZGV4TmFtZSkgJiYgKGluZGV4LmluZGV4TmFtZS5sZW5ndGggPCAxIHx8IGluZGV4LmluZGV4TmFtZS5sZW5ndGggPiAyNTUpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKGxpdGBJbmRleE5hbWVMZW5ndGhJbnZhbGlkYCwgYEluZGV4IG5hbWUgbXVzdCBiZSBiZXR3ZWVuIDEgYW5kIDI1NSBjaGFyYWN0ZXJzLCBidXQgZ290ICR7aW5kZXguaW5kZXhOYW1lLmxlbmd0aH1gLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnBhcnRpdGlvbktleXMgfHwgdGhpcy5wYXJ0aXRpb25LZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihsaXRgTm9QYXJ0aXRpb25LZXlzRm9ySW5kZXhgLCAnVGhlIHRhYmxlIG11c3QgaGF2ZSBwYXJ0aXRpb24ga2V5cyB0byBjcmVhdGUgYSBwYXJ0aXRpb24gaW5kZXgnLCB0aGlzKTtcbiAgICB9XG4gICAgaWYgKCFUb2tlbi5pc1VucmVzb2x2ZWQoaW5kZXgua2V5TmFtZXMpKSB7XG4gICAgICBjb25zdCBrZXlOYW1lcyA9IHRoaXMucGFydGl0aW9uS2V5cy5tYXAocGsgPT4gcGsubmFtZSk7XG4gICAgICBjb25zdCBjb25jcmV0ZUtleXMgPSBpbmRleC5rZXlOYW1lcy5maWx0ZXIoayA9PiAhVG9rZW4uaXNVbnJlc29sdmVkKGspKTtcbiAgICAgIGlmIChjb25jcmV0ZUtleXMubGVuZ3RoID4gMCAmJiAhY29uY3JldGVLZXlzLmV2ZXJ5KGsgPT4ga2V5TmFtZXMuaW5jbHVkZXMoaykpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IobGl0YEluZGV4S2V5c05vdFBhcnRpdGlvbktleXNgLCBgQWxsIGluZGV4IGtleXMgbXVzdCBhbHNvIGJlIHBhcnRpdGlvbiBrZXlzLiBHb3QgJHtpbmRleC5rZXlOYW1lc30gYnV0IHBhcnRpdGlvbiBrZXkgbmFtZXMgYXJlICR7a2V5TmFtZXN9YCwgdGhpcyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24gYW5kIG1lcmdlIGdlbmVyYXRlZCBwYXJhbWV0ZXJzIGludG8gdGhpcy5wYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZUFuZEdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucGFydGl0aW9uUHJvamVjdGlvbikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFZhbGlkYXRlIHRoYXQgcGFydGl0aW9uIGtleXMgZXhpc3RcbiAgICBpZiAoIXRoaXMucGFydGl0aW9uS2V5cyB8fCB0aGlzLnBhcnRpdGlvbktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgTm9QYXJ0aXRpb25LZXlzRm9yUHJvamVjdGlvbmAsXG4gICAgICAgICdUaGUgdGFibGUgbXVzdCBoYXZlIHBhcnRpdGlvbiBrZXlzIHRvIHVzZSBwYXJ0aXRpb24gcHJvamVjdGlvbicsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRpdGlvbktleU5hbWVzID0gdGhpcy5wYXJ0aXRpb25LZXlzLm1hcChwayA9PiBway5uYW1lKTtcblxuICAgIC8vIFZhbGlkYXRlIGVhY2ggcGFydGl0aW9uIHByb2plY3Rpb24gY29uZmlndXJhdGlvblxuICAgIGZvciAoY29uc3QgW2NvbHVtbk5hbWUsIGNvbmZpZ10gb2YgT2JqZWN0LmVudHJpZXModGhpcy5wYXJ0aXRpb25Qcm9qZWN0aW9uKSkge1xuICAgICAgLy8gVmFsaWRhdGUgdGhhdCBjb2x1bW4gaXMgYSBwYXJ0aXRpb24ga2V5XG4gICAgICBpZiAoIXBhcnRpdGlvbktleU5hbWVzLmluY2x1ZGVzKGNvbHVtbk5hbWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXJyb3IoXG4gICAgICAgICAgbGl0YFByb2plY3Rpb25Db2x1bW5Ob3RQYXJ0aXRpb25LZXlgLFxuICAgICAgICAgIGBQYXJ0aXRpb24gcHJvamVjdGlvbiBjb2x1bW4gXCIke2NvbHVtbk5hbWV9XCIgbXVzdCBiZSBhIHBhcnRpdGlvbiBrZXkuIGAgK1xuICAgICAgICAgIGBQYXJ0aXRpb24ga2V5cyBhcmU6ICR7cGFydGl0aW9uS2V5TmFtZXMuam9pbignLCAnKX1gLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdlbmVyYXRlIENsb3VkRm9ybWF0aW9uIHBhcmFtZXRlcnNcbiAgICAgIGNvbnN0IGdlbmVyYXRlZFBhcmFtcyA9IGdlbmVyYXRlUGFydGl0aW9uUHJvamVjdGlvblBhcmFtZXRlcnMoY29sdW1uTmFtZSwgY29uZmlnKTtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGNvbmZsaWN0cyB3aXRoIG1hbnVhbGx5IHNwZWNpZmllZCBwYXJhbWV0ZXJzXG4gICAgICBjb25zdCBjb25mbGljdGluZ0tleXMgPSBPYmplY3Qua2V5cyhnZW5lcmF0ZWRQYXJhbXMpLmZpbHRlcihrZXkgPT4ga2V5IGluIHRoaXMucGFyYW1ldGVycyk7XG4gICAgICBpZiAoY29uZmxpY3RpbmdLZXlzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBsaXRgUHJvamVjdGlvblBhcmFtZXRlcnNDb25mbGljdGAsXG4gICAgICAgICAgYFBhcnRpdGlvbiBwcm9qZWN0aW9uIHBhcmFtZXRlcnMgY29uZmxpY3Qgd2l0aCBtYW51YWxseSBzcGVjaWZpZWQgcGFyYW1ldGVyczogJHtjb25mbGljdGluZ0tleXMuam9pbignLCAnKX0uIGAgK1xuICAgICAgICAgICdVc2UgdGhlIHBhcnRpdGlvblByb2plY3Rpb24gcHJvcGVydHkgaW5zdGVhZCBvZiBtYW51YWxseSBzcGVjaWZ5aW5nIHByb2plY3Rpb24gcGFyYW1ldGVycy4nLFxuICAgICAgICAgIHRoaXMsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIGludG8gdGhpcy5wYXJhbWV0ZXJzXG4gICAgICBPYmplY3QuYXNzaWduKHRoaXMucGFyYW1ldGVycywgZ2VuZXJhdGVkUGFyYW1zKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBmb3IgY29uZmxpY3Qgd2l0aCBwcm9qZWN0aW9uLmVuYWJsZWRcbiAgICBpZiAoJ3Byb2plY3Rpb24uZW5hYmxlZCcgaW4gdGhpcy5wYXJhbWV0ZXJzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICBsaXRgUHJvamVjdGlvbkVuYWJsZWRDb25mbGljdGAsXG4gICAgICAgICdQYXJhbWV0ZXIgXCJwcm9qZWN0aW9uLmVuYWJsZWRcIiBjb25mbGljdHMgd2l0aCBwYXJ0aXRpb25Qcm9qZWN0aW9uIGNvbmZpZ3VyYXRpb24uICcgK1xuICAgICAgICAnVXNlIHRoZSBwYXJ0aXRpb25Qcm9qZWN0aW9uIHByb3BlcnR5IGluc3RlYWQgb2YgbWFudWFsbHkgc3BlY2lmeWluZyBwcm9qZWN0aW9uLmVuYWJsZWQuJyxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gRW5hYmxlIHBhcnRpdGlvbiBwcm9qZWN0aW9uIGdsb2JhbGx5XG4gICAgdGhpcy5wYXJhbWV0ZXJzWydwcm9qZWN0aW9uLmVuYWJsZWQnXSA9ICd0cnVlJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgY3VzdG9tIHBlcm1pc3Npb25zIG9uIHRoaXMgdGFibGUuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZXNjYXBlIGhhdGNoOiB0aGUgYGFjdGlvbnNgIGFyZSBhcHBsaWVkIHZlcmJhdGltLFxuICAgKiBzY29wZWQgdG8gdGhpcyB0YWJsZSdzIEFSTi4gUHJlZmVyIHRoZSBpbnRlbnQtYmFzZWQgYGdyYW50UmVhZGAgL1xuICAgKiBgZ3JhbnRXcml0ZWAgLyBgZ3JhbnRSZWFkV3JpdGVgIG1ldGhvZHMsIHdoaWNoIGdyYW50IGEgY3VyYXRlZCBzZXQgb2ZcbiAgICogYWN0aW9ucyBhbmQgYWxzbyBjb3ZlciB0aGUgdW5kZXJseWluZyBTMyBkYXRhLiBPbmx5IHBhc3MgdGhlIHNwZWNpZmljXG4gICAqIGFjdGlvbnMgdGhlIGdyYW50ZWUgbmVlZHMgLSBhdm9pZCBzZXJ2aWNlIHdpbGRjYXJkcyBzdWNoIGFzIGBnbHVlOipgLlxuICAgKiBbZGlzYWJsZS1hd3NsaW50Om5vLWdyYW50c11cbiAgICpcbiAgICogQHBhcmFtIGdyYW50ZWUgdGhlIHByaW5jaXBhbFxuICAgKiBAcGFyYW0gYWN0aW9ucyB0aGUgc2V0IG9mIEdsdWUgYWN0aW9ucyB0byBhbGxvdyAoZm9yIGV4YW1wbGUgYGdsdWU6R2V0VGFibGVgKVxuICAgKi9cbiAgcHVibGljIGdyYW50KGdyYW50ZWU6IGlhbS5JR3JhbnRhYmxlLCBhY3Rpb25zOiBzdHJpbmdbXSkge1xuICAgIHJldHVybiBpYW0uR3JhbnQuYWRkVG9QcmluY2lwYWwoe1xuICAgICAgZ3JhbnRlZSxcbiAgICAgIHJlc291cmNlQXJuczogW3RoaXMudGFibGVBcm5dLFxuICAgICAgYWN0aW9ucyxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHcmFudCB0aGUgZ2l2ZW4gaWRlbnRpdHkgY3VzdG9tIHBlcm1pc3Npb25zIG9uIHRoaXMgdGFibGUgQU5EIGl0cyBwYXJlbnRcbiAgICogY2F0YWxvZyBhbmQgZGF0YWJhc2UuXG4gICAqXG4gICAqIFRoaXMgaXMgYSBsb3ctbGV2ZWwgZXNjYXBlIGhhdGNoIGZvciBhY3Rpb25zIChzdWNoIGFzIGNlcnRhaW4gTGFrZVxuICAgKiBGb3JtYXRpb24gb3IgY3Jhd2xlciBvcGVyYXRpb25zKSB0aGF0IG11c3QgYmUgYXV0aG9yaXplZCBhZ2FpbnN0IHRoZVxuICAgKiBjYXRhbG9nIGFuZCBkYXRhYmFzZSBpbiBhZGRpdGlvbiB0byB0aGUgdGFibGUuIFRoZSBgYWN0aW9uc2AgYXJlIGFwcGxpZWRcbiAgICogdmVyYmF0aW0gdG8gYWxsIHRocmVlIEFSTnMgKHRhYmxlLCBjYXRhbG9nLCBkYXRhYmFzZSksIHNvIHNjb3BlIHRoZW1cbiAgICogdGlnaHRseTogcGFzcyBvbmx5IHRoZSBzcGVjaWZpYyBhY3Rpb25zIHRoZSBncmFudGVlIG5lZWRzIGFuZCBhdm9pZFxuICAgKiBzZXJ2aWNlIHdpbGRjYXJkcyBzdWNoIGFzIGBnbHVlOipgLCB3aGljaCB3b3VsZCBncmFudCBicm9hZCBhY2Nlc3MgYWNyb3NzXG4gICAqIGV2ZXJ5IHJlc291cmNlIGluIHRoZSBjYXRhbG9nIGFuZCBkYXRhYmFzZS5cbiAgICogW2Rpc2FibGUtYXdzbGludDpuby1ncmFudHNdXG4gICAqXG4gICAqIEBwYXJhbSBncmFudGVlIHRoZSBwcmluY2lwYWxcbiAgICogQHBhcmFtIGFjdGlvbnMgdGhlIHNldCBvZiBHbHVlIGFjdGlvbnMgdG8gYWxsb3cgKGZvciBleGFtcGxlIGBnbHVlOkdldFRhYmxlYClcbiAgICovXG4gIHB1YmxpYyBncmFudFRvVW5kZXJseWluZ1Jlc291cmNlcyhncmFudGVlOiBpYW0uSUdyYW50YWJsZSwgYWN0aW9uczogc3RyaW5nW10pIHtcbiAgICByZXR1cm4gaWFtLkdyYW50LmFkZFRvUHJpbmNpcGFsKHtcbiAgICAgIGdyYW50ZWUsXG4gICAgICByZXNvdXJjZUFybnM6IFtcbiAgICAgICAgdGhpcy50YWJsZUFybixcbiAgICAgICAgdGhpcy5kYXRhYmFzZS5jYXRhbG9nLmNhdGFsb2dBcm4sXG4gICAgICAgIHRoaXMuZGF0YWJhc2UuZGF0YWJhc2VBcm4sXG4gICAgICBdLFxuICAgICAgYWN0aW9ucyxcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgc3RhY2stc2luZ2xldG9uIGN1c3RvbSByZXNvdXJjZSBwcm92aWRlciB0aGF0IG1hbmFnZXMgR2x1ZSBwYXJ0aXRpb24gaW5kZXhlcy5cbiAqXG4gKiBBbGwgcGFydGl0aW9uLWluZGV4ZWQgdGFibGVzIGluIGEgc3RhY2sgc2hhcmUgYSBzaW5nbGUgcHJvdmlkZXIgKGFuZCBpdHMgdHdvXG4gKiBMYW1iZGEgaGFuZGxlcnMpIHRvIGF2b2lkIHByb3Zpc2lvbmluZyBhIHByb3ZpZGVyIGZyYW1ld29yayBwZXIgdGFibGUuIFRoZVxuICogcHJvdmlkZXIgYW5kIGhhbmRsZXJzIGFyZSBncm91cGVkIHVuZGVyIHRoaXMgc2luZ2xlIGNvbnN0cnVjdCBzbyBvbmx5IG9uZVxuICogaWQgaXMgcGxhY2VkIGF0IHN0YWNrIHNjb3BlLlxuICovXG5jbGFzcyBQYXJ0aXRpb25JbmRleFByb3ZpZGVyIGV4dGVuZHMgQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHN0YWNrLXNpbmdsZXRvbiBwcm92aWRlciwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0LlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXRPckNyZWF0ZShzY29wZTogQ29uc3RydWN0KTogUGFydGl0aW9uSW5kZXhQcm92aWRlciB7XG4gICAgY29uc3Qgc3RhY2sgPSBTdGFjay5vZihzY29wZSk7XG4gICAgLy8gQSBmaXhlZCwgbmFtZXNwYWNlZCBpZCBtYWtlcyB0aGlzIGEgc3RhY2sgc2luZ2xldG9uOiBldmVyeSBjYWxsIHdpdGhpbiB0aGVcbiAgICAvLyBzYW1lIHN0YWNrIHJlc29sdmVzIHRvIHRoZSBzYW1lIGNoaWxkIHZpYSBgdHJ5RmluZENoaWxkYC5cbiAgICBjb25zdCBpZCA9ICdAYXdzLWNkay9hd3MtZ2x1ZS1hbHBoYS5QYXJ0aXRpb25JbmRleFByb3ZpZGVyJztcbiAgICByZXR1cm4gKHN0YWNrLm5vZGUudHJ5RmluZENoaWxkKGlkKSBhcyBQYXJ0aXRpb25JbmRleFByb3ZpZGVyKSA/PyBuZXcgUGFydGl0aW9uSW5kZXhQcm92aWRlcihzdGFjaywgaWQpO1xuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IG9uRXZlbnRIYW5kbGVyOiBsYW1iZGEuRnVuY3Rpb247XG4gIHB1YmxpYyByZWFkb25seSBpc0NvbXBsZXRlSGFuZGxlcjogbGFtYmRhLkZ1bmN0aW9uO1xuICBwcml2YXRlIHJlYWRvbmx5IHByb3ZpZGVyOiBjci5Qcm92aWRlcjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBpZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIC8vIFRoZSBoYW5kbGVyIHNvdXJjZSBsaXZlcyBpbiBgQGF3cy1jZGsvY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzYCBhbmQgaXMgY29kZVxuICAgIC8vIGdlbmVyYXRlZCArIGFpcmxpZnRlZCBpbnRvIHRoaXMgcGFja2FnZSBhdCBidWlsZCB0aW1lIChzZWVcbiAgICAvLyBzY3JpcHRzL2FpcmxpZnQtY3VzdG9tLXJlc291cmNlLWhhbmRsZXJzLnNoKSwgZm9sbG93aW5nIHRoZSBwYXR0ZXJuIHVzZWQgYnkgdGhlXG4gICAgLy8gb3RoZXIgYWxwaGEgbW9kdWxlcyAoYXdzLWFtcGxpZnktYWxwaGEsIGF3cy1yZWRzaGlmdC1hbHBoYSkuIFRoZSBAYXdzLXNkay9jbGllbnQtZ2x1ZVxuICAgIC8vIG1vZHVsZSBpcyBwcm92aWRlZCBieSB0aGUgTGFtYmRhIHJ1bnRpbWUgcmF0aGVyIHRoYW4gYnVuZGxlZCBpbnRvIHRoZSBhc3NldC5cbiAgICB0aGlzLm9uRXZlbnRIYW5kbGVyID0gbmV3IFBhcnRpdGlvbkluZGV4T25FdmVudEZ1bmN0aW9uKHRoaXMsICdIYW5kbGVyJywge1xuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICB9KTtcbiAgICB0aGlzLmlzQ29tcGxldGVIYW5kbGVyID0gbmV3IFBhcnRpdGlvbkluZGV4SXNDb21wbGV0ZUZ1bmN0aW9uKHRoaXMsICdJc0NvbXBsZXRlJywge1xuICAgICAgdGltZW91dDogRHVyYXRpb24ubWludXRlcygxKSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvdmlkZXIgPSBuZXcgY3IuUHJvdmlkZXIodGhpcywgJ1Byb3ZpZGVyJywge1xuICAgICAgb25FdmVudEhhbmRsZXI6IHRoaXMub25FdmVudEhhbmRsZXIsXG4gICAgICBpc0NvbXBsZXRlSGFuZGxlcjogdGhpcy5pc0NvbXBsZXRlSGFuZGxlcixcbiAgICAgIHF1ZXJ5SW50ZXJ2YWw6IER1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgdG90YWxUaW1lb3V0OiBEdXJhdGlvbi5taW51dGVzKDE1KSxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgc2VydmljZSB0b2tlbiB0byB3aXJlIGludG8gcGFydGl0aW9uIGluZGV4IGN1c3RvbSByZXNvdXJjZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VUb2tlbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByb3ZpZGVyLnNlcnZpY2VUb2tlbjtcbiAgfVxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNjaGVtYShjb2x1bW5zOiBDb2x1bW5bXSwgcGFydGl0aW9uS2V5cz86IENvbHVtbltdKTogdm9pZCB7XG4gIGlmIChjb2x1bW5zLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBVbnNjb3BlZFZhbGlkYXRpb25FcnJvcihsaXRgTm9Db2x1bW5zU3BlY2lmaWVkYCwgJ3lvdSBtdXN0IHNwZWNpZnkgYXQgbGVhc3Qgb25lIGNvbHVtbiBmb3IgdGhlIHRhYmxlJyk7XG4gIH1cbiAgLy8gQ2hlY2sgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbHVtbiBhbmQgbm8gZHVwbGljYXRlZCBjb2x1bW4gbmFtZXMgb3IgcGFydGl0aW9uIGtleXMuXG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIChjb2x1bW5zLmNvbmNhdChwYXJ0aXRpb25LZXlzIHx8IFtdKSkuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgIGlmIChuYW1lcy5oYXMoY29sdW1uLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVW5zY29wZWRWYWxpZGF0aW9uRXJyb3IobGl0YER1cGxpY2F0ZUNvbHVtbk5hbWVgLCBgY29sdW1uIG5hbWVzIGFuZCBwYXJ0aXRpb24ga2V5cyBtdXN0IGJlIHVuaXF1ZSwgYnV0IFxcJyR7Y29sdW1uLm5hbWV9XFwnIGlzIGR1cGxpY2F0ZWRgKTtcbiAgICB9XG4gICAgbmFtZXMuYWRkKGNvbHVtbi5uYW1lKTtcbiAgfSk7XG59XG4iXX0=
@@ -1,21 +1,40 @@
1
1
  import * as events from 'aws-cdk-lib/aws-events';
2
- import type { CfnCrawler } from 'aws-cdk-lib/aws-glue';
2
+ import type { CfnTrigger, ICrawlerRef, IJobRef } from 'aws-cdk-lib/aws-glue';
3
3
  import type * as cdk from 'aws-cdk-lib/core';
4
- import type { JobState, CrawlerState, ConditionLogicalOperator, PredicateLogical } from '../constants';
5
- import type { IJob } from '../jobs/job';
4
+ import { ConditionLogicalOperator } from '../constants';
5
+ import type { JobState, CrawlerState, PredicateLogical } from '../constants';
6
6
  import type { ISecurityConfiguration } from '../security-configuration';
7
7
  /**
8
- * Represents a trigger action.
8
+ * Options for the execution of a crawler.
9
9
  */
10
- export interface Action {
10
+ export interface CrawlerActionOptions {
11
11
  /**
12
- * The job to be executed.
12
+ * The arguments used when this trigger fires.
13
13
  *
14
- * @default - no job is executed
14
+ * @default - no arguments are passed to the job
15
+ */
16
+ readonly arguments?: {
17
+ [key: string]: string;
18
+ };
19
+ /**
20
+ * The run timeout. This is the maximum time that a run can consume resources before it is terminated and enters TIMEOUT status.
21
+ *
22
+ * @default - the default timeout value set in the job definition
15
23
  */
16
- readonly job?: IJob;
24
+ readonly timeout?: cdk.Duration;
17
25
  /**
18
- * The job arguments used when this trigger fires.
26
+ * The `SecurityConfiguration` to be used with this action.
27
+ *
28
+ * @default - no security configuration is used
29
+ */
30
+ readonly securityConfiguration?: ISecurityConfiguration;
31
+ }
32
+ /**
33
+ * Options for the execution of a job.
34
+ */
35
+ export interface JobActionOptions {
36
+ /**
37
+ * The arguments used when this trigger fires.
19
38
  *
20
39
  * @default - no arguments are passed to the job
21
40
  */
@@ -23,7 +42,7 @@ export interface Action {
23
42
  [key: string]: string;
24
43
  };
25
44
  /**
26
- * The job run timeout. This is the maximum time that a job run can consume resources before it is terminated and enters TIMEOUT status.
45
+ * The run timeout. This is the maximum time that a run can consume resources before it is terminated and enters TIMEOUT status.
27
46
  *
28
47
  * @default - the default timeout value set in the job definition
29
48
  */
@@ -34,12 +53,35 @@ export interface Action {
34
53
  * @default - no security configuration is used
35
54
  */
36
55
  readonly securityConfiguration?: ISecurityConfiguration;
56
+ }
57
+ /**
58
+ * An action initiated by a trigger.
59
+ *
60
+ * An action runs exactly one target: use {@link Action.job} to run a job or
61
+ * {@link Action.crawler} to run a crawler. Because these are separate factory
62
+ * methods, an action can never target both or neither.
63
+ */
64
+ export declare abstract class Action {
37
65
  /**
38
- * The name of the crawler to be used with this action.
66
+ * Create an action that runs a job.
39
67
  *
40
- * @default - no crawler is used
68
+ * @param job the job to run when the trigger fires.
69
+ * @param options additional options for the action.
41
70
  */
42
- readonly crawler?: CfnCrawler;
71
+ static job(job: IJobRef, options?: JobActionOptions): Action;
72
+ /**
73
+ * Create an action that runs a crawler.
74
+ *
75
+ * @param crawler the crawler to run when the trigger fires.
76
+ * @param options additional options for the action.
77
+ */
78
+ static crawler(crawler: ICrawlerRef, options?: CrawlerActionOptions): Action;
79
+ /**
80
+ * Render this action to its CloudFormation representation.
81
+ *
82
+ * @internal
83
+ */
84
+ abstract _render(): CfnTrigger.ActionProperty;
43
85
  }
44
86
  /**
45
87
  * Represents a trigger schedule.
@@ -60,6 +102,18 @@ export declare class TriggerSchedule {
60
102
  * @returns A new TriggerSchedule instance.
61
103
  */
62
104
  static expression(expression: string): TriggerSchedule;
105
+ /**
106
+ * Creates a schedule that fires once a day, at midnight UTC.
107
+ *
108
+ * @returns A new TriggerSchedule instance.
109
+ */
110
+ static daily(): TriggerSchedule;
111
+ /**
112
+ * Creates a schedule that fires once a week, at midnight UTC on Sunday.
113
+ *
114
+ * @returns A new TriggerSchedule instance.
115
+ */
116
+ static weekly(): TriggerSchedule;
63
117
  /**
64
118
  * @param expressionString The expression string for the schedule.
65
119
  */
@@ -83,39 +137,47 @@ export interface Predicate {
83
137
  readonly conditions?: Condition[];
84
138
  }
85
139
  /**
86
- * Represents a trigger condition.
140
+ * Options shared by all trigger conditions.
87
141
  */
88
- export interface Condition {
142
+ export interface ConditionOptions {
89
143
  /**
90
144
  * The logical operator for the condition.
91
145
  *
92
146
  * @default ConditionLogicalOperator.EQUALS
93
147
  */
94
148
  readonly logicalOperator?: ConditionLogicalOperator;
149
+ }
150
+ /**
151
+ * A condition that determines when a conditional trigger fires.
152
+ *
153
+ * A condition watches exactly one target in exactly one state: use
154
+ * {@link Condition.job} to watch a job or {@link Condition.crawler} to watch a
155
+ * crawler. Because the state is a required argument of each factory, a condition
156
+ * can never reference a target without its state, or both a job and a crawler.
157
+ */
158
+ export declare abstract class Condition {
95
159
  /**
96
- * The job to which this condition applies.
97
- *
98
- * @default - no job is specified
99
- */
100
- readonly job?: IJob;
101
- /**
102
- * The condition job state.
160
+ * Create a condition on the state of a job.
103
161
  *
104
- * @default - no job state is specified
162
+ * @param job the job to watch.
163
+ * @param state the job state that satisfies the condition.
164
+ * @param options additional options for the condition.
105
165
  */
106
- readonly state?: JobState;
166
+ static job(job: IJobRef, state: JobState, options?: ConditionOptions): Condition;
107
167
  /**
108
- * The name of the crawler to which this condition applies.
168
+ * Create a condition on the state of a crawler.
109
169
  *
110
- * @default - no crawler is specified
170
+ * @param crawler the crawler to watch.
171
+ * @param crawlState the crawler state that satisfies the condition.
172
+ * @param options additional options for the condition.
111
173
  */
112
- readonly crawlerName?: string;
174
+ static crawler(crawler: ICrawlerRef, crawlState: CrawlerState, options?: ConditionOptions): Condition;
113
175
  /**
114
- * The condition crawler state.
176
+ * Render this condition to its CloudFormation representation.
115
177
  *
116
- * @default - no crawler state is specified
178
+ * @internal
117
179
  */
118
- readonly crawlState?: CrawlerState;
180
+ abstract _render(): CfnTrigger.ConditionProperty;
119
181
  }
120
182
  /**
121
183
  * Represents event trigger batch condition.
@@ -159,9 +221,9 @@ export interface TriggerOptions {
159
221
  export interface OnDemandTriggerOptions extends TriggerOptions {
160
222
  }
161
223
  /**
162
- * Properties for configuring a daily-scheduled Glue Trigger.
224
+ * Base options for triggers that can be started when they are created.
163
225
  */
164
- export interface DailyScheduleTriggerOptions extends TriggerOptions {
226
+ export interface StartableTriggerOptions extends TriggerOptions {
165
227
  /**
166
228
  * Whether to start the trigger on creation or not.
167
229
  *
@@ -170,23 +232,21 @@ export interface DailyScheduleTriggerOptions extends TriggerOptions {
170
232
  readonly startOnCreation?: boolean;
171
233
  }
172
234
  /**
173
- * Properties for configuring a weekly-scheduled Glue Trigger.
235
+ * Properties for configuring a scheduled Glue Trigger.
174
236
  */
175
- export interface WeeklyScheduleTriggerOptions extends DailyScheduleTriggerOptions {
176
- }
177
- /**
178
- * Properties for configuring a custom-scheduled Glue Trigger.
179
- */
180
- export interface CustomScheduledTriggerOptions extends WeeklyScheduleTriggerOptions {
237
+ export interface ScheduledTriggerOptions extends StartableTriggerOptions {
181
238
  /**
182
- * The custom schedule for the trigger.
239
+ * The schedule on which this trigger fires.
240
+ *
241
+ * Build one with {@link TriggerSchedule.daily}, {@link TriggerSchedule.weekly},
242
+ * {@link TriggerSchedule.cron}, or {@link TriggerSchedule.expression}.
183
243
  */
184
244
  readonly schedule: TriggerSchedule;
185
245
  }
186
246
  /**
187
247
  * Properties for configuring an Event Bridge based Glue Trigger.
188
248
  */
189
- export interface NotifyEventTriggerOptions extends TriggerOptions {
249
+ export interface EventTriggerOptions extends TriggerOptions {
190
250
  /**
191
251
  * Batch condition for the trigger.
192
252
  *
@@ -197,7 +257,7 @@ export interface NotifyEventTriggerOptions extends TriggerOptions {
197
257
  /**
198
258
  * Properties for configuring a Condition (Predicate) based Glue Trigger.
199
259
  */
200
- export interface ConditionalTriggerOptions extends DailyScheduleTriggerOptions {
260
+ export interface ConditionalTriggerOptions extends StartableTriggerOptions {
201
261
  /**
202
262
  * The predicate for the trigger.
203
263
  */