@liflig/cdk 2.14.4 → 2.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,7 @@
1
1
  import json
2
+ import logging
2
3
  import os
4
+ import typing as t
3
5
  from urllib.error import HTTPError, URLError
4
6
  from urllib.parse import quote
5
7
  from urllib.request import Request, urlopen
@@ -7,12 +9,12 @@ from urllib.request import Request, urlopen
7
9
  import boto3
8
10
 
9
11
  client = boto3.client("codepipeline")
12
+ s3 = boto3.client("s3")
10
13
 
11
- ACCOUNT_DESC = os.getenv("ACCOUNT_DESC", None)
12
- ACCOUNT_GROUP_NAME = os.getenv("ACCOUNT_GROUP_NAME", None)
14
+ ACCOUNT_FRIENDLY_NAME = os.getenv("ACCOUNT_FRIENDLY_NAME", None)
13
15
  SLACK_URL = os.getenv("SLACK_URL", None)
14
16
  SLACK_CHANNEL = os.getenv("SLACK_CHANNEL", None)
15
- ALWAYS_SHOW_SUCCEEDED = os.getenv("ALWAYS_SHOW_SUCCEEDED", "false") == "true"
17
+ NOTIFICATION_LEVEL = os.getenv("NOTIFICATION_LEVEL", "WARN")
16
18
 
17
19
  # Example event:
18
20
  #
@@ -35,10 +37,38 @@ ALWAYS_SHOW_SUCCEEDED = os.getenv("ALWAYS_SHOW_SUCCEEDED", "false") == "true"
35
37
  # }
36
38
  # }
37
39
 
40
+ STYLES = {
41
+ "FAILED": {"emoji_prefix": ":x:", "message_color": "#ff0000"},
42
+ "SUCCEEDED": {"emoji_prefix": ":white_check_mark:", "message_color": "#008000"},
43
+ "STARTED": {"emoji_prefix": ":rocket:", "message_color": "#00bfff"},
44
+ "SUPERSEDED": {"emoji_prefix": ":arrow_heading_down:", "message_color": "#373737"},
45
+ }
46
+
47
+
48
+ class TriggerMetadataVcs(t.TypedDict):
49
+ branchName: str
50
+ commitAuthor: str
51
+ commitHash: str
52
+ repositoryName: str
53
+ repositoryOwner: str
54
+
55
+
56
+ class TriggerMetadataCi(t.TypedDict):
57
+ type: t.Literal["JENKINS", "GITHUB_ACTIONS"]
58
+ triggeredBy: str
59
+
60
+
61
+ class TriggerMetadata(t.TypedDict):
62
+ version: t.Literal["0.1"]
63
+ ci: TriggerMetadataCi
64
+ vcs: TriggerMetadataVcs
65
+
66
+
67
+ def get_previous_pipeline_execution(
68
+ pipeline_name: str, execution_id: str
69
+ ) -> dict | None:
70
+ """Return the newest past execution that either succeeded or failed"""
38
71
 
39
- def get_previous_pipeline_execution(pipeline_name, execution_id):
40
- # Retrieves executions based on their start timestamp, so
41
- # the previous execution will be next in list.
42
72
  pipeline_executions = client.list_pipeline_executions(
43
73
  pipelineName=pipeline_name,
44
74
  )["pipelineExecutionSummaries"]
@@ -57,12 +87,15 @@ def get_previous_pipeline_execution(pipeline_name, execution_id):
57
87
  return None
58
88
 
59
89
 
60
- def get_blocks_for_failed(pipeline_name, execution_id, state):
90
+ def get_text_for_failed(pipeline_name: str, execution_id: str, state: str) -> str:
91
+ """Return a Slack-formatted string that describes failed pipeline execution actions,
92
+ if any, in a failed execution"""
93
+
61
94
  # We only show details if the pipeline has completed with failed state.
62
95
  # If we were to process this for other events such as started events,
63
96
  # we would include details from after the event took place.
64
97
  if state != "FAILED":
65
- return []
98
+ return ""
66
99
 
67
100
  action_executions = client.list_action_executions(
68
101
  pipelineName=pipeline_name,
@@ -71,7 +104,7 @@ def get_blocks_for_failed(pipeline_name, execution_id, state):
71
104
  },
72
105
  )["actionExecutionDetails"]
73
106
 
74
- result = []
107
+ failures = []
75
108
 
76
109
  for action_execution in action_executions:
77
110
  if action_execution["status"] == "Failed":
@@ -80,32 +113,95 @@ def get_blocks_for_failed(pipeline_name, execution_id, state):
80
113
  summary = action_execution["output"]["executionResult"][
81
114
  "externalExecutionSummary"
82
115
  ]
83
- result.append(
84
- {
85
- "type": "section",
86
- "text": {
87
- "type": "mrkdwn",
88
- "text": f"{stage}.{action} failed:\n```\n{summary}\n```",
89
- },
90
- }
91
- )
116
+ failures.append(f"{stage}.{action} failed:\n{summary}")
117
+
118
+ result = ""
119
+
120
+ if len(failures):
121
+ result = "```\n" + "\n\n".join(failures) + "\n```"
92
122
 
93
123
  return result
94
124
 
95
125
 
126
+ def get_metadata_from_trigger(
127
+ pipeline_name: str, execution_id: str
128
+ ) -> TriggerMetadata | None:
129
+ """Returns a dictionary containing the metadata, if any, stored in the trigger file"""
130
+
131
+ action_response = client.list_action_executions(
132
+ pipelineName=pipeline_name, filter={"pipelineExecutionId": execution_id}
133
+ )
134
+
135
+ action = next(
136
+ (
137
+ action
138
+ for action in action_response["actionExecutionDetails"]
139
+ if action["input"]["actionTypeId"]["category"] == "Source"
140
+ and action["input"]["actionTypeId"]["provider"] == "S3"
141
+ ),
142
+ None,
143
+ )
144
+ if action:
145
+ s3_version_id = action["output"]["outputVariables"]["VersionId"]
146
+ artifacts_bucket = action["input"]["configuration"]["S3Bucket"]
147
+ trigger_file = action["input"]["configuration"]["S3ObjectKey"]
148
+
149
+ try:
150
+ response = s3.get_object(
151
+ Bucket=artifacts_bucket, Key=trigger_file, VersionId=s3_version_id
152
+ )
153
+ file_content = response["Body"].read().decode("utf-8")
154
+ ci_metadata = json.loads(file_content)
155
+ return ci_metadata
156
+ except Exception as e:
157
+ print(f"Could not obtain metadata from trigger file: {e}")
158
+
159
+ return None
160
+
161
+
162
+ def get_footer_text(ci_metadata: TriggerMetadata) -> str:
163
+ """Returns the footer text for the Slack message if the metadata contains the required fields"""
164
+
165
+ footer_text = ""
166
+ if ci_metadata and ci_metadata.get("version", "") == "0.1":
167
+ ci = ci_metadata.get("ci", {})
168
+ vcs = ci_metadata.get("vcs", {})
169
+ triggering_actor = ci.get("triggeredBy", "")
170
+ repository_owner = vcs.get("repositoryOwner", "")
171
+ repository_name = vcs.get("repositoryName", "")
172
+ short_commit_hash = vcs.get("commitHash", "")[:8]
173
+ branch_name = vcs.get("branchName", "")
174
+ if (
175
+ triggering_actor
176
+ and repository_owner
177
+ and repository_name
178
+ and short_commit_hash
179
+ and branch_name
180
+ ):
181
+ commit_link_text = f"{repository_owner}/{repository_name} @ {branch_name} ({short_commit_hash})"
182
+ github_commit_link = f"https://github.com/{repository_owner}/{repository_name}/commit/{short_commit_hash}"
183
+ footer_text = f"Triggered by {triggering_actor} in <{github_commit_link}|{commit_link_text}>"
184
+
185
+ return footer_text
186
+
187
+
96
188
  def handler(event, context):
97
- print("Event: " + json.dumps(event))
98
189
 
99
- if event["detail-type"] != "CodePipeline Pipeline Execution State Change":
100
- print("Ignoring unknown event")
101
- return
190
+ print("Event: " + json.dumps(event))
102
191
 
103
- account = event["account"]
104
192
  region = event["region"]
193
+ account_id = event["account"]
105
194
  pipeline_name = event["detail"]["pipeline"]
106
195
  state = event["detail"]["state"]
107
196
  execution_id = event["detail"]["execution-id"]
108
197
 
198
+ if state in ("STARTED", "SUPERSEDED") and NOTIFICATION_LEVEL != "DEBUG":
199
+ return
200
+
201
+ if event["detail-type"] != "CodePipeline Pipeline Execution State Change":
202
+ print("Ignoring unknown event")
203
+ return
204
+
109
205
  previous_pipeline_execution = get_previous_pipeline_execution(
110
206
  pipeline_name, execution_id
111
207
  )
@@ -117,49 +213,63 @@ def handler(event, context):
117
213
 
118
214
  # We still show succeeded for the first event or when
119
215
  # the previous execution was not success.
120
- if state == "SUCCEEDED" and not ALWAYS_SHOW_SUCCEEDED:
216
+ if state == "SUCCEEDED" and (NOTIFICATION_LEVEL == "WARN"):
121
217
  if previous_pipeline_execution is not None and not previous_failed:
122
218
  print("Ignoring succeeded event")
123
219
  return
124
220
 
125
- emoji_prefix = ""
126
- if state == "FAILED":
127
- emoji_prefix = ":x: "
128
- if state == "SUCCEEDED":
129
- emoji_prefix = ":white_check_mark: "
130
-
131
221
  pipeline_url = f"https://{region}.console.aws.amazon.com/codesuite/codepipeline/pipelines/{quote(pipeline_name, safe='')}/view"
132
222
  execution_url = f"https://{region}.console.aws.amazon.com/codesuite/codepipeline/pipelines/{quote(pipeline_name, safe='')}/executions/{execution_id}/timeline"
133
223
 
134
- account_group_text = ""
135
- if ACCOUNT_GROUP_NAME is not None:
136
- account_group_text += f" ({ACCOUNT_GROUP_NAME})"
224
+ account_friendly_name = f"in {ACCOUNT_FRIENDLY_NAME or account_id}"
137
225
 
138
226
  state_text = state
139
227
  if previous_failed and state == "SUCCEEDED":
140
228
  state_text += " (previously failed)"
141
229
 
142
- blocks_for_failed = get_blocks_for_failed(pipeline_name, execution_id, state)
230
+ ci_metadata = get_metadata_from_trigger(pipeline_name, execution_id)
231
+
232
+ footer_text = get_footer_text(ci_metadata)
143
233
 
144
- account_text = account
145
- if ACCOUNT_DESC is not None:
146
- account_text += f" ({ACCOUNT_DESC})"
234
+ style = STYLES.get(
235
+ state, {"emoji_prefix": ":question:", "message_color": "#ffdf00"}
236
+ )
237
+
238
+ emoji_prefix = style["emoji_prefix"]
239
+ message_color = style["message_color"]
240
+
241
+ text_for_failed = get_text_for_failed(pipeline_name, execution_id, state)
147
242
 
