@cdklabs/cdk-appmod-catalog-blueprints 1.16.1 → 1.17.1

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 (81) hide show
  1. package/.jsii +963 -146
  2. package/lib/document-processing/adapter/queued-s3-adapter.js +39 -5
  3. package/lib/document-processing/agentic-document-processing.js +6 -4
  4. package/lib/document-processing/base-document-processing.js +16 -4
  5. package/lib/document-processing/bedrock-document-processing.d.ts +1 -0
  6. package/lib/document-processing/bedrock-document-processing.js +117 -70
  7. package/lib/document-processing/default-document-processing-config.js +3 -5
  8. package/lib/document-processing/index.d.ts +2 -0
  9. package/lib/document-processing/index.js +3 -1
  10. package/lib/document-processing/localstack-agentic-document-processing.d.ts +20 -0
  11. package/lib/document-processing/localstack-agentic-document-processing.js +99 -0
  12. package/lib/document-processing/localstack-bedrock-document-processing.d.ts +16 -0
  13. package/lib/document-processing/localstack-bedrock-document-processing.js +69 -0
  14. package/lib/document-processing/resources/cleanup/handler.py +16 -1
  15. package/lib/document-processing/resources/default-localstack-invoke/index.py +184 -0
  16. package/lib/document-processing/resources/default-localstack-invoke/provider_runtime.py +251 -0
  17. package/lib/document-processing/resources/default-localstack-invoke/requirements.txt +5 -0
  18. package/lib/document-processing/resources/default-sqs-consumer/index.py +17 -2
  19. package/lib/document-processing/resources/pdf-chunking/handler.py +16 -1
  20. package/lib/document-processing/tests/base-document-processing-nag.test.js +3 -1
  21. package/lib/document-processing/tests/base-document-processing-schema.test.js +6 -1
  22. package/lib/document-processing/tests/base-document-processing.test.js +12 -1
  23. package/lib/document-processing/tests/localstack-agentic-document-processing.test.d.ts +1 -0
  24. package/lib/document-processing/tests/localstack-agentic-document-processing.test.js +111 -0
  25. package/lib/document-processing/tests/localstack-document-processing.test.d.ts +1 -0
  26. package/lib/document-processing/tests/localstack-document-processing.test.js +149 -0
  27. package/lib/document-processing/tests/queued-s3-adapter-nag.test.js +3 -1
  28. package/lib/document-processing/tests/queued-s3-adapter.test.js +3 -1
  29. package/lib/framework/agents/base-agent.js +31 -4
  30. package/lib/framework/agents/batch-agent.d.ts +1 -0
  31. package/lib/framework/agents/batch-agent.js +42 -7
  32. package/lib/framework/agents/default-agent-config.js +3 -5
  33. package/lib/framework/agents/index.d.ts +1 -0
  34. package/lib/framework/agents/index.js +2 -1
  35. package/lib/framework/agents/interactive-agent.js +115 -23
  36. package/lib/framework/agents/knowledge-base/base-knowledge-base.js +30 -4
  37. package/lib/framework/agents/knowledge-base/bedrock-knowledge-base.js +81 -5
  38. package/lib/framework/agents/localstack-batch-agent.d.ts +15 -0
  39. package/lib/framework/agents/localstack-batch-agent.js +64 -0
  40. package/lib/framework/agents/resources/default-ollama-agent/batch.py +396 -0
  41. package/lib/framework/agents/resources/default-ollama-agent/models.py +7 -0
  42. package/lib/framework/agents/resources/default-ollama-agent/requirements.txt +9 -0
  43. package/lib/framework/agents/resources/default-ollama-agent/runtime_support.py +237 -0
  44. package/lib/framework/agents/resources/default-ollama-agent/utils.py +77 -0
  45. package/lib/framework/agents/tests/agent-knowledge-base-nag.test.js +35 -2
  46. package/lib/framework/bedrock/bedrock.d.ts +9 -0
  47. package/lib/framework/bedrock/bedrock.js +20 -12
  48. package/lib/framework/custom-resource/default-runtimes.js +20 -22
  49. package/lib/framework/foundation/access-log.js +50 -7
  50. package/lib/framework/foundation/eventbridge-broker.js +5 -4
  51. package/lib/framework/foundation/network.js +4 -4
  52. package/lib/framework/index.d.ts +1 -0
  53. package/lib/framework/index.js +2 -1
  54. package/lib/framework/localstack/index.d.ts +1 -0
  55. package/lib/framework/localstack/index.js +18 -0
  56. package/lib/framework/localstack/localstack-config.d.ts +79 -0
  57. package/lib/framework/localstack/localstack-config.js +47 -0
  58. package/lib/framework/tests/base-agent-knowledge-base.test.js +35 -2
  59. package/lib/framework/tests/batch-agent.test.js +35 -2
  60. package/lib/framework/tests/framework-nag.test.js +35 -2
  61. package/lib/framework/tests/interactive-agent-nag.test.js +35 -2
  62. package/lib/framework/tests/interactive-agent.test.js +35 -2
  63. package/lib/framework/tests/localstack-batch-agent.test.d.ts +1 -0
  64. package/lib/framework/tests/localstack-batch-agent.test.js +100 -0
  65. package/lib/utilities/data-loader.js +50 -5
  66. package/lib/utilities/lambda-iam-utils.js +38 -7
  67. package/lib/utilities/lambda_layers/data-masking/layer-construct.js +40 -3
  68. package/lib/utilities/observability/bedrock-observability.js +38 -2
  69. package/lib/utilities/observability/cloudfront-distribution-observability-property-injector.js +3 -4
  70. package/lib/utilities/observability/cloudwatch-transaction-search.js +36 -5
  71. package/lib/utilities/observability/default-observability-config.js +6 -8
  72. package/lib/utilities/observability/lambda-observability-property-injector.js +4 -4
  73. package/lib/utilities/observability/log-group-data-protection-utils.js +2 -4
  74. package/lib/utilities/observability/observability.js +47 -6
  75. package/lib/utilities/observability/powertools-config.js +2 -4
  76. package/lib/utilities/observability/state-machine-observability-property-injector.js +4 -4
  77. package/lib/webapp/frontend-construct.js +46 -5
  78. package/lib/webapp/tests/frontend-construct-nag.test.js +36 -3
  79. package/lib/webapp/tests/frontend-construct.test.js +36 -3
  80. package/package.json +60 -61
  81. package/lib/tsconfig.tsbuildinfo +0 -1
@@ -14,6 +14,8 @@ const adapter_1 = require("../adapter");
14
14
  const base_document_processing_1 = require("../base-document-processing");
15
15
  // Concrete test implementation of BaseDocumentProcessing
