@odigos/aws-cdk 0.0.0 → 0.0.11
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.
- package/.jsii +42 -23
- package/README.md +59 -6
- package/lib/collector-config.js +13 -1
- package/lib/generated/layers.d.ts +3 -3
- package/lib/generated/layers.js +160 -6
- package/lib/instrumentation.d.ts +38 -0
- package/lib/instrumentation.js +92 -24
- package/lib/runtime.d.ts +9 -0
- package/lib/runtime.js +13 -1
- package/lib/tsconfig.tsbuildinfo +1 -1
- package/package.json +3 -3
package/.jsii
CHANGED
|
@@ -3826,7 +3826,7 @@
|
|
|
3826
3826
|
},
|
|
3827
3827
|
"name": "@odigos/aws-cdk",
|
|
3828
3828
|
"readme": {
|
|
3829
|
-
"markdown": "# Odigos CDK constructs for AWS Lambda\n\nInstrument AWS Lambda functions with the Odigos OpenTelemetry layer, from your own CDK app.\n\n```bash\nnpm install @odigos/aws-cdk # TypeScript / JavaScript\npip install odigos-aws-cdk # Python\n```\n\n```ts\nimport { OdigosLambdaInstrumentation } from '@odigos/aws-cdk';\n\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [apiFn, workerFn],\n});\n```\n\n```python\nfrom odigos_aws_cdk import OdigosLambdaInstrumentation\n\nOdigosLambdaInstrumentation(self, \"Odigos\",\n destination={\"endpoint\": \"otlp.example.com:4317\"},\n functions=[api_fn, worker_fn],\n)\n```\n\nThat attaches the layer for each function's language and architecture, sets the exec wrapper that loads\nthe OpenTelemetry SDK, and hands the in-Lambda collector its whole configuration.\n\n## How the telemetry actually leaves the function\n\nYour function's SDK **does not** export to your destination. It exports to an OpenTelemetry collector\nrunning inside the same Lambda sandbox, on localhost. The collector forwards to your destination *after*\nthe handler has already returned its response.\n\nThat indirection is the whole point. A slow or unreachable destination costs billed duration, not caller\nlatency — and the collector's `decouple` processor is what holds the sandbox open until the export queue\ndrains, so a low-traffic function does not lose its telemetry to the freeze.\n\nConsequently `OTEL_EXPORTER_OTLP_ENDPOINT` is deliberately never set. If you set it yourself you put the\nexport back on the invocation's critical path.\n\n## Choosing a layer source\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [fn],\n layerSource: OdigosLayerSource.IN_ACCOUNT,\n});\n```\n\n| | `ODIGOS_PUBLIC` (default) | `IN_ACCOUNT` |\n|---|---|---|\n| What it synthesizes | a layer ARN | an `AWS::Serverless::Application` (nested stack) per language/arch |\n| Layer owner | the Odigos AWS account | **your** account, created by your stack |\n| Resolution | synth time, from a table baked into this package | deploy time, from the Serverless Application Repository |\n| Environment-agnostic stacks | not supported — needs a concrete region | works |\n| Deploy speed | unchanged | slower on first deploy |\n\nBoth install identical bytes. `IN_ACCOUNT` exists for organisations whose policy forbids attaching a\nLambda layer owned by another AWS account. It needs the deploying principal to be allowed\n`serverlessrepo:CreateCloudFormationTemplate` and `serverlessrepo:GetApplication`.\n\nIf you mirror the layer somewhere yourself, pass `layerVersion` and neither path is used.\n\n## Versioning\n\n**The package version is the layer version.** `@odigos/aws-cdk@0.2.0` resolves to the layer built and\npublished by Odigos release `v0.2.0`, and pins the SAR application to semantic version `0.2.0` — which is\nimmutable, so it means the same bytes forever.\n\nNothing resolves at deploy time in the default path, so upgrading the layer is `npm update` and a\n`cdk diff` that shows the change. An instrumentation layer moving on its own, under a deployment that\nchanged nothing, is not a property you want.\n\n## Handler mode vs. web-server mode\n\n`OdigosInstrumentationMode.HANDLER` (the default) is for a normal Lambda handler. It sets\n`AWS_LAMBDA_EXEC_WRAPPER`.\n\n`OdigosInstrumentationMode.WEB_SERVER` is for a function running a web server behind the\n[AWS Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter). The adapter owns the exec\nwrapper, so this mode does not touch it and loads instrumentation through the language's own loader\nvariable instead.\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [webFn],\n mode: OdigosInstrumentationMode.WEB_SERVER,\n // NODE_OPTIONS the function already needs — ours is appended, not substituted.\n existingLoaderValue: '--max-old-space-size=2048',\n});\n```\n\nThere is no auto-detection, deliberately. Detecting the adapter means inspecting the function's other\nlayers, which at synth time are frequently unresolved tokens; a detector that was right most of the time\nwould silently break the functions it got wrong. **Applying `HANDLER` to a web-adapter function\noverwrites the adapter's wrapper and the function stops serving.**\n\n`existingLoaderValue` has to be passed explicitly because CDK's `lambda.Function` exposes no way to read\nback an environment variable set elsewhere in your app. Omit it and the loader variable is set to the\nOdigos value alone — for `NODE_OPTIONS` that can mean losing a flag your app needs to boot.\n\nRuby has no verified web-server loader and is rejected at synth in this mode.\n\n## Java handler interfaces\n\nThe Java layer ships four wrapper scripts, one per handler interface, and this is a correctness switch\nrather than a detail level:\n\n```ts\njavaHandlerDistro: OdigosJavaHandlerDistro.OTEL_STREAM_HANDLER\n```\n\n| Distro | For |\n|---|---|\n| `OTEL_HANDLER` (default) | `RequestHandler` |\n| `OTEL_PROXY_HANDLER` | API Gateway proxy events (enriched) |\n| `OTEL_SQS_HANDLER` | SQS events (enriched) |\n| `OTEL_STREAM_HANDLER` | `RequestStreamHandler` |\n\n`OTEL_HANDLER` installs a `RequestHandler` implementation. A `RequestStreamHandler` function has a\ndifferent signature entirely, so wrapping it with the default **breaks the invocation** — it does not\nmerely produce thinner spans.\n\n## Signals\n\n```ts\ndestination: {\n endpoint: 'otlp.example.com:4317',\n metrics: false, // traces and logs stay on\n}\n```\n\nA disabled signal gets no collector pipeline **and** the SDK is told not to produce it. Both halves\nmatter: a signal with no pipeline is refused at the receiver on every batch, so suppressing it at the\nsource is what stops the error loop.\n\nTurning all three off throws at synth — a collector with no pipeline fails to start, which would leave\nthe function instrumented and silent.\n\n## Instrumenting a whole stack\n\n```ts\nAspects.of(stack).add(new OdigosInstrumentationAspect(stack, {\n destination: { endpoint: 'otlp.example.com:4317' },\n}));\n```\n\n`skipUnsupportedRuntimes` defaults to `true` for the aspect: it visits every function in the scope,\nincluding ones whose runtime has no OpenTelemetry Lambda layer (`dotnet*`, `provided.*` for Go and custom\nruntimes). Each skip is a synth warning rather than a silent no-op. The construct defaults it to `false`,\nbecause explicitly asking to instrument a Go function is a mistake worth failing on.\n\n## Credentials in `headers`\n\n`destination.headers` is rendered into `OPENTELEMETRY_COLLECTOR_CONFIG_URI`, which is a plain Lambda\nenvironment variable — readable by anyone with `lambda:GetFunctionConfiguration` and visible in the\nconsole. For a long-lived credential, prefer a destination that authenticates by network position, or\nterminate at a collector you control.\n\n## Do not also instrument these functions with the Odigos connector\n\nThe Odigos AWS connector instruments **live** functions by mutating them, and reconciles them back to its\nown desired state on every pass. A function instrumented here *and* enabled as a connector source ends up\nowned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts the\nconnector's, and every round trip publishes a new function version.\n\nPick one per function. These constructs never set the connector's `ODIGOS_MANAGED` ownership marker — so\nan IaC-instrumented function is not one the connector will roll back — but the connector will take it\nover if you enable it as a source.\n\n## API\n\n| Export | |\n|---|---|\n| `OdigosLambdaInstrumentation` | the construct; `instrument(fn)`, `instrumentAll(fns)` |\n| `OdigosInstrumentationAspect` | applies it to every function in a scope |\n| `OdigosDestination` | where the collector exports; exactly one of `endpoint` / `httpEndpoint` |\n| `OdigosLayerSource` | `ODIGOS_PUBLIC` \\| `IN_ACCOUNT` |\n| `OdigosInstrumentationMode` | `HANDLER` \\| `WEB_SERVER` |\n| `OdigosJavaHandlerDistro` | the four Java wrappers |\n| `renderCollectorConfig` | the collector config renderer, if you want to inspect what gets set |\n| `LAYER_ARNS`, `ODIGOS_VERSION` | the baked layer table and the release it came from |\n\n## License\n\nApache-2.0.\n"
|
|
3829
|
+
"markdown": "# Odigos CDK constructs for AWS Lambda\n\nInstrument AWS Lambda functions with the Odigos OpenTelemetry layer, from your own CDK app.\n\n```bash\nnpm install @odigos/aws-cdk # TypeScript / JavaScript\npip install odigos-aws-cdk # Python\n```\n\n```ts\nimport { OdigosLambdaInstrumentation } from '@odigos/aws-cdk';\n\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [apiFn, workerFn],\n});\n```\n\n```python\nfrom odigos_aws_cdk import OdigosLambdaInstrumentation\n\nOdigosLambdaInstrumentation(self, \"Odigos\",\n destination={\"endpoint\": \"otlp.example.com:4317\"},\n functions=[api_fn, worker_fn],\n)\n```\n\nThat attaches the layer for each function's language and architecture, sets the exec wrapper that loads\nthe OpenTelemetry SDK, and hands the in-Lambda collector its whole configuration.\n\n## How the telemetry actually leaves the function\n\nYour function's SDK **does not** export to your destination. It exports to an OpenTelemetry collector\nrunning inside the same Lambda sandbox, on localhost. The collector forwards to your destination *after*\nthe handler has already returned its response.\n\nThat indirection is the whole point. A slow or unreachable destination costs billed duration, not caller\nlatency — and the collector's `decouple` processor is what holds the sandbox open until the export queue\ndrains, so a low-traffic function does not lose its telemetry to the freeze.\n\nConsequently `OTEL_EXPORTER_OTLP_ENDPOINT` is deliberately never set. If you set it yourself you put the\nexport back on the invocation's critical path.\n\n## Endpoint grammar\n\n`endpoint` is OTLP/**gRPC** as bare `host:port` (conventionally 4317). `httpEndpoint` is OTLP/**HTTP** as a\nscheme-qualified URL (conventionally 4318). Exactly one. They select different collector exporters with\ndifferent endpoint grammars, so a scheme in `endpoint` — or its absence in `httpEndpoint` — throws at synth\nrather than producing a collector that starts and silently delivers nothing. A gRPC endpoint on port 4318\n(or an HTTP one on 4317) is the likeliest version of that mistake, and is reported as a synth warning.\n\n## Choosing a layer source\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [fn],\n layerSource: OdigosLayerSource.IN_ACCOUNT,\n});\n```\n\n| | `ODIGOS_PUBLIC` (default) | `IN_ACCOUNT` |\n|---|---|---|\n| What it synthesizes | a layer ARN | an `AWS::Serverless::Application` (nested stack) per language/arch |\n| Layer owner | the Odigos AWS account | **your** account, created by your stack |\n| Resolution | synth time, from a table baked into this package | deploy time, from the Serverless Application Repository |\n| Environment-agnostic stacks | not supported — needs a concrete region | works |\n| Deploy speed | unchanged | slower on first deploy |\n\nBoth install identical bytes. `IN_ACCOUNT` exists for organisations whose policy forbids attaching a\nLambda layer owned by another AWS account. It needs the deploying principal to be allowed\n`serverlessrepo:CreateCloudFormationTemplate` and `serverlessrepo:GetApplication`.\n\nIf you mirror the layer somewhere yourself, pass `layerVersion` and neither path is used.\n\n## Versioning\n\n**The package version is the layer version.** `@odigos/aws-cdk@0.2.0` resolves to the layer built and\npublished by Odigos release `v0.2.0`, and pins the SAR application to semantic version `0.2.0` — which is\nimmutable, so it means the same bytes forever.\n\nNothing resolves at deploy time in the default path, so upgrading the layer is `npm update` and a\n`cdk diff` that shows the change. An instrumentation layer moving on its own, under a deployment that\nchanged nothing, is not a property you want.\n\n## Handler mode vs. web-server mode\n\n`OdigosInstrumentationMode.HANDLER` (the default) is for a normal Lambda handler. It sets\n`AWS_LAMBDA_EXEC_WRAPPER`.\n\n`OdigosInstrumentationMode.WEB_SERVER` is for a function running a web server behind the\n[AWS Lambda Web Adapter](https://github.com/awslabs/aws-lambda-web-adapter). The adapter owns the exec\nwrapper, so this mode does not touch it and loads instrumentation through the language's own loader\nvariable instead.\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [webFn],\n mode: OdigosInstrumentationMode.WEB_SERVER,\n // NODE_OPTIONS the function already needs — ours is appended, not substituted.\n existingLoaderValue: '--max-old-space-size=2048',\n});\n```\n\nThere is no auto-detection, deliberately. Detecting the adapter means inspecting the function's other\nlayers, which at synth time are frequently unresolved tokens; a detector that was right most of the time\nwould silently break the functions it got wrong. **Applying `HANDLER` to a web-adapter function\noverwrites the adapter's wrapper and the function stops serving.**\n\n`existingLoaderValue` has to be passed explicitly because CDK's `lambda.Function` exposes no way to read\nback an environment variable set elsewhere in your app. Omit it and the loader variable is set to the\nOdigos value alone — for `NODE_OPTIONS` that can mean losing a flag your app needs to boot.\n\nRuby has no verified web-server loader and is rejected at synth in this mode.\n\n## Java handler interfaces\n\nThe Java layer ships four wrapper scripts, one per handler interface, and this is a correctness switch\nrather than a detail level:\n\n```ts\njavaHandlerDistro: OdigosJavaHandlerDistro.OTEL_STREAM_HANDLER\n```\n\n| Distro | For |\n|---|---|\n| `OTEL_HANDLER` (default) | `RequestHandler` |\n| `OTEL_PROXY_HANDLER` | API Gateway proxy events (enriched) |\n| `OTEL_SQS_HANDLER` | SQS events (enriched) |\n| `OTEL_STREAM_HANDLER` | `RequestStreamHandler` |\n\n`OTEL_HANDLER` installs a `RequestHandler` implementation. A `RequestStreamHandler` function has a\ndifferent signature entirely, so wrapping it with the default **breaks the invocation** — it does not\nmerely produce thinner spans.\n\n## Signals\n\n```ts\ndestination: {\n endpoint: 'otlp.example.com:4317',\n metrics: false, // traces and logs stay on\n}\n```\n\nA disabled signal gets no collector pipeline **and** the SDK is told not to produce it. Both halves\nmatter: a signal with no pipeline is refused at the receiver on every batch, so suppressing it at the\nsource is what stops the error loop.\n\nTurning all three off throws at synth — a collector with no pipeline fails to start, which would leave\nthe function instrumented and silent.\n\n## Instrumenting a whole stack\n\n```ts\nAspects.of(stack).add(new OdigosInstrumentationAspect(stack, {\n destination: { endpoint: 'otlp.example.com:4317' },\n}));\n```\n\n`skipUnsupportedRuntimes` defaults to `true` for the aspect: it visits every function in the scope,\nincluding ones whose runtime has no OpenTelemetry Lambda layer (`dotnet*`, `provided.*` for Go and custom\nruntimes). Each skip is a synth warning rather than a silent no-op. The construct defaults it to `false`,\nbecause explicitly asking to instrument a Go function is a mistake worth failing on.\n\n## Credentials in `headers`\n\n`destination.headers` is rendered into `OPENTELEMETRY_COLLECTOR_CONFIG_URI`, which is a plain Lambda\nenvironment variable — readable by anyone with `lambda:GetFunctionConfiguration` and visible in the\nconsole. For a long-lived credential, prefer a destination that authenticates by network position, or\nterminate at a collector you control.\n\n## Making Odigos report the function as instrumented\n\nBy default these constructs do **not** write `ODIGOS_MANAGED`, and the consequence is easy to hit: Odigos\nreports the function as `Absent` — \"awaiting your deployment\" — even though the layer is attached, the\nwrapper is set and the collector is configured. The connector derives ownership from that one variable, and\nchecks for it *before* comparing anything else, so nothing about a correctly instrumented function\nsubstitutes for it.\n\nFor a function Odigos discovers in **manual (IaC) mode** — which is the mode a workload is in unless you\nhave explicitly handed instrumentation to the connector — turn it on:\n\n```ts\nnew OdigosLambdaInstrumentation(this, 'Odigos', {\n destination: { endpoint: 'otlp.example.com:4317' },\n functions: [fn],\n recordOwnershipMarker: true,\n});\n```\n\nThe marker records the exact layer ARN the construct attached, which is also what the connector reads back\nto decide which layer version the function is *supposed* to carry — so a version you pinned is respected\ninstead of being reported as drift. It works in `IN_ACCOUNT` mode too, where the ARN is a deploy-time\nreference your own code has no way to obtain.\n\nIt also records a rollback snapshot (`prevEnv`) naming every variable the construct set. That matters: a\nmarker without one makes an uninstrument remove the **layer** while leaving `AWS_LAMBDA_EXEC_WRAPPER`\npointing into it, which breaks the function at its next cold start. In web-server mode the snapshot holds\nyour `existingLoaderValue`, so a rollback restores your own `NODE_OPTIONS` rather than deleting it.\n\nLeave it `false` for a function you have enabled as an **automatic-mode** connector source: there the\nconnector owns the marker, including a snapshot it wrote itself, and two writers of one ownership record is\nthe combination that genuinely misbehaves.\n\n## Service names\n\nLeft unset, `OTEL_SERVICE_NAME` is the function's physical name when your stack names it explicitly, and\nthe construct id otherwise. The fallback exists because a name CloudFormation generates is a `Ref` to the\nfunction, and a function referencing itself in its own environment is a dependency cycle CloudFormation\nrejects at deploy time.\n\nThe connector compares `OTEL_SERVICE_NAME` against the workload's name in Odigos, which is the real AWS\nfunction name — so for a function whose name is generated, pass `serviceName` explicitly or it is reported\nas drifted. `serviceName` applies to **every** function a construct instruments, so use one construct per\nfunction when you want per-function names.\n\n## Do not also instrument these functions with the Odigos connector\n\nThe Odigos AWS connector instruments **live** functions by mutating them, and reconciles them back to its\nown desired state on every pass. A function instrumented here *and* enabled as an automatic-mode connector\nsource ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts\nthe connector's, and every round trip publishes a new function version.\n\nPick one per function. Discovery-only (manual) mode is the combination that works: Odigos watches and\nreports, your stack owns the configuration — that is what `recordOwnershipMarker` is for.\n\n## API\n\n| Export | |\n|---|---|\n| `OdigosLambdaInstrumentation` | the construct; `instrument(fn)`, `instrumentAll(fns)` |\n| `OdigosInstrumentationAspect` | applies it to every function in a scope |\n| `OdigosDestination` | where the collector exports; exactly one of `endpoint` / `httpEndpoint` |\n| `OdigosLayerSource` | `ODIGOS_PUBLIC` \\| `IN_ACCOUNT` |\n| `OdigosInstrumentationMode` | `HANDLER` \\| `WEB_SERVER` |\n| `OdigosJavaHandlerDistro` | the four Java wrappers |\n| `recordOwnershipMarker` | the option that makes Odigos recognise the function as instrumented |\n| `renderCollectorConfig` | the collector config renderer, if you want to inspect what gets set |\n| `LAYER_ARNS`, `ODIGOS_VERSION` | the baked layer table and the release it came from |\n\n## License\n\nApache-2.0.\n"
|
|
3830
3830
|
},
|
|
3831
3831
|
"repository": {
|
|
3832
3832
|
"directory": "cdk",
|
|
@@ -4016,7 +4016,7 @@
|
|
|
4016
4016
|
},
|
|
4017
4017
|
"locationInModule": {
|
|
4018
4018
|
"filename": "src/instrumentation.ts",
|
|
4019
|
-
"line":
|
|
4019
|
+
"line": 447
|
|
4020
4020
|
},
|
|
4021
4021
|
"parameters": [
|
|
4022
4022
|
{
|
|
@@ -4043,7 +4043,7 @@
|
|
|
4043
4043
|
"kind": "class",
|
|
4044
4044
|
"locationInModule": {
|
|
4045
4045
|
"filename": "src/instrumentation.ts",
|
|
4046
|
-
"line":
|
|
4046
|
+
"line": 439
|
|
4047
4047
|
},
|
|
4048
4048
|
"methods": [
|
|
4049
4049
|
{
|
|
@@ -4053,7 +4053,7 @@
|
|
|
4053
4053
|
},
|
|
4054
4054
|
"locationInModule": {
|
|
4055
4055
|
"filename": "src/instrumentation.ts",
|
|
4056
|
-
"line":
|
|
4056
|
+
"line": 454
|
|
4057
4057
|
},
|
|
4058
4058
|
"name": "visit",
|
|
4059
4059
|
"overrides": "aws-cdk-lib.IAspect",
|
|
@@ -4084,7 +4084,7 @@
|
|
|
4084
4084
|
"kind": "interface",
|
|
4085
4085
|
"locationInModule": {
|
|
4086
4086
|
"filename": "src/instrumentation.ts",
|
|
4087
|
-
"line":
|
|
4087
|
+
"line": 420
|
|
4088
4088
|
},
|
|
4089
4089
|
"name": "OdigosInstrumentationAspectProps",
|
|
4090
4090
|
"symbolId": "src/instrumentation:OdigosInstrumentationAspectProps"
|
|
@@ -4134,7 +4134,7 @@
|
|
|
4134
4134
|
"kind": "interface",
|
|
4135
4135
|
"locationInModule": {
|
|
4136
4136
|
"filename": "src/instrumentation.ts",
|
|
4137
|
-
"line":
|
|
4137
|
+
"line": 85
|
|
4138
4138
|
},
|
|
4139
4139
|
"name": "OdigosInstrumentationOptions",
|
|
4140
4140
|
"properties": [
|
|
@@ -4147,7 +4147,7 @@
|
|
|
4147
4147
|
"immutable": true,
|
|
4148
4148
|
"locationInModule": {
|
|
4149
4149
|
"filename": "src/instrumentation.ts",
|
|
4150
|
-
"line":
|
|
4150
|
+
"line": 89
|
|
4151
4151
|
},
|
|
4152
4152
|
"name": "destination",
|
|
4153
4153
|
"type": {
|
|
@@ -4165,7 +4165,7 @@
|
|
|
4165
4165
|
"immutable": true,
|
|
4166
4166
|
"locationInModule": {
|
|
4167
4167
|
"filename": "src/instrumentation.ts",
|
|
4168
|
-
"line":
|
|
4168
|
+
"line": 141
|
|
4169
4169
|
},
|
|
4170
4170
|
"name": "debug",
|
|
4171
4171
|
"optional": true,
|
|
@@ -4184,7 +4184,7 @@
|
|
|
4184
4184
|
"immutable": true,
|
|
4185
4185
|
"locationInModule": {
|
|
4186
4186
|
"filename": "src/instrumentation.ts",
|
|
4187
|
-
"line":
|
|
4187
|
+
"line": 163
|
|
4188
4188
|
},
|
|
4189
4189
|
"name": "existingLoaderValue",
|
|
4190
4190
|
"optional": true,
|
|
@@ -4203,7 +4203,7 @@
|
|
|
4203
4203
|
"immutable": true,
|
|
4204
4204
|
"locationInModule": {
|
|
4205
4205
|
"filename": "src/instrumentation.ts",
|
|
4206
|
-
"line":
|
|
4206
|
+
"line": 114
|
|
4207
4207
|
},
|
|
4208
4208
|
"name": "javaHandlerDistro",
|
|
4209
4209
|
"optional": true,
|
|
@@ -4221,7 +4221,7 @@
|
|
|
4221
4221
|
"immutable": true,
|
|
4222
4222
|
"locationInModule": {
|
|
4223
4223
|
"filename": "src/instrumentation.ts",
|
|
4224
|
-
"line":
|
|
4224
|
+
"line": 96
|
|
4225
4225
|
},
|
|
4226
4226
|
"name": "layerSource",
|
|
4227
4227
|
"optional": true,
|
|
@@ -4240,7 +4240,7 @@
|
|
|
4240
4240
|
"immutable": true,
|
|
4241
4241
|
"locationInModule": {
|
|
4242
4242
|
"filename": "src/instrumentation.ts",
|
|
4243
|
-
"line":
|
|
4243
|
+
"line": 151
|
|
4244
4244
|
},
|
|
4245
4245
|
"name": "layerVersion",
|
|
4246
4246
|
"optional": true,
|
|
@@ -4259,7 +4259,7 @@
|
|
|
4259
4259
|
"immutable": true,
|
|
4260
4260
|
"locationInModule": {
|
|
4261
4261
|
"filename": "src/instrumentation.ts",
|
|
4262
|
-
"line":
|
|
4262
|
+
"line": 107
|
|
4263
4263
|
},
|
|
4264
4264
|
"name": "mode",
|
|
4265
4265
|
"optional": true,
|
|
@@ -4267,6 +4267,25 @@
|
|
|
4267
4267
|
"fqn": "@odigos/aws-cdk.OdigosInstrumentationMode"
|
|
4268
4268
|
}
|
|
4269
4269
|
},
|
|
4270
|
+
{
|
|
4271
|
+
"abstract": true,
|
|
4272
|
+
"docs": {
|
|
4273
|
+
"default": "false",
|
|
4274
|
+
"remarks": "WITHOUT IT THE FUNCTION IS REPORTED AS UNINSTRUMENTED. The connector derives ownership from this\nvariable alone: no marker means `Absent` — \"awaiting your deployment\" — even though the layer is\nattached, the wrapper is set and the collector is configured. Set this to `true` for a function that\nOdigos discovers in MANUAL (IaC) mode, which is the mode a workload is in unless you explicitly hand\ninstrumentation to the connector.\n\nLeave it `false` (the default) for a function you have enabled as an AUTOMATIC-mode connector source.\nThere, the connector instruments the function itself and owns this variable, including the `prevEnv`\nsnapshot it restores on rollback; two writers of one ownership record is the one combination that\ngenuinely misbehaves.\n\nThe marker records the exact layer ARN this construct attached, which is also what the connector reads\nback to decide which layer version the function is supposed to carry — so a version you pinned is\nrespected rather than reported as drift. It works in every layer mode, including `IN_ACCOUNT`, where the\nARN is a deploy-time reference your own code cannot obtain.",
|
|
4275
|
+
"stability": "stable",
|
|
4276
|
+
"summary": "Write `ODIGOS_MANAGED`, the marker that makes the Odigos connector recognise this function as instrumented."
|
|
4277
|
+
},
|
|
4278
|
+
"immutable": true,
|
|
4279
|
+
"locationInModule": {
|
|
4280
|
+
"filename": "src/instrumentation.ts",
|
|
4281
|
+
"line": 187
|
|
4282
|
+
},
|
|
4283
|
+
"name": "recordOwnershipMarker",
|
|
4284
|
+
"optional": true,
|
|
4285
|
+
"type": {
|
|
4286
|
+
"primitive": "boolean"
|
|
4287
|
+
}
|
|
4288
|
+
},
|
|
4270
4289
|
{
|
|
4271
4290
|
"abstract": true,
|
|
4272
4291
|
"docs": {
|
|
@@ -4278,7 +4297,7 @@
|
|
|
4278
4297
|
"immutable": true,
|
|
4279
4298
|
"locationInModule": {
|
|
4280
4299
|
"filename": "src/instrumentation.ts",
|
|
4281
|
-
"line":
|
|
4300
|
+
"line": 129
|
|
4282
4301
|
},
|
|
4283
4302
|
"name": "serviceName",
|
|
4284
4303
|
"optional": true,
|
|
@@ -4297,7 +4316,7 @@
|
|
|
4297
4316
|
"immutable": true,
|
|
4298
4317
|
"locationInModule": {
|
|
4299
4318
|
"filename": "src/instrumentation.ts",
|
|
4300
|
-
"line":
|
|
4319
|
+
"line": 198
|
|
4301
4320
|
},
|
|
4302
4321
|
"name": "skipUnsupportedRuntimes",
|
|
4303
4322
|
"optional": true,
|
|
@@ -4370,7 +4389,7 @@
|
|
|
4370
4389
|
},
|
|
4371
4390
|
"locationInModule": {
|
|
4372
4391
|
"filename": "src/instrumentation.ts",
|
|
4373
|
-
"line":
|
|
4392
|
+
"line": 249
|
|
4374
4393
|
},
|
|
4375
4394
|
"parameters": [
|
|
4376
4395
|
{
|
|
@@ -4396,7 +4415,7 @@
|
|
|
4396
4415
|
"kind": "class",
|
|
4397
4416
|
"locationInModule": {
|
|
4398
4417
|
"filename": "src/instrumentation.ts",
|
|
4399
|
-
"line":
|
|
4418
|
+
"line": 243
|
|
4400
4419
|
},
|
|
4401
4420
|
"methods": [
|
|
4402
4421
|
{
|
|
@@ -4407,7 +4426,7 @@
|
|
|
4407
4426
|
},
|
|
4408
4427
|
"locationInModule": {
|
|
4409
4428
|
"filename": "src/instrumentation.ts",
|
|
4410
|
-
"line":
|
|
4429
|
+
"line": 289
|
|
4411
4430
|
},
|
|
4412
4431
|
"name": "instrument",
|
|
4413
4432
|
"parameters": [
|
|
@@ -4426,7 +4445,7 @@
|
|
|
4426
4445
|
},
|
|
4427
4446
|
"locationInModule": {
|
|
4428
4447
|
"filename": "src/instrumentation.ts",
|
|
4429
|
-
"line":
|
|
4448
|
+
"line": 322
|
|
4430
4449
|
},
|
|
4431
4450
|
"name": "instrumentAll",
|
|
4432
4451
|
"parameters": [
|
|
@@ -4461,7 +4480,7 @@
|
|
|
4461
4480
|
"kind": "interface",
|
|
4462
4481
|
"locationInModule": {
|
|
4463
4482
|
"filename": "src/instrumentation.ts",
|
|
4464
|
-
"line":
|
|
4483
|
+
"line": 204
|
|
4465
4484
|
},
|
|
4466
4485
|
"name": "OdigosLambdaInstrumentationProps",
|
|
4467
4486
|
"properties": [
|
|
@@ -4476,7 +4495,7 @@
|
|
|
4476
4495
|
"immutable": true,
|
|
4477
4496
|
"locationInModule": {
|
|
4478
4497
|
"filename": "src/instrumentation.ts",
|
|
4479
|
-
"line":
|
|
4498
|
+
"line": 210
|
|
4480
4499
|
},
|
|
4481
4500
|
"name": "functions",
|
|
4482
4501
|
"optional": true,
|
|
@@ -4526,6 +4545,6 @@
|
|
|
4526
4545
|
"symbolId": "src/types:OdigosLayerSource"
|
|
4527
4546
|
}
|
|
4528
4547
|
},
|
|
4529
|
-
"version": "0.0.
|
|
4530
|
-
"fingerprint": "
|
|
4548
|
+
"version": "0.0.11",
|
|
4549
|
+
"fingerprint": "GhtDOF4Uik3gZvcWZlYji/v3oOcE8BiYdiH6HobYKlc="
|
|
4531
4550
|
}
|
package/README.md
CHANGED
|
@@ -41,6 +41,14 @@ drains, so a low-traffic function does not lose its telemetry to the freeze.
|
|
|
41
41
|
Consequently `OTEL_EXPORTER_OTLP_ENDPOINT` is deliberately never set. If you set it yourself you put the
|
|
42
42
|
export back on the invocation's critical path.
|
|
43
43
|
|
|
44
|
+
## Endpoint grammar
|
|
45
|
+
|
|
46
|
+
`endpoint` is OTLP/**gRPC** as bare `host:port` (conventionally 4317). `httpEndpoint` is OTLP/**HTTP** as a
|
|
47
|
+
scheme-qualified URL (conventionally 4318). Exactly one. They select different collector exporters with
|
|
48
|
+
different endpoint grammars, so a scheme in `endpoint` — or its absence in `httpEndpoint` — throws at synth
|
|
49
|
+
rather than producing a collector that starts and silently delivers nothing. A gRPC endpoint on port 4318
|
|
50
|
+
(or an HTTP one on 4317) is the likeliest version of that mistake, and is reported as a synth warning.
|
|
51
|
+
|
|
44
52
|
## Choosing a layer source
|
|
45
53
|
|
|
46
54
|
```ts
|
|
@@ -162,16 +170,60 @@ environment variable — readable by anyone with `lambda:GetFunctionConfiguratio
|
|
|
162
170
|
console. For a long-lived credential, prefer a destination that authenticates by network position, or
|
|
163
171
|
terminate at a collector you control.
|
|
164
172
|
|
|
173
|
+
## Making Odigos report the function as instrumented
|
|
174
|
+
|
|
175
|
+
By default these constructs do **not** write `ODIGOS_MANAGED`, and the consequence is easy to hit: Odigos
|
|
176
|
+
reports the function as `Absent` — "awaiting your deployment" — even though the layer is attached, the
|
|
177
|
+
wrapper is set and the collector is configured. The connector derives ownership from that one variable, and
|
|
178
|
+
checks for it *before* comparing anything else, so nothing about a correctly instrumented function
|
|
179
|
+
substitutes for it.
|
|
180
|
+
|
|
181
|
+
For a function Odigos discovers in **manual (IaC) mode** — which is the mode a workload is in unless you
|
|
182
|
+
have explicitly handed instrumentation to the connector — turn it on:
|
|
183
|
+
|
|
184
|
+
```ts
|
|
185
|
+
new OdigosLambdaInstrumentation(this, 'Odigos', {
|
|
186
|
+
destination: { endpoint: 'otlp.example.com:4317' },
|
|
187
|
+
functions: [fn],
|
|
188
|
+
recordOwnershipMarker: true,
|
|
189
|
+
});
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
The marker records the exact layer ARN the construct attached, which is also what the connector reads back
|
|
193
|
+
to decide which layer version the function is *supposed* to carry — so a version you pinned is respected
|
|
194
|
+
instead of being reported as drift. It works in `IN_ACCOUNT` mode too, where the ARN is a deploy-time
|
|
195
|
+
reference your own code has no way to obtain.
|
|
196
|
+
|
|
197
|
+
It also records a rollback snapshot (`prevEnv`) naming every variable the construct set. That matters: a
|
|
198
|
+
marker without one makes an uninstrument remove the **layer** while leaving `AWS_LAMBDA_EXEC_WRAPPER`
|
|
199
|
+
pointing into it, which breaks the function at its next cold start. In web-server mode the snapshot holds
|
|
200
|
+
your `existingLoaderValue`, so a rollback restores your own `NODE_OPTIONS` rather than deleting it.
|
|
201
|
+
|
|
202
|
+
Leave it `false` for a function you have enabled as an **automatic-mode** connector source: there the
|
|
203
|
+
connector owns the marker, including a snapshot it wrote itself, and two writers of one ownership record is
|
|
204
|
+
the combination that genuinely misbehaves.
|
|
205
|
+
|
|
206
|
+
## Service names
|
|
207
|
+
|
|
208
|
+
Left unset, `OTEL_SERVICE_NAME` is the function's physical name when your stack names it explicitly, and
|
|
209
|
+
the construct id otherwise. The fallback exists because a name CloudFormation generates is a `Ref` to the
|
|
210
|
+
function, and a function referencing itself in its own environment is a dependency cycle CloudFormation
|
|
211
|
+
rejects at deploy time.
|
|
212
|
+
|
|
213
|
+
The connector compares `OTEL_SERVICE_NAME` against the workload's name in Odigos, which is the real AWS
|
|
214
|
+
function name — so for a function whose name is generated, pass `serviceName` explicitly or it is reported
|
|
215
|
+
as drifted. `serviceName` applies to **every** function a construct instruments, so use one construct per
|
|
216
|
+
function when you want per-function names.
|
|
217
|
+
|
|
165
218
|
## Do not also instrument these functions with the Odigos connector
|
|
166
219
|
|
|
167
220
|
The Odigos AWS connector instruments **live** functions by mutating them, and reconciles them back to its
|
|
168
|
-
own desired state on every pass. A function instrumented here *and* enabled as
|
|
169
|
-
owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts
|
|
170
|
-
connector's, and every round trip publishes a new function version.
|
|
221
|
+
own desired state on every pass. A function instrumented here *and* enabled as an automatic-mode connector
|
|
222
|
+
source ends up owned by both: each `cdk deploy` reasserts the CDK's environment, each reconcile reasserts
|
|
223
|
+
the connector's, and every round trip publishes a new function version.
|
|
171
224
|
|
|
172
|
-
Pick one per function.
|
|
173
|
-
|
|
174
|
-
over if you enable it as a source.
|
|
225
|
+
Pick one per function. Discovery-only (manual) mode is the combination that works: Odigos watches and
|
|
226
|
+
reports, your stack owns the configuration — that is what `recordOwnershipMarker` is for.
|
|
175
227
|
|
|
176
228
|
## API
|
|
177
229
|
|
|
@@ -183,6 +235,7 @@ over if you enable it as a source.
|
|
|
183
235
|
| `OdigosLayerSource` | `ODIGOS_PUBLIC` \| `IN_ACCOUNT` |
|
|
184
236
|
| `OdigosInstrumentationMode` | `HANDLER` \| `WEB_SERVER` |
|
|
185
237
|
| `OdigosJavaHandlerDistro` | the four Java wrappers |
|
|
238
|
+
| `recordOwnershipMarker` | the option that makes Odigos recognise the function as instrumented |
|
|
186
239
|
| `renderCollectorConfig` | the collector config renderer, if you want to inspect what gets set |
|
|
187
240
|
| `LAYER_ARNS`, `ODIGOS_VERSION` | the baked layer table and the release it came from |
|
|
188
241
|
|
package/lib/collector-config.js
CHANGED
|
@@ -170,6 +170,18 @@ function renderCollectorConfig(dest) {
|
|
|
170
170
|
throw new Error('Odigos destination sets both `endpoint` (OTLP/gRPC) and `httpEndpoint` (OTLP/HTTP); ' +
|
|
171
171
|
'they select different collector exporters, so exactly one must be set.');
|
|
172
172
|
}
|
|
173
|
+
// The two fields have different endpoint GRAMMARS, and getting them wrong is the worst failure mode this
|
|
174
|
+
// package has: the collector accepts the configuration, fails to build its exporter, and exits — leaving
|
|
175
|
+
// the function instrumented, reporting healthy, and exporting nothing. Both checks are therefore synth
|
|
176
|
+
// errors rather than documentation.
|
|
177
|
+
if (dest.endpoint && dest.endpoint.includes('://')) {
|
|
178
|
+
throw new Error(`Odigos destination \`endpoint\` is "${dest.endpoint}", but the gRPC exporter takes host:port with ` +
|
|
179
|
+
'no scheme. Use `httpEndpoint` for a scheme-qualified OTLP/HTTP URL.');
|
|
180
|
+
}
|
|
181
|
+
if (dest.httpEndpoint && !/^https?:\/\//.test(dest.httpEndpoint)) {
|
|
182
|
+
throw new Error(`Odigos destination \`httpEndpoint\` is "${dest.httpEndpoint}", but the OTLP/HTTP exporter takes a ` +
|
|
183
|
+
'scheme-qualified URL (http:// or https://). Use `endpoint` for a bare gRPC host:port.');
|
|
184
|
+
}
|
|
173
185
|
const exporter = renderExporter(dest);
|
|
174
186
|
const pipelines = renderPipelines(dest, exporterNameFor(dest));
|
|
175
187
|
if (pipelines === '') {
|
|
@@ -189,4 +201,4 @@ function renderCollectorConfig(dest) {
|
|
|
189
201
|
pipelines +
|
|
190
202
|
'}}');
|
|
191
203
|
}
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdG9yLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb2xsZWN0b3ItY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBFQSxzQ0FFQztBQW1CRCwwQ0FFQztBQXdFRCxrREFFQztBQU9ELHNEQStCQztBQS9NRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSDs7Ozs7O0dBTUc7QUFDVSxRQUFBLHdCQUF3QixHQUFHLG9DQUFvQyxDQUFDO0FBRTdFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQztBQUV4Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQ3hCLDJGQUEyRjtJQUMzRixnRUFBZ0UsQ0FBQztBQUVuRSxpRUFBaUU7QUFDcEQsUUFBQSxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBRXBDLHFGQUFxRjtBQUN4RSxRQUFBLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDO0FBQzdDLFFBQUEsb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFDL0MsUUFBQSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztBQUV0RCxxREFBcUQ7QUFDckQsU0FBZ0IsYUFBYSxDQUFDLEtBQTBCO0lBQ3RELE9BQU8sS0FBSyxLQUFLLEtBQUssQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsVUFBVSxDQUFDLENBQVM7SUFDM0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLElBQXVCO0lBQ3JELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxPQUFtQztJQUN4RCxJQUFJLENBQUMs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QUFJLENBQUMsQ0FBQztJQUN0QyxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9ELElBQUksU0FBUyxLQUFLLEVBQUUsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQ2IsNEZBQTRGO1lBQzFGLDJFQUEyRSxDQUM5RSxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sQ0FDTCx1QkFBdUI7UUFDdkIsaUNBQWlDO1FBQ2pDLHFHQUFxRztRQUNyRyx1RUFBdUU7UUFDdkUsOEVBQThFO1FBQzlFLGNBQWM7UUFDZCxvQkFBb0I7UUFDcEIsZUFBZTtRQUNmLFFBQVE7UUFDUiw4REFBOEQ7UUFDOUQsU0FBUztRQUNULElBQUksQ0FDTCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9kaWdvc0Rlc3RpbmF0aW9uIH0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogUmVuZGVycyB0aGUgaW4tTGFtYmRhIGNvbGxlY3RvcidzIGNvbXBsZXRlIGNvbmZpZ3VyYXRpb24gYXMgYW4gaW5saW5lXG4gKiBgT1BFTlRFTEVNRVRSWV9DT0xMRUNUT1JfQ09ORklHX1VSSWAgdmFsdWUuXG4gKlxuICogVGhpcyBpcyBhIFBPUlQgb2YgYHJlbmRlckNvbGxlY3RvckNvbmZpZ2AgaW4gdGhlIGNvbm5lY3RvclxuICogKGNvbm5lY3RvcnMvcHJvdmlkZXJzL2F3cy9wa2cvd29ya2xvYWQvaW5zdHJ1bWVudG9yL2NvbGxlY3Rvcl9jb25maWcuZ28pIGFuZCBpcyBkZWxpYmVyYXRlbHlcbiAqIGJ5dGUtZm9yLWJ5dGUgY29tcGF0aWJsZSB3aXRoIGl0LiBUaGF0IGVxdWl2YWxlbmNlIGlzIG5vdCBjb3NtZXRpYzogYSBmdW5jdGlvbiBpbnN0cnVtZW50ZWQgaGVyZSBhbmRcbiAqIGxhdGVyIGVuYWJsZWQgYXMgYSBjb25uZWN0b3Igc291cmNlIGlzIGNvbXBhcmVkIGFnYWluc3QgdGhlIGNvbm5lY3RvcidzIHJlbmRlcmluZyB0byBkZWNpZGUgd2hldGhlciBpdFxuICogbmVlZHMgY29udmVyZ2luZy4gQSBzdHJheSBzcGFjZSB3b3VsZCBtYWtlIGV2ZXJ5IHJlY29uY2lsZSBzZWUgZHJpZnQgYW5kIGNodXJuIGEgbmV3IGZ1bmN0aW9uIHZlcnNpb25cbiAqIGZvcmV2ZXIuXG4gKlxuICogV0hZIFRIRSBXSE9MRSBET0NVTUVOVCwgUkFUSEVSIFRIQU4gQSBGRVcgVkFSSUFCTEVTLiBUaGUgbGF5ZXIgc2hpcHMgYSBiYWtlZFxuICogL29wdC9jb2xsZWN0b3ItY29uZmlnL2NvbmZpZy55YW1sLCBidXQgdGhhdCBmaWxlIGlzIE9ORSBkb2N1bWVudCBzaGFyZWQgYnkgZXZlcnkgZnVuY3Rpb24sIHNvIGl0IGNhblxuICogb25seSByZWFjaCBhIGRlc3RpbmF0aW9uIHRocm91Z2ggZW52IGluZGlyZWN0aW9uIOKAlCBgJHtlbnY6U09NRVRISU5HfWAuIFRoYXQgbWFkZSB0aHJlZSB0aGluZ3NcbiAqIGltcG9zc2libGUgYXQgb25jZTpcbiAqXG4gKiAgIC0gQVVUSC4gQSBjcmVkZW50aWFsIGlzIGEgaGVhZGVycyBtYXAsIG5vdCBhIHNjYWxhci4gQSBiYWtlZCBmaWxlIGNhbiBzdWJzdGl0dXRlIGEgdmFsdWUgYnV0IGNhbm5vdFxuICogICAgIGNvbmRpdGlvbmFsbHkgZ3JvdyBhIGBoZWFkZXJzOmAgYmxvY2ssIHNvIGFuIGF1dGhlbnRpY2F0ZWQgZGVzdGluYXRpb24gd2FzIHVucmVhY2hhYmxlLlxuICogICAtIE9UTFAvSFRUUCBERVNUSU5BVElPTlMuIFRoZSBiYWtlZCBmaWxlIGhhcmRjb2RlcyBhIGdSUEMgYG90bHBgIGV4cG9ydGVyLiBBbiBvdGxwaHR0cC1vbmx5XG4gKiAgICAgZGVzdGluYXRpb24gcmVzb2x2ZXMgd2l0aCBhbiBlbXB0eSBnUlBDIGVuZHBvaW50LCBhbmQgdGhlIGNvbGxlY3RvciBkb2VzIG5vdCBkZWdyYWRlIOKAlCBpdCBmYWlscyB0b1xuICogICAgIGJ1aWxkIHRoZSBwaXBlbGluZSBhbmQgZXhpdHMsIHNvIHRoZSBmdW5jdGlvbiBpcyBpbnN0cnVtZW50ZWQsIGxvb2tzIGhlYWx0aHksIGFuZCBleHBvcnRzIG5vdGhpbmcuXG4gKiAgIC0gUEVSLVNJR05BTCBQSVBFTElORVMuIFRoZSBiYWtlZCBmaWxlIGRlY2xhcmVzIGFsbCB0aHJlZSBwaXBlbGluZXMgdW5jb25kaXRpb25hbGx5LCBzbyBhIHNpZ25hbCB0aGVcbiAqICAgICBkZXN0aW5hdGlvbiBkb2VzIG5vdCBhY2NlcHQgaXMgcmVjZWl2ZWQgYW5kIHRoZW4gZmFpbHMgb24gZXhwb3J0IHJhdGhlciB0aGFuIG5ldmVyIGJlaW5nIGJ1aWx0LlxuICpcbiAqIEZMT1cgU1RZTEUgSVMgTE9BRC1CRUFSSU5HLiBUaGUgZG9jdW1lbnQgaXMgZW1pdHRlZCBvbiBhIHNpbmdsZSBsaW5lIGJlY2F1c2UgaXQgaGFzIHRvIHN1cnZpdmUgYXMgYW5cbiAqIGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlLiBJbiBhIFlBTUwgZmxvdyBtYXBwaW5nIGEgY29sb24gbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlLCBvciB0aGUgcGFyc2VyXG4gKiByZWFkcyBgYTpiYCBhcyB0aGUgcGxhaW4gc2NhbGFyIGBcImE6YlwiYCByYXRoZXIgdGhhbiBhIG1hcHBpbmcuIFdyaXR0ZW4gd2l0aG91dCB0aGUgc3BhY2VzIHRoZSBjb2xsZWN0b3JcbiAqIGFjY2VwdHMgdGhlIHZhcmlhYmxlLCByZXBvcnRzIHRoZSBVUkkgaXQgcmVhZCwgYW5kIHRoZW4gZmFpbHMgdG8gc3RhcnQgd2l0aCBhIGJhcmVcbiAqIGBvdGVsY29sIHN0YXRlIGlzIENsb3NlZGAg4oCUIG5vIHBhcnNlIGVycm9yLCBubyBtZW50aW9uIG9mIHRoZSBjb25maWcuIEV2ZXJ5IGA6IGAgYmVsb3cgZWFybnMgaXRzIHBsYWNlLlxuICovXG5cbi8qKlxuICogVGhlIGNvbGxlY3RvciBsYXllcidzIG93biBjb25maWctc291cmNlIHZhcmlhYmxlIOKAlCB1cHN0cmVhbSdzIG5hbWUsIG5vdCBvdXJzLiBQb2ludGVkIGF0IGEgYHlhbWw6YCBVUklcbiAqIGl0IGNhcnJpZXMgdGhlIGVudGlyZSBjb25maWd1cmF0aW9uIGlubGluZSwgc28gbm8gc2Vjb25kIHZhcmlhYmxlIGlzIG5lZWRlZCB0byBob2xkIGl0LlxuICpcbiAqIFVwc3RyZWFtIGFsc28gcmVhZHMgdGhlIG9sZGVyIGBPUEVOVEVMRU1FVFJZX0NPTExFQ1RPUl9DT05GSUdfRklMRWAgYW5kIGxvZ3MgYSBkZXByZWNhdGlvbiB3YXJuaW5nIGZvclxuICogaXQ7IHRoaXMgaXMgdGhlIGN1cnJlbnQgbmFtZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEVOVl9DT0xMRUNUT1JfQ09ORklHX1VSSSA9ICdPUEVOVEVMRU1FVFJZX0NPTExFQ1RPUl9DT05GSUdfVVJJJztcblxuLyoqXG4gKiBUaGUgY29uZm1hcCBwcm92aWRlciB0aGF0IHJlYWRzIGEgY29uZmlndXJhdGlvbiBvdXQgb2YgdGhlIFVSSSBpdHNlbGYuIFRoZSBjb2xsZWN0b3IgcmVnaXN0ZXJzXG4gKiBlbnYvZmlsZS95YW1sL2h0dHAvaHR0cHMvczMgcHJvdmlkZXJzOyBgeWFtbDpgIGlzIHRoZSBvbmx5IG9uZSB0aGF0IG5lZWRzIG5vIHNlY29uZCB2YXJpYWJsZSBhbmQgbm9cbiAqIG5ldHdvcmsgcmVhZCBvbiBhIGNvbGQgc3RhcnQuXG4gKi9cbmNvbnN0IENPTExFQ1RPUl9DT05GSUdfU0NIRU1FID0gJ3lhbWw6JztcblxuLyoqXG4gKiBNaXJyb3JzIHRoZSBiYWtlZCBjb25maWcncyBwcm9jZXNzb3Igc2V0LCBhbmQgdGhlIE9SREVSIGlzIHRoZSBjb250cmFjdDpcbiAqXG4gKiAgIC0gYG1lbW9yeV9saW1pdGVyYCBmaXJzdCwgc28gYW4gZXhwb3J0IGJhY2tsb2cgaXMgc2hlZCBiZWZvcmUgaXQgaXMgY2hhcmdlZCB0byB0aGUgc2FtZSBtZW1vcnkgYnVkZ2V0XG4gKiAgICAgdGhlIGN1c3RvbWVyJ3MgaGFuZGxlciBhbGxvY2F0ZXMgZnJvbS4gUGVyY2VudGFnZXMsIG5vdCBgbGltaXRfbWliYCwgYmVjYXVzZSBvbmUgbGF5ZXIgc2VydmVzXG4gKiAgICAgZnVuY3Rpb25zIGZyb20gMTI4TUIgdG8gMTBHQi5cbiAqICAgLSBgZGVjb3VwbGVgIExBU1QuIExhbWJkYSBmcmVlemVzIHRoZSBzYW5kYm94IG9uY2UgdGhlIGhhbmRsZXIgcmV0dXJucyBhbmQgZXZlcnkgZXh0ZW5zaW9uIGhhcyBjYWxsZWRcbiAqICAgICAvbmV4dDsgYSBmcm96ZW4gc2FuZGJveCBydW5zIG5vIHRpbWVycywgc28gYSBiYXRjaCBzaXR0aW5nIGJlaGluZCBpdHMgdGltZW91dCBpcyBmbHVzaGVkIG9uIGEgbGF0ZXJcbiAqICAgICBpbnZvY2F0aW9uIG9yIGRyb3BwZWQgd2hlbiB0aGUgc2FuZGJveCBpcyByZWFwZWQuIGBkZWNvdXBsZWAgYWNrbm93bGVkZ2VzIHRoZSByZWNlaXZlIHBhdGhcbiAqICAgICBpbW1lZGlhdGVseSBhbmQgdHJhY2tzIGluLWZsaWdodCBleHBvcnRzLCB3aGljaCBpcyB3aGF0IGxldHMgdGhlIGV4dGVuc2lvbiBob2xkIC9uZXh0IG9wZW4gdW50aWwgdGhlXG4gKiAgICAgcXVldWUgZHJhaW5zIOKAlCBhZnRlciB0aGUgY2FsbGVyIGFscmVhZHkgaGFzIGl0cyByZXNwb25zZS5cbiAqL1xuY29uc3QgQ09MTEVDVE9SX1BST0NFU1NPUlMgPVxuICAne21lbW9yeV9saW1pdGVyOiB7Y2hlY2tfaW50ZXJ2YWw6IDFzLCBsaW1pdF9wZXJjZW50YWdlOiA1MCwgc3Bpa2VfbGltaXRfcGVyY2VudGFnZTogMjB9LCAnICtcbiAgJ2JhdGNoOiB7c2VuZF9iYXRjaF9zaXplOiA1MTIsIHRpbWVvdXQ6IDIwMG1zfSwgZGVjb3VwbGU6IG51bGx9JztcblxuLyoqIFZhbHVlIGFuIHVuc3VwcG9ydGVkIHNpZ25hbCdzIGBPVEVMXypfRVhQT1JURVJgIGlzIHNldCB0by4gKi9cbmV4cG9ydCBjb25zdCBFWFBPUlRFUl9OT05FID0gJ25vbmUnO1xuXG4vKiogVGhlIHRocmVlIGBPVEVMXypfRVhQT1JURVJgIHZhcmlhYmxlcywgaW4gdGhlIG9yZGVyIHRoZSBjb25uZWN0b3Igd3JpdGVzIHRoZW0uICovXG5leHBvcnQgY29uc3QgRU5WX1RSQUNFU19FWFBPUlRFUiA9ICdPVEVMX1RSQUNFU19FWFBPUlRFUic7XG5leHBvcnQgY29uc3QgRU5WX01FVFJJQ1NfRVhQT1JURVIgPSAnT1RFTF9NRVRSSUNTX0VYUE9SVEVSJztcbmV4cG9ydCBjb25zdCBFTlZfTE9HU19FWFBPUlRFUiA9ICdPVEVMX0xPR1NfRVhQT1JURVInO1xuXG4vKiogV2hldGhlciBhIHNpZ25hbCBpcyBlbmFibGVkLCBkZWZhdWx0aW5nIHRvIG9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbEVuYWJsZWQodmFsdWU6IGJvb2xlYW4gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuIHZhbHVlICE9PSBmYWxzZTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIGEgZG91YmxlLXF1b3RlZCBZQU1MIHNjYWxhci5cbiAqXG4gKiBRdW90aW5nIHVuY29uZGl0aW9uYWxseSBpcyB3aGF0IGtlZXBzIGEgdmFsdWUgc3VjaCBhcyBhIGJhcmUgYGhvc3Q6NDMxN2AgZnJvbSBiZWluZyByZS1yZWFkIGFzIGEgbmVzdGVkXG4gKiBtYXBwaW5nIGluIGZsb3cgY29udGV4dC4gYEpTT04uc3RyaW5naWZ5YCBpcyB0aGUgVHlwZVNjcmlwdCBlcXVpdmFsZW50IG9mIHRoZSBjb25uZWN0b3Inc1xuICogYHN0cmNvbnYuUXVvdGVgIGZvciB0aGUgdm9jYWJ1bGFyeSB0aGF0IG1hdHRlcnMgaGVyZSAoYFxcXCJgIGFuZCBgXFxcXGApOyBib3RoIHByb2R1Y2UgdGhlIHNhbWUgb3V0cHV0IGZvclxuICogdGhlIEFTQ0lJIGVuZHBvaW50cywgaGVhZGVyIG5hbWVzIGFuZCBjcmVkZW50aWFscyB0aGlzIGV2ZXIgc2Vlcy5cbiAqL1xuZnVuY3Rpb24geWFtbFN0cmluZyhzOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocyk7XG59XG5cbi8qKlxuICogUGlja3MgdGhlIGV4cG9ydGVyIGJ5IHRoZSB0cmFuc3BvcnQgdGhlIGRlc3RpbmF0aW9uIGNvbmZpZ3VyZWQuIEEgZGVzdGluYXRpb24gY2FycmllcyBhIGdSUEMgZW5kcG9pbnRcbiAqICh0eXBlIGBvdGxwYCkgb3IgYW4gT1RMUC9IVFRQIG9uZSAodHlwZSBgb3RscGh0dHBgKTsgdGhlIHR3byBhcmUgZGlmZmVyZW50IGNvbGxlY3RvciBjb21wb25lbnRzIHdpdGhcbiAqIGRpZmZlcmVudCBlbmRwb2ludCBncmFtbWFycywgc28gdGhpcyBpcyBhIGdlbnVpbmUgYnJhbmNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0ZXJOYW1lRm9yKGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogc3RyaW5nIHtcbiAgcmV0dXJuIGRlc3QuZW5kcG9pbnQgPyAnb3RscCcgOiAnb3RscGh0dHAnO1xufVxuXG4vKipcbiAqIEVtaXRzIHRoZSBkZXN0aW5hdGlvbidzIHBlci1yZXF1ZXN0IGhlYWRlcnMg4oCUIGluIHByYWN0aWNlIGl0cyBjcmVkZW50aWFsLiBFbXB0eSB3aGVuIHRoZSBkZXN0aW5hdGlvblxuICogbmVlZHMgbm9uZSwgc28gbm8gaGVhZGVyIGJsb2NrIGlzIHdyaXR0ZW4gYXQgYWxsIHJhdGhlciB0aGFuIGFuIGVtcHR5IG9uZS5cbiAqXG4gKiBLZXlzIGFyZSBzb3J0ZWQgc28gdGhlIHJlbmRlcmVkIGNvbmZpZyBpcyBieXRlLWlkZW50aWNhbCBhY3Jvc3Mgc3ludGhzLiBUaGUgc3RyaW5nIGlzIGNvbXBhcmVkIGFnYWluc3RcbiAqIHRoZSBsaXZlIGZ1bmN0aW9uJ3MgZW52aXJvbm1lbnQgdG8gZGVjaWRlIHdoZXRoZXIgYW4gdXBkYXRlIGlzIG5lZWRlZCwgYW5kIG1hcCBvcmRlciB3b3VsZCBvdGhlcndpc2VcbiAqIG1ha2UgZXZlcnkgZGVwbG95IGxvb2sgbGlrZSBhIGNoYW5nZS5cbiAqL1xuZnVuY3Rpb24gcmVuZGVySGVhZGVycyhoZWFkZXJzPzogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk6IHN0cmluZyB7XG4gIGlmICghaGVhZGVycykge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoaGVhZGVycykuc29ydCgpO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgY29uc3QgcmVuZGVyZWQgPSBrZXlzLm1hcCgoaykgPT4gYCR7eWFtbFN0cmluZyhrKX06ICR7eWFtbFN0cmluZyhoZWFkZXJzW2tdKX1gKS5qb2luKCcsICcpO1xuICByZXR1cm4gYCwgaGVhZGVyczogeyR7cmVuZGVyZWR9fWA7XG59XG5cbmZ1bmN0aW9uIHJlbmRlckV4cG9ydGVyKGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogc3RyaW5nIHtcbiAgbGV0IG91dDogc3RyaW5nO1xuICBpZiAoZGVzdC5lbmRwb2ludCkge1xuICAgIC8vIHRscy5pbnNlY3VyZSBhcHBsaWVzIHRvIHRoZSBnUlBDIGV4cG9ydGVyIG9ubHk7IHRoZSBIVFRQIGV4cG9ydGVyIHRha2VzIHRoZSBzY2hlbWUgZnJvbSB0aGUgVVJMLlxuICAgIG91dCA9IGB7b3RscDoge2VuZHBvaW50OiAke3lhbWxTdHJpbmcoZGVzdC5lbmRwb2ludCl9LCB0bHM6IHtpbnNlY3VyZTogJHtkZXN0Lmluc2VjdXJlID09PSB0cnVlfX1gO1xuICB9IGVsc2UgaWYgKGRlc3QuaHR0cEVuZHBvaW50KSB7XG4gICAgb3V0ID0gYHtvdGxwaHR0cDoge2VuZHBvaW50OiAke3lhbWxTdHJpbmcoZGVzdC5odHRwRW5kcG9pbnQpfWA7XG4gIH0gZWxzZSB7XG4gICAgLy8gUmVhY2hlZCB3aGVuIGEgZGVzdGluYXRpb24gY2FycmllcyBuZWl0aGVyIHRyYW5zcG9ydC4gRmFpbGluZyBoZXJlIGlzIHRoZSB3aG9sZSBwb2ludDogdGhlXG4gICAgLy8gYWx0ZXJuYXRpdmUgaXMgYSBjb2xsZWN0b3IgdGhhdCBleGl0cyBvbiBzdGFydHVwIHdoaWxlIHRoZSBmdW5jdGlvbiBpcyByZXBvcnRlZCBoZWFsdGh5LlxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdPZGlnb3MgZGVzdGluYXRpb24gaGFzIG5laXRoZXIgYGVuZHBvaW50YCAoT1RMUC9nUlBDKSBub3IgYGh0dHBFbmRwb2ludGAgKE9UTFAvSFRUUCksICcgK1xuICAgICAgICAnc28gdGhlIGluLUxhbWJkYSBjb2xsZWN0b3Igd291bGQgaGF2ZSBub3doZXJlIHRvIGV4cG9ydC4nLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGAke291dH0ke3JlbmRlckhlYWRlcnMoZGVzdC5oZWFkZXJzKX19fWA7XG59XG5cbi8qKlxuICogQnVpbGRzIGEgcGlwZWxpbmUgb25seSBmb3IgdGhlIHNpZ25hbHMgdGhlIGRlc3RpbmF0aW9uIGFjY2VwdHMuIEEgc2lnbmFsIHdpdGggbm8gcGlwZWxpbmUgaXMgcmVmdXNlZCBhdFxuICogdGhlIHJlY2VpdmVyLCB3aGljaCBpcyB0aGUgYmVoYXZpb3VyIHdlIHdhbnQ6IHRoZSBTREsgaXMgdG9sZCBub3QgdG8gcHJvZHVjZSBpdCBlaXRoZXIgKHNlZVxuICogYGV4cG9ydGVyT3ZlcnJpZGVGb3JgKSwgYW5kIHRoZSB0d28gdG9nZXRoZXIgbWVhbiBhbiB1bmFjY2VwdGVkIHNpZ25hbCBpcyBuZXZlciBnZW5lcmF0ZWQsIG5ldmVyXG4gKiBleHBvcnRlZCwgYW5kIG5ldmVyIGEgcGVyLWJhdGNoIGVycm9yIGFnYWluc3QgYSBiYWNrZW5kIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGl0LlxuICovXG5mdW5jdGlvbiByZW5kZXJQaXBlbGluZXMoZGVzdDogT2RpZ29zRGVzdGluYXRpb24sIGV4cG9ydGVyTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgcGFydHM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNpZ25hbHM6IEFycmF5PFtzdHJpbmcsIGJvb2xlYW5dPiA9IFtcbiAgICBbJ3RyYWNlcycsIHNpZ25hbEVuYWJsZWQoZGVzdC50cmFjZXMpXSxcbiAgICBbJ21ldHJpY3MnLCBzaWduYWxFbmFibGVkKGRlc3QubWV0cmljcyldLFxuICAgIFsnbG9ncycsIHNpZ25hbEVuYWJsZWQoZGVzdC5sb2dzKV0sXG4gIF07XG4gIGZvciAoY29uc3QgW25hbWUsIGVuYWJsZWRdIG9mIHNpZ25hbHMpIHtcbiAgICBpZiAoIWVuYWJsZWQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBwYXJ0cy5wdXNoKFxuICAgICAgYCR7bmFtZX06IHtyZWNlaXZlcnM6IFtvdGxwXSwgcHJvY2Vzc29yczogW21lbW9yeV9saW1pdGVyLCBiYXRjaCwgZGVjb3VwbGVdLCBleHBvcnRlcnM6IFske2V4cG9ydGVyTmFtZX1dfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcGFydHMubGVuZ3RoID09PSAwID8gJycgOiBgeyR7cGFydHMuam9pbignLCAnKX19YDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB2YWx1ZSBhIHNpZ25hbCdzIGBPVEVMXypfRVhQT1JURVJgIG11c3QgaG9sZDogYG5vbmVgIHRvIHN1cHByZXNzIGEgc2lnbmFsIHRoZSBkZXN0aW5hdGlvblxuICogZG9lcyBub3QgYWNjZXB0LCBvciBgdW5kZWZpbmVkYCBtZWFuaW5nIHRoZSB2YXJpYWJsZSBtdXN0IGJlIEFCU0VOVCBiZWNhdXNlIHRoZSBTREsncyBvd24gZGVmYXVsdCBpc1xuICogYWxyZWFkeSB3aGF0IHdlIHdhbnQuXG4gKlxuICogT25seSB0aGUgXCJub25lXCIgc2lkZSBpcyB3cml0dGVuLCBiZWNhdXNlIGBvdGxwYCBpcyBhbHJlYWR5IGV2ZXJ5IE9wZW5UZWxlbWV0cnkgU0RLJ3MgZGVmYXVsdCBmb3IgYWxsXG4gKiB0aHJlZSBzaWduYWxzIOKAlCBzZXR0aW5nIGl0IHdvdWxkIHJlc3RhdGUgdGhlIGRlZmF1bHQgaW4gdGhyZWUgdmFyaWFibGVzIG9uIGV2ZXJ5IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwb3J0ZXJPdmVycmlkZUZvcihzdXBwb3J0ZWQ6IGJvb2xlYW4pOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICByZXR1cm4gc3VwcG9ydGVkID8gdW5kZWZpbmVkIDogRVhQT1JURVJfTk9ORTtcbn1cblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBjb21wbGV0ZSBjb2xsZWN0b3IgY29uZmlndXJhdGlvbiBmb3Igb25lIGRlc3RpbmF0aW9uLlxuICpcbiAqIEB0aHJvd3MgaWYgdGhlIGRlc3RpbmF0aW9uIG5hbWVzIG5laXRoZXIgdHJhbnNwb3J0LCBib3RoIHRyYW5zcG9ydHMsIG9yIG5vIHNpZ25hbHMgYXQgYWxsLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVyQ29sbGVjdG9yQ29uZmlnKGRlc3Q6IE9kaWdvc0Rlc3RpbmF0aW9uKTogc3RyaW5nIHtcbiAgaWYgKGRlc3QuZW5kcG9pbnQgJiYgZGVzdC5odHRwRW5kcG9pbnQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnT2RpZ29zIGRlc3RpbmF0aW9uIHNldHMgYm90aCBgZW5kcG9pbnRgIChPVExQL2dSUEMpIGFuZCBgaHR0cEVuZHBvaW50YCAoT1RMUC9IVFRQKTsgJyArXG4gICAgICAgICd0aGV5IHNlbGVjdCBkaWZmZXJlbnQgY29sbGVjdG9yIGV4cG9ydGVycywgc28gZXhhY3RseSBvbmUgbXVzdCBiZSBzZXQuJyxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgZXhwb3J0ZXIgPSByZW5kZXJFeHBvcnRlcihkZXN0KTtcbiAgY29uc3QgcGlwZWxpbmVzID0gcmVuZGVyUGlwZWxpbmVzKGRlc3QsIGV4cG9ydGVyTmFtZUZvcihkZXN0KSk7XG4gIGlmIChwaXBlbGluZXMgPT09ICcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ09kaWdvcyBkZXN0aW5hdGlvbiBhY2NlcHRzIG5vIHRlbGVtZXRyeSBzaWduYWxzICh0cmFjZXMsIG1ldHJpY3MgYW5kIGxvZ3MgYXJlIGFsbCBmYWxzZSksICcgK1xuICAgICAgICAnc28gdGhlIGNvbGxlY3RvciB3b3VsZCBoYXZlIG5vIHBpcGVsaW5lIHRvIGJ1aWxkIGFuZCB3b3VsZCBmYWlsIHRvIHN0YXJ0LicsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiAoXG4gICAgQ09MTEVDVE9SX0NPTkZJR19TQ0hFTUUgK1xuICAgICd7cmVjZWl2ZXJzOiB7b3RscDoge3Byb3RvY29sczogJyArXG4gICAgLy8gQm91bmQgdG8gbG9jYWxob3N0OiB0aGUgcmVjZWl2ZXIgZXhpc3RzIG9ubHkgZm9yIHRoZSBpbi1wcm9jZXNzIFNESy4gQmluZGluZyBpdCB3aWRlciB3b3VsZCBleHBvc2VcbiAgICAvLyBhbiB1bmF1dGhlbnRpY2F0ZWQgT1RMUCBlbmRwb2ludCBvbiB0aGUgc2FuZGJveCdzIG5ldHdvcmsgaW50ZXJmYWNlLlxuICAgICd7Z3JwYzoge2VuZHBvaW50OiBcImxvY2FsaG9zdDo0MzE3XCJ9LCBodHRwOiB7ZW5kcG9pbnQ6IFwibG9jYWxob3N0OjQzMThcIn19fX0sICcgK1xuICAgICdwcm9jZXNzb3JzOiAnICtcbiAgICBDT0xMRUNUT1JfUFJPQ0VTU09SUyArXG4gICAgJywgZXhwb3J0ZXJzOiAnICtcbiAgICBleHBvcnRlciArXG4gICAgJywgc2VydmljZToge3RlbGVtZXRyeToge21ldHJpY3M6IHtsZXZlbDogbm9uZX19LCBwaXBlbGluZXM6ICcgK1xuICAgIHBpcGVsaW5lcyArXG4gICAgJ319J1xuICApO1xufVxuIl19
|
|
204
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdG9yLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9jb2xsZWN0b3ItY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTBFQSxzQ0FFQztBQW1CRCwwQ0FFQztBQXdFRCxrREFFQztBQU9ELHNEQWdEQztBQWhPRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFFSDs7Ozs7O0dBTUc7QUFDVSxRQUFBLHdCQUF3QixHQUFHLG9DQUFvQyxDQUFDO0FBRTdFOzs7O0dBSUc7QUFDSCxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQztBQUV4Qzs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sb0JBQW9CLEdBQ3hCLDJGQUEyRjtJQUMzRixnRUFBZ0UsQ0FBQztBQUVuRSxpRUFBaUU7QUFDcEQsUUFBQSxhQUFhLEdBQUcsTUFBTSxDQUFDO0FBRXBDLHFGQUFxRjtBQUN4RSxRQUFBLG1CQUFtQixHQUFHLHNCQUFzQixDQUFDO0FBQzdDLFFBQUEsb0JBQW9CLEdBQUcsdUJBQXVCLENBQUM7QUFDL0MsUUFBQSxpQkFBaUIsR0FBRyxvQkFBb0IsQ0FBQztBQUV0RCxxREFBcUQ7QUFDckQsU0FBZ0IsYUFBYSxDQUFDLEtBQTBCO0lBQ3RELE9BQU8sS0FBSyxLQUFLLEtBQUssQ0FBQztBQUN6QixDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQVMsVUFBVSxDQUFDLENBQVM7SUFDM0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBZ0IsZUFBZSxDQUFDLElBQXVCO0lBQ3JELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7QUFDN0MsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLGFBQWEsQ0FBQyxPQUFtQztJQUN4RCxJQUFJLENBQUMs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dUdBQXVHO0lBQ3ZHLG9DQUFvQztJQUNwQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUksS0FBSyxDQUNiLHVDQUF1QyxJQUFJLENBQUMsUUFBUSxnREFBZ0Q7WUFDbEcscUVBQXFFLENBQ3hFLENBQUM7SUFDSixDQUFDO0lBQ0QsSUFBSSxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztRQUNqRSxNQUFNLElBQUksS0FBSyxDQUNiLDJDQUEyQyxJQUFJLENBQUMsWUFBWSx3Q0FBd0M7WUFDbEcsdUZBQXVGLENBQzFGLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDL0QsSUFBSSxTQUFTLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDckIsTUFBTSxJQUFJLEtBQUssQ0FDYiw0RkFBNEY7WUFDMUYsMkVBQTJFLENBQzlFLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxDQUNMLHVCQUF1QjtRQUN2QixpQ0FBaUM7UUFDakMscUdBQXFHO1FBQ3JHLHVFQUF1RTtRQUN2RSw4RUFBOEU7UUFDOUUsY0FBYztRQUNkLG9CQUFvQjtRQUNwQixlQUFlO1FBQ2YsUUFBUTtRQUNSLDhEQUE4RDtRQUM5RCxTQUFTO1FBQ1QsSUFBSSxDQUNMLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT2RpZ29zRGVzdGluYXRpb24gfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBSZW5kZXJzIHRoZSBpbi1MYW1iZGEgY29sbGVjdG9yJ3MgY29tcGxldGUgY29uZmlndXJhdGlvbiBhcyBhbiBpbmxpbmVcbiAqIGBPUEVOVEVMRU1FVFJZX0NPTExFQ1RPUl9DT05GSUdfVVJJYCB2YWx1ZS5cbiAqXG4gKiBUaGlzIGlzIGEgUE9SVCBvZiBgcmVuZGVyQ29sbGVjdG9yQ29uZmlnYCBpbiB0aGUgY29ubmVjdG9yXG4gKiAoY29ubmVjdG9ycy9wcm92aWRlcnMvYXdzL3BrZy93b3JrbG9hZC9pbnN0cnVtZW50b3IvY29sbGVjdG9yX2NvbmZpZy5nbykgYW5kIGlzIGRlbGliZXJhdGVseVxuICogYnl0ZS1mb3ItYnl0ZSBjb21wYXRpYmxlIHdpdGggaXQuIFRoYXQgZXF1aXZhbGVuY2UgaXMgbm90IGNvc21ldGljOiBhIGZ1bmN0aW9uIGluc3RydW1lbnRlZCBoZXJlIGFuZFxuICogbGF0ZXIgZW5hYmxlZCBhcyBhIGNvbm5lY3RvciBzb3VyY2UgaXMgY29tcGFyZWQgYWdhaW5zdCB0aGUgY29ubmVjdG9yJ3MgcmVuZGVyaW5nIHRvIGRlY2lkZSB3aGV0aGVyIGl0XG4gKiBuZWVkcyBjb252ZXJnaW5nLiBBIHN0cmF5IHNwYWNlIHdvdWxkIG1ha2UgZXZlcnkgcmVjb25jaWxlIHNlZSBkcmlmdCBhbmQgY2h1cm4gYSBuZXcgZnVuY3Rpb24gdmVyc2lvblxuICogZm9yZXZlci5cbiAqXG4gKiBXSFkgVEhFIFdIT0xFIERPQ1VNRU5ULCBSQVRIRVIgVEhBTiBBIEZFVyBWQVJJQUJMRVMuIFRoZSBsYXllciBzaGlwcyBhIGJha2VkXG4gKiAvb3B0L2NvbGxlY3Rvci1jb25maWcvY29uZmlnLnlhbWwsIGJ1dCB0aGF0IGZpbGUgaXMgT05FIGRvY3VtZW50IHNoYXJlZCBieSBldmVyeSBmdW5jdGlvbiwgc28gaXQgY2FuXG4gKiBvbmx5IHJlYWNoIGEgZGVzdGluYXRpb24gdGhyb3VnaCBlbnYgaW5kaXJlY3Rpb24g4oCUIGAke2VudjpTT01FVEhJTkd9YC4gVGhhdCBtYWRlIHRocmVlIHRoaW5nc1xuICogaW1wb3NzaWJsZSBhdCBvbmNlOlxuICpcbiAqICAgLSBBVVRILiBBIGNyZWRlbnRpYWwgaXMgYSBoZWFkZXJzIG1hcCwgbm90IGEgc2NhbGFyLiBBIGJha2VkIGZpbGUgY2FuIHN1YnN0aXR1dGUgYSB2YWx1ZSBidXQgY2Fubm90XG4gKiAgICAgY29uZGl0aW9uYWxseSBncm93IGEgYGhlYWRlcnM6YCBibG9jaywgc28gYW4gYXV0aGVudGljYXRlZCBkZXN0aW5hdGlvbiB3YXMgdW5yZWFjaGFibGUuXG4gKiAgIC0gT1RMUC9IVFRQIERFU1RJTkFUSU9OUy4gVGhlIGJha2VkIGZpbGUgaGFyZGNvZGVzIGEgZ1JQQyBgb3RscGAgZXhwb3J0ZXIuIEFuIG90bHBodHRwLW9ubHlcbiAqICAgICBkZXN0aW5hdGlvbiByZXNvbHZlcyB3aXRoIGFuIGVtcHR5IGdSUEMgZW5kcG9pbnQsIGFuZCB0aGUgY29sbGVjdG9yIGRvZXMgbm90IGRlZ3JhZGUg4oCUIGl0IGZhaWxzIHRvXG4gKiAgICAgYnVpbGQgdGhlIHBpcGVsaW5lIGFuZCBleGl0cywgc28gdGhlIGZ1bmN0aW9uIGlzIGluc3RydW1lbnRlZCwgbG9va3MgaGVhbHRoeSwgYW5kIGV4cG9ydHMgbm90aGluZy5cbiAqICAgLSBQRVItU0lHTkFMIFBJUEVMSU5FUy4gVGhlIGJha2VkIGZpbGUgZGVjbGFyZXMgYWxsIHRocmVlIHBpcGVsaW5lcyB1bmNvbmRpdGlvbmFsbHksIHNvIGEgc2lnbmFsIHRoZVxuICogICAgIGRlc3RpbmF0aW9uIGRvZXMgbm90IGFjY2VwdCBpcyByZWNlaXZlZCBhbmQgdGhlbiBmYWlscyBvbiBleHBvcnQgcmF0aGVyIHRoYW4gbmV2ZXIgYmVpbmcgYnVpbHQuXG4gKlxuICogRkxPVyBTVFlMRSBJUyBMT0FELUJFQVJJTkcuIFRoZSBkb2N1bWVudCBpcyBlbWl0dGVkIG9uIGEgc2luZ2xlIGxpbmUgYmVjYXVzZSBpdCBoYXMgdG8gc3Vydml2ZSBhcyBhblxuICogZW52aXJvbm1lbnQgdmFyaWFibGUgdmFsdWUuIEluIGEgWUFNTCBmbG93IG1hcHBpbmcgYSBjb2xvbiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UsIG9yIHRoZSBwYXJzZXJcbiAqIHJlYWRzIGBhOmJgIGFzIHRoZSBwbGFpbiBzY2FsYXIgYFwiYTpiXCJgIHJhdGhlciB0aGFuIGEgbWFwcGluZy4gV3JpdHRlbiB3aXRob3V0IHRoZSBzcGFjZXMgdGhlIGNvbGxlY3RvclxuICogYWNjZXB0cyB0aGUgdmFyaWFibGUsIHJlcG9ydHMgdGhlIFVSSSBpdCByZWFkLCBhbmQgdGhlbiBmYWlscyB0byBzdGFydCB3aXRoIGEgYmFyZVxuICogYG90ZWxjb2wgc3RhdGUgaXMgQ2xvc2VkYCDigJQgbm8gcGFyc2UgZXJyb3IsIG5vIG1lbnRpb24gb2YgdGhlIGNvbmZpZy4gRXZlcnkgYDogYCBiZWxvdyBlYXJucyBpdHMgcGxhY2UuXG4gKi9cblxuLyoqXG4gKiBUaGUgY29sbGVjdG9yIGxheWVyJ3Mgb3duIGNvbmZpZy1zb3VyY2UgdmFyaWFibGUg4oCUIHVwc3RyZWFtJ3MgbmFtZSwgbm90IG91cnMuIFBvaW50ZWQgYXQgYSBgeWFtbDpgIFVSSVxuICogaXQgY2FycmllcyB0aGUgZW50aXJlIGNvbmZpZ3VyYXRpb24gaW5saW5lLCBzbyBubyBzZWNvbmQgdmFyaWFibGUgaXMgbmVlZGVkIHRvIGhvbGQgaXQuXG4gKlxuICogVXBzdHJlYW0gYWxzbyByZWFkcyB0aGUgb2xkZXIgYE9QRU5URUxFTUVUUllfQ09MTEVDVE9SX0NPTkZJR19GSUxFYCBhbmQgbG9ncyBhIGRlcHJlY2F0aW9uIHdhcm5pbmcgZm9yXG4gKiBpdDsgdGhpcyBpcyB0aGUgY3VycmVudCBuYW1lLlxuICovXG5leHBvcnQgY29uc3QgRU5WX0NPTExFQ1RPUl9DT05GSUdfVVJJID0gJ09QRU5URUxFTUVUUllfQ09MTEVDVE9SX0NPTkZJR19VUkknO1xuXG4vKipcbiAqIFRoZSBjb25mbWFwIHByb3ZpZGVyIHRoYXQgcmVhZHMgYSBjb25maWd1cmF0aW9uIG91dCBvZiB0aGUgVVJJIGl0c2VsZi4gVGhlIGNvbGxlY3RvciByZWdpc3RlcnNcbiAqIGVudi9maWxlL3lhbWwvaHR0cC9odHRwcy9zMyBwcm92aWRlcnM7IGB5YW1sOmAgaXMgdGhlIG9ubHkgb25lIHRoYXQgbmVlZHMgbm8gc2Vjb25kIHZhcmlhYmxlIGFuZCBub1xuICogbmV0d29yayByZWFkIG9uIGEgY29sZCBzdGFydC5cbiAqL1xuY29uc3QgQ09MTEVDVE9SX0NPTkZJR19TQ0hFTUUgPSAneWFtbDonO1xuXG4vKipcbiAqIE1pcnJvcnMgdGhlIGJha2VkIGNvbmZpZydzIHByb2Nlc3NvciBzZXQsIGFuZCB0aGUgT1JERVIgaXMgdGhlIGNvbnRyYWN0OlxuICpcbiAqICAgLSBgbWVtb3J5X2xpbWl0ZXJgIGZpcnN0LCBzbyBhbiBleHBvcnQgYmFja2xvZyBpcyBzaGVkIGJlZm9yZSBpdCBpcyBjaGFyZ2VkIHRvIHRoZSBzYW1lIG1lbW9yeSBidWRnZXRcbiAqICAgICB0aGUgY3VzdG9tZXIncyBoYW5kbGVyIGFsbG9jYXRlcyBmcm9tLiBQZXJjZW50YWdlcywgbm90IGBsaW1pdF9taWJgLCBiZWNhdXNlIG9uZSBsYXllciBzZXJ2ZXNcbiAqICAgICBmdW5jdGlvbnMgZnJvbSAxMjhNQiB0byAxMEdCLlxuICogICAtIGBkZWNvdXBsZWAgTEFTVC4gTGFtYmRhIGZyZWV6ZXMgdGhlIHNhbmRib3ggb25jZSB0aGUgaGFuZGxlciByZXR1cm5zIGFuZCBldmVyeSBleHRlbnNpb24gaGFzIGNhbGxlZFxuICogICAgIC9uZXh0OyBhIGZyb3plbiBzYW5kYm94IHJ1bnMgbm8gdGltZXJzLCBzbyBhIGJhdGNoIHNpdHRpbmcgYmVoaW5kIGl0cyB0aW1lb3V0IGlzIGZsdXNoZWQgb24gYSBsYXRlclxuICogICAgIGludm9jYXRpb24gb3IgZHJvcHBlZCB3aGVuIHRoZSBzYW5kYm94IGlzIHJlYXBlZC4gYGRlY291cGxlYCBhY2tub3dsZWRnZXMgdGhlIHJlY2VpdmUgcGF0aFxuICogICAgIGltbWVkaWF0ZWx5IGFuZCB0cmFja3MgaW4tZmxpZ2h0IGV4cG9ydHMsIHdoaWNoIGlzIHdoYXQgbGV0cyB0aGUgZXh0ZW5zaW9uIGhvbGQgL25leHQgb3BlbiB1bnRpbCB0aGVcbiAqICAgICBxdWV1ZSBkcmFpbnMg4oCUIGFmdGVyIHRoZSBjYWxsZXIgYWxyZWFkeSBoYXMgaXRzIHJlc3BvbnNlLlxuICovXG5jb25zdCBDT0xMRUNUT1JfUFJPQ0VTU09SUyA9XG4gICd7bWVtb3J5X2xpbWl0ZXI6IHtjaGVja19pbnRlcnZhbDogMXMsIGxpbWl0X3BlcmNlbnRhZ2U6IDUwLCBzcGlrZV9saW1pdF9wZXJjZW50YWdlOiAyMH0sICcgK1xuICAnYmF0Y2g6IHtzZW5kX2JhdGNoX3NpemU6IDUxMiwgdGltZW91dDogMjAwbXN9LCBkZWNvdXBsZTogbnVsbH0nO1xuXG4vKiogVmFsdWUgYW4gdW5zdXBwb3J0ZWQgc2lnbmFsJ3MgYE9URUxfKl9FWFBPUlRFUmAgaXMgc2V0IHRvLiAqL1xuZXhwb3J0IGNvbnN0IEVYUE9SVEVSX05PTkUgPSAnbm9uZSc7XG5cbi8qKiBUaGUgdGhyZWUgYE9URUxfKl9FWFBPUlRFUmAgdmFyaWFibGVzLCBpbiB0aGUgb3JkZXIgdGhlIGNvbm5lY3RvciB3cml0ZXMgdGhlbS4gKi9cbmV4cG9ydCBjb25zdCBFTlZfVFJBQ0VTX0VYUE9SVEVSID0gJ09URUxfVFJBQ0VTX0VYUE9SVEVSJztcbmV4cG9ydCBjb25zdCBFTlZfTUVUUklDU19FWFBPUlRFUiA9ICdPVEVMX01FVFJJQ1NfRVhQT1JURVInO1xuZXhwb3J0IGNvbnN0IEVOVl9MT0dTX0VYUE9SVEVSID0gJ09URUxfTE9HU19FWFBPUlRFUic7XG5cbi8qKiBXaGV0aGVyIGEgc2lnbmFsIGlzIGVuYWJsZWQsIGRlZmF1bHRpbmcgdG8gb24uICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbmFsRW5hYmxlZCh2YWx1ZTogYm9vbGVhbiB8IHVuZGVmaW5lZCk6IGJvb2xlYW4ge1xuICByZXR1cm4gdmFsdWUgIT09IGZhbHNlO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgYSBkb3VibGUtcXVvdGVkIFlBTUwgc2NhbGFyLlxuICpcbiAqIFF1b3RpbmcgdW5jb25kaXRpb25hbGx5IGlzIHdoYXQga2VlcHMgYSB2YWx1ZSBzdWNoIGFzIGEgYmFyZSBgaG9zdDo0MzE3YCBmcm9tIGJlaW5nIHJlLXJlYWQgYXMgYSBuZXN0ZWRcbiAqIG1hcHBpbmcgaW4gZmxvdyBjb250ZXh0LiBgSlNPTi5zdHJpbmdpZnlgIGlzIHRoZSBUeXBlU2NyaXB0IGVxdWl2YWxlbnQgb2YgdGhlIGNvbm5lY3RvcidzXG4gKiBgc3RyY29udi5RdW90ZWAgZm9yIHRoZSB2b2NhYnVsYXJ5IHRoYXQgbWF0dGVycyBoZXJlIChgXFxcImAgYW5kIGBcXFxcYCk7IGJvdGggcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQgZm9yXG4gKiB0aGUgQVNDSUkgZW5kcG9pbnRzLCBoZWFkZXIgbmFtZXMgYW5kIGNyZWRlbnRpYWxzIHRoaXMgZXZlciBzZWVzLlxuICovXG5mdW5jdGlvbiB5YW1sU3RyaW5nKHM6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShzKTtcbn1cblxuLyoqXG4gKiBQaWNrcyB0aGUgZXhwb3J0ZXIgYnkgdGhlIHRyYW5zcG9ydCB0aGUgZGVzdGluYXRpb24gY29uZmlndXJlZC4gQSBkZXN0aW5hdGlvbiBjYXJyaWVzIGEgZ1JQQyBlbmRwb2ludFxuICogKHR5cGUgYG90bHBgKSBvciBhbiBPVExQL0hUVFAgb25lICh0eXBlIGBvdGxwaHR0cGApOyB0aGUgdHdvIGFyZSBkaWZmZXJlbnQgY29sbGVjdG9yIGNvbXBvbmVudHMgd2l0aFxuICogZGlmZmVyZW50IGVuZHBvaW50IGdyYW1tYXJzLCBzbyB0aGlzIGlzIGEgZ2VudWluZSBicmFuY2guXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRlck5hbWVGb3IoZGVzdDogT2RpZ29zRGVzdGluYXRpb24pOiBzdHJpbmcge1xuICByZXR1cm4gZGVzdC5lbmRwb2ludCA/ICdvdGxwJyA6ICdvdGxwaHR0cCc7XG59XG5cbi8qKlxuICogRW1pdHMgdGhlIGRlc3RpbmF0aW9uJ3MgcGVyLXJlcXVlc3QgaGVhZGVycyDigJQgaW4gcHJhY3RpY2UgaXRzIGNyZWRlbnRpYWwuIEVtcHR5IHdoZW4gdGhlIGRlc3RpbmF0aW9uXG4gKiBuZWVkcyBub25lLCBzbyBubyBoZWFkZXIgYmxvY2sgaXMgd3JpdHRlbiBhdCBhbGwgcmF0aGVyIHRoYW4gYW4gZW1wdHkgb25lLlxuICpcbiAqIEtleXMgYXJlIHNvcnRlZCBzbyB0aGUgcmVuZGVyZWQgY29uZmlnIGlzIGJ5dGUtaWRlbnRpY2FsIGFjcm9zcyBzeW50aHMuIFRoZSBzdHJpbmcgaXMgY29tcGFyZWQgYWdhaW5zdFxuICogdGhlIGxpdmUgZnVuY3Rpb24ncyBlbnZpcm9ubWVudCB0byBkZWNpZGUgd2hldGhlciBhbiB1cGRhdGUgaXMgbmVlZGVkLCBhbmQgbWFwIG9yZGVyIHdvdWxkIG90aGVyd2lzZVxuICogbWFrZSBldmVyeSBkZXBsb3kgbG9vayBsaWtlIGEgY2hhbmdlLlxuICovXG5mdW5jdGlvbiByZW5kZXJIZWFkZXJzKGhlYWRlcnM/OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTogc3RyaW5nIHtcbiAgaWYgKCFoZWFkZXJzKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhoZWFkZXJzKS5zb3J0KCk7XG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICBjb25zdCByZW5kZXJlZCA9IGtleXMubWFwKChrKSA9PiBgJHt5YW1sU3RyaW5nKGspfTogJHt5YW1sU3RyaW5nKGhlYWRlcnNba10pfWApLmpvaW4oJywgJyk7XG4gIHJldHVybiBgLCBoZWFkZXJzOiB7JHtyZW5kZXJlZH19YDtcbn1cblxuZnVuY3Rpb24gcmVuZGVyRXhwb3J0ZXIoZGVzdDogT2RpZ29zRGVzdGluYXRpb24pOiBzdHJpbmcge1xuICBsZXQgb3V0OiBzdHJpbmc7XG4gIGlmIChkZXN0LmVuZHBvaW50KSB7XG4gICAgLy8gdGxzLmluc2VjdXJlIGFwcGxpZXMgdG8gdGhlIGdSUEMgZXhwb3J0ZXIgb25seTsgdGhlIEhUVFAgZXhwb3J0ZXIgdGFrZXMgdGhlIHNjaGVtZSBmcm9tIHRoZSBVUkwuXG4gICAgb3V0ID0gYHtvdGxwOiB7ZW5kcG9pbnQ6ICR7eWFtbFN0cmluZyhkZXN0LmVuZHBvaW50KX0sIHRsczoge2luc2VjdXJlOiAke2Rlc3QuaW5zZWN1cmUgPT09IHRydWV9fWA7XG4gIH0gZWxzZSBpZiAoZGVzdC5odHRwRW5kcG9pbnQpIHtcbiAgICBvdXQgPSBge290bHBodHRwOiB7ZW5kcG9pbnQ6ICR7eWFtbFN0cmluZyhkZXN0Lmh0dHBFbmRwb2ludCl9YDtcbiAgfSBlbHNlIHtcbiAgICAvLyBSZWFjaGVkIHdoZW4gYSBkZXN0aW5hdGlvbiBjYXJyaWVzIG5laXRoZXIgdHJhbnNwb3J0LiBGYWlsaW5nIGhlcmUgaXMgdGhlIHdob2xlIHBvaW50OiB0aGVcbiAgICAvLyBhbHRlcm5hdGl2ZSBpcyBhIGNvbGxlY3RvciB0aGF0IGV4aXRzIG9uIHN0YXJ0dXAgd2hpbGUgdGhlIGZ1bmN0aW9uIGlzIHJlcG9ydGVkIGhlYWx0aHkuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ09kaWdvcyBkZXN0aW5hdGlvbiBoYXMgbmVpdGhlciBgZW5kcG9pbnRgIChPVExQL2dSUEMpIG5vciBgaHR0cEVuZHBvaW50YCAoT1RMUC9IVFRQKSwgJyArXG4gICAgICAgICdzbyB0aGUgaW4tTGFtYmRhIGNvbGxlY3RvciB3b3VsZCBoYXZlIG5vd2hlcmUgdG8gZXhwb3J0LicsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gYCR7b3V0fSR7cmVuZGVySGVhZGVycyhkZXN0LmhlYWRlcnMpfX19YDtcbn1cblxuLyoqXG4gKiBCdWlsZHMgYSBwaXBlbGluZSBvbmx5IGZvciB0aGUgc2lnbmFscyB0aGUgZGVzdGluYXRpb24gYWNjZXB0cy4gQSBzaWduYWwgd2l0aCBubyBwaXBlbGluZSBpcyByZWZ1c2VkIGF0XG4gKiB0aGUgcmVjZWl2ZXIsIHdoaWNoIGlzIHRoZSBiZWhhdmlvdXIgd2Ugd2FudDogdGhlIFNESyBpcyB0b2xkIG5vdCB0byBwcm9kdWNlIGl0IGVpdGhlciAoc2VlXG4gKiBgZXhwb3J0ZXJPdmVycmlkZUZvcmApLCBhbmQgdGhlIHR3byB0b2dldGhlciBtZWFuIGFuIHVuYWNjZXB0ZWQgc2lnbmFsIGlzIG5ldmVyIGdlbmVyYXRlZCwgbmV2ZXJcbiAqIGV4cG9ydGVkLCBhbmQgbmV2ZXIgYSBwZXItYmF0Y2ggZXJyb3IgYWdhaW5zdCBhIGJhY2tlbmQgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlbmRlclBpcGVsaW5lcyhkZXN0OiBPZGlnb3NEZXN0aW5hdGlvbiwgZXhwb3J0ZXJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJ0czogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc2lnbmFsczogQXJyYXk8W3N0cmluZywgYm9vbGVhbl0+ID0gW1xuICAgIFsndHJhY2VzJywgc2lnbmFsRW5hYmxlZChkZXN0LnRyYWNlcyldLFxuICAgIFsnbWV0cmljcycsIHNpZ25hbEVuYWJsZWQoZGVzdC5tZXRyaWNzKV0sXG4gICAgWydsb2dzJywgc2lnbmFsRW5hYmxlZChkZXN0LmxvZ3MpXSxcbiAgXTtcbiAgZm9yIChjb25zdCBbbmFtZSwgZW5hYmxlZF0gb2Ygc2lnbmFscykge1xuICAgIGlmICghZW5hYmxlZCkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIHBhcnRzLnB1c2goXG4gICAgICBgJHtuYW1lfToge3JlY2VpdmVyczogW290bHBdLCBwcm9jZXNzb3JzOiBbbWVtb3J5X2xpbWl0ZXIsIGJhdGNoLCBkZWNvdXBsZV0sIGV4cG9ydGVyczogWyR7ZXhwb3J0ZXJOYW1lfV19YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBwYXJ0cy5sZW5ndGggPT09IDAgPyAnJyA6IGB7JHtwYXJ0cy5qb2luKCcsICcpfX1gO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIHZhbHVlIGEgc2lnbmFsJ3MgYE9URUxfKl9FWFBPUlRFUmAgbXVzdCBob2xkOiBgbm9uZWAgdG8gc3VwcHJlc3MgYSBzaWduYWwgdGhlIGRlc3RpbmF0aW9uXG4gKiBkb2VzIG5vdCBhY2NlcHQsIG9yIGB1bmRlZmluZWRgIG1lYW5pbmcgdGhlIHZhcmlhYmxlIG11c3QgYmUgQUJTRU5UIGJlY2F1c2UgdGhlIFNESydzIG93biBkZWZhdWx0IGlzXG4gKiBhbHJlYWR5IHdoYXQgd2Ugd2FudC5cbiAqXG4gKiBPbmx5IHRoZSBcIm5vbmVcIiBzaWRlIGlzIHdyaXR0ZW4sIGJlY2F1c2UgYG90bHBgIGlzIGFscmVhZHkgZXZlcnkgT3BlblRlbGVtZXRyeSBTREsncyBkZWZhdWx0IGZvciBhbGxcbiAqIHRocmVlIHNpZ25hbHMg4oCUIHNldHRpbmcgaXQgd291bGQgcmVzdGF0ZSB0aGUgZGVmYXVsdCBpbiB0aHJlZSB2YXJpYWJsZXMgb24gZXZlcnkgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvcnRlck92ZXJyaWRlRm9yKHN1cHBvcnRlZDogYm9vbGVhbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHJldHVybiBzdXBwb3J0ZWQgPyB1bmRlZmluZWQgOiBFWFBPUlRFUl9OT05FO1xufVxuXG4vKipcbiAqIFJlbmRlcnMgdGhlIGNvbXBsZXRlIGNvbGxlY3RvciBjb25maWd1cmF0aW9uIGZvciBvbmUgZGVzdGluYXRpb24uXG4gKlxuICogQHRocm93cyBpZiB0aGUgZGVzdGluYXRpb24gbmFtZXMgbmVpdGhlciB0cmFuc3BvcnQsIGJvdGggdHJhbnNwb3J0cywgb3Igbm8gc2lnbmFscyBhdCBhbGwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW5kZXJDb2xsZWN0b3JDb25maWcoZGVzdDogT2RpZ29zRGVzdGluYXRpb24pOiBzdHJpbmcge1xuICBpZiAoZGVzdC5lbmRwb2ludCAmJiBkZXN0Lmh0dHBFbmRwb2ludCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICdPZGlnb3MgZGVzdGluYXRpb24gc2V0cyBib3RoIGBlbmRwb2ludGAgKE9UTFAvZ1JQQykgYW5kIGBodHRwRW5kcG9pbnRgIChPVExQL0hUVFApOyAnICtcbiAgICAgICAgJ3RoZXkgc2VsZWN0IGRpZmZlcmVudCBjb2xsZWN0b3IgZXhwb3J0ZXJzLCBzbyBleGFjdGx5IG9uZSBtdXN0IGJlIHNldC4nLFxuICAgICk7XG4gIH1cblxuICAvLyBUaGUgdHdvIGZpZWxkcyBoYXZlIGRpZmZlcmVudCBlbmRwb2ludCBHUkFNTUFSUywgYW5kIGdldHRpbmcgdGhlbSB3cm9uZyBpcyB0aGUgd29yc3QgZmFpbHVyZSBtb2RlIHRoaXNcbiAgLy8gcGFja2FnZSBoYXM6IHRoZSBjb2xsZWN0b3IgYWNjZXB0cyB0aGUgY29uZmlndXJhdGlvbiwgZmFpbHMgdG8gYnVpbGQgaXRzIGV4cG9ydGVyLCBhbmQgZXhpdHMg4oCUIGxlYXZpbmdcbiAgLy8gdGhlIGZ1bmN0aW9uIGluc3RydW1lbnRlZCwgcmVwb3J0aW5nIGhlYWx0aHksIGFuZCBleHBvcnRpbmcgbm90aGluZy4gQm90aCBjaGVja3MgYXJlIHRoZXJlZm9yZSBzeW50aFxuICAvLyBlcnJvcnMgcmF0aGVyIHRoYW4gZG9jdW1lbnRhdGlvbi5cbiAgaWYgKGRlc3QuZW5kcG9pbnQgJiYgZGVzdC5lbmRwb2ludC5pbmNsdWRlcygnOi8vJykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgT2RpZ29zIGRlc3RpbmF0aW9uIFxcYGVuZHBvaW50XFxgIGlzIFwiJHtkZXN0LmVuZHBvaW50fVwiLCBidXQgdGhlIGdSUEMgZXhwb3J0ZXIgdGFrZXMgaG9zdDpwb3J0IHdpdGggYCArXG4gICAgICAgICdubyBzY2hlbWUuIFVzZSBgaHR0cEVuZHBvaW50YCBmb3IgYSBzY2hlbWUtcXVhbGlmaWVkIE9UTFAvSFRUUCBVUkwuJyxcbiAgICApO1xuICB9XG4gIGlmIChkZXN0Lmh0dHBFbmRwb2ludCAmJiAhL15odHRwcz86XFwvXFwvLy50ZXN0KGRlc3QuaHR0cEVuZHBvaW50KSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBPZGlnb3MgZGVzdGluYXRpb24gXFxgaHR0cEVuZHBvaW50XFxgIGlzIFwiJHtkZXN0Lmh0dHBFbmRwb2ludH1cIiwgYnV0IHRoZSBPVExQL0hUVFAgZXhwb3J0ZXIgdGFrZXMgYSBgICtcbiAgICAgICAgJ3NjaGVtZS1xdWFsaWZpZWQgVVJMIChodHRwOi8vIG9yIGh0dHBzOi8vKS4gVXNlIGBlbmRwb2ludGAgZm9yIGEgYmFyZSBnUlBDIGhvc3Q6cG9ydC4nLFxuICAgICk7XG4gIH1cblxuICBjb25zdCBleHBvcnRlciA9IHJlbmRlckV4cG9ydGVyKGRlc3QpO1xuICBjb25zdCBwaXBlbGluZXMgPSByZW5kZXJQaXBlbGluZXMoZGVzdCwgZXhwb3J0ZXJOYW1lRm9yKGRlc3QpKTtcbiAgaWYgKHBpcGVsaW5lcyA9PT0gJycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnT2RpZ29zIGRlc3RpbmF0aW9uIGFjY2VwdHMgbm8gdGVsZW1ldHJ5IHNpZ25hbHMgKHRyYWNlcywgbWV0cmljcyBhbmQgbG9ncyBhcmUgYWxsIGZhbHNlKSwgJyArXG4gICAgICAgICdzbyB0aGUgY29sbGVjdG9yIHdvdWxkIGhhdmUgbm8gcGlwZWxpbmUgdG8gYnVpbGQgYW5kIHdvdWxkIGZhaWwgdG8gc3RhcnQuJyxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICBDT0xMRUNUT1JfQ09ORklHX1NDSEVNRSArXG4gICAgJ3tyZWNlaXZlcnM6IHtvdGxwOiB7cHJvdG9jb2xzOiAnICtcbiAgICAvLyBCb3VuZCB0byBsb2NhbGhvc3Q6IHRoZSByZWNlaXZlciBleGlzdHMgb25seSBmb3IgdGhlIGluLXByb2Nlc3MgU0RLLiBCaW5kaW5nIGl0IHdpZGVyIHdvdWxkIGV4cG9zZVxuICAgIC8vIGFuIHVuYXV0aGVudGljYXRlZCBPVExQIGVuZHBvaW50IG9uIHRoZSBzYW5kYm94J3MgbmV0d29yayBpbnRlcmZhY2UuXG4gICAgJ3tncnBjOiB7ZW5kcG9pbnQ6IFwibG9jYWxob3N0OjQzMTdcIn0sIGh0dHA6IHtlbmRwb2ludDogXCJsb2NhbGhvc3Q6NDMxOFwifX19fSwgJyArXG4gICAgJ3Byb2Nlc3NvcnM6ICcgK1xuICAgIENPTExFQ1RPUl9QUk9DRVNTT1JTICtcbiAgICAnLCBleHBvcnRlcnM6ICcgK1xuICAgIGV4cG9ydGVyICtcbiAgICAnLCBzZXJ2aWNlOiB7dGVsZW1ldHJ5OiB7bWV0cmljczoge2xldmVsOiBub25lfX0sIHBpcGVsaW5lczogJyArXG4gICAgcGlwZWxpbmVzICtcbiAgICAnfX0nXG4gICk7XG59XG4iXX0=
|
|
@@ -4,12 +4,12 @@
|
|
|
4
4
|
* Produced by cdk/scripts/generate-layers.ts from artifacts.json and manifest/layers.json.
|
|
5
5
|
* Run `npm run generate` (or `npm run build`) to refresh it.
|
|
6
6
|
*
|
|
7
|
-
* Odigos artifact version:
|
|
7
|
+
* Odigos artifact version: v0.0.11
|
|
8
8
|
*/
|
|
9
9
|
/** Release this table was generated from. Empty before the first release. */
|
|
10
|
-
export declare const ODIGOS_VERSION = "";
|
|
10
|
+
export declare const ODIGOS_VERSION = "v0.0.11";
|
|
11
11
|
/** SAR semantic version matching ODIGOS_VERSION (no leading "v"). */
|
|
12
|
-
export declare const SAR_SEMANTIC_VERSION = "";
|
|
12
|
+
export declare const SAR_SEMANTIC_VERSION = "0.0.11";
|
|
13
13
|
/** Public layer ARNs, keyed "<region>/<language>/<architecture>". */
|
|
14
14
|
export declare const LAYER_ARNS: {
|
|
15
15
|
[key: string]: string;
|