148
- blocks = [
243
+ text = "\n".join(
244
+ s
245
+ for s in [f"*Execution:* <{execution_url}|{execution_id}>", text_for_failed]
246
+ if s
247
+ )
248
+ pretext = " ".join(
249
+ s
250
+ for s in [
251
+ f"{emoji_prefix} Pipeline *<{pipeline_url}|{pipeline_name}>*",
252
+ f"*{state_text}*",
253
+ account_friendly_name,
254
+ ]
255
+ if s
256
+ )
257
+ fallback = f"Pipeline {pipeline_name} {state}"
258
+ attachments = [
149
259
  {
150
- "type": "section",
151
- "text": {
152
- "type": "mrkdwn",
153
- "text": f"{emoji_prefix}Pipeline <{pipeline_url}|{pipeline_name}>{account_group_text} *{state_text}*\n{region} | {account_text}\n<{execution_url}|Execution details>",
154
- },
260
+ "footer": footer_text,
261
+ "color": message_color,
262
+ "text": text,
263
+ "mrkdwn_in": ["text", "pretext"],
264
+ "pretext": pretext,
265
+ "fallback": fallback,
155
266
  },
156
- *blocks_for_failed,
157
267
  ]
158
268
 
159
269
  slack_message = {
160
270
  "channel": SLACK_CHANNEL,
161
- "blocks": blocks,
162
- "username": "Pipeline Status",
271
+ "attachments": attachments,
272
+ "username": "Liflig CDK Pipelines",
163
273
  "icon_emoji": ":traffic_light:",
164
274
  }
165
275
 
@@ -100,9 +100,11 @@ export declare class LifligCdkPipeline extends constructs.Construct {
100
100
  static pipelineS3TriggerKey(pipelineName: string): string;
101
101
  readonly cdkPipeline: pipelines.CodePipeline;
102
102
  readonly codePipeline: codepipeline.Pipeline;
103
+ readonly artifactsBucket: s3.IBucket;
104
+ readonly triggerObjectKey: string;
103
105
  constructor(scope: constructs.Construct, id: string, props: LifligCdkPipelineProps);
104
106
  private static getAwsCdkPackageJsonFile;
105
107
  private cloudAssemblyStage;
106
108
  private cdkSourceStage;
107
- addSlackNotification(props: Omit<SlackNotificationProps, "pipeline">): void;
109
+ addSlackNotification(props: Omit<SlackNotificationProps, "pipeline" | "artifactsBucket" | "triggerObjectKey">): void;
108
110
  }
@@ -73,23 +73,24 @@ class LifligCdkPipeline extends constructs.Construct {
73
73
  constructor(scope, id, props) {
74
74
  var _a, _b;
75
75
  super(scope, id);
76
- const artifactsBucket = (_a = props.artifactsBucket) !== null && _a !== void 0 ? _a : (0, artefact_bucket_1.getGriidArtefactBucket)(this);
76
+ this.artifactsBucket = (_a = props.artifactsBucket) !== null && _a !== void 0 ? _a : (0, artefact_bucket_1.getGriidArtefactBucket)(this);
77
77
  const cloudAssemblyArtifact = new codepipeline.Artifact();
78
78
  let synth;
79
79
  let stages;
80
80
  switch (props.sourceType) {
81
81
  case "cloud-assembly":
82
- const cloudAssembly = this.cloudAssemblyStage(cloudAssemblyArtifact, artifactsBucket, props.pipelineName);
82
+ const cloudAssembly = this.cloudAssemblyStage(cloudAssemblyArtifact, this.artifactsBucket, props.pipelineName);
83
83
  synth = cloudAssembly.synth;
84
84
  stages = cloudAssembly.stages;
85
85
  break;
86
86
  case "cdk-source":
87
- const cdkSource = this.cdkSourceStage(cloudAssemblyArtifact, artifactsBucket, props.pipelineName, (_b = props.parametersNamespace) !== null && _b !== void 0 ? _b : "default");
87
+ const cdkSource = this.cdkSourceStage(cloudAssemblyArtifact, this.artifactsBucket, props.pipelineName, (_b = props.parametersNamespace) !== null && _b !== void 0 ? _b : "default");
88
88
  synth = cdkSource.synth;
89
89
  stages = cdkSource.stages;
90
90
  break;
91
91
  }
92
92
  const dummyArtifact = new codepipeline.Artifact();
93
+ this.triggerObjectKey = LifligCdkPipeline.pipelineS3TriggerKey(props.pipelineName);
93
94
  this.codePipeline = new codepipeline.Pipeline(this, "CodePipeline", {
94
95
  pipelineName: props.pipelineName,
95
96
  stages: [
@@ -98,9 +99,9 @@ class LifligCdkPipeline extends constructs.Construct {
98
99
  actions: [
99
100
  new codepipelineActions.S3SourceAction({
100
101
  actionName: "source",
101
- bucket: artifactsBucket,
102
+ bucket: this.artifactsBucket,
102
103
  trigger: codepipelineActions.S3Trigger.NONE,
103
- bucketKey: LifligCdkPipeline.pipelineS3TriggerKey(props.pipelineName),
104
+ bucketKey: this.triggerObjectKey,
104
105
  output: dummyArtifact,
105
106
  }),
106
107
  ],
@@ -115,10 +116,10 @@ class LifligCdkPipeline extends constructs.Construct {
115
116
  detailType: ["Object Created"],
116
117
  detail: {
117
118
  bucket: {
118
- name: [artifactsBucket.bucketName],
119
+ name: [this.artifactsBucket.bucketName],
119
120
  },
120
121
  object: {
121
- key: [LifligCdkPipeline.pipelineS3TriggerKey(props.pipelineName)],
122
+ key: [this.triggerObjectKey],
122
123
  },
123
124
  },
124
125
  },
@@ -221,9 +222,11 @@ class LifligCdkPipeline extends constructs.Construct {
221
222
  addSlackNotification(props) {
222
223
  new slack_notification_1.SlackNotification(this, "Slack", {
223
224
  pipeline: this.codePipeline,
225
+ artifactsBucket: this.artifactsBucket,
226
+ triggerObjectKey: this.triggerObjectKey,
224
227
  ...props,
225
228
  });
226
229
  }
227
230
  }
228
231
  exports.LifligCdkPipeline = LifligCdkPipeline;
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmbGlnLWNkay1waXBlbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jZGstcGlwZWxpbmVzL2xpZmxpZy1jZGstcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLDZEQUE0RDtBQUM1RCw0RUFBMkU7QUFDM0UsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxpREFBZ0Q7QUFDaEQsMERBQXlEO0FBRXpELG1DQUFrQztBQUNsQyxtREFBa0Q7QUFDbEQseUJBQXdCO0FBQ3hCLDZCQUE0QjtBQUM1Qiw4REFBaUU7QUFDakUsbUZBR3dDO0FBQ3hDLDZEQUFnRjtBQStDaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDekQ7O09BRUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBb0I7UUFDMUMsT0FBTyxhQUFhLFlBQVksR0FBRyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFlBQW9CO1FBQzlDLE9BQU8sYUFBYSxZQUFZLFVBQVUsQ0FBQTtJQUM1QyxDQUFDO0lBS0QsWUFDRSxLQUEyQixFQUMzQixFQUFVLEVBQ1YsS0FBNkI7O1FBRTdCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsTUFBTSxlQUFlLEdBQ25CLE1BQUEsS0FBSyxDQUFDLGVBQWUsbUNBQUksSUFBQSx3Q0FBc0IsRUFBQyxJQUFJLENBQUMsQ0FBQTtRQUV2RCxNQUFNLHFCQUFxQixHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFBO1FBRXpELElBQUksS0FBaUMsQ0FBQTtRQUNyQyxJQUFJLE1BQWlDLENBQUE7UUFFckMsUUFBUSxLQUFLLENBQUMsVUFBVSxFQUFFO1lBQ3hCLEtBQUssZ0JBQWdCO2dC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QUFNLGNBQWMsR0FBbUM7WUFDckQsVUFBVSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1lBQ2hDLE1BQU0sRUFBRSxhQUFhLFlBQVksR0FBRztZQUNwQyxtQkFBbUIsRUFBRSxtQkFBbUI7U0FDekMsQ0FBQTtRQUVELE1BQU0sS0FBSyxHQUFHLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyx1QkFBdUIsRUFBRTtZQUM3RCxLQUFLLEVBQUUsU0FBUyxDQUFDLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQztZQUNwRSxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDM0IsUUFBUSxFQUFFLENBQUMsZUFBZSxDQUFDO1NBQzVCLENBQUMsQ0FBQTtRQUNGLE1BQU0sTUFBTSxHQUFHO1lBQ2I7Z0JBQ0UsU0FBUyxFQUFFLGtCQUFrQjtnQkFDN0IsT0FBTyxFQUFFO29CQUNQLElBQUksbUJBQW1CLENBQUMsa0JBQWtCLENBQUM7d0JBQ3pDLFVBQVUsRUFBRSxvQkFBb0I7d0JBQ2hDLE1BQU0sRUFBRSxrQkFBa0I7d0JBQzFCLE9BQU8sRUFBRSxDQUFDLGlCQUFpQixDQUFDO3dCQUM1QixjQUFjO3FCQUNmLENBQUM7aUJBQ0g7YUFDRjtTQUNGLENBQUE7UUFDRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFBO0lBQzFCLENBQUM7SUFFRCxvQkFBb0IsQ0FBQyxLQUErQztRQUNsRSxJQUFJLHNDQUFpQixDQUFDLElBQUksRUFBRSxPQUFPLEVBQUU7WUFDbkMsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQzNCLEdBQUcsS0FBSztTQUNULENBQUMsQ0FBQTtJQUNKLENBQUM7Q0FDRjtBQTFPRCw4Q0EwT0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjb25zdHJ1Y3RzIGZyb20gXCJjb25zdHJ1Y3RzXCJcbmltcG9ydCAqIGFzIGNvZGVwaXBlbGluZSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWNvZGVwaXBlbGluZVwiXG5pbXBvcnQgKiBhcyBjb2RlcGlwZWxpbmVBY3Rpb25zIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lLWFjdGlvbnNcIlxuaW1wb3J0ICogYXMgaWFtIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtaWFtXCJcbmltcG9ydCAqIGFzIGxhbWJkYSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWxhbWJkYVwiXG5pbXBvcnQgKiBhcyBldmVudHMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1ldmVudHNcIlxuaW1wb3J0ICogYXMgdGFyZ2V0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCJcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBwaXBlbGluZXMgZnJvbSBcImF3cy1jZGstbGliL3BpcGVsaW5lc1wiXG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIlxuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiXG5pbXBvcnQgeyBnZXRHcmlpZEFydGVmYWN0QnVja2V0IH0gZnJvbSBcIi4uL2dyaWlkL2FydGVmYWN0LWJ1Y2tldFwiXG5pbXBvcnQge1xuICBjbG91ZEFzc2VtYmx5TG9va3VwSGFuZGxlcixcbiAgQ2xvdWRBc3NlbWJseUxvb2t1cFVzZXJQYXJhbWV0ZXJzLFxufSBmcm9tIFwiLi9jbG91ZC1hc3NlbWJseS1sb29rdXAtaGFuZGxlclwiXG5pbXBvcnQgeyBTbGFja05vdGlmaWNhdGlvbiwgU2xhY2tOb3RpZmljYXRpb25Qcm9wcyB9IGZyb20gXCIuL3NsYWNrLW5vdGlmaWNhdGlvblwiXG5cbmV4cG9ydCBpbnRlcmZhY2UgTGlmbGlnQ2RrUGlwZWxpbmVQcm9wcyB7XG4gIC8qKlxuICAgKiBCdWNrZXQgaG9sZGluZyBwaXBlbGluZSBjb25maWd1cmF0aW9uIGFuZCB0cmlnZ2VyIGZpbGUuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdXNlIGV4aXN0aW5nIGJ1Y2tldCBiYXNlZCBvbiBHcmlpZCBjb252ZW50aW9uc1xuICAgKi9cbiAgYXJ0aWZhY3RzQnVja2V0PzogczMuSUJ1Y2tldFxuICAvKipcbiAgICogTmFtZSBvZiBwaXBlbGluZS4gVGhpcyBpcyB1c2VkIGZvciB0aGUgcGF0aCB3aGVyZSBjb25maWd1cmF0aW9uXG4gICAqIGlzIHN0b3JlZCBpbiBTMy5cbiAgICovXG4gIHBpcGVsaW5lTmFtZTogc3RyaW5nXG4gIC8qKlxuICAgKiBUeXBlIG9mIHVwbG9hZGVkIGFydGlmYWN0LiBUaGlzIGNoYW5nZXMgdGhlIGJlaGF2aW91ciBvZiB0aGVcbiAgICogcGlwZWxpbmUgYW5kIHdoYXQga2luZCBvZiBwcm9jZXNzIGl0IHBlcmZvcm1zLlxuICAgKlxuICAgKiBUd28gdHlwZXMgYXJlIHN1cHBvcnRlZDpcbiAgICpcbiAgICogICAtIGNkay1zb3VyY2U6IFRoZSB1cGxvYWRlZCBhcnRpZmFjdCByZXByZXNlbnRzIGEgQ0RLIGFwcGxpY2F0aW9uXG4gICAqICAgICBhcyBzb3VyY2UgY29kZS4gQSBidWlsZCBzdGVwIHdpbGwgY29tcGlsZSB0aGlzIGludG8gYVxuICAgKiAgICAgQ0RLIENsb3VkIEFzc2VtYmx5LlxuICAgKlxuICAgKiAgICAgQXMgcGFydCBvZiBzeW50aGVzaXppbmcgdGhpcyBpbnRvIGEgQ0RLIENsb3VkIEFzc2VtYmx5LFxuICAgKiAgICAgYSBmaWxlIFwidmFyaWFibGVzLmpzb25cIiB3aWxsIGJlIHdyaXR0ZW4gZm9yIHRoZVxuICAgKiAgICAgQ0RLIGFwcGxpY2F0aW9uIHRvIHBhcmFtZXRlcml6ZSB0aGUgYnVpbGQgaWYgYW55XG4gICAqICAgICB2YXJpYWJsZXMgYXJlIGZvdW5kIGluIHRoZSBwaXBlbGluZSBzb3VyY2UuXG4gICAqXG4gICAqICAgLSBjbG91ZC1hc3NlbWJseTogVGhlIHVwbG9hZGVkIGFydGlmYWN0IHJlcHJlc2VudHMgYVxuICAgKiAgICAgQ0RLIENsb3VkIEFzc2VtYmx5IHdoaWNoIGlzIHJlYWR5IGZvciBkZXBsb3ltZW50LlxuICAgKlxuICAgKiAgICAgVGhpcyBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgdmFyaWFibGVzIGF0IHRoZSBjdXJyZW50IHRpbWVcbiAgICogICAgIHNpbmNlIENESyBQaXBlbGluZXMgZG9uJ3Qgc3VwcG9ydCBwYXJhbWV0ZXJpemVkIGRlcGxveXMuXG4gICAqICAgICBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2F3cy9hd3MtY2RrL2lzc3Vlcy85NTYwXG4gICAqL1xuICBzb3VyY2VUeXBlOiBcImNkay1zb3VyY2VcIiB8IFwiY2xvdWQtYXNzZW1ibHlcIlxuICAvKipcbiAgICogVGhlIG5hbWVzcGFjZSB1c2VkIGZvciBwYXJhbWV0ZXJzIGluIFBhcmFtZXRlciBTdG9yZS5cbiAgICpcbiAgICogT25seSByZWxldmFudCBmb3Igc291cmNlVHlwZSBvZiBcImNkay1zb3J1Y2VcIi5cbiAgICpcbiAgICogQGRlZmF1bHQgZGVmYXVsdFxuICAgKi9cbiAgcGFyYW1ldGVyc05hbWVzcGFjZT86IHN0cmluZ1xufVxuXG4vKipcbiAqIENESyBQaXBlbGluZSBmb3IgTGlmbGlnLlxuICpcbiAqIEF2b2lkIHB1dHRpbmcgbXVsdGlwbGUgcGlwZWxpbmVzIGluIGEgc3RhY2ssIHNpbmNlIHRoZSBwaXBlbGluZVxuICogd2lsbCBhbHNvIGtlZXAgdGhlIGhvc3Rpbmcgc3RhY2sgdXAtdG8tZGF0ZS5cbiAqXG4gKiBUaGUgcGlwZWxpbmUgaXMgZXhlY3V0ZWQgYnkgd3JpdGluZyBhbiBlbXB0eSBmaWxlIHRvXG4gKiBzMzovLzxhcnRpZmFjdHMtYnVja2V0Pi9waXBlbGluZXMvPHBpcGVsaW5lLW5hbWU+L3RyaWdnZXJcbiAqXG4gKiBDb25maWd1cmF0aW9uIGZpbGVzIGFyZSByZWFkIGZyb20gUzMgYXQgdGhlIHBhdGhcbiAqIHMzOi8vPGFydGlmYWN0cy1idWNrZXQ+L3BpcGVsaW5lcy88cGlwZWxpbmUtbmFtZT4vXG4gKlxuICogRm9yIHVwbG9hZCB0eXBlIFwiY2RrLXNvdXJjZVwiOlxuICpcbiAqICAgLSBjZGstc291cmNlLmpzb24gaG9sZGluZyBhIHBvaW50ZXIgdG8gdGhlIGFjdGl2ZSBDREsgc291cmNlXG4gKiAgICAgdGhhdCBzaG91bGQgYmUgdXNlZC4gU2NoZW1hOlxuICpcbiAqICAgICB7XG4gKiAgICAgICBidWNrZXROYW1lOiBzdHJpbmdcbiAqICAgICAgIGJ1Y2tldEtleTogc3RyaW5nXG4gKiAgICAgfVxuICpcbiAqICAgLSB2YXJpYWJsZXMqLmpzb24gd2hpY2ggY2FuIGJlIHplcm8gb3IgbW9yZSBmaWxlc1xuICogICAgIHdpdGggc3RyaW5nLXN0cmluZyBtYXAgaG9sZGluZyB2YXJpYWJsZXMgdGhhdCB3aWxsXG4gKiAgICAgYmUgd3JpdHRlbiB0byB2YXJpYWJsZXMuanNvbiBhbmQgY2FuIGJlIHJlYWQgYnkgdGhlXG4gKiAgICAgdGhlIENESyBhcHBsaWNhdGlvbiBkdXJpbmcgc3ludGhlc2l6ZS5cbiAqXG4gKiBGb3IgdXBsb2FkIHR5cGUgXCJjbG91ZC1hc3NlbWJseVwiOlxuICpcbiAqICAgLSBjbG91ZC1hc3NlbWJseS5qc29uIGhvbGRpbmcgYSBwb2ludGVyIHRvIHRoZSBhY3RpdmVcbiAqICAgICBDREsgQ2xvdWQgQXNzZW1ibHkgdGhhdCBzaG91bGQgYmUgdXNlZDogU2NoZW1hOlxuICpcbiAqICAgICB7XG4gKiAgICAgICBjbG91ZEFzc2VtYmx5QnVja2V0TmFtZTogc3RyaW5nXG4gKiAgICAgICBjbG91ZEFzc2VtYmx5QnVja2V0S2V5OiBzdHJpbmdcbiAqICAgICB9XG4gKlxuICogVmFyaWFibGVzIGVuYWJsZXMgc2VwYXJhdGlvbiBvZiBJYUMgY29kZSBhbmQgYXBwbGljYXRpb24gY29kZSBpZlxuICogdGhleSBhcmUgbm90IGNvbG9jYXRlZCBpbiB0aGUgc2FtZSByZXBvc2l0b3J5LlxuICovXG5leHBvcnQgY2xhc3MgTGlmbGlnQ2RrUGlwZWxpbmUgZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIC8qKlxuICAgKiBQYXRoIG9uIFMzIGZvciBwaXBlbGluZSBjb25maWd1cmF0aW9uLlxuICAgKi9cbiAgc3RhdGljIHBpcGVsaW5lUzNQcmVmaXgocGlwZWxpbmVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgcGlwZWxpbmVzLyR7cGlwZWxpbmVOYW1lfS9gXG4gIH1cblxuICAvKipcbiAgICogS2V5IGluIFMzIGJ1Y2tldCB1c2VkIHRvIHRyaWdnZXIgcGlwZWxpbmUuXG4gICAqXG4gICAqIFRoaXMgaXMgYW4gZW1wdHkgZmlsZSB3aXRoaW4gdGhlIHBpcGVsaW5lIHBhdGguXG4gICAqL1xuICBzdGF0aWMgcGlwZWxpbmVTM1RyaWdnZXJLZXkocGlwZWxpbmVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgcGlwZWxpbmVzLyR7cGlwZWxpbmVOYW1lfS90cmlnZ2VyYFxuICB9XG5cbiAgcHVibGljIHJlYWRvbmx5IGNka1BpcGVsaW5lOiBwaXBlbGluZXMuQ29kZVBpcGVsaW5lXG4gIHB1YmxpYyByZWFkb25seSBjb2RlUGlwZWxpbmU6IGNvZGVwaXBlbGluZS5QaXBlbGluZVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBMaWZsaWdDZGtQaXBlbGluZVByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBhcnRpZmFjdHNCdWNrZXQgPVxuICAgICAgcHJvcHMuYXJ0aWZhY3RzQnVja2V0ID8/IGdldEdyaWlkQXJ0ZWZhY3RCdWNrZXQodGhpcylcblxuICAgIGNvbnN0IGNsb3VkQXNzZW1ibHlBcnRpZmFjdCA9IG5ldyBjb2RlcGlwZWxpbmUuQXJ0aWZhY3QoKVxuXG4gICAgbGV0IHN5bnRoOiBwaXBlbGluZXMuSUZpbGVTZXRQcm9kdWNlclxuICAgIGxldCBzdGFnZXM6IGNvZGVwaXBlbGluZS5TdGFnZVByb3BzW11cblxuICAgIHN3aXRjaCAocHJvcHMuc291cmNlVHlwZSkge1xuICAgICAgY2FzZSBcImNsb3VkLWFzc2VtYmx5XCI6XG4gICAgICAgIGNvbnN0IGNsb3VkQXNzZW1ibHkgPSB0aGlzLmNsb3VkQXNzZW1ibHlTdGFnZShcbiAgICAgICAgICBjbG91ZEFzc2VtYmx5QXJ0aWZhY3QsXG4gICAgICAgICAgYXJ0aWZhY3RzQnVja2V0LFxuICAgICAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgKVxuICAgICAgICBzeW50aCA9IGNsb3VkQXNzZW1ibHkuc3ludGhcbiAgICAgICAgc3RhZ2VzID0gY2xvdWRBc3NlbWJseS5zdGFnZXNcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjZGstc291cmNlXCI6XG4gICAgICAgIGNvbnN0IGNka1NvdXJjZSA9IHRoaXMuY2RrU291cmNlU3RhZ2UoXG4gICAgICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgICAgICAgIGFydGlmYWN0c0J1Y2tldCxcbiAgICAgICAgICBwcm9wcy5waXBlbGluZU5hbWUsXG4gICAgICAgICAgcHJvcHMucGFyYW1ldGVyc05hbWVzcGFjZSA/PyBcImRlZmF1bHRcIixcbiAgICAgICAgKVxuICAgICAgICBzeW50aCA9IGNka1NvdXJjZS5zeW50aFxuICAgICAgICBzdGFnZXMgPSBjZGtTb3VyY2Uuc3RhZ2VzXG4gICAgICAgIGJyZWFrXG4gICAgfVxuXG4gICAgY29uc3QgZHVtbXlBcnRpZmFjdCA9IG5ldyBjb2RlcGlwZWxpbmUuQXJ0aWZhY3QoKVxuXG4gICAgdGhpcy5jb2RlUGlwZWxpbmUgPSBuZXcgY29kZXBpcGVsaW5lLlBpcGVsaW5lKHRoaXMsIFwiQ29kZVBpcGVsaW5lXCIsIHtcbiAgICAgIHBpcGVsaW5lTmFtZTogcHJvcHMucGlwZWxpbmVOYW1lLFxuICAgICAgc3RhZ2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBzdGFnZU5hbWU6IFwiU291cmNlXCIsXG4gICAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgICAgbmV3IGNvZGVwaXBlbGluZUFjdGlvbnMuUzNTb3VyY2VBY3Rpb24oe1xuICAgICAgICAgICAgICBhY3Rpb25OYW1lOiBcInNvdXJjZVwiLFxuICAgICAgICAgICAgICBidWNrZXQ6IGFydGlmYWN0c0J1Y2tldCxcbiAgICAgICAgICAgICAgdHJpZ2dlcjogY29kZXBpcGVsaW5lQWN0aW9ucy5TM1RyaWdnZXIuTk9ORSxcbiAgICAgICAgICAgICAgYnVja2V0S2V5OiBMaWZsaWdDZGtQaXBlbGluZS5waXBlbGluZVMzVHJpZ2dlcktleShcbiAgICAgICAgICAgICAgICBwcm9wcy5waXBlbGluZU5hbWUsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIG91dHB1dDogZHVtbXlBcnRpZmFjdCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICAgIC4uLnN0YWdlcyxcbiAgICAgIF0sXG4gICAgICByZXN0YXJ0RXhlY3V0aW9uT25VcGRhdGU6IHRydWUsXG4gICAgfSlcblxuICAgIG5ldyBldmVudHMuUnVsZSh0aGlzLCBcIlBpcGVsaW5lVHJpZ2dlclwiLCB7XG4gICAgICBldmVudFBhdHRlcm46IHtcbiAgICAgICAgc291cmNlOiBbXCJhd3MuczNcIl0sXG4gICAgICAgIGRldGFpbFR5cGU6IFtcIk9iamVjdCBDcmVhdGVkXCJdLFxuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICBidWNrZXQ6IHtcbiAgICAgICAgICAgIG5hbWU6IFthcnRpZmFjdHNCdWNrZXQuYnVja2V0TmFtZV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogW0xpZmxpZ0Nka1BpcGVsaW5lLnBpcGVsaW5lUzNUcmlnZ2VyS2V5KHByb3BzLnBpcGVsaW5lTmFtZSldLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGFyZ2V0czogW25ldyB0YXJnZXRzLkNvZGVQaXBlbGluZSh0aGlzLmNvZGVQaXBlbGluZSldLFxuICAgIH0pXG5cbiAgICB0aGlzLmNka1BpcGVsaW5lID0gbmV3IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmUodGhpcywgXCJDZGtQaXBlbGluZVwiLCB7XG4gICAgICBzeW50aCxcbiAgICAgIHVzZUNoYW5nZVNldHM6IGZhbHNlLFxuICAgICAgY29kZVBpcGVsaW5lOiB0aGlzLmNvZGVQaXBlbGluZSxcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0QXdzQ2RrUGFja2FnZUpzb25GaWxlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gQWxzbyBsb29rIHVwIHRoZSB0cmVlIGEgYml0IHRvIGhhbmRsZSB5YXJuIHdvcmtzcGFjZXMuXG4gICAgY29uc3QgY2FuZGlkYXRlcyA9IFtcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIm5vZGVfbW9kdWxlcy9hd3MtY2RrL3BhY2thZ2UuanNvblwiKSxcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4uL25vZGVfbW9kdWxlcy9hd3MtY2RrL3BhY2thZ2UuanNvblwiKSxcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4uLy4uL25vZGVfbW9kdWxlcy9hd3MtY2RrL3BhY2thZ2UuanNvblwiKSxcbiAgICAgIHBhdGguam9pbihwcm9jZXNzLmN3ZCgpLCBcIi4uLy4uLy4uL25vZGVfbW9kdWxlcy9hd3MtY2RrL3BhY2thZ2UuanNvblwiKSxcbiAgICBdXG5cbiAgICBmb3IgKGNvbnN0IGNhbmRpZGF0ZSBvZiBjYW5kaWRhdGVzKSB7XG4gICAgICBpZiAoZnMuZXhpc3RzU3luYyhjYW5kaWRhdGUpKSB7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGVcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdW5kZWZpbmVkXG4gIH1cblxuICBwcml2YXRlIGNsb3VkQXNzZW1ibHlTdGFnZShcbiAgICBjbG91ZEFzc2VtYmx5QXJ0aWZhY3Q6IGNvZGVwaXBlbGluZS5BcnRpZmFjdCxcbiAgICBjZGtCdWNrZXQ6IHMzLklCdWNrZXQsXG4gICAgcGlwZWxpbmVOYW1lOiBzdHJpbmcsXG4gICk6IHsgc3RhZ2VzOiBjb2RlcGlwZWxpbmUuU3RhZ2VQcm9wc1tdOyBzeW50aDogcGlwZWxpbmVzLklGaWxlU2V0UHJvZHVjZXIgfSB7XG4gICAgY29uc3QgY2xvdWRBc3NlbWJseUxvb2t1cEZuID0gbmV3IGxhbWJkYS5GdW5jdGlvbihcbiAgICAgIHRoaXMsXG4gICAgICBcIkNsb3VkQXNzZW1ibHlMb29rdXBGblwiLFxuICAgICAge1xuICAgICAgICBjb2RlOiBuZXcgbGFtYmRhLklubGluZUNvZGUoXG4gICAgICAgICAgYGV4cG9ydHMuaGFuZGxlciA9ICR7Y2xvdWRBc3NlbWJseUxvb2t1cEhhbmRsZXIudG9TdHJpbmcoKX07YCxcbiAgICAgICAgKSxcbiAgICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICAgIHJ1bnRpbWU6IGxhbWJkYS5SdW50aW1lLk5PREVKU18xNl9YLFxuICAgICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24ubWludXRlcygxKSxcbiAgICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgICAgfSxcbiAgICApXG5cbiAgICBjZGtCdWNrZXQuZ3JhbnRSZWFkV3JpdGUoY2xvdWRBc3NlbWJseUxvb2t1cEZuKVxuXG4gICAgY29uc3QgdXNlclBhcmFtZXRlcnM6IENsb3VkQXNzZW1ibHlMb29rdXBVc2VyUGFyYW1ldGVycyA9IHtcbiAgICAgIGJ1Y2tldE5hbWU6IGNka0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgb2JqZWN0S2V5OiBgcGlwZWxpbmVzLyR7cGlwZWxpbmVOYW1lfS9jbG91ZC1hc3NlbWJseS5qc29uYCxcbiAgICB9XG5cbiAgICBjb25zdCBzeW50aCA9IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmVGaWxlU2V0LmZyb21BcnRpZmFjdChcbiAgICAgIGNsb3VkQXNzZW1ibHlBcnRpZmFjdCxcbiAgICApXG5cbiAgICBjb25zdCBzdGFnZXMgPSBbXG4gICAgICB7XG4gICAgICAgIHN0YWdlTmFtZTogXCJQcmVwYXJlQ2xvdWRBc3NlbWJseVwiLFxuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgbmV3IGNvZGVwaXBlbGluZUFjdGlvbnMuTGFtYmRhSW52b2tlQWN0aW9uKHtcbiAgICAgICAgICAgIGFjdGlvbk5hbWU6IFwiY2xvdWQtYXNzZW1ibHktbG9va3VwXCIsXG4gICAgICAgICAgICBsYW1iZGE6IGNsb3VkQXNzZW1ibHlMb29rdXBGbixcbiAgICAgICAgICAgIG91dHB1dHM6IFtjbG91ZEFzc2VtYmx5QXJ0aWZhY3RdLFxuICAgICAgICAgICAgdXNlclBhcmFtZXRlcnMsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF1cbiAgICByZXR1cm4geyBzdGFnZXMsIHN5bnRoIH1cbiAgfVxuXG4gIHByaXZhdGUgY2RrU291cmNlU3RhZ2UoXG4gICAgY2xvdWRBc3NlbWJseUFydGlmYWN0OiBjb2RlcGlwZWxpbmUuQXJ0aWZhY3QsXG4gICAgY2RrQnVja2V0OiBzMy5JQnVja2V0LFxuICAgIHBpcGVsaW5lTmFtZTogc3RyaW5nLFxuICAgIHBhcmFtZXRlcnNOYW1lc3BhY2U6IHN0cmluZyxcbiAgKTogeyBzdGFnZXM6IGNvZGVwaXBlbGluZS5TdGFnZVByb3BzW107IHN5bnRoOiBwaXBlbGluZXMuSUZpbGVTZXRQcm9kdWNlciB9IHtcbiAgICBjb25zdCBwcmVwYXJlQ2RrU291cmNlRm4gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKHRoaXMsIFwiUHJlcGFyZUNka1NvdXJjZUZuXCIsIHtcbiAgICAgIGNvZGU6IGxhbWJkYS5Db2RlLmZyb21Bc3NldChcbiAgICAgICAgcGF0aC5qb2luKF9fZGlybmFtZSwgXCIuLi8uLi9hc3NldHMvcHJlcGFyZS1jZGstc291cmNlLWxhbWJkYVwiKSxcbiAgICAgICksXG4gICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgIC8vIFVzaW5nIHB5dGhvbiBpbnN0ZWFkIGlmIE5vZGVKUyBkdWUgdG8gemlwLXN1cHBvcnQgaW4gc3RkbGliLlxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfOCxcbiAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgbWVtb3J5U2l6ZTogNTEyLFxuICAgIH0pXG5cbiAgICBjb25zdCBhY2NvdW50ID0gY2RrLlN0YWNrLm9mKHRoaXMpLmFjY291bnRcbiAgICBjb25zdCByZWdpb24gPSBjZGsuU3RhY2sub2YodGhpcykucmVnaW9uXG5cbiAgICBwcmVwYXJlQ2RrU291cmNlRm4uZ3JhbnRQcmluY2lwYWwuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcInNzbTpHZXRQYXJhbWV0ZXJzQnlQYXRoXCJdLFxuICAgICAgICByZXNvdXJjZXM6IFtcbiAgICAgICAgICBgYXJuOmF3czpzc206JHtyZWdpb259OiR7YWNjb3VudH06cGFyYW1ldGVyL2xpZmxpZy1jZGsvKi9waXBlbGluZS12YXJpYWJsZXMvKmAsXG4gICAgICAgIF0sXG4gICAgICB9KSxcbiAgICApXG5cbiAgICBjZGtCdWNrZXQuZ3JhbnRSZWFkV3JpdGUocHJlcGFyZUNka1NvdXJjZUZuKVxuXG4gICAgY29uc3QgY2RrU291cmNlQXJ0aWZhY3QgPSBuZXcgY29kZXBpcGVsaW5lLkFydGlmYWN0KClcblxuICAgIGNvbnN0IHVzZXJQYXJhbWV0ZXJzOiBQcmVwYXJlQ2RrU291cmNlVXNlclBhcmFtZXRlcnMgPSB7XG4gICAgICBidWNrZXROYW1lOiBjZGtCdWNrZXQuYnVja2V0TmFtZSxcbiAgICAgIHByZWZpeDogYHBpcGVsaW5lcy8ke3BpcGVsaW5lTmFtZX0vYCxcbiAgICAgIHBhcmFtZXRlcnNOYW1lc3BhY2U6IHBhcmFtZXRlcnNOYW1lc3BhY2UsXG4gICAgfVxuXG4gICAgY29uc3Qgc3ludGggPSBuZXcgcGlwZWxpbmVzLlNoZWxsU3RlcChcIkdlbmVyYXRlQ2xvdWRBc3NlbWJseVwiLCB7XG4gICAgICBpbnB1dDogcGlwZWxpbmVzLkNvZGVQaXBlbGluZUZpbGVTZXQuZnJvbUFydGlmYWN0KGNka1NvdXJjZUFydGlmYWN0KSxcbiAgICAgIGluc3RhbGxDb21tYW5kczogW1wibnBtIGNpXCJdLFxuICAgICAgY29tbWFuZHM6IFtcIm5weCBjZGsgc3ludGhcIl0sXG4gICAgfSlcbiAgICBjb25zdCBzdGFnZXMgPSBbXG4gICAgICB7XG4gICAgICAgIHN0YWdlTmFtZTogXCJQcmVwYXJlQ2RrU291cmNlXCIsXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBuZXcgY29kZXBpcGVsaW5lQWN0aW9ucy5MYW1iZGFJbnZva2VBY3Rpb24oe1xuICAgICAgICAgICAgYWN0aW9uTmFtZTogXCJwcmVwYXJlLWNkay1zb3VyY2VcIixcbiAgICAgICAgICAgIGxhbWJkYTogcHJlcGFyZUNka1NvdXJjZUZuLFxuICAgICAgICAgICAgb3V0cHV0czogW2Nka1NvdXJjZUFydGlmYWN0XSxcbiAgICAgICAgICAgIHVzZXJQYXJhbWV0ZXJzLFxuICAgICAgICAgIH0pLFxuICAgICAgICBdLFxuICAgICAgfSxcbiAgICBdXG4gICAgcmV0dXJuIHsgc3RhZ2VzLCBzeW50aCB9XG4gIH1cblxuICBhZGRTbGFja05vdGlmaWNhdGlvbihwcm9wczogT21pdDxTbGFja05vdGlmaWNhdGlvblByb3BzLCBcInBpcGVsaW5lXCI+KTogdm9pZCB7XG4gICAgbmV3IFNsYWNrTm90aWZpY2F0aW9uKHRoaXMsIFwiU2xhY2tcIiwge1xuICAgICAgcGlwZWxpbmU6IHRoaXMuY29kZVBpcGVsaW5lLFxuICAgICAgLi4ucHJvcHMsXG4gICAgfSlcbiAgfVxufVxuXG5pbnRlcmZhY2UgUHJlcGFyZUNka1NvdXJjZVVzZXJQYXJhbWV0ZXJzIHtcbiAgYnVja2V0TmFtZTogc3RyaW5nXG4gIHByZWZpeDogc3RyaW5nXG4gIHBhcmFtZXRlcnNOYW1lc3BhY2U6IHN0cmluZ1xufVxuIl19
232
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlmbGlnLWNkay1waXBlbGluZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jZGstcGlwZWxpbmVzL2xpZmxpZy1jZGstcGlwZWxpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEseUNBQXdDO0FBQ3hDLDZEQUE0RDtBQUM1RCw0RUFBMkU7QUFDM0UsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxpREFBZ0Q7QUFDaEQsMERBQXlEO0FBRXpELG1DQUFrQztBQUNsQyxtREFBa0Q7QUFDbEQseUJBQXdCO0FBQ3hCLDZCQUE0QjtBQUM1Qiw4REFBaUU7QUFDakUsbUZBR3dDO0FBQ3hDLDZEQUFnRjtBQStDaEY7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILE1BQWEsaUJBQWtCLFNBQVEsVUFBVSxDQUFDLFNBQVM7SUFDekQ7O09BRUc7SUFDSCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsWUFBb0I7UUFDMUMsT0FBTyxhQUFhLFlBQVksR0FBRyxDQUFBO0lBQ3JDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsTUFBTSxDQUFDLG9CQUFvQixDQUFDLFlBQW9CO1FBQzlDLE9BQU8sYUFBYSxZQUFZLFVBQVUsQ0FBQTtJQUM1QyxDQUFDO0lBT0QsWUFDRSxLQUEyQixFQUMzQixFQUFVLEVBQ1YsS0FBNkI7O1FBRTdCLEtBQUssQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFFaEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFBLEtBQUssQ0FBQyxlQUFlLG1DQUFJLElBQUEsd0NBQXNCLEVBQUMsSUFBSSxDQUFDLENBQUE7UUFFNUUsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUV6RCxJQUFJLEtBQWlDLENBQUE7UUFDckMsSUFBSSxNQUFpQyxDQUFBO1FBRXJDLFFBQVEsS0FBSyxDQUFDLFVBQVUsRUFBRTtZQUN4QixLQUFLLGdCQUFn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dCAqIGFzIGNvbnN0cnVjdHMgZnJvbSBcImNvbnN0cnVjdHNcIlxuaW1wb3J0ICogYXMgY29kZXBpcGVsaW5lIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtY29kZXBpcGVsaW5lXCJcbmltcG9ydCAqIGFzIGNvZGVwaXBlbGluZUFjdGlvbnMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmUtYWN0aW9uc1wiXG5pbXBvcnQgKiBhcyBpYW0gZnJvbSBcImF3cy1jZGstbGliL2F3cy1pYW1cIlxuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtbGFtYmRhXCJcbmltcG9ydCAqIGFzIGV2ZW50cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50c1wiXG5pbXBvcnQgKiBhcyB0YXJnZXRzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtZXZlbnRzLXRhcmdldHNcIlxuaW1wb3J0ICogYXMgczMgZnJvbSBcImF3cy1jZGstbGliL2F3cy1zM1wiXG5pbXBvcnQgKiBhcyBjZGsgZnJvbSBcImF3cy1jZGstbGliXCJcbmltcG9ydCAqIGFzIHBpcGVsaW5lcyBmcm9tIFwiYXdzLWNkay1saWIvcGlwZWxpbmVzXCJcbmltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCB7IGdldEdyaWlkQXJ0ZWZhY3RCdWNrZXQgfSBmcm9tIFwiLi4vZ3JpaWQvYXJ0ZWZhY3QtYnVja2V0XCJcbmltcG9ydCB7XG4gIGNsb3VkQXNzZW1ibHlMb29rdXBIYW5kbGVyLFxuICBDbG91ZEFzc2VtYmx5TG9va3VwVXNlclBhcmFtZXRlcnMsXG59IGZyb20gXCIuL2Nsb3VkLWFzc2VtYmx5LWxvb2t1cC1oYW5kbGVyXCJcbmltcG9ydCB7IFNsYWNrTm90aWZpY2F0aW9uLCBTbGFja05vdGlmaWNhdGlvblByb3BzIH0gZnJvbSBcIi4vc2xhY2stbm90aWZpY2F0aW9uXCJcblxuZXhwb3J0IGludGVyZmFjZSBMaWZsaWdDZGtQaXBlbGluZVByb3BzIHtcbiAgLyoqXG4gICAqIEJ1Y2tldCBob2xkaW5nIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24gYW5kIHRyaWdnZXIgZmlsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB1c2UgZXhpc3RpbmcgYnVja2V0IGJhc2VkIG9uIEdyaWlkIGNvbnZlbnRpb25zXG4gICAqL1xuICBhcnRpZmFjdHNCdWNrZXQ/OiBzMy5JQnVja2V0XG4gIC8qKlxuICAgKiBOYW1lIG9mIHBpcGVsaW5lLiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBwYXRoIHdoZXJlIGNvbmZpZ3VyYXRpb25cbiAgICogaXMgc3RvcmVkIGluIFMzLlxuICAgKi9cbiAgcGlwZWxpbmVOYW1lOiBzdHJpbmdcbiAgLyoqXG4gICAqIFR5cGUgb2YgdXBsb2FkZWQgYXJ0aWZhY3QuIFRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3VyIG9mIHRoZVxuICAgKiBwaXBlbGluZSBhbmQgd2hhdCBraW5kIG9mIHByb2Nlc3MgaXQgcGVyZm9ybXMuXG4gICAqXG4gICAqIFR3byB0eXBlcyBhcmUgc3VwcG9ydGVkOlxuICAgKlxuICAgKiAgIC0gY2RrLXNvdXJjZTogVGhlIHVwbG9hZGVkIGFydGlmYWN0IHJlcHJlc2VudHMgYSBDREsgYXBwbGljYXRpb25cbiAgICogICAgIGFzIHNvdXJjZSBjb2RlLiBBIGJ1aWxkIHN0ZXAgd2lsbCBjb21waWxlIHRoaXMgaW50byBhXG4gICAqICAgICBDREsgQ2xvdWQgQXNzZW1ibHkuXG4gICAqXG4gICAqICAgICBBcyBwYXJ0IG9mIHN5bnRoZXNpemluZyB0aGlzIGludG8gYSBDREsgQ2xvdWQgQXNzZW1ibHksXG4gICAqICAgICBhIGZpbGUgXCJ2YXJpYWJsZXMuanNvblwiIHdpbGwgYmUgd3JpdHRlbiBmb3IgdGhlXG4gICAqICAgICBDREsgYXBwbGljYXRpb24gdG8gcGFyYW1ldGVyaXplIHRoZSBidWlsZCBpZiBhbnlcbiAgICogICAgIHZhcmlhYmxlcyBhcmUgZm91bmQgaW4gdGhlIHBpcGVsaW5lIHNvdXJjZS5cbiAgICpcbiAgICogICAtIGNsb3VkLWFzc2VtYmx5OiBUaGUgdXBsb2FkZWQgYXJ0aWZhY3QgcmVwcmVzZW50cyBhXG4gICAqICAgICBDREsgQ2xvdWQgQXNzZW1ibHkgd2hpY2ggaXMgcmVhZHkgZm9yIGRlcGxveW1lbnQuXG4gICAqXG4gICAqICAgICBUaGlzIGRvZXMgbm90IHN1cHBvcnQgcmVhZGluZyB2YXJpYWJsZXMgYXQgdGhlIGN1cnJlbnQgdGltZVxuICAgKiAgICAgc2luY2UgQ0RLIFBpcGVsaW5lcyBkb24ndCBzdXBwb3J0IHBhcmFtZXRlcml6ZWQgZGVwbG95cy5cbiAgICogICAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYXdzL2F3cy1jZGsvaXNzdWVzLzk1NjBcbiAgICovXG4gIHNvdXJjZVR5cGU6IFwiY2RrLXNvdXJjZVwiIHwgXCJjbG91ZC1hc3NlbWJseVwiXG4gIC8qKlxuICAgKiBUaGUgbmFtZXNwYWNlIHVzZWQgZm9yIHBhcmFtZXRlcnMgaW4gUGFyYW1ldGVyIFN0b3JlLlxuICAgKlxuICAgKiBPbmx5IHJlbGV2YW50IGZvciBzb3VyY2VUeXBlIG9mIFwiY2RrLXNvcnVjZVwiLlxuICAgKlxuICAgKiBAZGVmYXVsdCBkZWZhdWx0XG4gICAqL1xuICBwYXJhbWV0ZXJzTmFtZXNwYWNlPzogc3RyaW5nXG59XG5cbi8qKlxuICogQ0RLIFBpcGVsaW5lIGZvciBMaWZsaWcuXG4gKlxuICogQXZvaWQgcHV0dGluZyBtdWx0aXBsZSBwaXBlbGluZXMgaW4gYSBzdGFjaywgc2luY2UgdGhlIHBpcGVsaW5lXG4gKiB3aWxsIGFsc28ga2VlcCB0aGUgaG9zdGluZyBzdGFjayB1cC10by1kYXRlLlxuICpcbiAqIFRoZSBwaXBlbGluZSBpcyBleGVjdXRlZCBieSB3cml0aW5nIGFuIGVtcHR5IGZpbGUgdG9cbiAqIHMzOi8vPGFydGlmYWN0cy1idWNrZXQ+L3BpcGVsaW5lcy88cGlwZWxpbmUtbmFtZT4vdHJpZ2dlclxuICpcbiAqIENvbmZpZ3VyYXRpb24gZmlsZXMgYXJlIHJlYWQgZnJvbSBTMyBhdCB0aGUgcGF0aFxuICogczM6Ly88YXJ0aWZhY3RzLWJ1Y2tldD4vcGlwZWxpbmVzLzxwaXBlbGluZS1uYW1lPi9cbiAqXG4gKiBGb3IgdXBsb2FkIHR5cGUgXCJjZGstc291cmNlXCI6XG4gKlxuICogICAtIGNkay1zb3VyY2UuanNvbiBob2xkaW5nIGEgcG9pbnRlciB0byB0aGUgYWN0aXZlIENESyBzb3VyY2VcbiAqICAgICB0aGF0IHNob3VsZCBiZSB1c2VkLiBTY2hlbWE6XG4gKlxuICogICAgIHtcbiAqICAgICAgIGJ1Y2tldE5hbWU6IHN0cmluZ1xuICogICAgICAgYnVja2V0S2V5OiBzdHJpbmdcbiAqICAgICB9XG4gKlxuICogICAtIHZhcmlhYmxlcyouanNvbiB3aGljaCBjYW4gYmUgemVybyBvciBtb3JlIGZpbGVzXG4gKiAgICAgd2l0aCBzdHJpbmctc3RyaW5nIG1hcCBob2xkaW5nIHZhcmlhYmxlcyB0aGF0IHdpbGxcbiAqICAgICBiZSB3cml0dGVuIHRvIHZhcmlhYmxlcy5qc29uIGFuZCBjYW4gYmUgcmVhZCBieSB0aGVcbiAqICAgICB0aGUgQ0RLIGFwcGxpY2F0aW9uIGR1cmluZyBzeW50aGVzaXplLlxuICpcbiAqIEZvciB1cGxvYWQgdHlwZSBcImNsb3VkLWFzc2VtYmx5XCI6XG4gKlxuICogICAtIGNsb3VkLWFzc2VtYmx5Lmpzb24gaG9sZGluZyBhIHBvaW50ZXIgdG8gdGhlIGFjdGl2ZVxuICogICAgIENESyBDbG91ZCBBc3NlbWJseSB0aGF0IHNob3VsZCBiZSB1c2VkOiBTY2hlbWE6XG4gKlxuICogICAgIHtcbiAqICAgICAgIGNsb3VkQXNzZW1ibHlCdWNrZXROYW1lOiBzdHJpbmdcbiAqICAgICAgIGNsb3VkQXNzZW1ibHlCdWNrZXRLZXk6IHN0cmluZ1xuICogICAgIH1cbiAqXG4gKiBWYXJpYWJsZXMgZW5hYmxlcyBzZXBhcmF0aW9uIG9mIElhQyBjb2RlIGFuZCBhcHBsaWNhdGlvbiBjb2RlIGlmXG4gKiB0aGV5IGFyZSBub3QgY29sb2NhdGVkIGluIHRoZSBzYW1lIHJlcG9zaXRvcnkuXG4gKi9cbmV4cG9ydCBjbGFzcyBMaWZsaWdDZGtQaXBlbGluZSBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgLyoqXG4gICAqIFBhdGggb24gUzMgZm9yIHBpcGVsaW5lIGNvbmZpZ3VyYXRpb24uXG4gICAqL1xuICBzdGF0aWMgcGlwZWxpbmVTM1ByZWZpeChwaXBlbGluZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBwaXBlbGluZXMvJHtwaXBlbGluZU5hbWV9L2BcbiAgfVxuXG4gIC8qKlxuICAgKiBLZXkgaW4gUzMgYnVja2V0IHVzZWQgdG8gdHJpZ2dlciBwaXBlbGluZS5cbiAgICpcbiAgICogVGhpcyBpcyBhbiBlbXB0eSBmaWxlIHdpdGhpbiB0aGUgcGlwZWxpbmUgcGF0aC5cbiAgICovXG4gIHN0YXRpYyBwaXBlbGluZVMzVHJpZ2dlcktleShwaXBlbGluZU5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGBwaXBlbGluZXMvJHtwaXBlbGluZU5hbWV9L3RyaWdnZXJgXG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgY2RrUGlwZWxpbmU6IHBpcGVsaW5lcy5Db2RlUGlwZWxpbmVcbiAgcHVibGljIHJlYWRvbmx5IGNvZGVQaXBlbGluZTogY29kZXBpcGVsaW5lLlBpcGVsaW5lXG4gIHB1YmxpYyByZWFkb25seSBhcnRpZmFjdHNCdWNrZXQ6IHMzLklCdWNrZXRcbiAgcHVibGljIHJlYWRvbmx5IHRyaWdnZXJPYmplY3RLZXk6IHN0cmluZ1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBMaWZsaWdDZGtQaXBlbGluZVByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICB0aGlzLmFydGlmYWN0c0J1Y2tldCA9IHByb3BzLmFydGlmYWN0c0J1Y2tldCA/PyBnZXRHcmlpZEFydGVmYWN0QnVja2V0KHRoaXMpXG5cbiAgICBjb25zdCBjbG91ZEFzc2VtYmx5QXJ0aWZhY3QgPSBuZXcgY29kZXBpcGVsaW5lLkFydGlmYWN0KClcblxuICAgIGxldCBzeW50aDogcGlwZWxpbmVzLklGaWxlU2V0UHJvZHVjZXJcbiAgICBsZXQgc3RhZ2VzOiBjb2RlcGlwZWxpbmUuU3RhZ2VQcm9wc1tdXG5cbiAgICBzd2l0Y2ggKHByb3BzLnNvdXJjZVR5cGUpIHtcbiAgICAgIGNhc2UgXCJjbG91ZC1hc3NlbWJseVwiOlxuICAgICAgICBjb25zdCBjbG91ZEFzc2VtYmx5ID0gdGhpcy5jbG91ZEFzc2VtYmx5U3RhZ2UoXG4gICAgICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgICAgICAgIHRoaXMuYXJ0aWZhY3RzQnVja2V0LFxuICAgICAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgKVxuICAgICAgICBzeW50aCA9IGNsb3VkQXNzZW1ibHkuc3ludGhcbiAgICAgICAgc3RhZ2VzID0gY2xvdWRBc3NlbWJseS5zdGFnZXNcbiAgICAgICAgYnJlYWtcbiAgICAgIGNhc2UgXCJjZGstc291cmNlXCI6XG4gICAgICAgIGNvbnN0IGNka1NvdXJjZSA9IHRoaXMuY2RrU291cmNlU3RhZ2UoXG4gICAgICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgICAgICAgIHRoaXMuYXJ0aWZhY3RzQnVja2V0LFxuICAgICAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICAgICAgICBwcm9wcy5wYXJhbWV0ZXJzTmFtZXNwYWNlID8/IFwiZGVmYXVsdFwiLFxuICAgICAgICApXG4gICAgICAgIHN5bnRoID0gY2RrU291cmNlLnN5bnRoXG4gICAgICAgIHN0YWdlcyA9IGNka1NvdXJjZS5zdGFnZXNcbiAgICAgICAgYnJlYWtcbiAgICB9XG5cbiAgICBjb25zdCBkdW1teUFydGlmYWN0ID0gbmV3IGNvZGVwaXBlbGluZS5BcnRpZmFjdCgpXG5cbiAgICB0aGlzLnRyaWdnZXJPYmplY3RLZXkgPSBMaWZsaWdDZGtQaXBlbGluZS5waXBlbGluZVMzVHJpZ2dlcktleShcbiAgICAgIHByb3BzLnBpcGVsaW5lTmFtZSxcbiAgICApXG5cbiAgICB0aGlzLmNvZGVQaXBlbGluZSA9IG5ldyBjb2RlcGlwZWxpbmUuUGlwZWxpbmUodGhpcywgXCJDb2RlUGlwZWxpbmVcIiwge1xuICAgICAgcGlwZWxpbmVOYW1lOiBwcm9wcy5waXBlbGluZU5hbWUsXG4gICAgICBzdGFnZXM6IFtcbiAgICAgICAge1xuICAgICAgICAgIHN0YWdlTmFtZTogXCJTb3VyY2VcIixcbiAgICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgICBuZXcgY29kZXBpcGVsaW5lQWN0aW9ucy5TM1NvdXJjZUFjdGlvbih7XG4gICAgICAgICAgICAgIGFjdGlvbk5hbWU6IFwic291cmNlXCIsXG4gICAgICAgICAgICAgIGJ1Y2tldDogdGhpcy5hcnRpZmFjdHNCdWNrZXQsXG4gICAgICAgICAgICAgIHRyaWdnZXI6IGNvZGVwaXBlbGluZUFjdGlvbnMuUzNUcmlnZ2VyLk5PTkUsXG4gICAgICAgICAgICAgIGJ1Y2tldEtleTogdGhpcy50cmlnZ2VyT2JqZWN0S2V5LFxuICAgICAgICAgICAgICBvdXRwdXQ6IGR1bW15QXJ0aWZhY3QsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgICAuLi5zdGFnZXMsXG4gICAgICBdLFxuICAgICAgcmVzdGFydEV4ZWN1dGlvbk9uVXBkYXRlOiB0cnVlLFxuICAgIH0pXG5cbiAgICBuZXcgZXZlbnRzLlJ1bGUodGhpcywgXCJQaXBlbGluZVRyaWdnZXJcIiwge1xuICAgICAgZXZlbnRQYXR0ZXJuOiB7XG4gICAgICAgIHNvdXJjZTogW1wiYXdzLnMzXCJdLFxuICAgICAgICBkZXRhaWxUeXBlOiBbXCJPYmplY3QgQ3JlYXRlZFwiXSxcbiAgICAgICAgZGV0YWlsOiB7XG4gICAgICAgICAgYnVja2V0OiB7XG4gICAgICAgICAgICBuYW1lOiBbdGhpcy5hcnRpZmFjdHNCdWNrZXQuYnVja2V0TmFtZV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICBvYmplY3Q6IHtcbiAgICAgICAgICAgIGtleTogW3RoaXMudHJpZ2dlck9iamVjdEtleV0sXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXRzOiBbbmV3IHRhcmdldHMuQ29kZVBpcGVsaW5lKHRoaXMuY29kZVBpcGVsaW5lKV0sXG4gICAgfSlcblxuICAgIHRoaXMuY2RrUGlwZWxpbmUgPSBuZXcgcGlwZWxpbmVzLkNvZGVQaXBlbGluZSh0aGlzLCBcIkNka1BpcGVsaW5lXCIsIHtcbiAgICAgIHN5bnRoLFxuICAgICAgdXNlQ2hhbmdlU2V0czogZmFsc2UsXG4gICAgICBjb2RlUGlwZWxpbmU6IHRoaXMuY29kZVBpcGVsaW5lLFxuICAgIH0pXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRBd3NDZGtQYWNrYWdlSnNvbkZpbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBBbHNvIGxvb2sgdXAgdGhlIHRyZWUgYSBiaXQgdG8gaGFuZGxlIHlhcm4gd29ya3NwYWNlcy5cbiAgICBjb25zdCBjYW5kaWRhdGVzID0gW1xuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwibm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vbm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vLi4vbm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIFwiLi4vLi4vLi4vbm9kZV9tb2R1bGVzL2F3cy1jZGsvcGFja2FnZS5qc29uXCIpLFxuICAgIF1cblxuICAgIGZvciAoY29uc3QgY2FuZGlkYXRlIG9mIGNhbmRpZGF0ZXMpIHtcbiAgICAgIGlmIChmcy5leGlzdHNTeW5jKGNhbmRpZGF0ZSkpIHtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1bmRlZmluZWRcbiAgfVxuXG4gIHByaXZhdGUgY2xvdWRBc3NlbWJseVN0YWdlKFxuICAgIGNsb3VkQXNzZW1ibHlBcnRpZmFjdDogY29kZXBpcGVsaW5lLkFydGlmYWN0LFxuICAgIGNka0J1Y2tldDogczMuSUJ1Y2tldCxcbiAgICBwaXBlbGluZU5hbWU6IHN0cmluZyxcbiAgKTogeyBzdGFnZXM6IGNvZGVwaXBlbGluZS5TdGFnZVByb3BzW107IHN5bnRoOiBwaXBlbGluZXMuSUZpbGVTZXRQcm9kdWNlciB9IHtcbiAgICBjb25zdCBjbG91ZEFzc2VtYmx5TG9va3VwRm4gPSBuZXcgbGFtYmRhLkZ1bmN0aW9uKFxuICAgICAgdGhpcyxcbiAgICAgIFwiQ2xvdWRBc3NlbWJseUxvb2t1cEZuXCIsXG4gICAgICB7XG4gICAgICAgIGNvZGU6IG5ldyBsYW1iZGEuSW5saW5lQ29kZShcbiAgICAgICAgICBgZXhwb3J0cy5oYW5kbGVyID0gJHtjbG91ZEFzc2VtYmx5TG9va3VwSGFuZGxlci50b1N0cmluZygpfTtgLFxuICAgICAgICApLFxuICAgICAgICBoYW5kbGVyOiBcImluZGV4LmhhbmRsZXJcIixcbiAgICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuTk9ERUpTXzE2X1gsXG4gICAgICAgIHRpbWVvdXQ6IGNkay5EdXJhdGlvbi5taW51dGVzKDEpLFxuICAgICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgICB9LFxuICAgIClcblxuICAgIGNka0J1Y2tldC5ncmFudFJlYWRXcml0ZShjbG91ZEFzc2VtYmx5TG9va3VwRm4pXG5cbiAgICBjb25zdCB1c2VyUGFyYW1ldGVyczogQ2xvdWRBc3NlbWJseUxvb2t1cFVzZXJQYXJhbWV0ZXJzID0ge1xuICAgICAgYnVja2V0TmFtZTogY2RrQnVja2V0LmJ1Y2tldE5hbWUsXG4gICAgICBvYmplY3RLZXk6IGBwaXBlbGluZXMvJHtwaXBlbGluZU5hbWV9L2Nsb3VkLWFzc2VtYmx5Lmpzb25gLFxuICAgIH1cblxuICAgIGNvbnN0IHN5bnRoID0gcGlwZWxpbmVzLkNvZGVQaXBlbGluZUZpbGVTZXQuZnJvbUFydGlmYWN0KFxuICAgICAgY2xvdWRBc3NlbWJseUFydGlmYWN0LFxuICAgIClcblxuICAgIGNvbnN0IHN0YWdlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgc3RhZ2VOYW1lOiBcIlByZXBhcmVDbG91ZEFzc2VtYmx5XCIsXG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBuZXcgY29kZXBpcGVsaW5lQWN0aW9ucy5MYW1iZGFJbnZva2VBY3Rpb24oe1xuICAgICAgICAgICAgYWN0aW9uTmFtZTogXCJjbG91ZC1hc3NlbWJseS1sb29rdXBcIixcbiAgICAgICAgICAgIGxhbWJkYTogY2xvdWRBc3NlbWJseUxvb2t1cEZuLFxuICAgICAgICAgICAgb3V0cHV0czogW2Nsb3VkQXNzZW1ibHlBcnRpZmFjdF0sXG4gICAgICAgICAgICB1c2VyUGFyYW1ldGVycyxcbiAgICAgICAgICB9KSxcbiAgICAgICAgXSxcbiAgICAgIH0sXG4gICAgXVxuICAgIHJldHVybiB7IHN0YWdlcywgc3ludGggfVxuICB9XG5cbiAgcHJpdmF0ZSBjZGtTb3VyY2VTdGFnZShcbiAgICBjbG91ZEFzc2VtYmx5QXJ0aWZhY3Q6IGNvZGVwaXBlbGluZS5BcnRpZmFjdCxcbiAgICBjZGtCdWNrZXQ6IHMzLklCdWNrZXQsXG4gICAgcGlwZWxpbmVOYW1lOiBzdHJpbmcsXG4gICAgcGFyYW1ldGVyc05hbWVzcGFjZTogc3RyaW5nLFxuICApOiB7IHN0YWdlczogY29kZXBpcGVsaW5lLlN0YWdlUHJvcHNbXTsgc3ludGg6IHBpcGVsaW5lcy5JRmlsZVNldFByb2R1Y2VyIH0ge1xuICAgIGNvbnN0IHByZXBhcmVDZGtTb3VyY2VGbiA9IG5ldyBsYW1iZGEuRnVuY3Rpb24odGhpcywgXCJQcmVwYXJlQ2RrU291cmNlRm5cIiwge1xuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uLy4uL2Fzc2V0cy9wcmVwYXJlLWNkay1zb3VyY2UtbGFtYmRhXCIpLFxuICAgICAgKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgLy8gVXNpbmcgcHl0aG9uIGluc3RlYWQgaWYgTm9kZUpTIGR1ZSB0byB6aXAtc3VwcG9ydCBpbiBzdGRsaWIuXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM184LFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLm1pbnV0ZXMoMSksXG4gICAgICBtZW1vcnlTaXplOiA1MTIsXG4gICAgfSlcblxuICAgIGNvbnN0IGFjY291bnQgPSBjZGsuU3RhY2sub2YodGhpcykuYWNjb3VudFxuICAgIGNvbnN0IHJlZ2lvbiA9IGNkay5TdGFjay5vZih0aGlzKS5yZWdpb25cblxuICAgIHByZXBhcmVDZGtTb3VyY2VGbi5ncmFudFByaW5jaXBhbC5hZGRUb1ByaW5jaXBhbFBvbGljeShcbiAgICAgIG5ldyBpYW0uUG9saWN5U3RhdGVtZW50KHtcbiAgICAgICAgYWN0aW9uczogW1wic3NtOkdldFBhcmFtZXRlcnNCeVBhdGhcIl0sXG4gICAgICAgIHJlc291cmNlczogW1xuICAgICAgICAgIGBhcm46YXdzOnNzbToke3JlZ2lvbn06JHthY2NvdW50fTpwYXJhbWV0ZXIvbGlmbGlnLWNkay8qL3BpcGVsaW5lLXZhcmlhYmxlcy8qYCxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIGNka0J1Y2tldC5ncmFudFJlYWRXcml0ZShwcmVwYXJlQ2RrU291cmNlRm4pXG5cbiAgICBjb25zdCBjZGtTb3VyY2VBcnRpZmFjdCA9IG5ldyBjb2RlcGlwZWxpbmUuQXJ0aWZhY3QoKVxuXG4gICAgY29uc3QgdXNlclBhcmFtZXRlcnM6IFByZXBhcmVDZGtTb3VyY2VVc2VyUGFyYW1ldGVycyA9IHtcbiAgICAgIGJ1Y2tldE5hbWU6IGNka0J1Y2tldC5idWNrZXROYW1lLFxuICAgICAgcHJlZml4OiBgcGlwZWxpbmVzLyR7cGlwZWxpbmVOYW1lfS9gLFxuICAgICAgcGFyYW1ldGVyc05hbWVzcGFjZTogcGFyYW1ldGVyc05hbWVzcGFjZSxcbiAgICB9XG5cbiAgICBjb25zdCBzeW50aCA9IG5ldyBwaXBlbGluZXMuU2hlbGxTdGVwKFwiR2VuZXJhdGVDbG91ZEFzc2VtYmx5XCIsIHtcbiAgICAgIGlucHV0OiBwaXBlbGluZXMuQ29kZVBpcGVsaW5lRmlsZVNldC5mcm9tQXJ0aWZhY3QoY2RrU291cmNlQXJ0aWZhY3QpLFxuICAgICAgaW5zdGFsbENvbW1hbmRzOiBbXCJucG0gY2lcIl0sXG4gICAgICBjb21tYW5kczogW1wibnB4IGNkayBzeW50aFwiXSxcbiAgICB9KVxuICAgIGNvbnN0IHN0YWdlcyA9IFtcbiAgICAgIHtcbiAgICAgICAgc3RhZ2VOYW1lOiBcIlByZXBhcmVDZGtTb3VyY2VcIixcbiAgICAgICAgYWN0aW9uczogW1xuICAgICAgICAgIG5ldyBjb2RlcGlwZWxpbmVBY3Rpb25zLkxhbWJkYUludm9rZUFjdGlvbih7XG4gICAgICAgICAgICBhY3Rpb25OYW1lOiBcInByZXBhcmUtY2RrLXNvdXJjZVwiLFxuICAgICAgICAgICAgbGFtYmRhOiBwcmVwYXJlQ2RrU291cmNlRm4sXG4gICAgICAgICAgICBvdXRwdXRzOiBbY2RrU291cmNlQXJ0aWZhY3RdLFxuICAgICAgICAgICAgdXNlclBhcmFtZXRlcnMsXG4gICAgICAgICAgfSksXG4gICAgICAgIF0sXG4gICAgICB9LFxuICAgIF1cbiAgICByZXR1cm4geyBzdGFnZXMsIHN5bnRoIH1cbiAgfVxuXG4gIGFkZFNsYWNrTm90aWZpY2F0aW9uKFxuICAgIHByb3BzOiBPbWl0PFxuICAgICAgU2xhY2tOb3RpZmljYXRpb25Qcm9wcyxcbiAgICAgIFwicGlwZWxpbmVcIiB8IFwiYXJ0aWZhY3RzQnVja2V0XCIgfCBcInRyaWdnZXJPYmplY3RLZXlcIlxuICAgID4sXG4gICk6IHZvaWQge1xuICAgIG5ldyBTbGFja05vdGlmaWNhdGlvbih0aGlzLCBcIlNsYWNrXCIsIHtcbiAgICAgIHBpcGVsaW5lOiB0aGlzLmNvZGVQaXBlbGluZSxcbiAgICAgIGFydGlmYWN0c0J1Y2tldDogdGhpcy5hcnRpZmFjdHNCdWNrZXQsXG4gICAgICB0cmlnZ2VyT2JqZWN0S2V5OiB0aGlzLnRyaWdnZXJPYmplY3RLZXksXG4gICAgICAuLi5wcm9wcyxcbiAgICB9KVxuICB9XG59XG5cbmludGVyZmFjZSBQcmVwYXJlQ2RrU291cmNlVXNlclBhcmFtZXRlcnMge1xuICBidWNrZXROYW1lOiBzdHJpbmdcbiAgcHJlZml4OiBzdHJpbmdcbiAgcGFyYW1ldGVyc05hbWVzcGFjZTogc3RyaW5nXG59XG4iXX0=
@@ -1,10 +1,15 @@
1
1
  import * as constructs from "constructs";
2
2
  import * as codepipeline from "aws-cdk-lib/aws-codepipeline";
3
+ import * as s3 from "aws-cdk-lib/aws-s3";
3
4
  export interface SlackNotificationProps {
4
5
  /**
5
6
  * CodePipeline to monitor.
6
7
  */
7
8
  pipeline: codepipeline.IPipeline;
9
+ /**
10
+ * Artifacts bucket used by pipeline
11
+ */
12
+ artifactsBucket: s3.IBucket;
8
13
  /**
9
14
  * Slack webhook URL.
10
15
  */
@@ -14,17 +19,27 @@ export interface SlackNotificationProps {
14
19
  */
15
20
  slackChannel: string;
16
21
  /**
17
- * @default no description
22
+ * An optional friendly name that will be used in the Slack notifications instead of the AWS account ID
18
23
  */
19
- accountGroupName?: string;
24
+ accountFriendlyName?: string;
20
25
  /**
21
- * @default no description
26
+ * Control the amount and types of notifications being sent to Slack.
27
+ * "WARN" is the least verbose, while "DEBUG" is the most verbose.
28
+ *
29
+ * "WARN" - Includes notifications related to the failure of a pipeline execution.
30
+ * "INFO" - Adds notifications for the success of a pipeline execution.
31
+ * "DEBUG" - Adds notifications for the start and superseding of a pipeline execution.
32
+ *
33
+ * @default "WARN"
22
34
  */
23
- accountDescription?: string;
35
+ notificationLevel?: "WARN" | "INFO" | "DEBUG";
24
36
  /**
25
- * @default false
37
+ * The key of the object (e.g., `my-prefix/my-file.json`) that triggers the S3 Source Action associated with the pipeline.
38
+ * By configuring this parameter you can specify which objects the Lambda function that sends messages to Slack can access in the artifacts bucket.
39
+ *
40
+ * @default - the Lambda function can read all objects in the artifacts bucket.
26
41
  */
27
- alwaysShowSucceeded?: boolean;
42
+ triggerObjectKey?: string;
28
43
  /**
29
44
  * Used to control that only one lambda is created in the account.
30
45
  *
@@ -18,19 +18,16 @@ class SlackNotification extends constructs.Construct {
18
18
  const environment = {
19
19
  SLACK_URL: props.slackWebhookUrl,
20
20
  SLACK_CHANNEL: props.slackChannel,
21
- ALWAYS_SHOW_SUCCEEDED: String((_a = props.alwaysShowSucceeded) !== null && _a !== void 0 ? _a : false),
21
+ NOTIFICATION_LEVEL: (_a = props.notificationLevel) !== null && _a !== void 0 ? _a : "WARN",
22
22
  };
23
- if (props.accountGroupName != null) {
24
- environment.ACCOUNT_GROUP_NAME = props.accountGroupName;
25
- }
26
- if (props.accountDescription != null) {
27
- environment.ACCOUNT_DESC = props.accountDescription;
23
+ if (props.accountFriendlyName != null) {
24
+ environment.ACCOUNT_FRIENDLY_NAME = props.accountFriendlyName;
28
25
  }
29
26
  const reportFunction = new lambda.SingletonFunction(this, "Function", {
30
27
  uuid: (_b = props.singletonLambdaUuid) !== null && _b !== void 0 ? _b : "55954fc8-182e-497e-bd60-7af1496dc222",
31
28
  code: lambda.Code.fromAsset(path.join(__dirname, "../../assets/pipeline-slack-notification-lambda")),
32
29
  handler: "index.handler",
33
- runtime: lambda.Runtime.PYTHON_3_8,
30
+ runtime: lambda.Runtime.PYTHON_3_11,
34
31
  timeout: cdk.Duration.seconds(10),
35
32
  environment,
36
33
  description: "Handle CodePipeline pipeline state change and report to Slack",
@@ -42,11 +39,12 @@ class SlackNotification extends constructs.Construct {
42
39
  ],
43
40
  resources: [props.pipeline.pipelineArn],
44
41
  }));
42
+ props.artifactsBucket.grantRead(reportFunction, props.triggerObjectKey);
45
43
  props.pipeline.onStateChange("Event" + ((_c = props.singletonLambdaUuid) !== null && _c !== void 0 ? _c : ""), {
46
44
  eventPattern: {
47
45
  detail: {
48
46
  // Available states: https://docs.aws.amazon.com/codepipeline/latest/userguide/detect-state-changes-cloudwatch-events.html
49
- state: ["SUCCEEDED", "FAILED"],
47
+ state: ["SUCCEEDED", "FAILED", "STARTED", "SUPERSEDED"],
50
48
  },
51
49
  },
52
50
  target: new eventsTargets.LambdaFunction(reportFunction),
@@ -54,4 +52,4 @@ class SlackNotification extends constructs.Construct {
54
52
  }
55
53
  }
56
54
  exports.SlackNotification = SlackNotification;
57
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nkay1waXBlbGluZXMvc2xhY2stbm90aWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUV4QyxnRUFBK0Q7QUFDL0QsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxtQ0FBa0M7QUFDbEMsNkJBQTRCO0FBd0M1Qjs7O0dBR0c7QUFDSCxNQUFhLGlCQUFrQixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQ3pELFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQTZCOztRQUU3QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sV0FBVyxHQUEyQjtZQUMxQyxTQUFTLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2pDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxNQUFBLEtBQUssQ0FBQyxtQkFBbUIsbUNBQUksS0FBSyxDQUFDO1NBQ2xFLENBQUE7UUFFRCxJQUFJLEtBQUssQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJLEVBQUU7WUFDbEMsV0FBVyxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQTtTQUN4RDtRQUVELElBQUksS0FBSyxDQUFDLGtCQUFrQixJQUFJLElBQUksRUFBRTtZQUNwQyxXQUFXLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQTtTQUNwRDtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDcEUsSUFBSSxFQUFFLE1BQUEsS0FBSyxDQUFDLG1CQUFtQixtQ0FBSSxzQ0FBc0M7WUFDekUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxpREFBaUQsQ0FBQyxDQUN4RTtZQUNELE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVU7WUFDbEMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxXQUFXO1lBQ1gsV0FBVyxFQUNULCtEQUErRDtTQUNsRSxDQUFDLENBQUE7UUFFRixjQUFjLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUNoRCxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEIsT0FBTyxFQUFFO2dCQUNQLG1DQUFtQztnQkFDbkMscUNBQXFDO2FBQ3RDO1lBQ0QsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7U0FDeEMsQ0FBQyxDQUNILENBQUE7UUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxNQUFBLEtBQUssQ0FBQyxtQkFBbUIsbUNBQUksRUFBRSxDQUFDLEVBQUU7WUFDeEUsWUFBWSxFQUFFO2dCQUNaLE1BQU0sRUFBRTtvQkFDTiwwSEFBMEg7b0JBQzFILEtBQUssRUFBRSxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUM7aUJBQy9CO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQztTQUN6RCxDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0Y7QUF2REQsOENBdURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgKiBhcyBjb2RlcGlwZWxpbmUgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmVcIlxuaW1wb3J0ICogYXMgZXZlbnRzVGFyZ2V0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcblxuZXhwb3J0IGludGVyZmFjZSBTbGFja05vdGlmaWNhdGlvblByb3BzIHtcbiAgLyoqXG4gICAqIENvZGVQaXBlbGluZSB0byBtb25pdG9yLlxuICAgKi9cbiAgcGlwZWxpbmU6IGNvZGVwaXBlbGluZS5JUGlwZWxpbmVcbiAgLyoqXG4gICAqIFNsYWNrIHdlYmhvb2sgVVJMLlxuICAgKi9cbiAgc2xhY2tXZWJob29rVXJsOiBzdHJpbmdcbiAgLyoqXG4gICAqIENoYW5uZWwgbmFtZSBpbmNsdWRpbmcgbGVhZGluZyAjLlxuICAgKi9cbiAgc2xhY2tDaGFubmVsOiBzdHJpbmdcbiAgLyoqXG4gICAqIEBkZWZhdWx0IG5vIGRlc2NyaXB0aW9uXG4gICAqL1xuICBhY2NvdW50R3JvdXBOYW1lPzogc3RyaW5nXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBubyBkZXNjcmlwdGlvblxuICAgKi9cbiAgYWNjb3VudERlc2NyaXB0aW9uPzogc3RyaW5nXG4gIC8qKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgYWx3YXlzU2hvd1N1Y2NlZWRlZD86IGJvb2xlYW5cblxuICAvKipcbiAgICogVXNlZCB0byBjb250cm9sIHRoYXQgb25seSBvbmUgbGFtYmRhIGlzIGNyZWF0ZWQgaW4gdGhlIGFjY291bnQuXG4gICAqXG4gICAqIFNwZWNpZnkgYSB2YWx1ZSBoZXJlIHdoZW4geW91IG1hbnVhbGx5IGNyZWF0ZSBhIHtAbGluayBTbGFja05vdGlmaWNhdGlvbn0gZm9yIGEgcGlwZWxpbmVcbiAgICogd2l0aG91dCB1c2luZyB7QGxpbmsgTGlmbGlnQ2RrUGlwZWxpbmUuYWRkU2xhY2tOb3RpZmljYXRpb259LlxuICAgKiBGb3IgZXhhbXBsZTogYFwiNjVmN2E5ZTAtZDBhNC00YmE3LWFkMWYtNmRlYzg1M2JiZGI4XCJgLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcIjU1OTU0ZmM4LTE4MmUtNDk3ZS1iZDYwLTdhZjE0OTZkYzIyMlwiXG4gICAqL1xuICBzaW5nbGV0b25MYW1iZGFVdWlkPzogc3RyaW5nXG59XG5cbi8qKlxuICogTW9uaXRvciBhIENvZGVQaXBlbGluZSBhbmQgc2VuZCBtZXNzYWdlIHRvIFNsYWNrIG9uIGZhaWx1cmVcbiAqIGFuZCBzb21lIHN1Y2NlZWRlZCBldmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBTbGFja05vdGlmaWNhdGlvbiBleHRlbmRzIGNvbnN0cnVjdHMuQ29uc3RydWN0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgc2NvcGU6IGNvbnN0cnVjdHMuQ29uc3RydWN0LFxuICAgIGlkOiBzdHJpbmcsXG4gICAgcHJvcHM6IFNsYWNrTm90aWZpY2F0aW9uUHJvcHMsXG4gICkge1xuICAgIHN1cGVyKHNjb3BlLCBpZClcblxuICAgIGNvbnN0IGVudmlyb25tZW50OiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuICAgICAgU0xBQ0tfVVJMOiBwcm9wcy5zbGFja1dlYmhvb2tVcmwsXG4gICAgICBTTEFDS19DSEFOTkVMOiBwcm9wcy5zbGFja0NoYW5uZWwsXG4gICAgICBBTFdBWVNfU0hPV19TVUNDRUVERUQ6IFN0cmluZyhwcm9wcy5hbHdheXNTaG93U3VjY2VlZGVkID8/IGZhbHNlKSxcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuYWNjb3VudEdyb3VwTmFtZSAhPSBudWxsKSB7XG4gICAgICBlbnZpcm9ubWVudC5BQ0NPVU5UX0dST1VQX05BTUUgPSBwcm9wcy5hY2NvdW50R3JvdXBOYW1lXG4gICAgfVxuXG4gICAgaWYgKHByb3BzLmFjY291bnREZXNjcmlwdGlvbiAhPSBudWxsKSB7XG4gICAgICBlbnZpcm9ubWVudC5BQ0NPVU5UX0RFU0MgPSBwcm9wcy5hY2NvdW50RGVzY3JpcHRpb25cbiAgICB9XG5cbiAgICBjb25zdCByZXBvcnRGdW5jdGlvbiA9IG5ldyBsYW1iZGEuU2luZ2xldG9uRnVuY3Rpb24odGhpcywgXCJGdW5jdGlvblwiLCB7XG4gICAgICB1dWlkOiBwcm9wcy5zaW5nbGV0b25MYW1iZGFVdWlkID8/IFwiNTU5NTRmYzgtMTgyZS00OTdlLWJkNjAtN2FmMTQ5NmRjMjIyXCIsXG4gICAgICBjb2RlOiBsYW1iZGEuQ29kZS5mcm9tQXNzZXQoXG4gICAgICAgIHBhdGguam9pbihfX2Rpcm5hbWUsIFwiLi4vLi4vYXNzZXRzL3BpcGVsaW5lLXNsYWNrLW5vdGlmaWNhdGlvbi1sYW1iZGFcIiksXG4gICAgICApLFxuICAgICAgaGFuZGxlcjogXCJpbmRleC5oYW5kbGVyXCIsXG4gICAgICBydW50aW1lOiBsYW1iZGEuUnVudGltZS5QWVRIT05fM184LFxuICAgICAgdGltZW91dDogY2RrLkR1cmF0aW9uLnNlY29uZHMoMTApLFxuICAgICAgZW52aXJvbm1lbnQsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgXCJIYW5kbGUgQ29kZVBpcGVsaW5lIHBpcGVsaW5lIHN0YXRlIGNoYW5nZSBhbmQgcmVwb3J0IHRvIFNsYWNrXCIsXG4gICAgfSlcblxuICAgIHJlcG9ydEZ1bmN0aW9uLmdyYW50UHJpbmNpcGFsLmFkZFRvUHJpbmNpcGFsUG9saWN5KFxuICAgICAgbmV3IGlhbS5Qb2xpY3lTdGF0ZW1lbnQoe1xuICAgICAgICBhY3Rpb25zOiBbXG4gICAgICAgICAgXCJjb2RlcGlwZWxpbmU6TGlzdEFjdGlvbkV4ZWN1dGlvbnNcIixcbiAgICAgICAgICBcImNvZGVwaXBlbGluZTpMaXN0UGlwZWxpbmVFeGVjdXRpb25zXCIsXG4gICAgICAgIF0sXG4gICAgICAgIHJlc291cmNlczogW3Byb3BzLnBpcGVsaW5lLnBpcGVsaW5lQXJuXSxcbiAgICAgIH0pLFxuICAgIClcblxuICAgIHByb3BzLnBpcGVsaW5lLm9uU3RhdGVDaGFuZ2UoXCJFdmVudFwiICsgKHByb3BzLnNpbmdsZXRvbkxhbWJkYVV1aWQgPz8gXCJcIiksIHtcbiAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAvLyBBdmFpbGFibGUgc3RhdGVzOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29kZXBpcGVsaW5lL2xhdGVzdC91c2VyZ3VpZGUvZGV0ZWN0LXN0YXRlLWNoYW5nZXMtY2xvdWR3YXRjaC1ldmVudHMuaHRtbFxuICAgICAgICAgIHN0YXRlOiBbXCJTVUNDRUVERURcIiwgXCJGQUlMRURcIl0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgdGFyZ2V0OiBuZXcgZXZlbnRzVGFyZ2V0cy5MYW1iZGFGdW5jdGlvbihyZXBvcnRGdW5jdGlvbiksXG4gICAgfSlcbiAgfVxufVxuIl19
55
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xhY2stbm90aWZpY2F0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Nkay1waXBlbGluZXMvc2xhY2stbm90aWZpY2F0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF3QztBQUV4QyxnRUFBK0Q7QUFDL0QsMkNBQTBDO0FBQzFDLGlEQUFnRDtBQUNoRCxtQ0FBa0M7QUFDbEMsNkJBQTRCO0FBc0Q1Qjs7O0dBR0c7QUFDSCxNQUFhLGlCQUFrQixTQUFRLFVBQVUsQ0FBQyxTQUFTO0lBQ3pELFlBQ0UsS0FBMkIsRUFDM0IsRUFBVSxFQUNWLEtBQTZCOztRQUU3QixLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFBO1FBRWhCLE1BQU0sV0FBVyxHQUEyQjtZQUMxQyxTQUFTLEVBQUUsS0FBSyxDQUFDLGVBQWU7WUFDaEMsYUFBYSxFQUFFLEtBQUssQ0FBQyxZQUFZO1lBQ2pDLGtCQUFrQixFQUFFLE1BQUEsS0FBSyxDQUFDLGlCQUFpQixtQ0FBSSxNQUFNO1NBQ3RELENBQUE7UUFFRCxJQUFJLEtBQUssQ0FBQyxtQkFBbUIsSUFBSSxJQUFJLEVBQUU7WUFDckMsV0FBVyxDQUFDLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQTtTQUM5RDtRQUVELE1BQU0sY0FBYyxHQUFHLElBQUksTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxVQUFVLEVBQUU7WUFDcEUsSUFBSSxFQUFFLE1BQUEsS0FBSyxDQUFDLG1CQUFtQixtQ0FBSSxzQ0FBc0M7WUFDekUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxpREFBaUQsQ0FBQyxDQUN4RTtZQUNELE9BQU8sRUFBRSxlQUFlO1lBQ3hCLE9BQU8sRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLFdBQVc7WUFDbkMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNqQyxXQUFXO1lBQ1gsV0FBVyxFQUNULCtEQUErRDtTQUNsRSxDQUFDLENBQUE7UUFFRixjQUFjLENBQUMsY0FBYyxDQUFDLG9CQUFvQixDQUNoRCxJQUFJLEdBQUcsQ0FBQyxlQUFlLENBQUM7WUFDdEIsT0FBTyxFQUFFO2dCQUNQLG1DQUFtQztnQkFDbkMscUNBQXFDO2FBQ3RDO1lBQ0QsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7U0FDeEMsQ0FBQyxDQUNILENBQUE7UUFFRCxLQUFLLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUE7UUFFdkUsS0FBSyxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsT0FBTyxHQUFHLENBQUMsTUFBQSxLQUFLLENBQUMsbUJBQW1CLG1DQUFJLEVBQUUsQ0FBQyxFQUFFO1lBQ3hFLFlBQVksRUFBRTtnQkFDWixNQUFNLEVBQUU7b0JBQ04sMEhBQTBIO29CQUMxSCxLQUFLLEVBQUUsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUM7aUJBQ3hEO2FBQ0Y7WUFDRCxNQUFNLEVBQUUsSUFBSSxhQUFhLENBQUMsY0FBYyxDQUFDLGNBQWMsQ0FBQztTQUN6RCxDQUFDLENBQUE7SUFDSixDQUFDO0NBQ0Y7QUFyREQsOENBcURDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY29uc3RydWN0cyBmcm9tIFwiY29uc3RydWN0c1wiXG5pbXBvcnQgKiBhcyBjb2RlcGlwZWxpbmUgZnJvbSBcImF3cy1jZGstbGliL2F3cy1jb2RlcGlwZWxpbmVcIlxuaW1wb3J0ICogYXMgZXZlbnRzVGFyZ2V0cyBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWV2ZW50cy10YXJnZXRzXCJcbmltcG9ydCAqIGFzIGlhbSBmcm9tIFwiYXdzLWNkay1saWIvYXdzLWlhbVwiXG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSBcImF3cy1jZGstbGliL2F3cy1sYW1iZGFcIlxuaW1wb3J0ICogYXMgY2RrIGZyb20gXCJhd3MtY2RrLWxpYlwiXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJwYXRoXCJcbmltcG9ydCAqIGFzIHMzIGZyb20gXCJhd3MtY2RrLWxpYi9hd3MtczNcIlxuXG5leHBvcnQgaW50ZXJmYWNlIFNsYWNrTm90aWZpY2F0aW9uUHJvcHMge1xuICAvKipcbiAgICogQ29kZVBpcGVsaW5lIHRvIG1vbml0b3IuXG4gICAqL1xuICBwaXBlbGluZTogY29kZXBpcGVsaW5lLklQaXBlbGluZVxuICAvKipcbiAgICogQXJ0aWZhY3RzIGJ1Y2tldCB1c2VkIGJ5IHBpcGVsaW5lXG4gICAqL1xuICBhcnRpZmFjdHNCdWNrZXQ6IHMzLklCdWNrZXRcbiAgLyoqXG4gICAqIFNsYWNrIHdlYmhvb2sgVVJMLlxuICAgKi9cbiAgc2xhY2tXZWJob29rVXJsOiBzdHJpbmdcbiAgLyoqXG4gICAqIENoYW5uZWwgbmFtZSBpbmNsdWRpbmcgbGVhZGluZyAjLlxuICAgKi9cbiAgc2xhY2tDaGFubmVsOiBzdHJpbmdcbiAgLyoqXG4gICAqIEFuIG9wdGlvbmFsIGZyaWVuZGx5IG5hbWUgdGhhdCB3aWxsIGJlIHVzZWQgaW4gdGhlIFNsYWNrIG5vdGlmaWNhdGlvbnMgaW5zdGVhZCBvZiB0aGUgQVdTIGFjY291bnQgSURcbiAgICovXG4gIGFjY291bnRGcmllbmRseU5hbWU/OiBzdHJpbmdcbiAgLyoqXG4gICAqIENvbnRyb2wgdGhlIGFtb3VudCBhbmQgdHlwZXMgb2Ygbm90aWZpY2F0aW9ucyBiZWluZyBzZW50IHRvIFNsYWNrLlxuICAgKiBcIldBUk5cIiBpcyB0aGUgbGVhc3QgdmVyYm9zZSwgd2hpbGUgXCJERUJVR1wiIGlzIHRoZSBtb3N0IHZlcmJvc2UuXG4gICAqXG4gICAqIFwiV0FSTlwiIC0gSW5jbHVkZXMgbm90aWZpY2F0aW9ucyByZWxhdGVkIHRvIHRoZSBmYWlsdXJlIG9mIGEgcGlwZWxpbmUgZXhlY3V0aW9uLlxuICAgKiBcIklORk9cIiAtIEFkZHMgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHN1Y2Nlc3Mgb2YgYSBwaXBlbGluZSBleGVjdXRpb24uXG4gICAqIFwiREVCVUdcIiAtIEFkZHMgbm90aWZpY2F0aW9ucyBmb3IgdGhlIHN0YXJ0IGFuZCBzdXBlcnNlZGluZyBvZiBhIHBpcGVsaW5lIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJXQVJOXCJcbiAgICovXG4gIG5vdGlmaWNhdGlvbkxldmVsPzogXCJXQVJOXCIgfCBcIklORk9cIiB8IFwiREVCVUdcIlxuICAvKipcbiAgICogVGhlIGtleSBvZiB0aGUgb2JqZWN0IChlLmcuLCBgbXktcHJlZml4L215LWZpbGUuanNvbmApIHRoYXQgdHJpZ2dlcnMgdGhlIFMzIFNvdXJjZSBBY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoZSBwaXBlbGluZS5cbiAgICogQnkgY29uZmlndXJpbmcgdGhpcyBwYXJhbWV0ZXIgeW91IGNhbiBzcGVjaWZ5IHdoaWNoIG9iamVjdHMgdGhlIExhbWJkYSBmdW5jdGlvbiB0aGF0IHNlbmRzIG1lc3NhZ2VzIHRvIFNsYWNrIGNhbiBhY2Nlc3MgaW4gdGhlIGFydGlmYWN0cyBidWNrZXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIExhbWJkYSBmdW5jdGlvbiBjYW4gcmVhZCBhbGwgb2JqZWN0cyBpbiB0aGUgYXJ0aWZhY3RzIGJ1Y2tldC5cbiAgICovXG4gIHRyaWdnZXJPYmplY3RLZXk/OiBzdHJpbmdcbiAgLyoqXG4gICAqIFVzZWQgdG8gY29udHJvbCB0aGF0IG9ubHkgb25lIGxhbWJkYSBpcyBjcmVhdGVkIGluIHRoZSBhY2NvdW50LlxuICAgKlxuICAgKiBTcGVjaWZ5IGEgdmFsdWUgaGVyZSB3aGVuIHlvdSBtYW51YWxseSBjcmVhdGUgYSB7QGxpbmsgU2xhY2tOb3RpZmljYXRpb259IGZvciBhIHBpcGVsaW5lXG4gICAqIHdpdGhvdXQgdXNpbmcge0BsaW5rIExpZmxpZ0Nka1BpcGVsaW5lLmFkZFNsYWNrTm90aWZpY2F0aW9ufS5cbiAgICogRm9yIGV4YW1wbGU6IGBcIjY1ZjdhOWUwLWQwYTQtNGJhNy1hZDFmLTZkZWM4NTNiYmRiOFwiYC5cbiAgICpcbiAgICogQGRlZmF1bHQgXCI1NTk1NGZjOC0xODJlLTQ5N2UtYmQ2MC03YWYxNDk2ZGMyMjJcIlxuICAgKi9cbiAgc2luZ2xldG9uTGFtYmRhVXVpZD86IHN0cmluZ1xufVxuXG4vKipcbiAqIE1vbml0b3IgYSBDb2RlUGlwZWxpbmUgYW5kIHNlbmQgbWVzc2FnZSB0byBTbGFjayBvbiBmYWlsdXJlXG4gKiBhbmQgc29tZSBzdWNjZWVkZWQgZXZlbnRzLlxuICovXG5leHBvcnQgY2xhc3MgU2xhY2tOb3RpZmljYXRpb24gZXh0ZW5kcyBjb25zdHJ1Y3RzLkNvbnN0cnVjdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgICBpZDogc3RyaW5nLFxuICAgIHByb3BzOiBTbGFja05vdGlmaWNhdGlvblByb3BzLFxuICApIHtcbiAgICBzdXBlcihzY29wZSwgaWQpXG5cbiAgICBjb25zdCBlbnZpcm9ubWVudDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgIFNMQUNLX1VSTDogcHJvcHMuc2xhY2tXZWJob29rVXJsLFxuICAgICAgU0xBQ0tfQ0hBTk5FTDogcHJvcHMuc2xhY2tDaGFubmVsLFxuICAgICAgTk9USUZJQ0FUSU9OX0xFVkVMOiBwcm9wcy5ub3RpZmljYXRpb25MZXZlbCA/PyBcIldBUk5cIixcbiAgICB9XG5cbiAgICBpZiAocHJvcHMuYWNjb3VudEZyaWVuZGx5TmFtZSAhPSBudWxsKSB7XG4gICAgICBlbnZpcm9ubWVudC5BQ0NPVU5UX0ZSSUVORExZX05BTUUgPSBwcm9wcy5hY2NvdW50RnJpZW5kbHlOYW1lXG4gICAgfVxuXG4gICAgY29uc3QgcmVwb3J0RnVuY3Rpb24gPSBuZXcgbGFtYmRhLlNpbmdsZXRvbkZ1bmN0aW9uKHRoaXMsIFwiRnVuY3Rpb25cIiwge1xuICAgICAgdXVpZDogcHJvcHMuc2luZ2xldG9uTGFtYmRhVXVpZCA/PyBcIjU1OTU0ZmM4LTE4MmUtNDk3ZS1iZDYwLTdhZjE0OTZkYzIyMlwiLFxuICAgICAgY29kZTogbGFtYmRhLkNvZGUuZnJvbUFzc2V0KFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uLy4uL2Fzc2V0cy9waXBlbGluZS1zbGFjay1ub3RpZmljYXRpb24tbGFtYmRhXCIpLFxuICAgICAgKSxcbiAgICAgIGhhbmRsZXI6IFwiaW5kZXguaGFuZGxlclwiLFxuICAgICAgcnVudGltZTogbGFtYmRhLlJ1bnRpbWUuUFlUSE9OXzNfMTEsXG4gICAgICB0aW1lb3V0OiBjZGsuRHVyYXRpb24uc2Vjb25kcygxMCksXG4gICAgICBlbnZpcm9ubWVudCxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICBcIkhhbmRsZSBDb2RlUGlwZWxpbmUgcGlwZWxpbmUgc3RhdGUgY2hhbmdlIGFuZCByZXBvcnQgdG8gU2xhY2tcIixcbiAgICB9KVxuXG4gICAgcmVwb3J0RnVuY3Rpb24uZ3JhbnRQcmluY2lwYWwuYWRkVG9QcmluY2lwYWxQb2xpY3koXG4gICAgICBuZXcgaWFtLlBvbGljeVN0YXRlbWVudCh7XG4gICAgICAgIGFjdGlvbnM6IFtcbiAgICAgICAgICBcImNvZGVwaXBlbGluZTpMaXN0QWN0aW9uRXhlY3V0aW9uc1wiLFxuICAgICAgICAgIFwiY29kZXBpcGVsaW5lOkxpc3RQaXBlbGluZUV4ZWN1dGlvbnNcIixcbiAgICAgICAgXSxcbiAgICAgICAgcmVzb3VyY2VzOiBbcHJvcHMucGlwZWxpbmUucGlwZWxpbmVBcm5dLFxuICAgICAgfSksXG4gICAgKVxuXG4gICAgcHJvcHMuYXJ0aWZhY3RzQnVja2V0LmdyYW50UmVhZChyZXBvcnRGdW5jdGlvbiwgcHJvcHMudHJpZ2dlck9iamVjdEtleSlcblxuICAgIHByb3BzLnBpcGVsaW5lLm9uU3RhdGVDaGFuZ2UoXCJFdmVudFwiICsgKHByb3BzLnNpbmdsZXRvbkxhbWJkYVV1aWQgPz8gXCJcIiksIHtcbiAgICAgIGV2ZW50UGF0dGVybjoge1xuICAgICAgICBkZXRhaWw6IHtcbiAgICAgICAgICAvLyBBdmFpbGFibGUgc3RhdGVzOiBodHRwczovL2RvY3MuYXdzLmFtYXpvbi5jb20vY29kZXBpcGVsaW5lL2xhdGVzdC91c2VyZ3VpZGUvZGV0ZWN0LXN0YXRlLWNoYW5nZXMtY2xvdWR3YXRjaC1ldmVudHMuaHRtbFxuICAgICAgICAgIHN0YXRlOiBbXCJTVUNDRUVERURcIiwgXCJGQUlMRURcIiwgXCJTVEFSVEVEXCIsIFwiU1VQRVJTRURFRFwiXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICB0YXJnZXQ6IG5ldyBldmVudHNUYXJnZXRzLkxhbWJkYUZ1bmN0aW9uKHJlcG9ydEZ1bmN0aW9uKSxcbiAgICB9KVxuICB9XG59XG4iXX0=
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@liflig/cdk",
3
- "version": "2.14.4",
3
+ "version": "2.15.0",
4
4
  "description": "CDK library for Liflig",
5
5
  "repository": {
6
6
  "type": "git",
@@ -37,29 +37,29 @@
37
37
  "@aws-cdk/assert": "2.68.0",
38
38
  "@commitlint/cli": "17.7.1",
39
39
  "@commitlint/config-conventional": "17.7.0",
40
- "@types/aws-lambda": "8.10.119",
41
- "@types/jest": "29.5.4",
42
- "@types/node": "18.17.11",
40
+ "@types/aws-lambda": "8.10.121",
41
+ "@types/jest": "29.5.5",
42
+ "@types/node": "18.17.18",
43
43
  "@typescript-eslint/eslint-plugin": "5.62.0",
44
44
  "@typescript-eslint/parser": "5.62.0",
45
- "aws-cdk": "2.86.0",
46
- "aws-cdk-lib": "2.86.0",
47
- "constructs": "10.2.69",
48
- "eslint": "8.48.0",
49
- "eslint-config-prettier": "8.10.0",
50
- "eslint-plugin-prettier": "4.2.1",
45
+ "aws-cdk": "2.94.0",
46
+ "aws-cdk-lib": "2.94.0",
47
+ "constructs": "10.2.70",
48
+ "eslint": "8.49.0",
49
+ "eslint-config-prettier": "9.0.0",
50
+ "eslint-plugin-prettier": "5.0.0",
51
51
  "husky": "8.0.3",
52
- "jest": "29.6.4",
52
+ "jest": "29.7.0",
53
53
  "jest-cdk-snapshot": "2.0.1",
54
- "prettier": "2.8.8",
55
- "semantic-release": "21.1.1",
54
+ "prettier": "3.0.3",
55
+ "semantic-release": "21.1.2",
56
56
  "ts-jest": "29.1.1",
57
57
  "ts-node": "10.9.1",
58
58
  "typescript": "5.2.2"
59
59
  },
60
60
  "dependencies": {
61
61
  "@capraconsulting/webapp-deploy-lambda": "2.1.2",
62
- "aws-sdk": "2.1430.0",
62
+ "aws-sdk": "2.1446.0",
63
63
  "cpy": "8.1.2",
64
64
  "del": "6.1.1",
65
65
  "execa": "5.1.1",