@odigos/aws-cdk 0.0.16 → 0.0.18

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.
@@ -27,9 +27,13 @@ export interface OdigosInstrumentationOptions {
27
27
  */
28
28
  readonly mode?: OdigosInstrumentationMode;
29
29
  /**
30
- * Which of the Java layer's four wrapper scripts to use. Ignored for other languages.
31
- *
32
- * @default OdigosJavaHandlerDistro.OTEL_HANDLER
30
+ * Connector GraphQL distro name, such as java-lambda-otel-agent or java-lambda-otel-wrapper.
31
+ * @default - the bundled default distribution for the function's runtime
32
+ */
33
+ readonly distro?: string;
34
+ /**
35
+ * Legacy lightweight Java handler adapter.
36
+ * @deprecated Use the corresponding java-lambda-otel-*-wrapper distro.
33
37
  */
34
38
  readonly javaHandlerDistro?: OdigosJavaHandlerDistro;
35
39
  /**
@@ -66,6 +70,12 @@ export interface OdigosInstrumentationOptions {
66
70
  * @default - resolved from layerSource
67
71
  */
68
72
  readonly layerVersion?: lambda.ILayerVersion;
73
+ /**
74
+ * Architecture-matched collector layer when supplying a custom ADOT SDK layer.
75
+ * Upstream SDK layers already include their collector and do not use this option.
76
+ * @default - resolved from layerSource for ADOT
77
+ */
78
+ readonly collectorLayerVersion?: lambda.ILayerVersion;
69
79
  /**
70
80
  * The value the function already needs in its language loader variable (`NODE_OPTIONS`,
71
81
  * `JAVA_TOOL_OPTIONS` or `PYTHONPATH`), which the Odigos loader is joined to rather than replacing.
@@ -111,8 +121,8 @@ export interface OdigosLambdaInstrumentationProps extends OdigosInstrumentationO
111
121
  * ```
112
122
  *
113
123
  * What it does to each function: attaches the layer for the function's language and architecture, sets
114
- * `AWS_LAMBDA_EXEC_WRAPPER` so the layer loads the SDK, sets `OTEL_SERVICE_NAME`, and hands the in-Lambda
115
- * collector its entire configuration inline through `OPENTELEMETRY_COLLECTOR_CONFIG_URI`.
124
+ * `AWS_LAMBDA_EXEC_WRAPPER` and compact `ODIGOS_LAMBDA_CONFIG`. The layer builds the SDK environment and
125
+ * collector pipelines at startup; ownership and exact layer attribution are recorded in resource tags.
116
126
  *
117
127
  * The function's SDK exports to the collector on localhost, not to your destination. The collector
118
128
  * forwards after the handler has already returned, so a slow destination costs billed duration rather
@@ -125,14 +135,13 @@ export interface OdigosLambdaInstrumentationProps extends OdigosInstrumentationO
125
135
  * ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the
126
136
  * connector's, and every round trip publishes a new function version.
127
137
  *
128
- * Choose one per function. This construct writes `ODIGOS_IAC` and never the connector's `ODIGOS_MANAGED`
129
- * ownership marker, so an IaC-instrumented function reports as instrumented but is not one the connector
138
+ * Choose one per function. This construct writes `odigos:iac` resource tags and never the connector's `odigos:managed`
139
+ * ownership tag, so an IaC-instrumented function reports as instrumented but is not one the connector
130
140
  * will roll back — though it will happily take it over if you enable it as a source.
131
141
  */
132
142
  export declare class OdigosLambdaInstrumentation extends Construct {
133
143
  private readonly options;
134
144
  private readonly resolver;
135
- private readonly collectorConfig;
136
145
  private readonly instrumented;
137
146
  constructor(scope: Construct, id: string, props: OdigosLambdaInstrumentationProps);
138
147
  /**
@@ -147,8 +156,7 @@ export declare class OdigosLambdaInstrumentation extends Construct {
147
156
  *
148
157
  * Mirrors `applyHandlerEnv` / `applyWebServerEnv` in the connector, including what is deliberately NOT
149
158
  * set: `OTEL_EXPORTER_OTLP_ENDPOINT` stays unset so the SDK keeps exporting to the in-Lambda collector
150
- * on localhost rather than blocking the invocation on the remote destination, and an enabled signal's
151
- * `OTEL_*_EXPORTER` stays unset because `otlp` is already the SDK default.
159
+ * on localhost rather than blocking the invocation on the remote destination, and every signal exporter is selected explicitly.
152
160
  */
153
161
  private environmentFor;
154
162
  }
@@ -5,41 +5,17 @@ exports.OdigosInstrumentationAspect = exports.OdigosLambdaInstrumentation = void
5
5
  const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
6
6
  const aws_cdk_lib_1 = require("aws-cdk-lib");
7
7
  const lambda = require("aws-cdk-lib/aws-lambda");
8
+ const iam = require("aws-cdk-lib/aws-iam");
8
9
  const constructs_1 = require("constructs");
9
10
  const collector_config_1 = require("./collector-config");
10
- const layers_1 = require("./generated/layers");
11
11
  const layer_resolver_1 = require("./layer-resolver");
12
12
  const runtime_1 = require("./runtime");
13
13
  const types_1 = require("./types");
14
14
  /** `AWS_LAMBDA_EXEC_WRAPPER` — the layer's entry point in handler mode. */
15
15
  const ENV_EXEC_WRAPPER = 'AWS_LAMBDA_EXEC_WRAPPER';
16
16
  /** Service name reported on every span, metric and log record. */
17
- const ENV_SERVICE_NAME = 'OTEL_SERVICE_NAME';
18
- /** Raises in-function OpenTelemetry verbosity into the function's CloudWatch log group. */
19
- const ENV_OTEL_LOG_LEVEL = 'OTEL_LOG_LEVEL';
20
- /**
21
- * Schema version of the marker payload. Must match `api.IaCMarkerVersion` in the connector — it is what tells
22
- * the connector how to read the rest of the object, so a bumped version there is a change here.
23
- */
24
- const MARKER_VERSION = 1;
25
- /**
26
- * `ODIGOS_IAC` — the marker recording that this function was instrumented by Odigos IaC tooling, by which
27
- * package version, and carrying which layer. This construct always writes it, and it is what makes Odigos
28
- * report the function as instrumented rather than `Absent` — "awaiting your deployment".
29
- *
30
- * It is NOT `ODIGOS_MANAGED`, and the difference is the whole reason there are two variables. That one is the
31
- * connector's record of a mutation IT performed, whose payload is the snapshot it restores from on rollback;
32
- * a CDK stack has no such snapshot to offer, because nothing was mutated — the environment below IS the
33
- * function's definition. So the connector accepts either marker for "is this instrumented by Odigos", and
34
- * only its own for "may I roll this back". This construct writes the first and never the second: the package
35
- * will not claim ownership of a function on your behalf.
36
- *
37
- * The `layer` field is the load-bearing one. The connector reads it back to decide which layer version the
38
- * function is SUPPOSED to carry, so a version you pinned is respected instead of being reported as drift the
39
- * day Odigos publishes a newer one. It works in `IN_ACCOUNT` mode too, where the ARN is a deploy-time
40
- * reference your own code has no way to obtain.
41
- */
42
- const ENV_IAC_MARKER = 'ODIGOS_IAC';
17
+ /** Compact SDK and destination settings; all attribution markers are Lambda resource tags. */
18
+ const ENV_LAMBDA_CONFIG = 'ODIGOS_LAMBDA_CONFIG';
43
19
  /**
44
20
  * The service a function reports as, when the caller has not named one.
45
21
  *
@@ -78,8 +54,8 @@ function defaultServiceName(fn) {
78
54
  * ```
79
55
  *
80
56
  * What it does to each function: attaches the layer for the function's language and architecture, sets
81
- * `AWS_LAMBDA_EXEC_WRAPPER` so the layer loads the SDK, sets `OTEL_SERVICE_NAME`, and hands the in-Lambda
82
- * collector its entire configuration inline through `OPENTELEMETRY_COLLECTOR_CONFIG_URI`.
57
+ * `AWS_LAMBDA_EXEC_WRAPPER` and compact `ODIGOS_LAMBDA_CONFIG`. The layer builds the SDK environment and
58
+ * collector pipelines at startup; ownership and exact layer attribution are recorded in resource tags.
83
59
  *
84
60
  * The function's SDK exports to the collector on localhost, not to your destination. The collector
85
61
  * forwards after the handler has already returned, so a slow destination costs billed duration rather
@@ -92,8 +68,8 @@ function defaultServiceName(fn) {
92
68
  * ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the
93
69
  * connector's, and every round trip publishes a new function version.
94
70
  *
95
- * Choose one per function. This construct writes `ODIGOS_IAC` and never the connector's `ODIGOS_MANAGED`
96
- * ownership marker, so an IaC-instrumented function reports as instrumented but is not one the connector
71
+ * Choose one per function. This construct writes `odigos:iac` resource tags and never the connector's `odigos:managed`
72
+ * ownership tag, so an IaC-instrumented function reports as instrumented but is not one the connector
97
73
  * will roll back — though it will happily take it over if you enable it as a source.
98
74
  */
99
75
  class OdigosLambdaInstrumentation extends constructs_1.Construct {
@@ -104,7 +80,7 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
104
80
  this.resolver = new layer_resolver_1.OdigosLayerResolver(this, props.layerSource ?? types_1.OdigosLayerSource.ODIGOS_PUBLIC);
105
81
  // Rendered once. It depends only on the destination, and rendering it per function would make an
106
82
  // accidental difference between two functions possible.
107
- this.collectorConfig = (0, collector_config_1.renderCollectorConfig)(props.destination);
83
+ (0, collector_config_1.renderCollectorConfig)(props.destination);
108
84
  // A warning rather than an error, because a collector CAN be reached over gRPC on a non-standard port —
109
85
  // but the overwhelmingly likelier reading of `endpoint: "host:4318"` is an OTLP/HTTP endpoint passed to
110
86
  // the gRPC exporter, which builds, starts, and then never delivers a batch. Silent for the caller who
@@ -143,13 +119,26 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
143
119
  }
144
120
  throw new Error(`${message} Set skipUnsupportedRuntimes: true to skip it instead.`);
145
121
  }
122
+ const recipe = (0, runtime_1.distributionRecipe)(language, this.options.distro, runtimeName);
123
+ (0, runtime_1.distributionWrapper)(language, this.options.distro, this.options.javaHandlerDistro, this.options.mode === types_1.OdigosInstrumentationMode.WEB_SERVER);
124
+ if (recipe.applicationSignals && !(0, collector_config_1.resolvedSignals)(this.options.destination).traces) {
125
+ throw new Error('ADOT + Application Signals requires traces to be enabled for the destination.');
126
+ }
127
+ if (recipe.applicationSignals) {
128
+ fn.role?.addManagedPolicy(iam.ManagedPolicy.fromAwsManagedPolicyName('CloudWatchLambdaApplicationSignalsExecutionRolePolicy'));
129
+ aws_cdk_lib_1.Annotations.of(fn).addWarningV2('@odigos/aws-cdk:applicationSignals', 'Enable CloudWatch Application Signals service discovery once in this AWS account and region. Application Signals also sends AWS service telemetry through the Lambda embedded agent.');
130
+ }
131
+ const resource = fn.node.defaultChild;
132
+ resource.addPropertyDeletionOverride('Environment.Variables.ODIGOS_MANAGED');
133
+ resource.addPropertyDeletionOverride('Environment.Variables.ODIGOS_IAC');
146
134
  this.instrumented.add(key);
147
135
  const architecture = fn.architecture.name;
148
- const layer = this.options.layerVersion ?? this.resolver.resolve(language, architecture);
149
- fn.addLayers(layer);
136
+ const layer = this.options.layerVersion ?? this.resolver.resolve(recipe.artifact ?? language, architecture);
137
+ const collectorLayer = recipe.artifact ? (this.options.collectorLayerVersion ?? this.resolver.resolve('adot-collector', architecture)) : undefined;
138
+ fn.addLayers(...(collectorLayer ? [layer, collectorLayer] : [layer]));
150
139
  // The ARN, not the construct: the marker has to name the exact layer version the function carries, and
151
140
  // in IN_ACCOUNT mode that is a nested-stack output reference resolved at deploy time.
152
- for (const [name, value] of Object.entries(this.environmentFor(fn, language, layer.layerVersionArn))) {
141
+ for (const [name, value] of Object.entries(this.environmentFor(fn, language, layer.layerVersionArn, collectorLayer?.layerVersionArn))) {
153
142
  fn.addEnvironment(name, value);
154
143
  }
155
144
  }