16
16
  class TestDocumentProcessing extends base_document_processing_1.BaseDocumentProcessing {
17
+ classificationFn;
18
+ processingFn;
17
19
  constructor(scope, id, props) {
18
20
  super(scope, id, props);
19
21
  this.classificationFn = new aws_lambda_1.Function(this, 'ClassificationFn', {
@@ -57,6 +59,9 @@ class TestDocumentProcessing extends base_document_processing_1.BaseDocumentProc
57
59
  }
58
60
  // Test implementation with enrichment step
59
61
  class TestDocumentProcessingWithEnrichment extends base_document_processing_1.BaseDocumentProcessing {
62
+ classificationFn;
63
+ processingFn;
64
+ enrichmentFn;
60
65
  constructor(scope, id, props) {
61
66
  super(scope, id, props);
62
67
  this.classificationFn = new aws_lambda_1.Function(this, 'ClassificationFn', {
@@ -108,6 +113,9 @@ class TestDocumentProcessingWithEnrichment extends base_document_processing_1.Ba
108
113
  }
109
114
  // Test implementation with post-processing step
110
115
  class TestDocumentProcessingWithPostProcessing extends base_document_processing_1.BaseDocumentProcessing {
116
+ classificationFn;
117
+ processingFn;
118
+ postProcessingFn;
111
119
  constructor(scope, id, props) {
112
120
  super(scope, id, props);
113
121
  this.classificationFn = new aws_lambda_1.Function(this, 'ClassificationFn', {
@@ -159,6 +167,9 @@ class TestDocumentProcessingWithPostProcessing extends base_document_processing_
159
167
  }
160
168
  // Test implementation with preprocessing step
161
169
  class TestDocumentProcessingWithPreprocessing extends base_document_processing_1.BaseDocumentProcessing {
170
+ classificationFn;
171
+ processingFn;
172
+ preprocessingFn;
162
173
  constructor(scope, id, props) {
163
174
  super(scope, id, props);
164
175
  this.preprocessingFn = new aws_lambda_1.Function(this, 'PreprocessingFn', {
@@ -602,4 +613,4 @@ describe('BaseDocumentProcessing', () => {
602
613
  });
603
614
  });
604
615
  });
605
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy90ZXN0cy9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFrRTtBQUNsRSx1REFBeUQ7QUFDekQsMkRBQWdFO0FBQ2hFLGlEQUEwQztBQUMxQyx1REFBaUU7QUFDakUsK0NBQTRDO0FBQzVDLGlGQUFtRTtBQUNuRSwrQ0FBNEM7QUFDNUMsc0ZBQWtGO0FBQ2xGLDJEQUEyRDtBQUMzRCx3Q0FBNkM7QUFDN0MsMEVBQWlHO0FBRWpHLHlEQUF5RDtBQUN6RCxNQUFNLHNCQUF1QixTQUFRLGlEQUFzQjtJQUl6RCxZQUFZLEtBQVUsRUFBRSxFQUFVLEVBQUUsS0FBVTtRQUM1QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUM3RCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxxRUFBcUUsQ0FBQztTQUM3RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ3JELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLGlEQUFpRCxDQUFDO1NBQ3pFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ2xELGNBQWMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3JDLFVBQVUsRUFBRSx3QkFBd0I7U0FDckMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGNBQWM7UUFDdEIsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzlDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUNqQyxVQUFVLEVBQUUsb0JBQW9CO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxjQUFjO1FBQ3RCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVTLGlCQUFpQjtRQUN6QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRVMsd0JBQXdCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQy9ELENBQUM7Q0FDRjtBQUVELDJDQUEyQztBQUMzQyxNQUFNLG9DQUFxQyxTQUFRLGlEQUFzQjtJQUt2RSxZQUFZLEtBQVUsRUFBRSxFQUFVLEVBQUUsS0FBVTtRQUM1QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUM3RCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxxRUFBcUUsQ0FBQztTQUM3RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ3JELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLGlEQUFpRCxDQUFDO1NBQ3pFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxjQUFjLEVBQUU7WUFDckQsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMscURBQXFELENBQUM7U0FDN0UsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGtCQUFrQjtRQUMxQixPQUFPLElBQUksc0NBQVksQ0FBQyxJQUFJLEVBQUUsb0JBQW9CLEVBQUU7WUFDbEQsY0FBYyxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7WUFDckMsVUFBVSxFQUFFLHdCQUF3QjtTQUNyQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsY0FBYztRQUN0QixPQUFPLElBQUksc0NBQVksQ0FBQyxJQUFJLEVBQUUsZ0JBQWdCLEVBQUU7WUFDOUMsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ2pDLFVBQVUsRUFBRSxvQkFBb0I7U0FDakMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGNBQWM7UUFDdEIsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzlDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUNqQyxVQUFVLEVBQUUsa0JBQWtCO1NBQy9CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQUVTLGlCQUFpQjtRQUN6QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRVMsd0JBQXdCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO0lBQzFFLENBQUM7Q0FDRjtBQUVELGdEQUFnRDtBQUNoRCxNQUFNLHdDQUF5QyxTQUFRLGlEQUFzQjtJQUszRSxZQUFZLEtBQVUsRUFBRSxFQUFVLEVBQUUsS0FBVTtRQUM1QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxxQkFBUSxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRTtZQUM3RCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxxRUFBcUUsQ0FBQztTQUM3RixDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsY0FBYyxFQUFFO1lBQ3JELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLGlEQUFpRCxDQUFDO1NBQ3pFLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFO1lBQzdELE9BQU8sRUFBRSxvQkFBTyxDQUFDLFdBQVc7WUFDNUIsT0FBTyxFQUFFLGVBQWU7WUFDeEIsSUFBSSxFQUFFLGlCQUFJLENBQUMsVUFBVSxDQUFDLHNEQUFzRCxDQUFDO1NBQzlFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ2xELGNBQWMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3JDLFVBQVUsRUFBRSx3QkFBd0I7U0FDckMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGNBQWM7UUFDdEIsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFO1lBQzlDLGNBQWMsRUFBRSxJQUFJLENBQUMsWUFBWTtZQUNqQyxVQUFVLEVBQUUsb0JBQW9CO1NBQ2pDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxjQUFjO1FBQ3RCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFUyxrQkFBa0I7UUFDMUIsT0FBTyxJQUFJLHNDQUFZLENBQUMsSUFBSSxFQUFFLG9CQUFvQixFQUFFO1lBQ2xELGNBQWMsRUFBRSxJQUFJLENBQUMsZ0JBQWdCO1lBQ3JDLFVBQVUsRUFBRSx1QkFBdUI7U0FDcEMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVTLGlCQUFpQjtRQUN6QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRVMsd0JBQXdCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLGdDQUFnQyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVNLGtCQUFrQjtRQUN2QixPQUFPLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBQy9FLENBQUM7Q0FDRjtBQUVELDhDQUE4QztBQUM5QyxNQUFNLHVDQUF3QyxTQUFRLGlEQUFzQjtJQUsxRSxZQUFZLEtBQVUsRUFBRSxFQUFVLEVBQUUsS0FBVTtRQUM1QyxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLEVBQUU7WUFDM0QsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMseURBQXlELENBQUM7U0FDakYsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDN0QsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMscUVBQXFFLENBQUM7U0FDN0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUNyRCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxpREFBaUQsQ0FBQztTQUN6RSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsaUJBQWlCO1FBQ3pCLE9BQU8sSUFBSSxzQ0FBWSxDQUFDLElBQUksRUFBRSxtQkFBbUIsRUFBRTtZQUNqRCxjQUFjLEVBQUUsSUFBSSxDQUFDLGVBQWU7WUFDcEMsVUFBVSxFQUFFLHVCQUF1QjtTQUNwQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9BQU8sSUFBSSxzQ0FBWSxDQUFDLElBQUksRUFBRSxvQkFBb0IsRUFBRTtZQUNsRCxjQUFjLEVBQUUsSUFBSSxDQUFDLGdCQUFnQjtZQUNyQyxVQUFVLEVBQUUsd0JBQXdCO1NBQ3JDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFUyxjQUFjO1FBQ3RCLE9BQU8sSUFBSSxzQ0FBWSxDQUFDLElBQUksRUFBRSxnQkFBZ0IsRUFBRTtZQUM5QyxjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVk7WUFDakMsVUFBVSxFQUFFLG9CQUFvQjtTQUNqQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsY0FBYztRQUN0QixPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFUyx3QkFBd0I7UUFDaEMsT0FBTyxJQUFJLENBQUMsZ0NBQWdDLEVBQUUsQ0FBQztJQUNqRCxDQUFDO0lBRU0sa0JBQWtCO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLDBCQUEwQixDQUFDLGtDQUFrQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztDQUNGO0FBRUQsUUFBUSxDQUFDLHdCQUF3QixFQUFFLEdBQUcsRUFBRTtJQUN0QyxJQUFJLEdBQVEsQ0FBQztJQUNiLElBQUksWUFBbUIsQ0FBQztJQUN4QixJQUFJLFdBQWtCLENBQUM7SUFDdkIsSUFBSSxlQUFzQixDQUFDO0lBQzNCLElBQUksbUJBQTBCLENBQUM7SUFDL0IsSUFBSSxrQkFBeUIsQ0FBQztJQUM5QixJQUFJLGdCQUF1QixDQUFDO0lBQzVCLElBQUksZUFBeUIsQ0FBQztJQUM5QixJQUFJLGNBQXdCLENBQUM7SUFDN0IsSUFBSSxrQkFBNEIsQ0FBQztJQUNqQyxJQUFJLHNCQUFnQyxDQUFDO0lBQ3JDLElBQUkscUJBQStCLENBQUM7SUFDcEMsSUFBSSxtQkFBNkIsQ0FBQztJQUVsQyxTQUFTLENBQUMsR0FBRyxFQUFFO1FBQ2IsMERBQTBEO1FBQzFELEdBQUcsR0FBRyxJQUFBLDBCQUFhLEdBQUUsQ0FBQztRQUV0Qix3QkFBd0I7UUFDeEIsWUFBWSxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDOUMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLHNCQUFzQixDQUFDLFlBQVksRUFBRSxhQUFhLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckYsZ0JBQWdCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUV0Qyw4REFBOEQ7UUFDOUQsV0FBVyxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFDNUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxvQkFBSyxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUU7WUFDeEQsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsNEJBQWEsQ0FBQyxNQUFNLEVBQUU7U0FDakUsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxhQUFHLENBQUMsV0FBVyxFQUFFLFdBQVcsRUFBRSxFQUFFLGlCQUFpQixFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDakYsTUFBTSxTQUFTLEdBQUcsSUFBSSxxQkFBUyxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztRQUMxRCxNQUFNLFlBQVksR0FBRyxJQUFJLGVBQU0sQ0FBQyxXQUFXLEVBQUUsY0FBYyxFQUFFO1lBQzNELHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxNQUFNO1lBQ3hDLHNCQUFzQixFQUFFLFNBQVMsQ0FBQyxZQUFZO1lBQzlDLFVBQVUsRUFBRSxJQUFJO1NBQ2pCLENBQUMsQ0FBQztRQUNILE1BQU0sYUFBYSxHQUFHLElBQUkseUJBQWUsQ0FBQyxFQUFFLE1BQU0sRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sZUFBZSxHQUFHLElBQUksc0JBQXNCLENBQUMsV0FBVyxFQUFFLFlBQVksRUFBRTtZQUM1RSx1QkFBdUIsRUFBRSxXQUFXO1lBQ3BDLGNBQWMsRUFBRSxhQUFhO1lBQzdCLGVBQWUsRUFBRSxzQkFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDckMsYUFBYSxFQUFFLDJCQUFhLENBQUMsTUFBTTtZQUNuQyxhQUFhLEVBQUUsU0FBUztTQUN6QixDQUFDLENBQUM7UUFDSCxlQUFlLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUVyQyx1QkFBdUI7UUFDdkIsZUFBZSxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztRQUNwRCxNQUFNLG1CQUFtQixHQUFHLElBQUksb0NBQW9DLENBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzVHLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFFekMsNEJBQTRCO1FBQzVCLG1CQUFtQixHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUM1RCxNQUFNLHVCQUF1QixHQUFHLElBQUksd0NBQXdDLENBQUMsbUJBQW1CLEVBQUUsb0JBQW9CLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDNUgsdUJBQXVCLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUU3QywwQkFBMEI7UUFDMUIsa0JBQWtCLEdBQUcsSUFBSSxtQkFBSyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1FBQzFELE1BQU0sc0JBQXNCLEdBQUcsSUFBSSx1Q0FBdUMsQ0FBQyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4SCxzQkFBc0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRTVDLDBCQUEwQjtRQUMxQixnQkFBZ0IsR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxFQUFFLGtCQUFrQixDQUFDLENBQUM7UUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxzQ0FBaUIsQ0FBQyxnQkFBZ0IsRUFBRSxZQUFZLEVBQUU7WUFDbkUsSUFBSSxFQUFFLGFBQWE7WUFDbkIsV0FBVyxFQUFFLGFBQWE7U0FDM0IsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLHNCQUFzQixDQUFDLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFO1lBQzNGLGlCQUFpQixFQUFFLE1BQU07U0FDMUIsQ0FBQyxDQUFDO1FBQ0gsb0JBQW9CLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUUxQywwQkFBMEI7UUFDMUIsZUFBZSxHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ25ELGNBQWMsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUNqRCxrQkFBa0IsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN6RCxzQkFBc0IsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ2pFLHFCQUFxQixHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDL0QsbUJBQW1CLEdBQUcscUJBQVEsQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUM3RCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUU7UUFDbkMsSUFBSSxDQUFDLDhDQUE4QyxFQUFFLEdBQUcsRUFBRTtZQUN4RCxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDeEMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsbURBQW1ELEVBQUUsR0FBRyxFQUFFO1lBQzdELGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxzQkFBc0IsRUFBRTtnQkFDNUQsU0FBUyxFQUFFLENBQUM7d0JBQ1YsYUFBYSxFQUFFLFlBQVk7d0JBQzNCLE9BQU8sRUFBRSxNQUFNO3FCQUNoQixDQUFDO2dCQUNGLFdBQVcsRUFBRSxpQkFBaUI7Z0JBQzlCLGdDQUFnQyxFQUFFO29CQUNoQywwQkFBMEIsRUFBRSxJQUFJO2lCQUNqQztnQkFDRCxnQkFBZ0IsRUFBRTtvQkFDaEIsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRSxLQUFLO2lCQUNmO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO1lBQzVELGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxlQUFlLEVBQUU7Z0JBQ3JELGlCQUFpQixFQUFFLElBQUk7YUFDeEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1lBQ2xELGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsRUFBRTtnQkFDdkQsZ0JBQWdCLEVBQUU7b0JBQ2hCLGlDQUFpQyxFQUFFLENBQUM7NEJBQ2xDLDZCQUE2QixFQUFFO2dDQUM3QixZQUFZLEVBQUUsU0FBUzs2QkFDeEI7eUJBQ0YsQ0FBQztpQkFDSDthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLDRCQUE0QixFQUFFLEdBQUcsRUFBRTtZQUN0QyxlQUFlLENBQUMscUJBQXFCLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3ZELGFBQWEsRUFBRSxrQkFBSyxDQUFDLFVBQVUsQ0FBQztvQkFDOUIsZUFBZSxFQUFFLENBQUM7aUJBQ25CLENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7WUFDaEQsZUFBZSxDQUFDLGVBQWUsQ0FBQyxrQ0FBa0MsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLDZCQUE2QixFQUFFLEdBQUcsRUFBRTtRQUMzQyxJQUFJLENBQUMsb0NBQW9DLEVBQUUsR0FBRyxFQUFFO1lBQzlDLGVBQWUsQ0FBQyxlQUFlLENBQUMsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDekUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsMkNBQTJDLEVBQUUsR0FBRyxFQUFFO1lBQ3JELGNBQWMsQ0FBQyxlQUFlLENBQUMsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO1lBQ2pELGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxrQ0FBa0MsRUFBRTtnQkFDeEUsdUJBQXVCLEVBQUU7b0JBQ3ZCLElBQUksRUFBRSwwQkFBMEI7aUJBQ2pDO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsc0RBQXNELEVBQUUsR0FBRyxFQUFFO1lBQ2hFLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRTtnQkFDdEQsd0JBQXdCLEVBQUU7b0JBQ3hCLFNBQVMsRUFBRSxDQUFDOzRCQUNWLE1BQU0sRUFBRSxnQkFBZ0I7NEJBQ3hCLE1BQU0sRUFBRSxPQUFPOzRCQUNmLFNBQVMsRUFBRTtnQ0FDVCxPQUFPLEVBQUUsc0JBQXNCOzZCQUNoQzt5QkFDRixDQUFDO2lCQUNIO2FBQ0YsQ0FBQyxDQUFDO1lBRUgsZUFBZSxDQUFDLHFCQUFxQixDQUFDLGtCQUFrQixFQUFFO2dCQUN4RCxjQUFjLEVBQUU7b0JBQ2QsU0FBUyxFQUFFLGtCQUFLLENBQUMsU0FBUyxDQUFDO3dCQUN6QixrQkFBSyxDQUFDLFVBQVUsQ0FBQzs0QkFDZixNQUFNLEVBQUUsT0FBTzs0QkFDZixRQUFRLEVBQUUsa0JBQUssQ0FBQyxRQUFRLEVBQUU7eUJBQzNCLENBQUM7cUJBQ0gsQ0FBQztpQkFDSDthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsdUJBQXVCLEVBQUUsR0FBRyxFQUFFO1FBQ3JDLElBQUksQ0FBQyxxREFBcUQsRUFBRSxHQUFHLEVBQUU7WUFDL0QsZUFBZSxDQUFDLHFCQUFxQixDQUFDLGtDQUFrQyxFQUFFO2dCQUN4RSxnQkFBZ0IsRUFBRSxrQkFBSyxDQUFDLFVBQVUsQ0FBQztvQkFDakMsVUFBVSxFQUFFLGtCQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2xDLENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxpREFBaUQsRUFBRSxHQUFHLEVBQUU7WUFDM0QsZUFBZSxDQUFDLHFCQUFxQixDQUFDLGtDQUFrQyxFQUFFO2dCQUN4RSxnQkFBZ0IsRUFBRSxrQkFBSyxDQUFDLFVBQVUsQ0FBQztvQkFDakMsVUFBVSxFQUFFLGtCQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2xDLENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyw4Q0FBOEMsRUFBRSxHQUFHLEVBQUU7WUFDeEQsZUFBZSxDQUFDLHFCQUFxQixDQUFDLGtDQUFrQyxFQUFFO2dCQUN4RSxnQkFBZ0IsRUFBRSxrQkFBSyxDQUFDLFVBQVUsQ0FBQztvQkFDakMsVUFBVSxFQUFFLGtCQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2xDLENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLHlCQUF5QixFQUFFLEdBQUcsRUFBRTtRQUN2QyxJQUFJLENBQUMsd0NBQXdDLEVBQUUsR0FBRyxFQUFFO1lBQ2xELGtCQUFrQixDQUFDLHFCQUFxQixDQUFDLGtDQUFrQyxFQUFFO2dCQUMzRSxnQkFBZ0IsRUFBRSxrQkFBSyxDQUFDLFVBQVUsQ0FBQztvQkFDakMsVUFBVSxFQUFFLGtCQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2xDLENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyw2Q0FBNkMsRUFBRSxHQUFHLEVBQUU7WUFDdkQsc0JBQXNCLENBQUMscUJBQXFCLENBQUMsa0NBQWtDLEVBQUU7Z0JBQy9FLGdCQUFnQixFQUFFLGtCQUFLLENBQUMsVUFBVSxDQUFDO29CQUNqQyxVQUFVLEVBQUUsa0JBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDbEMsQ0FBQzthQUNILENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGlFQUFpRSxFQUFFLEdBQUcsRUFBRTtZQUMzRSxlQUFlLENBQUMscUJBQXFCLENBQUMsa0NBQWtDLEVBQUU7Z0JBQ3hFLGdCQUFnQixFQUFFLGtCQUFLLENBQUMsVUFBVSxDQUFDO29CQUNqQyxVQUFVLEVBQUUsa0JBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztpQkFDbEMsQ0FBQzthQUNILENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsc0JBQXNCLEVBQUUsR0FBRyxFQUFFO1FBQ3BDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxHQUFHLEVBQUU7WUFDeEMsY0FBYyxDQUFDLGVBQWUsQ0FBQyxzQkFBc0IsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMxRCxjQUFjLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLEVBQUU7Z0JBQzNELFNBQVMsRUFBRSxDQUFDO3dCQUNWLGFBQWEsRUFBRSxZQUFZO3dCQUMzQixPQUFPLEVBQUUsTUFBTTtxQkFDaEIsQ0FBQzthQUNILENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRTtZQUN4QyxjQUFjLENBQUMsZUFBZSxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLDJCQUEyQjtRQUNqRixDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxxQ0FBcUMsRUFBRSxHQUFHLEVBQUU7WUFDL0MsY0FBYyxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixFQUFFO2dCQUN0RCxnQkFBZ0IsRUFBRSxrQkFBSyxDQUFDLFVBQVUsQ0FBQztvQkFDakMsaUNBQWlDLEVBQUUsa0JBQUssQ0FBQyxRQUFRLEVBQUU7aUJBQ3BELENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQywrQkFBK0IsRUFBRSxHQUFHLEVBQUU7WUFDekMsY0FBYyxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRTtnQkFDakQsY0FBYyxFQUFFLFFBQVE7Z0JBQ3hCLG1CQUFtQixFQUFFLFFBQVE7YUFDOUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyx5QkFBeUIsRUFBRSxHQUFHLEVBQUU7UUFDdkMsSUFBSSxDQUFDLHFEQUFxRCxFQUFFLEdBQUcsRUFBRTtZQUMvRCxtQkFBbUIsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRTtnQkFDakUsSUFBSSxFQUFFLGFBQWE7YUFDcEIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsa0RBQWtELEVBQUUsR0FBRyxFQUFFO1lBQzVELG1CQUFtQixDQUFDLHFCQUFxQixDQUFDLGtDQUFrQyxFQUFFO2dCQUM1RSxnQkFBZ0IsRUFBRSxrQkFBSyxDQUFDLFVBQVUsQ0FBQztvQkFDakMsVUFBVSxFQUFFLGtCQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ2xDLENBQUM7YUFDSCxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsUUFBUSxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUU7UUFDeEIsSUFBSSxDQUFDLGtDQUFrQyxFQUFFLEdBQUcsRUFBRTtZQUM1QyxlQUFlLENBQUMscUJBQXFCLENBQUMsc0JBQXNCLEVBQUU7Z0JBQzVELGdCQUFnQixFQUFFO29CQUNoQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsT0FBTyxFQUFFLEtBQUs7aUJBQ2Y7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyw2QkFBNkIsRUFBRSxHQUFHLEVBQUU7WUFDdkMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLGlCQUFpQixFQUFFO2dCQUN2RCxnQkFBZ0IsRUFBRTtvQkFDaEIsaUNBQWlDLEVBQUUsQ0FBQzs0QkFDbEMsNkJBQTZCLEVBQUU7Z0NBQzdCLFlBQVksRUFBRSxTQUFTOzZCQUN4Qjt5QkFDRixDQUFDO2lCQUNIO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxFQUFFO1lBQ3ZDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxpQkFBaUIsRUFBRTtnQkFDdkQsY0FBYyxFQUFFLGtCQUFLLENBQUMsUUFBUSxFQUFFO2FBQ2pDLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLGtEQUFrRCxFQUFFLEdBQUcsRUFBRTtZQUM1RCxlQUFlLENBQUMscUJBQXFCLENBQUMsa0NBQWtDLEVBQUU7Z0JBQ3hFLHVCQUF1QixFQUFFO29CQUN2QixJQUFJLEVBQUUsMEJBQTBCO29CQUNoQyxRQUFRLEVBQUUsa0JBQUssQ0FBQyxRQUFRLEVBQUU7aUJBQzNCO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1lBQ3JDLGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRTtnQkFDN0QsY0FBYyxFQUFFO29CQUNkLFNBQVMsRUFBRSxrQkFBSyxDQUFDLFNBQVMsQ0FBQzt3QkFDekIsa0JBQUssQ0FBQyxVQUFVLENBQUM7NEJBQ2YsTUFBTSxFQUFFLE1BQU07NEJBQ2QsU0FBUyxFQUFFO2dDQUNULElBQUksRUFBRTtvQ0FDSixxQkFBcUIsRUFBRSxPQUFPO2lDQUMvQjs2QkFDRjt5QkFDRixDQUFDO3FCQUNILENBQUM7aUJBQ0g7YUFDRixDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksQ0FBQywyQkFBMkIsRUFBRSxHQUFHLEVBQUU7WUFDckMsZUFBZSxDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixFQUFFO2dCQUM3RCxjQUFjLEVBQUU7b0JBQ2QsU0FBUyxFQUFFLGtCQUFLLENBQUMsU0FBUyxDQUFDO3dCQUN6QixrQkFBSyxDQUFDLFVBQVUsQ0FBQzs0QkFDZixNQUFNLEVBQUUsTUFBTTs0QkFDZCxTQUFTLEVBQUU7Z0NBQ1QsSUFBSSxFQUFFO29DQUNKLHFCQUFxQixFQUFFLE9BQU87aUNBQy9COzZCQUNGO3lCQUNGLENBQUM7cUJBQ0gsQ0FBQztpQkFDSDthQUNGLENBQUMsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLElBQUksQ0FBQyxzQ0FBc0MsRUFBRSxHQUFHLEVBQUU7WUFDaEQsZUFBZSxDQUFDLHFCQUFxQixDQUFDLHVCQUF1QixFQUFFO2dCQUM3RCxPQUFPLEVBQUUsZUFBZTtnQkFDeEIsV0FBVyxFQUFFO29CQUNYLFNBQVMsRUFBRTt3QkFDVCxpQkFBaUIsRUFBRSxrQkFBSyxDQUFDLFFBQVEsRUFBRTt3QkFDbkMsVUFBVSxFQUFFLE1BQU07cUJBQ25CO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1lBQ3pELGVBQWUsQ0FBQyxxQkFBcUIsQ0FBQyxpQ0FBaUMsRUFBRTtnQkFDdkUsU0FBUyxFQUFFLEVBQUU7Z0JBQ2IsY0FBYyxFQUFFLGtCQUFLLENBQUMsUUFBUSxFQUFFO2dCQUNoQyxZQUFZLEVBQUUsa0JBQUssQ0FBQyxRQUFRLEVBQUU7YUFDL0IsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1lBQ3pELGVBQWUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDeEQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFO1FBQzdCLElBQUksQ0FBQyxvREFBb0QsRUFBRSxHQUFHLEVBQUU7WUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBQSwwQkFBYSxHQUFFLENBQUM7WUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxtQkFBSyxDQUFDLE9BQU8sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sU0FBUyxHQUFHLElBQUksc0JBQXNCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixFQUFFO2dCQUNyRSxtQkFBbUIsRUFBRSxLQUFLO2FBQzNCLENBQUMsQ0FBQztZQUNILFNBQVMsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQy9CLE1BQU0sUUFBUSxHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBRTNDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyxrQ0FBa0MsRUFBRTtnQkFDakUsb0JBQW9CLEVBQUUsa0JBQUssQ0FBQyxNQUFNLEVBQUU7YUFDckMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsdUNBQXVDLEVBQUUsR0FBRyxFQUFFO1lBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUEsMEJBQWEsR0FBRSxDQUFDO1lBQ2hDLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxPQUFPLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztZQUMzRCxNQUFNLFNBQVMsR0FBRyxJQUFJLHNCQUFzQixDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtnQkFDdkUsbUJBQW1CLEVBQUUsSUFBSTthQUMxQixDQUFDLENBQUM7WUFDSCxTQUFTLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMvQixNQUFNLFFBQVEsR0FBRyxxQkFBUSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUUzQyxRQUFRLENBQUMscUJBQXFCLENBQUMsa0NBQWtDLEVBQUU7Z0JBQ2pFLG9CQUFvQixFQUFFLGtCQUFLLENBQUMsVUFBVSxDQUFDO29CQUNyQyxLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDO2FBQ0gsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUU7UUFDL0IsSUFBSSxDQUFDLHNDQUFzQyxFQUFFLEdBQUcsRUFBRTtZQUNoRCxlQUFlLENBQUMsZUFBZSxDQUFDLHNCQUFzQixFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNELGVBQWUsQ0FBQyxlQUFlLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDdEQsZUFBZSxDQUFDLGVBQWUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN0RCxlQUFlLENBQUMsZUFBZSxDQUFDLGtDQUFrQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pFLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO1FBQ3pDLElBQUksQ0FBQyw2Q0FBNkMsRUFBRSxHQUFHLEVBQUU7WUFDdkQscUNBQXFDO1lBQ3JDLE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDLGFBQWEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQzdFLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRSxDQUN6RSxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQ2pFLENBQUM7WUFFRixNQUFNLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUMsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsNEVBQTRFLEVBQUUsR0FBRyxFQUFFO1lBQ3RGLHdFQUF3RTtZQUN4RSxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsYUFBYSxDQUFDLGtDQUFrQyxDQUFDLENBQUM7WUFDdkYsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNyRCxNQUFNLGdCQUFnQixHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUM7WUFFbkYsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUV4RSx1REFBdUQ7WUFDdkQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0VBQWdFLEVBQUUsR0FBRyxFQUFFO1lBQzFFLCtDQUErQztZQUMvQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFN0UsaUNBQWlDO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDckcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCwgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUsIE1hdGNoIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVUeXBlLCBUYWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgTGFtYmRhSW52b2tlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQWNjZXNzTG9nIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IEV2ZW50YnJpZGdlQnJva2VyIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2ZvdW5kYXRpb24vZXZlbnRicmlkZ2UtYnJva2VyJztcbmltcG9ydCB7IGNyZWF0ZVRlc3RBcHAgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBRdWV1ZWRTM0FkYXB0ZXIgfSBmcm9tICcuLi9hZGFwdGVyJztcbmltcG9ydCB7IEJhc2VEb2N1bWVudFByb2Nlc3NpbmcsIERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIH0gZnJvbSAnLi4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcblxuLy8gQ29uY3JldGUgdGVzdCBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nXG5jbGFzcyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nIGV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZyB7XG4gIHByaXZhdGUgY2xhc3NpZmljYXRpb25GbjogRnVuY3Rpb247XG4gIHByaXZhdGUgcHJvY2Vzc2luZ0ZuOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogYW55LCBpZDogc3RyaW5nLCBwcm9wczogYW55KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLmNsYXNzaWZpY2F0aW9uRm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ0NsYXNzaWZpY2F0aW9uRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoeyBkb2N1bWVudENsYXNzaWZpY2F0aW9uOiBcIlRFU1RcIiB9KTsnKSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvY2Vzc2luZ0ZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdQcm9jZXNzaW5nRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoeyByZXN1bHQ6IHt9IH0pOycpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsYXNzaWZpY2F0aW9uU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tDbGFzc2lmaWNhdGlvbicsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNsYXNzaWZpY2F0aW9uRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5jbGFzc2lmaWNhdGlvblJlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrUHJvY2Vzc2luZycsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLnByb2Nlc3NpbmdGbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLnByb2Nlc3NpbmdSZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVucmljaG1lbnRTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RQcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVQcm9jZXNzaW5nV29ya2Zsb3coKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU3RhbmRhcmRQcm9jZXNzaW5nV29ya2Zsb3coKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVTdGF0ZU1hY2hpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlU3RhdGVNYWNoaW5lQ3JlYXRpb24oJ3Rlc3Qtc3RhdGUtbWFjaGluZScpO1xuICB9XG59XG5cbi8vIFRlc3QgaW1wbGVtZW50YXRpb24gd2l0aCBlbnJpY2htZW50IHN0ZXBcbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRoRW5yaWNobWVudCBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG4gIHByaXZhdGUgZW5yaWNobWVudEZuOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogYW55LCBpZDogc3RyaW5nLCBwcm9wczogYW55KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLmNsYXNzaWZpY2F0aW9uRm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ0NsYXNzaWZpY2F0aW9uRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoeyBkb2N1bWVudENsYXNzaWZpY2F0aW9uOiBcIlRFU1RcIiB9KTsnKSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvY2Vzc2luZ0ZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdQcm9jZXNzaW5nRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoeyByZXN1bHQ6IHt9IH0pOycpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbnJpY2htZW50Rm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ0VucmljaG1lbnRGbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ2V4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+ICh7IGVucmljaGVkOiB0cnVlIH0pOycpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsYXNzaWZpY2F0aW9uU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tDbGFzc2lmaWNhdGlvbicsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNsYXNzaWZpY2F0aW9uRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5jbGFzc2lmaWNhdGlvblJlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrUHJvY2Vzc2luZycsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLnByb2Nlc3NpbmdGbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLnByb2Nlc3NpbmdSZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVucmljaG1lbnRTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0VucmljaG1lbnQnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5lbnJpY2htZW50Rm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5lbnJpY2hlZFJlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByZXByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lLWVucmljaG1lbnQnKTtcbiAgfVxufVxuXG4vLyBUZXN0IGltcGxlbWVudGF0aW9uIHdpdGggcG9zdC1wcm9jZXNzaW5nIHN0ZXBcbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRoUG9zdFByb2Nlc3NpbmcgZXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIHtcbiAgcHJpdmF0ZSBjbGFzc2lmaWNhdGlvbkZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBwcm9jZXNzaW5nRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHBvc3RQcm9jZXNzaW5nRm46IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBhbnksIGlkOiBzdHJpbmcsIHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuY2xhc3NpZmljYXRpb25GbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnQ2xhc3NpZmljYXRpb25GbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ2V4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+ICh7IGRvY3VtZW50Q2xhc3NpZmljYXRpb246IFwiVEVTVFwiIH0pOycpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jZXNzaW5nRm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ1Byb2Nlc3NpbmdGbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ2V4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+ICh7IHJlc3VsdDoge30gfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnBvc3RQcm9jZXNzaW5nRm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ1Bvc3RQcm9jZXNzaW5nRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoeyBwcm9jZXNzZWQ6IHRydWUgfSk7JyksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xhc3NpZmljYXRpb25TdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0NsYXNzaWZpY2F0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2xhc3NpZmljYXRpb25GbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja1Bvc3RQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucG9zdFByb2Nlc3NpbmdGbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLnBvc3RQcm9jZXNzZWRSZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByZXByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lLXBvc3QtcHJvY2Vzc2luZycpO1xuICB9XG59XG5cbi8vIFRlc3QgaW1wbGVtZW50YXRpb24gd2l0aCBwcmVwcm9jZXNzaW5nIHN0ZXBcbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRoUHJlcHJvY2Vzc2luZyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG4gIHByaXZhdGUgcHJlcHJvY2Vzc2luZ0ZuOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogYW55LCBpZDogc3RyaW5nLCBwcm9wczogYW55KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLnByZXByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJlcHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcHJlcHJvY2Vzc2VkOiB0cnVlIH0pOycpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcmVwcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJlcHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJlcHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xhc3NpZmljYXRpb25TdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0NsYXNzaWZpY2F0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2xhc3NpZmljYXRpb25GbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lLXByZXByb2Nlc3NpbmcnKTtcbiAgfVxufVxuXG5kZXNjcmliZSgnQmFzZURvY3VtZW50UHJvY2Vzc2luZycsICgpID0+IHtcbiAgbGV0IGFwcDogQXBwO1xuICBsZXQgbWluaW1hbFN0YWNrOiBTdGFjaztcbiAgbGV0IGN1c3RvbVN0YWNrOiBTdGFjaztcbiAgbGV0IGVucmljaG1lbnRTdGFjazogU3RhY2s7XG4gIGxldCBwb3N0UHJvY2Vzc2luZ1N0YWNrOiBTdGFjaztcbiAgbGV0IHByZXByb2Nlc3NpbmdTdGFjazogU3RhY2s7XG4gIGxldCBldmVudEJyaWRnZVN0YWNrOiBTdGFjaztcbiAgbGV0IG1pbmltYWxUZW1wbGF0ZTogVGVtcGxhdGU7XG4gIGxldCBjdXN0b21UZW1wbGF0ZTogVGVtcGxhdGU7XG4gIGxldCBlbnJpY2htZW50VGVtcGxhdGU6IFRlbXBsYXRlO1xuICBsZXQgcG9zdFByb2Nlc3NpbmdUZW1wbGF0ZTogVGVtcGxhdGU7XG4gIGxldCBwcmVwcm9jZXNzaW5nVGVtcGxhdGU6IFRlbXBsYXRlO1xuICBsZXQgZXZlbnRCcmlkZ2VUZW1wbGF0ZTogVGVtcGxhdGU7XG5cbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICAvLyBVc2UgY3JlYXRlVGVzdEFwcCgpIHRvIHNraXAgYnVuZGxpbmcgYW5kIHNwZWVkIHVwIHRlc3RzXG4gICAgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuXG4gICAgLy8gTWluaW1hbCBjb25maWd1cmF0aW9uXG4gICAgbWluaW1hbFN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ01pbmltYWxTdGFjaycpO1xuICAgIGNvbnN0IG1pbmltYWxDb25zdHJ1Y3QgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZyhtaW5pbWFsU3RhY2ssICdNaW5pbWFsVGVzdCcsIHt9KTtcbiAgICBtaW5pbWFsQ29uc3RydWN0LmNyZWF0ZVN0YXRlTWFjaGluZSgpO1xuXG4gICAgLy8gQ3VzdG9tIGNvbmZpZ3VyYXRpb24gd2l0aCBjdXN0b20gdGFibGUsIGJ1Y2tldCwgYW5kIHRpbWVvdXRcbiAgICBjdXN0b21TdGFjayA9IG5ldyBTdGFjayhhcHAsICdDdXN0b21TdGFjaycpO1xuICAgIGNvbnN0IGN1c3RvbVRhYmxlID0gbmV3IFRhYmxlKGN1c3RvbVN0YWNrLCAnQ3VzdG9tVGFibGUnLCB7XG4gICAgICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogJ0RvY3VtZW50SWQnLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGN1c3RvbUtleSA9IG5ldyBLZXkoY3VzdG9tU3RhY2ssICdDdXN0b21LZXknLCB7IGVuYWJsZUtleVJvdGF0aW9uOiB0cnVlIH0pO1xuICAgIGNvbnN0IGFjY2Vzc0xvZyA9IG5ldyBBY2Nlc3NMb2coY3VzdG9tU3RhY2ssICdBY2Nlc3NMb2cnKTtcbiAgICBjb25zdCBjdXN0b21CdWNrZXQgPSBuZXcgQnVja2V0KGN1c3RvbVN0YWNrLCAnQ3VzdG9tQnVja2V0Jywge1xuICAgICAgc2VydmVyQWNjZXNzTG9nc0J1Y2tldDogYWNjZXNzTG9nLmJ1Y2tldCxcbiAgICAgIHNlcnZlckFjY2Vzc0xvZ3NQcmVmaXg6IGFjY2Vzc0xvZy5idWNrZXRQcmVmaXgsXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGN1c3RvbUFkYXB0ZXIgPSBuZXcgUXVldWVkUzNBZGFwdGVyKHsgYnVja2V0OiBjdXN0b21CdWNrZXQgfSk7XG4gICAgY29uc3QgY3VzdG9tQ29uc3RydWN0ID0gbmV3IFRlc3REb2N1bWVudFByb2Nlc3NpbmcoY3VzdG9tU3RhY2ssICdDdXN0b21UZXN0Jywge1xuICAgICAgZG9jdW1lbnRQcm9jZXNzaW5nVGFibGU6IGN1c3RvbVRhYmxlLFxuICAgICAgaW5ncmVzc0FkYXB0ZXI6IGN1c3RvbUFkYXB0ZXIsXG4gICAgICB3b3JrZmxvd1RpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICBlbmNyeXB0aW9uS2V5OiBjdXN0b21LZXksXG4gICAgfSk7XG4gICAgY3VzdG9tQ29uc3RydWN0LmNyZWF0ZVN0YXRlTWFjaGluZSgpO1xuXG4gICAgLy8gV2l0aCBlbnJpY2htZW50IHN0ZXBcbiAgICBlbnJpY2htZW50U3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnRW5yaWNobWVudFN0YWNrJyk7XG4gICAgY29uc3QgZW5yaWNobWVudENvbnN0cnVjdCA9IG5ldyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nV2l0aEVucmljaG1lbnQoZW5yaWNobWVudFN0YWNrLCAnRW5yaWNobWVudFRlc3QnLCB7fSk7XG4gICAgZW5yaWNobWVudENvbnN0cnVjdC5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuICAgIC8vIFdpdGggcG9zdC1wcm9jZXNzaW5nIHN0ZXBcbiAgICBwb3N0UHJvY2Vzc2luZ1N0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Bvc3RQcm9jZXNzaW5nU3RhY2snKTtcbiAgICBjb25zdCBwb3N0UHJvY2Vzc2luZ0NvbnN0cnVjdCA9IG5ldyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nV2l0aFBvc3RQcm9jZXNzaW5nKHBvc3RQcm9jZXNzaW5nU3RhY2ssICdQb3N0UHJvY2Vzc2luZ1Rlc3QnLCB7fSk7XG4gICAgcG9zdFByb2Nlc3NpbmdDb25zdHJ1Y3QuY3JlYXRlU3RhdGVNYWNoaW5lKCk7XG5cbiAgICAvLyBXaXRoIHByZXByb2Nlc3Npbmcgc3RlcFxuICAgIHByZXByb2Nlc3NpbmdTdGFjayA9IG5ldyBTdGFjayhhcHAsICdQcmVwcm9jZXNzaW5nU3RhY2snKTtcbiAgICBjb25zdCBwcmVwcm9jZXNzaW5nQ29uc3RydWN0ID0gbmV3IFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRoUHJlcHJvY2Vzc2luZyhwcmVwcm9jZXNzaW5nU3RhY2ssICdQcmVwcm9jZXNzaW5nVGVzdCcsIHt9KTtcbiAgICBwcmVwcm9jZXNzaW5nQ29uc3RydWN0LmNyZWF0ZVN0YXRlTWFjaGluZSgpO1xuXG4gICAgLy8gV2l0aCBFdmVudEJyaWRnZSBicm9rZXJcbiAgICBldmVudEJyaWRnZVN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ0V2ZW50QnJpZGdlU3RhY2snKTtcbiAgICBjb25zdCBicm9rZXIgPSBuZXcgRXZlbnRicmlkZ2VCcm9rZXIoZXZlbnRCcmlkZ2VTdGFjaywgJ1Rlc3RCcm9rZXInLCB7XG4gICAgICBuYW1lOiAndGVzdC1icm9rZXInLFxuICAgICAgZXZlbnRTb3VyY2U6ICd0ZXN0LXNvdXJjZScsXG4gICAgfSk7XG4gICAgY29uc3QgZXZlbnRCcmlkZ2VDb25zdHJ1Y3QgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZyhldmVudEJyaWRnZVN0YWNrLCAnRXZlbnRCcmlkZ2VUZXN0Jywge1xuICAgICAgZXZlbnRicmlkZ2VCcm9rZXI6IGJyb2tlcixcbiAgICB9KTtcbiAgICBldmVudEJyaWRnZUNvbnN0cnVjdC5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuICAgIC8vIEdlbmVyYXRlIHRlbXBsYXRlcyBvbmNlXG4gICAgbWluaW1hbFRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKG1pbmltYWxTdGFjayk7XG4gICAgY3VzdG9tVGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soY3VzdG9tU3RhY2spO1xuICAgIGVucmljaG1lbnRUZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhlbnJpY2htZW50U3RhY2spO1xuICAgIHBvc3RQcm9jZXNzaW5nVGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2socG9zdFByb2Nlc3NpbmdTdGFjayk7XG4gICAgcHJlcHJvY2Vzc2luZ1RlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHByZXByb2Nlc3NpbmdTdGFjayk7XG4gICAgZXZlbnRCcmlkZ2VUZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhldmVudEJyaWRnZVN0YWNrKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Jhc2ljIGZ1bmN0aW9uYWxpdHknLCAoKSA9PiB7XG4gICAgdGVzdCgnY3JlYXRlcyBjb25zdHJ1Y3Qgd2l0aCBtaW5pbWFsIGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3QobWluaW1hbFRlbXBsYXRlKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY3JlYXRlcyBEeW5hbW9EQiB0YWJsZSB3aXRoIGNvcnJlY3QgY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge1xuICAgICAgICBLZXlTY2hlbWE6IFt7XG4gICAgICAgICAgQXR0cmlidXRlTmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICAgIEtleVR5cGU6ICdIQVNIJyxcbiAgICAgICAgfV0sXG4gICAgICAgIEJpbGxpbmdNb2RlOiAnUEFZX1BFUl9SRVFVRVNUJyxcbiAgICAgICAgUG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb246IHtcbiAgICAgICAgICBQb2ludEluVGltZVJlY292ZXJ5RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgS01TIGVuY3J5cHRpb24ga2V5IHdpdGggcm90YXRpb24gZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6S01TOjpLZXknLCB7XG4gICAgICAgIEVuYWJsZUtleVJvdGF0aW9uOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIFMzIGJ1Y2tldCBmb3IgZG9jdW1lbnQgc3RvcmFnZScsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICAgICAgQnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjogW3tcbiAgICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgIFNTRUFsZ29yaXRobTogJ2F3czprbXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY3JlYXRlcyBTUVMgcXVldWUgd2l0aCBETFEnLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlNRUzo6UXVldWUnLCB7XG4gICAgICAgIFJlZHJpdmVQb2xpY3k6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIG1heFJlY2VpdmVDb3VudDogNSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgU3RlcCBGdW5jdGlvbnMgc3RhdGUgbWFjaGluZScsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTdGF0ZSBtYWNoaW5lIGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgdGVzdCgnY3JlYXRlcyBzdGF0ZSBtYWNoaW5lIHdpdGggdGltZW91dCcsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIHN0YXRlIG1hY2hpbmUgd2l0aCBjdXN0b20gdGltZW91dCcsICgpID0+IHtcbiAgICAgIGN1c3RvbVRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCAxKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgc3RhdGUgbWFjaGluZSB3aXRoIGVuY3J5cHRpb24nLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHtcbiAgICAgICAgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBUeXBlOiAnQ1VTVE9NRVJfTUFOQUdFRF9LTVNfS0VZJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY3JlYXRlcyBzdGF0ZSBtYWNoaW5lIHJvbGUgd2l0aCBEeW5hbW9EQiBwZXJtaXNzaW9ucycsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICBTdGF0ZW1lbnQ6IFt7XG4gICAgICAgICAgICBBY3Rpb246ICdzdHM6QXNzdW1lUm9sZScsXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgICAgU2VydmljZTogJ3N0YXRlcy5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfV0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlBvbGljeScsIHtcbiAgICAgICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICBTdGF0ZW1lbnQ6IE1hdGNoLmFycmF5V2l0aChbXG4gICAgICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgICBSZXNvdXJjZTogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFcnJvciBoYW5kbGluZyBjaGFpbnMnLCAoKSA9PiB7XG4gICAgdGVzdCgnaW5jbHVkZXMgRHluYW1vREIgdXBkYXRlIGZvciBjbGFzc2lmaWNhdGlvbiBmYWlsdXJlJywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIERlZmluaXRpb25TdHJpbmc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbJyddKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIER5bmFtb0RCIHVwZGF0ZSBmb3IgcHJvY2Vzc2luZyBmYWlsdXJlJywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIERlZmluaXRpb25TdHJpbmc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbJyddKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIHdvcmtmbG93IHN0YXR1cyB1cGRhdGVzIGZvciBzdWNjZXNzJywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIERlZmluaXRpb25TdHJpbmc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbJyddKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ09wdGlvbmFsIHdvcmtmbG93IHN0ZXBzJywgKCkgPT4ge1xuICAgIHRlc3QoJ2luY2x1ZGVzIGVucmljaG1lbnQgc3RlcCB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgZW5yaWNobWVudFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIERlZmluaXRpb25TdHJpbmc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbJyddKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIHBvc3QtcHJvY2Vzc2luZyBzdGVwIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBwb3N0UHJvY2Vzc2luZ1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIERlZmluaXRpb25TdHJpbmc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbJyddKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ21hcmtzIHdvcmtmbG93IGNvbXBsZXRlIGFmdGVyIHByb2Nlc3Npbmcgd2hlbiBubyBvcHRpb25hbCBzdGVwcycsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywge1xuICAgICAgICBEZWZpbml0aW9uU3RyaW5nOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAnRm46OkpvaW4nOiBNYXRjaC5hcnJheVdpdGgoWycnXSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDdXN0b20gY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCd1c2VzIHByb3ZpZGVkIER5bmFtb0RCIHRhYmxlJywgKCkgPT4ge1xuICAgICAgY3VzdG9tVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIDEpO1xuICAgICAgY3VzdG9tVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgS2V5U2NoZW1hOiBbe1xuICAgICAgICAgIEF0dHJpYnV0ZU5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgICBLZXlUeXBlOiAnSEFTSCcsXG4gICAgICAgIH1dLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd1c2VzIHByb3ZpZGVkIGVuY3J5cHRpb24ga2V5JywgKCkgPT4ge1xuICAgICAgY3VzdG9tVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OktNUzo6S2V5JywgMik7IC8vIEN1c3RvbSBrZXkgKyBhZGFwdGVyIGtleVxuICAgIH0pO1xuXG4gICAgdGVzdCgndXNlcyBwcm92aWRlZCBTMyBidWNrZXQgdmlhIGFkYXB0ZXInLCAoKSA9PiB7XG4gICAgICBjdXN0b21UZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICAgICAgQnVja2V0RW5jcnlwdGlvbjogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgU2VydmVyU2lkZUVuY3J5cHRpb25Db25maWd1cmF0aW9uOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnYXBwbGllcyBjdXN0b20gcmVtb3ZhbCBwb2xpY3knLCAoKSA9PiB7XG4gICAgICBjdXN0b21UZW1wbGF0ZS5oYXNSZXNvdXJjZSgnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7XG4gICAgICAgIERlbGV0aW9uUG9saWN5OiAnUmV0YWluJyxcbiAgICAgICAgVXBkYXRlUmVwbGFjZVBvbGljeTogJ1JldGFpbicsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0V2ZW50QnJpZGdlIGludGVncmF0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ2luY2x1ZGVzIEV2ZW50QnJpZGdlIGV2ZW50IGJ1cyB3aGVuIGJyb2tlciBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGV2ZW50QnJpZGdlVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkV2ZW50czo6RXZlbnRCdXMnLCB7XG4gICAgICAgIE5hbWU6ICd0ZXN0LWJyb2tlcicsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIEV2ZW50QnJpZGdlIHB1dCBldmVudHMgaW4gc3RhdGUgbWFjaGluZScsICgpID0+IHtcbiAgICAgIGV2ZW50QnJpZGdlVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHtcbiAgICAgICAgRGVmaW5pdGlvblN0cmluZzogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgJ0ZuOjpKb2luJzogTWF0Y2guYXJyYXlXaXRoKFsnJ10pLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2VjdXJpdHknLCAoKSA9PiB7XG4gICAgdGVzdCgnZW5jcnlwdHMgRHluYW1vREIgdGFibGUgd2l0aCBLTVMnLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2VuY3J5cHRzIFMzIGJ1Y2tldCB3aXRoIEtNUycsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICAgICAgQnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjogW3tcbiAgICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgIFNTRUFsZ29yaXRobTogJ2F3czprbXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZW5jcnlwdHMgU1FTIHF1ZXVlIHdpdGggS01TJywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTUVM6OlF1ZXVlJywge1xuICAgICAgICBLbXNNYXN0ZXJLZXlJZDogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZW5jcnlwdHMgc3RhdGUgbWFjaGluZSB3aXRoIGN1c3RvbWVyIG1hbmFnZWQga2V5JywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIEVuY3J5cHRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgVHlwZTogJ0NVU1RPTUVSX01BTkFHRURfS01TX0tFWScsXG4gICAgICAgICAgS21zS2V5SWQ6IE1hdGNoLmFueVZhbHVlKCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2VuZm9yY2VzIFNTTCBvbiBTMyBidWNrZXQnLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXRQb2xpY3knLCB7XG4gICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICAgIEVmZmVjdDogJ0RlbnknLFxuICAgICAgICAgICAgICBDb25kaXRpb246IHtcbiAgICAgICAgICAgICAgICBCb29sOiB7XG4gICAgICAgICAgICAgICAgICAnYXdzOlNlY3VyZVRyYW5zcG9ydCc6ICdmYWxzZScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdlbmZvcmNlcyBTU0wgb24gU1FTIHF1ZXVlJywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTUVM6OlF1ZXVlUG9saWN5Jywge1xuICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgIFN0YXRlbWVudDogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgICBFZmZlY3Q6ICdEZW55JyxcbiAgICAgICAgICAgICAgQ29uZGl0aW9uOiB7XG4gICAgICAgICAgICAgICAgQm9vbDoge1xuICAgICAgICAgICAgICAgICAgJ2F3czpTZWN1cmVUcmFuc3BvcnQnOiAnZmFsc2UnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQWRhcHRlciBpbnRlZ3JhdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCdjcmVhdGVzIFMzIGV2ZW50IG5vdGlmaWNhdGlvbiB0byBTUVMnLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICAgIEhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBWYXJpYWJsZXM6IHtcbiAgICAgICAgICAgIFNUQVRFX01BQ0hJTkVfQVJOOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICAgICAgUkFXX1BSRUZJWDogJ3Jhdy8nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgU1FTIGNvbnN1bWVyIExhbWJkYSB3aXRoIGV2ZW50IHNvdXJjZScsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpFdmVudFNvdXJjZU1hcHBpbmcnLCB7XG4gICAgICAgIEJhdGNoU2l6ZTogMTAsXG4gICAgICAgIEV2ZW50U291cmNlQXJuOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICBGdW5jdGlvbk5hbWU6IE1hdGNoLmFueVZhbHVlKCksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgZGVhZCBsZXR0ZXIgcXVldWUgZm9yIGZhaWxlZCBtZXNzYWdlcycsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U1FTOjpRdWV1ZScsIDIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnT2JzZXJ2YWJpbGl0eScsICgpID0+IHtcbiAgICB0ZXN0KCdjcmVhdGVzIGNvbnN0cnVjdCB3aXRob3V0IG9ic2VydmFiaWxpdHkgYnkgZGVmYXVsdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3RBcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayh0ZXN0QXBwLCAnTm9PYnNlcnZhYmlsaXR5U3RhY2snKTtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdCA9IG5ldyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnTm9PYnNlcnZhYmlsaXR5Jywge1xuICAgICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3RydWN0LmNyZWF0ZVN0YXRlTWFjaGluZSgpO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywge1xuICAgICAgICBMb2dnaW5nQ29uZmlndXJhdGlvbjogTWF0Y2guYWJzZW50KCksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2VuYWJsZXMgb2JzZXJ2YWJpbGl0eSB3aGVuIGNvbmZpZ3VyZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0QXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sodGVzdEFwcCwgJ1dpdGhPYnNlcnZhYmlsaXR5U3RhY2snKTtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdCA9IG5ldyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnV2l0aE9ic2VydmFiaWxpdHknLCB7XG4gICAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0cnVjdC5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcblxuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHtcbiAgICAgICAgTG9nZ2luZ0NvbmZpZ3VyYXRpb246IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIExldmVsOiAnQUxMJyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Jlc291cmNlIGNvdW50cycsICgpID0+IHtcbiAgICB0ZXN0KCdjcmVhdGVzIGV4cGVjdGVkIG51bWJlciBvZiByZXNvdXJjZXMnLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIDEpO1xuICAgICAgbWluaW1hbFRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTMzo6QnVja2V0JywgMSk7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OlNRUzo6UXVldWUnLCAyKTtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQcmVwcm9jZXNzaW5nIGludGVncmF0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ2luY2x1ZGVzIHByZXByb2Nlc3NpbmcgTGFtYmRhIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICAvLyBWZXJpZnkgcHJlcHJvY2Vzc2luZyBMYW1iZGEgZXhpc3RzXG4gICAgICBjb25zdCBsYW1iZGFzID0gcHJlcHJvY2Vzc2luZ1RlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicpO1xuICAgICAgY29uc3QgaGFzUHJlcHJvY2Vzc2luZ0xhbWJkYSA9IE9iamVjdC52YWx1ZXMobGFtYmRhcykuc29tZSgobGFtYmRhOiBhbnkpID0+XG4gICAgICAgIGxhbWJkYS5Qcm9wZXJ0aWVzPy5Db2RlPy5aaXBGaWxlPy5pbmNsdWRlcygncHJlcHJvY2Vzc2VkOiB0cnVlJyksXG4gICAgICApO1xuXG4gICAgICBleHBlY3QoaGFzUHJlcHJvY2Vzc2luZ0xhbWJkYSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dvcmtmbG93IHdpdGhvdXQgcHJlcHJvY2Vzc2luZyB1c2VzIHN0YW5kYXJkIGZsb3cgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpJywgKCkgPT4ge1xuICAgICAgLy8gTWluaW1hbCB0ZW1wbGF0ZSBoYXMgbm8gcHJlcHJvY2Vzc2luZywgc2hvdWxkIHN0YXJ0IHdpdGggSW5pdE1ldGFkYXRhXG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmUgPSBtaW5pbWFsVGVtcGxhdGUuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZSlbMF07XG4gICAgICBjb25zdCBkZWZpbml0aW9uU3RyaW5nID0gc3RhdGVNYWNoaW5lW3N0YXRlTWFjaGluZUtleV0uUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nO1xuXG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gSlNPTi5wYXJzZShkZWZpbml0aW9uU3RyaW5nWydGbjo6Sm9pbiddWzFdLmpvaW4oJycpKTtcblxuICAgICAgLy8gU2hvdWxkIHN0YXJ0IHdpdGggSW5pdE1ldGFkYXRhIHdoZW4gbm8gcHJlcHJvY2Vzc2luZ1xuICAgICAgZXhwZWN0KGRlZmluaXRpb24uU3RhcnRBdCkudG9NYXRjaCgvSW5pdE1ldGFkYXRhLyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzdGF0ZSBtYWNoaW5lIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IHdpdGggcHJlcHJvY2Vzc2luZyBjbGFzcycsICgpID0+IHtcbiAgICAgIC8vIFZlcmlmeSBzdGF0ZSBtYWNoaW5lIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICBwcmVwcm9jZXNzaW5nVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIDEpO1xuXG4gICAgICAvLyBWZXJpZnkgaXQgaGFzIExhbWJkYSBmdW5jdGlvbnNcbiAgICAgIGNvbnN0IGxhbWJkYUNvdW50ID0gT2JqZWN0LmtleXMocHJlcHJvY2Vzc2luZ1RlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicpKS5sZW5ndGg7XG4gICAgICBleHBlY3QobGFtYmRhQ291bnQpLnRvQmVHcmVhdGVyVGhhbk9yRXF1YWwoMyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
616
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy90ZXN0cy9iYXNlLWRvY3VtZW50LXByb2Nlc3NpbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZDQUFrRTtBQUNsRSx1REFBeUQ7QUFDekQsMkRBQWdFO0FBQ2hFLGlEQUEwQztBQUMxQyx1REFBaUU7QUFDakUsK0NBQTRDO0FBQzVDLGlGQUFtRTtBQUNuRSwrQ0FBNEM7QUFDNUMsc0ZBQWtGO0FBQ2xGLDJEQUEyRDtBQUMzRCx3Q0FBNkM7QUFDN0MsMEVBQWlHO0FBRWpHLHlEQUF5RDtBQUN6RCxNQUFNLHNCQUF1QixTQUFRLGlEQUFzQjtJQUNqRCxnQkFBZ0IsQ0FBVztJQUMzQixZQUFZLENBQVc7SUFFL0IsWUFBWSxLQUFVLEVBQUUsRUFBVSxFQUFFLEtBQVU7UUFDNUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFeEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLElBQUkscUJBQVEsQ0FBQyxJQUFJLEVBQUUsa0JBQWtCLEVBQUU7WUFDN0QsT0FBTyxFQUFFLG9CQUFPLENBQUMsV0FBVztZQUM1QixPQUFPLEVBQUUsZUFBZTtZQUN4QixJQUFJLEVBQUUsaUJBQUksQ0FBQyxVQUFVLENBQUMscUVBQXFFLENBQUM7U0FDN0YsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLHFCQUFRLENBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRTtZQUNyRCxPQUFPLEVBQUUsb0JBQU8sQ0FBQyxXQUFXO1lBQzVCLE9BQU8sRUFBRSxlQUFlO1lBQ3hCLElBQUksRUFBRSxpQkFBSSxDQUFDLFVBQVUsQ0FBQyxpREFBaUQsQ0FBQztTQUN6RSxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRVMsa0JBQWtCO1FBQzFCLE9B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RSx1REFBdUQ7WUFDdkQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDckQsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsZ0VBQWdFLEVBQUUsR0FBRyxFQUFFO1lBQzFFLCtDQUErQztZQUMvQyxxQkFBcUIsQ0FBQyxlQUFlLENBQUMsa0NBQWtDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFN0UsaUNBQWlDO1lBQ2pDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsYUFBYSxDQUFDLHVCQUF1QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7WUFDckcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcCwgRHVyYXRpb24sIFJlbW92YWxQb2xpY3ksIFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgVGVtcGxhdGUsIE1hdGNoIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBBdHRyaWJ1dGVUeXBlLCBUYWJsZSB9IGZyb20gJ2F3cy1jZGstbGliL2F3cy1keW5hbW9kYic7XG5pbXBvcnQgeyBLZXkgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3Mta21zJztcbmltcG9ydCB7IENvZGUsIEZ1bmN0aW9uLCBSdW50aW1lIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgeyBCdWNrZXQgfSBmcm9tICdhd3MtY2RrLWxpYi9hd3MtczMnO1xuaW1wb3J0IHsgTGFtYmRhSW52b2tlIH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXN0ZXBmdW5jdGlvbnMtdGFza3MnO1xuaW1wb3J0IHsgQWNjZXNzTG9nIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrJztcbmltcG9ydCB7IEV2ZW50YnJpZGdlQnJva2VyIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2ZvdW5kYXRpb24vZXZlbnRicmlkZ2UtYnJva2VyJztcbmltcG9ydCB7IGNyZWF0ZVRlc3RBcHAgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBRdWV1ZWRTM0FkYXB0ZXIgfSBmcm9tICcuLi9hZGFwdGVyJztcbmltcG9ydCB7IEJhc2VEb2N1bWVudFByb2Nlc3NpbmcsIERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIH0gZnJvbSAnLi4vYmFzZS1kb2N1bWVudC1wcm9jZXNzaW5nJztcblxuLy8gQ29uY3JldGUgdGVzdCBpbXBsZW1lbnRhdGlvbiBvZiBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nXG5jbGFzcyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nIGV4dGVuZHMgQmFzZURvY3VtZW50UHJvY2Vzc2luZyB7XG4gIHByaXZhdGUgY2xhc3NpZmljYXRpb25GbjogRnVuY3Rpb247XG4gIHByaXZhdGUgcHJvY2Vzc2luZ0ZuOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogYW55LCBpZDogc3RyaW5nLCBwcm9wczogYW55KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLmNsYXNzaWZpY2F0aW9uRm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ0NsYXNzaWZpY2F0aW9uRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoeyBkb2N1bWVudENsYXNzaWZpY2F0aW9uOiBcIlRFU1RcIiB9KTsnKSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvY2Vzc2luZ0ZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdQcm9jZXNzaW5nRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoeyByZXN1bHQ6IHt9IH0pOycpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsYXNzaWZpY2F0aW9uU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tDbGFzc2lmaWNhdGlvbicsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNsYXNzaWZpY2F0aW9uRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5jbGFzc2lmaWNhdGlvblJlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrUHJvY2Vzc2luZycsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLnByb2Nlc3NpbmdGbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLnByb2Nlc3NpbmdSZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVucmljaG1lbnRTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBvc3RQcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByb3RlY3RlZCBjcmVhdGVQcm9jZXNzaW5nV29ya2Zsb3coKSB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlU3RhbmRhcmRQcm9jZXNzaW5nV29ya2Zsb3coKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVTdGF0ZU1hY2hpbmUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlU3RhdGVNYWNoaW5lQ3JlYXRpb24oJ3Rlc3Qtc3RhdGUtbWFjaGluZScpO1xuICB9XG59XG5cbi8vIFRlc3QgaW1wbGVtZW50YXRpb24gd2l0aCBlbnJpY2htZW50IHN0ZXBcbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRoRW5yaWNobWVudCBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG4gIHByaXZhdGUgZW5yaWNobWVudEZuOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogYW55LCBpZDogc3RyaW5nLCBwcm9wczogYW55KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLmNsYXNzaWZpY2F0aW9uRm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ0NsYXNzaWZpY2F0aW9uRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoeyBkb2N1bWVudENsYXNzaWZpY2F0aW9uOiBcIlRFU1RcIiB9KTsnKSxcbiAgICB9KTtcblxuICAgIHRoaXMucHJvY2Vzc2luZ0ZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdQcm9jZXNzaW5nRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoeyByZXN1bHQ6IHt9IH0pOycpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5lbnJpY2htZW50Rm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ0VucmljaG1lbnRGbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ2V4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+ICh7IGVucmljaGVkOiB0cnVlIH0pOycpLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsYXNzaWZpY2F0aW9uU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tDbGFzc2lmaWNhdGlvbicsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLmNsYXNzaWZpY2F0aW9uRm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5jbGFzc2lmaWNhdGlvblJlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcHJvY2Vzc2luZ1N0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUge1xuICAgIHJldHVybiBuZXcgTGFtYmRhSW52b2tlKHRoaXMsICdNb2NrUHJvY2Vzc2luZycsIHtcbiAgICAgIGxhbWJkYUZ1bmN0aW9uOiB0aGlzLnByb2Nlc3NpbmdGbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLnByb2Nlc3NpbmdSZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGVucmljaG1lbnRTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0VucmljaG1lbnQnLCB7XG4gICAgICBsYW1iZGFGdW5jdGlvbjogdGhpcy5lbnJpY2htZW50Rm4sXG4gICAgICByZXN1bHRQYXRoOiAnJC5lbnJpY2hlZFJlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByZXByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lLWVucmljaG1lbnQnKTtcbiAgfVxufVxuXG4vLyBUZXN0IGltcGxlbWVudGF0aW9uIHdpdGggcG9zdC1wcm9jZXNzaW5nIHN0ZXBcbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRoUG9zdFByb2Nlc3NpbmcgZXh0ZW5kcyBCYXNlRG9jdW1lbnRQcm9jZXNzaW5nIHtcbiAgcHJpdmF0ZSBjbGFzc2lmaWNhdGlvbkZuOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSBwcm9jZXNzaW5nRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHBvc3RQcm9jZXNzaW5nRm46IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHNjb3BlOiBhbnksIGlkOiBzdHJpbmcsIHByb3BzOiBhbnkpIHtcbiAgICBzdXBlcihzY29wZSwgaWQsIHByb3BzKTtcblxuICAgIHRoaXMuY2xhc3NpZmljYXRpb25GbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnQ2xhc3NpZmljYXRpb25GbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ2V4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+ICh7IGRvY3VtZW50Q2xhc3NpZmljYXRpb246IFwiVEVTVFwiIH0pOycpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5wcm9jZXNzaW5nRm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ1Byb2Nlc3NpbmdGbicsIHtcbiAgICAgIHJ1bnRpbWU6IFJ1bnRpbWUuTk9ERUpTXzIwX1gsXG4gICAgICBoYW5kbGVyOiAnaW5kZXguaGFuZGxlcicsXG4gICAgICBjb2RlOiBDb2RlLmZyb21JbmxpbmUoJ2V4cG9ydHMuaGFuZGxlciA9IGFzeW5jICgpID0+ICh7IHJlc3VsdDoge30gfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnBvc3RQcm9jZXNzaW5nRm4gPSBuZXcgRnVuY3Rpb24odGhpcywgJ1Bvc3RQcm9jZXNzaW5nRm4nLCB7XG4gICAgICBydW50aW1lOiBSdW50aW1lLk5PREVKU18yMF9YLFxuICAgICAgaGFuZGxlcjogJ2luZGV4LmhhbmRsZXInLFxuICAgICAgY29kZTogQ29kZS5mcm9tSW5saW5lKCdleHBvcnRzLmhhbmRsZXIgPSBhc3luYyAoKSA9PiAoeyBwcm9jZXNzZWQ6IHRydWUgfSk7JyksXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xhc3NpZmljYXRpb25TdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0NsYXNzaWZpY2F0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2xhc3NpZmljYXRpb25GbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja1Bvc3RQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucG9zdFByb2Nlc3NpbmdGbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLnBvc3RQcm9jZXNzZWRSZXN1bHQnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByZXByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lLXBvc3QtcHJvY2Vzc2luZycpO1xuICB9XG59XG5cbi8vIFRlc3QgaW1wbGVtZW50YXRpb24gd2l0aCBwcmVwcm9jZXNzaW5nIHN0ZXBcbmNsYXNzIFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRoUHJlcHJvY2Vzc2luZyBleHRlbmRzIEJhc2VEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwcml2YXRlIGNsYXNzaWZpY2F0aW9uRm46IEZ1bmN0aW9uO1xuICBwcml2YXRlIHByb2Nlc3NpbmdGbjogRnVuY3Rpb247XG4gIHByaXZhdGUgcHJlcHJvY2Vzc2luZ0ZuOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihzY29wZTogYW55LCBpZDogc3RyaW5nLCBwcm9wczogYW55KSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkLCBwcm9wcyk7XG5cbiAgICB0aGlzLnByZXByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJlcHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcHJlcHJvY2Vzc2VkOiB0cnVlIH0pOycpLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jbGFzc2lmaWNhdGlvbkZuID0gbmV3IEZ1bmN0aW9uKHRoaXMsICdDbGFzc2lmaWNhdGlvbkZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgZG9jdW1lbnRDbGFzc2lmaWNhdGlvbjogXCJURVNUXCIgfSk7JyksXG4gICAgfSk7XG5cbiAgICB0aGlzLnByb2Nlc3NpbmdGbiA9IG5ldyBGdW5jdGlvbih0aGlzLCAnUHJvY2Vzc2luZ0ZuJywge1xuICAgICAgcnVudGltZTogUnVudGltZS5OT0RFSlNfMjBfWCxcbiAgICAgIGhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgIGNvZGU6IENvZGUuZnJvbUlubGluZSgnZXhwb3J0cy5oYW5kbGVyID0gYXN5bmMgKCkgPT4gKHsgcmVzdWx0OiB7fSB9KTsnKSxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcmVwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcmVwcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJlcHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJlcHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY2xhc3NpZmljYXRpb25TdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHtcbiAgICByZXR1cm4gbmV3IExhbWJkYUludm9rZSh0aGlzLCAnTW9ja0NsYXNzaWZpY2F0aW9uJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMuY2xhc3NpZmljYXRpb25GbixcbiAgICAgIHJlc3VsdFBhdGg6ICckLmNsYXNzaWZpY2F0aW9uUmVzdWx0JyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwcm9jZXNzaW5nU3RlcCgpOiBEb2N1bWVudFByb2Nlc3NpbmdTdGVwVHlwZSB7XG4gICAgcmV0dXJuIG5ldyBMYW1iZGFJbnZva2UodGhpcywgJ01vY2tQcm9jZXNzaW5nJywge1xuICAgICAgbGFtYmRhRnVuY3Rpb246IHRoaXMucHJvY2Vzc2luZ0ZuLFxuICAgICAgcmVzdWx0UGF0aDogJyQucHJvY2Vzc2luZ1Jlc3VsdCcsXG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgZW5yaWNobWVudFN0ZXAoKTogRG9jdW1lbnRQcm9jZXNzaW5nU3RlcFR5cGUgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9zdFByb2Nlc3NpbmdTdGVwKCk6IERvY3VtZW50UHJvY2Vzc2luZ1N0ZXBUeXBlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNyZWF0ZVByb2Nlc3NpbmdXb3JrZmxvdygpIHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVTdGFuZGFyZFByb2Nlc3NpbmdXb3JrZmxvdygpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVN0YXRlTWFjaGluZSgpIHtcbiAgICByZXR1cm4gdGhpcy5oYW5kbGVTdGF0ZU1hY2hpbmVDcmVhdGlvbigndGVzdC1zdGF0ZS1tYWNoaW5lLXByZXByb2Nlc3NpbmcnKTtcbiAgfVxufVxuXG5kZXNjcmliZSgnQmFzZURvY3VtZW50UHJvY2Vzc2luZycsICgpID0+IHtcbiAgbGV0IGFwcDogQXBwO1xuICBsZXQgbWluaW1hbFN0YWNrOiBTdGFjaztcbiAgbGV0IGN1c3RvbVN0YWNrOiBTdGFjaztcbiAgbGV0IGVucmljaG1lbnRTdGFjazogU3RhY2s7XG4gIGxldCBwb3N0UHJvY2Vzc2luZ1N0YWNrOiBTdGFjaztcbiAgbGV0IHByZXByb2Nlc3NpbmdTdGFjazogU3RhY2s7XG4gIGxldCBldmVudEJyaWRnZVN0YWNrOiBTdGFjaztcbiAgbGV0IG1pbmltYWxUZW1wbGF0ZTogVGVtcGxhdGU7XG4gIGxldCBjdXN0b21UZW1wbGF0ZTogVGVtcGxhdGU7XG4gIGxldCBlbnJpY2htZW50VGVtcGxhdGU6IFRlbXBsYXRlO1xuICBsZXQgcG9zdFByb2Nlc3NpbmdUZW1wbGF0ZTogVGVtcGxhdGU7XG4gIGxldCBwcmVwcm9jZXNzaW5nVGVtcGxhdGU6IFRlbXBsYXRlO1xuICBsZXQgZXZlbnRCcmlkZ2VUZW1wbGF0ZTogVGVtcGxhdGU7XG5cbiAgYmVmb3JlQWxsKCgpID0+IHtcbiAgICAvLyBVc2UgY3JlYXRlVGVzdEFwcCgpIHRvIHNraXAgYnVuZGxpbmcgYW5kIHNwZWVkIHVwIHRlc3RzXG4gICAgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuXG4gICAgLy8gTWluaW1hbCBjb25maWd1cmF0aW9uXG4gICAgbWluaW1hbFN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ01pbmltYWxTdGFjaycpO1xuICAgIGNvbnN0IG1pbmltYWxDb25zdHJ1Y3QgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZyhtaW5pbWFsU3RhY2ssICdNaW5pbWFsVGVzdCcsIHt9KTtcbiAgICBtaW5pbWFsQ29uc3RydWN0LmNyZWF0ZVN0YXRlTWFjaGluZSgpO1xuXG4gICAgLy8gQ3VzdG9tIGNvbmZpZ3VyYXRpb24gd2l0aCBjdXN0b20gdGFibGUsIGJ1Y2tldCwgYW5kIHRpbWVvdXRcbiAgICBjdXN0b21TdGFjayA9IG5ldyBTdGFjayhhcHAsICdDdXN0b21TdGFjaycpO1xuICAgIGNvbnN0IGN1c3RvbVRhYmxlID0gbmV3IFRhYmxlKGN1c3RvbVN0YWNrLCAnQ3VzdG9tVGFibGUnLCB7XG4gICAgICBwYXJ0aXRpb25LZXk6IHsgbmFtZTogJ0RvY3VtZW50SWQnLCB0eXBlOiBBdHRyaWJ1dGVUeXBlLlNUUklORyB9LFxuICAgIH0pO1xuICAgIGNvbnN0IGN1c3RvbUtleSA9IG5ldyBLZXkoY3VzdG9tU3RhY2ssICdDdXN0b21LZXknLCB7IGVuYWJsZUtleVJvdGF0aW9uOiB0cnVlIH0pO1xuICAgIGNvbnN0IGFjY2Vzc0xvZyA9IG5ldyBBY2Nlc3NMb2coY3VzdG9tU3RhY2ssICdBY2Nlc3NMb2cnKTtcbiAgICBjb25zdCBjdXN0b21CdWNrZXQgPSBuZXcgQnVja2V0KGN1c3RvbVN0YWNrLCAnQ3VzdG9tQnVja2V0Jywge1xuICAgICAgc2VydmVyQWNjZXNzTG9nc0J1Y2tldDogYWNjZXNzTG9nLmJ1Y2tldCxcbiAgICAgIHNlcnZlckFjY2Vzc0xvZ3NQcmVmaXg6IGFjY2Vzc0xvZy5idWNrZXRQcmVmaXgsXG4gICAgICBlbmZvcmNlU1NMOiB0cnVlLFxuICAgIH0pO1xuICAgIGNvbnN0IGN1c3RvbUFkYXB0ZXIgPSBuZXcgUXVldWVkUzNBZGFwdGVyKHsgYnVja2V0OiBjdXN0b21CdWNrZXQgfSk7XG4gICAgY29uc3QgY3VzdG9tQ29uc3RydWN0ID0gbmV3IFRlc3REb2N1bWVudFByb2Nlc3NpbmcoY3VzdG9tU3RhY2ssICdDdXN0b21UZXN0Jywge1xuICAgICAgZG9jdW1lbnRQcm9jZXNzaW5nVGFibGU6IGN1c3RvbVRhYmxlLFxuICAgICAgaW5ncmVzc0FkYXB0ZXI6IGN1c3RvbUFkYXB0ZXIsXG4gICAgICB3b3JrZmxvd1RpbWVvdXQ6IER1cmF0aW9uLm1pbnV0ZXMoMzApLFxuICAgICAgcmVtb3ZhbFBvbGljeTogUmVtb3ZhbFBvbGljeS5SRVRBSU4sXG4gICAgICBlbmNyeXB0aW9uS2V5OiBjdXN0b21LZXksXG4gICAgfSk7XG4gICAgY3VzdG9tQ29uc3RydWN0LmNyZWF0ZVN0YXRlTWFjaGluZSgpO1xuXG4gICAgLy8gV2l0aCBlbnJpY2htZW50IHN0ZXBcbiAgICBlbnJpY2htZW50U3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnRW5yaWNobWVudFN0YWNrJyk7XG4gICAgY29uc3QgZW5yaWNobWVudENvbnN0cnVjdCA9IG5ldyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nV2l0aEVucmljaG1lbnQoZW5yaWNobWVudFN0YWNrLCAnRW5yaWNobWVudFRlc3QnLCB7fSk7XG4gICAgZW5yaWNobWVudENvbnN0cnVjdC5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuICAgIC8vIFdpdGggcG9zdC1wcm9jZXNzaW5nIHN0ZXBcbiAgICBwb3N0UHJvY2Vzc2luZ1N0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ1Bvc3RQcm9jZXNzaW5nU3RhY2snKTtcbiAgICBjb25zdCBwb3N0UHJvY2Vzc2luZ0NvbnN0cnVjdCA9IG5ldyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nV2l0aFBvc3RQcm9jZXNzaW5nKHBvc3RQcm9jZXNzaW5nU3RhY2ssICdQb3N0UHJvY2Vzc2luZ1Rlc3QnLCB7fSk7XG4gICAgcG9zdFByb2Nlc3NpbmdDb25zdHJ1Y3QuY3JlYXRlU3RhdGVNYWNoaW5lKCk7XG5cbiAgICAvLyBXaXRoIHByZXByb2Nlc3Npbmcgc3RlcFxuICAgIHByZXByb2Nlc3NpbmdTdGFjayA9IG5ldyBTdGFjayhhcHAsICdQcmVwcm9jZXNzaW5nU3RhY2snKTtcbiAgICBjb25zdCBwcmVwcm9jZXNzaW5nQ29uc3RydWN0ID0gbmV3IFRlc3REb2N1bWVudFByb2Nlc3NpbmdXaXRoUHJlcHJvY2Vzc2luZyhwcmVwcm9jZXNzaW5nU3RhY2ssICdQcmVwcm9jZXNzaW5nVGVzdCcsIHt9KTtcbiAgICBwcmVwcm9jZXNzaW5nQ29uc3RydWN0LmNyZWF0ZVN0YXRlTWFjaGluZSgpO1xuXG4gICAgLy8gV2l0aCBFdmVudEJyaWRnZSBicm9rZXJcbiAgICBldmVudEJyaWRnZVN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ0V2ZW50QnJpZGdlU3RhY2snKTtcbiAgICBjb25zdCBicm9rZXIgPSBuZXcgRXZlbnRicmlkZ2VCcm9rZXIoZXZlbnRCcmlkZ2VTdGFjaywgJ1Rlc3RCcm9rZXInLCB7XG4gICAgICBuYW1lOiAndGVzdC1icm9rZXInLFxuICAgICAgZXZlbnRTb3VyY2U6ICd0ZXN0LXNvdXJjZScsXG4gICAgfSk7XG4gICAgY29uc3QgZXZlbnRCcmlkZ2VDb25zdHJ1Y3QgPSBuZXcgVGVzdERvY3VtZW50UHJvY2Vzc2luZyhldmVudEJyaWRnZVN0YWNrLCAnRXZlbnRCcmlkZ2VUZXN0Jywge1xuICAgICAgZXZlbnRicmlkZ2VCcm9rZXI6IGJyb2tlcixcbiAgICB9KTtcbiAgICBldmVudEJyaWRnZUNvbnN0cnVjdC5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcblxuICAgIC8vIEdlbmVyYXRlIHRlbXBsYXRlcyBvbmNlXG4gICAgbWluaW1hbFRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKG1pbmltYWxTdGFjayk7XG4gICAgY3VzdG9tVGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soY3VzdG9tU3RhY2spO1xuICAgIGVucmljaG1lbnRUZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhlbnJpY2htZW50U3RhY2spO1xuICAgIHBvc3RQcm9jZXNzaW5nVGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2socG9zdFByb2Nlc3NpbmdTdGFjayk7XG4gICAgcHJlcHJvY2Vzc2luZ1RlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHByZXByb2Nlc3NpbmdTdGFjayk7XG4gICAgZXZlbnRCcmlkZ2VUZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhldmVudEJyaWRnZVN0YWNrKTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0Jhc2ljIGZ1bmN0aW9uYWxpdHknLCAoKSA9PiB7XG4gICAgdGVzdCgnY3JlYXRlcyBjb25zdHJ1Y3Qgd2l0aCBtaW5pbWFsIGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgICBleHBlY3QobWluaW1hbFRlbXBsYXRlKS50b0JlRGVmaW5lZCgpO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY3JlYXRlcyBEeW5hbW9EQiB0YWJsZSB3aXRoIGNvcnJlY3QgY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6RHluYW1vREI6OlRhYmxlJywge1xuICAgICAgICBLZXlTY2hlbWE6IFt7XG4gICAgICAgICAgQXR0cmlidXRlTmFtZTogJ0RvY3VtZW50SWQnLFxuICAgICAgICAgIEtleVR5cGU6ICdIQVNIJyxcbiAgICAgICAgfV0sXG4gICAgICAgIEJpbGxpbmdNb2RlOiAnUEFZX1BFUl9SRVFVRVNUJyxcbiAgICAgICAgUG9pbnRJblRpbWVSZWNvdmVyeVNwZWNpZmljYXRpb246IHtcbiAgICAgICAgICBQb2ludEluVGltZVJlY292ZXJ5RW5hYmxlZDogdHJ1ZSxcbiAgICAgICAgfSxcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgS01TIGVuY3J5cHRpb24ga2V5IHdpdGggcm90YXRpb24gZW5hYmxlZCcsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6S01TOjpLZXknLCB7XG4gICAgICAgIEVuYWJsZUtleVJvdGF0aW9uOiB0cnVlLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIFMzIGJ1Y2tldCBmb3IgZG9jdW1lbnQgc3RvcmFnZScsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICAgICAgQnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjogW3tcbiAgICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgIFNTRUFsZ29yaXRobTogJ2F3czprbXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY3JlYXRlcyBTUVMgcXVldWUgd2l0aCBETFEnLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlNRUzo6UXVldWUnLCB7XG4gICAgICAgIFJlZHJpdmVQb2xpY3k6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIG1heFJlY2VpdmVDb3VudDogNSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgU3RlcCBGdW5jdGlvbnMgc3RhdGUgbWFjaGluZScsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdTdGF0ZSBtYWNoaW5lIGNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7XG4gICAgdGVzdCgnY3JlYXRlcyBzdGF0ZSBtYWNoaW5lIHdpdGggdGltZW91dCcsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdjcmVhdGVzIHN0YXRlIG1hY2hpbmUgd2l0aCBjdXN0b20gdGltZW91dCcsICgpID0+IHtcbiAgICAgIGN1c3RvbVRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCAxKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgc3RhdGUgbWFjaGluZSB3aXRoIGVuY3J5cHRpb24nLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHtcbiAgICAgICAgRW5jcnlwdGlvbkNvbmZpZ3VyYXRpb246IHtcbiAgICAgICAgICBUeXBlOiAnQ1VTVE9NRVJfTUFOQUdFRF9LTVNfS0VZJyxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnY3JlYXRlcyBzdGF0ZSBtYWNoaW5lIHJvbGUgd2l0aCBEeW5hbW9EQiBwZXJtaXNzaW9ucycsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6SUFNOjpSb2xlJywge1xuICAgICAgICBBc3N1bWVSb2xlUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICBTdGF0ZW1lbnQ6IFt7XG4gICAgICAgICAgICBBY3Rpb246ICdzdHM6QXNzdW1lUm9sZScsXG4gICAgICAgICAgICBFZmZlY3Q6ICdBbGxvdycsXG4gICAgICAgICAgICBQcmluY2lwYWw6IHtcbiAgICAgICAgICAgICAgU2VydmljZTogJ3N0YXRlcy5hbWF6b25hd3MuY29tJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgfV0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpJQU06OlBvbGljeScsIHtcbiAgICAgICAgUG9saWN5RG9jdW1lbnQ6IHtcbiAgICAgICAgICBTdGF0ZW1lbnQ6IE1hdGNoLmFycmF5V2l0aChbXG4gICAgICAgICAgICBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAgICAgRWZmZWN0OiAnQWxsb3cnLFxuICAgICAgICAgICAgICBSZXNvdXJjZTogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFcnJvciBoYW5kbGluZyBjaGFpbnMnLCAoKSA9PiB7XG4gICAgdGVzdCgnaW5jbHVkZXMgRHluYW1vREIgdXBkYXRlIGZvciBjbGFzc2lmaWNhdGlvbiBmYWlsdXJlJywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIERlZmluaXRpb25TdHJpbmc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbJyddKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIER5bmFtb0RCIHVwZGF0ZSBmb3IgcHJvY2Vzc2luZyBmYWlsdXJlJywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIERlZmluaXRpb25TdHJpbmc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbJyddKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIHdvcmtmbG93IHN0YXR1cyB1cGRhdGVzIGZvciBzdWNjZXNzJywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIERlZmluaXRpb25TdHJpbmc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbJyddKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ09wdGlvbmFsIHdvcmtmbG93IHN0ZXBzJywgKCkgPT4ge1xuICAgIHRlc3QoJ2luY2x1ZGVzIGVucmljaG1lbnQgc3RlcCB3aGVuIHByb3ZpZGVkJywgKCkgPT4ge1xuICAgICAgZW5yaWNobWVudFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIERlZmluaXRpb25TdHJpbmc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbJyddKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIHBvc3QtcHJvY2Vzc2luZyBzdGVwIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICBwb3N0UHJvY2Vzc2luZ1RlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIERlZmluaXRpb25TdHJpbmc6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICdGbjo6Sm9pbic6IE1hdGNoLmFycmF5V2l0aChbJyddKSxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ21hcmtzIHdvcmtmbG93IGNvbXBsZXRlIGFmdGVyIHByb2Nlc3Npbmcgd2hlbiBubyBvcHRpb25hbCBzdGVwcycsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywge1xuICAgICAgICBEZWZpbml0aW9uU3RyaW5nOiBNYXRjaC5vYmplY3RMaWtlKHtcbiAgICAgICAgICAnRm46OkpvaW4nOiBNYXRjaC5hcnJheVdpdGgoWycnXSksXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdDdXN0b20gY29uZmlndXJhdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCd1c2VzIHByb3ZpZGVkIER5bmFtb0RCIHRhYmxlJywgKCkgPT4ge1xuICAgICAgY3VzdG9tVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIDEpO1xuICAgICAgY3VzdG9tVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgS2V5U2NoZW1hOiBbe1xuICAgICAgICAgIEF0dHJpYnV0ZU5hbWU6ICdEb2N1bWVudElkJyxcbiAgICAgICAgICBLZXlUeXBlOiAnSEFTSCcsXG4gICAgICAgIH1dLFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCd1c2VzIHByb3ZpZGVkIGVuY3J5cHRpb24ga2V5JywgKCkgPT4ge1xuICAgICAgY3VzdG9tVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OktNUzo6S2V5JywgMik7IC8vIEN1c3RvbSBrZXkgKyBhZGFwdGVyIGtleVxuICAgIH0pO1xuXG4gICAgdGVzdCgndXNlcyBwcm92aWRlZCBTMyBidWNrZXQgdmlhIGFkYXB0ZXInLCAoKSA9PiB7XG4gICAgICBjdXN0b21UZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICAgICAgQnVja2V0RW5jcnlwdGlvbjogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgU2VydmVyU2lkZUVuY3J5cHRpb25Db25maWd1cmF0aW9uOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnYXBwbGllcyBjdXN0b20gcmVtb3ZhbCBwb2xpY3knLCAoKSA9PiB7XG4gICAgICBjdXN0b21UZW1wbGF0ZS5oYXNSZXNvdXJjZSgnQVdTOjpEeW5hbW9EQjo6VGFibGUnLCB7XG4gICAgICAgIERlbGV0aW9uUG9saWN5OiAnUmV0YWluJyxcbiAgICAgICAgVXBkYXRlUmVwbGFjZVBvbGljeTogJ1JldGFpbicsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ0V2ZW50QnJpZGdlIGludGVncmF0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ2luY2x1ZGVzIEV2ZW50QnJpZGdlIGV2ZW50IGJ1cyB3aGVuIGJyb2tlciBwcm92aWRlZCcsICgpID0+IHtcbiAgICAgIGV2ZW50QnJpZGdlVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkV2ZW50czo6RXZlbnRCdXMnLCB7XG4gICAgICAgIE5hbWU6ICd0ZXN0LWJyb2tlcicsXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2luY2x1ZGVzIEV2ZW50QnJpZGdlIHB1dCBldmVudHMgaW4gc3RhdGUgbWFjaGluZScsICgpID0+IHtcbiAgICAgIGV2ZW50QnJpZGdlVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHtcbiAgICAgICAgRGVmaW5pdGlvblN0cmluZzogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgJ0ZuOjpKb2luJzogTWF0Y2guYXJyYXlXaXRoKFsnJ10pLFxuICAgICAgICB9KSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnU2VjdXJpdHknLCAoKSA9PiB7XG4gICAgdGVzdCgnZW5jcnlwdHMgRHluYW1vREIgdGFibGUgd2l0aCBLTVMnLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIHtcbiAgICAgICAgU1NFU3BlY2lmaWNhdGlvbjoge1xuICAgICAgICAgIFNTRUVuYWJsZWQ6IHRydWUsXG4gICAgICAgICAgU1NFVHlwZTogJ0tNUycsXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2VuY3J5cHRzIFMzIGJ1Y2tldCB3aXRoIEtNUycsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6UzM6OkJ1Y2tldCcsIHtcbiAgICAgICAgQnVja2V0RW5jcnlwdGlvbjoge1xuICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQ29uZmlndXJhdGlvbjogW3tcbiAgICAgICAgICAgIFNlcnZlclNpZGVFbmNyeXB0aW9uQnlEZWZhdWx0OiB7XG4gICAgICAgICAgICAgIFNTRUFsZ29yaXRobTogJ2F3czprbXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9XSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZW5jcnlwdHMgU1FTIHF1ZXVlIHdpdGggS01TJywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTUVM6OlF1ZXVlJywge1xuICAgICAgICBLbXNNYXN0ZXJLZXlJZDogTWF0Y2guYW55VmFsdWUoKSxcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgdGVzdCgnZW5jcnlwdHMgc3RhdGUgbWFjaGluZSB3aXRoIGN1c3RvbWVyIG1hbmFnZWQga2V5JywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnLCB7XG4gICAgICAgIEVuY3J5cHRpb25Db25maWd1cmF0aW9uOiB7XG4gICAgICAgICAgVHlwZTogJ0NVU1RPTUVSX01BTkFHRURfS01TX0tFWScsXG4gICAgICAgICAgS21zS2V5SWQ6IE1hdGNoLmFueVZhbHVlKCksXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2VuZm9yY2VzIFNTTCBvbiBTMyBidWNrZXQnLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlMzOjpCdWNrZXRQb2xpY3knLCB7XG4gICAgICAgIFBvbGljeURvY3VtZW50OiB7XG4gICAgICAgICAgU3RhdGVtZW50OiBNYXRjaC5hcnJheVdpdGgoW1xuICAgICAgICAgICAgTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgICAgIEVmZmVjdDogJ0RlbnknLFxuICAgICAgICAgICAgICBDb25kaXRpb246IHtcbiAgICAgICAgICAgICAgICBCb29sOiB7XG4gICAgICAgICAgICAgICAgICAnYXdzOlNlY3VyZVRyYW5zcG9ydCc6ICdmYWxzZScsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdlbmZvcmNlcyBTU0wgb24gU1FTIHF1ZXVlJywgKCkgPT4ge1xuICAgICAgbWluaW1hbFRlbXBsYXRlLmhhc1Jlc291cmNlUHJvcGVydGllcygnQVdTOjpTUVM6OlF1ZXVlUG9saWN5Jywge1xuICAgICAgICBQb2xpY3lEb2N1bWVudDoge1xuICAgICAgICAgIFN0YXRlbWVudDogTWF0Y2guYXJyYXlXaXRoKFtcbiAgICAgICAgICAgIE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgICAgICBFZmZlY3Q6ICdEZW55JyxcbiAgICAgICAgICAgICAgQ29uZGl0aW9uOiB7XG4gICAgICAgICAgICAgICAgQm9vbDoge1xuICAgICAgICAgICAgICAgICAgJ2F3czpTZWN1cmVUcmFuc3BvcnQnOiAnZmFsc2UnLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnQWRhcHRlciBpbnRlZ3JhdGlvbicsICgpID0+IHtcbiAgICB0ZXN0KCdjcmVhdGVzIFMzIGV2ZW50IG5vdGlmaWNhdGlvbiB0byBTUVMnLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICAgIEhhbmRsZXI6ICdpbmRleC5oYW5kbGVyJyxcbiAgICAgICAgRW52aXJvbm1lbnQ6IHtcbiAgICAgICAgICBWYXJpYWJsZXM6IHtcbiAgICAgICAgICAgIFNUQVRFX01BQ0hJTkVfQVJOOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICAgICAgUkFXX1BSRUZJWDogJ3Jhdy8nLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgU1FTIGNvbnN1bWVyIExhbWJkYSB3aXRoIGV2ZW50IHNvdXJjZScsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpFdmVudFNvdXJjZU1hcHBpbmcnLCB7XG4gICAgICAgIEJhdGNoU2l6ZTogMTAsXG4gICAgICAgIEV2ZW50U291cmNlQXJuOiBNYXRjaC5hbnlWYWx1ZSgpLFxuICAgICAgICBGdW5jdGlvbk5hbWU6IE1hdGNoLmFueVZhbHVlKCksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2NyZWF0ZXMgZGVhZCBsZXR0ZXIgcXVldWUgZm9yIGZhaWxlZCBtZXNzYWdlcycsICgpID0+IHtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U1FTOjpRdWV1ZScsIDIpO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnT2JzZXJ2YWJpbGl0eScsICgpID0+IHtcbiAgICB0ZXN0KCdjcmVhdGVzIGNvbnN0cnVjdCB3aXRob3V0IG9ic2VydmFiaWxpdHkgYnkgZGVmYXVsdCcsICgpID0+IHtcbiAgICAgIGNvbnN0IHRlc3RBcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayh0ZXN0QXBwLCAnTm9PYnNlcnZhYmlsaXR5U3RhY2snKTtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdCA9IG5ldyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnTm9PYnNlcnZhYmlsaXR5Jywge1xuICAgICAgICBlbmFibGVPYnNlcnZhYmlsaXR5OiBmYWxzZSxcbiAgICAgIH0pO1xuICAgICAgY29uc3RydWN0LmNyZWF0ZVN0YXRlTWFjaGluZSgpO1xuICAgICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gICAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywge1xuICAgICAgICBMb2dnaW5nQ29uZmlndXJhdGlvbjogTWF0Y2guYWJzZW50KCksXG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ2VuYWJsZXMgb2JzZXJ2YWJpbGl0eSB3aGVuIGNvbmZpZ3VyZWQnLCAoKSA9PiB7XG4gICAgICBjb25zdCB0ZXN0QXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2sodGVzdEFwcCwgJ1dpdGhPYnNlcnZhYmlsaXR5U3RhY2snKTtcbiAgICAgIGNvbnN0IGNvbnN0cnVjdCA9IG5ldyBUZXN0RG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnV2l0aE9ic2VydmFiaWxpdHknLCB7XG4gICAgICAgIGVuYWJsZU9ic2VydmFiaWxpdHk6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIGNvbnN0cnVjdC5jcmVhdGVTdGF0ZU1hY2hpbmUoKTtcbiAgICAgIGNvbnN0IHRlbXBsYXRlID0gVGVtcGxhdGUuZnJvbVN0YWNrKHN0YWNrKTtcblxuICAgICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIHtcbiAgICAgICAgTG9nZ2luZ0NvbmZpZ3VyYXRpb246IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIExldmVsOiAnQUxMJyxcbiAgICAgICAgfSksXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgZGVzY3JpYmUoJ1Jlc291cmNlIGNvdW50cycsICgpID0+IHtcbiAgICB0ZXN0KCdjcmVhdGVzIGV4cGVjdGVkIG51bWJlciBvZiByZXNvdXJjZXMnLCAoKSA9PiB7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OkR5bmFtb0RCOjpUYWJsZScsIDEpO1xuICAgICAgbWluaW1hbFRlbXBsYXRlLnJlc291cmNlQ291bnRJcygnQVdTOjpTMzo6QnVja2V0JywgMSk7XG4gICAgICBtaW5pbWFsVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OlNRUzo6UXVldWUnLCAyKTtcbiAgICAgIG1pbmltYWxUZW1wbGF0ZS5yZXNvdXJjZUNvdW50SXMoJ0FXUzo6U3RlcEZ1bmN0aW9uczo6U3RhdGVNYWNoaW5lJywgMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdQcmVwcm9jZXNzaW5nIGludGVncmF0aW9uJywgKCkgPT4ge1xuICAgIHRlc3QoJ2luY2x1ZGVzIHByZXByb2Nlc3NpbmcgTGFtYmRhIHdoZW4gcHJvdmlkZWQnLCAoKSA9PiB7XG4gICAgICAvLyBWZXJpZnkgcHJlcHJvY2Vzc2luZyBMYW1iZGEgZXhpc3RzXG4gICAgICBjb25zdCBsYW1iZGFzID0gcHJlcHJvY2Vzc2luZ1RlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicpO1xuICAgICAgY29uc3QgaGFzUHJlcHJvY2Vzc2luZ0xhbWJkYSA9IE9iamVjdC52YWx1ZXMobGFtYmRhcykuc29tZSgobGFtYmRhOiBhbnkpID0+XG4gICAgICAgIGxhbWJkYS5Qcm9wZXJ0aWVzPy5Db2RlPy5aaXBGaWxlPy5pbmNsdWRlcygncHJlcHJvY2Vzc2VkOiB0cnVlJyksXG4gICAgICApO1xuXG4gICAgICBleHBlY3QoaGFzUHJlcHJvY2Vzc2luZ0xhbWJkYSkudG9CZSh0cnVlKTtcbiAgICB9KTtcblxuICAgIHRlc3QoJ3dvcmtmbG93IHdpdGhvdXQgcHJlcHJvY2Vzc2luZyB1c2VzIHN0YW5kYXJkIGZsb3cgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpJywgKCkgPT4ge1xuICAgICAgLy8gTWluaW1hbCB0ZW1wbGF0ZSBoYXMgbm8gcHJlcHJvY2Vzc2luZywgc2hvdWxkIHN0YXJ0IHdpdGggSW5pdE1ldGFkYXRhXG4gICAgICBjb25zdCBzdGF0ZU1hY2hpbmUgPSBtaW5pbWFsVGVtcGxhdGUuZmluZFJlc291cmNlcygnQVdTOjpTdGVwRnVuY3Rpb25zOjpTdGF0ZU1hY2hpbmUnKTtcbiAgICAgIGNvbnN0IHN0YXRlTWFjaGluZUtleSA9IE9iamVjdC5rZXlzKHN0YXRlTWFjaGluZSlbMF07XG4gICAgICBjb25zdCBkZWZpbml0aW9uU3RyaW5nID0gc3RhdGVNYWNoaW5lW3N0YXRlTWFjaGluZUtleV0uUHJvcGVydGllcy5EZWZpbml0aW9uU3RyaW5nO1xuXG4gICAgICBjb25zdCBkZWZpbml0aW9uID0gSlNPTi5wYXJzZShkZWZpbml0aW9uU3RyaW5nWydGbjo6Sm9pbiddWzFdLmpvaW4oJycpKTtcblxuICAgICAgLy8gU2hvdWxkIHN0YXJ0IHdpdGggSW5pdE1ldGFkYXRhIHdoZW4gbm8gcHJlcHJvY2Vzc2luZ1xuICAgICAgZXhwZWN0KGRlZmluaXRpb24uU3RhcnRBdCkudG9NYXRjaCgvSW5pdE1ldGFkYXRhLyk7XG4gICAgfSk7XG5cbiAgICB0ZXN0KCdzdGF0ZSBtYWNoaW5lIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5IHdpdGggcHJlcHJvY2Vzc2luZyBjbGFzcycsICgpID0+IHtcbiAgICAgIC8vIFZlcmlmeSBzdGF0ZSBtYWNoaW5lIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICBwcmVwcm9jZXNzaW5nVGVtcGxhdGUucmVzb3VyY2VDb3VudElzKCdBV1M6OlN0ZXBGdW5jdGlvbnM6OlN0YXRlTWFjaGluZScsIDEpO1xuXG4gICAgICAvLyBWZXJpZnkgaXQgaGFzIExhbWJkYSBmdW5jdGlvbnNcbiAgICAgIGNvbnN0IGxhbWJkYUNvdW50ID0gT2JqZWN0LmtleXMocHJlcHJvY2Vzc2luZ1RlbXBsYXRlLmZpbmRSZXNvdXJjZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicpKS5sZW5ndGg7XG4gICAgICBleHBlY3QobGFtYmRhQ291bnQpLnRvQmVHcmVhdGVyVGhhbk9yRXF1YWwoMyk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=
@@ -0,0 +1,111 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const path = __importStar(require("path"));
37
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
38
+ const assertions_1 = require("aws-cdk-lib/assertions");
39
+ const aws_s3_assets_1 = require("aws-cdk-lib/aws-s3-assets");
40
+ const localstack_1 = require("../../framework/localstack");
41
+ const test_utils_1 = require("../../utilities/test-utils");
42
+ const localstack_agentic_document_processing_1 = require("../localstack-agentic-document-processing");
43
+ class TestableLocalStackAgenticDocumentProcessing extends localstack_agentic_document_processing_1.LocalStackAgenticDocumentProcessing {
44
+ runtimeEntryPath() {
45
+ return this.resolveBedrockInvokeEntry();
46
+ }
47
+ }
48
+ describe('LocalStackAgenticDocumentProcessing', () => {
49
+ test('uses LocalStackBatchAgent and injects LocalStack endpoint env vars', () => {
50
+ const app = (0, test_utils_1.createTestApp)();
51
+ const stack = new aws_cdk_lib_1.Stack(app, 'LocalStackAgenticStack');
52
+ const systemPrompt = new aws_s3_assets_1.Asset(stack, 'SystemPrompt', {
53
+ path: path.join(__dirname, '../../framework/agents/resources/default-strands-agent/batch.py'),
54
+ });
55
+ new localstack_agentic_document_processing_1.LocalStackAgenticDocumentProcessing(stack, 'LocalStackAgentic', {
56
+ classificationBedrockModel: {
57
+ customModelId: localstack_1.DEFAULT_LOCALSTACK_OLLAMA_MODEL_ID,
58
+ },
59
+ processingAgentParameters: {
60
+ agentName: 'LocalAgenticProcessor',
61
+ prompt: 'Process the insurance claim document',
62
+ agentDefinition: {
63
+ bedrockModel: {
64
+ customModelId: localstack_1.DEFAULT_LOCALSTACK_OLLAMA_MODEL_ID,
65
+ },
66
+ systemPrompt,
67
+ },
68
+ },
69
+ localStack: {
70
+ endpointUrl: localstack_1.DEFAULT_LOCALSTACK_SANDBOX_ENDPOINT_URL,
71
+ },
72
+ });
73
+ const template = assertions_1.Template.fromStack(stack);
74
+ template.hasResourceProperties('AWS::Lambda::Function', {
75
+ Environment: {
76
+ Variables: assertions_1.Match.objectLike({
77
+ PROMPT: 'Process the insurance claim document',
78
+ LOCALSTACK_ENABLED: 'true',
79
+ AWS_ENDPOINT_URL: localstack_1.DEFAULT_LOCALSTACK_SANDBOX_ENDPOINT_URL,
80
+ AWS_ENDPOINT_URL_BEDROCK_RUNTIME: localstack_1.DEFAULT_LOCALSTACK_SANDBOX_ENDPOINT_URL,
81
+ AWS_ENDPOINT_URL_BEDROCK_AGENT_RUNTIME: localstack_1.DEFAULT_LOCALSTACK_SANDBOX_ENDPOINT_URL,
82
+ AWS_ENDPOINT_URL_S3: localstack_1.DEFAULT_LOCALSTACK_SANDBOX_ENDPOINT_URL,
83
+ }),
84
+ },
85
+ });
86
+ });
87
+ test('uses the LocalStack invoke runtime entry', () => {
88
+ const app = (0, test_utils_1.createTestApp)();
89
+ const stack = new aws_cdk_lib_1.Stack(app, 'LocalStackAgenticRuntimeStack');
90
+ const systemPrompt = new aws_s3_assets_1.Asset(stack, 'RuntimeSystemPrompt', {
91
+ path: path.join(__dirname, '../../framework/agents/resources/default-strands-agent/batch.py'),
92
+ });
93
+ const processing = new TestableLocalStackAgenticDocumentProcessing(stack, 'LocalStackAgenticRuntime', {
94
+ classificationBedrockModel: {
95
+ customModelId: localstack_1.DEFAULT_LOCALSTACK_OLLAMA_MODEL_ID,
96
+ },
97
+ processingAgentParameters: {
98
+ agentName: 'LocalAgenticProcessorRuntime',
99
+ prompt: 'Process the insurance claim document',
100
+ agentDefinition: {
101
+ bedrockModel: {
102
+ customModelId: localstack_1.DEFAULT_LOCALSTACK_OLLAMA_MODEL_ID,
103
+ },
104
+ systemPrompt,
105
+ },
106
+ },
107
+ });
108
+ expect(processing.runtimeEntryPath()).toContain(path.join('resources', 'default-localstack-invoke'));
109
+ });
110
+ });
111
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdGFjay1hZ2VudGljLWRvY3VtZW50LXByb2Nlc3NpbmcudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3VzZS1jYXNlcy9kb2N1bWVudC1wcm9jZXNzaW5nL3Rlc3RzL2xvY2Fsc3RhY2stYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsNkNBQW9DO0FBQ3BDLHVEQUF5RDtBQUN6RCw2REFBa0Q7QUFDbEQsMkRBR29DO0FBQ3BDLDJEQUEyRDtBQUMzRCxzR0FBZ0c7QUFFaEcsTUFBTSwyQ0FBNEMsU0FBUSw0RUFBbUM7SUFDcEYsZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBRUQsUUFBUSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtJQUNuRCxJQUFJLENBQUMsb0VBQW9FLEVBQUUsR0FBRyxFQUFFO1FBQzlFLE1BQU0sR0FBRyxHQUFHLElBQUEsMEJBQWEsR0FBRSxDQUFDO1FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUV2RCxNQUFNLFlBQVksR0FBRyxJQUFJLHFCQUFLLENBQUMsS0FBSyxFQUFFLGNBQWMsRUFBRTtZQUNwRCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsaUVBQWlFLENBQUM7U0FDOUYsQ0FBQyxDQUFDO1FBRUgsSUFBSSw0RUFBbUMsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUU7WUFDbEUsMEJBQTBCLEVBQUU7Z0JBQzFCLGFBQWEsRUFBRSwrQ0FBa0M7YUFDbEQ7WUFDRCx5QkFBeUIsRUFBRTtnQkFDekIsU0FBUyxFQUFFLHVCQUF1QjtnQkFDbEMsTUFBTSxFQUFFLHNDQUFzQztnQkFDOUMsZUFBZSxFQUFFO29CQUNmLFlBQVksRUFBRTt3QkFDWixhQUFhLEVBQUUsK0NBQWtDO3FCQUNsRDtvQkFDRCxZQUFZO2lCQUNiO2FBQ0Y7WUFDRCxVQUFVLEVBQUU7Z0JBQ1YsV0FBVyxFQUFFLG9EQUF1QzthQUNyRDtTQUNGLENBQUMsQ0FBQztRQUVILE1BQU0sUUFBUSxHQUFHLHFCQUFRLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTNDLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQyx1QkFBdUIsRUFBRTtZQUN0RCxXQUFXLEVBQUU7Z0JBQ1gsU0FBUyxFQUFFLGtCQUFLLENBQUMsVUFBVSxDQUFDO29CQUMxQixNQUFNLEVBQUUsc0NBQXNDO29CQUM5QyxrQkFBa0IsRUFBRSxNQUFNO29CQUMxQixnQkFBZ0IsRUFBRSxvREFBdUM7b0JBQ3pELGdDQUFnQyxFQUFFLG9EQUF1QztvQkFDekUsc0NBQXNDLEVBQUUsb0RBQXVDO29CQUMvRSxtQkFBbUIsRUFBRSxvREFBdUM7aUJBQzdELENBQUM7YUFDSDtTQUNGLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLDBDQUEwQyxFQUFFLEdBQUcsRUFBRTtRQUNwRCxNQUFNLEdBQUcsR0FBRyxJQUFBLDBCQUFhLEdBQUUsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxFQUFFLCtCQUErQixDQUFDLENBQUM7UUFFOUQsTUFBTSxZQUFZLEdBQUcsSUFBSSxxQkFBSyxDQUFDLEtBQUssRUFBRSxxQkFBcUIsRUFBRTtZQUMzRCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsaUVBQWlFLENBQUM7U0FDOUYsQ0FBQyxDQUFDO1FBRUgsTUFBTSxVQUFVLEdBQUcsSUFBSSwyQ0FBMkMsQ0FBQyxLQUFLLEVBQUUsMEJBQTBCLEVBQUU7WUFDcEcsMEJBQTBCLEVBQUU7Z0JBQzFCLGFBQWEsRUFBRSwrQ0FBa0M7YUFDbEQ7WUFDRCx5QkFBeUIsRUFBRTtnQkFDekIsU0FBUyxFQUFFLDhCQUE4QjtnQkFDekMsTUFBTSxFQUFFLHNDQUFzQztnQkFDOUMsZUFBZSxFQUFFO29CQUNmLFlBQVksRUFBRTt3QkFDWixhQUFhLEVBQUUsK0NBQWtDO3FCQUNsRDtvQkFDRCxZQUFZO2lCQUNiO2FBQ0Y7U0FDRixDQUFDLENBQUM7UUFFSCxNQUFNLENBQUMsVUFBVSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsMkJBQTJCLENBQUMsQ0FBQyxDQUFDO0lBQ3ZHLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgU3RhY2sgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgeyBNYXRjaCwgVGVtcGxhdGUgfSBmcm9tICdhd3MtY2RrLWxpYi9hc3NlcnRpb25zJztcbmltcG9ydCB7IEFzc2V0IH0gZnJvbSAnYXdzLWNkay1saWIvYXdzLXMzLWFzc2V0cyc7XG5pbXBvcnQge1xuICBERUZBVUxUX0xPQ0FMU1RBQ0tfT0xMQU1BX01PREVMX0lELFxuICBERUZBVUxUX0xPQ0FMU1RBQ0tfU0FOREJPWF9FTkRQT0lOVF9VUkwsXG59IGZyb20gJy4uLy4uL2ZyYW1ld29yay9sb2NhbHN0YWNrJztcbmltcG9ydCB7IGNyZWF0ZVRlc3RBcHAgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBMb2NhbFN0YWNrQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyB9IGZyb20gJy4uL2xvY2Fsc3RhY2stYWdlbnRpYy1kb2N1bWVudC1wcm9jZXNzaW5nJztcblxuY2xhc3MgVGVzdGFibGVMb2NhbFN0YWNrQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyBleHRlbmRzIExvY2FsU3RhY2tBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nIHtcbiAgcHVibGljIHJ1bnRpbWVFbnRyeVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlQmVkcm9ja0ludm9rZUVudHJ5KCk7XG4gIH1cbn1cblxuZGVzY3JpYmUoJ0xvY2FsU3RhY2tBZ2VudGljRG9jdW1lbnRQcm9jZXNzaW5nJywgKCkgPT4ge1xuICB0ZXN0KCd1c2VzIExvY2FsU3RhY2tCYXRjaEFnZW50IGFuZCBpbmplY3RzIExvY2FsU3RhY2sgZW5kcG9pbnQgZW52IHZhcnMnLCAoKSA9PiB7XG4gICAgY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ0xvY2FsU3RhY2tBZ2VudGljU3RhY2snKTtcblxuICAgIGNvbnN0IHN5c3RlbVByb21wdCA9IG5ldyBBc3NldChzdGFjaywgJ1N5c3RlbVByb21wdCcsIHtcbiAgICAgIHBhdGg6IHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi9mcmFtZXdvcmsvYWdlbnRzL3Jlc291cmNlcy9kZWZhdWx0LXN0cmFuZHMtYWdlbnQvYmF0Y2gucHknKSxcbiAgICB9KTtcblxuICAgIG5ldyBMb2NhbFN0YWNrQWdlbnRpY0RvY3VtZW50UHJvY2Vzc2luZyhzdGFjaywgJ0xvY2FsU3RhY2tBZ2VudGljJywge1xuICAgICAgY2xhc3NpZmljYXRpb25CZWRyb2NrTW9kZWw6IHtcbiAgICAgICAgY3VzdG9tTW9kZWxJZDogREVGQVVMVF9MT0NBTFNUQUNLX09MTEFNQV9NT0RFTF9JRCxcbiAgICAgIH0sXG4gICAgICBwcm9jZXNzaW5nQWdlbnRQYXJhbWV0ZXJzOiB7XG4gICAgICAgIGFnZW50TmFtZTogJ0xvY2FsQWdlbnRpY1Byb2Nlc3NvcicsXG4gICAgICAgIHByb21wdDogJ1Byb2Nlc3MgdGhlIGluc3VyYW5jZSBjbGFpbSBkb2N1bWVudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDoge1xuICAgICAgICAgICAgY3VzdG9tTW9kZWxJZDogREVGQVVMVF9MT0NBTFNUQUNLX09MTEFNQV9NT0RFTF9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBsb2NhbFN0YWNrOiB7XG4gICAgICAgIGVuZHBvaW50VXJsOiBERUZBVUxUX0xPQ0FMU1RBQ0tfU0FOREJPWF9FTkRQT0lOVF9VUkwsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICBWYXJpYWJsZXM6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIFBST01QVDogJ1Byb2Nlc3MgdGhlIGluc3VyYW5jZSBjbGFpbSBkb2N1bWVudCcsXG4gICAgICAgICAgTE9DQUxTVEFDS19FTkFCTEVEOiAndHJ1ZScsXG4gICAgICAgICAgQVdTX0VORFBPSU5UX1VSTDogREVGQVVMVF9MT0NBTFNUQUNLX1NBTkRCT1hfRU5EUE9JTlRfVVJMLFxuICAgICAgICAgIEFXU19FTkRQT0lOVF9VUkxfQkVEUk9DS19SVU5USU1FOiBERUZBVUxUX0xPQ0FMU1RBQ0tfU0FOREJPWF9FTkRQT0lOVF9VUkwsXG4gICAgICAgICAgQVdTX0VORFBPSU5UX1VSTF9CRURST0NLX0FHRU5UX1JVTlRJTUU6IERFRkFVTFRfTE9DQUxTVEFDS19TQU5EQk9YX0VORFBPSU5UX1VSTCxcbiAgICAgICAgICBBV1NfRU5EUE9JTlRfVVJMX1MzOiBERUZBVUxUX0xPQ0FMU1RBQ0tfU0FOREJPWF9FTkRQT0lOVF9VUkwsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgndXNlcyB0aGUgTG9jYWxTdGFjayBpbnZva2UgcnVudGltZSBlbnRyeScsICgpID0+IHtcbiAgICBjb25zdCBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnTG9jYWxTdGFja0FnZW50aWNSdW50aW1lU3RhY2snKTtcblxuICAgIGNvbnN0IHN5c3RlbVByb21wdCA9IG5ldyBBc3NldChzdGFjaywgJ1J1bnRpbWVTeXN0ZW1Qcm9tcHQnLCB7XG4gICAgICBwYXRoOiBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vLi4vZnJhbWV3b3JrL2FnZW50cy9yZXNvdXJjZXMvZGVmYXVsdC1zdHJhbmRzLWFnZW50L2JhdGNoLnB5JyksXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9jZXNzaW5nID0gbmV3IFRlc3RhYmxlTG9jYWxTdGFja0FnZW50aWNEb2N1bWVudFByb2Nlc3Npbmcoc3RhY2ssICdMb2NhbFN0YWNrQWdlbnRpY1J1bnRpbWUnLCB7XG4gICAgICBjbGFzc2lmaWNhdGlvbkJlZHJvY2tNb2RlbDoge1xuICAgICAgICBjdXN0b21Nb2RlbElkOiBERUZBVUxUX0xPQ0FMU1RBQ0tfT0xMQU1BX01PREVMX0lELFxuICAgICAgfSxcbiAgICAgIHByb2Nlc3NpbmdBZ2VudFBhcmFtZXRlcnM6IHtcbiAgICAgICAgYWdlbnROYW1lOiAnTG9jYWxBZ2VudGljUHJvY2Vzc29yUnVudGltZScsXG4gICAgICAgIHByb21wdDogJ1Byb2Nlc3MgdGhlIGluc3VyYW5jZSBjbGFpbSBkb2N1bWVudCcsXG4gICAgICAgIGFnZW50RGVmaW5pdGlvbjoge1xuICAgICAgICAgIGJlZHJvY2tNb2RlbDoge1xuICAgICAgICAgICAgY3VzdG9tTW9kZWxJZDogREVGQVVMVF9MT0NBTFNUQUNLX09MTEFNQV9NT0RFTF9JRCxcbiAgICAgICAgICB9LFxuICAgICAgICAgIHN5c3RlbVByb21wdCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBleHBlY3QocHJvY2Vzc2luZy5ydW50aW1lRW50cnlQYXRoKCkpLnRvQ29udGFpbihwYXRoLmpvaW4oJ3Jlc291cmNlcycsICdkZWZhdWx0LWxvY2Fsc3RhY2staW52b2tlJykpO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const path = __importStar(require("path"));
37
+ const aws_cdk_lib_1 = require("aws-cdk-lib");
38
+ const assertions_1 = require("aws-cdk-lib/assertions");
39
+ const network_1 = require("../../framework/foundation/network");
40
+ const localstack_1 = require("../../framework/localstack");
41
+ const test_utils_1 = require("../../utilities/test-utils");
42
+ const bedrock_document_processing_1 = require("../bedrock-document-processing");
43
+ const localstack_bedrock_document_processing_1 = require("../localstack-bedrock-document-processing");
44
+ class TestableLocalStackBedrockDocumentProcessing extends localstack_bedrock_document_processing_1.LocalStackBedrockDocumentProcessing {
45
+ runtimeEntryPath() {
46
+ return this.resolveBedrockInvokeEntry();
47
+ }
48
+ }
49
+ class TestableBedrockDocumentProcessing extends bedrock_document_processing_1.BedrockDocumentProcessing {
50
+ runtimeEntryPath() {
51
+ return this.resolveBedrockInvokeEntry();
52
+ }
53
+ }
54
+ describe('LocalStackBedrockDocumentProcessing', () => {
55
+ test('injects LocalStack endpoint variables into classification Lambda', () => {
56
+ const app = (0, test_utils_1.createTestApp)();
57
+ const stack = new aws_cdk_lib_1.Stack(app, 'LocalStackBedrockStack');
58
+ new localstack_bedrock_document_processing_1.LocalStackBedrockDocumentProcessing(stack, 'LocalStackBedrock', {
59
+ classificationBedrockModel: {
60
+ customModelId: localstack_1.DEFAULT_LOCALSTACK_OLLAMA_MODEL_ID,
61
+ useCrossRegionInference: true,
62
+ },
63
+ processingBedrockModel: {
64
+ customModelId: localstack_1.DEFAULT_LOCALSTACK_OLLAMA_MODEL_ID,
65
+ },
66
+ localStack: {
67
+ endpointUrl: localstack_1.DEFAULT_LOCALSTACK_SANDBOX_ENDPOINT_URL,
68
+ },
69
+ });
70
+ const template = assertions_1.Template.fromStack(stack);
71
+ template.hasResourceProperties('AWS::Lambda::Function', {
72
+ Environment: {
73
+ Variables: assertions_1.Match.objectLike({
74
+ INVOKE_TYPE: 'classification',
75
+ MODEL_ID: localstack_1.DEFAULT_LOCALSTACK_OLLAMA_MODEL_ID,
76
+ LOCALSTACK_ENABLED: 'true',
77
+ AWS_ENDPOINT_URL_BEDROCK_RUNTIME: localstack_1.DEFAULT_LOCALSTACK_SANDBOX_ENDPOINT_URL,
78
+ AWS_ENDPOINT_URL_S3: localstack_1.DEFAULT_LOCALSTACK_SANDBOX_ENDPOINT_URL,
79
+ }),
80
+ },
81
+ });
82
+ template.hasResourceProperties('AWS::Lambda::Function', {
83
+ Environment: {
84
+ Variables: assertions_1.Match.objectLike({
85
+ STATE_MACHINE_ARN: assertions_1.Match.anyValue(),
86
+ AWS_ENDPOINT_URL_STEPFUNCTIONS: localstack_1.DEFAULT_LOCALSTACK_SANDBOX_ENDPOINT_URL,
87
+ }),
88
+ },
89
+ });
90
+ });
91
+ test('does not create AWS Bedrock VPC endpoints when network is enabled', () => {
92
+ const app = (0, test_utils_1.createTestApp)();
93
+ const stack = new aws_cdk_lib_1.Stack(app, 'LocalStackBedrockNetworkStack');
94
+ const network = new network_1.Network(stack, 'Network');
95
+ new localstack_bedrock_document_processing_1.LocalStackBedrockDocumentProcessing(stack, 'LocalStackBedrockNetwork', {
96
+ network,
97
+ classificationBedrockModel: {
98
+ customModelId: localstack_1.DEFAULT_LOCALSTACK_OLLAMA_MODEL_ID,
99
+ },
100
+ processingBedrockModel: {
101
+ customModelId: localstack_1.DEFAULT_LOCALSTACK_OLLAMA_MODEL_ID,
102
+ },
103
+ localStack: {
104
+ endpointUrl: localstack_1.DEFAULT_LOCALSTACK_SANDBOX_ENDPOINT_URL,
105
+ },
106
+ });
107
+ const template = assertions_1.Template.fromStack(stack);
108
+ const vpcEndpoints = template.findResources('AWS::EC2::VPCEndpoint');
109
+ expect(Object.keys(vpcEndpoints)).toHaveLength(5);
110
+ const serviceNames = Object.values(vpcEndpoints)
111
+ .map((endpoint) => JSON.stringify(endpoint.Properties?.ServiceName ?? ''))
112
+ .join(' ');
113
+ expect(serviceNames).toContain('states');
114
+ expect(serviceNames).toContain('events');
115
+ expect(serviceNames).toContain('sqs');
116
+ expect(serviceNames).toContain('s3');
117
+ expect(serviceNames).not.toContain('bedrock');
118
+ expect(serviceNames).not.toContain('bedrock-runtime');
119
+ });
120
+ test('uses the LocalStack invoke runtime entry', () => {
121
+ const app = (0, test_utils_1.createTestApp)();
122
+ const stack = new aws_cdk_lib_1.Stack(app, 'LocalStackBedrockRuntimeStack');
123
+ const processing = new TestableLocalStackBedrockDocumentProcessing(stack, 'LocalStackBedrockRuntime', {
124
+ classificationBedrockModel: {
125
+ customModelId: localstack_1.DEFAULT_LOCALSTACK_OLLAMA_MODEL_ID,
126
+ },
127
+ });
128
+ expect(processing.runtimeEntryPath()).toContain(path.join('resources', 'default-localstack-invoke'));
129
+ });
130
+ test('keeps existing BedrockDocumentProcessing behavior unchanged', () => {
131
+ const app = (0, test_utils_1.createTestApp)();
132
+ const stack = new aws_cdk_lib_1.Stack(app, 'AwsBedrockStack');
133
+ new bedrock_document_processing_1.BedrockDocumentProcessing(stack, 'AwsBedrock', {});
134
+ const template = assertions_1.Template.fromStack(stack);
135
+ const lambdas = template.findResources('AWS::Lambda::Function');
136
+ for (const lambda of Object.values(lambdas)) {
137
+ const variables = lambda.Properties?.Environment?.Variables || {};
138
+ expect(variables.LOCALSTACK_ENABLED).toBeUndefined();
139
+ expect(variables.AWS_ENDPOINT_URL).toBeUndefined();
140
+ }
141
+ });
142
+ test('keeps default AWS Bedrock invoke runtime entry', () => {
143
+ const app = (0, test_utils_1.createTestApp)();
144
+ const stack = new aws_cdk_lib_1.Stack(app, 'AwsBedrockRuntimeStack');
145
+ const processing = new TestableBedrockDocumentProcessing(stack, 'AwsBedrockRuntime', {});
146
+ expect(processing.runtimeEntryPath()).toContain(path.join('resources', 'default-bedrock-invoke'));
147
+ });
148
+ });
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxzdGFjay1kb2N1bWVudC1wcm9jZXNzaW5nLnRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi91c2UtY2FzZXMvZG9jdW1lbnQtcHJvY2Vzc2luZy90ZXN0cy9sb2NhbHN0YWNrLWRvY3VtZW50LXByb2Nlc3NpbmcudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLDJDQUE2QjtBQUM3Qiw2Q0FBb0M7QUFDcEMsdURBQXlEO0FBQ3pELGdFQUE2RDtBQUM3RCwyREFHb0M7QUFDcEMsMkRBQTJEO0FBQzNELGdGQUEyRTtBQUMzRSxzR0FBZ0c7QUFFaEcsTUFBTSwyQ0FBNEMsU0FBUSw0RUFBbUM7SUFDcEYsZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBRUQsTUFBTSxpQ0FBa0MsU0FBUSx1REFBeUI7SUFDaEUsZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBRUQsUUFBUSxDQUFDLHFDQUFxQyxFQUFFLEdBQUcsRUFBRTtJQUNuRCxJQUFJLENBQUMsa0VBQWtFLEVBQUUsR0FBRyxFQUFFO1FBQzVFLE1BQU0sR0FBRyxHQUFHLElBQUEsMEJBQWEsR0FBRSxDQUFDO1FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUksbUJBQUssQ0FBQyxHQUFHLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztRQUV2RCxJQUFJLDRFQUFtQyxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtZQUNsRSwwQkFBMEIsRUFBRTtnQkFDMUIsYUFBYSxFQUFFLCtDQUFrQztnQkFDakQsdUJBQXVCLEVBQUUsSUFBSTthQUM5QjtZQUNELHNCQUFzQixFQUFFO2dCQUN0QixhQUFhLEVBQUUsK0NBQWtDO2FBQ2xEO1lBQ0QsVUFBVSxFQUFFO2dCQUNWLFdBQVcs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QUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLGdEQUFnRCxFQUFFLEdBQUcsRUFBRTtRQUMxRCxNQUFNLEdBQUcsR0FBRyxJQUFBLDBCQUFhLEdBQUUsQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLG1CQUFLLENBQUMsR0FBRyxFQUFFLHdCQUF3QixDQUFDLENBQUM7UUFFdkQsTUFBTSxVQUFVLEdBQUcsSUFBSSxpQ0FBaUMsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFekYsTUFBTSxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLHdCQUF3QixDQUFDLENBQUMsQ0FBQztJQUNwRyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB7IFN0YWNrIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0IHsgTWF0Y2gsIFRlbXBsYXRlIH0gZnJvbSAnYXdzLWNkay1saWIvYXNzZXJ0aW9ucyc7XG5pbXBvcnQgeyBOZXR3b3JrIH0gZnJvbSAnLi4vLi4vZnJhbWV3b3JrL2ZvdW5kYXRpb24vbmV0d29yayc7XG5pbXBvcnQge1xuICBERUZBVUxUX0xPQ0FMU1RBQ0tfT0xMQU1BX01PREVMX0lELFxuICBERUZBVUxUX0xPQ0FMU1RBQ0tfU0FOREJPWF9FTkRQT0lOVF9VUkwsXG59IGZyb20gJy4uLy4uL2ZyYW1ld29yay9sb2NhbHN0YWNrJztcbmltcG9ydCB7IGNyZWF0ZVRlc3RBcHAgfSBmcm9tICcuLi8uLi91dGlsaXRpZXMvdGVzdC11dGlscyc7XG5pbXBvcnQgeyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIH0gZnJvbSAnLi4vYmVkcm9jay1kb2N1bWVudC1wcm9jZXNzaW5nJztcbmltcG9ydCB7IExvY2FsU3RhY2tCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIH0gZnJvbSAnLi4vbG9jYWxzdGFjay1iZWRyb2NrLWRvY3VtZW50LXByb2Nlc3NpbmcnO1xuXG5jbGFzcyBUZXN0YWJsZUxvY2FsU3RhY2tCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIGV4dGVuZHMgTG9jYWxTdGFja0JlZHJvY2tEb2N1bWVudFByb2Nlc3Npbmcge1xuICBwdWJsaWMgcnVudGltZUVudHJ5UGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVCZWRyb2NrSW52b2tlRW50cnkoKTtcbiAgfVxufVxuXG5jbGFzcyBUZXN0YWJsZUJlZHJvY2tEb2N1bWVudFByb2Nlc3NpbmcgZXh0ZW5kcyBCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nIHtcbiAgcHVibGljIHJ1bnRpbWVFbnRyeVBhdGgoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlQmVkcm9ja0ludm9rZUVudHJ5KCk7XG4gIH1cbn1cblxuZGVzY3JpYmUoJ0xvY2FsU3RhY2tCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nJywgKCkgPT4ge1xuICB0ZXN0KCdpbmplY3RzIExvY2FsU3RhY2sgZW5kcG9pbnQgdmFyaWFibGVzIGludG8gY2xhc3NpZmljYXRpb24gTGFtYmRhJywgKCkgPT4ge1xuICAgIGNvbnN0IGFwcCA9IGNyZWF0ZVRlc3RBcHAoKTtcbiAgICBjb25zdCBzdGFjayA9IG5ldyBTdGFjayhhcHAsICdMb2NhbFN0YWNrQmVkcm9ja1N0YWNrJyk7XG5cbiAgICBuZXcgTG9jYWxTdGFja0JlZHJvY2tEb2N1bWVudFByb2Nlc3Npbmcoc3RhY2ssICdMb2NhbFN0YWNrQmVkcm9jaycsIHtcbiAgICAgIGNsYXNzaWZpY2F0aW9uQmVkcm9ja01vZGVsOiB7XG4gICAgICAgIGN1c3RvbU1vZGVsSWQ6IERFRkFVTFRfTE9DQUxTVEFDS19PTExBTUFfTU9ERUxfSUQsXG4gICAgICAgIHVzZUNyb3NzUmVnaW9uSW5mZXJlbmNlOiB0cnVlLFxuICAgICAgfSxcbiAgICAgIHByb2Nlc3NpbmdCZWRyb2NrTW9kZWw6IHtcbiAgICAgICAgY3VzdG9tTW9kZWxJZDogREVGQVVMVF9MT0NBTFNUQUNLX09MTEFNQV9NT0RFTF9JRCxcbiAgICAgIH0sXG4gICAgICBsb2NhbFN0YWNrOiB7XG4gICAgICAgIGVuZHBvaW50VXJsOiBERUZBVUxUX0xPQ0FMU1RBQ0tfU0FOREJPWF9FTkRQT0lOVF9VUkwsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuXG4gICAgdGVtcGxhdGUuaGFzUmVzb3VyY2VQcm9wZXJ0aWVzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nLCB7XG4gICAgICBFbnZpcm9ubWVudDoge1xuICAgICAgICBWYXJpYWJsZXM6IE1hdGNoLm9iamVjdExpa2Uoe1xuICAgICAgICAgIElOVk9LRV9UWVBFOiAnY2xhc3NpZmljYXRpb24nLFxuICAgICAgICAgIE1PREVMX0lEOiBERUZBVUxUX0xPQ0FMU1RBQ0tfT0xMQU1BX01PREVMX0lELFxuICAgICAgICAgIExPQ0FMU1RBQ0tfRU5BQkxFRDogJ3RydWUnLFxuICAgICAgICAgIEFXU19FTkRQT0lOVF9VUkxfQkVEUk9DS19SVU5USU1FOiBERUZBVUxUX0xPQ0FMU1RBQ0tfU0FOREJPWF9FTkRQT0lOVF9VUkwsXG4gICAgICAgICAgQVdTX0VORFBPSU5UX1VSTF9TMzogREVGQVVMVF9MT0NBTFNUQUNLX1NBTkRCT1hfRU5EUE9JTlRfVVJMLFxuICAgICAgICB9KSxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0ZW1wbGF0ZS5oYXNSZXNvdXJjZVByb3BlcnRpZXMoJ0FXUzo6TGFtYmRhOjpGdW5jdGlvbicsIHtcbiAgICAgIEVudmlyb25tZW50OiB7XG4gICAgICAgIFZhcmlhYmxlczogTWF0Y2gub2JqZWN0TGlrZSh7XG4gICAgICAgICAgU1RBVEVfTUFDSElORV9BUk46IE1hdGNoLmFueVZhbHVlKCksXG4gICAgICAgICAgQVdTX0VORFBPSU5UX1VSTF9TVEVQRlVOQ1RJT05TOiBERUZBVUxUX0xPQ0FMU1RBQ0tfU0FOREJPWF9FTkRQT0lOVF9VUkwsXG4gICAgICAgIH0pLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGVzdCgnZG9lcyBub3QgY3JlYXRlIEFXUyBCZWRyb2NrIFZQQyBlbmRwb2ludHMgd2hlbiBuZXR3b3JrIGlzIGVuYWJsZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ0xvY2FsU3RhY2tCZWRyb2NrTmV0d29ya1N0YWNrJyk7XG4gICAgY29uc3QgbmV0d29yayA9IG5ldyBOZXR3b3JrKHN0YWNrLCAnTmV0d29yaycpO1xuXG4gICAgbmV3IExvY2FsU3RhY2tCZWRyb2NrRG9jdW1lbnRQcm9jZXNzaW5nKHN0YWNrLCAnTG9jYWxTdGFja0JlZHJvY2tOZXR3b3JrJywge1xuICAgICAgbmV0d29yayxcbiAgICAgIGNsYXNzaWZpY2F0aW9uQmVkcm9ja01vZGVsOiB7XG4gICAgICAgIGN1c3RvbU1vZGVsSWQ6IERFRkFVTFRfTE9DQUxTVEFDS19PTExBTUFfTU9ERUxfSUQsXG4gICAgICB9LFxuICAgICAgcHJvY2Vzc2luZ0JlZHJvY2tNb2RlbDoge1xuICAgICAgICBjdXN0b21Nb2RlbElkOiBERUZBVUxUX0xPQ0FMU1RBQ0tfT0xMQU1BX01PREVMX0lELFxuICAgICAgfSxcbiAgICAgIGxvY2FsU3RhY2s6IHtcbiAgICAgICAgZW5kcG9pbnRVcmw6IERFRkFVTFRfTE9DQUxTVEFDS19TQU5EQk9YX0VORFBPSU5UX1VSTCxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCB0ZW1wbGF0ZSA9IFRlbXBsYXRlLmZyb21TdGFjayhzdGFjayk7XG4gICAgY29uc3QgdnBjRW5kcG9pbnRzID0gdGVtcGxhdGUuZmluZFJlc291cmNlcygnQVdTOjpFQzI6OlZQQ0VuZHBvaW50Jyk7XG5cbiAgICBleHBlY3QoT2JqZWN0LmtleXModnBjRW5kcG9pbnRzKSkudG9IYXZlTGVuZ3RoKDUpO1xuXG4gICAgY29uc3Qgc2VydmljZU5hbWVzID0gT2JqZWN0LnZhbHVlcyh2cGNFbmRwb2ludHMpXG4gICAgICAubWFwKChlbmRwb2ludDogYW55KSA9PiBKU09OLnN0cmluZ2lmeShlbmRwb2ludC5Qcm9wZXJ0aWVzPy5TZXJ2aWNlTmFtZSA/PyAnJykpXG4gICAgICAuam9pbignICcpO1xuXG4gICAgZXhwZWN0KHNlcnZpY2VOYW1lcykudG9Db250YWluKCdzdGF0ZXMnKTtcbiAgICBleHBlY3Qoc2VydmljZU5hbWVzKS50b0NvbnRhaW4oJ2V2ZW50cycpO1xuICAgIGV4cGVjdChzZXJ2aWNlTmFtZXMpLnRvQ29udGFpbignc3FzJyk7XG4gICAgZXhwZWN0KHNlcnZpY2VOYW1lcykudG9Db250YWluKCdzMycpO1xuICAgIGV4cGVjdChzZXJ2aWNlTmFtZXMpLm5vdC50b0NvbnRhaW4oJ2JlZHJvY2snKTtcbiAgICBleHBlY3Qoc2VydmljZU5hbWVzKS5ub3QudG9Db250YWluKCdiZWRyb2NrLXJ1bnRpbWUnKTtcbiAgfSk7XG5cbiAgdGVzdCgndXNlcyB0aGUgTG9jYWxTdGFjayBpbnZva2UgcnVudGltZSBlbnRyeScsICgpID0+IHtcbiAgICBjb25zdCBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnTG9jYWxTdGFja0JlZHJvY2tSdW50aW1lU3RhY2snKTtcblxuICAgIGNvbnN0IHByb2Nlc3NpbmcgPSBuZXcgVGVzdGFibGVMb2NhbFN0YWNrQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyhzdGFjaywgJ0xvY2FsU3RhY2tCZWRyb2NrUnVudGltZScsIHtcbiAgICAgIGNsYXNzaWZpY2F0aW9uQmVkcm9ja01vZGVsOiB7XG4gICAgICAgIGN1c3RvbU1vZGVsSWQ6IERFRkFVTFRfTE9DQUxTVEFDS19PTExBTUFfTU9ERUxfSUQsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHByb2Nlc3NpbmcucnVudGltZUVudHJ5UGF0aCgpKS50b0NvbnRhaW4ocGF0aC5qb2luKCdyZXNvdXJjZXMnLCAnZGVmYXVsdC1sb2NhbHN0YWNrLWludm9rZScpKTtcbiAgfSk7XG5cbiAgdGVzdCgna2VlcHMgZXhpc3RpbmcgQmVkcm9ja0RvY3VtZW50UHJvY2Vzc2luZyBiZWhhdmlvciB1bmNoYW5nZWQnLCAoKSA9PiB7XG4gICAgY29uc3QgYXBwID0gY3JlYXRlVGVzdEFwcCgpO1xuICAgIGNvbnN0IHN0YWNrID0gbmV3IFN0YWNrKGFwcCwgJ0F3c0JlZHJvY2tTdGFjaycpO1xuXG4gICAgbmV3IEJlZHJvY2tEb2N1bWVudFByb2Nlc3Npbmcoc3RhY2ssICdBd3NCZWRyb2NrJywge30pO1xuXG4gICAgY29uc3QgdGVtcGxhdGUgPSBUZW1wbGF0ZS5mcm9tU3RhY2soc3RhY2spO1xuICAgIGNvbnN0IGxhbWJkYXMgPSB0ZW1wbGF0ZS5maW5kUmVzb3VyY2VzKCdBV1M6OkxhbWJkYTo6RnVuY3Rpb24nKTtcblxuICAgIGZvciAoY29uc3QgbGFtYmRhIG9mIE9iamVjdC52YWx1ZXMobGFtYmRhcykpIHtcbiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IChsYW1iZGEgYXMgYW55KS5Qcm9wZXJ0aWVzPy5FbnZpcm9ubWVudD8uVmFyaWFibGVzIHx8IHt9O1xuICAgICAgZXhwZWN0KHZhcmlhYmxlcy5MT0NBTFNUQUNLX0VOQUJMRUQpLnRvQmVVbmRlZmluZWQoKTtcbiAgICAgIGV4cGVjdCh2YXJpYWJsZXMuQVdTX0VORFBPSU5UX1VSTCkudG9CZVVuZGVmaW5lZCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGVzdCgna2VlcHMgZGVmYXVsdCBBV1MgQmVkcm9jayBpbnZva2UgcnVudGltZSBlbnRyeScsICgpID0+IHtcbiAgICBjb25zdCBhcHAgPSBjcmVhdGVUZXN0QXBwKCk7XG4gICAgY29uc3Qgc3RhY2sgPSBuZXcgU3RhY2soYXBwLCAnQXdzQmVkcm9ja1J1bnRpbWVTdGFjaycpO1xuXG4gICAgY29uc3QgcHJvY2Vzc2luZyA9IG5ldyBUZXN0YWJsZUJlZHJvY2tEb2N1bWVudFByb2Nlc3Npbmcoc3RhY2ssICdBd3NCZWRyb2NrUnVudGltZScsIHt9KTtcblxuICAgIGV4cGVjdChwcm9jZXNzaW5nLnJ1bnRpbWVFbnRyeVBhdGgoKSkudG9Db250YWluKHBhdGguam9pbigncmVzb3VyY2VzJywgJ2RlZmF1bHQtYmVkcm9jay1pbnZva2UnKSk7XG4gIH0pO1xufSk7XG4iXX0=