@@ -164,52 +153,58 @@ class OdigosLambdaInstrumentation extends constructs_1.Construct {
164
153
  *
165
154
  * Mirrors `applyHandlerEnv` / `applyWebServerEnv` in the connector, including what is deliberately NOT
166
155
  * set: `OTEL_EXPORTER_OTLP_ENDPOINT` stays unset so the SDK keeps exporting to the in-Lambda collector
167
- * on localhost rather than blocking the invocation on the remote destination, and an enabled signal's
168
- * `OTEL_*_EXPORTER` stays unset because `otlp` is already the SDK default.
156
+ * on localhost rather than blocking the invocation on the remote destination, and every signal exporter is selected explicitly.
169
157
  */
170
- environmentFor(fn, language, layerArn) {
171
- const { destination, mode, debug, serviceName, javaHandlerDistro, existingLoaderValue } = this.options;
158
+ environmentFor(fn, language, layerArn, collectorLayerArn) {
159
+ const { destination, mode, debug, serviceName, javaHandlerDistro, distro, existingLoaderValue } = this.options;
172
160
  const webServer = mode === types_1.OdigosInstrumentationMode.WEB_SERVER;
161
+ const recipe = (0, runtime_1.distributionRecipe)(language, distro, fn.runtime.name);
162
+ const signals = (0, collector_config_1.resolvedSignals)(destination);
163
+ const resource = fn.node.defaultChild;
164
+ const current = aws_cdk_lib_1.Stack.of(fn).resolve(resource.environment);
165
+ const originalWrapper = current?.variables?.AWS_LAMBDA_EXEC_WRAPPER ?? '';
166
+ const execWrapper = webServer ? '/opt/odigos-webserver' : (0, runtime_1.distributionWrapper)(language, distro, javaHandlerDistro, false);
167
+ const functionLogs = signals.logs && !webServer && (language === 'ruby' || (language === 'java' &&
168
+ ['/opt/otel-handler', '/opt/otel-proxy-handler', '/opt/otel-sqs-handler', '/opt/otel-stream-handler'].includes(execWrapper)));
169
+ const config = {
170
+ v: 1,
171
+ s: serviceName ?? defaultServiceName(fn),
172
+ t: (signals.traces ? 1 : 0) | (signals.metrics ? 2 : 0) | (signals.logs ? 4 : 0),
173
+ e: destination.endpoint ?? destination.httpEndpoint,
174
+ ...(destination.httpEndpoint ? { p: true } : {}),
175
+ ...(destination.endpoint && destination.insecure ? { i: true } : {}),
176
+ ...(destination.headers && Object.keys(destination.headers).length ? { h: destination.headers } : {}),
177
+ ...(recipe.applicationSignals ? { a: true } : {}),
178
+ ...(functionLogs ? { l: true } : {}),
179
+ ...(debug && !webServer ? { d: true } : {}),
180
+ ...(webServer ? { w: originalWrapper } : {}),
181
+ };
173
182
  const env = {
174
- [ENV_SERVICE_NAME]: serviceName ?? defaultServiceName(fn),
175
- [collector_config_1.ENV_COLLECTOR_CONFIG_URI]: this.collectorConfig,
176
- [ENV_IAC_MARKER]: JSON.stringify({
177
- v: MARKER_VERSION,
178
- source: 'cdk',
179
- version: layers_1.ODIGOS_VERSION || 'unreleased',
180
- layer: layerArn,
181
- }),
183
+ [ENV_EXEC_WRAPPER]: execWrapper,
184
+ [ENV_LAMBDA_CONFIG]: JSON.stringify(config),
182
185
  };
183
- if (webServer) {
184
- // No exec wrapper: the Lambda Web Adapter owns it, and overwriting it stops the function serving.
185
- Object.assign(env, (0, runtime_1.webServerEnv)(language, existingLoaderValue));
186
+ aws_cdk_lib_1.Tags.of(fn).add('odigos:iac', 'v1');
187
+ aws_cdk_lib_1.Tags.of(fn).add('odigos:sdk-layer', layerArn);
188
+ if (collectorLayerArn)
189
+ aws_cdk_lib_1.Tags.of(fn).add('odigos:collector-layer', collectorLayerArn);
190
+ // Explicit customer loader options remain ordinary customer environment values.
191
+ if (webServer && existingLoaderValue !== undefined) {
192
+ const loaderKey = { java: 'JAVA_TOOL_OPTIONS', nodejs: 'NODE_OPTIONS', python: 'PYTHONPATH' }[language];
193
+ if (loaderKey)
194
+ env[loaderKey] = existingLoaderValue;
186
195
  }
187
- else {
188
- env[ENV_EXEC_WRAPPER] = (0, runtime_1.execWrapperFor)(language, javaHandlerDistro);
189
- if (debug) {
190
- env[ENV_OTEL_LOG_LEVEL] = 'debug';
191
- }
196
+ if (language === 'ruby' && signals.metrics) {
197
+ aws_cdk_lib_1.Annotations.of(fn).addWarningV2('@odigos/aws-cdk:rubySignalsUnsupported', 'The bundled Ruby Lambda SDK cannot generate OTLP metrics. Function stdout/stderr logs are collected by the Lambda collector when logs are selected.');
192
198
  }
193
- // Suppress the signals the destination does not accept. A signal with no collector pipeline is refused
194
- // at the receiver on every batch, so telling the SDK not to produce it is the half that stops the
195
- // error loop; the pipeline being absent is the half that stops the export.
196
- const enabled = (0, collector_config_1.resolvedSignals)(destination);
197
- const overrides = [
198
- [collector_config_1.ENV_TRACES_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.traces)],
199
- [collector_config_1.ENV_METRICS_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.metrics)],
200
- [collector_config_1.ENV_LOGS_EXPORTER, (0, collector_config_1.exporterOverrideFor)(enabled.logs)],
201
- ];
202
- for (const [name, value] of overrides) {
203
- if (value !== undefined) {
204
- env[name] = value;
205
- }
199
+ if (destination.profiles) {
200
+ aws_cdk_lib_1.Annotations.of(fn).addWarningV2('@odigos/aws-cdk:profilesUnsupported', 'The bundled Lambda language agents do not generate OTLP profiles. Other selected signals remain enabled.');
206
201
  }
207
202
  return env;
208
203
  }
209
204
  }
210
205
  exports.OdigosLambdaInstrumentation = OdigosLambdaInstrumentation;
211
206
  _a = JSII_RTTI_SYMBOL_1;
212
- OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.16" };
207
+ OdigosLambdaInstrumentation[_a] = { fqn: "@odigos/aws-cdk.OdigosLambdaInstrumentation", version: "0.0.18" };
213
208
  /**
214
209
  * Applies Odigos instrumentation to every `lambda.Function` in a scope.
215
210
  *
@@ -247,5 +242,5 @@ class OdigosInstrumentationAspect {
247
242
  }
248
243
  exports.OdigosInstrumentationAspect = OdigosInstrumentationAspect;
249
244
  _b = JSII_RTTI_SYMBOL_1;
250
- OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.16" };
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUFpRTtBQUNqRSxpREFBaUQ7QUFDakQsMkNBQW1EO0FBQ25ELHlEQVE0QjtBQUM1QiwrQ0FBb0Q7QUFDcEQscURBQXVEO0FBQ3ZELHVDQUE4RTtBQUM5RSxtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLE1BQU0sZ0JBQWdCLEdBQUcsbUJBQW1CLENBQUM7QUFDN0MsMkZBQTJGO0FBQzNGLE1BQU0sa0JBQWtCLEdBQUcsZ0JBQWdCLENBQUM7QUFFNUM7OztHQUdHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsQ0FBQyxDQUFDO0FBRXpCOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDO0FBRXBDOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsa0JBQWtCLENBQUMsRUFBbUI7SUFDN0MsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUE4QyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBNkdEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQWEsMkJBQTRCLFNBQVEsc0JBQVM7SUFNeEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QztRQUMvRSxLQUFLLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBSEYsaUJBQVksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO1FBS2hELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxvQ0FBbUIsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLFdBQVcsSUFBSSx5QkFBaUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUVwRyxpR0FBaUc7UUFDakcsd0RBQXdEO1FBQ3hELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBQSx3Q0FBcUIsRUFBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFaEUsd0dBQXdHO1FBQ3hHLHdHQUF3RztRQUN4RyxzR0FBc0c7UUFDdEcsMENBQTBDO1FBQzFDLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDbEQseUJBQVcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUMvQixzQ0FBc0MsRUFDdEMsaUNBQWlDLEtBQUssQ0FBQyxXQUFXLENBQUMsUUFBUSx3Q0FBd0M7Z0JBQ2pHLG9HQUFvRztnQkFDcEcsc0dBQXNHLENBQ3pHLENBQUM7UUFDSixDQUFDO1FBQ0QsSUFBSSxLQUFLLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUN0RCx5QkFBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQy9CLHNDQUFzQyxFQUN0QyxxQ0FBcUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLG9DQUFvQztnQkFDckcsc0dBQXNHO2dCQUN0Ryw2Q0FBNkMsQ0FDaEQsQ0FBQztRQUNKLENBQUM7UUFFRCxLQUFLLE1BQU0sRUFBRSxJQUFJLEtBQUssQ0FBQyxTQUFTLElBQUksRUFBRSxFQUFFLENBQUM7WUFDdkMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN0QixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLFVBQVUsQ0FBQyxFQUFtQjtRQUNuQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztRQUN6QixJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDL0IsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUNwQyxNQUFNLFFBQVEsR0FBRyxJQUFBLDZCQUFtQixFQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNkLE1BQU0sT0FBTyxHQUNYLG9CQUFvQixXQUFXLHNDQUFzQztnQkFDckUsOEdBQThHLENBQUM7WUFDakgsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixFQUFFLENBQUM7Z0JBQ3pDLHlCQUFXLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxvQ0FBb0MsRUFBRSxHQUFHLE9BQU8sWUFBWSxDQUFDLENBQUM7Z0JBQzlGLE9BQU87WUFDVCxDQUFDO1lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxHQUFHLE9BQU8sd0RBQXdELENBQUMsQ0FBQztRQUN0RixDQUFDO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFM0IsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3pGLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEIsdUdBQXVHO1FBQ3ZHLHNGQUFzRjtRQUN0RixLQUFLLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNyRyxFQUFFLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNqQyxDQUFDO0lBQ0gsQ0FBQztJQUVELDhDQUE4QztJQUN2QyxhQUFhLENBQUMsU0FBNEI7UUFDL0MsS0FBSyxNQUFNLEVBQUUsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUMzQixJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ3RCLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNLLGNBQWMsQ0FBQyxFQUFtQixFQUFFLFFBQWdCLEVBQUUsUUFBZ0I7UUFDNUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDdkcsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLGlDQUF5QixDQUFDLFVBQVUsQ0FBQztRQUVoRSxNQUFNLEdBQUcsR0FBOEI7WUFDckMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLFdBQVcsSUFBSSxrQkFBa0IsQ0FBQyxFQUFFLENBQUM7WUFDekQsQ0FBQywyQ0FBd0IsQ0FBQyxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ2hELENBQUMsY0FBYyxDQUFDLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDL0IsQ0FBQyxFQUFFLGNBQWM7Z0JBQ2pCLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE9BQU8sRUFBRSx1QkFBYyxJQUFJLFlBQVk7Z0JBQ3ZDLEtBQUssRUFBRSxRQUFRO2FBQ2hCLENBQUM7U0FDSCxDQUFDO1FBRUYsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLGtHQUFrRztZQUNsRyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxJQUFBLHNCQUFZLEVBQUMsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDO2FBQU0sQ0FBQztZQUNOLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLElBQUEsd0JBQWMsRUFBQyxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztZQUNwRSxJQUFJLEtBQUssRUFBRSxDQUFDO2dCQUNWLEdBQUcsQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUNwQyxDQUFDO1FBQ0gsQ0FBQztRQUVELHVHQUF1RztRQUN2RyxrR0FBa0c7UUFDbEcsMkVBQTJFO1FBQzNFLE1BQU0sT0FBTyxHQUFHLElBQUEsa0NBQWUsRUFBQyxXQUFXLENBQUMsQ0FBQztRQUM3QyxNQUFNLFNBQVMsR0FBd0M7WUFDckQsQ0FBQyxzQ0FBbUIsRUFBRSxJQUFBLHNDQUFtQixFQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxRCxDQUFDLHVDQUFvQixFQUFFLElBQUEsc0NBQW1CLEVBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVELENBQUMsb0NBQWlCLEVBQUUsSUFBQSxzQ0FBbUIsRUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdkQsQ0FBQztRQUNGLEtBQUssTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUN0QyxJQUFJLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDeEIsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUNwQixDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQzs7QUF0SUgsa0VBdUlDOzs7QUFPRDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILE1BQWEsMkJBQTJCO0lBR3RDOzs7O09BSUc7SUFDSCxZQUFZLEtBQWdCLEVBQUUsS0FBdUM7UUFDbkUsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLDJCQUEyQixDQUFDLEtBQUssRUFBRSw2QkFBNkIsRUFBRTtZQUMzRix1QkFBdUIsRUFBRSxJQUFJO1lBQzdCLEdBQUcsS0FBSztTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBZ0I7UUFDM0IsSUFBSSxJQUFJLFlBQVksTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLENBQUM7SUFDSCxDQUFDOztBQW5CSCxrRUFvQkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBbm5vdGF0aW9ucywgSUFzcGVjdCwgU3RhY2ssIFRva2VuIH0gZnJvbSAnYXdzLWNkay1saWInO1xuaW1wb3J0ICogYXMgbGFtYmRhIGZyb20gJ2F3cy1jZGstbGliL2F3cy1sYW1iZGEnO1xuaW1wb3J0IHsgQ29uc3RydWN0LCBJQ29uc3RydWN0IH0gZnJvbSAnY29uc3RydWN0cyc7XG5pbXBvcnQge1xuICBFTlZfQ09MTEVDVE9SX0NPTkZJR19VUkksXG4gIEVOVl9MT0dTX0VYUE9SVEVSLFxuICBFTlZfTUVUUklDU19FWFBPUlRFUixcbiAgRU5WX1RSQUNFU19FWFBPUlRFUixcbiAgZXhwb3J0ZXJPdmVycmlkZUZvcixcbiAgcmVuZGVyQ29sbGVjdG9yQ29uZmlnLFxuICByZXNvbHZlZFNpZ25hbHMsXG59IGZyb20gJy4vY29sbGVjdG9yLWNvbmZpZyc7XG5pbXBvcnQgeyBPRElHT1NfVkVSU0lPTiB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQgeyBPZGlnb3NMYXllclJlc29sdmVyIH0gZnJvbSAnLi9sYXllci1yZXNvbHZlcic7XG5pbXBvcnQgeyBleGVjV3JhcHBlckZvciwgbGFuZ3VhZ2VGcm9tUnVudGltZSwgd2ViU2VydmVyRW52IH0gZnJvbSAnLi9ydW50aW1lJztcbmltcG9ydCB7XG4gIE9kaWdvc0Rlc3RpbmF0aW9uLFxuICBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLFxuICBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyxcbiAgT2RpZ29zTGF5ZXJTb3VyY2UsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCDigJQgdGhlIGxheWVyJ3MgZW50cnkgcG9pbnQgaW4gaGFuZGxlciBtb2RlLiAqL1xuY29uc3QgRU5WX0VYRUNfV1JBUFBFUiA9ICdBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUic7XG4vKiogU2VydmljZSBuYW1lIHJlcG9ydGVkIG9uIGV2ZXJ5IHNwYW4sIG1ldHJpYyBhbmQgbG9nIHJlY29yZC4gKi9cbmNvbnN0IEVOVl9TRVJWSUNFX05BTUUgPSAnT1RFTF9TRVJWSUNFX05BTUUnO1xuLyoqIFJhaXNlcyBpbi1mdW5jdGlvbiBPcGVuVGVsZW1ldHJ5IHZlcmJvc2l0eSBpbnRvIHRoZSBmdW5jdGlvbidzIENsb3VkV2F0Y2ggbG9nIGdyb3VwLiAqL1xuY29uc3QgRU5WX09URUxfTE9HX0xFVkVMID0gJ09URUxfTE9HX0xFVkVMJztcblxuLyoqXG4gKiBTY2hlbWEgdmVyc2lvbiBvZiB0aGUgbWFya2VyIHBheWxvYWQuIE11c3QgbWF0Y2ggYGFwaS5JYUNNYXJrZXJWZXJzaW9uYCBpbiB0aGUgY29ubmVjdG9yIOKAlCBpdCBpcyB3aGF0IHRlbGxzXG4gKiB0aGUgY29ubmVjdG9yIGhvdyB0byByZWFkIHRoZSByZXN0IG9mIHRoZSBvYmplY3QsIHNvIGEgYnVtcGVkIHZlcnNpb24gdGhlcmUgaXMgYSBjaGFuZ2UgaGVyZS5cbiAqL1xuY29uc3QgTUFSS0VSX1ZFUlNJT04gPSAxO1xuXG4vKipcbiAqIGBPRElHT1NfSUFDYCDigJQgdGhlIG1hcmtlciByZWNvcmRpbmcgdGhhdCB0aGlzIGZ1bmN0aW9uIHdhcyBpbnN0cnVtZW50ZWQgYnkgT2RpZ29zIElhQyB0b29saW5nLCBieSB3aGljaFxuICogcGFja2FnZSB2ZXJzaW9uLCBhbmQgY2Fycnlpbmcgd2hpY2ggbGF5ZXIuIFRoaXMgY29uc3RydWN0IGFsd2F5cyB3cml0ZXMgaXQsIGFuZCBpdCBpcyB3aGF0IG1ha2VzIE9kaWdvc1xuICogcmVwb3J0IHRoZSBmdW5jdGlvbiBhcyBpbnN0cnVtZW50ZWQgcmF0aGVyIHRoYW4gYEFic2VudGAg4oCUIFwiYXdhaXRpbmcgeW91ciBkZXBsb3ltZW50XCIuXG4gKlxuICogSXQgaXMgTk9UIGBPRElHT1NfTUFOQUdFRGAsIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyB0aGUgd2hvbGUgcmVhc29uIHRoZXJlIGFyZSB0d28gdmFyaWFibGVzLiBUaGF0IG9uZSBpcyB0aGVcbiAqIGNvbm5lY3RvcidzIHJlY29yZCBvZiBhIG11dGF0aW9uIElUIHBlcmZvcm1lZCwgd2hvc2UgcGF5bG9hZCBpcyB0aGUgc25hcHNob3QgaXQgcmVzdG9yZXMgZnJvbSBvbiByb2xsYmFjaztcbiAqIGEgQ0RLIHN0YWNrIGhhcyBubyBzdWNoIHNuYXBzaG90IHRvIG9mZmVyLCBiZWNhdXNlIG5vdGhpbmcgd2FzIG11dGF0ZWQg4oCUIHRoZSBlbnZpcm9ubWVudCBiZWxvdyBJUyB0aGVcbiAqIGZ1bmN0aW9uJ3MgZGVmaW5pdGlvbi4gU28gdGhlIGNvbm5lY3RvciBhY2NlcHRzIGVpdGhlciBtYXJrZXIgZm9yIFwiaXMgdGhpcyBpbnN0cnVtZW50ZWQgYnkgT2RpZ29zXCIsIGFuZFxuICogb25seSBpdHMgb3duIGZvciBcIm1heSBJIHJvbGwgdGhpcyBiYWNrXCIuIFRoaXMgY29uc3RydWN0IHdyaXRlcyB0aGUgZmlyc3QgYW5kIG5ldmVyIHRoZSBzZWNvbmQ6IHRoZSBwYWNrYWdlXG4gKiB3aWxsIG5vdCBjbGFpbSBvd25lcnNoaXAgb2YgYSBmdW5jdGlvbiBvbiB5b3VyIGJlaGFsZi5cbiAqXG4gKiBUaGUgYGxheWVyYCBmaWVsZCBpcyB0aGUgbG9hZC1iZWFyaW5nIG9uZS4gVGhlIGNvbm5lY3RvciByZWFkcyBpdCBiYWNrIHRvIGRlY2lkZSB3aGljaCBsYXllciB2ZXJzaW9uIHRoZVxuICogZnVuY3Rpb24gaXMgU1VQUE9TRUQgdG8gY2FycnksIHNvIGEgdmVyc2lvbiB5b3UgcGlubmVkIGlzIHJlc3BlY3RlZCBpbnN0ZWFkIG9mIGJlaW5nIHJlcG9ydGVkIGFzIGRyaWZ0IHRoZVxuICogZGF5IE9kaWdvcyBwdWJsaXNoZXMgYSBuZXdlciBvbmUuIEl0IHdvcmtzIGluIGBJTl9BQ0NPVU5UYCBtb2RlIHRvbywgd2hlcmUgdGhlIEFSTiBpcyBhIGRlcGxveS10aW1lXG4gKiByZWZlcmVuY2UgeW91ciBvd24gY29kZSBoYXMgbm8gd2F5IHRvIG9idGFpbi5cbiAqL1xuY29uc3QgRU5WX0lBQ19NQVJLRVIgPSAnT0RJR09TX0lBQyc7XG5cbi8qKlxuICogVGhlIHNlcnZpY2UgYSBmdW5jdGlvbiByZXBvcnRzIGFzLCB3aGVuIHRoZSBjYWxsZXIgaGFzIG5vdCBuYW1lZCBvbmUuXG4gKlxuICogUkVBRCBGUk9NIFRIRSBMMSwgTk9UIEZST00gYGZuLmZ1bmN0aW9uTmFtZWAuIFRoZSBMMiBwcm9wZXJ0eSBpcyBhIGNyb3NzLWVudmlyb25tZW50LWF3YXJlIHRva2VuIHRoYXRcbiAqIHJlc29sdmVzIHRvIGEgYFJlZmAgdG8gdGhlIGZ1bmN0aW9uIGl0c2VsZiBldmVuIHdoZW4gdGhlIHN0YWNrIHNldCBgZnVuY3Rpb25OYW1lYCBleHBsaWNpdGx5IOKAlCBzbyB0aGVcbiAqIG9idmlvdXMgYFN0YWNrLm9mKGZuKS5yZXNvbHZlKGZuLmZ1bmN0aW9uTmFtZSlgIG5ldmVyIHlpZWxkcyBhIGxpdGVyYWwsIGFuZCBldmVyeSBmdW5jdGlvbiBzaWxlbnRseSBmZWxsXG4gKiBiYWNrIHRvIGl0cyBjb25zdHJ1Y3QgaWQuIGBDZm5GdW5jdGlvbi5mdW5jdGlvbk5hbWVgIGlzIHRoZSByYXcgdGVtcGxhdGUgdmFsdWU6IHRoZSBsaXRlcmFsIHRoZSBzdGFja1xuICogcGFzc2VkLCBvciB1bmRlZmluZWQgd2hlbiBDbG91ZEZvcm1hdGlvbiBnZW5lcmF0ZXMgdGhlIG5hbWUuXG4gKlxuICogV2h5IHRoZSBmYWxsYmFjayBpcyB0aGUgY29uc3RydWN0IGlkIHJhdGhlciB0aGFuIHRoZSBnZW5lcmF0ZWQgbmFtZTogYSBnZW5lcmF0ZWQgbmFtZSBpcyBhIGBSZWZgIHRvIHRoZVxuICogZnVuY3Rpb24sIGFuZCBwdXR0aW5nIHRoYXQgaW4gdGhlIGZ1bmN0aW9uJ3Mgb3duIGVudmlyb25tZW50IG1ha2VzIHRoZSByZXNvdXJjZSBkZXBlbmQgb24gaXRzIG93blxuICogY3JlYXRpb24g4oCUIENsb3VkRm9ybWF0aW9uIHJlamVjdHMgdGhlIHRlbXBsYXRlIHdpdGggYSBkZXBlbmRlbmN5IGN5Y2xlLCBhdCBkZXBsb3kgdGltZS5cbiAqXG4gKiBUaGlzIG1hdHRlcnMgYmV5b25kIGNvc21ldGljcy4gVGhlIGNvbm5lY3RvciBjb21wYXJlcyBgT1RFTF9TRVJWSUNFX05BTUVgIGFnYWluc3QgdGhlIHdvcmtsb2FkJ3MgbmFtZSBpblxuICogT2RpZ29zLCB3aGljaCBpcyB0aGUgcmVhbCBBV1MgZnVuY3Rpb24gbmFtZSwgc28gYSBmdW5jdGlvbiByZXBvcnRpbmcgaXRzIGNvbnN0cnVjdCBpZCBpcyByZXBvcnRlZCBhc1xuICogZHJpZnRlZCBvbiB0aGUgc2VydmljZS1uYW1lIGNvbXBvbmVudC4gTmFtaW5nIHRoZSBmdW5jdGlvbiBpbiB5b3VyIHN0YWNrIGlzIG5vdyBlbm91Z2ggdG8gbGluZSB0aGUgdHdvXG4gKiB1cDsgYSBmdW5jdGlvbiB3aG9zZSBuYW1lIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyBzdGlsbCBuZWVkcyBgc2VydmljZU5hbWVgIHBhc3NlZCBleHBsaWNpdGx5LlxuICovXG5mdW5jdGlvbiBkZWZhdWx0U2VydmljZU5hbWUoZm46IGxhbWJkYS5GdW5jdGlvbik6IHN0cmluZyB7XG4gIGNvbnN0IGNmbiA9IGZuLm5vZGUuZGVmYXVsdENoaWxkIGFzIGxhbWJkYS5DZm5GdW5jdGlvbiB8IHVuZGVmaW5lZDtcbiAgY29uc3QgcmVzb2x2ZWQgPSBjZm4gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IFN0YWNrLm9mKGZuKS5yZXNvbHZlKGNmbi5mdW5jdGlvbk5hbWUpO1xuICBpZiAodHlwZW9mIHJlc29sdmVkID09PSAnc3RyaW5nJyAmJiByZXNvbHZlZCAhPT0gJycgJiYgIVRva2VuLmlzVW5yZXNvbHZlZChyZXNvbHZlZCkpIHtcbiAgICByZXR1cm4gcmVzb2x2ZWQ7XG4gIH1cbiAgcmV0dXJuIGZuLm5vZGUuaWQ7XG59XG5cbi8qKlxuICogT3B0aW9ucyBzaGFyZWQgYnkgdGhlIGNvbnN0cnVjdCBhbmQgdGhlIGFzcGVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBpbi1MYW1iZGEgY29sbGVjdG9yIGV4cG9ydHMgdG8uXG4gICAqL1xuICByZWFkb25seSBkZXN0aW5hdGlvbjogT2RpZ29zRGVzdGluYXRpb247XG5cbiAgLyoqXG4gICAqIFdoZXJlIHRoZSBPZGlnb3MgbGF5ZXIgY29tZXMgZnJvbS5cbiAgICpcbiAgICogQGRlZmF1bHQgT2RpZ29zTGF5ZXJTb3VyY2UuT0RJR09TX1BVQkxJQ1xuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJTb3VyY2U/OiBPZGlnb3NMYXllclNvdXJjZTtcblxuICAvKipcbiAgICogSGFuZGxlciBtb2RlIG9yIHdlYi1zZXJ2ZXIgKExhbWJkYSBXZWIgQWRhcHRlcikgbW9kZS5cbiAgICpcbiAgICogVGhlcmUgaXMgbm8gYXV0by1kZXRlY3Rpb24sIGFuZCB0aGF0IGlzIGRlbGliZXJhdGUgcmF0aGVyIHRoYW4gYW4gb21pc3Npb246IGRldGVjdGluZyB0aGUgd2ViIGFkYXB0ZXJcbiAgICogbWVhbnMgaW5zcGVjdGluZyB0aGUgZnVuY3Rpb24ncyBvdGhlciBsYXllcnMsIHdoaWNoIGF0IHN5bnRoIHRpbWUgYXJlIGZyZXF1ZW50bHkgdW5yZXNvbHZlZCB0b2tlbnMuXG4gICAqIEEgZGV0ZWN0b3IgdGhhdCBpcyByaWdodCBtb3N0IG9mIHRoZSB0aW1lIHdvdWxkIHNpbGVudGx5IGJyZWFrIHRoZSBmdW5jdGlvbnMgaXQgZ290IHdyb25nLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLkhBTkRMRVJcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlO1xuXG4gIC8qKlxuICAgKiBXaGljaCBvZiB0aGUgSmF2YSBsYXllcidzIGZvdXIgd3JhcHBlciBzY3JpcHRzIHRvIHVzZS4gSWdub3JlZCBmb3Igb3RoZXIgbGFuZ3VhZ2VzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX0hBTkRMRVJcbiAgICovXG4gIHJlYWRvbmx5IGphdmFIYW5kbGVyRGlzdHJvPzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm87XG5cbiAgLyoqXG4gICAqIGBPVEVMX1NFUlZJQ0VfTkFNRWAgZm9yIGV2ZXJ5IGZ1bmN0aW9uIHRoaXMgaW5zdHJ1bWVudHMuXG4gICAqXG4gICAqIFVzdWFsbHkgd3JvbmcgdG8gc2V0IHdoZW4gaW5zdHJ1bWVudGluZyBtb3JlIHRoYW4gb25lIGZ1bmN0aW9uIOKAlCB0aGV5IHdvdWxkIGFsbCByZXBvcnQgYXMgdGhlIHNhbWVcbiAgICogc2VydmljZS5cbiAgICpcbiAgICogTGVmdCB1bnNldCwgYSBmdW5jdGlvbiByZXBvcnRzIGFzIGl0cyBleHBsaWNpdGx5LXNldCBwaHlzaWNhbCBuYW1lIGlmIGl0IGhhcyBvbmUsIGFuZCBvdGhlcndpc2UgYXNcbiAgICogaXRzIGNvbnN0cnVjdCBpZC4gSXQgZGVsaWJlcmF0ZWx5IGRvZXMgbm90IGRlZmF1bHQgdG8gdGhlIGdlbmVyYXRlZCBwaHlzaWNhbCBuYW1lOiB0aGF0IHZhbHVlIGlzIGFcbiAgICogYFJlZmAgdG8gdGhlIGZ1bmN0aW9uIGl0c2VsZiwgYW5kIGEgZnVuY3Rpb24gcmVmZXJlbmNpbmcgaXRzZWxmIGluIGl0cyBvd24gZW52aXJvbm1lbnQgaXMgYVxuICAgKiBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5IGN5Y2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBmdW5jdGlvbidzIHBoeXNpY2FsIG5hbWUgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBpdHMgY29uc3RydWN0IGlkXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmFpc2UgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgKGBPVEVMX0xPR19MRVZFTD1kZWJ1Z2ApLlxuICAgKlxuICAgKiBUaGUgbGF5ZXIsIFNESyBhbmQgY29sbGVjdG9yIHRoZW4gZW1pdCBzcGFuIGFuZCBPVExQLWV4cG9ydCBkaWFnbm9zdGljcyBpbnRvIHRoZSBmdW5jdGlvbidzIENsb3VkV2F0Y2hcbiAgICogbG9nIGdyb3VwLiBVc2VmdWwgd2hpbGUgd2lyaW5nIHVwIGEgZGVzdGluYXRpb24sIGV4cGVuc2l2ZSB0byBsZWF2ZSBvbi5cbiAgICpcbiAgICogSGFzIG5vIGVmZmVjdCBpbiB3ZWItc2VydmVyIG1vZGUsIG1hdGNoaW5nIHRoZSBjb25uZWN0b3IsIHdoaWNoIG5ldmVyIHNldHMgYSBsb2cgbGV2ZWwgdGhlcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGlzIGxheWVyIGluc3RlYWQgb2YgcmVzb2x2aW5nIG9uZS4gT3ZlcnJpZGVzIGBsYXllclNvdXJjZWAgZW50aXJlbHkuXG4gICAqXG4gICAqIFRoZSBlc2NhcGUgaGF0Y2ggZm9yIGEgbGF5ZXIgbWlycm9yZWQgaW50byBhIHByaXZhdGUgcmVnaXN0cnkgb3IgYW4gaW50ZXJuYWwgYWNjb3VudC4gVGhlIGxheWVyIG11c3RcbiAgICogaGF2ZSB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGUgT2RpZ29zIG9uZSDigJQgdGhlIGVudmlyb25tZW50IHNldCBoZXJlIGFzc3VtZXMgaXRzIGV4YWN0IHNjcmlwdCBsYXlvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcmVzb2x2ZWQgZnJvbSBsYXllclNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJWZXJzaW9uPzogbGFtYmRhLklMYXllclZlcnNpb247XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSB0aGUgZnVuY3Rpb24gYWxyZWFkeSBuZWVkcyBpbiBpdHMgbGFuZ3VhZ2UgbG9hZGVyIHZhcmlhYmxlIChgTk9ERV9PUFRJT05TYCxcbiAgICogYEpBVkFfVE9PTF9PUFRJT05TYCBvciBgUFlUSE9OUEFUSGApLCB3aGljaCB0aGUgT2RpZ29zIGxvYWRlciBpcyBqb2luZWQgdG8gcmF0aGVyIHRoYW4gcmVwbGFjaW5nLlxuICAgKlxuICAgKiBPbmx5IHVzZWQgaW4gd2ViLXNlcnZlciBtb2RlLiBJdCBoYXMgdG8gYmUgcGFzc2VkIGV4cGxpY2l0bHkgYmVjYXVzZSBDREsncyBgbGFtYmRhLkZ1bmN0aW9uYCBleHBvc2VzXG4gICAqIG5vIHdheSB0byByZWFkIGJhY2sgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IGVsc2V3aGVyZSBpbiB0aGUgYXBwIOKAlCBhbiBvbWl0dGVkIHZhbHVlIGhlcmUgaXNcbiAgICogc2lsZW50bHkgb3ZlcndyaXR0ZW4sIHdoaWNoIGZvciBgTk9ERV9PUFRJT05TYCBjYW4gbWVhbiBsb3NpbmcgYSBmbGFnIHRoZSBhcHAgbmVlZHMgdG8gYm9vdC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSB0aGUgbG9hZGVyIHZhcmlhYmxlIGlzIHNldCB0byB0aGUgT2RpZ29zIHZhbHVlIGFsb25lXG4gICAqL1xuICByZWFkb25seSBleGlzdGluZ0xvYWRlclZhbHVlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTa2lwIGZ1bmN0aW9ucyB3aG9zZSBydW50aW1lIGhhcyBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYXllciBpbnN0ZWFkIG9mIHRocm93aW5nLlxuICAgKlxuICAgKiBgZG90bmV0KmAgYW5kIGBwcm92aWRlZC4qYCAoR28sIGN1c3RvbSBydW50aW1lcykgaGF2ZSBubyBsYW5ndWFnZSBsYXllciB1cHN0cmVhbS4gRXhwbGljaXRseVxuICAgKiBpbnN0cnVtZW50aW5nIG9uZSBpcyBhIG1pc3Rha2Ugd29ydGggZmFpbGluZyBvbjsgc3dlZXBpbmcgYSB3aG9sZSBzdGFjayB3aXRoIHRoZSBhc3BlY3QgYW5kIGhpdHRpbmdcbiAgICogb25lIGlzIG5vdCwgd2hpY2ggaXMgd2h5IHRoZSBhc3BlY3QgZGVmYXVsdHMgdGhpcyB0byBgdHJ1ZWAgYW5kIHRoZSBjb25zdHJ1Y3QgdG8gYGZhbHNlYC5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBQcm9wcyBmb3Ige0BsaW5rIE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uUHJvcHMgZXh0ZW5kcyBPZGlnb3NJbnN0cnVtZW50YXRpb25PcHRpb25zIHtcbiAgLyoqXG4gICAqIEZ1bmN0aW9ucyB0byBpbnN0cnVtZW50IG9uIGNvbnN0cnVjdGlvbi4gTW9yZSBjYW4gYmUgYWRkZWQgd2l0aCBgaW5zdHJ1bWVudCgpYC5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBub25lXG4gICAqL1xuICByZWFkb25seSBmdW5jdGlvbnM/OiBsYW1iZGEuRnVuY3Rpb25bXTtcbn1cblxuLyoqXG4gKiBJbnN0cnVtZW50cyBBV1MgTGFtYmRhIGZ1bmN0aW9ucyB3aXRoIHRoZSBPZGlnb3MgT3BlblRlbGVtZXRyeSBsYXllci5cbiAqXG4gKiBgYGB0c1xuICogY29uc3Qgb2RpZ29zID0gbmV3IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvbih0aGlzLCAnT2RpZ29zJywge1xuICogICBkZXN0aW5hdGlvbjogeyBlbmRwb2ludDogJ290bHAuZXhhbXBsZS5jb206NDMxNycgfSxcbiAqICAgZnVuY3Rpb25zOiBbYXBpRm4sIHdvcmtlckZuXSxcbiAqIH0pO1xuICogb2RpZ29zLmluc3RydW1lbnQoYW5vdGhlckZuKTtcbiAqIGBgYFxuICpcbiAqIFdoYXQgaXQgZG9lcyB0byBlYWNoIGZ1bmN0aW9uOiBhdHRhY2hlcyB0aGUgbGF5ZXIgZm9yIHRoZSBmdW5jdGlvbidzIGxhbmd1YWdlIGFuZCBhcmNoaXRlY3R1cmUsIHNldHNcbiAqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAgc28gdGhlIGxheWVyIGxvYWRzIHRoZSBTREssIHNldHMgYE9URUxfU0VSVklDRV9OQU1FYCwgYW5kIGhhbmRzIHRoZSBpbi1MYW1iZGFcbiAqIGNvbGxlY3RvciBpdHMgZW50aXJlIGNvbmZpZ3VyYXRpb24gaW5saW5lIHRocm91Z2ggYE9QRU5URUxFTUVUUllfQ09MTEVDVE9SX0NPTkZJR19VUklgLlxuICpcbiAqIFRoZSBmdW5jdGlvbidzIFNESyBleHBvcnRzIHRvIHRoZSBjb2xsZWN0b3Igb24gbG9jYWxob3N0LCBub3QgdG8geW91ciBkZXN0aW5hdGlvbi4gVGhlIGNvbGxlY3RvclxuICogZm9yd2FyZHMgYWZ0ZXIgdGhlIGhhbmRsZXIgaGFzIGFscmVhZHkgcmV0dXJuZWQsIHNvIGEgc2xvdyBkZXN0aW5hdGlvbiBjb3N0cyBiaWxsZWQgZHVyYXRpb24gcmF0aGVyXG4gKiB0aGFuIGNhbGxlciBsYXRlbmN5LlxuICpcbiAqICMjIERvIG5vdCBhbHNvIGluc3RydW1lbnQgdGhlc2UgZnVuY3Rpb25zIHdpdGggdGhlIGNvbm5lY3RvclxuICpcbiAqIFRoZSBPZGlnb3MgQVdTIGNvbm5lY3RvciBpbnN0cnVtZW50cyBsaXZlIGZ1bmN0aW9ucyBieSBtdXRhdGluZyB0aGVtLCBhbmQgcmVjb25jaWxlcyB0aGVtIGJhY2sgdG8gaXRzXG4gKiBvd24gZGVzaXJlZCBzdGF0ZSBvbiBldmVyeSBwYXNzLiBBIGZ1bmN0aW9uIGluc3RydW1lbnRlZCBoZXJlIGFuZCBhbHNvIGVuYWJsZWQgYXMgYSBjb25uZWN0b3Igc291cmNlXG4gKiBlbmRzIHVwIG93bmVkIGJ5IGJvdGg6IGVhY2ggYGNkayBkZXBsb3lgIHJlYXNzZXJ0cyB0aGUgQ0RLJ3MgZW52aXJvbm1lbnQsIGVhY2ggcmVjb25jaWxlIHJlYXNzZXJ0cyB0aGVcbiAqIGNvbm5lY3RvcidzLCBhbmQgZXZlcnkgcm91bmQgdHJpcCBwdWJsaXNoZXMgYSBuZXcgZnVuY3Rpb24gdmVyc2lvbi5cbiAqXG4gKiBDaG9vc2Ugb25lIHBlciBmdW5jdGlvbi4gVGhpcyBjb25zdHJ1Y3Qgd3JpdGVzIGBPRElHT1NfSUFDYCBhbmQgbmV2ZXIgdGhlIGNvbm5lY3RvcidzIGBPRElHT1NfTUFOQUdFRGBcbiAqIG93bmVyc2hpcCBtYXJrZXIsIHNvIGFuIElhQy1pbnN0cnVtZW50ZWQgZnVuY3Rpb24gcmVwb3J0cyBhcyBpbnN0cnVtZW50ZWQgYnV0IGlzIG5vdCBvbmUgdGhlIGNvbm5lY3RvclxuICogd2lsbCByb2xsIGJhY2sg4oCUIHRob3VnaCBpdCB3aWxsIGhhcHBpbHkgdGFrZSBpdCBvdmVyIGlmIHlvdSBlbmFibGUgaXQgYXMgYSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IE9kaWdvc0xheWVyUmVzb2x2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgY29sbGVjdG9yQ29uZmlnOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHByb3BzO1xuICAgIHRoaXMucmVzb2x2ZXIgPSBuZXcgT2RpZ29zTGF5ZXJSZXNvbHZlcih0aGlzLCBwcm9wcy5sYXllclNvdXJjZSA/PyBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDKTtcblxuICAgIC8vIFJlbmRlcmVkIG9uY2UuIEl0IGRlcGVuZHMgb25seSBvbiB0aGUgZGVzdGluYXRpb24sIGFuZCByZW5kZXJpbmcgaXQgcGVyIGZ1bmN0aW9uIHdvdWxkIG1ha2UgYW5cbiAgICAvLyBhY2NpZGVudGFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZnVuY3Rpb25zIHBvc3NpYmxlLlxuICAgIHRoaXMuY29sbGVjdG9yQ29uZmlnID0gcmVuZGVyQ29sbGVjdG9yQ29uZmlnKHByb3BzLmRlc3RpbmF0aW9uKTtcblxuICAgIC8vIEEgd2FybmluZyByYXRoZXIgdGhhbiBhbiBlcnJvciwgYmVjYXVzZSBhIGNvbGxlY3RvciBDQU4gYmUgcmVhY2hlZCBvdmVyIGdSUEMgb24gYSBub24tc3RhbmRhcmQgcG9ydCDigJRcbiAgICAvLyBidXQgdGhlIG92ZXJ3aGVsbWluZ2x5IGxpa2VsaWVyIHJlYWRpbmcgb2YgYGVuZHBvaW50OiBcImhvc3Q6NDMxOFwiYCBpcyBhbiBPVExQL0hUVFAgZW5kcG9pbnQgcGFzc2VkIHRvXG4gICAgLy8gdGhlIGdSUEMgZXhwb3J0ZXIsIHdoaWNoIGJ1aWxkcywgc3RhcnRzLCBhbmQgdGhlbiBuZXZlciBkZWxpdmVycyBhIGJhdGNoLiBTaWxlbnQgZm9yIHRoZSBjYWxsZXIgd2hvXG4gICAgLy8gbWVhbnQgaXQ7IGxvdWQgZm9yIHRoZSBvbmUgd2hvIGRpZCBub3QuXG4gICAgaWYgKHByb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTgnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlSHR0cEVuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gZW5kcG9pbnQgXCIke3Byb3BzLmRlc3RpbmF0aW9uLmVuZHBvaW50fVwiIGlzIG9uIDQzMTgsIHRoZSBPVExQL0hUVFAgcG9ydCwgYnV0IGAgK1xuICAgICAgICAgICdgZW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIGdSUEMgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTcpLiBJZiB0aGF0IGlzIGFuIE9UTFAvSFRUUCBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBodHRwRW5kcG9pbnQ6IFwiaHR0cDovL2hvc3Q6NDMxOFwiYCBpbnN0ZWFkIOKAlCB0aGUgZ1JQQyBleHBvcnRlciB3aWxsIGV4cG9ydCBub3RoaW5nIHRvIGl0LicsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAocHJvcHMuZGVzdGluYXRpb24uaHR0cEVuZHBvaW50Py5lbmRzV2l0aCgnOjQzMTcnKSkge1xuICAgICAgQW5ub3RhdGlvbnMub2YodGhpcykuYWRkV2FybmluZ1YyKFxuICAgICAgICAnQG9kaWdvcy9hd3MtY2RrOnByb2JhYmxlR3JwY0VuZHBvaW50JyxcbiAgICAgICAgYE9kaWdvczogZGVzdGluYXRpb24gaHR0cEVuZHBvaW50IFwiJHtwcm9wcy5kZXN0aW5hdGlvbi5odHRwRW5kcG9pbnR9XCIgaXMgb24gNDMxNywgdGhlIE9UTFAvZ1JQQyBwb3J0LCBgICtcbiAgICAgICAgICAnYnV0IGBodHRwRW5kcG9pbnRgIGNvbmZpZ3VyZXMgdGhlIEhUVFAgZXhwb3J0ZXIgKGNvbnZlbnRpb25hbGx5IDQzMTgpLiBJZiB0aGF0IGlzIGEgZ1JQQyBjb2xsZWN0b3IsICcgK1xuICAgICAgICAgICdwYXNzIGl0IGFzIGBlbmRwb2ludDogXCJob3N0OjQzMTdcImAgaW5zdGVhZC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGZuIG9mIHByb3BzLmZ1bmN0aW9ucyA/PyBbXSkge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW5zdHJ1bWVudHMgb25lIGZ1bmN0aW9uLiBJZGVtcG90ZW50IOKAlCBpbnN0cnVtZW50aW5nIHRoZSBzYW1lIGZ1bmN0aW9uIHR3aWNlIGlzIGEgbm8tb3AgcmF0aGVyIHRoYW4gYVxuICAgKiBkb3VibGVkIGxvYWRlciB2YWx1ZS5cbiAgICovXG4gIHB1YmxpYyBpbnN0cnVtZW50KGZuOiBsYW1iZGEuRnVuY3Rpb24pOiB2b2lkIHtcbiAgICBjb25zdCBrZXkgPSBmbi5ub2RlLnBhdGg7XG4gICAgaWYgKHRoaXMuaW5zdHJ1bWVudGVkLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcnVudGltZU5hbWUgPSBmbi5ydW50aW1lLm5hbWU7XG4gICAgY29uc3QgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZyb21SdW50aW1lKHJ1bnRpbWVOYW1lKTtcbiAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICBjb25zdCBtZXNzYWdlID1cbiAgICAgICAgYE9kaWdvczogcnVudGltZSBcIiR7cnVudGltZU5hbWV9XCIgaGFzIG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGAgK1xuICAgICAgICAnKHVwc3RyZWFtIHB1Ymxpc2hlcyBsYXllcnMgZm9yIHB5dGhvbiwgbm9kZWpzLCBqYXZhIGFuZCBydWJ5IG9ubHkpLCBzbyB0aGlzIGZ1bmN0aW9uIGNhbm5vdCBiZSBpbnN0cnVtZW50ZWQuJztcbiAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2tpcFVuc3VwcG9ydGVkUnVudGltZXMpIHtcbiAgICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnVuc3VwcG9ydGVkUnVudGltZScsIGAke21lc3NhZ2V9IFNraXBwaW5nLmApO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7bWVzc2FnZX0gU2V0IHNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzOiB0cnVlIHRvIHNraXAgaXQgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmluc3RydW1lbnRlZC5hZGQoa2V5KTtcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IGZuLmFyY2hpdGVjdHVyZS5uYW1lO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5vcHRpb25zLmxheWVyVmVyc2lvbiA/PyB0aGlzLnJlc29sdmVyLnJlc29sdmUobGFuZ3VhZ2UsIGFyY2hpdGVjdHVyZSk7XG4gICAgZm4uYWRkTGF5ZXJzKGxheWVyKTtcblxuICAgIC8vIFRoZSBBUk4sIG5vdCB0aGUgY29uc3RydWN0OiB0aGUgbWFya2VyIGhhcyB0byBuYW1lIHRoZSBleGFjdCBsYXllciB2ZXJzaW9uIHRoZSBmdW5jdGlvbiBjYXJyaWVzLCBhbmRcbiAgICAvLyBpbiBJTl9BQ0NPVU5UIG1vZGUgdGhhdCBpcyBhIG5lc3RlZC1zdGFjayBvdXRwdXQgcmVmZXJlbmNlIHJlc29sdmVkIGF0IGRlcGxveSB0aW1lLlxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudmlyb25tZW50Rm9yKGZuLCBsYW5ndWFnZSwgbGF5ZXIubGF5ZXJWZXJzaW9uQXJuKSkpIHtcbiAgICAgIGZuLmFkZEVudmlyb25tZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5zdHJ1bWVudHMgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIGxpc3QuICovXG4gIHB1YmxpYyBpbnN0cnVtZW50QWxsKGZ1bmN0aW9uczogbGFtYmRhLkZ1bmN0aW9uW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IGFwcGxpZWQgdG8gb25lIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBNaXJyb3JzIGBhcHBseUhhbmRsZXJFbnZgIC8gYGFwcGx5V2ViU2VydmVyRW52YCBpbiB0aGUgY29ubmVjdG9yLCBpbmNsdWRpbmcgd2hhdCBpcyBkZWxpYmVyYXRlbHkgTk9UXG4gICAqIHNldDogYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgc3RheXMgdW5zZXQgc28gdGhlIFNESyBrZWVwcyBleHBvcnRpbmcgdG8gdGhlIGluLUxhbWJkYSBjb2xsZWN0b3JcbiAgICogb24gbG9jYWxob3N0IHJhdGhlciB0aGFuIGJsb2NraW5nIHRoZSBpbnZvY2F0aW9uIG9uIHRoZSByZW1vdGUgZGVzdGluYXRpb24sIGFuZCBhbiBlbmFibGVkIHNpZ25hbCdzXG4gICAqIGBPVEVMXypfRVhQT1JURVJgIHN0YXlzIHVuc2V0IGJlY2F1c2UgYG90bHBgIGlzIGFscmVhZHkgdGhlIFNESyBkZWZhdWx0LlxuICAgKi9cbiAgcHJpdmF0ZSBlbnZpcm9ubWVudEZvcihmbjogbGFtYmRhLkZ1bmN0aW9uLCBsYW5ndWFnZTogc3RyaW5nLCBsYXllckFybjogc3RyaW5nKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gICAgY29uc3QgeyBkZXN0aW5hdGlvbiwgbW9kZSwgZGVidWcsIHNlcnZpY2VOYW1lLCBqYXZhSGFuZGxlckRpc3RybywgZXhpc3RpbmdMb2FkZXJWYWx1ZSB9ID0gdGhpcy5vcHRpb25zO1xuICAgIGNvbnN0IHdlYlNlcnZlciA9IG1vZGUgPT09IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuV0VCX1NFUlZFUjtcblxuICAgIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtFTlZfU0VSVklDRV9OQU1FXTogc2VydmljZU5hbWUgPz8gZGVmYXVsdFNlcnZpY2VOYW1lKGZuKSxcbiAgICAgIFtFTlZfQ09MTEVDVE9SX0NPTkZJR19VUkldOiB0aGlzLmNvbGxlY3RvckNvbmZpZyxcbiAgICAgIFtFTlZfSUFDX01BUktFUl06IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgdjogTUFSS0VSX1ZFUlNJT04sXG4gICAgICAgIHNvdXJjZTogJ2NkaycsXG4gICAgICAgIHZlcnNpb246IE9ESUdPU19WRVJTSU9OIHx8ICd1bnJlbGVhc2VkJyxcbiAgICAgICAgbGF5ZXI6IGxheWVyQXJuLFxuICAgICAgfSksXG4gICAgfTtcblxuICAgIGlmICh3ZWJTZXJ2ZXIpIHtcbiAgICAgIC8vIE5vIGV4ZWMgd3JhcHBlcjogdGhlIExhbWJkYSBXZWIgQWRhcHRlciBvd25zIGl0LCBhbmQgb3ZlcndyaXRpbmcgaXQgc3RvcHMgdGhlIGZ1bmN0aW9uIHNlcnZpbmcuXG4gICAgICBPYmplY3QuYXNzaWduKGVudiwgd2ViU2VydmVyRW52KGxhbmd1YWdlLCBleGlzdGluZ0xvYWRlclZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVudltFTlZfRVhFQ19XUkFQUEVSXSA9IGV4ZWNXcmFwcGVyRm9yKGxhbmd1YWdlLCBqYXZhSGFuZGxlckRpc3Rybyk7XG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgZW52W0VOVl9PVEVMX0xPR19MRVZFTF0gPSAnZGVidWcnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFN1cHByZXNzIHRoZSBzaWduYWxzIHRoZSBkZXN0aW5hdGlvbiBkb2VzIG5vdCBhY2NlcHQuIEEgc2lnbmFsIHdpdGggbm8gY29sbGVjdG9yIHBpcGVsaW5lIGlzIHJlZnVzZWRcbiAgICAvLyBhdCB0aGUgcmVjZWl2ZXIgb24gZXZlcnkgYmF0Y2gsIHNvIHRlbGxpbmcgdGhlIFNESyBub3QgdG8gcHJvZHVjZSBpdCBpcyB0aGUgaGFsZiB0aGF0IHN0b3BzIHRoZVxuICAgIC8vIGVycm9yIGxvb3A7IHRoZSBwaXBlbGluZSBiZWluZyBhYnNlbnQgaXMgdGhlIGhhbGYgdGhhdCBzdG9wcyB0aGUgZXhwb3J0LlxuICAgIGNvbnN0IGVuYWJsZWQgPSByZXNvbHZlZFNpZ25hbHMoZGVzdGluYXRpb24pO1xuICAgIGNvbnN0IG92ZXJyaWRlczogQXJyYXk8W3N0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkXT4gPSBbXG4gICAgICBbRU5WX1RSQUNFU19FWFBPUlRFUiwgZXhwb3J0ZXJPdmVycmlkZUZvcihlbmFibGVkLnRyYWNlcyldLFxuICAgICAgW0VOVl9NRVRSSUNTX0VYUE9SVEVSLCBleHBvcnRlck92ZXJyaWRlRm9yKGVuYWJsZWQubWV0cmljcyldLFxuICAgICAgW0VOVl9MT0dTX0VYUE9SVEVSLCBleHBvcnRlck92ZXJyaWRlRm9yKGVuYWJsZWQubG9ncyldLFxuICAgIF07XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIG92ZXJyaWRlcykge1xuICAgICAgaWYgKHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW52W25hbWVdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGVudjtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3RQcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge31cblxuLyoqXG4gKiBBcHBsaWVzIE9kaWdvcyBpbnN0cnVtZW50YXRpb24gdG8gZXZlcnkgYGxhbWJkYS5GdW5jdGlvbmAgaW4gYSBzY29wZS5cbiAqXG4gKiBgYGB0c1xuICogQXNwZWN0cy5vZihzdGFjaykuYWRkKG5ldyBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3Qoc3RhY2ssIHtcbiAqICAgZGVzdGluYXRpb246IHsgZW5kcG9pbnQ6ICdvdGxwLmV4YW1wbGUuY29tOjQzMTcnIH0sXG4gKiB9KSk7XG4gKiBgYGBcbiAqXG4gKiBgc2tpcFVuc3VwcG9ydGVkUnVudGltZXNgIGRlZmF1bHRzIHRvIGB0cnVlYCBoZXJlLCB1bmxpa2UgdGhlIGNvbnN0cnVjdDogYW4gYXNwZWN0IHZpc2l0cyBldmVyeSBmdW5jdGlvblxuICogaW4gdGhlIHNjb3BlLCBpbmNsdWRpbmcgb25lcyB3aG9zZSBydW50aW1lIGhhcyBubyBPcGVuVGVsZW1ldHJ5IGxheWVyLCBhbmQgZmFpbGluZyB0aGUgd2hvbGUgc3ludGhcbiAqIGJlY2F1c2UgYSBzdGFjayBoYXBwZW5zIHRvIGNvbnRhaW4gb25lIEdvIGZ1bmN0aW9uIGlzIG5vdCB1c2VmdWwuIEVhY2ggc2tpcCBpcyByZXBvcnRlZCBhcyBhIHN5bnRoXG4gKiB3YXJuaW5nLCBzbyBpdCBpcyB2aXNpYmxlIHJhdGhlciB0aGFuIHNpbGVudC5cbiAqXG4gKiBUaGUgYXNwZWN0IGluc3RydW1lbnRzIHdoYXQgZXhpc3RzIGluIHRoZSB0cmVlIHdoZW4gaXQgcnVucy4gQSBmdW5jdGlvbiBhZGRlZCBieSBhIGxhdGVyIGFzcGVjdCBpcyBub3RcbiAqIHZpc2l0ZWQ7IHVzZSB0aGUgY29uc3RydWN0IGRpcmVjdGx5IGZvciB0aG9zZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RydW1lbnRhdGlvbjogT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2NvcGUgd2hlcmUgdGhlIHNoYXJlZCBsYXllciBjb25zdHJ1Y3RzIGFyZSBjcmVhdGVkLiBVc3VhbGx5IHRoZSBzYW1lIHNjb3BlIHRoZSBhc3BlY3QgaXNcbiAgICogYXBwbGllZCB0by4gSXQgaXMgYSBzZXBhcmF0ZSBhcmd1bWVudCBmcm9tIHRoZSB2aXNpdGVkIG5vZGVzIGJlY2F1c2UgdGhlIGxheWVyIChhbmQsIGluIGBJTl9BQ0NPVU5UYFxuICAgKiBtb2RlLCB0aGUgbmVzdGVkIFNBUiBhcHBsaWNhdGlvbikgaXMgY3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZXZlcnkgZnVuY3Rpb24gdGhlIGFzcGVjdCB2aXNpdHMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBwcm9wczogT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0UHJvcHMpIHtcbiAgICB0aGlzLmluc3RydW1lbnRhdGlvbiA9IG5ldyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24oc2NvcGUsICdPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3QnLCB7XG4gICAgICBza2lwVW5zdXBwb3J0ZWRSdW50aW1lczogdHJ1ZSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5GdW5jdGlvbikge1xuICAgICAgdGhpcy5pbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudChub2RlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
245
+ OdigosInstrumentationAspect[_b] = { fqn: "@odigos/aws-cdk.OdigosInstrumentationAspect", version: "0.0.18" };
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdHJ1bWVudGF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2luc3RydW1lbnRhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLDZDQUF1RTtBQUN2RSxpREFBaUQ7QUFDakQsMkNBQTJDO0FBQzNDLDJDQUFtRDtBQUNuRCx5REFHNEI7QUFDNUIscURBQXVEO0FBQ3ZELHVDQUF5RjtBQUN6RixtQ0FLaUI7QUFFakIsMkVBQTJFO0FBQzNFLE1BQU0sZ0JBQWdCLEdBQUcseUJBQXlCLENBQUM7QUFDbkQsa0VBQWtFO0FBQ2xFLDhGQUE4RjtBQUM5RixNQUFNLGlCQUFpQixHQUFHLHNCQUFzQixDQUFDO0FBRWpEOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsa0JBQWtCLENBQUMsRUFBbUI7SUFDN0MsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUE4QyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsbUJBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4RixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVEsSUFBSSxRQUFRLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQUssQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRixPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztBQUNwQixDQUFDO0FBeUhEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILE1BQWEsMkJBQTRCLFNBQVEsc0JBQVM7SUFLeEQsWUFBWSxLQUFnQixFQUFFLEVBQVUsRUFBRSxLQUF1QztRQUMvRSxLQUFLLENBQUMsS0FBSyxF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N0IsR0FBRyxLQUFLO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVNLEtBQUssQ0FBQyxJQUFnQjtRQUMzQixJQUFJLElBQUksWUFBWSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEMsQ0FBQztJQUNILENBQUM7O0FBbkJILGtFQW9CQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFubm90YXRpb25zLCBJQXNwZWN0LCBTdGFjaywgVG9rZW4sIFRhZ3MgfSBmcm9tICdhd3MtY2RrLWxpYic7XG5pbXBvcnQgKiBhcyBsYW1iZGEgZnJvbSAnYXdzLWNkay1saWIvYXdzLWxhbWJkYSc7XG5pbXBvcnQgKiBhcyBpYW0gZnJvbSAnYXdzLWNkay1saWIvYXdzLWlhbSc7XG5pbXBvcnQgeyBDb25zdHJ1Y3QsIElDb25zdHJ1Y3QgfSBmcm9tICdjb25zdHJ1Y3RzJztcbmltcG9ydCB7XG4gIHJlc29sdmVkU2lnbmFscyxcbiAgcmVuZGVyQ29sbGVjdG9yQ29uZmlnLFxufSBmcm9tICcuL2NvbGxlY3Rvci1jb25maWcnO1xuaW1wb3J0IHsgT2RpZ29zTGF5ZXJSZXNvbHZlciB9IGZyb20gJy4vbGF5ZXItcmVzb2x2ZXInO1xuaW1wb3J0IHsgZGlzdHJpYnV0aW9uUmVjaXBlLCBkaXN0cmlidXRpb25XcmFwcGVyLCBsYW5ndWFnZUZyb21SdW50aW1lIH0gZnJvbSAnLi9ydW50aW1lJztcbmltcG9ydCB7XG4gIE9kaWdvc0Rlc3RpbmF0aW9uLFxuICBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLFxuICBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyxcbiAgT2RpZ29zTGF5ZXJTb3VyY2UsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCDigJQgdGhlIGxheWVyJ3MgZW50cnkgcG9pbnQgaW4gaGFuZGxlciBtb2RlLiAqL1xuY29uc3QgRU5WX0VYRUNfV1JBUFBFUiA9ICdBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUic7XG4vKiogU2VydmljZSBuYW1lIHJlcG9ydGVkIG9uIGV2ZXJ5IHNwYW4sIG1ldHJpYyBhbmQgbG9nIHJlY29yZC4gKi9cbi8qKiBDb21wYWN0IFNESyBhbmQgZGVzdGluYXRpb24gc2V0dGluZ3M7IGFsbCBhdHRyaWJ1dGlvbiBtYXJrZXJzIGFyZSBMYW1iZGEgcmVzb3VyY2UgdGFncy4gKi9cbmNvbnN0IEVOVl9MQU1CREFfQ09ORklHID0gJ09ESUdPU19MQU1CREFfQ09ORklHJztcblxuLyoqXG4gKiBUaGUgc2VydmljZSBhIGZ1bmN0aW9uIHJlcG9ydHMgYXMsIHdoZW4gdGhlIGNhbGxlciBoYXMgbm90IG5hbWVkIG9uZS5cbiAqXG4gKiBSRUFEIEZST00gVEhFIEwxLCBOT1QgRlJPTSBgZm4uZnVuY3Rpb25OYW1lYC4gVGhlIEwyIHByb3BlcnR5IGlzIGEgY3Jvc3MtZW52aXJvbm1lbnQtYXdhcmUgdG9rZW4gdGhhdFxuICogcmVzb2x2ZXMgdG8gYSBgUmVmYCB0byB0aGUgZnVuY3Rpb24gaXRzZWxmIGV2ZW4gd2hlbiB0aGUgc3RhY2sgc2V0IGBmdW5jdGlvbk5hbWVgIGV4cGxpY2l0bHkg4oCUIHNvIHRoZVxuICogb2J2aW91cyBgU3RhY2sub2YoZm4pLnJlc29sdmUoZm4uZnVuY3Rpb25OYW1lKWAgbmV2ZXIgeWllbGRzIGEgbGl0ZXJhbCwgYW5kIGV2ZXJ5IGZ1bmN0aW9uIHNpbGVudGx5IGZlbGxcbiAqIGJhY2sgdG8gaXRzIGNvbnN0cnVjdCBpZC4gYENmbkZ1bmN0aW9uLmZ1bmN0aW9uTmFtZWAgaXMgdGhlIHJhdyB0ZW1wbGF0ZSB2YWx1ZTogdGhlIGxpdGVyYWwgdGhlIHN0YWNrXG4gKiBwYXNzZWQsIG9yIHVuZGVmaW5lZCB3aGVuIENsb3VkRm9ybWF0aW9uIGdlbmVyYXRlcyB0aGUgbmFtZS5cbiAqXG4gKiBXaHkgdGhlIGZhbGxiYWNrIGlzIHRoZSBjb25zdHJ1Y3QgaWQgcmF0aGVyIHRoYW4gdGhlIGdlbmVyYXRlZCBuYW1lOiBhIGdlbmVyYXRlZCBuYW1lIGlzIGEgYFJlZmAgdG8gdGhlXG4gKiBmdW5jdGlvbiwgYW5kIHB1dHRpbmcgdGhhdCBpbiB0aGUgZnVuY3Rpb24ncyBvd24gZW52aXJvbm1lbnQgbWFrZXMgdGhlIHJlc291cmNlIGRlcGVuZCBvbiBpdHMgb3duXG4gKiBjcmVhdGlvbiDigJQgQ2xvdWRGb3JtYXRpb24gcmVqZWN0cyB0aGUgdGVtcGxhdGUgd2l0aCBhIGRlcGVuZGVuY3kgY3ljbGUsIGF0IGRlcGxveSB0aW1lLlxuICpcbiAqIFRoaXMgbWF0dGVycyBiZXlvbmQgY29zbWV0aWNzLiBUaGUgY29ubmVjdG9yIGNvbXBhcmVzIGBPVEVMX1NFUlZJQ0VfTkFNRWAgYWdhaW5zdCB0aGUgd29ya2xvYWQncyBuYW1lIGluXG4gKiBPZGlnb3MsIHdoaWNoIGlzIHRoZSByZWFsIEFXUyBmdW5jdGlvbiBuYW1lLCBzbyBhIGZ1bmN0aW9uIHJlcG9ydGluZyBpdHMgY29uc3RydWN0IGlkIGlzIHJlcG9ydGVkIGFzXG4gKiBkcmlmdGVkIG9uIHRoZSBzZXJ2aWNlLW5hbWUgY29tcG9uZW50LiBOYW1pbmcgdGhlIGZ1bmN0aW9uIGluIHlvdXIgc3RhY2sgaXMgbm93IGVub3VnaCB0byBsaW5lIHRoZSB0d29cbiAqIHVwOyBhIGZ1bmN0aW9uIHdob3NlIG5hbWUgQ2xvdWRGb3JtYXRpb24gZ2VuZXJhdGVzIHN0aWxsIG5lZWRzIGBzZXJ2aWNlTmFtZWAgcGFzc2VkIGV4cGxpY2l0bHkuXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHRTZXJ2aWNlTmFtZShmbjogbGFtYmRhLkZ1bmN0aW9uKTogc3RyaW5nIHtcbiAgY29uc3QgY2ZuID0gZm4ubm9kZS5kZWZhdWx0Q2hpbGQgYXMgbGFtYmRhLkNmbkZ1bmN0aW9uIHwgdW5kZWZpbmVkO1xuICBjb25zdCByZXNvbHZlZCA9IGNmbiA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogU3RhY2sub2YoZm4pLnJlc29sdmUoY2ZuLmZ1bmN0aW9uTmFtZSk7XG4gIGlmICh0eXBlb2YgcmVzb2x2ZWQgPT09ICdzdHJpbmcnICYmIHJlc29sdmVkICE9PSAnJyAmJiAhVG9rZW4uaXNVbnJlc29sdmVkKHJlc29sdmVkKSkge1xuICAgIHJldHVybiByZXNvbHZlZDtcbiAgfVxuICByZXR1cm4gZm4ubm9kZS5pZDtcbn1cblxuLyoqXG4gKiBPcHRpb25zIHNoYXJlZCBieSB0aGUgY29uc3RydWN0IGFuZCB0aGUgYXNwZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge1xuICAvKipcbiAgICogV2hlcmUgdGhlIGluLUxhbWJkYSBjb2xsZWN0b3IgZXhwb3J0cyB0by5cbiAgICovXG4gIHJlYWRvbmx5IGRlc3RpbmF0aW9uOiBPZGlnb3NEZXN0aW5hdGlvbjtcblxuICAvKipcbiAgICogV2hlcmUgdGhlIE9kaWdvcyBsYXllciBjb21lcyBmcm9tLlxuICAgKlxuICAgKiBAZGVmYXVsdCBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDXG4gICAqL1xuICByZWFkb25seSBsYXllclNvdXJjZT86IE9kaWdvc0xheWVyU291cmNlO1xuXG4gIC8qKlxuICAgKiBIYW5kbGVyIG1vZGUgb3Igd2ViLXNlcnZlciAoTGFtYmRhIFdlYiBBZGFwdGVyKSBtb2RlLlxuICAgKlxuICAgKiBUaGVyZSBpcyBubyBhdXRvLWRldGVjdGlvbiwgYW5kIHRoYXQgaXMgZGVsaWJlcmF0ZSByYXRoZXIgdGhhbiBhbiBvbWlzc2lvbjogZGV0ZWN0aW5nIHRoZSB3ZWIgYWRhcHRlclxuICAgKiBtZWFucyBpbnNwZWN0aW5nIHRoZSBmdW5jdGlvbidzIG90aGVyIGxheWVycywgd2hpY2ggYXQgc3ludGggdGltZSBhcmUgZnJlcXVlbnRseSB1bnJlc29sdmVkIHRva2Vucy5cbiAgICogQSBkZXRlY3RvciB0aGF0IGlzIHJpZ2h0IG1vc3Qgb2YgdGhlIHRpbWUgd291bGQgc2lsZW50bHkgYnJlYWsgdGhlIGZ1bmN0aW9ucyBpdCBnb3Qgd3JvbmcuXG4gICAqXG4gICAqIEBkZWZhdWx0IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuSEFORExFUlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kZT86IE9kaWdvc0luc3RydW1lbnRhdGlvbk1vZGU7XG5cbiAgLyoqXG4gICAqIENvbm5lY3RvciBHcmFwaFFMIGRpc3RybyBuYW1lLCBzdWNoIGFzIGphdmEtbGFtYmRhLW90ZWwtYWdlbnQgb3IgamF2YS1sYW1iZGEtb3RlbC13cmFwcGVyLlxuICAgKiBAZGVmYXVsdCAtIHRoZSBidW5kbGVkIGRlZmF1bHQgZGlzdHJpYnV0aW9uIGZvciB0aGUgZnVuY3Rpb24ncyBydW50aW1lXG4gICAqL1xuICByZWFkb25seSBkaXN0cm8/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExlZ2FjeSBsaWdodHdlaWdodCBKYXZhIGhhbmRsZXIgYWRhcHRlci5cbiAgICogQGRlcHJlY2F0ZWQgVXNlIHRoZSBjb3JyZXNwb25kaW5nIGphdmEtbGFtYmRhLW90ZWwtKi13cmFwcGVyIGRpc3Ryby5cbiAgICovXG4gIHJlYWRvbmx5IGphdmFIYW5kbGVyRGlzdHJvPzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm87XG5cbiAgLyoqXG4gICAqIGBPVEVMX1NFUlZJQ0VfTkFNRWAgZm9yIGV2ZXJ5IGZ1bmN0aW9uIHRoaXMgaW5zdHJ1bWVudHMuXG4gICAqXG4gICAqIFVzdWFsbHkgd3JvbmcgdG8gc2V0IHdoZW4gaW5zdHJ1bWVudGluZyBtb3JlIHRoYW4gb25lIGZ1bmN0aW9uIOKAlCB0aGV5IHdvdWxkIGFsbCByZXBvcnQgYXMgdGhlIHNhbWVcbiAgICogc2VydmljZS5cbiAgICpcbiAgICogTGVmdCB1bnNldCwgYSBmdW5jdGlvbiByZXBvcnRzIGFzIGl0cyBleHBsaWNpdGx5LXNldCBwaHlzaWNhbCBuYW1lIGlmIGl0IGhhcyBvbmUsIGFuZCBvdGhlcndpc2UgYXNcbiAgICogaXRzIGNvbnN0cnVjdCBpZC4gSXQgZGVsaWJlcmF0ZWx5IGRvZXMgbm90IGRlZmF1bHQgdG8gdGhlIGdlbmVyYXRlZCBwaHlzaWNhbCBuYW1lOiB0aGF0IHZhbHVlIGlzIGFcbiAgICogYFJlZmAgdG8gdGhlIGZ1bmN0aW9uIGl0c2VsZiwgYW5kIGEgZnVuY3Rpb24gcmVmZXJlbmNpbmcgaXRzZWxmIGluIGl0cyBvd24gZW52aXJvbm1lbnQgaXMgYVxuICAgKiBDbG91ZEZvcm1hdGlvbiBkZXBlbmRlbmN5IGN5Y2xlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBmdW5jdGlvbidzIHBoeXNpY2FsIG5hbWUgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBpdHMgY29uc3RydWN0IGlkXG4gICAqL1xuICByZWFkb25seSBzZXJ2aWNlTmFtZT86IHN0cmluZztcblxuICAvKipcbiAgICogUmFpc2UgaW4tZnVuY3Rpb24gT3BlblRlbGVtZXRyeSB2ZXJib3NpdHkgKGBPVEVMX0xPR19MRVZFTD1kZWJ1Z2ApLlxuICAgKlxuICAgKiBUaGUgbGF5ZXIsIFNESyBhbmQgY29sbGVjdG9yIHRoZW4gZW1pdCBzcGFuIGFuZCBPVExQLWV4cG9ydCBkaWFnbm9zdGljcyBpbnRvIHRoZSBmdW5jdGlvbidzIENsb3VkV2F0Y2hcbiAgICogbG9nIGdyb3VwLiBVc2VmdWwgd2hpbGUgd2lyaW5nIHVwIGEgZGVzdGluYXRpb24sIGV4cGVuc2l2ZSB0byBsZWF2ZSBvbi5cbiAgICpcbiAgICogSGFzIG5vIGVmZmVjdCBpbiB3ZWItc2VydmVyIG1vZGUsIG1hdGNoaW5nIHRoZSBjb25uZWN0b3IsIHdoaWNoIG5ldmVyIHNldHMgYSBsb2cgbGV2ZWwgdGhlcmUuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBkZWJ1Zz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEF0dGFjaCB0aGlzIGxheWVyIGluc3RlYWQgb2YgcmVzb2x2aW5nIG9uZS4gT3ZlcnJpZGVzIGBsYXllclNvdXJjZWAgZW50aXJlbHkuXG4gICAqXG4gICAqIFRoZSBlc2NhcGUgaGF0Y2ggZm9yIGEgbGF5ZXIgbWlycm9yZWQgaW50byBhIHByaXZhdGUgcmVnaXN0cnkgb3IgYW4gaW50ZXJuYWwgYWNjb3VudC4gVGhlIGxheWVyIG11c3RcbiAgICogaGF2ZSB0aGUgc2FtZSBjb250ZW50cyBhcyB0aGUgT2RpZ29zIG9uZSDigJQgdGhlIGVudmlyb25tZW50IHNldCBoZXJlIGFzc3VtZXMgaXRzIGV4YWN0IHNjcmlwdCBsYXlvdXQuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gcmVzb2x2ZWQgZnJvbSBsYXllclNvdXJjZVxuICAgKi9cbiAgcmVhZG9ubHkgbGF5ZXJWZXJzaW9uPzogbGFtYmRhLklMYXllclZlcnNpb247XG5cbiAgLyoqXG4gICAqIEFyY2hpdGVjdHVyZS1tYXRjaGVkIGNvbGxlY3RvciBsYXllciB3aGVuIHN1cHBseWluZyBhIGN1c3RvbSBBRE9UIFNESyBsYXllci5cbiAgICogVXBzdHJlYW0gU0RLIGxheWVycyBhbHJlYWR5IGluY2x1ZGUgdGhlaXIgY29sbGVjdG9yIGFuZCBkbyBub3QgdXNlIHRoaXMgb3B0aW9uLlxuICAgKiBAZGVmYXVsdCAtIHJlc29sdmVkIGZyb20gbGF5ZXJTb3VyY2UgZm9yIEFET1RcbiAgICovXG4gIHJlYWRvbmx5IGNvbGxlY3RvckxheWVyVmVyc2lvbj86IGxhbWJkYS5JTGF5ZXJWZXJzaW9uO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgdGhlIGZ1bmN0aW9uIGFscmVhZHkgbmVlZHMgaW4gaXRzIGxhbmd1YWdlIGxvYWRlciB2YXJpYWJsZSAoYE5PREVfT1BUSU9OU2AsXG4gICAqIGBKQVZBX1RPT0xfT1BUSU9OU2Agb3IgYFBZVEhPTlBBVEhgKSwgd2hpY2ggdGhlIE9kaWdvcyBsb2FkZXIgaXMgam9pbmVkIHRvIHJhdGhlciB0aGFuIHJlcGxhY2luZy5cbiAgICpcbiAgICogT25seSB1c2VkIGluIHdlYi1zZXJ2ZXIgbW9kZS4gSXQgaGFzIHRvIGJlIHBhc3NlZCBleHBsaWNpdGx5IGJlY2F1c2UgQ0RLJ3MgYGxhbWJkYS5GdW5jdGlvbmAgZXhwb3Nlc1xuICAgKiBubyB3YXkgdG8gcmVhZCBiYWNrIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBlbHNld2hlcmUgaW4gdGhlIGFwcCDigJQgYW4gb21pdHRlZCB2YWx1ZSBoZXJlIGlzXG4gICAqIHNpbGVudGx5IG92ZXJ3cml0dGVuLCB3aGljaCBmb3IgYE5PREVfT1BUSU9OU2AgY2FuIG1lYW4gbG9zaW5nIGEgZmxhZyB0aGUgYXBwIG5lZWRzIHRvIGJvb3QuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gdGhlIGxvYWRlciB2YXJpYWJsZSBpcyBzZXQgdG8gdGhlIE9kaWdvcyB2YWx1ZSBhbG9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZXhpc3RpbmdMb2FkZXJWYWx1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogU2tpcCBmdW5jdGlvbnMgd2hvc2UgcnVudGltZSBoYXMgbm8gT3BlblRlbGVtZXRyeSBMYW1iZGEgbGF5ZXIgaW5zdGVhZCBvZiB0aHJvd2luZy5cbiAgICpcbiAgICogYGRvdG5ldCpgIGFuZCBgcHJvdmlkZWQuKmAgKEdvLCBjdXN0b20gcnVudGltZXMpIGhhdmUgbm8gbGFuZ3VhZ2UgbGF5ZXIgdXBzdHJlYW0uIEV4cGxpY2l0bHlcbiAgICogaW5zdHJ1bWVudGluZyBvbmUgaXMgYSBtaXN0YWtlIHdvcnRoIGZhaWxpbmcgb247IHN3ZWVwaW5nIGEgd2hvbGUgc3RhY2sgd2l0aCB0aGUgYXNwZWN0IGFuZCBoaXR0aW5nXG4gICAqIG9uZSBpcyBub3QsIHdoaWNoIGlzIHdoeSB0aGUgYXNwZWN0IGRlZmF1bHRzIHRoaXMgdG8gYHRydWVgIGFuZCB0aGUgY29uc3RydWN0IHRvIGBmYWxzZWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBza2lwVW5zdXBwb3J0ZWRSdW50aW1lcz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogUHJvcHMgZm9yIHtAbGluayBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb259LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvblByb3BzIGV4dGVuZHMgT2RpZ29zSW5zdHJ1bWVudGF0aW9uT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBGdW5jdGlvbnMgdG8gaW5zdHJ1bWVudCBvbiBjb25zdHJ1Y3Rpb24uIE1vcmUgY2FuIGJlIGFkZGVkIHdpdGggYGluc3RydW1lbnQoKWAuXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gbm9uZVxuICAgKi9cbiAgcmVhZG9ubHkgZnVuY3Rpb25zPzogbGFtYmRhLkZ1bmN0aW9uW107XG59XG5cbi8qKlxuICogSW5zdHJ1bWVudHMgQVdTIExhbWJkYSBmdW5jdGlvbnMgd2l0aCB0aGUgT2RpZ29zIE9wZW5UZWxlbWV0cnkgbGF5ZXIuXG4gKlxuICogYGBgdHNcbiAqIGNvbnN0IG9kaWdvcyA9IG5ldyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24odGhpcywgJ09kaWdvcycsIHtcbiAqICAgZGVzdGluYXRpb246IHsgZW5kcG9pbnQ6ICdvdGxwLmV4YW1wbGUuY29tOjQzMTcnIH0sXG4gKiAgIGZ1bmN0aW9uczogW2FwaUZuLCB3b3JrZXJGbl0sXG4gKiB9KTtcbiAqIG9kaWdvcy5pbnN0cnVtZW50KGFub3RoZXJGbik7XG4gKiBgYGBcbiAqXG4gKiBXaGF0IGl0IGRvZXMgdG8gZWFjaCBmdW5jdGlvbjogYXR0YWNoZXMgdGhlIGxheWVyIGZvciB0aGUgZnVuY3Rpb24ncyBsYW5ndWFnZSBhbmQgYXJjaGl0ZWN0dXJlLCBzZXRzXG4gKiBgQVdTX0xBTUJEQV9FWEVDX1dSQVBQRVJgIGFuZCBjb21wYWN0IGBPRElHT1NfTEFNQkRBX0NPTkZJR2AuIFRoZSBsYXllciBidWlsZHMgdGhlIFNESyBlbnZpcm9ubWVudCBhbmRcbiAqIGNvbGxlY3RvciBwaXBlbGluZXMgYXQgc3RhcnR1cDsgb3duZXJzaGlwIGFuZCBleGFjdCBsYXllciBhdHRyaWJ1dGlvbiBhcmUgcmVjb3JkZWQgaW4gcmVzb3VyY2UgdGFncy5cbiAqXG4gKiBUaGUgZnVuY3Rpb24ncyBTREsgZXhwb3J0cyB0byB0aGUgY29sbGVjdG9yIG9uIGxvY2FsaG9zdCwgbm90IHRvIHlvdXIgZGVzdGluYXRpb24uIFRoZSBjb2xsZWN0b3JcbiAqIGZvcndhcmRzIGFmdGVyIHRoZSBoYW5kbGVyIGhhcyBhbHJlYWR5IHJldHVybmVkLCBzbyBhIHNsb3cgZGVzdGluYXRpb24gY29zdHMgYmlsbGVkIGR1cmF0aW9uIHJhdGhlclxuICogdGhhbiBjYWxsZXIgbGF0ZW5jeS5cbiAqXG4gKiAjIyBEbyBub3QgYWxzbyBpbnN0cnVtZW50IHRoZXNlIGZ1bmN0aW9ucyB3aXRoIHRoZSBjb25uZWN0b3JcbiAqXG4gKiBUaGUgT2RpZ29zIEFXUyBjb25uZWN0b3IgaW5zdHJ1bWVudHMgbGl2ZSBmdW5jdGlvbnMgYnkgbXV0YXRpbmcgdGhlbSwgYW5kIHJlY29uY2lsZXMgdGhlbSBiYWNrIHRvIGl0c1xuICogb3duIGRlc2lyZWQgc3RhdGUgb24gZXZlcnkgcGFzcy4gQSBmdW5jdGlvbiBpbnN0cnVtZW50ZWQgaGVyZSBhbmQgYWxzbyBlbmFibGVkIGFzIGEgY29ubmVjdG9yIHNvdXJjZVxuICogZW5kcyB1cCBvd25lZCBieSBib3RoOiBlYWNoIGBjZGsgZGVwbG95YCByZWFzc2VydHMgdGhlIENESydzIGVudmlyb25tZW50LCBlYWNoIHJlY29uY2lsZSByZWFzc2VydHMgdGhlXG4gKiBjb25uZWN0b3IncywgYW5kIGV2ZXJ5IHJvdW5kIHRyaXAgcHVibGlzaGVzIGEgbmV3IGZ1bmN0aW9uIHZlcnNpb24uXG4gKlxuICogQ2hvb3NlIG9uZSBwZXIgZnVuY3Rpb24uIFRoaXMgY29uc3RydWN0IHdyaXRlcyBgb2RpZ29zOmlhY2AgcmVzb3VyY2UgdGFncyBhbmQgbmV2ZXIgdGhlIGNvbm5lY3RvcidzIGBvZGlnb3M6bWFuYWdlZGBcbiAqIG93bmVyc2hpcCB0YWcsIHNvIGFuIElhQy1pbnN0cnVtZW50ZWQgZnVuY3Rpb24gcmVwb3J0cyBhcyBpbnN0cnVtZW50ZWQgYnV0IGlzIG5vdCBvbmUgdGhlIGNvbm5lY3RvclxuICogd2lsbCByb2xsIGJhY2sg4oCUIHRob3VnaCBpdCB3aWxsIGhhcHBpbHkgdGFrZSBpdCBvdmVyIGlmIHlvdSBlbmFibGUgaXQgYXMgYSBzb3VyY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24gZXh0ZW5kcyBDb25zdHJ1Y3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IG9wdGlvbnM6IE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnM7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IE9kaWdvc0xheWVyUmVzb2x2ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgaW5zdHJ1bWVudGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3Ioc2NvcGU6IENvbnN0cnVjdCwgaWQ6IHN0cmluZywgcHJvcHM6IE9kaWdvc0xhbWJkYUluc3RydW1lbnRhdGlvblByb3BzKSB7XG4gICAgc3VwZXIoc2NvcGUsIGlkKTtcblxuICAgIHRoaXMub3B0aW9ucyA9IHByb3BzO1xuICAgIHRoaXMucmVzb2x2ZXIgPSBuZXcgT2RpZ29zTGF5ZXJSZXNvbHZlcih0aGlzLCBwcm9wcy5sYXllclNvdXJjZSA/PyBPZGlnb3NMYXllclNvdXJjZS5PRElHT1NfUFVCTElDKTtcblxuICAgIC8vIFJlbmRlcmVkIG9uY2UuIEl0IGRlcGVuZHMgb25seSBvbiB0aGUgZGVzdGluYXRpb24sIGFuZCByZW5kZXJpbmcgaXQgcGVyIGZ1bmN0aW9uIHdvdWxkIG1ha2UgYW5cbiAgICAvLyBhY2NpZGVudGFsIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gZnVuY3Rpb25zIHBvc3NpYmxlLlxuICAgIHJlbmRlckNvbGxlY3RvckNvbmZpZyhwcm9wcy5kZXN0aW5hdGlvbik7XG5cbiAgICAvLyBBIHdhcm5pbmcgcmF0aGVyIHRoYW4gYW4gZXJyb3IsIGJlY2F1c2UgYSBjb2xsZWN0b3IgQ0FOIGJlIHJlYWNoZWQgb3ZlciBnUlBDIG9uIGEgbm9uLXN0YW5kYXJkIHBvcnQg4oCUXG4gICAgLy8gYnV0IHRoZSBvdmVyd2hlbG1pbmdseSBsaWtlbGllciByZWFkaW5nIG9mIGBlbmRwb2ludDogXCJob3N0OjQzMThcImAgaXMgYW4gT1RMUC9IVFRQIGVuZHBvaW50IHBhc3NlZCB0b1xuICAgIC8vIHRoZSBnUlBDIGV4cG9ydGVyLCB3aGljaCBidWlsZHMsIHN0YXJ0cywgYW5kIHRoZW4gbmV2ZXIgZGVsaXZlcnMgYSBiYXRjaC4gU2lsZW50IGZvciB0aGUgY2FsbGVyIHdob1xuICAgIC8vIG1lYW50IGl0OyBsb3VkIGZvciB0aGUgb25lIHdobyBkaWQgbm90LlxuICAgIGlmIChwcm9wcy5kZXN0aW5hdGlvbi5lbmRwb2ludD8uZW5kc1dpdGgoJzo0MzE4JykpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgJ0BvZGlnb3MvYXdzLWNkazpwcm9iYWJsZUh0dHBFbmRwb2ludCcsXG4gICAgICAgIGBPZGlnb3M6IGRlc3RpbmF0aW9uIGVuZHBvaW50IFwiJHtwcm9wcy5kZXN0aW5hdGlvbi5lbmRwb2ludH1cIiBpcyBvbiA0MzE4LCB0aGUgT1RMUC9IVFRQIHBvcnQsIGJ1dCBgICtcbiAgICAgICAgICAnYGVuZHBvaW50YCBjb25maWd1cmVzIHRoZSBnUlBDIGV4cG9ydGVyIChjb252ZW50aW9uYWxseSA0MzE3KS4gSWYgdGhhdCBpcyBhbiBPVExQL0hUVFAgY29sbGVjdG9yLCAnICtcbiAgICAgICAgICAncGFzcyBpdCBhcyBgaHR0cEVuZHBvaW50OiBcImh0dHA6Ly9ob3N0OjQzMThcImAgaW5zdGVhZCDigJQgdGhlIGdSUEMgZXhwb3J0ZXIgd2lsbCBleHBvcnQgbm90aGluZyB0byBpdC4nLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKHByb3BzLmRlc3RpbmF0aW9uLmh0dHBFbmRwb2ludD8uZW5kc1dpdGgoJzo0MzE3JykpIHtcbiAgICAgIEFubm90YXRpb25zLm9mKHRoaXMpLmFkZFdhcm5pbmdWMihcbiAgICAgICAgJ0BvZGlnb3MvYXdzLWNkazpwcm9iYWJsZUdycGNFbmRwb2ludCcsXG4gICAgICAgIGBPZGlnb3M6IGRlc3RpbmF0aW9uIGh0dHBFbmRwb2ludCBcIiR7cHJvcHMuZGVzdGluYXRpb24uaHR0cEVuZHBvaW50fVwiIGlzIG9uIDQzMTcsIHRoZSBPVExQL2dSUEMgcG9ydCwgYCArXG4gICAgICAgICAgJ2J1dCBgaHR0cEVuZHBvaW50YCBjb25maWd1cmVzIHRoZSBIVFRQIGV4cG9ydGVyIChjb252ZW50aW9uYWxseSA0MzE4KS4gSWYgdGhhdCBpcyBhIGdSUEMgY29sbGVjdG9yLCAnICtcbiAgICAgICAgICAncGFzcyBpdCBhcyBgZW5kcG9pbnQ6IFwiaG9zdDo0MzE3XCJgIGluc3RlYWQuJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBmbiBvZiBwcm9wcy5mdW5jdGlvbnMgPz8gW10pIHtcbiAgICAgIHRoaXMuaW5zdHJ1bWVudChmbik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEluc3RydW1lbnRzIG9uZSBmdW5jdGlvbi4gSWRlbXBvdGVudCDigJQgaW5zdHJ1bWVudGluZyB0aGUgc2FtZSBmdW5jdGlvbiB0d2ljZSBpcyBhIG5vLW9wIHJhdGhlciB0aGFuIGFcbiAgICogZG91YmxlZCBsb2FkZXIgdmFsdWUuXG4gICAqL1xuICBwdWJsaWMgaW5zdHJ1bWVudChmbjogbGFtYmRhLkZ1bmN0aW9uKTogdm9pZCB7XG4gICAgY29uc3Qga2V5ID0gZm4ubm9kZS5wYXRoO1xuICAgIGlmICh0aGlzLmluc3RydW1lbnRlZC5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHJ1bnRpbWVOYW1lID0gZm4ucnVudGltZS5uYW1lO1xuICAgIGNvbnN0IGxhbmd1YWdlID0gbGFuZ3VhZ2VGcm9tUnVudGltZShydW50aW1lTmFtZSk7XG4gICAgaWYgKCFsYW5ndWFnZSkge1xuICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgIGBPZGlnb3M6IHJ1bnRpbWUgXCIke3J1bnRpbWVOYW1lfVwiIGhhcyBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYXllciBgICtcbiAgICAgICAgJyh1cHN0cmVhbSBwdWJsaXNoZXMgbGF5ZXJzIGZvciBweXRob24sIG5vZGVqcywgamF2YSBhbmQgcnVieSBvbmx5KSwgc28gdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgaW5zdHJ1bWVudGVkLic7XG4gICAgICBpZiAodGhpcy5vcHRpb25zLnNraXBVbnN1cHBvcnRlZFJ1bnRpbWVzKSB7XG4gICAgICAgIEFubm90YXRpb25zLm9mKGZuKS5hZGRXYXJuaW5nVjIoJ0BvZGlnb3MvYXdzLWNkazp1bnN1cHBvcnRlZFJ1bnRpbWUnLCBgJHttZXNzYWdlfSBTa2lwcGluZy5gKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21lc3NhZ2V9IFNldCBza2lwVW5zdXBwb3J0ZWRSdW50aW1lczogdHJ1ZSB0byBza2lwIGl0IGluc3RlYWQuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVjaXBlID0gZGlzdHJpYnV0aW9uUmVjaXBlKGxhbmd1YWdlLCB0aGlzLm9wdGlvbnMuZGlzdHJvLCBydW50aW1lTmFtZSk7XG4gICAgZGlzdHJpYnV0aW9uV3JhcHBlcihsYW5ndWFnZSwgdGhpcy5vcHRpb25zLmRpc3RybywgdGhpcy5vcHRpb25zLmphdmFIYW5kbGVyRGlzdHJvLCB0aGlzLm9wdGlvbnMubW9kZSA9PT0gT2RpZ29zSW5zdHJ1bWVudGF0aW9uTW9kZS5XRUJfU0VSVkVSKTtcbiAgICBpZiAocmVjaXBlLmFwcGxpY2F0aW9uU2lnbmFscyAmJiAhcmVzb2x2ZWRTaWduYWxzKHRoaXMub3B0aW9ucy5kZXN0aW5hdGlvbikudHJhY2VzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0FET1QgKyBBcHBsaWNhdGlvbiBTaWduYWxzIHJlcXVpcmVzIHRyYWNlcyB0byBiZSBlbmFibGVkIGZvciB0aGUgZGVzdGluYXRpb24uJyk7XG4gICAgfVxuICAgIGlmIChyZWNpcGUuYXBwbGljYXRpb25TaWduYWxzKSB7XG4gICAgICBmbi5yb2xlPy5hZGRNYW5hZ2VkUG9saWN5KGlhbS5NYW5hZ2VkUG9saWN5LmZyb21Bd3NNYW5hZ2VkUG9saWN5TmFtZSgnQ2xvdWRXYXRjaExhbWJkYUFwcGxpY2F0aW9uU2lnbmFsc0V4ZWN1dGlvblJvbGVQb2xpY3knKSk7XG4gICAgICBBbm5vdGF0aW9ucy5vZihmbikuYWRkV2FybmluZ1YyKCdAb2RpZ29zL2F3cy1jZGs6YXBwbGljYXRpb25TaWduYWxzJyxcbiAgICAgICAgJ0VuYWJsZSBDbG91ZFdhdGNoIEFwcGxpY2F0aW9uIFNpZ25hbHMgc2VydmljZSBkaXNjb3Zlcnkgb25jZSBpbiB0aGlzIEFXUyBhY2NvdW50IGFuZCByZWdpb24uIEFwcGxpY2F0aW9uIFNpZ25hbHMgYWxzbyBzZW5kcyBBV1Mgc2VydmljZSB0ZWxlbWV0cnkgdGhyb3VnaCB0aGUgTGFtYmRhIGVtYmVkZGVkIGFnZW50LicpO1xuICAgIH1cblxuICAgIGNvbnN0IHJlc291cmNlPWZuLm5vZGUuZGVmYXVsdENoaWxkIGFzIGxhbWJkYS5DZm5GdW5jdGlvbjtcbiAgICByZXNvdXJjZS5hZGRQcm9wZXJ0eURlbGV0aW9uT3ZlcnJpZGUoJ0Vudmlyb25tZW50LlZhcmlhYmxlcy5PRElHT1NfTUFOQUdFRCcpO1xuICAgIHJlc291cmNlLmFkZFByb3BlcnR5RGVsZXRpb25PdmVycmlkZSgnRW52aXJvbm1lbnQuVmFyaWFibGVzLk9ESUdPU19JQUMnKTtcbiAgICB0aGlzLmluc3RydW1lbnRlZC5hZGQoa2V5KTtcblxuICAgIGNvbnN0IGFyY2hpdGVjdHVyZSA9IGZuLmFyY2hpdGVjdHVyZS5uYW1lO1xuICAgIGNvbnN0IGxheWVyID0gdGhpcy5vcHRpb25zLmxheWVyVmVyc2lvbiA/PyB0aGlzLnJlc29sdmVyLnJlc29sdmUocmVjaXBlLmFydGlmYWN0ID8/IGxhbmd1YWdlLCBhcmNoaXRlY3R1cmUpO1xuICAgIGNvbnN0IGNvbGxlY3RvckxheWVyID0gcmVjaXBlLmFydGlmYWN0ID8gKHRoaXMub3B0aW9ucy5jb2xsZWN0b3JMYXllclZlcnNpb24gPz8gdGhpcy5yZXNvbHZlci5yZXNvbHZlKCdhZG90LWNvbGxlY3RvcicsIGFyY2hpdGVjdHVyZSkpIDogdW5kZWZpbmVkO1xuICAgIGZuLmFkZExheWVycyguLi4oY29sbGVjdG9yTGF5ZXIgPyBbbGF5ZXIsIGNvbGxlY3RvckxheWVyXSA6IFtsYXllcl0pKTtcblxuICAgIC8vIFRoZSBBUk4sIG5vdCB0aGUgY29uc3RydWN0OiB0aGUgbWFya2VyIGhhcyB0byBuYW1lIHRoZSBleGFjdCBsYXllciB2ZXJzaW9uIHRoZSBmdW5jdGlvbiBjYXJyaWVzLCBhbmRcbiAgICAvLyBpbiBJTl9BQ0NPVU5UIG1vZGUgdGhhdCBpcyBhIG5lc3RlZC1zdGFjayBvdXRwdXQgcmVmZXJlbmNlIHJlc29sdmVkIGF0IGRlcGxveSB0aW1lLlxuICAgIGZvciAoY29uc3QgW25hbWUsIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmVudmlyb25tZW50Rm9yKGZuLCBsYW5ndWFnZSwgbGF5ZXIubGF5ZXJWZXJzaW9uQXJuLCBjb2xsZWN0b3JMYXllcj8ubGF5ZXJWZXJzaW9uQXJuKSkpIHtcbiAgICAgIGZuLmFkZEVudmlyb25tZW50KG5hbWUsIHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogSW5zdHJ1bWVudHMgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIGxpc3QuICovXG4gIHB1YmxpYyBpbnN0cnVtZW50QWxsKGZ1bmN0aW9uczogbGFtYmRhLkZ1bmN0aW9uW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGZuIG9mIGZ1bmN0aW9ucykge1xuICAgICAgdGhpcy5pbnN0cnVtZW50KGZuKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhlIGVudmlyb25tZW50IGFwcGxpZWQgdG8gb25lIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBNaXJyb3JzIGBhcHBseUhhbmRsZXJFbnZgIC8gYGFwcGx5V2ViU2VydmVyRW52YCBpbiB0aGUgY29ubmVjdG9yLCBpbmNsdWRpbmcgd2hhdCBpcyBkZWxpYmVyYXRlbHkgTk9UXG4gICAqIHNldDogYE9URUxfRVhQT1JURVJfT1RMUF9FTkRQT0lOVGAgc3RheXMgdW5zZXQgc28gdGhlIFNESyBrZWVwcyBleHBvcnRpbmcgdG8gdGhlIGluLUxhbWJkYSBjb2xsZWN0b3JcbiAgICogb24gbG9jYWxob3N0IHJhdGhlciB0aGFuIGJsb2NraW5nIHRoZSBpbnZvY2F0aW9uIG9uIHRoZSByZW1vdGUgZGVzdGluYXRpb24sIGFuZCBldmVyeSBzaWduYWwgZXhwb3J0ZXIgaXMgc2VsZWN0ZWQgZXhwbGljaXRseS5cbiAgICovXG4gIHByaXZhdGUgZW52aXJvbm1lbnRGb3IoZm46IGxhbWJkYS5GdW5jdGlvbiwgbGFuZ3VhZ2U6IHN0cmluZywgbGF5ZXJBcm46IHN0cmluZywgY29sbGVjdG9yTGF5ZXJBcm4/OiBzdHJpbmcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBjb25zdCB7IGRlc3RpbmF0aW9uLCBtb2RlLCBkZWJ1Zywgc2VydmljZU5hbWUsIGphdmFIYW5kbGVyRGlzdHJvLCBkaXN0cm8sIGV4aXN0aW5nTG9hZGVyVmFsdWUgfSA9IHRoaXMub3B0aW9ucztcbiAgICBjb25zdCB3ZWJTZXJ2ZXIgPSBtb2RlID09PSBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLldFQl9TRVJWRVI7XG5cbiAgICBjb25zdCByZWNpcGUgPSBkaXN0cmlidXRpb25SZWNpcGUobGFuZ3VhZ2UsIGRpc3RybywgZm4ucnVudGltZS5uYW1lKTtcbiAgICBjb25zdCBzaWduYWxzID0gcmVzb2x2ZWRTaWduYWxzKGRlc3RpbmF0aW9uKTtcbiAgICBjb25zdCByZXNvdXJjZSA9IGZuLm5vZGUuZGVmYXVsdENoaWxkIGFzIGxhbWJkYS5DZm5GdW5jdGlvbjtcbiAgICBjb25zdCBjdXJyZW50ID0gU3RhY2sub2YoZm4pLnJlc29sdmUocmVzb3VyY2UuZW52aXJvbm1lbnQpIGFzIGxhbWJkYS5DZm5GdW5jdGlvbi5FbnZpcm9ubWVudFByb3BlcnR5IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IG9yaWdpbmFsV3JhcHBlciA9IChjdXJyZW50Py52YXJpYWJsZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPiB8IHVuZGVmaW5lZCk/LkFXU19MQU1CREFfRVhFQ19XUkFQUEVSID8/ICcnO1xuICAgIGNvbnN0IGV4ZWNXcmFwcGVyID0gd2ViU2VydmVyID8gJy9vcHQvb2RpZ29zLXdlYnNlcnZlcicgOiBkaXN0cmlidXRpb25XcmFwcGVyKGxhbmd1YWdlLCBkaXN0cm8sIGphdmFIYW5kbGVyRGlzdHJvLCBmYWxzZSk7XG4gICAgY29uc3QgZnVuY3Rpb25Mb2dzID0gc2lnbmFscy5sb2dzICYmICF3ZWJTZXJ2ZXIgJiYgKGxhbmd1YWdlID09PSAncnVieScgfHwgKGxhbmd1YWdlID09PSAnamF2YScgJiZcbiAgICAgIFsnL29wdC9vdGVsLWhhbmRsZXInLCAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLCAnL29wdC9vdGVsLXNxcy1oYW5kbGVyJywgJy9vcHQvb3RlbC1zdHJlYW0taGFuZGxlciddLmluY2x1ZGVzKGV4ZWNXcmFwcGVyKSkpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIHY6IDEsXG4gICAgICBzOiBzZXJ2aWNlTmFtZSA/PyBkZWZhdWx0U2VydmljZU5hbWUoZm4pLFxuICAgICAgdDogKHNpZ25hbHMudHJhY2VzID8gMSA6IDApIHwgKHNpZ25hbHMubWV0cmljcyA/IDIgOiAwKSB8IChzaWduYWxzLmxvZ3MgPyA0IDogMCksXG4gICAgICBlOiBkZXN0aW5hdGlvbi5lbmRwb2ludCA/PyBkZXN0aW5hdGlvbi5odHRwRW5kcG9pbnQsXG4gICAgICAuLi4oZGVzdGluYXRpb24uaHR0cEVuZHBvaW50ID8geyBwOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4oZGVzdGluYXRpb24uZW5kcG9pbnQgJiYgZGVzdGluYXRpb24uaW5zZWN1cmUgPyB7IGk6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLihkZXN0aW5hdGlvbi5oZWFkZXJzICYmIE9iamVjdC5rZXlzKGRlc3RpbmF0aW9uLmhlYWRlcnMpLmxlbmd0aCA/IHsgaDogZGVzdGluYXRpb24uaGVhZGVycyB9IDoge30pLFxuICAgICAgLi4uKHJlY2lwZS5hcHBsaWNhdGlvblNpZ25hbHMgPyB7IGE6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLihmdW5jdGlvbkxvZ3MgPyB7IGw6IHRydWUgfSA6IHt9KSxcbiAgICAgIC4uLihkZWJ1ZyAmJiAhd2ViU2VydmVyID8geyBkOiB0cnVlIH0gOiB7fSksXG4gICAgICAuLi4od2ViU2VydmVyID8geyB3OiBvcmlnaW5hbFdyYXBwZXIgfSA6IHt9KSxcbiAgICB9O1xuICAgIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgIFtFTlZfRVhFQ19XUkFQUEVSXTogZXhlY1dyYXBwZXIsXG4gICAgICBbRU5WX0xBTUJEQV9DT05GSUddOiBKU09OLnN0cmluZ2lmeShjb25maWcpLFxuICAgIH07XG4gICAgVGFncy5vZihmbikuYWRkKCdvZGlnb3M6aWFjJywgJ3YxJyk7XG4gICAgVGFncy5vZihmbikuYWRkKCdvZGlnb3M6c2RrLWxheWVyJywgbGF5ZXJBcm4pO1xuICAgIGlmIChjb2xsZWN0b3JMYXllckFybikgVGFncy5vZihmbikuYWRkKCdvZGlnb3M6Y29sbGVjdG9yLWxheWVyJywgY29sbGVjdG9yTGF5ZXJBcm4pO1xuICAgIC8vIEV4cGxpY2l0IGN1c3RvbWVyIGxvYWRlciBvcHRpb25zIHJlbWFpbiBvcmRpbmFyeSBjdXN0b21lciBlbnZpcm9ubWVudCB2YWx1ZXMuXG4gICAgaWYgKHdlYlNlcnZlciAmJiBleGlzdGluZ0xvYWRlclZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IGxvYWRlcktleSA9IHsgamF2YTogJ0pBVkFfVE9PTF9PUFRJT05TJywgbm9kZWpzOiAnTk9ERV9PUFRJT05TJywgcHl0aG9uOiAnUFlUSE9OUEFUSCcgfVtsYW5ndWFnZV07XG4gICAgICBpZiAobG9hZGVyS2V5KSBlbnZbbG9hZGVyS2V5XSA9IGV4aXN0aW5nTG9hZGVyVmFsdWU7XG4gICAgfVxuICAgIGlmIChsYW5ndWFnZSA9PT0gJ3J1YnknICYmIHNpZ25hbHMubWV0cmljcykge1xuICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnJ1YnlTaWduYWxzVW5zdXBwb3J0ZWQnLFxuICAgICAgICAnVGhlIGJ1bmRsZWQgUnVieSBMYW1iZGEgU0RLIGNhbm5vdCBnZW5lcmF0ZSBPVExQIG1ldHJpY3MuIEZ1bmN0aW9uIHN0ZG91dC9zdGRlcnIgbG9ncyBhcmUgY29sbGVjdGVkIGJ5IHRoZSBMYW1iZGEgY29sbGVjdG9yIHdoZW4gbG9ncyBhcmUgc2VsZWN0ZWQuJyk7XG4gICAgfVxuICAgIGlmIChkZXN0aW5hdGlvbi5wcm9maWxlcykge1xuICAgICAgQW5ub3RhdGlvbnMub2YoZm4pLmFkZFdhcm5pbmdWMignQG9kaWdvcy9hd3MtY2RrOnByb2ZpbGVzVW5zdXBwb3J0ZWQnLFxuICAgICAgICAnVGhlIGJ1bmRsZWQgTGFtYmRhIGxhbmd1YWdlIGFnZW50cyBkbyBub3QgZ2VuZXJhdGUgT1RMUCBwcm9maWxlcy4gT3RoZXIgc2VsZWN0ZWQgc2lnbmFscyByZW1haW4gZW5hYmxlZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudjtcbiAgfVxufVxuXG4vKipcbiAqIFByb3BzIGZvciB7QGxpbmsgT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3RQcm9wcyBleHRlbmRzIE9kaWdvc0luc3RydW1lbnRhdGlvbk9wdGlvbnMge31cblxuLyoqXG4gKiBBcHBsaWVzIE9kaWdvcyBpbnN0cnVtZW50YXRpb24gdG8gZXZlcnkgYGxhbWJkYS5GdW5jdGlvbmAgaW4gYSBzY29wZS5cbiAqXG4gKiBgYGB0c1xuICogQXNwZWN0cy5vZihzdGFjaykuYWRkKG5ldyBPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3Qoc3RhY2ssIHtcbiAqICAgZGVzdGluYXRpb246IHsgZW5kcG9pbnQ6ICdvdGxwLmV4YW1wbGUuY29tOjQzMTcnIH0sXG4gKiB9KSk7XG4gKiBgYGBcbiAqXG4gKiBgc2tpcFVuc3VwcG9ydGVkUnVudGltZXNgIGRlZmF1bHRzIHRvIGB0cnVlYCBoZXJlLCB1bmxpa2UgdGhlIGNvbnN0cnVjdDogYW4gYXNwZWN0IHZpc2l0cyBldmVyeSBmdW5jdGlvblxuICogaW4gdGhlIHNjb3BlLCBpbmNsdWRpbmcgb25lcyB3aG9zZSBydW50aW1lIGhhcyBubyBPcGVuVGVsZW1ldHJ5IGxheWVyLCBhbmQgZmFpbGluZyB0aGUgd2hvbGUgc3ludGhcbiAqIGJlY2F1c2UgYSBzdGFjayBoYXBwZW5zIHRvIGNvbnRhaW4gb25lIEdvIGZ1bmN0aW9uIGlzIG5vdCB1c2VmdWwuIEVhY2ggc2tpcCBpcyByZXBvcnRlZCBhcyBhIHN5bnRoXG4gKiB3YXJuaW5nLCBzbyBpdCBpcyB2aXNpYmxlIHJhdGhlciB0aGFuIHNpbGVudC5cbiAqXG4gKiBUaGUgYXNwZWN0IGluc3RydW1lbnRzIHdoYXQgZXhpc3RzIGluIHRoZSB0cmVlIHdoZW4gaXQgcnVucy4gQSBmdW5jdGlvbiBhZGRlZCBieSBhIGxhdGVyIGFzcGVjdCBpcyBub3RcbiAqIHZpc2l0ZWQ7IHVzZSB0aGUgY29uc3RydWN0IGRpcmVjdGx5IGZvciB0aG9zZS5cbiAqL1xuZXhwb3J0IGNsYXNzIE9kaWdvc0luc3RydW1lbnRhdGlvbkFzcGVjdCBpbXBsZW1lbnRzIElBc3BlY3Qge1xuICBwcml2YXRlIHJlYWRvbmx5IGluc3RydW1lbnRhdGlvbjogT2RpZ29zTGFtYmRhSW5zdHJ1bWVudGF0aW9uO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2NvcGUgd2hlcmUgdGhlIHNoYXJlZCBsYXllciBjb25zdHJ1Y3RzIGFyZSBjcmVhdGVkLiBVc3VhbGx5IHRoZSBzYW1lIHNjb3BlIHRoZSBhc3BlY3QgaXNcbiAgICogYXBwbGllZCB0by4gSXQgaXMgYSBzZXBhcmF0ZSBhcmd1bWVudCBmcm9tIHRoZSB2aXNpdGVkIG5vZGVzIGJlY2F1c2UgdGhlIGxheWVyIChhbmQsIGluIGBJTl9BQ0NPVU5UYFxuICAgKiBtb2RlLCB0aGUgbmVzdGVkIFNBUiBhcHBsaWNhdGlvbikgaXMgY3JlYXRlZCBvbmNlIGFuZCBzaGFyZWQgYnkgZXZlcnkgZnVuY3Rpb24gdGhlIGFzcGVjdCB2aXNpdHMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzY29wZTogQ29uc3RydWN0LCBwcm9wczogT2RpZ29zSW5zdHJ1bWVudGF0aW9uQXNwZWN0UHJvcHMpIHtcbiAgICB0aGlzLmluc3RydW1lbnRhdGlvbiA9IG5ldyBPZGlnb3NMYW1iZGFJbnN0cnVtZW50YXRpb24oc2NvcGUsICdPZGlnb3NJbnN0cnVtZW50YXRpb25Bc3BlY3QnLCB7XG4gICAgICBza2lwVW5zdXBwb3J0ZWRSdW50aW1lczogdHJ1ZSxcbiAgICAgIC4uLnByb3BzLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHZpc2l0KG5vZGU6IElDb25zdHJ1Y3QpOiB2b2lkIHtcbiAgICBpZiAobm9kZSBpbnN0YW5jZW9mIGxhbWJkYS5GdW5jdGlvbikge1xuICAgICAgdGhpcy5pbnN0cnVtZW50YXRpb24uaW5zdHJ1bWVudChub2RlKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
package/lib/runtime.d.ts CHANGED
@@ -10,8 +10,8 @@ export declare function languageFromRuntime(runtimeName: string): string | undef
10
10
  /**
11
11
  * The `AWS_LAMBDA_EXEC_WRAPPER` value for a language.
12
12
  *
13
- * The wrapper script is LANGUAGE-SPECIFIC: Python ships `/opt/otel-instrument`; Node.js, Java and Ruby
14
- * ship `/opt/otel-handler`. Setting the wrong one makes the layer bootstrap fail at cold start with
13
+ * The wrapper script is language-specific. Java defaults to `/opt/otel-javaagent-handler`;
14
+ * Python uses `/opt/otel-instrument`, and Node.js/Ruby use `/opt/otel-handler`. Setting the wrong one makes the layer bootstrap fail at cold start with
15
15
  * `/opt/otel-instrument: does not exist` and the function errors out — which is why this is never a
16
16
  * hardcoded constant at a call site.
17
17
  *
@@ -56,3 +56,7 @@ export declare function webServerLoaderKey(language: string): string | undefined
56
56
  export declare function webServerEnv(language: string, existingLoaderValue?: string): {
57
57
  [key: string]: string;
58
58
  };
59
+ /** Resolve the same concrete SDK names advertised by the connector's GraphQL catalog. */
60
+ export declare function distributionWrapper(language: string, name?: string, legacy?: OdigosJavaHandlerDistro, webServer?: boolean): string;
61
+ /** Concrete layer family and AWS preset associated with a GraphQL distro name. */
62
+ export declare function distributionRecipe(language: string, name?: string, runtime?: string): import("./generated/distributions").LambdaDistribution;
package/lib/runtime.js CHANGED
@@ -6,6 +6,9 @@ exports.layerNameFor = layerNameFor;
6
6
  exports.addLoaderValue = addLoaderValue;
7
7
  exports.webServerLoaderKey = webServerLoaderKey;
8
8
  exports.webServerEnv = webServerEnv;
9
+ exports.distributionWrapper = distributionWrapper;
10
+ exports.distributionRecipe = distributionRecipe;
11
+ const distributions_1 = require("./generated/distributions");
9
12
  const layers_1 = require("./generated/layers");
10
13
  const types_1 = require("./types");
11
14
  /**
@@ -47,8 +50,8 @@ const JAVA_DISTRO_WRAPPERS = {
47
50
  /**
48
51
  * The `AWS_LAMBDA_EXEC_WRAPPER` value for a language.
49
52
  *
50
- * The wrapper script is LANGUAGE-SPECIFIC: Python ships `/opt/otel-instrument`; Node.js, Java and Ruby
51
- * ship `/opt/otel-handler`. Setting the wrong one makes the layer bootstrap fail at cold start with
53
+ * The wrapper script is language-specific. Java defaults to `/opt/otel-javaagent-handler`;
54
+ * Python uses `/opt/otel-instrument`, and Node.js/Ruby use `/opt/otel-handler`. Setting the wrong one makes the layer bootstrap fail at cold start with
52
55
  * `/opt/otel-instrument: does not exist` and the function errors out — which is why this is never a
53
56
  * hardcoded constant at a call site.
54
57
  *
@@ -56,7 +59,7 @@ const JAVA_DISTRO_WRAPPERS = {
56
59
  */
57
60
  function execWrapperFor(language, distro) {
58
61
  if (language === 'java') {
59
- return JAVA_DISTRO_WRAPPERS[distro ?? types_1.OdigosJavaHandlerDistro.OTEL_HANDLER];
62
+ return distro ? JAVA_DISTRO_WRAPPERS[distro] : '/opt/otel-javaagent-handler';
60
63
  }
61
64
  const spec = layers_1.LANGUAGES[language];
62
65
  if (!spec) {
@@ -128,4 +131,35 @@ function webServerEnv(language, existingLoaderValue) {
128
131
  }
129
132
  return env;
130
133
  }
131
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMEJBLGtEQU9DO0FBb0JELHdDQVNDO0FBR0Qsb0NBTUM7QUFjRCx3Q0FRQztBQVVELGdEQUVDO0FBY0Qsb0NBcUJDO0FBNUlELCtDQUErQztBQUMvQyxtQ0FBNkU7QUFFN0U7Ozs7OztHQU1HO0FBRUgsNEdBQTRHO0FBQzVHLE1BQU0saUJBQWlCLEdBQTRCO0lBQ2pELENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNwQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUM7SUFDcEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQztDQUNqQixDQUFDO0FBRUY7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQUMsV0FBbUI7SUFDckQsS0FBSyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxJQUFJLGlCQUFpQixFQUFFLENBQUM7UUFDbkQsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsNEVBQTRFO0FBQzVFLE1BQU0sb0JBQW9CLEdBQThCO0lBQ3RELENBQUMsK0JBQXVCLENBQUMsWUFBWSxDQUFDLEVBQUUsbUJBQW1CO0lBQzNELENBQUMsK0JBQXVCLENBQUMsa0JBQWtCLENBQUMsRUFBRSx5QkFBeUI7SUFDdkUsQ0FBQywrQkFBdUIsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLHVCQUF1QjtJQUNuRSxDQUFDLCtCQUF1QixDQUFDLG1CQUFtQixDQUFDLEVBQUUsMEJBQTBCO0NBQzFFLENBQUM7QUFFRjs7Ozs7Ozs7O0dBU0c7QUFDSCxTQUFnQixjQUFjLENBQUMsUUFBZ0IsRUFBRSxNQUFnQztJQUMvRSxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUUsQ0FBQztRQUN4QixPQUFPLG9CQUFvQixDQUFDLE1BQU0sSUFBSSwrQkFBdUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM5RSxDQUFDO0lBQ0QsTUFBTSxJQUFJLEdBQUcsa0JBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUF1RCxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7QUFDMUIsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxTQUFnQixZQUFZLENBQUMsUUFBZ0IsRUFBRSxZQUFvQjtJQUNqRSxNQUFNLElBQUksR0FBRyxrQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDNUQsQ0FBQztJQUNELE9BQU8sR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLFlBQVksRUFBRSxDQUFDO0FBQzdDLENBQUM7QUFPRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixjQUFjLENBQUMsUUFBNEIsRUFBRSxLQUFhLEVBQUUsU0FBaUI7SUFDM0YsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBQ0QsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDN0IsT0FBTyxRQUFRLENBQUM7SUFDbEIsQ0FBQztJQUNELE9BQU8sU0FBUyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEdBQUcsU0FBUyxHQUFHLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsR0FBRyxTQUFTLEdBQUcsS0FBSyxFQUFFLENBQUM7QUFDbkcsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixrQkFBa0IsQ0FBQyxRQUFnQjtJQUNqRCxPQUFPLGtCQUFTLENBQUMsUUFBUSxDQUFDLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQztBQUNoRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFnQixZQUFZLENBQzFCLFFBQWdCLEVBQ2hCLG1CQUE0QjtJQUU1QixNQUFNLElBQUksR0FBRyxrQkFBUyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2pDLE1BQU0sTUFBTSxHQUFHLElBQUksRUFBRSxTQUFTLENBQUM7SUFDL0IsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLEtBQUssQ0FDYixXQUFXLGlDQUF5QixDQUFDLFVBQVUsOEJBQThCLFFBQVEsS0FBSztZQUN4Rix3R0FBd0csQ0FDM0csQ0FBQztJQUNKLENBQUM7SUFDRCxNQUFNLEdBQUcsR0FBOEI7UUFDckMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsY0FBYyxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQztLQUNyRixDQUFDO0lBQ0YsdUdBQXVHO0lBQ3ZHLDhFQUE4RTtJQUM5RSxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUNyRCxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsQ0FBQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IExBTkdVQUdFUyB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQgeyBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLCBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgLT4gbGFuZ3VhZ2UsIGFuZCBsYW5ndWFnZSAtPiB0aGUgZXhhY3QgZW52IHRoZSBsYXllciBleHBlY3RzLlxuICpcbiAqIE1pcnJvcnMgYExhbmd1YWdlRnJvbVJ1bnRpbWVgLCBgZXhlY1dyYXBwZXJGb3JMYW5ndWFnZWAgYW5kIGB3ZWJTZXJ2ZXJMb2FkZXJgIGluIHRoZSBjb25uZWN0b3Inc1xuICogaW5zdHJ1bWVudG9yLiBUaGUgZGF0YSBsaXZlcyBpbiAuLi8uLi9hcnRpZmFjdHMuanNvbiBhbmQgcmVhY2hlcyBoZXJlIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBtb2R1bGU7IHRoZVxuICogZGVjaXNpb25zIGxpdmUgaGVyZS5cbiAqL1xuXG4vKiogUnVudGltZSBwcmVmaXhlcyB0aGF0IG1hcCB0byBhbiBPVGVsIGxheWVyIGxhbmd1YWdlLiBQcmVmaXgtbWF0Y2hlZCwgc28gYGphdmE4LmFsMmAgcmVzb2x2ZXMgdG8gamF2YS4gKi9cbmNvbnN0IExBTkdVQUdFX1BSRUZJWEVTOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgWydweXRob24nLCAncHl0aG9uJ10sXG4gIFsnbm9kZWpzJywgJ25vZGVqcyddLFxuICBbJ2phdmEnLCAnamF2YSddLFxuICBbJ3J1YnknLCAncnVieSddLFxuXTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIExhbWJkYSBydW50aW1lIGlkZW50aWZpZXIgKGBweXRob24zLjEyYCwgYGphdmEyMWAsIGBub2RlanMyMi54YCkgdG8gdGhlIE9UZWwgbGF5ZXIgbGFuZ3VhZ2UuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgcnVudGltZXMgd2l0aCBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYW5ndWFnZSBsYXllciDigJQgYGRvdG5ldCpgLCBgcHJvdmlkZWQuKmBcbiAqIChHbyBhbmQgY3VzdG9tIHJ1bnRpbWVzKS4gVGhlIGNhbGxlciByZWZ1c2VzIHRvIGluc3RydW1lbnQgcmF0aGVyIHRoYW4gYXR0YWNoaW5nIGEgbGF5ZXIgdGhhdCBkb2VzXG4gKiBub3RoaW5nLCBiZWNhdXNlIGEgbGF5ZXIgcGx1cyBhbiBleGVjIHdyYXBwZXIgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBpdCBmYWlscyB0aGUgZnVuY3Rpb24gYXQgY29sZCBzdGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhbmd1YWdlRnJvbVJ1bnRpbWUocnVudGltZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgW3ByZWZpeCwgbGFuZ3VhZ2VdIG9mIExBTkdVQUdFX1BSRUZJWEVTKSB7XG4gICAgaWYgKHJ1bnRpbWVOYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogTWFwcyB0aGUgSmF2YSBkaXN0cm8gZW51bSB0byB0aGUgd3JhcHBlciBzY3JpcHQgcGF0aCB0aGUgbGF5ZXIgc2hpcHMuICovXG5jb25zdCBKQVZBX0RJU1RST19XUkFQUEVSUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgW09kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl06ICcvb3B0L290ZWwtaGFuZGxlcicsXG4gIFtPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX1BST1hZX0hBTkRMRVJdOiAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TUVNfSEFORExFUl06ICcvb3B0L290ZWwtc3FzLWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TVFJFQU1fSEFORExFUl06ICcvb3B0L290ZWwtc3RyZWFtLWhhbmRsZXInLFxufTtcblxuLyoqXG4gKiBUaGUgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCB2YWx1ZSBmb3IgYSBsYW5ndWFnZS5cbiAqXG4gKiBUaGUgd3JhcHBlciBzY3JpcHQgaXMgTEFOR1VBR0UtU1BFQ0lGSUM6IFB5dGhvbiBzaGlwcyBgL29wdC9vdGVsLWluc3RydW1lbnRgOyBOb2RlLmpzLCBKYXZhIGFuZCBSdWJ5XG4gKiBzaGlwIGAvb3B0L290ZWwtaGFuZGxlcmAuIFNldHRpbmcgdGhlIHdyb25nIG9uZSBtYWtlcyB0aGUgbGF5ZXIgYm9vdHN0cmFwIGZhaWwgYXQgY29sZCBzdGFydCB3aXRoXG4gKiBgL29wdC9vdGVsLWluc3RydW1lbnQ6IGRvZXMgbm90IGV4aXN0YCBhbmQgdGhlIGZ1bmN0aW9uIGVycm9ycyBvdXQg4oCUIHdoaWNoIGlzIHdoeSB0aGlzIGlzIG5ldmVyIGFcbiAqIGhhcmRjb2RlZCBjb25zdGFudCBhdCBhIGNhbGwgc2l0ZS5cbiAqXG4gKiBgZGlzdHJvYCBpcyBvbmx5IGNvbnN1bHRlZCBmb3IgSmF2YSwgd2hvc2UgbGF5ZXIgc2hpcHMgZm91ciB3cmFwcGVycywgb25lIHBlciBoYW5kbGVyIGludGVyZmFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4ZWNXcmFwcGVyRm9yKGxhbmd1YWdlOiBzdHJpbmcsIGRpc3Rybz86IE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvKTogc3RyaW5nIHtcbiAgaWYgKGxhbmd1YWdlID09PSAnamF2YScpIHtcbiAgICByZXR1cm4gSkFWQV9ESVNUUk9fV1JBUFBFUlNbZGlzdHJvID8/IE9kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl07XG4gIH1cbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGlmICghc3BlYykge1xuICAgIHRocm93IG5ldyBFcnJvcihgT2RpZ29zOiBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYXllciBmb3IgbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiYCk7XG4gIH1cbiAgcmV0dXJuIHNwZWMuZXhlY1dyYXBwZXI7XG59XG5cbi8qKiBMYXllciBuYW1lIGZvciBhIGxhbmd1YWdlL2FyY2hpdGVjdHVyZSDigJQgYG9kaWdvcy1vdGVsLXB5dGhvbi1hcm02NGAuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJOYW1lRm9yKGxhbmd1YWdlOiBzdHJpbmcsIGFyY2hpdGVjdHVyZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGlmICghc3BlYykge1xuICAgIHRocm93IG5ldyBFcnJvcihgT2RpZ29zOiB1bmtub3duIGxhbmd1YWdlIFwiJHtsYW5ndWFnZX1cImApO1xuICB9XG4gIHJldHVybiBgJHtzcGVjLmxheWVyTmFtZX0tJHthcmNoaXRlY3R1cmV9YDtcbn1cblxuLyoqIEVudmlyb25tZW50IHZhcmlhYmxlcyB0byBzZXQgb24gYSBmdW5jdGlvbiwgYXMgYSBwbGFpbiBtYXAuICovXG5leHBvcnQgaW50ZXJmYWNlIEVudlZhcnMge1xuICByZWFkb25seSBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59XG5cbi8qKlxuICogSWRlbXBvdGVudGx5IGFkZHMgb3VyIGxvYWRlciB2YWx1ZSB0byBhIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IGNhcnJpZXMuXG4gKlxuICogYFBZVEhPTlBBVEhgIGlzIFBSRVBFTkRFRCwgc28gdGhlIGxheWVyJ3MgcGFja2FnZXMgYW5kIGl0cyBgc2l0ZWN1c3RvbWl6ZWAgYXJlIGZvdW5kIGZpcnN0OyB0aGVcbiAqIGAqX09QVElPTlNgIHZhcmlhYmxlcyBhcmUgYXBwZW5kZWQsIHNvIHRoZSBjdXN0b21lcidzIG93biBmbGFncyBrZWVwIHByZWNlZGVuY2UuIE1pcnJvcnNcbiAqIGBhZGRMb2FkZXJWYWx1ZWAgaW4gdGhlIGNvbm5lY3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZExvYWRlclZhbHVlKGV4aXN0aW5nOiBzdHJpbmcgfCB1bmRlZmluZWQsIHZhbHVlOiBzdHJpbmcsIHNlcGFyYXRvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFleGlzdGluZykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuICBpZiAoZXhpc3RpbmcuaW5jbHVkZXModmFsdWUpKSB7XG4gICAgcmV0dXJuIGV4aXN0aW5nO1xuICB9XG4gIHJldHVybiBzZXBhcmF0b3IgPT09ICc6JyA/IGAke3ZhbHVlfSR7c2VwYXJhdG9yfSR7ZXhpc3Rpbmd9YCA6IGAke2V4aXN0aW5nfSR7c2VwYXJhdG9yfSR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgbG9hZGVyIHZhcmlhYmxlIGEgbGFuZ3VhZ2UgYWN0aXZhdGVzIHRocm91Z2ggaW4gd2ViLXNlcnZlciBtb2RlIChgTk9ERV9PUFRJT05TYCxcbiAqIGBKQVZBX1RPT0xfT1BUSU9OU2AsIGBQWVRIT05QQVRIYCksIG9yIHVuZGVmaW5lZCBmb3IgYSBsYW5ndWFnZSB3aXRoIG5vIHZlcmlmaWVkIHdlYi1zZXJ2ZXIgbG9hZGVyLlxuICpcbiAqIEV4aXN0cyBzbyBhIGNhbGxlciB0aGF0IG5lZWRzIHRvIG5hbWUgdGhlIHZhcmlhYmxlIOKAlCB0aGUgb3duZXJzaGlwIG1hcmtlcidzIHJvbGxiYWNrIHNuYXBzaG90LCB3aGljaCBoYXNcbiAqIHRvIHJlY29yZCB0aGUgY2FsbGVyJ3Mgb3duIHByaW9yIHZhbHVlIGZvciBpdCDigJQgZG9lcyBub3QgaGF2ZSB0byBndWVzcyBpdCBmcm9tIHRoZSBrZXkgb3JkZXIgb2ZcbiAqIGB3ZWJTZXJ2ZXJFbnZgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2ViU2VydmVyTG9hZGVyS2V5KGxhbmd1YWdlOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gTEFOR1VBR0VTW2xhbmd1YWdlXT8ud2ViU2VydmVyPy5lbnZLZXk7XG59XG5cbi8qKlxuICogVGhlIGVudmlyb25tZW50IHRoYXQgbG9hZHMgdGhlIGxhbmd1YWdlIGFnZW50IGluIHdlYi1zZXJ2ZXIgKEFXUyBMYW1iZGEgV2ViIEFkYXB0ZXIpIG1vZGUuXG4gKlxuICogV2ViLWFkYXB0ZXIgZnVuY3Rpb25zIHJ1biBhIHdlYiBzZXJ2ZXIgcmF0aGVyIHRoYW4gYSBMYW1iZGEgaGFuZGxlciwgYW5kIHRoZSBhZGFwdGVyIG93bnNcbiAqIGBBV1NfTEFNQkRBX0VYRUNfV1JBUFBFUmAg4oCUIHNvIGluc3RydW1lbnRhdGlvbiBpcyBsb2FkZWQgdGhyb3VnaCB0aGUgbGFuZ3VhZ2UncyBvd24gbG9hZGVyIHZhcmlhYmxlIGFuZFxuICogdGhlIHdyYXBwZXIgaXMgbGVmdCBhbG9uZS4gSGFuZGxlci1tb2RlIGluc3RydW1lbnRhdGlvbiBhcHBsaWVkIHRvIG9uZSBvZiB0aGVzZSBvdmVyd3JpdGVzIHRoZVxuICogYWRhcHRlcidzIHdyYXBwZXIgYW5kIHRoZSBmdW5jdGlvbiBzdG9wcyBzZXJ2aW5nLlxuICpcbiAqIEBwYXJhbSBleGlzdGluZ0xvYWRlclZhbHVlIHRoZSB2YWx1ZSB0aGUgZnVuY3Rpb24gYWxyZWFkeSBuZWVkcyBpbiBpdHMgbG9hZGVyIHZhcmlhYmxlLCB3aGljaCBvdXJzIGlzXG4gKiBqb2luZWQgdG8uIENESydzIGBsYW1iZGEuRnVuY3Rpb25gIGV4cG9zZXMgbm8gd2F5IHRvIHJlYWQgYmFjayBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBzZXQgZWxzZXdoZXJlIGluXG4gKiB0aGUgYXBwLCBzbyBhIHZhbHVlIHRoYXQgbXVzdCBiZSBwcmVzZXJ2ZWQgaGFzIHRvIGJlIHBhc3NlZCBpbiBleHBsaWNpdGx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2ViU2VydmVyRW52KFxuICBsYW5ndWFnZTogc3RyaW5nLFxuICBleGlzdGluZ0xvYWRlclZhbHVlPzogc3RyaW5nLFxuKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gIGNvbnN0IHNwZWMgPSBMQU5HVUFHRVNbbGFuZ3VhZ2VdO1xuICBjb25zdCBsb2FkZXIgPSBzcGVjPy53ZWJTZXJ2ZXI7XG4gIGlmICghbG9hZGVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYE9kaWdvczogJHtPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLldFQl9TRVJWRVJ9IG1vZGUgaXMgbm90IHN1cHBvcnRlZCBmb3IgJHtsYW5ndWFnZX0g4oCUIGAgK1xuICAgICAgICAndGhlcmUgaXMgbm8gdmVyaWZpZWQgd2ViLXNlcnZlciBsb2FkZXIgZm9yIGl0LiBVc2UgSEFORExFUiBtb2RlLCBvciBsZWF2ZSB0aGUgZnVuY3Rpb24gdW5pbnN0cnVtZW50ZWQuJyxcbiAgICApO1xuICB9XG4gIGNvbnN0IGVudjogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICBbbG9hZGVyLmVudktleV06IGFkZExvYWRlclZhbHVlKGV4aXN0aW5nTG9hZGVyVmFsdWUsIGxvYWRlci52YWx1ZSwgbG9hZGVyLnNlcGFyYXRvciksXG4gIH07XG4gIC8vIFB5dGhvbiBtdXN0IGJlIHBpbm5lZCB0byB0aGUgSFRUUCBPVExQIGV4cG9ydGVyIOKAlCB0aGUgb25seSBvbmUgYnVuZGxlZCBpbiBpdHMgbGF5ZXIuIE90aGVyIGxhbmd1YWdlc1xuICAvLyBleHBvcnQgY29ycmVjdGx5IHdpdGggdGhlaXIgZGVmYXVsdHMsIHNvIG5vdGhpbmcgZXh0cmEgaXMgd3JpdHRlbiBmb3IgdGhlbS5cbiAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMobG9hZGVyLmV4dHJhRW52KSkge1xuICAgIGVudltrXSA9IHY7XG4gIH1cbiAgcmV0dXJuIGVudjtcbn1cbiJdfQ==
134
+ /** Resolve the same concrete SDK names advertised by the connector's GraphQL catalog. */
135
+ function distributionWrapper(language, name, legacy, webServer = false) {
136
+ if (legacy && name)
137
+ throw new Error('Use distro or legacy javaHandlerDistro, not both');
138
+ if (legacy) {
139
+ if (language !== 'java')
140
+ return execWrapperFor(language);
141
+ if (webServer)
142
+ throw new Error('Java handler adapters require HANDLER mode');
143
+ if (!JAVA_DISTRO_WRAPPERS[legacy])
144
+ throw new Error(`Unsupported Java handler adapter ${legacy}`);
145
+ return execWrapperFor(language, legacy);
146
+ }
147
+ if (webServer && language === 'ruby')
148
+ throw new Error('Web-server instrumentation is not supported for ruby');
149
+ const d = distributions_1.LAMBDA_DISTRIBUTIONS.find(d => d.language === language && (name ? d.name === name : d.isDefault));
150
+ if (!d || (webServer && (d.artifact || language === 'ruby' || (language === 'java' && d.name !== 'java-lambda-otel-agent')))) {
151
+ throw new Error(`Unsupported Lambda distro ${name ?? '(default)'} for ${language}`);
152
+ }
153
+ return d.execWrapper;
154
+ }
155
+ /** Concrete layer family and AWS preset associated with a GraphQL distro name. */
156
+ function distributionRecipe(language, name, runtime) {
157
+ const d = distributions_1.LAMBDA_DISTRIBUTIONS.find(d => d.language === language && (name ? d.name === name : d.isDefault));
158
+ if (!d)
159
+ throw new Error(`Unsupported Lambda distro ${name ?? '(default)'} for ${language}`);
160
+ if (runtime && d.compatibleRuntimes && !d.compatibleRuntimes.includes(runtime)) {
161
+ throw new Error(`Lambda distro ${d.name} does not support runtime ${runtime}`);
162
+ }
163
+ return d;
164
+ }
165
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBMkJBLGtEQU9DO0FBb0JELHdDQVNDO0FBR0Qsb0NBTUM7QUFjRCx3Q0FRQztBQVVELGdEQUVDO0FBY0Qsb0NBcUJDO0FBR0Qsa0RBY0M7QUFHRCxnREFPQztBQXhLRCw2REFBaUU7QUFDakUsK0NBQStDO0FBQy9DLG1DQUE2RTtBQUU3RTs7Ozs7O0dBTUc7QUFFSCw0R0FBNEc7QUFDNUcsTUFBTSxpQkFBaUIsR0FBNEI7SUFDakQsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDO0lBQ3BCLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQztJQUNwQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7SUFDaEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDO0NBQ2pCLENBQUM7QUFFRjs7Ozs7O0dBTUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBQyxXQUFtQjtJQUNyRCxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLElBQUksaUJBQWlCLEVBQUUsQ0FBQztRQUNuRCxJQUFJLFdBQVcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNuQyxPQUFPLFFBQVEsQ0FBQztRQUNsQixDQUFDO0lBQ0gsQ0FBQztJQUNELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCw0RUFBNEU7QUFDNUUsTUFBTSxvQkFBb0IsR0FBOEI7SUFDdEQsQ0FBQywrQkFBdUIsQ0FBQyxZQUFZLENBQUMsRUFBRSxtQkFBbUI7SUFDM0QsQ0FBQywrQkFBdUIsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLHlCQUF5QjtJQUN2RSxDQUFDLCtCQUF1QixDQUFDLGdCQUFnQixDQUFDLEVBQUUsdUJBQXVCO0lBQ25FLENBQUMsK0JBQXVCLENBQUMsbUJBQW1CLENBQUMsRUFBRSwwQkFBMEI7Q0FDMUUsQ0FBQztBQUVGOzs7Ozs7Ozs7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Q0FBQyxRQUFnQixFQUFFLElBQWEsRUFBRSxPQUFnQjtJQUNsRixNQUFNLENBQUMsR0FBRyxvQ0FBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxLQUFLLFFBQVEsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQzVHLElBQUksQ0FBQyxDQUFDO1FBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsSUFBSSxJQUFJLFdBQVcsUUFBUSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzVGLElBQUksT0FBTyxJQUFJLENBQUMsQ0FBQyxrQkFBa0IsSUFBSSxDQUFDLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUMvRSxNQUFNLElBQUksS0FBSyxDQUFDLGlCQUFpQixDQUFDLENBQUMsSUFBSSw2QkFBNkIsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTEFNQkRBX0RJU1RSSUJVVElPTlMgfSBmcm9tICcuL2dlbmVyYXRlZC9kaXN0cmlidXRpb25zJztcbmltcG9ydCB7IExBTkdVQUdFUyB9IGZyb20gJy4vZ2VuZXJhdGVkL2xheWVycyc7XG5pbXBvcnQgeyBPZGlnb3NJbnN0cnVtZW50YXRpb25Nb2RlLCBPZGlnb3NKYXZhSGFuZGxlckRpc3RybyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIFJ1bnRpbWUgLT4gbGFuZ3VhZ2UsIGFuZCBsYW5ndWFnZSAtPiB0aGUgZXhhY3QgZW52IHRoZSBsYXllciBleHBlY3RzLlxuICpcbiAqIE1pcnJvcnMgYExhbmd1YWdlRnJvbVJ1bnRpbWVgLCBgZXhlY1dyYXBwZXJGb3JMYW5ndWFnZWAgYW5kIGB3ZWJTZXJ2ZXJMb2FkZXJgIGluIHRoZSBjb25uZWN0b3Inc1xuICogaW5zdHJ1bWVudG9yLiBUaGUgZGF0YSBsaXZlcyBpbiAuLi8uLi9hcnRpZmFjdHMuanNvbiBhbmQgcmVhY2hlcyBoZXJlIHRocm91Z2ggdGhlIGdlbmVyYXRlZCBtb2R1bGU7IHRoZVxuICogZGVjaXNpb25zIGxpdmUgaGVyZS5cbiAqL1xuXG4vKiogUnVudGltZSBwcmVmaXhlcyB0aGF0IG1hcCB0byBhbiBPVGVsIGxheWVyIGxhbmd1YWdlLiBQcmVmaXgtbWF0Y2hlZCwgc28gYGphdmE4LmFsMmAgcmVzb2x2ZXMgdG8gamF2YS4gKi9cbmNvbnN0IExBTkdVQUdFX1BSRUZJWEVTOiBBcnJheTxbc3RyaW5nLCBzdHJpbmddPiA9IFtcbiAgWydweXRob24nLCAncHl0aG9uJ10sXG4gIFsnbm9kZWpzJywgJ25vZGVqcyddLFxuICBbJ2phdmEnLCAnamF2YSddLFxuICBbJ3J1YnknLCAncnVieSddLFxuXTtcblxuLyoqXG4gKiBSZXNvbHZlcyBhIExhbWJkYSBydW50aW1lIGlkZW50aWZpZXIgKGBweXRob24zLjEyYCwgYGphdmEyMWAsIGBub2RlanMyMi54YCkgdG8gdGhlIE9UZWwgbGF5ZXIgbGFuZ3VhZ2UuXG4gKlxuICogUmV0dXJucyBgdW5kZWZpbmVkYCBmb3IgcnVudGltZXMgd2l0aCBubyBPcGVuVGVsZW1ldHJ5IExhbWJkYSBsYW5ndWFnZSBsYXllciDigJQgYGRvdG5ldCpgLCBgcHJvdmlkZWQuKmBcbiAqIChHbyBhbmQgY3VzdG9tIHJ1bnRpbWVzKS4gVGhlIGNhbGxlciByZWZ1c2VzIHRvIGluc3RydW1lbnQgcmF0aGVyIHRoYW4gYXR0YWNoaW5nIGEgbGF5ZXIgdGhhdCBkb2VzXG4gKiBub3RoaW5nLCBiZWNhdXNlIGEgbGF5ZXIgcGx1cyBhbiBleGVjIHdyYXBwZXIgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiBpdCBmYWlscyB0aGUgZnVuY3Rpb24gYXQgY29sZCBzdGFydC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxhbmd1YWdlRnJvbVJ1bnRpbWUocnVudGltZU5hbWU6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGZvciAoY29uc3QgW3ByZWZpeCwgbGFuZ3VhZ2VdIG9mIExBTkdVQUdFX1BSRUZJWEVTKSB7XG4gICAgaWYgKHJ1bnRpbWVOYW1lLnN0YXJ0c1dpdGgocHJlZml4KSkge1xuICAgICAgcmV0dXJuIGxhbmd1YWdlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdW5kZWZpbmVkO1xufVxuXG4vKiogTWFwcyB0aGUgSmF2YSBkaXN0cm8gZW51bSB0byB0aGUgd3JhcHBlciBzY3JpcHQgcGF0aCB0aGUgbGF5ZXIgc2hpcHMuICovXG5jb25zdCBKQVZBX0RJU1RST19XUkFQUEVSUzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgW09kaWdvc0phdmFIYW5kbGVyRGlzdHJvLk9URUxfSEFORExFUl06ICcvb3B0L290ZWwtaGFuZGxlcicsXG4gIFtPZGlnb3NKYXZhSGFuZGxlckRpc3Ryby5PVEVMX1BST1hZX0hBTkRMRVJdOiAnL29wdC9vdGVsLXByb3h5LWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TUVNfSEFORExFUl06ICcvb3B0L290ZWwtc3FzLWhhbmRsZXInLFxuICBbT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8uT1RFTF9TVFJFQU1fSEFORExFUl06ICcvb3B0L290ZWwtc3RyZWFtLWhhbmRsZXInLFxufTtcblxuLyoqXG4gKiBUaGUgYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCB2YWx1ZSBmb3IgYSBsYW5ndWFnZS5cbiAqXG4gKiBUaGUgd3JhcHBlciBzY3JpcHQgaXMgbGFuZ3VhZ2Utc3BlY2lmaWMuIEphdmEgZGVmYXVsdHMgdG8gYC9vcHQvb3RlbC1qYXZhYWdlbnQtaGFuZGxlcmA7XG4gKiBQeXRob24gdXNlcyBgL29wdC9vdGVsLWluc3RydW1lbnRgLCBhbmQgTm9kZS5qcy9SdWJ5IHVzZSBgL29wdC9vdGVsLWhhbmRsZXJgLiBTZXR0aW5nIHRoZSB3cm9uZyBvbmUgbWFrZXMgdGhlIGxheWVyIGJvb3RzdHJhcCBmYWlsIGF0IGNvbGQgc3RhcnQgd2l0aFxuICogYC9vcHQvb3RlbC1pbnN0cnVtZW50OiBkb2VzIG5vdCBleGlzdGAgYW5kIHRoZSBmdW5jdGlvbiBlcnJvcnMgb3V0IOKAlCB3aGljaCBpcyB3aHkgdGhpcyBpcyBuZXZlciBhXG4gKiBoYXJkY29kZWQgY29uc3RhbnQgYXQgYSBjYWxsIHNpdGUuXG4gKlxuICogYGRpc3Ryb2AgaXMgb25seSBjb25zdWx0ZWQgZm9yIEphdmEsIHdob3NlIGxheWVyIHNoaXBzIGZvdXIgd3JhcHBlcnMsIG9uZSBwZXIgaGFuZGxlciBpbnRlcmZhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjV3JhcHBlckZvcihsYW5ndWFnZTogc3RyaW5nLCBkaXN0cm8/OiBPZGlnb3NKYXZhSGFuZGxlckRpc3Rybyk6IHN0cmluZyB7XG4gIGlmIChsYW5ndWFnZSA9PT0gJ2phdmEnKSB7XG4gICAgcmV0dXJuIGRpc3RybyA/IEpBVkFfRElTVFJPX1dSQVBQRVJTW2Rpc3Ryb10gOiAnL29wdC9vdGVsLWphdmFhZ2VudC1oYW5kbGVyJztcbiAgfVxuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IG5vIE9wZW5UZWxlbWV0cnkgTGFtYmRhIGxheWVyIGZvciBsYW5ndWFnZSBcIiR7bGFuZ3VhZ2V9XCJgKTtcbiAgfVxuICByZXR1cm4gc3BlYy5leGVjV3JhcHBlcjtcbn1cblxuLyoqIExheWVyIG5hbWUgZm9yIGEgbGFuZ3VhZ2UvYXJjaGl0ZWN0dXJlIOKAlCBgb2RpZ29zLW90ZWwtcHl0aG9uLWFybTY0YC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllck5hbWVGb3IobGFuZ3VhZ2U6IHN0cmluZywgYXJjaGl0ZWN0dXJlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBzcGVjID0gTEFOR1VBR0VTW2xhbmd1YWdlXTtcbiAgaWYgKCFzcGVjKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBPZGlnb3M6IHVua25vd24gbGFuZ3VhZ2UgXCIke2xhbmd1YWdlfVwiYCk7XG4gIH1cbiAgcmV0dXJuIGAke3NwZWMubGF5ZXJOYW1lfS0ke2FyY2hpdGVjdHVyZX1gO1xufVxuXG4vKiogRW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIHNldCBvbiBhIGZ1bmN0aW9uLCBhcyBhIHBsYWluIG1hcC4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW52VmFycyB7XG4gIHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHN0cmluZztcbn1cblxuLyoqXG4gKiBJZGVtcG90ZW50bHkgYWRkcyBvdXIgbG9hZGVyIHZhbHVlIHRvIGEgdmFsdWUgdGhlIGZ1bmN0aW9uIGFscmVhZHkgY2Fycmllcy5cbiAqXG4gKiBgUFlUSE9OUEFUSGAgaXMgUFJFUEVOREVELCBzbyB0aGUgbGF5ZXIncyBwYWNrYWdlcyBhbmQgaXRzIGBzaXRlY3VzdG9taXplYCBhcmUgZm91bmQgZmlyc3Q7IHRoZVxuICogYCpfT1BUSU9OU2AgdmFyaWFibGVzIGFyZSBhcHBlbmRlZCwgc28gdGhlIGN1c3RvbWVyJ3Mgb3duIGZsYWdzIGtlZXAgcHJlY2VkZW5jZS4gTWlycm9yc1xuICogYGFkZExvYWRlclZhbHVlYCBpbiB0aGUgY29ubmVjdG9yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkTG9hZGVyVmFsdWUoZXhpc3Rpbmc6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmFsdWU6IHN0cmluZywgc2VwYXJhdG9yOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIWV4aXN0aW5nKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG4gIGlmIChleGlzdGluZy5pbmNsdWRlcyh2YWx1ZSkpIHtcbiAgICByZXR1cm4gZXhpc3Rpbmc7XG4gIH1cbiAgcmV0dXJuIHNlcGFyYXRvciA9PT0gJzonID8gYCR7dmFsdWV9JHtzZXBhcmF0b3J9JHtleGlzdGluZ31gIDogYCR7ZXhpc3Rpbmd9JHtzZXBhcmF0b3J9JHt2YWx1ZX1gO1xufVxuXG4vKipcbiAqIFRoZSBsb2FkZXIgdmFyaWFibGUgYSBsYW5ndWFnZSBhY3RpdmF0ZXMgdGhyb3VnaCBpbiB3ZWItc2VydmVyIG1vZGUgKGBOT0RFX09QVElPTlNgLFxuICogYEpBVkFfVE9PTF9PUFRJT05TYCwgYFBZVEhPTlBBVEhgKSwgb3IgdW5kZWZpbmVkIGZvciBhIGxhbmd1YWdlIHdpdGggbm8gdmVyaWZpZWQgd2ViLXNlcnZlciBsb2FkZXIuXG4gKlxuICogRXhpc3RzIHNvIGEgY2FsbGVyIHRoYXQgbmVlZHMgdG8gbmFtZSB0aGUgdmFyaWFibGUg4oCUIHRoZSBvd25lcnNoaXAgbWFya2VyJ3Mgcm9sbGJhY2sgc25hcHNob3QsIHdoaWNoIGhhc1xuICogdG8gcmVjb3JkIHRoZSBjYWxsZXIncyBvd24gcHJpb3IgdmFsdWUgZm9yIGl0IOKAlCBkb2VzIG5vdCBoYXZlIHRvIGd1ZXNzIGl0IGZyb20gdGhlIGtleSBvcmRlciBvZlxuICogYHdlYlNlcnZlckVudmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJTZXJ2ZXJMb2FkZXJLZXkobGFuZ3VhZ2U6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBMQU5HVUFHRVNbbGFuZ3VhZ2VdPy53ZWJTZXJ2ZXI/LmVudktleTtcbn1cblxuLyoqXG4gKiBUaGUgZW52aXJvbm1lbnQgdGhhdCBsb2FkcyB0aGUgbGFuZ3VhZ2UgYWdlbnQgaW4gd2ViLXNlcnZlciAoQVdTIExhbWJkYSBXZWIgQWRhcHRlcikgbW9kZS5cbiAqXG4gKiBXZWItYWRhcHRlciBmdW5jdGlvbnMgcnVuIGEgd2ViIHNlcnZlciByYXRoZXIgdGhhbiBhIExhbWJkYSBoYW5kbGVyLCBhbmQgdGhlIGFkYXB0ZXIgb3duc1xuICogYEFXU19MQU1CREFfRVhFQ19XUkFQUEVSYCDigJQgc28gaW5zdHJ1bWVudGF0aW9uIGlzIGxvYWRlZCB0aHJvdWdoIHRoZSBsYW5ndWFnZSdzIG93biBsb2FkZXIgdmFyaWFibGUgYW5kXG4gKiB0aGUgd3JhcHBlciBpcyBsZWZ0IGFsb25lLiBIYW5kbGVyLW1vZGUgaW5zdHJ1bWVudGF0aW9uIGFwcGxpZWQgdG8gb25lIG9mIHRoZXNlIG92ZXJ3cml0ZXMgdGhlXG4gKiBhZGFwdGVyJ3Mgd3JhcHBlciBhbmQgdGhlIGZ1bmN0aW9uIHN0b3BzIHNlcnZpbmcuXG4gKlxuICogQHBhcmFtIGV4aXN0aW5nTG9hZGVyVmFsdWUgdGhlIHZhbHVlIHRoZSBmdW5jdGlvbiBhbHJlYWR5IG5lZWRzIGluIGl0cyBsb2FkZXIgdmFyaWFibGUsIHdoaWNoIG91cnMgaXNcbiAqIGpvaW5lZCB0by4gQ0RLJ3MgYGxhbWJkYS5GdW5jdGlvbmAgZXhwb3NlcyBubyB3YXkgdG8gcmVhZCBiYWNrIGFuIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBlbHNld2hlcmUgaW5cbiAqIHRoZSBhcHAsIHNvIGEgdmFsdWUgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCBoYXMgdG8gYmUgcGFzc2VkIGluIGV4cGxpY2l0bHkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3ZWJTZXJ2ZXJFbnYoXG4gIGxhbmd1YWdlOiBzdHJpbmcsXG4gIGV4aXN0aW5nTG9hZGVyVmFsdWU/OiBzdHJpbmcsXG4pOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgY29uc3Qgc3BlYyA9IExBTkdVQUdFU1tsYW5ndWFnZV07XG4gIGNvbnN0IGxvYWRlciA9IHNwZWM/LndlYlNlcnZlcjtcbiAgaWYgKCFsb2FkZXIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zOiAke09kaWdvc0luc3RydW1lbnRhdGlvbk1vZGUuV0VCX1NFUlZFUn0gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGZvciAke2xhbmd1YWdlfSDigJQgYCArXG4gICAgICAgICd0aGVyZSBpcyBubyB2ZXJpZmllZCB3ZWItc2VydmVyIGxvYWRlciBmb3IgaXQuIFVzZSBIQU5ETEVSIG1vZGUsIG9yIGxlYXZlIHRoZSBmdW5jdGlvbiB1bmluc3RydW1lbnRlZC4nLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZW52OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgIFtsb2FkZXIuZW52S2V5XTogYWRkTG9hZGVyVmFsdWUoZXhpc3RpbmdMb2FkZXJWYWx1ZSwgbG9hZGVyLnZhbHVlLCBsb2FkZXIuc2VwYXJhdG9yKSxcbiAgfTtcbiAgLy8gUHl0aG9uIG11c3QgYmUgcGlubmVkIHRvIHRoZSBIVFRQIE9UTFAgZXhwb3J0ZXIg4oCUIHRoZSBvbmx5IG9uZSBidW5kbGVkIGluIGl0cyBsYXllci4gT3RoZXIgbGFuZ3VhZ2VzXG4gIC8vIGV4cG9ydCBjb3JyZWN0bHkgd2l0aCB0aGVpciBkZWZhdWx0cywgc28gbm90aGluZyBleHRyYSBpcyB3cml0dGVuIGZvciB0aGVtLlxuICBmb3IgKGNvbnN0IFtrLCB2XSBvZiBPYmplY3QuZW50cmllcyhsb2FkZXIuZXh0cmFFbnYpKSB7XG4gICAgZW52W2tdID0gdjtcbiAgfVxuICByZXR1cm4gZW52O1xufVxuXG4vKiogUmVzb2x2ZSB0aGUgc2FtZSBjb25jcmV0ZSBTREsgbmFtZXMgYWR2ZXJ0aXNlZCBieSB0aGUgY29ubmVjdG9yJ3MgR3JhcGhRTCBjYXRhbG9nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3RyaWJ1dGlvbldyYXBwZXIobGFuZ3VhZ2U6IHN0cmluZywgbmFtZT86IHN0cmluZywgbGVnYWN5PzogT2RpZ29zSmF2YUhhbmRsZXJEaXN0cm8sIHdlYlNlcnZlciA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKGxlZ2FjeSAmJiBuYW1lKSB0aHJvdyBuZXcgRXJyb3IoJ1VzZSBkaXN0cm8gb3IgbGVnYWN5IGphdmFIYW5kbGVyRGlzdHJvLCBub3QgYm90aCcpO1xuICBpZiAobGVnYWN5KSB7XG4gICAgaWYgKGxhbmd1YWdlICE9PSAnamF2YScpIHJldHVybiBleGVjV3JhcHBlckZvcihsYW5ndWFnZSk7XG4gICAgaWYgKHdlYlNlcnZlcikgdGhyb3cgbmV3IEVycm9yKCdKYXZhIGhhbmRsZXIgYWRhcHRlcnMgcmVxdWlyZSBIQU5ETEVSIG1vZGUnKTtcbiAgICBpZiAoIUpBVkFfRElTVFJPX1dSQVBQRVJTW2xlZ2FjeV0pIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgSmF2YSBoYW5kbGVyIGFkYXB0ZXIgJHtsZWdhY3l9YCk7XG4gICAgcmV0dXJuIGV4ZWNXcmFwcGVyRm9yKGxhbmd1YWdlLCBsZWdhY3kpO1xuICB9XG4gIGlmICh3ZWJTZXJ2ZXIgJiYgbGFuZ3VhZ2UgPT09ICdydWJ5JykgdGhyb3cgbmV3IEVycm9yKCdXZWItc2VydmVyIGluc3RydW1lbnRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZvciBydWJ5Jyk7XG4gIGNvbnN0IGQgPSBMQU1CREFfRElTVFJJQlVUSU9OUy5maW5kKGQgPT4gZC5sYW5ndWFnZSA9PT0gbGFuZ3VhZ2UgJiYgKG5hbWUgPyBkLm5hbWUgPT09IG5hbWUgOiBkLmlzRGVmYXVsdCkpO1xuICBpZiAoIWQgfHwgKHdlYlNlcnZlciAmJiAoZC5hcnRpZmFjdCB8fCBsYW5ndWFnZSA9PT0gJ3J1YnknIHx8IChsYW5ndWFnZSA9PT0gJ2phdmEnICYmIGQubmFtZSAhPT0gJ2phdmEtbGFtYmRhLW90ZWwtYWdlbnQnKSkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBMYW1iZGEgZGlzdHJvICR7bmFtZSA/PyAnKGRlZmF1bHQpJ30gZm9yICR7bGFuZ3VhZ2V9YCk7XG4gIH1cbiAgcmV0dXJuIGQuZXhlY1dyYXBwZXI7XG59XG5cbi8qKiBDb25jcmV0ZSBsYXllciBmYW1pbHkgYW5kIEFXUyBwcmVzZXQgYXNzb2NpYXRlZCB3aXRoIGEgR3JhcGhRTCBkaXN0cm8gbmFtZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXN0cmlidXRpb25SZWNpcGUobGFuZ3VhZ2U6IHN0cmluZywgbmFtZT86IHN0cmluZywgcnVudGltZT86IHN0cmluZykge1xuICBjb25zdCBkID0gTEFNQkRBX0RJU1RSSUJVVElPTlMuZmluZChkID0+IGQubGFuZ3VhZ2UgPT09IGxhbmd1YWdlICYmIChuYW1lID8gZC5uYW1lID09PSBuYW1lIDogZC5pc0RlZmF1bHQpKTtcbiAgaWYgKCFkKSB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIExhbWJkYSBkaXN0cm8gJHtuYW1lID8/ICcoZGVmYXVsdCknfSBmb3IgJHtsYW5ndWFnZX1gKTtcbiAgaWYgKHJ1bnRpbWUgJiYgZC5jb21wYXRpYmxlUnVudGltZXMgJiYgIWQuY29tcGF0aWJsZVJ1bnRpbWVzLmluY2x1ZGVzKHJ1bnRpbWUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBMYW1iZGEgZGlzdHJvICR7ZC5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IHJ1bnRpbWUgJHtydW50aW1lfWApO1xuICB9XG4gIHJldHVybiBkO1xufVxuIl19