@workflow/core 5.0.0-beta.5 → 5.0.0-beta.51
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/README.md +5 -0
- package/dist/attribute-changes.d.ts +5 -0
- package/dist/attribute-changes.d.ts.map +1 -0
- package/dist/attribute-changes.js +25 -0
- package/dist/capabilities.d.ts +35 -2
- package/dist/capabilities.d.ts.map +1 -1
- package/dist/capabilities.js +74 -5
- package/dist/capture-stack.d.ts +1 -1
- package/dist/capture-stack.js +2 -2
- package/dist/class-serialization.d.ts +32 -0
- package/dist/class-serialization.d.ts.map +1 -1
- package/dist/class-serialization.js +37 -1
- package/dist/classify-error.d.ts +19 -3
- package/dist/classify-error.d.ts.map +1 -1
- package/dist/classify-error.js +98 -6
- package/dist/context-violation-error.d.ts +5 -5
- package/dist/context-violation-error.d.ts.map +1 -1
- package/dist/context-violation-error.js +8 -6
- package/dist/create-hook.d.ts +72 -7
- package/dist/create-hook.d.ts.map +1 -1
- package/dist/create-hook.js +1 -1
- package/dist/define-hook.js +2 -2
- package/dist/describe-error.d.ts +7 -7
- package/dist/describe-error.d.ts.map +1 -1
- package/dist/describe-error.js +97 -12
- package/dist/encryption.d.ts +38 -4
- package/dist/encryption.d.ts.map +1 -1
- package/dist/encryption.js +96 -14
- package/dist/events-consumer.d.ts +297 -0
- package/dist/events-consumer.d.ts.map +1 -1
- package/dist/events-consumer.js +673 -42
- package/dist/flushable-stream.d.ts +97 -1
- package/dist/flushable-stream.d.ts.map +1 -1
- package/dist/flushable-stream.js +291 -11
- package/dist/global.d.ts +36 -2
- package/dist/global.d.ts.map +1 -1
- package/dist/global.js +21 -6
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/log-format.d.ts +2 -2
- package/dist/log-format.js +19 -12
- package/dist/logger.d.ts +1 -0
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +10 -6
- package/dist/private.d.ts +226 -9
- package/dist/private.d.ts.map +1 -1
- package/dist/private.js +626 -7
- package/dist/replay-divergence.d.ts +25 -0
- package/dist/replay-divergence.d.ts.map +1 -0
- package/dist/replay-divergence.js +61 -0
- package/dist/replay-payload-cache.d.ts +64 -0
- package/dist/replay-payload-cache.d.ts.map +1 -0
- package/dist/replay-payload-cache.js +158 -0
- package/dist/runtime/compute-instance.d.ts +13 -0
- package/dist/runtime/compute-instance.d.ts.map +1 -0
- package/dist/runtime/compute-instance.js +14 -0
- package/dist/runtime/constants.d.ts +315 -0
- package/dist/runtime/constants.d.ts.map +1 -1
- package/dist/runtime/constants.js +502 -16
- package/dist/runtime/count-step-started-events.d.ts +52 -0
- package/dist/runtime/count-step-started-events.d.ts.map +1 -0
- package/dist/runtime/count-step-started-events.js +72 -0
- package/dist/runtime/deployment-guard.d.ts +99 -0
- package/dist/runtime/deployment-guard.d.ts.map +1 -0
- package/dist/runtime/deployment-guard.js +154 -0
- package/dist/runtime/get-port-lazy.d.ts +15 -0
- package/dist/runtime/get-port-lazy.d.ts.map +1 -1
- package/dist/runtime/get-port-lazy.js +75 -6
- package/dist/runtime/get-world-lazy.d.ts +5 -14
- package/dist/runtime/get-world-lazy.d.ts.map +1 -1
- package/dist/runtime/get-world-lazy.js +19 -29
- package/dist/runtime/helpers.d.ts +415 -29
- package/dist/runtime/helpers.d.ts.map +1 -1
- package/dist/runtime/helpers.js +686 -57
- package/dist/runtime/quickjs-assets.generated.d.ts +14 -0
- package/dist/runtime/quickjs-assets.generated.d.ts.map +1 -0
- package/dist/runtime/quickjs-assets.generated.js +30 -0
- package/dist/runtime/quickjs-entrypoint.d.ts +158 -0
- package/dist/runtime/quickjs-entrypoint.d.ts.map +1 -0
- package/dist/runtime/quickjs-entrypoint.js +1863 -0
- package/dist/runtime/quickjs-log-view.d.ts +129 -0
- package/dist/runtime/quickjs-log-view.d.ts.map +1 -0
- package/dist/runtime/quickjs-log-view.js +229 -0
- package/dist/runtime/quickjs-runtime.d.ts +244 -0
- package/dist/runtime/quickjs-runtime.d.ts.map +1 -0
- package/dist/runtime/quickjs-runtime.js +2427 -0
- package/dist/runtime/quickjs-serde.d.ts +107 -0
- package/dist/runtime/quickjs-serde.d.ts.map +1 -0
- package/dist/runtime/quickjs-serde.js +2159 -0
- package/dist/runtime/replay-budget.d.ts +97 -0
- package/dist/runtime/replay-budget.d.ts.map +1 -0
- package/dist/runtime/replay-budget.js +139 -0
- package/dist/runtime/replay-recovery-reporter.d.ts +36 -0
- package/dist/runtime/replay-recovery-reporter.d.ts.map +1 -0
- package/dist/runtime/replay-recovery-reporter.js +64 -0
- package/dist/runtime/resume-hook.d.ts +91 -8
- package/dist/runtime/resume-hook.d.ts.map +1 -1
- package/dist/runtime/resume-hook.js +512 -89
- package/dist/runtime/resume-latency.d.ts +150 -0
- package/dist/runtime/resume-latency.d.ts.map +1 -0
- package/dist/runtime/resume-latency.js +155 -0
- package/dist/runtime/run-id-time.d.ts +19 -0
- package/dist/runtime/run-id-time.d.ts.map +1 -0
- package/dist/runtime/run-id-time.js +42 -0
- package/dist/runtime/run.d.ts +72 -7
- package/dist/runtime/run.d.ts.map +1 -1
- package/dist/runtime/run.js +280 -53
- package/dist/runtime/runs.d.ts +54 -3
- package/dist/runtime/runs.d.ts.map +1 -1
- package/dist/runtime/runs.js +126 -16
- package/dist/runtime/start.d.ts +101 -2
- package/dist/runtime/start.d.ts.map +1 -1
- package/dist/runtime/start.js +352 -61
- package/dist/runtime/step-executor.d.ts +186 -5
- package/dist/runtime/step-executor.d.ts.map +1 -1
- package/dist/runtime/step-executor.js +768 -130
- package/dist/runtime/step-latency.d.ts +220 -0
- package/dist/runtime/step-latency.d.ts.map +1 -0
- package/dist/runtime/step-latency.js +215 -0
- package/dist/runtime/step-ownership.d.ts +72 -0
- package/dist/runtime/step-ownership.d.ts.map +1 -0
- package/dist/runtime/step-ownership.js +114 -0
- package/dist/runtime/step-single-flight.d.ts +12 -0
- package/dist/runtime/step-single-flight.d.ts.map +1 -0
- package/dist/runtime/step-single-flight.js +75 -0
- package/dist/runtime/suspension-handler.d.ts +247 -7
- package/dist/runtime/suspension-handler.d.ts.map +1 -1
- package/dist/runtime/suspension-handler.js +1304 -125
- package/dist/runtime/unserializable-step.d.ts +34 -0
- package/dist/runtime/unserializable-step.d.ts.map +1 -0
- package/dist/runtime/unserializable-step.js +52 -0
- package/dist/runtime/vm-mode.d.ts +44 -0
- package/dist/runtime/vm-mode.d.ts.map +1 -0
- package/dist/runtime/vm-mode.js +62 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts +14 -0
- package/dist/runtime/vm-serde-bundle.generated.d.ts.map +1 -0
- package/dist/runtime/vm-serde-bundle.generated.js +16 -0
- package/dist/runtime/wait-continuation.d.ts +106 -0
- package/dist/runtime/wait-continuation.d.ts.map +1 -0
- package/dist/runtime/wait-continuation.js +136 -0
- package/dist/runtime/wait-until.d.ts +18 -0
- package/dist/runtime/wait-until.d.ts.map +1 -0
- package/dist/runtime/wait-until.js +42 -0
- package/dist/runtime/world-compatibility.d.ts +32 -0
- package/dist/runtime/world-compatibility.d.ts.map +1 -0
- package/dist/runtime/world-compatibility.js +44 -0
- package/dist/runtime/world-init.d.ts +17 -42
- package/dist/runtime/world-init.d.ts.map +1 -1
- package/dist/runtime/world-init.js +18 -43
- package/dist/runtime/world.d.ts +14 -2
- package/dist/runtime/world.d.ts.map +1 -1
- package/dist/runtime/world.js +75 -19
- package/dist/runtime.d.ts +10 -6
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +3911 -489
- package/dist/sealed-box.d.ts +167 -0
- package/dist/sealed-box.d.ts.map +1 -0
- package/dist/sealed-box.js +571 -0
- package/dist/serialization/client.d.ts +3 -3
- package/dist/serialization/client.d.ts.map +1 -1
- package/dist/serialization/client.js +8 -4
- package/dist/serialization/codec-devalue-vm.d.ts +16 -0
- package/dist/serialization/codec-devalue-vm.d.ts.map +1 -0
- package/dist/serialization/codec-devalue-vm.js +148 -0
- package/dist/serialization/codec-devalue.d.ts +1 -1
- package/dist/serialization/codec-devalue.d.ts.map +1 -1
- package/dist/serialization/codec-devalue.js +24 -6
- package/dist/serialization/codec.d.ts +37 -2
- package/dist/serialization/codec.d.ts.map +1 -1
- package/dist/serialization/codec.js +2 -2
- package/dist/serialization/compression.d.ts +105 -0
- package/dist/serialization/compression.d.ts.map +1 -0
- package/dist/serialization/compression.js +261 -0
- package/dist/serialization/encryption.d.ts +119 -17
- package/dist/serialization/encryption.d.ts.map +1 -1
- package/dist/serialization/encryption.js +152 -17
- package/dist/serialization/errors.d.ts +13 -0
- package/dist/serialization/errors.d.ts.map +1 -1
- package/dist/serialization/errors.js +20 -2
- package/dist/serialization/format.d.ts +6 -6
- package/dist/serialization/format.js +7 -7
- package/dist/serialization/hardened.d.ts +156 -0
- package/dist/serialization/hardened.d.ts.map +1 -0
- package/dist/serialization/hardened.js +538 -0
- package/dist/serialization/index.d.ts +10 -8
- package/dist/serialization/index.d.ts.map +1 -1
- package/dist/serialization/index.js +10 -8
- package/dist/serialization/reducers/class-vm.d.ts +20 -0
- package/dist/serialization/reducers/class-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/class-vm.js +77 -0
- package/dist/serialization/reducers/class.d.ts.map +1 -1
- package/dist/serialization/reducers/class.js +11 -6
- package/dist/serialization/reducers/common-vm.d.ts +15 -0
- package/dist/serialization/reducers/common-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/common-vm.js +616 -0
- package/dist/serialization/reducers/common.d.ts +1 -1
- package/dist/serialization/reducers/common.d.ts.map +1 -1
- package/dist/serialization/reducers/common.js +202 -62
- package/dist/serialization/reducers/step-function-vm.d.ts +44 -0
- package/dist/serialization/reducers/step-function-vm.d.ts.map +1 -0
- package/dist/serialization/reducers/step-function-vm.js +97 -0
- package/dist/serialization/reducers/step-function.d.ts.map +1 -1
- package/dist/serialization/reducers/step-function.js +25 -9
- package/dist/serialization/step.d.ts +4 -4
- package/dist/serialization/step.d.ts.map +1 -1
- package/dist/serialization/step.js +9 -5
- package/dist/serialization/types.d.ts +80 -1
- package/dist/serialization/types.d.ts.map +1 -1
- package/dist/serialization/types.js +15 -1
- package/dist/serialization/workflow-vm.d.ts +29 -0
- package/dist/serialization/workflow-vm.d.ts.map +1 -0
- package/dist/serialization/workflow-vm.js +74 -0
- package/dist/serialization-format.d.ts +64 -8
- package/dist/serialization-format.d.ts.map +1 -1
- package/dist/serialization-format.js +225 -73
- package/dist/serialization.d.ts +262 -34
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +1885 -277
- package/dist/set-attributes.d.ts +13 -0
- package/dist/set-attributes.d.ts.map +1 -0
- package/dist/set-attributes.js +60 -0
- package/dist/source-map.d.ts +25 -0
- package/dist/source-map.d.ts.map +1 -1
- package/dist/source-map.js +154 -10
- package/dist/step/context-storage.d.ts +63 -2
- package/dist/step/context-storage.d.ts.map +1 -1
- package/dist/step/context-storage.js +7 -5
- package/dist/step/writable-stream.d.ts +3 -3
- package/dist/step/writable-stream.d.ts.map +1 -1
- package/dist/step/writable-stream.js +80 -13
- package/dist/step.d.ts.map +1 -1
- package/dist/step.js +148 -27
- package/dist/symbols.d.ts +50 -0
- package/dist/symbols.d.ts.map +1 -1
- package/dist/symbols.js +51 -1
- package/dist/telemetry/semantic-conventions.d.ts +433 -2
- package/dist/telemetry/semantic-conventions.d.ts.map +1 -1
- package/dist/telemetry/semantic-conventions.js +319 -3
- package/dist/telemetry.d.ts +91 -0
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +244 -17
- package/dist/test-support/orchestrator-context.d.ts +25 -0
- package/dist/test-support/orchestrator-context.d.ts.map +1 -0
- package/dist/test-support/orchestrator-context.js +107 -0
- package/dist/types.d.ts +6 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +23 -1
- package/dist/util.d.ts +0 -5
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +1 -15
- package/dist/version.d.ts +1 -1
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +2 -2
- package/dist/vm/index.d.ts.map +1 -1
- package/dist/vm/index.js +84 -14
- package/dist/vm/script-cache.d.ts +26 -0
- package/dist/vm/script-cache.d.ts.map +1 -0
- package/dist/vm/script-cache.js +131 -0
- package/dist/vm/uint8array-base64.js +1 -1
- package/dist/workflow/abort-controller.d.ts +2 -2
- package/dist/workflow/abort-controller.d.ts.map +1 -1
- package/dist/workflow/abort-controller.js +88 -21
- package/dist/workflow/attribute-dispatcher.d.ts +6 -0
- package/dist/workflow/attribute-dispatcher.d.ts.map +1 -0
- package/dist/workflow/attribute-dispatcher.js +45 -0
- package/dist/workflow/create-hook.d.ts.map +1 -1
- package/dist/workflow/create-hook.js +24 -3
- package/dist/workflow/get-workflow-metadata.js +2 -2
- package/dist/workflow/hook.d.ts.map +1 -1
- package/dist/workflow/hook.js +304 -47
- package/dist/workflow/index.d.ts +1 -0
- package/dist/workflow/index.d.ts.map +1 -1
- package/dist/workflow/index.js +2 -1
- package/dist/workflow/set-attributes.d.ts +68 -0
- package/dist/workflow/set-attributes.d.ts.map +1 -0
- package/dist/workflow/set-attributes.js +60 -0
- package/dist/workflow/sleep.d.ts.map +1 -1
- package/dist/workflow/sleep.js +58 -12
- package/dist/workflow/world-init-stub.d.ts +3 -3
- package/dist/workflow/world-init-stub.js +4 -4
- package/dist/workflow.d.ts +95 -3
- package/dist/workflow.d.ts.map +1 -1
- package/dist/workflow.js +900 -561
- package/docs/api-reference/create-hook.mdx +89 -10
- package/docs/api-reference/create-webhook.mdx +16 -15
- package/docs/api-reference/define-hook.mdx +35 -33
- package/docs/api-reference/fatal-error.mdx +30 -8
- package/docs/api-reference/fetch.mdx +14 -10
- package/docs/api-reference/get-step-metadata.mdx +2 -2
- package/docs/api-reference/get-workflow-metadata.mdx +3 -3
- package/docs/api-reference/get-writable.mdx +7 -7
- package/docs/api-reference/index.mdx +4 -1
- package/docs/api-reference/retryable-error.mdx +1 -1
- package/docs/api-reference/set-attributes.mdx +61 -0
- package/docs/api-reference/sleep.mdx +4 -4
- package/docs/foundations/cancellation.mdx +31 -32
- package/docs/foundations/errors-and-retries.mdx +42 -11
- package/docs/foundations/hooks.mdx +64 -35
- package/docs/foundations/idempotency.mdx +244 -12
- package/docs/foundations/index.mdx +1 -23
- package/docs/foundations/meta.json +2 -1
- package/docs/foundations/serialization.mdx +21 -22
- package/docs/foundations/starting-workflows.mdx +106 -30
- package/docs/foundations/streaming.mdx +108 -60
- package/docs/foundations/versioning.mdx +263 -0
- package/docs/foundations/workflows-and-steps.mdx +9 -9
- package/docs/how-it-works/cancellation.mdx +63 -63
- package/docs/how-it-works/code-transform.mdx +83 -67
- package/docs/how-it-works/encryption.mdx +30 -26
- package/docs/how-it-works/event-sourcing.mdx +125 -34
- package/docs/how-it-works/framework-integrations.mdx +96 -337
- package/docs/how-it-works/understanding-directives.mdx +22 -22
- package/package.json +24 -15
- package/dist/runtime/step-handler.d.ts +0 -2
- package/dist/runtime/step-handler.d.ts.map +0 -1
- package/dist/runtime/step-handler.js +0 -776
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"semantic-conventions.d.ts","sourceRoot":"","sources":["../../src/telemetry/semantic-conventions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAgBH,8CAA8C;AAC9C,eAAO,MAAM,YAAY;;CAA8C,CAAC;AAExE,oDAAoD;AACpD,eAAO,MAAM,iBAAiB;;CAEP,CAAC;AAExB,6DAA6D;AAC7D,eAAO,MAAM,aAAa;;CAAgD,CAAC;AAE3E,yCAAyC;AACzC,eAAO,MAAM,iBAAiB;;CAEN,CAAC;AAEzB,qEAAqE;AACrE,eAAO,MAAM,iBAAiB;;CAE7B,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,sBAAsB;;CAElC,CAAC;AAEF,kCAAkC;AAClC,eAAO,MAAM,kBAAkB;;CAE9B,CAAC;AAEF,sEAAsE;AACtE,eAAO,MAAM,uBAAuB;;CAEnC,CAAC;AAEF,qDAAqD;AACrD,eAAO,MAAM,iBAAiB;;CAE7B,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,kEAAkE;AAClE,eAAO,MAAM,iBAAiB;;CAE7B,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAEF,wDAAwD;AACxD,eAAO,MAAM,oBAAoB;;CAEhC,CAAC;AAIF,+CAA+C;AAC/C,eAAO,MAAM,QAAQ;;CAA0C,CAAC;AAEhE,8CAA8C;AAC9C,eAAO,MAAM,MAAM;;CAAwC,CAAC;AAE5D,8DAA8D;AAC9D,eAAO,MAAM,WAAW;;CAA6C,CAAC;AAEtE,iCAAiC;AACjC,eAAO,MAAM,UAAU;;CAAoD,CAAC;AAE5E,sDAAsD;AACtD,eAAO,MAAM,cAAc;;CAAiD,CAAC;AAE7E,kEAAkE;AAClE,eAAO,MAAM,mBAAmB;;CAE/B,CAAC;AAEF,oDAAoD;AACpD,eAAO,MAAM,WAAW;;CAA8C,CAAC;AAEvE,sCAAsC;AACtC,eAAO,MAAM,cAAc;;CAC6B,CAAC;AAEzD,sDAAsD;AACtD,eAAO,MAAM,kBAAkB;;CAE9B,CAAC;AAEF,8BAA8B;AAC9B,eAAO,MAAM,cAAc;;CAAiD,CAAC;AAE7E,iDAAiD;AACjD,eAAO,MAAM,aAAa;;CAAgD,CAAC;AAE3E,oCAAoC;AACpC,eAAO,MAAM,gBAAgB;;CACqB,CAAC;AAEnD,8DAA8D;AAC9D,eAAO,MAAM,cAAc;;CAAkD,CAAC;AAE9E,qDAAqD;AACrD,eAAO,MAAM,kBAAkB;;CAE9B,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,uBAAuB;;CAEnC,CAAC;AAEF,0DAA0D;AAC1D,eAAO,MAAM,kBAAkB;;CAE9B,CAAC;AAKF,oEAAoE;AACpE,eAAO,MAAM,eAAe;;CAAiD,CAAC;AAE9E,8EAA8E;AAC9E,eAAO,MAAM,wBAAwB;;CAEpC,CAAC;AAEF,yEAAyE;AACzE,eAAO,MAAM,kBAAkB;;CAE9B,CAAC;AAEF,+DAA+D;AAC/D,eAAO,MAAM,sBAAsB;;CAEN,CAAC;AAE9B,4EAA4E;AAC5E,eAAO,MAAM,eAAe;;CAE3B,CAAC;AAIF,uDAAuD;AACvD,eAAO,MAAM,YAAY;;CAA8C,CAAC;
|
|
1
|
+
{"version":3,"file":"semantic-conventions.d.ts","sourceRoot":"","sources":["../../src/telemetry/semantic-conventions.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* This module provides standardized telemetry attributes following OpenTelemetry semantic conventions
|
|
5
5
|
* for instrumenting workflow execution, step processing, and related operations. Each exported function
|
|
6
|
-
* creates a properly formatted attribute object
|
|
6
|
+
* creates a properly formatted attribute object for use with OpenTelemetry spans.
|
|
7
7
|
*
|
|
8
8
|
* The semantic conventions are organized into several categories:
|
|
9
9
|
* - **Workflow attributes**: Track workflow lifecycle, status, and metadata
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - **Queue attributes**: Instrument message queue operations
|
|
12
12
|
* - **Deployment attributes**: Capture deployment environment information
|
|
13
13
|
*
|
|
14
|
-
* All attribute functions are type-safe and
|
|
14
|
+
* All attribute functions are type-safe and use existing backend types to ensure
|
|
15
15
|
* consistency between telemetry data and actual system state.
|
|
16
16
|
*
|
|
17
17
|
* @example
|
|
@@ -57,12 +57,53 @@ export const WorkflowRunStatus = SemanticConvention('workflow.run.status');
|
|
|
57
57
|
export const WorkflowStartedAt = SemanticConvention('workflow.started_at');
|
|
58
58
|
/** Number of events processed during workflow execution */
|
|
59
59
|
export const WorkflowEventsCount = SemanticConvention('workflow.events.count');
|
|
60
|
+
/** Whether workflow execution starts with replay or resumes a retained VM */
|
|
61
|
+
export const WorkflowExecutionMode = SemanticConvention('workflow.execution.mode');
|
|
62
|
+
/** Whether the compiled application workflow bundle was cached. */
|
|
63
|
+
export const WorkflowBundleCompileCacheHit = SemanticConvention('workflow.bundle.compile.cache_hit');
|
|
64
|
+
export const WorkflowReplayLoadSource = SemanticConvention('workflow.replay.load.source');
|
|
65
|
+
/**
|
|
66
|
+
* Events the replay walked past that no consumer claimed, still held when the
|
|
67
|
+
* replay stopped.
|
|
68
|
+
*
|
|
69
|
+
* A non-zero count on a suspension is ordinary: an out-of-band delivery that
|
|
70
|
+
* landed ahead of the code that reads it waits for the replay that gets there.
|
|
71
|
+
* From inside one replay that is indistinguishable from an event no replay will
|
|
72
|
+
* ever claim, because the two differ only in what the next replay does. So the
|
|
73
|
+
* count goes on the span instead of failing the run, and the case worth acting
|
|
74
|
+
* on is a query across a run's spans: the same
|
|
75
|
+
* {@link WorkflowParkedEventId} held on suspension after suspension.
|
|
76
|
+
*/
|
|
77
|
+
export const WorkflowParkedEventsCount = SemanticConvention('workflow.events.parked.count');
|
|
78
|
+
/** Oldest event still held unclaimed when the replay stopped. */
|
|
79
|
+
export const WorkflowParkedEventId = SemanticConvention('workflow.events.parked.event_id');
|
|
80
|
+
/** Type of the oldest event still held unclaimed when the replay stopped. */
|
|
81
|
+
export const WorkflowParkedEventType = SemanticConvention('workflow.events.parked.event_type');
|
|
60
82
|
/** Number of arguments passed to the workflow */
|
|
61
83
|
export const WorkflowArgumentsCount = SemanticConvention('workflow.arguments.count');
|
|
62
84
|
/** Type of the workflow result */
|
|
63
85
|
export const WorkflowResultType = SemanticConvention('workflow.result.type');
|
|
64
86
|
/** Whether trace context was propagated to this workflow execution */
|
|
65
87
|
export const WorkflowTracePropagated = SemanticConvention('workflow.trace.propagated');
|
|
88
|
+
// QuickJS VM engine attributes
|
|
89
|
+
/** The VM engine executing the workflow function for this invocation */
|
|
90
|
+
export const WorkflowVm = SemanticConvention('workflow.vm');
|
|
91
|
+
/** Outcome of a QuickJS VM workflow invocation */
|
|
92
|
+
export const QuickJSOutcome = SemanticConvention('workflow.vm.outcome');
|
|
93
|
+
/** Whether preloaded events from `events.create('run_started')` were used */
|
|
94
|
+
export const QuickJSEventsPreloaded = SemanticConvention('workflow.vm.events.preloaded');
|
|
95
|
+
/** Total number of events fetched from the world for this invocation */
|
|
96
|
+
export const QuickJSEventsFetchedCount = SemanticConvention('workflow.vm.events.fetched_count');
|
|
97
|
+
/** Number of pages required to fetch all events */
|
|
98
|
+
export const QuickJSEventsFetchedPages = SemanticConvention('workflow.vm.events.fetched_pages');
|
|
99
|
+
/** Number of pending VM operations captured at suspension */
|
|
100
|
+
export const QuickJSPendingOpsCount = SemanticConvention('workflow.vm.pending_ops_count');
|
|
101
|
+
/** Number of steps executed inline (live-VM continuation) this invocation */
|
|
102
|
+
export const QuickJSInlineSteps = SemanticConvention('quickjs.inline_steps');
|
|
103
|
+
/** Active trace-correlation mode for this invocation (linked or continuous) */
|
|
104
|
+
export const WorkflowTraceMode = SemanticConvention('workflow.trace.mode');
|
|
105
|
+
/** Whether this workflow invocation is using the turbo first-delivery path */
|
|
106
|
+
export const WorkflowTurbo = SemanticConvention('workflow.turbo');
|
|
66
107
|
/** Name of the error that caused workflow failure */
|
|
67
108
|
export const WorkflowErrorName = SemanticConvention('workflow.error.name');
|
|
68
109
|
/** Error message when workflow fails */
|
|
@@ -75,6 +116,49 @@ export const WorkflowStepsCreated = SemanticConvention('workflow.steps.created')
|
|
|
75
116
|
export const WorkflowHooksCreated = SemanticConvention('workflow.hooks.created');
|
|
76
117
|
/** Number of waits created during workflow execution */
|
|
77
118
|
export const WorkflowWaitsCreated = SemanticConvention('workflow.waits.created');
|
|
119
|
+
/**
|
|
120
|
+
* Number of steps this suspension finalized as failed because their
|
|
121
|
+
* arguments refused to serialize (step_created placeholder + step_failed
|
|
122
|
+
* carrying the SerializationError; see finalizeUnserializableStep).
|
|
123
|
+
*/
|
|
124
|
+
export const WorkflowStepsFailedSerialization = SemanticConvention('workflow.steps.failed_serialization');
|
|
125
|
+
/**
|
|
126
|
+
* Number of inline-owned steps this invocation re-executed because it is a
|
|
127
|
+
* redelivery of their owning queue message (crash recovery for inline
|
|
128
|
+
* steps; see the inline step ownership changelog, workflow#2780).
|
|
129
|
+
*/
|
|
130
|
+
export const WorkflowOwnedRecoverySteps = SemanticConvention('workflow.inline_ownership.owned_recovery_steps');
|
|
131
|
+
/**
|
|
132
|
+
* Number of pending steps for which this replay suppressed the immediate
|
|
133
|
+
* requeue (another invocation inline-owns them under a live lease) and
|
|
134
|
+
* ensured a delayed backstop wake instead.
|
|
135
|
+
*/
|
|
136
|
+
export const WorkflowBackstopWakesArmed = SemanticConvention('workflow.inline_ownership.backstop_wakes_armed');
|
|
137
|
+
/**
|
|
138
|
+
* Number of pending steps whose immediate step-execution enqueue this replay
|
|
139
|
+
* pass skipped because THIS invocation already published that step's message
|
|
140
|
+
* on an earlier pass (a fan-out that ran inline steps and replayed again).
|
|
141
|
+
* Invocation-local knowledge only: a fresh delivery never skips.
|
|
142
|
+
*/
|
|
143
|
+
export const WorkflowDispatchRepublishSkipped = SemanticConvention('workflow.dispatch.republish_skipped');
|
|
144
|
+
// Route attributes
|
|
145
|
+
/** The workflow runtime route being handled */
|
|
146
|
+
export const WorkflowRouteType = SemanticConvention('workflow.route.type');
|
|
147
|
+
/** Whether this route invocation reused an already-created request handler */
|
|
148
|
+
export const WorkflowRouteHandlerCached = SemanticConvention('workflow.route.handler_cached');
|
|
149
|
+
/** Number of times this in-memory route handler has been invoked */
|
|
150
|
+
export const WorkflowRouteInvocationCount = SemanticConvention('workflow.route.invocation_count');
|
|
151
|
+
/** Time since this route entrypoint was constructed, in milliseconds */
|
|
152
|
+
export const WorkflowRouteEntrypointAgeMs = SemanticConvention('workflow.route.entrypoint_age_ms');
|
|
153
|
+
/** Time spent evaluating the generated route module body before creating the entrypoint */
|
|
154
|
+
export const WorkflowRouteModuleBodyInitMs = SemanticConvention('workflow.route.module_body_init_ms');
|
|
155
|
+
/**
|
|
156
|
+
* Compute instance handling this route: the synthesized `COMPUTE_INSTANCE_ID`.
|
|
157
|
+
* Uses OTEL `faas.instance` (execution-environment id, reused across
|
|
158
|
+
* invocations to the same function):
|
|
159
|
+
* https://opentelemetry.io/docs/specs/semconv/attributes-registry/faas/
|
|
160
|
+
*/
|
|
161
|
+
export const FaasInstance = SemanticConvention('faas.instance');
|
|
78
162
|
// Step attributes
|
|
79
163
|
/** Name of the step function being executed */
|
|
80
164
|
export const StepName = SemanticConvention('step.name');
|
|
@@ -88,6 +172,46 @@ export const StepStatus = SemanticConvention('step.status');
|
|
|
88
172
|
export const StepMaxRetries = SemanticConvention('step.max_retries');
|
|
89
173
|
/** Whether trace context was propagated to this step execution */
|
|
90
174
|
export const StepTracePropagated = SemanticConvention('step.trace.propagated');
|
|
175
|
+
/**
|
|
176
|
+
* Client-measured time-to-first-step latency in milliseconds: run creation →
|
|
177
|
+
* this step's body beginning to execute, minus pre-step hook-creation time.
|
|
178
|
+
* Only present on the run's first step execution when it qualified for
|
|
179
|
+
* measurement (see runtime/step-latency.ts).
|
|
180
|
+
*/
|
|
181
|
+
export const StepTtfsMs = SemanticConvention('step.ttfs_ms');
|
|
182
|
+
/**
|
|
183
|
+
* Client-measured step-to-step overhead in milliseconds: the previous step's
|
|
184
|
+
* terminal event → this step's body beginning to execute. Only present when
|
|
185
|
+
* the two steps ran back-to-back.
|
|
186
|
+
*/
|
|
187
|
+
export const StepStsoMs = SemanticConvention('step.stso_ms');
|
|
188
|
+
/**
|
|
189
|
+
* Client-measured run_started-to-first-step latency in milliseconds: the
|
|
190
|
+
* `run_started` response landing (or, under turbo, the local run synthesis
|
|
191
|
+
* instant) → this step's start POST being issued. A sub-window of ttfs that
|
|
192
|
+
* isolates replay overhead from the run-creation queue hop. Only present on
|
|
193
|
+
* the run's first step execution when it qualified for measurement (see
|
|
194
|
+
* runtime/step-latency.ts).
|
|
195
|
+
*/
|
|
196
|
+
export const StepRsfsMs = SemanticConvention('step.rsfs_ms');
|
|
197
|
+
/**
|
|
198
|
+
* Client-measured synchronous workflow-function replay duration in
|
|
199
|
+
* milliseconds, excluding awaited network I/O, of only the FINAL replay pass
|
|
200
|
+
* within the rsfs window: the pass that reached and scheduled the first
|
|
201
|
+
* step. Not accumulated across earlier pre-first-step passes (e.g. a
|
|
202
|
+
* workflow-body `setAttributes()` detour replays more than once, and a
|
|
203
|
+
* redelivery omits earlier invocations' work entirely), so this must not be
|
|
204
|
+
* read as "the replay portion of rsfs"; step.rsfs_ms covers the whole
|
|
205
|
+
* window. Only present alongside step.rsfs_ms and only for the run's first
|
|
206
|
+
* step (see runtime/step-latency.ts).
|
|
207
|
+
*/
|
|
208
|
+
export const StepFinalSchedulingReplayMs = SemanticConvention('step.final_scheduling_replay_ms');
|
|
209
|
+
/**
|
|
210
|
+
* Runtime startup-latency optimizations active for the ttfs/stso measurement
|
|
211
|
+
* (e.g. 'turbo', 'lazyStepStart', 'optimisticStart').
|
|
212
|
+
*/
|
|
213
|
+
export const StepLatencyOptimizations = SemanticConvention('step.latency_optimizations');
|
|
214
|
+
export const StepStartStrategy = SemanticConvention('workflow.step_start.strategy');
|
|
91
215
|
/** Whether the step was skipped during execution */
|
|
92
216
|
export const StepSkipped = SemanticConvention('step.skipped');
|
|
93
217
|
/** Reason why the step was skipped */
|
|
@@ -118,11 +242,23 @@ export const MessagingDestinationName = SemanticConvention('messaging.destinatio
|
|
|
118
242
|
export const MessagingMessageId = SemanticConvention('messaging.message.id');
|
|
119
243
|
/** Operation type (standard OTEL: messaging.operation.type) */
|
|
120
244
|
export const MessagingOperationType = SemanticConvention('messaging.operation.type');
|
|
245
|
+
/**
|
|
246
|
+
* Messages carried by one batched publish (standard OTEL:
|
|
247
|
+
* messaging.batch.message_count). Set only on the batch send, so a span
|
|
248
|
+
* without it is a single-message publish.
|
|
249
|
+
*/
|
|
250
|
+
export const MessagingBatchMessageCount = SemanticConvention('messaging.batch.message_count');
|
|
121
251
|
/** Time taken to enqueue the message in milliseconds (workflow-specific) */
|
|
122
252
|
export const QueueOverheadMs = SemanticConvention('workflow.queue.overhead_ms');
|
|
123
253
|
// Deployment attributes
|
|
124
254
|
/** Unique identifier for the deployment environment */
|
|
125
255
|
export const DeploymentId = SemanticConvention('deployment.id');
|
|
256
|
+
/** The deployment a run is pinned to, set only on a misrouted delivery. */
|
|
257
|
+
export const WorkflowRunPinnedDeploymentId = SemanticConvention('workflow.deployment.pinned_id');
|
|
258
|
+
/** Re-route attempts for this misrouted delivery, including this one. */
|
|
259
|
+
export const WorkflowDeploymentMismatchRetryCount = SemanticConvention('workflow.deployment_mismatch.retry_count');
|
|
260
|
+
/** Whether the misrouted delivery was re-routed instead of failing the run. */
|
|
261
|
+
export const WorkflowDeploymentMismatchRecovered = SemanticConvention('workflow.deployment_mismatch.recovered');
|
|
126
262
|
// Hook attributes
|
|
127
263
|
/** Token identifying a specific hook */
|
|
128
264
|
export const HookToken = SemanticConvention('workflow.hook.token');
|
|
@@ -130,6 +266,156 @@ export const HookToken = SemanticConvention('workflow.hook.token');
|
|
|
130
266
|
export const HookId = SemanticConvention('workflow.hook.id');
|
|
131
267
|
/** Whether a hook was found by its token */
|
|
132
268
|
export const HookFound = SemanticConvention('workflow.hook.found');
|
|
269
|
+
/**
|
|
270
|
+
* Producer-side signal (on the `hook.resume` span) that the direct
|
|
271
|
+
* `hook_received` write failed transiently but the queue dispatch succeeded, so
|
|
272
|
+
* the resume is recovered via the consumer's re-ensure. Corresponds to
|
|
273
|
+
* `ResumedHook.resilientResume === true`.
|
|
274
|
+
*
|
|
275
|
+
* No longer emitted: current producers require the durable event write to
|
|
276
|
+
* succeed. Retained so dashboards and queries built on the attribute keep
|
|
277
|
+
* resolving while older producers are still deployed.
|
|
278
|
+
*/
|
|
279
|
+
export const HookResilientResume = SemanticConvention('workflow.hook.resilient_resume');
|
|
280
|
+
/**
|
|
281
|
+
* Producer-side signal (on the `hook.resume` span) that the durable
|
|
282
|
+
* `hook_received` write COMMITTED. Stamped after the write resolves, so it
|
|
283
|
+
* distinguishes a committed resume from an attempted one — an entry-time
|
|
284
|
+
* attribute cannot, because a span that later records an exception may have
|
|
285
|
+
* failed either before or after the commit.
|
|
286
|
+
*/
|
|
287
|
+
export const HookResumeCommitted = SemanticConvention('workflow.hook.resume_committed');
|
|
288
|
+
/**
|
|
289
|
+
* Producer-side signal (on the `hook.resume` span) that the workflow wake was
|
|
290
|
+
* ACCEPTED by the queue, stamped after the publish resolves.
|
|
291
|
+
*
|
|
292
|
+
* Together with {@link HookResumeCommitted} this makes stranded resumes
|
|
293
|
+
* queryable: `resume_committed=true` with `wake_published` absent is a resume
|
|
294
|
+
* whose durable event exists but whose wake publish failed (the caller was
|
|
295
|
+
* told, but nothing re-drives it), and `resume_committed=true` +
|
|
296
|
+
* `wake_published=true` with no subsequent workflow execution for the run is
|
|
297
|
+
* a wake the queue accepted but never delivered. Both are detection-only
|
|
298
|
+
* signals — nothing recovers such a run automatically today beyond a later
|
|
299
|
+
* wake from any other source.
|
|
300
|
+
*/
|
|
301
|
+
export const HookWakePublished = SemanticConvention('workflow.hook.wake_published');
|
|
302
|
+
/**
|
|
303
|
+
* Consumer-side signal (on the workflow execution span) that this replay
|
|
304
|
+
* materialized the `hook_received` event from the queue message's `hookInput`
|
|
305
|
+
* because no committed event was found, which completes the recovery path
|
|
306
|
+
* {@link HookResilientResume} began.
|
|
307
|
+
*
|
|
308
|
+
* Legacy / non-atomic re-ensure signal only. Legacy atomic lazy resumes
|
|
309
|
+
* (resumeId + digest) go through the hoisted preload write instead, whose
|
|
310
|
+
* response cannot tell whether the producer or the consumer won the
|
|
311
|
+
* `(runId, resumeId)` claim, so this attribute is deliberately NOT emitted
|
|
312
|
+
* for them (emitting `true` unconditionally would count every producer-won
|
|
313
|
+
* resume as a recovery). The producer-begin ({@link HookResilientResume}) /
|
|
314
|
+
* consumer-materialized pairing is therefore no longer complete for atomic
|
|
315
|
+
* lazy resumptions; use {@link HookResumeSetupSource} to observe that path.
|
|
316
|
+
*/
|
|
317
|
+
export const HookResilientResumeMaterialized = SemanticConvention('workflow.hook.resilient_resume_materialized');
|
|
318
|
+
/**
|
|
319
|
+
* Consumer-side signal (on the workflow execution span) of how a lazy hook
|
|
320
|
+
* resume initialized its replay state:
|
|
321
|
+
*
|
|
322
|
+
* - `hook_received_stream`: the hoisted `hook_received` write returned a
|
|
323
|
+
* usable replay preload (run + complete event log), so the invocation
|
|
324
|
+
* skipped both the `run_started` write and the initial `events.list`.
|
|
325
|
+
* - `hook_received_fallback`: the hoisted write succeeded but returned no
|
|
326
|
+
* usable preload (a CBOR response from an older server, a World that
|
|
327
|
+
* ignored the opt-in, a bounded `hasMore` page, or a preload that failed
|
|
328
|
+
* validation); the invocation fell back to the `run_started` setup without
|
|
329
|
+
* re-posting the hook.
|
|
330
|
+
*
|
|
331
|
+
* Absent on legacy hook deliveries (no resumeId/digest) and on every other
|
|
332
|
+
* delivery kind, which take the `run_started` setup unconditionally.
|
|
333
|
+
*
|
|
334
|
+
* This is a latency/setup-path signal: it says which requests initialized
|
|
335
|
+
* the invocation, NOT that this consumer created the `hook_received` event
|
|
336
|
+
* (the hoisted write may equally have converged on the producer's, since
|
|
337
|
+
* claim ownership is not observable client-side; cf.
|
|
338
|
+
* {@link HookResilientResumeMaterialized}).
|
|
339
|
+
*/
|
|
340
|
+
export const HookResumeSetupSource = SemanticConvention('workflow.resume_setup_source');
|
|
341
|
+
/**
|
|
342
|
+
* Producer-side signal (on the suspension span) counting steps whose direct
|
|
343
|
+
* `step_created` write failed transiently while their `stepInput`-carrying
|
|
344
|
+
* queue publish succeeded, so step creation is recovered via the consumer's
|
|
345
|
+
* re-ensure. Mirrors {@link HookResilientResume}.
|
|
346
|
+
*/
|
|
347
|
+
export const StepResilientDispatchRecovered = SemanticConvention('workflow.step.resilient_dispatch_recovered');
|
|
348
|
+
/**
|
|
349
|
+
* Consumer-side signal (on the workflow execution span) that this delivery
|
|
350
|
+
* materialized the `step_created` event from the queue message's `stepInput`
|
|
351
|
+
* because the producer's direct write had not landed, which completes the
|
|
352
|
+
* recovery path {@link StepResilientDispatchRecovered} began.
|
|
353
|
+
*/
|
|
354
|
+
export const StepResilientDispatchMaterialized = SemanticConvention('workflow.step.resilient_dispatch_materialized');
|
|
355
|
+
/**
|
|
356
|
+
* How the queued-step consumer resolved the run identity for this execution:
|
|
357
|
+
* `run_context` — carried on the dispatch message, no `runs.get` before the
|
|
358
|
+
* step (the fetch-free prologue); `runs_get` — the legacy blocking fetch
|
|
359
|
+
* (message from an older producer). Distinguishes the two paths during
|
|
360
|
+
* version-skew windows and makes the saved round trip directly measurable.
|
|
361
|
+
*/
|
|
362
|
+
export const StepDispatchPrologue = SemanticConvention('workflow.step.dispatch_prologue');
|
|
363
|
+
// Hook-triggered time-to-resume (TTR) attributes
|
|
364
|
+
//
|
|
365
|
+
// Set on the `step.execute <name>` span of the FIRST durable step following a
|
|
366
|
+
// hook resume, and only there: one resumption produces exactly one sample, so
|
|
367
|
+
// a later step in the same invocation, a retry, or a redelivery never
|
|
368
|
+
// re-reports it. The phases are non-overlapping and sum exactly to
|
|
369
|
+
// {@link ResumeTotalMs}; see runtime/resume-latency.ts for the boundary
|
|
370
|
+
// definitions and the emission gate.
|
|
371
|
+
//
|
|
372
|
+
// Deliberately carries no `resumeId`, run ID, or token: the metric is meant to
|
|
373
|
+
// be aggregated across every resume, and high-cardinality keys would make that
|
|
374
|
+
// prohibitive. Existing trace-correlation fields on the same span are
|
|
375
|
+
// unchanged and still identify the individual run.
|
|
376
|
+
/** Total TTR: entry into `resumeHook()` → immediately before `stepFn.apply()`. */
|
|
377
|
+
export const ResumeTotalMs = SemanticConvention('workflow.resume.total_ms');
|
|
378
|
+
/** Phase: `resumeHook()` entry → the queue publish being requested. */
|
|
379
|
+
export const ResumeProducerPrepMs = SemanticConvention('workflow.resume.phase.producer_prep_ms');
|
|
380
|
+
/** Phase: queue publish requested → the final consumer's handler being entered. */
|
|
381
|
+
export const ResumeQueueDeliveryMs = SemanticConvention('workflow.resume.phase.queue_delivery_ms');
|
|
382
|
+
/** Phase: consumer entry → replay beginning. */
|
|
383
|
+
export const ResumeSetupMs = SemanticConvention('workflow.resume.phase.resume_setup_ms');
|
|
384
|
+
/** Phase: replay beginning → the next durable step being encountered. */
|
|
385
|
+
export const ResumeReplayMs = SemanticConvention('workflow.resume.phase.replay_ms');
|
|
386
|
+
/** Phase: step encountered → the `step_started` request beginning. */
|
|
387
|
+
export const ResumeStepDispatchMs = SemanticConvention('workflow.resume.phase.step_dispatch_ms');
|
|
388
|
+
/**
|
|
389
|
+
* Phase: `step_started` request beginning → its response returning. Omitted
|
|
390
|
+
* under optimistic inline start, where the claim is not awaited before the
|
|
391
|
+
* body runs and therefore has no completion instant at that point; the time
|
|
392
|
+
* is then reported entirely as {@link ResumeStepPrepareMs}.
|
|
393
|
+
*/
|
|
394
|
+
export const ResumeStepClaimMs = SemanticConvention('workflow.resume.phase.step_claim_ms');
|
|
395
|
+
/**
|
|
396
|
+
* Phase: claim returning → immediately before `stepFn.apply()`. Deliberately
|
|
397
|
+
* includes encryption-key resolution, argument hydration, and step-context
|
|
398
|
+
* setup; `workflow.queue.deserialize_time_ms` still isolates hydration.
|
|
399
|
+
*/
|
|
400
|
+
export const ResumeStepPrepareMs = SemanticConvention('workflow.resume.phase.step_prepare_ms');
|
|
401
|
+
/** What triggered the measured resumption. */
|
|
402
|
+
export const ResumeTrigger = SemanticConvention('workflow.resume.trigger');
|
|
403
|
+
/**
|
|
404
|
+
* Which `resumeHook()` dispatch path produced this resume. `parallel` only
|
|
405
|
+
* appears for messages published by an older producer, which wrote
|
|
406
|
+
* `hook_received` itself in parallel with the publish.
|
|
407
|
+
*/
|
|
408
|
+
export const ResumeStrategy = SemanticConvention('workflow.resume.strategy');
|
|
409
|
+
/**
|
|
410
|
+
* How the consuming invocation initialized replay state. Distinct from the
|
|
411
|
+
* pre-existing {@link HookResumeSetupSource} (`workflow.resume_setup_source`,
|
|
412
|
+
* on the workflow execution span), which reports the finer-grained
|
|
413
|
+
* hoisted-write outcome; this one is the TTR dimension and shares the metric's
|
|
414
|
+
* three-value vocabulary.
|
|
415
|
+
*/
|
|
416
|
+
export const ResumeSetupSource = SemanticConvention('workflow.resume.setup_source');
|
|
417
|
+
/** Whether the measured step ran in the resuming invocation or a queued one. */
|
|
418
|
+
export const ResumeStepExecution = SemanticConvention('workflow.resume.step_execution');
|
|
133
419
|
// Webhook attributes
|
|
134
420
|
/** Number of webhook handlers triggered */
|
|
135
421
|
export const WebhookHandlersTriggered = SemanticConvention('webhook.handlers.triggered');
|
|
@@ -142,6 +428,8 @@ export const WorkflowSuspensionWaitCount = SemanticConvention('workflow.suspensi
|
|
|
142
428
|
// See: https://opentelemetry.io/docs/specs/semconv/http/http-spans/
|
|
143
429
|
/** HTTP request method (standard OTEL: http.request.method) */
|
|
144
430
|
export const HttpRequestMethod = SemanticConvention('http.request.method');
|
|
431
|
+
/** Route pattern for the request (standard OTEL: http.route) */
|
|
432
|
+
export const HttpRoute = SemanticConvention('http.route');
|
|
145
433
|
/** Full URL of the request (standard OTEL: url.full) */
|
|
146
434
|
export const UrlFull = SemanticConvention('url.full');
|
|
147
435
|
/** Server hostname (standard OTEL: server.address) */
|
|
@@ -165,6 +453,34 @@ export const QueueDeserializeTimeMs = SemanticConvention('workflow.queue.deseria
|
|
|
165
453
|
export const QueueExecutionTimeMs = SemanticConvention('workflow.queue.execution_time_ms');
|
|
166
454
|
/** Time spent serializing the response in milliseconds */
|
|
167
455
|
export const QueueSerializeTimeMs = SemanticConvention('workflow.queue.serialize_time_ms');
|
|
456
|
+
// Payload compression attributes (zstd preferred, gzip fallback; specVersion >= 5)
|
|
457
|
+
//
|
|
458
|
+
// Sizes are measured at the compression boundary: before encryption on the
|
|
459
|
+
// write path and after decryption on the read path. They therefore reflect
|
|
460
|
+
// compression's effect, not the at-rest size (which also includes the
|
|
461
|
+
// ~28-byte `encr` envelope and, on some backends, base64 expansion).
|
|
462
|
+
/** Whether this serialize/deserialize was a write or read. */
|
|
463
|
+
export const SerializationOperation = SemanticConvention('workflow.serialization.operation');
|
|
464
|
+
/** Whether a compression codec was applied (write) / present (read). */
|
|
465
|
+
export const SerializationCompressed = SemanticConvention('workflow.serialization.compressed');
|
|
466
|
+
/** Which compression codec applied / was present (`zstd`, `gzip`, or `none`). */
|
|
467
|
+
export const SerializationCodec = SemanticConvention('workflow.serialization.codec');
|
|
468
|
+
/** Logical (uncompressed, devalue-prefixed) payload size in bytes. */
|
|
469
|
+
export const SerializationUncompressedBytes = SemanticConvention('workflow.serialization.uncompressed_bytes');
|
|
470
|
+
/** Stored (post-compression, pre-encryption) payload size in bytes. */
|
|
471
|
+
export const SerializationStoredBytes = SemanticConvention('workflow.serialization.stored_bytes');
|
|
472
|
+
/** Fraction of bytes saved by compression (0..1); set only when compressed. */
|
|
473
|
+
export const SerializationCompressionRatio = SemanticConvention('workflow.serialization.compression_ratio');
|
|
474
|
+
/**
|
|
475
|
+
* Number of workflow (guest) code executions serialization could not avoid
|
|
476
|
+
* (getters, proxies, custom serializers); set only when non-zero.
|
|
477
|
+
*/
|
|
478
|
+
export const SerializationGuestCodeExecutions = SemanticConvention('workflow.serialization.guest_code_executions');
|
|
479
|
+
/**
|
|
480
|
+
* Deduplicated `kind (detail)` descriptions of the guest-code executions;
|
|
481
|
+
* set only when non-zero.
|
|
482
|
+
*/
|
|
483
|
+
export const SerializationGuestCodeDetails = SemanticConvention('workflow.serialization.guest_code_details');
|
|
168
484
|
// RPC/Peer Service attributes - For service maps and dependency tracking
|
|
169
485
|
// See: https://opentelemetry.io/docs/specs/semconv/rpc/rpc-spans/
|
|
170
486
|
/** The remote service name for Datadog service maps (Datadog-specific: peer.service) */
|
|
@@ -181,4 +497,4 @@ export const RpcMethod = SemanticConvention('rpc.method');
|
|
|
181
497
|
export const ErrorRetryable = SemanticConvention('error.retryable');
|
|
182
498
|
/** Error category (workflow-specific: fatal, retryable, transient) */
|
|
183
499
|
export const ErrorCategory = SemanticConvention('error.category');
|
|
184
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtYW50aWMtY29udmVudGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUNHO0FBSUg7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQUksR0FBRyxLQUFlO0lBQy9DLE9BQU8sQ0FBQyxLQUFRLEVBQUUsRUFBRSxDQUNsQixNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBVSxDQUFDLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsc0JBQXNCO0FBRXRCLDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQVMsZUFBZSxDQUFDLENBQUM7QUFFeEUsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUVqRCxvQkFBb0IsQ0FBQyxDQUFDO0FBRXhCLDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQVMsaUJBQWlCLENBQUMsQ0FBQztBQUUzRSx5Q0FBeUM7QUFDekMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsa0JBQWtCLENBRWpELHFCQUFxQixDQUFDLENBQUM7QUFFekIscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUNqRCxxQkFBcUIsQ0FDdEIsQ0FBQztBQUVGLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FDbkQsdUJBQXVCLENBQ3hCLENBQUM7QUFFRixpREFBaUQ7QUFDakQsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsa0JBQWtC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a0IsQ0FDdEQsb0NBQW9DLENBQ3JDLENBQUM7QUFFRiw2REFBNkQ7QUFDN0QsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsa0JBQWtCLENBQ3BELGtDQUFrQyxDQUNuQyxDQUFDO0FBRUYsMERBQTBEO0FBQzFELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLGtCQUFrQixDQUNwRCxrQ0FBa0MsQ0FDbkMsQ0FBQztBQUVGLHlFQUF5RTtBQUN6RSxrRUFBa0U7QUFFbEUsd0ZBQXdGO0FBQ3hGLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBUyxjQUFjLENBQUMsQ0FBQztBQUV0RSx3REFBd0Q7QUFDeEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFTLFlBQVksQ0FBQyxDQUFDO0FBRWxFLG9EQUFvRDtBQUNwRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsa0JBQWtCLENBQVMsYUFBYSxDQUFDLENBQUM7QUFFcEUsa0RBQWtEO0FBQ2xELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBUyxZQUFZLENBQUMsQ0FBQztBQUVsRSxxREFBcUQ7QUFDckQsZ0ZBQWdGO0FBRWhGLHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsa0JBQWtCLENBQVUsaUJBQWlCLENBQUMsQ0FBQztBQUU3RSxzRUFBc0U7QUFDdEUsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLGtCQUFrQixDQUU3QyxnQkFBZ0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBPcGVuVGVsZW1ldHJ5IHNlbWFudGljIGNvbnZlbnRpb25zIGZvciBWZXJjZWwgV29ya2Zsb3cgdGVsZW1ldHJ5LlxuICpcbiAqIFRoaXMgbW9kdWxlIHByb3ZpZGVzIHN0YW5kYXJkaXplZCB0ZWxlbWV0cnkgYXR0cmlidXRlcyBmb2xsb3dpbmcgT3BlblRlbGVtZXRyeSBzZW1hbnRpYyBjb252ZW50aW9uc1xuICogZm9yIGluc3RydW1lbnRpbmcgd29ya2Zsb3cgZXhlY3V0aW9uLCBzdGVwIHByb2Nlc3NpbmcsIGFuZCByZWxhdGVkIG9wZXJhdGlvbnMuIEVhY2ggZXhwb3J0ZWQgZnVuY3Rpb25cbiAqIGNyZWF0ZXMgYSBwcm9wZXJseSBmb3JtYXR0ZWQgYXR0cmlidXRlIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggT3BlblRlbGVtZXRyeSBzcGFucy5cbiAqXG4gKiBUaGUgc2VtYW50aWMgY29udmVudGlvbnMgYXJlIG9yZ2FuaXplZCBpbnRvIHNldmVyYWwgY2F0ZWdvcmllczpcbiAqIC0gKipXb3JrZmxvdyBhdHRyaWJ1dGVzKio6IFRyYWNrIHdvcmtmbG93IGxpZmVjeWNsZSwgc3RhdHVzLCBhbmQgbWV0YWRhdGFcbiAqIC0gKipTdGVwIGF0dHJpYnV0ZXMqKjogTW9uaXRvciBpbmRpdmlkdWFsIHN0ZXAgZXhlY3V0aW9uLCByZXRyaWVzLCBhbmQgcmVzdWx0c1xuICogLSAqKlF1ZXVlIGF0dHJpYnV0ZXMqKjogSW5zdHJ1bWVudCBtZXNzYWdlIHF1ZXVlIG9wZXJhdGlvbnNcbiAqIC0gKipEZXBsb3ltZW50IGF0dHJpYnV0ZXMqKjogQ2FwdHVyZSBkZXBsb3ltZW50IGVudmlyb25tZW50IGluZm9ybWF0aW9uXG4gKlxuICogQWxsIGF0dHJpYnV0ZSBmdW5jdGlvbnMgYXJlIHR5cGUtc2FmZSBhbmQgbGV2ZXJhZ2UgZXhpc3RpbmcgYmFja2VuZCB0eXBlcyB0byBlbnN1cmVcbiAqIGNvbnNpc3RlbmN5IGJldHdlZW4gdGVsZW1ldHJ5IGRhdGEgYW5kIGFjdHVhbCBzeXN0ZW0gc3RhdGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCAqIGFzIEF0dHJpYnV0ZSBmcm9tICcuL3RlbGVtZXRyeS9zZW1hbnRpYy1jb252ZW50aW9ucy5qcyc7XG4gKlxuICogLy8gU2V0IHdvcmtmbG93IGF0dHJpYnV0ZXMgb24gYSBzcGFuXG4gKiBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICogICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dOYW1lKCdteS13b3JrZmxvdycpLFxuICogICAuLi5BdHRyaWJ1dGUuV29ya2Zsb3dPcGVyYXRpb24oJ3N0YXJ0JyksXG4gKiAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd1J1blN0YXR1cygncnVubmluZycpLFxuICogfSk7XG4gKlxuICogLy8gU2V0IHN0ZXAgYXR0cmlidXRlc1xuICogc3Bhbi5zZXRBdHRyaWJ1dGVzKHtcbiAqICAgLi4uQXR0cmlidXRlLlN0ZXBOYW1lKCdwcm9jZXNzLWRhdGEnKSxcbiAqICAgLi4uQXR0cmlidXRlLlN0ZXBTdGF0dXMoJ2NvbXBsZXRlZCcpLFxuICogICAuLi5BdHRyaWJ1dGUuU3RlcEF0dGVtcHQoMSksXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBzZWUge0BsaW5rIGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvfSBPcGVuVGVsZW1ldHJ5IFNlbWFudGljIENvbnZlbnRpb25zXG4gKiBAcGFja2FnZURvY3VtZW50YXRpb25cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VJZCwgU3RlcCwgV29ya2Zsb3dSdW4gfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBzZW1hbnRpYyBjb252ZW50aW9uIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBhdHRyaWJ1dGUgb2JqZWN0LlxuICogQHBhcmFtIG5hbWUgLSBUaGUgYXR0cmlidXRlIG5hbWUgZm9sbG93aW5nIE9wZW5UZWxlbWV0cnkgc2VtYW50aWMgY29udmVudGlvbnNcbiAqIEByZXR1cm5zIEEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHZhbHVlIGFuZCByZXR1cm5zIGFuIGF0dHJpYnV0ZSBvYmplY3RcbiAqL1xuZnVuY3Rpb24gU2VtYW50aWNDb252ZW50aW9uPFQ+KC4uLm5hbWVzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gKHZhbHVlOiBUKSA9PlxuICAgIE9iamVjdC5mcm9tRW50cmllcyhuYW1lcy5tYXAoKG5hbWUpID0+IFtuYW1lLCB2YWx1ZV0gYXMgY29uc3QpKTtcbn1cblxuLy8gV29ya2Zsb3cgYXR0cmlidXRlc1xuXG4vKiogVGhlIG5hbWUgb2YgdGhlIHdvcmtmbG93IGJlaW5nIGV4ZWN1dGVkICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dOYW1lID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3dvcmtmbG93Lm5hbWUnKTtcblxuLyoqIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkIG9uIHRoZSB3b3JrZmxvdyAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93T3BlcmF0aW9uID0gU2VtYW50aWNDb252ZW50aW9uPFxuICAnc3RhcnQnIHwgJ2V4ZWN1dGUnIHwgJ2V4ZWN1dGVfdjInIHwgJ3J1bidcbj4oJ3dvcmtmbG93Lm9wZXJhdGlvbicpO1xuXG4vKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc3BlY2lmaWMgd29ya2Zsb3cgcnVuIGluc3RhbmNlICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dSdW5JZCA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCd3b3JrZmxvdy5ydW4uaWQnKTtcblxuLyoqIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSB3b3JrZmxvdyBydW4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1J1blN0YXR1cyA9IFNlbWFudGljQ29udmVudGlvbjxcbiAgV29ya2Zsb3dSdW5bJ3N0YXR1cyddIHwgJ3dvcmtmbG93X3N1c3BlbmRlZCdcbj4oJ3dvcmtmbG93LnJ1bi5zdGF0dXMnKTtcblxuLyoqIFRpbWVzdGFtcCB3aGVuIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gc3RhcnRlZCAoVW5peCB0aW1lc3RhbXApICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dTdGFydGVkQXQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnN0YXJ0ZWRfYXQnXG4pO1xuXG4vKiogTnVtYmVyIG9mIGV2ZW50cyBwcm9jZXNzZWQgZHVyaW5nIHdvcmtmbG93IGV4ZWN1dGlvbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RXZlbnRzQ291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LmV2ZW50cy5jb3VudCdcbik7XG5cbi8qKiBOdW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgd29ya2Zsb3cgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0FyZ3VtZW50c0NvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5hcmd1bWVudHMuY291bnQnXG4pO1xuXG4vKiogVHlwZSBvZiB0aGUgd29ya2Zsb3cgcmVzdWx0ICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dSZXN1bHRUeXBlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oXG4gICd3b3JrZmxvdy5yZXN1bHQudHlwZSdcbik7XG5cbi8qKiBXaGV0aGVyIHRyYWNlIGNvbnRleHQgd2FzIHByb3BhZ2F0ZWQgdG8gdGhpcyB3b3JrZmxvdyBleGVjdXRpb24gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1RyYWNlUHJvcGFnYXRlZCA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPihcbiAgJ3dvcmtmbG93LnRyYWNlLnByb3BhZ2F0ZWQnXG4pO1xuXG4vKiogTmFtZSBvZiB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgd29ya2Zsb3cgZmFpbHVyZSAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RXJyb3JOYW1lID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oXG4gICd3b3JrZmxvdy5lcnJvci5uYW1lJ1xuKTtcblxuLyoqIEVycm9yIG1lc3NhZ2Ugd2hlbiB3b3JrZmxvdyBmYWlscyAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RXJyb3JNZXNzYWdlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oXG4gICd3b3JrZmxvdy5lcnJvci5tZXNzYWdlJ1xuKTtcblxuLyoqIEVycm9yIGNsYXNzaWZpY2F0aW9uIGNvZGUgKFVTRVJfRVJST1IsIFJVTlRJTUVfRVJST1IsIGV0Yy4pICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dFcnJvckNvZGUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPihcbiAgJ3dvcmtmbG93LmVycm9yLmNvZGUnXG4pO1xuXG4vKiogTnVtYmVyIG9mIHN0ZXBzIGNyZWF0ZWQgZHVyaW5nIHdvcmtmbG93IGV4ZWN1dGlvbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93U3RlcHNDcmVhdGVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5zdGVwcy5jcmVhdGVkJ1xuKTtcblxuLyoqIE51bWJlciBvZiBob29rcyBjcmVhdGVkIGR1cmluZyB3b3JrZmxvdyBleGVjdXRpb24gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0hvb2tzQ3JlYXRlZCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuaG9va3MuY3JlYXRlZCdcbik7XG5cbi8qKiBOdW1iZXIgb2Ygd2FpdHMgY3JlYXRlZCBkdXJpbmcgd29ya2Zsb3cgZXhlY3V0aW9uICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dXYWl0c0NyZWF0ZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LndhaXRzLmNyZWF0ZWQnXG4pO1xuXG4vLyBTdGVwIGF0dHJpYnV0ZXNcblxuLyoqIE5hbWUgb2YgdGhlIHN0ZXAgZnVuY3Rpb24gYmVpbmcgZXhlY3V0ZWQgKi9cbmV4cG9ydCBjb25zdCBTdGVwTmFtZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzdGVwLm5hbWUnKTtcblxuLyoqIFVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgc3RlcCBpbnN0YW5jZSAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBJZCA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzdGVwLmlkJyk7XG5cbi8qKiBDdXJyZW50IGF0dGVtcHQgbnVtYmVyIGZvciBzdGVwIGV4ZWN1dGlvbiAoc3RhcnRzIGF0IDEpICovXG5leHBvcnQgY29uc3QgU3RlcEF0dGVtcHQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPignc3RlcC5hdHRlbXB0Jyk7XG5cbi8qKiBDdXJyZW50IHN0YXR1cyBvZiB0aGUgc3RlcCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBTdGF0dXMgPSBTZW1hbnRpY0NvbnZlbnRpb248U3RlcFsnc3RhdHVzJ10+KCdzdGVwLnN0YXR1cycpO1xuXG4vKiogTWF4aW11bSBudW1iZXIgb2YgcmV0cmllcyBhbGxvd2VkIGZvciB0aGlzIHN0ZXAgKi9cbmV4cG9ydCBjb25zdCBTdGVwTWF4UmV0cmllcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KCdzdGVwLm1heF9yZXRyaWVzJyk7XG5cbi8qKiBXaGV0aGVyIHRyYWNlIGNvbnRleHQgd2FzIHByb3BhZ2F0ZWQgdG8gdGhpcyBzdGVwIGV4ZWN1dGlvbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBUcmFjZVByb3BhZ2F0ZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oXG4gICdzdGVwLnRyYWNlLnByb3BhZ2F0ZWQnXG4pO1xuXG4vKiogV2hldGhlciB0aGUgc3RlcCB3YXMgc2tpcHBlZCBkdXJpbmcgZXhlY3V0aW9uICovXG5leHBvcnQgY29uc3QgU3RlcFNraXBwZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oJ3N0ZXAuc2tpcHBlZCcpO1xuXG4vKiogUmVhc29uIHdoeSB0aGUgc3RlcCB3YXMgc2tpcHBlZCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBTa2lwUmVhc29uID1cbiAgU2VtYW50aWNDb252ZW50aW9uPFN0ZXBbJ3N0YXR1cyddPignc3RlcC5za2lwX3JlYXNvbicpO1xuXG4vKiogTnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gdGhlIHN0ZXAgZnVuY3Rpb24gKi9cbmV4cG9ydCBjb25zdCBTdGVwQXJndW1lbnRzQ291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3N0ZXAuYXJndW1lbnRzLmNvdW50J1xuKTtcblxuLyoqIFR5cGUgb2YgdGhlIHN0ZXAgcmVzdWx0ICovXG5leHBvcnQgY29uc3QgU3RlcFJlc3VsdFR5cGUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignc3RlcC5yZXN1bHQudHlwZScpO1xuXG4vKiogTmFtZSBvZiB0aGUgZXJyb3IgdGhhdCBjYXVzZWQgc3RlcCBmYWlsdXJlICovXG5leHBvcnQgY29uc3QgU3RlcEVycm9yTmFtZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzdGVwLmVycm9yLm5hbWUnKTtcblxuLyoqIEVycm9yIG1lc3NhZ2Ugd2hlbiBzdGVwIGZhaWxzICovXG5leHBvcnQgY29uc3QgU3RlcEVycm9yTWVzc2FnZSA9XG4gIFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzdGVwLmVycm9yLm1lc3NhZ2UnKTtcblxuLyoqIFdoZXRoZXIgdGhlIHN0ZXAgZmFpbGVkIHdpdGggYSBmYXRhbCBlcnJvciAobm8gcmV0cmllcykgKi9cbmV4cG9ydCBjb25zdCBTdGVwRmF0YWxFcnJvciA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPignc3RlcC5mYXRhbF9lcnJvcicpO1xuXG4vKiogV2hldGhlciBhbGwgcmV0cnkgYXR0ZW1wdHMgaGF2ZSBiZWVuIGV4aGF1c3RlZCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBSZXRyeUV4aGF1c3RlZCA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPihcbiAgJ3N0ZXAucmV0cnkuZXhoYXVzdGVkJ1xuKTtcblxuLyoqIE51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIG5leHQgcmV0cnkgYXR0ZW1wdCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBSZXRyeVRpbWVvdXRTZWNvbmRzID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICdzdGVwLnJldHJ5LnRpbWVvdXRfc2Vjb25kcydcbik7XG5cbi8qKiBXaGV0aGVyIHRoZSBzdGVwIHdpbGwgYmUgcmV0cmllZCBhZnRlciB0aGlzIGZhaWx1cmUgKi9cbmV4cG9ydCBjb25zdCBTdGVwUmV0cnlXaWxsUmV0cnkgPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oXG4gICdzdGVwLnJldHJ5LndpbGxfcmV0cnknXG4pO1xuXG4vLyBRdWV1ZS9NZXNzYWdpbmcgYXR0cmlidXRlcyAtIFN0YW5kYXJkIE9URUwgbWVzc2FnaW5nIGNvbnZlbnRpb25zXG4vLyBTZWU6IGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvbWVzc2FnaW5nL21lc3NhZ2luZy1zcGFucy9cblxuLyoqIE1lc3NhZ2luZyBzeXN0ZW0gaWRlbnRpZmllciAoc3RhbmRhcmQgT1RFTDogbWVzc2FnaW5nLnN5c3RlbSkgKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdpbmdTeXN0ZW0gPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignbWVzc2FnaW5nLnN5c3RlbScpO1xuXG4vKiogRGVzdGluYXRpb24gbmFtZS9xdWV1ZSBuYW1lIChzdGFuZGFyZCBPVEVMOiBtZXNzYWdpbmcuZGVzdGluYXRpb24ubmFtZSkgKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdpbmdEZXN0aW5hdGlvbk5hbWUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPihcbiAgJ21lc3NhZ2luZy5kZXN0aW5hdGlvbi5uYW1lJ1xuKTtcblxuLyoqIFRoZSBtZXNzYWdlIGlkIGJlaW5nIGhhbmRsZWQgKHN0YW5kYXJkIE9URUw6IG1lc3NhZ2luZy5tZXNzYWdlLmlkKSAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2luZ01lc3NhZ2VJZCA9IFNlbWFudGljQ29udmVudGlvbjxNZXNzYWdlSWQ+KFxuICAnbWVzc2FnaW5nLm1lc3NhZ2UuaWQnXG4pO1xuXG4vKiogT3BlcmF0aW9uIHR5cGUgKHN0YW5kYXJkIE9URUw6IG1lc3NhZ2luZy5vcGVyYXRpb24udHlwZSkgKi9cbmV4cG9ydCBjb25zdCBNZXNzYWdpbmdPcGVyYXRpb25UeXBlID0gU2VtYW50aWNDb252ZW50aW9uPFxuICAncHVibGlzaCcgfCAncmVjZWl2ZScgfCAncHJvY2Vzcydcbj4oJ21lc3NhZ2luZy5vcGVyYXRpb24udHlwZScpO1xuXG4vKiogVGltZSB0YWtlbiB0byBlbnF1ZXVlIHRoZSBtZXNzYWdlIGluIG1pbGxpc2Vjb25kcyAod29ya2Zsb3ctc3BlY2lmaWMpICovXG5leHBvcnQgY29uc3QgUXVldWVPdmVyaGVhZE1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5xdWV1ZS5vdmVyaGVhZF9tcydcbik7XG5cbi8vIERlcGxveW1lbnQgYXR0cmlidXRlc1xuXG4vKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBkZXBsb3ltZW50IGVudmlyb25tZW50ICovXG5leHBvcnQgY29uc3QgRGVwbG95bWVudElkID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ2RlcGxveW1lbnQuaWQnKTtcblxuLy8gSG9vayBhdHRyaWJ1dGVzXG5cbi8qKiBUb2tlbiBpZGVudGlmeWluZyBhIHNwZWNpZmljIGhvb2sgKi9cbmV4cG9ydCBjb25zdCBIb29rVG9rZW4gPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignd29ya2Zsb3cuaG9vay50b2tlbicpO1xuXG4vKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgaG9vayBpbnN0YW5jZSAqL1xuZXhwb3J0IGNvbnN0IEhvb2tJZCA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCd3b3JrZmxvdy5ob29rLmlkJyk7XG5cbi8qKiBXaGV0aGVyIGEgaG9vayB3YXMgZm91bmQgYnkgaXRzIHRva2VuICovXG5leHBvcnQgY29uc3QgSG9va0ZvdW5kID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KCd3b3JrZmxvdy5ob29rLmZvdW5kJyk7XG5cbi8vIFdlYmhvb2sgYXR0cmlidXRlc1xuXG4vKiogTnVtYmVyIG9mIHdlYmhvb2sgaGFuZGxlcnMgdHJpZ2dlcmVkICovXG5leHBvcnQgY29uc3QgV2ViaG9va0hhbmRsZXJzVHJpZ2dlcmVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3ZWJob29rLmhhbmRsZXJzLnRyaWdnZXJlZCdcbik7XG5cbi8vIFN1c3BlbnNpb24gYXR0cmlidXRlc1xuXG5leHBvcnQgY29uc3QgV29ya2Zsb3dTdXNwZW5zaW9uU3RhdGUgPSBTZW1hbnRpY0NvbnZlbnRpb248J3N1c3BlbmRlZCc+KFxuICAnd29ya2Zsb3cuc3VzcGVuc2lvbi5zdGF0ZSdcbik7XG5leHBvcnQgY29uc3QgV29ya2Zsb3dTdXNwZW5zaW9uSG9va0NvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5zdXNwZW5zaW9uLmhvb2tfY291bnQnXG4pO1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93U3VzcGVuc2lvblN0ZXBDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuc3VzcGVuc2lvbi5zdGVwX2NvdW50J1xuKTtcbmV4cG9ydCBjb25zdCBXb3JrZmxvd1N1c3BlbnNpb25XYWl0Q291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnN1c3BlbnNpb24ud2FpdF9jb3VudCdcbik7XG5cbi8vIFdvcmxkL1N0b3JhZ2UgYXR0cmlidXRlcyAtIFN0YW5kYXJkIE9URUwgSFRUUCBjb252ZW50aW9uc1xuLy8gU2VlOiBodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9zZW1jb252L2h0dHAvaHR0cC1zcGFucy9cblxuLyoqIEhUVFAgcmVxdWVzdCBtZXRob2QgKHN0YW5kYXJkIE9URUw6IGh0dHAucmVxdWVzdC5tZXRob2QpICovXG5leHBvcnQgY29uc3QgSHR0cFJlcXVlc3RNZXRob2QgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPihcbiAgJ2h0dHAucmVxdWVzdC5tZXRob2QnXG4pO1xuXG4vKiogRnVsbCBVUkwgb2YgdGhlIHJlcXVlc3QgKHN0YW5kYXJkIE9URUw6IHVybC5mdWxsKSAqL1xuZXhwb3J0IGNvbnN0IFVybEZ1bGwgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPigndXJsLmZ1bGwnKTtcblxuLyoqIFNlcnZlciBob3N0bmFtZSAoc3RhbmRhcmQgT1RFTDogc2VydmVyLmFkZHJlc3MpICovXG5leHBvcnQgY29uc3QgU2VydmVyQWRkcmVzcyA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzZXJ2ZXIuYWRkcmVzcycpO1xuXG4vKiogU2VydmVyIHBvcnQgKHN0YW5kYXJkIE9URUw6IHNlcnZlci5wb3J0KSAqL1xuZXhwb3J0IGNvbnN0IFNlcnZlclBvcnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPignc2VydmVyLnBvcnQnKTtcblxuLyoqIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgKHN0YW5kYXJkIE9URUw6IGh0dHAucmVzcG9uc2Uuc3RhdHVzX2NvZGUpICovXG5leHBvcnQgY29uc3QgSHR0cFJlc3BvbnNlU3RhdHVzQ29kZSA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnaHR0cC5yZXNwb25zZS5zdGF0dXNfY29kZSdcbik7XG5cbi8qKiBFcnJvciB0eXBlIHdoZW4gcmVxdWVzdCBmYWlscyAoc3RhbmRhcmQgT1RFTDogZXJyb3IudHlwZSkgKi9cbmV4cG9ydCBjb25zdCBFcnJvclR5cGUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignZXJyb3IudHlwZScpO1xuXG4vLyBXb3JsZC1zcGVjaWZpYyBjdXN0b20gYXR0cmlidXRlcyAoZm9yIHdvcmtmbG93LXNwZWNpZmljIGNvbnRleHQpXG5cbi8qKiBGb3JtYXQgdXNlZCBmb3IgcGFyc2luZyByZXNwb25zZSBib2R5IChjYm9yIG9yIGpzb24pICovXG5leHBvcnQgY29uc3QgV29ybGRQYXJzZUZvcm1hdCA9IFNlbWFudGljQ29udmVudGlvbjwnY2JvcicgfCAnanNvbic+KFxuICAnd29ya2Zsb3cud29ybGQucGFyc2UuZm9ybWF0J1xuKTtcblxuLy8gRXZlbnQgbG9hZGluZyBhdHRyaWJ1dGVzXG5cbi8qKiBOdW1iZXIgb2YgcGFnaW5hdGlvbiBwYWdlcyBsb2FkZWQgd2hlbiBmZXRjaGluZyB3b3JrZmxvdyBldmVudHMgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0V2ZW50c1BhZ2VzTG9hZGVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5ldmVudHMucGFnZXNfbG9hZGVkJ1xuKTtcblxuLy8gUXVldWUgdGltaW5nIGJyZWFrZG93biBhdHRyaWJ1dGVzICh3b3JrZmxvdy1zcGVjaWZpYylcblxuLyoqIFRpbWUgc3BlbnQgZGVzZXJpYWxpemluZyB0aGUgcXVldWUgbWVzc2FnZSBpbiBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBjb25zdCBRdWV1ZURlc2VyaWFsaXplVGltZU1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5xdWV1ZS5kZXNlcmlhbGl6ZV90aW1lX21zJ1xuKTtcblxuLyoqIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRoZSBoYW5kbGVyIGxvZ2ljIGluIG1pbGxpc2Vjb25kcyAqL1xuZXhwb3J0IGNvbnN0IFF1ZXVlRXhlY3V0aW9uVGltZU1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5xdWV1ZS5leGVjdXRpb25fdGltZV9tcydcbik7XG5cbi8qKiBUaW1lIHNwZW50IHNlcmlhbGl6aW5nIHRoZSByZXNwb25zZSBpbiBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBjb25zdCBRdWV1ZVNlcmlhbGl6ZVRpbWVNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cucXVldWUuc2VyaWFsaXplX3RpbWVfbXMnXG4pO1xuXG4vLyBSUEMvUGVlciBTZXJ2aWNlIGF0dHJpYnV0ZXMgLSBGb3Igc2VydmljZSBtYXBzIGFuZCBkZXBlbmRlbmN5IHRyYWNraW5nXG4vLyBTZWU6IGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvcnBjL3JwYy1zcGFucy9cblxuLyoqIFRoZSByZW1vdGUgc2VydmljZSBuYW1lIGZvciBEYXRhZG9nIHNlcnZpY2UgbWFwcyAoRGF0YWRvZy1zcGVjaWZpYzogcGVlci5zZXJ2aWNlKSAqL1xuZXhwb3J0IGNvbnN0IFBlZXJTZXJ2aWNlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3BlZXIuc2VydmljZScpO1xuXG4vKiogUlBDIHN5c3RlbSBpZGVudGlmaWVyIChzdGFuZGFyZCBPVEVMOiBycGMuc3lzdGVtKSAqL1xuZXhwb3J0IGNvbnN0IFJwY1N5c3RlbSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdycGMuc3lzdGVtJyk7XG5cbi8qKiBSUEMgc2VydmljZSBuYW1lIChzdGFuZGFyZCBPVEVMOiBycGMuc2VydmljZSkgKi9cbmV4cG9ydCBjb25zdCBScGNTZXJ2aWNlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3JwYy5zZXJ2aWNlJyk7XG5cbi8qKiBSUEMgbWV0aG9kIG5hbWUgKHN0YW5kYXJkIE9URUw6IHJwYy5tZXRob2QpICovXG5leHBvcnQgY29uc3QgUnBjTWV0aG9kID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3JwYy5tZXRob2QnKTtcblxuLy8gRXJyb3IgYXR0cmlidXRlcyAtIFN0YW5kYXJkIE9URUwgZXJyb3IgY29udmVudGlvbnNcbi8vIFNlZTogaHR0cHM6Ly9vcGVudGVsZW1ldHJ5LmlvL2RvY3Mvc3BlY3Mvc2VtY29udi9leGNlcHRpb25zL2V4Y2VwdGlvbnMtc3BhbnMvXG5cbi8qKiBXaGV0aGVyIHRoZSBlcnJvciBpcyByZXRyeWFibGUgKHdvcmtmbG93LXNwZWNpZmljKSAqL1xuZXhwb3J0IGNvbnN0IEVycm9yUmV0cnlhYmxlID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KCdlcnJvci5yZXRyeWFibGUnKTtcblxuLyoqIEVycm9yIGNhdGVnb3J5ICh3b3JrZmxvdy1zcGVjaWZpYzogZmF0YWwsIHJldHJ5YWJsZSwgdHJhbnNpZW50KSAqL1xuZXhwb3J0IGNvbnN0IEVycm9yQ2F0ZWdvcnkgPSBTZW1hbnRpY0NvbnZlbnRpb248XG4gICdmYXRhbCcgfCAncmV0cnlhYmxlJyB8ICd0cmFuc2llbnQnXG4+KCdlcnJvci5jYXRlZ29yeScpO1xuIl19
|
|
500
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtYW50aWMtY29udmVudGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUNHO0FBSUg7Ozs7R0FJRztBQUNILFNBQVMsa0JBQWtCLENBQUksR0FBRyxLQUFlO0lBQy9DLE9BQU8sQ0FBQyxLQUFRLEVBQUUsRUFBRSxDQUNsQixNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBVSxDQUFDLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsc0JBQXNCO0FBRXRCLDhDQUE4QztBQUM5QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsa0JBQWtCLENBQVMsZUFBZSxDQUFDLENBQUM7QUFFeEUsb0RBQW9EO0FBQ3BELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUVqRCxvQkFBb0IsQ0FBQyxDQUFDO0FBRXhCLDZEQUE2RDtBQUM3RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsa0JBQWtCLENBQVMsaUJBQWlCLENBQUMsQ0FBQztBQUUzRSx5Q0FBeUM7QUFDekMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsa0JBQWtCLENBRWpELHFCQUFxQixDQUFDLENBQUM7QUFFekIscUVBQXFFO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLGtCQUFrQixDQUNqRCxxQkFBcUIsQ0FDdEIsQ0FBQztBQUVGLDJEQUEyRDtBQUMzRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FDbkQsdUJBQXVCLENBQ3hCLENBQUM7QUFFRiw2RUFBNkU7QUFDN0UsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQUcsa0JBQWtC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QUFFdEUsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxrQkFBa0IsQ0FBUyxZQUFZLENBQUMsQ0FBQztBQUVsRSxvREFBb0Q7QUFDcEQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLGtCQUFrQixDQUFTLGFBQWEsQ0FBQyxDQUFDO0FBRXBFLGtEQUFrRDtBQUNsRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQVMsWUFBWSxDQUFDLENBQUM7QUFFbEUscURBQXFEO0FBQ3JELGdGQUFnRjtBQUVoRix5REFBeUQ7QUFDekQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLGtCQUFrQixDQUFVLGlCQUFpQixDQUFDLENBQUM7QUFFN0Usc0VBQXNFO0FBQ3RFLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxrQkFBa0IsQ0FFN0MsZ0JBQWdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3BlblRlbGVtZXRyeSBzZW1hbnRpYyBjb252ZW50aW9ucyBmb3IgVmVyY2VsIFdvcmtmbG93IHRlbGVtZXRyeS5cbiAqXG4gKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBzdGFuZGFyZGl6ZWQgdGVsZW1ldHJ5IGF0dHJpYnV0ZXMgZm9sbG93aW5nIE9wZW5UZWxlbWV0cnkgc2VtYW50aWMgY29udmVudGlvbnNcbiAqIGZvciBpbnN0cnVtZW50aW5nIHdvcmtmbG93IGV4ZWN1dGlvbiwgc3RlcCBwcm9jZXNzaW5nLCBhbmQgcmVsYXRlZCBvcGVyYXRpb25zLiBFYWNoIGV4cG9ydGVkIGZ1bmN0aW9uXG4gKiBjcmVhdGVzIGEgcHJvcGVybHkgZm9ybWF0dGVkIGF0dHJpYnV0ZSBvYmplY3QgZm9yIHVzZSB3aXRoIE9wZW5UZWxlbWV0cnkgc3BhbnMuXG4gKlxuICogVGhlIHNlbWFudGljIGNvbnZlbnRpb25zIGFyZSBvcmdhbml6ZWQgaW50byBzZXZlcmFsIGNhdGVnb3JpZXM6XG4gKiAtICoqV29ya2Zsb3cgYXR0cmlidXRlcyoqOiBUcmFjayB3b3JrZmxvdyBsaWZlY3ljbGUsIHN0YXR1cywgYW5kIG1ldGFkYXRhXG4gKiAtICoqU3RlcCBhdHRyaWJ1dGVzKio6IE1vbml0b3IgaW5kaXZpZHVhbCBzdGVwIGV4ZWN1dGlvbiwgcmV0cmllcywgYW5kIHJlc3VsdHNcbiAqIC0gKipRdWV1ZSBhdHRyaWJ1dGVzKio6IEluc3RydW1lbnQgbWVzc2FnZSBxdWV1ZSBvcGVyYXRpb25zXG4gKiAtICoqRGVwbG95bWVudCBhdHRyaWJ1dGVzKio6IENhcHR1cmUgZGVwbG95bWVudCBlbnZpcm9ubWVudCBpbmZvcm1hdGlvblxuICpcbiAqIEFsbCBhdHRyaWJ1dGUgZnVuY3Rpb25zIGFyZSB0eXBlLXNhZmUgYW5kIHVzZSBleGlzdGluZyBiYWNrZW5kIHR5cGVzIHRvIGVuc3VyZVxuICogY29uc2lzdGVuY3kgYmV0d2VlbiB0ZWxlbWV0cnkgZGF0YSBhbmQgYWN0dWFsIHN5c3RlbSBzdGF0ZS5cbiAqXG4gKiBAZXhhbXBsZVxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0ICogYXMgQXR0cmlidXRlIGZyb20gJy4vdGVsZW1ldHJ5L3NlbWFudGljLWNvbnZlbnRpb25zLmpzJztcbiAqXG4gKiAvLyBTZXQgd29ya2Zsb3cgYXR0cmlidXRlcyBvbiBhIHNwYW5cbiAqIHNwYW4uc2V0QXR0cmlidXRlcyh7XG4gKiAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd05hbWUoJ215LXdvcmtmbG93JyksXG4gKiAgIC4uLkF0dHJpYnV0ZS5Xb3JrZmxvd09wZXJhdGlvbignc3RhcnQnKSxcbiAqICAgLi4uQXR0cmlidXRlLldvcmtmbG93UnVuU3RhdHVzKCdydW5uaW5nJyksXG4gKiB9KTtcbiAqXG4gKiAvLyBTZXQgc3RlcCBhdHRyaWJ1dGVzXG4gKiBzcGFuLnNldEF0dHJpYnV0ZXMoe1xuICogICAuLi5BdHRyaWJ1dGUuU3RlcE5hbWUoJ3Byb2Nlc3MtZGF0YScpLFxuICogICAuLi5BdHRyaWJ1dGUuU3RlcFN0YXR1cygnY29tcGxldGVkJyksXG4gKiAgIC4uLkF0dHJpYnV0ZS5TdGVwQXR0ZW1wdCgxKSxcbiAqIH0pO1xuICogYGBgXG4gKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9vcGVudGVsZW1ldHJ5LmlvL2RvY3Mvc3BlY3Mvc2VtY29udi99IE9wZW5UZWxlbWV0cnkgU2VtYW50aWMgQ29udmVudGlvbnNcbiAqIEBwYWNrYWdlRG9jdW1lbnRhdGlvblxuICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUlkLCBTdGVwLCBXb3JrZmxvd1J1biB9IGZyb20gJ0B3b3JrZmxvdy93b3JsZCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIHNlbWFudGljIGNvbnZlbnRpb24gZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGF0dHJpYnV0ZSBvYmplY3QuXG4gKiBAcGFyYW0gbmFtZSAtIFRoZSBhdHRyaWJ1dGUgbmFtZSBmb2xsb3dpbmcgT3BlblRlbGVtZXRyeSBzZW1hbnRpYyBjb252ZW50aW9uc1xuICogQHJldHVybnMgQSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgdmFsdWUgYW5kIHJldHVybnMgYW4gYXR0cmlidXRlIG9iamVjdFxuICovXG5mdW5jdGlvbiBTZW1hbnRpY0NvbnZlbnRpb248VD4oLi4ubmFtZXM6IHN0cmluZ1tdKSB7XG4gIHJldHVybiAodmFsdWU6IFQpID0+XG4gICAgT2JqZWN0LmZyb21FbnRyaWVzKG5hbWVzLm1hcCgobmFtZSkgPT4gW25hbWUsIHZhbHVlXSBhcyBjb25zdCkpO1xufVxuXG4vLyBXb3JrZmxvdyBhdHRyaWJ1dGVzXG5cbi8qKiBUaGUgbmFtZSBvZiB0aGUgd29ya2Zsb3cgYmVpbmcgZXhlY3V0ZWQgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd05hbWUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignd29ya2Zsb3cubmFtZScpO1xuXG4vKiogVGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQgb24gdGhlIHdvcmtmbG93ICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dPcGVyYXRpb24gPSBTZW1hbnRpY0NvbnZlbnRpb248XG4gICdzdGFydCcgfCAnZXhlY3V0ZScgfCAnZXhlY3V0ZV92MicgfCAncnVuJ1xuPignd29ya2Zsb3cub3BlcmF0aW9uJyk7XG5cbi8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzcGVjaWZpYyB3b3JrZmxvdyBydW4gaW5zdGFuY2UgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1J1bklkID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3dvcmtmbG93LnJ1bi5pZCcpO1xuXG4vKiogQ3VycmVudCBzdGF0dXMgb2YgdGhlIHdvcmtmbG93IHJ1biAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93UnVuU3RhdHVzID0gU2VtYW50aWNDb252ZW50aW9uPFxuICBXb3JrZmxvd1J1blsnc3RhdHVzJ10gfCAnd29ya2Zsb3dfc3VzcGVuZGVkJ1xuPignd29ya2Zsb3cucnVuLnN0YXR1cycpO1xuXG4vKiogVGltZXN0YW1wIHdoZW4gdGhlIHdvcmtmbG93IGV4ZWN1dGlvbiBzdGFydGVkIChVbml4IHRpbWVzdGFtcCkgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1N0YXJ0ZWRBdCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuc3RhcnRlZF9hdCdcbik7XG5cbi8qKiBOdW1iZXIgb2YgZXZlbnRzIHByb2Nlc3NlZCBkdXJpbmcgd29ya2Zsb3cgZXhlY3V0aW9uICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dFdmVudHNDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuZXZlbnRzLmNvdW50J1xuKTtcblxuLyoqIFdoZXRoZXIgd29ya2Zsb3cgZXhlY3V0aW9uIHN0YXJ0cyB3aXRoIHJlcGxheSBvciByZXN1bWVzIGEgcmV0YWluZWQgVk0gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0V4ZWN1dGlvbk1vZGUgPSBTZW1hbnRpY0NvbnZlbnRpb248J3JlcGxheScgfCAncmV0YWluZWQnPihcbiAgJ3dvcmtmbG93LmV4ZWN1dGlvbi5tb2RlJ1xuKTtcblxuLyoqIFdoZXRoZXIgdGhlIGNvbXBpbGVkIGFwcGxpY2F0aW9uIHdvcmtmbG93IGJ1bmRsZSB3YXMgY2FjaGVkLiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93QnVuZGxlQ29tcGlsZUNhY2hlSGl0ID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cuYnVuZGxlLmNvbXBpbGUuY2FjaGVfaGl0J1xuKTtcblxuLyoqIE9wZXJhdGlvbiB0aGF0IHN1cHBsaWVkIGV2ZW50cyB0byB0aGUgY3VycmVudCByZXBsYXkuICovXG5leHBvcnQgdHlwZSBXb3JrZmxvd1JlcGxheUxvYWRTb3VyY2UgPVxuICB8ICdydW5fc3RhcnRlZCdcbiAgfCAnaG9va19wcmVsb2FkJ1xuICB8ICdldmVudHNfbGlzdCdcbiAgfCAnZXZlbnRzX2xpc3RfaW5jcmVtZW50YWwnO1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93UmVwbGF5TG9hZFNvdXJjZSA9XG4gIFNlbWFudGljQ29udmVudGlvbjxXb3JrZmxvd1JlcGxheUxvYWRTb3VyY2U+KCd3b3JrZmxvdy5yZXBsYXkubG9hZC5zb3VyY2UnKTtcblxuLyoqXG4gKiBFdmVudHMgdGhlIHJlcGxheSB3YWxrZWQgcGFzdCB0aGF0IG5vIGNvbnN1bWVyIGNsYWltZWQsIHN0aWxsIGhlbGQgd2hlbiB0aGVcbiAqIHJlcGxheSBzdG9wcGVkLlxuICpcbiAqIEEgbm9uLXplcm8gY291bnQgb24gYSBzdXNwZW5zaW9uIGlzIG9yZGluYXJ5OiBhbiBvdXQtb2YtYmFuZCBkZWxpdmVyeSB0aGF0XG4gKiBsYW5kZWQgYWhlYWQgb2YgdGhlIGNvZGUgdGhhdCByZWFkcyBpdCB3YWl0cyBmb3IgdGhlIHJlcGxheSB0aGF0IGdldHMgdGhlcmUuXG4gKiBGcm9tIGluc2lkZSBvbmUgcmVwbGF5IHRoYXQgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhbiBldmVudCBubyByZXBsYXkgd2lsbFxuICogZXZlciBjbGFpbSwgYmVjYXVzZSB0aGUgdHdvIGRpZmZlciBvbmx5IGluIHdoYXQgdGhlIG5leHQgcmVwbGF5IGRvZXMuIFNvIHRoZVxuICogY291bnQgZ29lcyBvbiB0aGUgc3BhbiBpbnN0ZWFkIG9mIGZhaWxpbmcgdGhlIHJ1biwgYW5kIHRoZSBjYXNlIHdvcnRoIGFjdGluZ1xuICogb24gaXMgYSBxdWVyeSBhY3Jvc3MgYSBydW4ncyBzcGFuczogdGhlIHNhbWVcbiAqIHtAbGluayBXb3JrZmxvd1BhcmtlZEV2ZW50SWR9IGhlbGQgb24gc3VzcGVuc2lvbiBhZnRlciBzdXNwZW5zaW9uLlxuICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dQYXJrZWRFdmVudHNDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuZXZlbnRzLnBhcmtlZC5jb3VudCdcbik7XG5cbi8qKiBPbGRlc3QgZXZlbnQgc3RpbGwgaGVsZCB1bmNsYWltZWQgd2hlbiB0aGUgcmVwbGF5IHN0b3BwZWQuICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dQYXJrZWRFdmVudElkID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oXG4gICd3b3JrZmxvdy5ldmVudHMucGFya2VkLmV2ZW50X2lkJ1xuKTtcblxuLyoqIFR5cGUgb2YgdGhlIG9sZGVzdCBldmVudCBzdGlsbCBoZWxkIHVuY2xhaW1lZCB3aGVuIHRoZSByZXBsYXkgc3RvcHBlZC4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1BhcmtlZEV2ZW50VHlwZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnd29ya2Zsb3cuZXZlbnRzLnBhcmtlZC5ldmVudF90eXBlJ1xuKTtcblxuLyoqIE51bWJlciBvZiBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSB3b3JrZmxvdyAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93QXJndW1lbnRzQ291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LmFyZ3VtZW50cy5jb3VudCdcbik7XG5cbi8qKiBUeXBlIG9mIHRoZSB3b3JrZmxvdyByZXN1bHQgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1Jlc3VsdFR5cGUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPihcbiAgJ3dvcmtmbG93LnJlc3VsdC50eXBlJ1xuKTtcblxuLyoqIFdoZXRoZXIgdHJhY2UgY29udGV4dCB3YXMgcHJvcGFnYXRlZCB0byB0aGlzIHdvcmtmbG93IGV4ZWN1dGlvbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93VHJhY2VQcm9wYWdhdGVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cudHJhY2UucHJvcGFnYXRlZCdcbik7XG5cbi8vIFF1aWNrSlMgVk0gZW5naW5lIGF0dHJpYnV0ZXNcblxuLyoqIFRoZSBWTSBlbmdpbmUgZXhlY3V0aW5nIHRoZSB3b3JrZmxvdyBmdW5jdGlvbiBmb3IgdGhpcyBpbnZvY2F0aW9uICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dWbSA9IFNlbWFudGljQ29udmVudGlvbjwnbm9kZScgfCAncXVpY2tqcyc+KCd3b3JrZmxvdy52bScpO1xuXG4vKiogT3V0Y29tZSBvZiBhIFF1aWNrSlMgVk0gd29ya2Zsb3cgaW52b2NhdGlvbiAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrSlNPdXRjb21lID0gU2VtYW50aWNDb252ZW50aW9uPFxuICAnY29tcGxldGVkJyB8ICdzdXNwZW5kZWQnIHwgJ2ZhaWxlZCdcbj4oJ3dvcmtmbG93LnZtLm91dGNvbWUnKTtcblxuLyoqIFdoZXRoZXIgcHJlbG9hZGVkIGV2ZW50cyBmcm9tIGBldmVudHMuY3JlYXRlKCdydW5fc3RhcnRlZCcpYCB3ZXJlIHVzZWQgKi9cbmV4cG9ydCBjb25zdCBRdWlja0pTRXZlbnRzUHJlbG9hZGVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cudm0uZXZlbnRzLnByZWxvYWRlZCdcbik7XG5cbi8qKiBUb3RhbCBudW1iZXIgb2YgZXZlbnRzIGZldGNoZWQgZnJvbSB0aGUgd29ybGQgZm9yIHRoaXMgaW52b2NhdGlvbiAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrSlNFdmVudHNGZXRjaGVkQ291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnZtLmV2ZW50cy5mZXRjaGVkX2NvdW50J1xuKTtcblxuLyoqIE51bWJlciBvZiBwYWdlcyByZXF1aXJlZCB0byBmZXRjaCBhbGwgZXZlbnRzICovXG5leHBvcnQgY29uc3QgUXVpY2tKU0V2ZW50c0ZldGNoZWRQYWdlcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cudm0uZXZlbnRzLmZldGNoZWRfcGFnZXMnXG4pO1xuXG4vKiogTnVtYmVyIG9mIHBlbmRpbmcgVk0gb3BlcmF0aW9ucyBjYXB0dXJlZCBhdCBzdXNwZW5zaW9uICovXG5leHBvcnQgY29uc3QgUXVpY2tKU1BlbmRpbmdPcHNDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cudm0ucGVuZGluZ19vcHNfY291bnQnXG4pO1xuXG4vKiogTnVtYmVyIG9mIHN0ZXBzIGV4ZWN1dGVkIGlubGluZSAobGl2ZS1WTSBjb250aW51YXRpb24pIHRoaXMgaW52b2NhdGlvbiAqL1xuZXhwb3J0IGNvbnN0IFF1aWNrSlNJbmxpbmVTdGVwcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAncXVpY2tqcy5pbmxpbmVfc3RlcHMnXG4pO1xuXG4vKiogQWN0aXZlIHRyYWNlLWNvcnJlbGF0aW9uIG1vZGUgZm9yIHRoaXMgaW52b2NhdGlvbiAobGlua2VkIG9yIGNvbnRpbnVvdXMpICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dUcmFjZU1vZGUgPSBTZW1hbnRpY0NvbnZlbnRpb248J2xpbmtlZCcgfCAnY29udGludW91cyc+KFxuICAnd29ya2Zsb3cudHJhY2UubW9kZSdcbik7XG5cbi8qKiBXaGV0aGVyIHRoaXMgd29ya2Zsb3cgaW52b2NhdGlvbiBpcyB1c2luZyB0aGUgdHVyYm8gZmlyc3QtZGVsaXZlcnkgcGF0aCAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93VHVyYm8gPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oJ3dvcmtmbG93LnR1cmJvJyk7XG5cbi8qKiBOYW1lIG9mIHRoZSBlcnJvciB0aGF0IGNhdXNlZCB3b3JrZmxvdyBmYWlsdXJlICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dFcnJvck5hbWUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPihcbiAgJ3dvcmtmbG93LmVycm9yLm5hbWUnXG4pO1xuXG4vKiogRXJyb3IgbWVzc2FnZSB3aGVuIHdvcmtmbG93IGZhaWxzICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dFcnJvck1lc3NhZ2UgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPihcbiAgJ3dvcmtmbG93LmVycm9yLm1lc3NhZ2UnXG4pO1xuXG4vKiogRXJyb3IgY2xhc3NpZmljYXRpb24gY29kZSAoVVNFUl9FUlJPUiwgUlVOVElNRV9FUlJPUiwgZXRjLikgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0Vycm9yQ29kZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnd29ya2Zsb3cuZXJyb3IuY29kZSdcbik7XG5cbi8qKiBOdW1iZXIgb2Ygc3RlcHMgY3JlYXRlZCBkdXJpbmcgd29ya2Zsb3cgZXhlY3V0aW9uICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dTdGVwc0NyZWF0ZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnN0ZXBzLmNyZWF0ZWQnXG4pO1xuXG4vKiogTnVtYmVyIG9mIGhvb2tzIGNyZWF0ZWQgZHVyaW5nIHdvcmtmbG93IGV4ZWN1dGlvbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93SG9va3NDcmVhdGVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5ob29rcy5jcmVhdGVkJ1xuKTtcblxuLyoqIE51bWJlciBvZiB3YWl0cyBjcmVhdGVkIGR1cmluZyB3b3JrZmxvdyBleGVjdXRpb24gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1dhaXRzQ3JlYXRlZCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cud2FpdHMuY3JlYXRlZCdcbik7XG5cbi8qKlxuICogTnVtYmVyIG9mIHN0ZXBzIHRoaXMgc3VzcGVuc2lvbiBmaW5hbGl6ZWQgYXMgZmFpbGVkIGJlY2F1c2UgdGhlaXJcbiAqIGFyZ3VtZW50cyByZWZ1c2VkIHRvIHNlcmlhbGl6ZSAoc3RlcF9jcmVhdGVkIHBsYWNlaG9sZGVyICsgc3RlcF9mYWlsZWRcbiAqIGNhcnJ5aW5nIHRoZSBTZXJpYWxpemF0aW9uRXJyb3I7IHNlZSBmaW5hbGl6ZVVuc2VyaWFsaXphYmxlU3RlcCkuXG4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1N0ZXBzRmFpbGVkU2VyaWFsaXphdGlvbiA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuc3RlcHMuZmFpbGVkX3NlcmlhbGl6YXRpb24nXG4pO1xuXG4vKipcbiAqIE51bWJlciBvZiBpbmxpbmUtb3duZWQgc3RlcHMgdGhpcyBpbnZvY2F0aW9uIHJlLWV4ZWN1dGVkIGJlY2F1c2UgaXQgaXMgYVxuICogcmVkZWxpdmVyeSBvZiB0aGVpciBvd25pbmcgcXVldWUgbWVzc2FnZSAoY3Jhc2ggcmVjb3ZlcnkgZm9yIGlubGluZVxuICogc3RlcHM7IHNlZSB0aGUgaW5saW5lIHN0ZXAgb3duZXJzaGlwIGNoYW5nZWxvZywgd29ya2Zsb3cjMjc4MCkuXG4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd093bmVkUmVjb3ZlcnlTdGVwcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuaW5saW5lX293bmVyc2hpcC5vd25lZF9yZWNvdmVyeV9zdGVwcydcbik7XG5cbi8qKlxuICogTnVtYmVyIG9mIHBlbmRpbmcgc3RlcHMgZm9yIHdoaWNoIHRoaXMgcmVwbGF5IHN1cHByZXNzZWQgdGhlIGltbWVkaWF0ZVxuICogcmVxdWV1ZSAoYW5vdGhlciBpbnZvY2F0aW9uIGlubGluZS1vd25zIHRoZW0gdW5kZXIgYSBsaXZlIGxlYXNlKSBhbmRcbiAqIGVuc3VyZWQgYSBkZWxheWVkIGJhY2tzdG9wIHdha2UgaW5zdGVhZC5cbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93QmFja3N0b3BXYWtlc0FybWVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5pbmxpbmVfb3duZXJzaGlwLmJhY2tzdG9wX3dha2VzX2FybWVkJ1xuKTtcblxuLyoqXG4gKiBOdW1iZXIgb2YgcGVuZGluZyBzdGVwcyB3aG9zZSBpbW1lZGlhdGUgc3RlcC1leGVjdXRpb24gZW5xdWV1ZSB0aGlzIHJlcGxheVxuICogcGFzcyBza2lwcGVkIGJlY2F1c2UgVEhJUyBpbnZvY2F0aW9uIGFscmVhZHkgcHVibGlzaGVkIHRoYXQgc3RlcCdzIG1lc3NhZ2VcbiAqIG9uIGFuIGVhcmxpZXIgcGFzcyAoYSBmYW4tb3V0IHRoYXQgcmFuIGlubGluZSBzdGVwcyBhbmQgcmVwbGF5ZWQgYWdhaW4pLlxuICogSW52b2NhdGlvbi1sb2NhbCBrbm93bGVkZ2Ugb25seTogYSBmcmVzaCBkZWxpdmVyeSBuZXZlciBza2lwcy5cbiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RGlzcGF0Y2hSZXB1Ymxpc2hTa2lwcGVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5kaXNwYXRjaC5yZXB1Ymxpc2hfc2tpcHBlZCdcbik7XG5cbi8vIFJvdXRlIGF0dHJpYnV0ZXNcblxuLyoqIFRoZSB3b3JrZmxvdyBydW50aW1lIHJvdXRlIGJlaW5nIGhhbmRsZWQgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1JvdXRlVHlwZSA9IFNlbWFudGljQ29udmVudGlvbjwnZmxvdyc+KFxuICAnd29ya2Zsb3cucm91dGUudHlwZSdcbik7XG5cbi8qKiBXaGV0aGVyIHRoaXMgcm91dGUgaW52b2NhdGlvbiByZXVzZWQgYW4gYWxyZWFkeS1jcmVhdGVkIHJlcXVlc3QgaGFuZGxlciAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93Um91dGVIYW5kbGVyQ2FjaGVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cucm91dGUuaGFuZGxlcl9jYWNoZWQnXG4pO1xuXG4vKiogTnVtYmVyIG9mIHRpbWVzIHRoaXMgaW4tbWVtb3J5IHJvdXRlIGhhbmRsZXIgaGFzIGJlZW4gaW52b2tlZCAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93Um91dGVJbnZvY2F0aW9uQ291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnJvdXRlLmludm9jYXRpb25fY291bnQnXG4pO1xuXG4vKiogVGltZSBzaW5jZSB0aGlzIHJvdXRlIGVudHJ5cG9pbnQgd2FzIGNvbnN0cnVjdGVkLCBpbiBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1JvdXRlRW50cnlwb2ludEFnZU1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5yb3V0ZS5lbnRyeXBvaW50X2FnZV9tcydcbik7XG5cbi8qKiBUaW1lIHNwZW50IGV2YWx1YXRpbmcgdGhlIGdlbmVyYXRlZCByb3V0ZSBtb2R1bGUgYm9keSBiZWZvcmUgY3JlYXRpbmcgdGhlIGVudHJ5cG9pbnQgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1JvdXRlTW9kdWxlQm9keUluaXRNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cucm91dGUubW9kdWxlX2JvZHlfaW5pdF9tcydcbik7XG5cbi8qKlxuICogQ29tcHV0ZSBpbnN0YW5jZSBoYW5kbGluZyB0aGlzIHJvdXRlOiB0aGUgc3ludGhlc2l6ZWQgYENPTVBVVEVfSU5TVEFOQ0VfSURgLlxuICogVXNlcyBPVEVMIGBmYWFzLmluc3RhbmNlYCAoZXhlY3V0aW9uLWVudmlyb25tZW50IGlkLCByZXVzZWQgYWNyb3NzXG4gKiBpbnZvY2F0aW9ucyB0byB0aGUgc2FtZSBmdW5jdGlvbik6XG4gKiBodHRwczovL29wZW50ZWxlbWV0cnkuaW8vZG9jcy9zcGVjcy9zZW1jb252L2F0dHJpYnV0ZXMtcmVnaXN0cnkvZmFhcy9cbiAqL1xuZXhwb3J0IGNvbnN0IEZhYXNJbnN0YW5jZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdmYWFzLmluc3RhbmNlJyk7XG5cbi8vIFN0ZXAgYXR0cmlidXRlc1xuXG4vKiogTmFtZSBvZiB0aGUgc3RlcCBmdW5jdGlvbiBiZWluZyBleGVjdXRlZCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBOYW1lID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3N0ZXAubmFtZScpO1xuXG4vKiogVW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBzdGVwIGluc3RhbmNlICovXG5leHBvcnQgY29uc3QgU3RlcElkID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3N0ZXAuaWQnKTtcblxuLyoqIEN1cnJlbnQgYXR0ZW1wdCBudW1iZXIgZm9yIHN0ZXAgZXhlY3V0aW9uIChzdGFydHMgYXQgMSkgKi9cbmV4cG9ydCBjb25zdCBTdGVwQXR0ZW1wdCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KCdzdGVwLmF0dGVtcHQnKTtcblxuLyoqIEN1cnJlbnQgc3RhdHVzIG9mIHRoZSBzdGVwICovXG5leHBvcnQgY29uc3QgU3RlcFN0YXR1cyA9IFNlbWFudGljQ29udmVudGlvbjxTdGVwWydzdGF0dXMnXT4oJ3N0ZXAuc3RhdHVzJyk7XG5cbi8qKiBNYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGFsbG93ZWQgZm9yIHRoaXMgc3RlcCAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBNYXhSZXRyaWVzID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oJ3N0ZXAubWF4X3JldHJpZXMnKTtcblxuLyoqIFdoZXRoZXIgdHJhY2UgY29udGV4dCB3YXMgcHJvcGFnYXRlZCB0byB0aGlzIHN0ZXAgZXhlY3V0aW9uICovXG5leHBvcnQgY29uc3QgU3RlcFRyYWNlUHJvcGFnYXRlZCA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPihcbiAgJ3N0ZXAudHJhY2UucHJvcGFnYXRlZCdcbik7XG5cbi8qKlxuICogQ2xpZW50LW1lYXN1cmVkIHRpbWUtdG8tZmlyc3Qtc3RlcCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kczogcnVuIGNyZWF0aW9uIOKGklxuICogdGhpcyBzdGVwJ3MgYm9keSBiZWdpbm5pbmcgdG8gZXhlY3V0ZSwgbWludXMgcHJlLXN0ZXAgaG9vay1jcmVhdGlvbiB0aW1lLlxuICogT25seSBwcmVzZW50IG9uIHRoZSBydW4ncyBmaXJzdCBzdGVwIGV4ZWN1dGlvbiB3aGVuIGl0IHF1YWxpZmllZCBmb3JcbiAqIG1lYXN1cmVtZW50IChzZWUgcnVudGltZS9zdGVwLWxhdGVuY3kudHMpLlxuICovXG5leHBvcnQgY29uc3QgU3RlcFR0ZnNNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KCdzdGVwLnR0ZnNfbXMnKTtcblxuLyoqXG4gKiBDbGllbnQtbWVhc3VyZWQgc3RlcC10by1zdGVwIG92ZXJoZWFkIGluIG1pbGxpc2Vjb25kczogdGhlIHByZXZpb3VzIHN0ZXAnc1xuICogdGVybWluYWwgZXZlbnQg4oaSIHRoaXMgc3RlcCdzIGJvZHkgYmVnaW5uaW5nIHRvIGV4ZWN1dGUuIE9ubHkgcHJlc2VudCB3aGVuXG4gKiB0aGUgdHdvIHN0ZXBzIHJhbiBiYWNrLXRvLWJhY2suXG4gKi9cbmV4cG9ydCBjb25zdCBTdGVwU3Rzb01zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oJ3N0ZXAuc3Rzb19tcycpO1xuXG4vKipcbiAqIENsaWVudC1tZWFzdXJlZCBydW5fc3RhcnRlZC10by1maXJzdC1zdGVwIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzOiB0aGVcbiAqIGBydW5fc3RhcnRlZGAgcmVzcG9uc2UgbGFuZGluZyAob3IsIHVuZGVyIHR1cmJvLCB0aGUgbG9jYWwgcnVuIHN5bnRoZXNpc1xuICogaW5zdGFudCkg4oaSIHRoaXMgc3RlcCdzIHN0YXJ0IFBPU1QgYmVpbmcgaXNzdWVkLiBBIHN1Yi13aW5kb3cgb2YgdHRmcyB0aGF0XG4gKiBpc29sYXRlcyByZXBsYXkgb3ZlcmhlYWQgZnJvbSB0aGUgcnVuLWNyZWF0aW9uIHF1ZXVlIGhvcC4gT25seSBwcmVzZW50IG9uXG4gKiB0aGUgcnVuJ3MgZmlyc3Qgc3RlcCBleGVjdXRpb24gd2hlbiBpdCBxdWFsaWZpZWQgZm9yIG1lYXN1cmVtZW50IChzZWVcbiAqIHJ1bnRpbWUvc3RlcC1sYXRlbmN5LnRzKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBSc2ZzTXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPignc3RlcC5yc2ZzX21zJyk7XG5cbi8qKlxuICogQ2xpZW50LW1lYXN1cmVkIHN5bmNocm9ub3VzIHdvcmtmbG93LWZ1bmN0aW9uIHJlcGxheSBkdXJhdGlvbiBpblxuICogbWlsbGlzZWNvbmRzLCBleGNsdWRpbmcgYXdhaXRlZCBuZXR3b3JrIEkvTywgb2Ygb25seSB0aGUgRklOQUwgcmVwbGF5IHBhc3NcbiAqIHdpdGhpbiB0aGUgcnNmcyB3aW5kb3c6IHRoZSBwYXNzIHRoYXQgcmVhY2hlZCBhbmQgc2NoZWR1bGVkIHRoZSBmaXJzdFxuICogc3RlcC4gTm90IGFjY3VtdWxhdGVkIGFjcm9zcyBlYXJsaWVyIHByZS1maXJzdC1zdGVwIHBhc3NlcyAoZS5nLiBhXG4gKiB3b3JrZmxvdy1ib2R5IGBzZXRBdHRyaWJ1dGVzKClgIGRldG91ciByZXBsYXlzIG1vcmUgdGhhbiBvbmNlLCBhbmQgYVxuICogcmVkZWxpdmVyeSBvbWl0cyBlYXJsaWVyIGludm9jYXRpb25zJyB3b3JrIGVudGlyZWx5KSwgc28gdGhpcyBtdXN0IG5vdCBiZVxuICogcmVhZCBhcyBcInRoZSByZXBsYXkgcG9ydGlvbiBvZiByc2ZzXCI7IHN0ZXAucnNmc19tcyBjb3ZlcnMgdGhlIHdob2xlXG4gKiB3aW5kb3cuIE9ubHkgcHJlc2VudCBhbG9uZ3NpZGUgc3RlcC5yc2ZzX21zIGFuZCBvbmx5IGZvciB0aGUgcnVuJ3MgZmlyc3RcbiAqIHN0ZXAgKHNlZSBydW50aW1lL3N0ZXAtbGF0ZW5jeS50cykuXG4gKi9cbmV4cG9ydCBjb25zdCBTdGVwRmluYWxTY2hlZHVsaW5nUmVwbGF5TXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3N0ZXAuZmluYWxfc2NoZWR1bGluZ19yZXBsYXlfbXMnXG4pO1xuXG4vKipcbiAqIFJ1bnRpbWUgc3RhcnR1cC1sYXRlbmN5IG9wdGltaXphdGlvbnMgYWN0aXZlIGZvciB0aGUgdHRmcy9zdHNvIG1lYXN1cmVtZW50XG4gKiAoZS5nLiAndHVyYm8nLCAnbGF6eVN0ZXBTdGFydCcsICdvcHRpbWlzdGljU3RhcnQnKS5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBMYXRlbmN5T3B0aW1pemF0aW9ucyA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmdbXT4oXG4gICdzdGVwLmxhdGVuY3lfb3B0aW1pemF0aW9ucydcbik7XG5cbi8qKlxuICogSG93IHRoZSBzdGVwJ3MgaW5pdGlhbCBgc3RlcF9zdGFydGVkYCBjbGFpbSB3YXMgbWFkZS4gT25seSBwcmVzZW50IGZvclxuICogaW5saW5lIGNyZWF0ZSBjbGFpbXM7IG9yZGluYXJ5IGJhY2tncm91bmQgc3RhcnRzIGFuZCBvd25lZCByZWNvdmVyeSByZW1haW5cbiAqIHVubGFiZWxlZC5cbiAqL1xuZXhwb3J0IHR5cGUgU3RlcFN0YXJ0U3RyYXRlZ3kgPSAnYXdhaXRlZCcgfCAnb3B0aW1pc3RpYycgfCAnYmF0Y2hfcHJlY2xhaW1lZCc7XG5leHBvcnQgY29uc3QgU3RlcFN0YXJ0U3RyYXRlZ3kgPSBTZW1hbnRpY0NvbnZlbnRpb248U3RlcFN0YXJ0U3RyYXRlZ3k+KFxuICAnd29ya2Zsb3cuc3RlcF9zdGFydC5zdHJhdGVneSdcbik7XG5cbi8qKiBXaGV0aGVyIHRoZSBzdGVwIHdhcyBza2lwcGVkIGR1cmluZyBleGVjdXRpb24gKi9cbmV4cG9ydCBjb25zdCBTdGVwU2tpcHBlZCA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPignc3RlcC5za2lwcGVkJyk7XG5cbi8qKiBSZWFzb24gd2h5IHRoZSBzdGVwIHdhcyBza2lwcGVkICovXG5leHBvcnQgY29uc3QgU3RlcFNraXBSZWFzb24gPVxuICBTZW1hbnRpY0NvbnZlbnRpb248U3RlcFsnc3RhdHVzJ10+KCdzdGVwLnNraXBfcmVhc29uJyk7XG5cbi8qKiBOdW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUgc3RlcCBmdW5jdGlvbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBBcmd1bWVudHNDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnc3RlcC5hcmd1bWVudHMuY291bnQnXG4pO1xuXG4vKiogVHlwZSBvZiB0aGUgc3RlcCByZXN1bHQgKi9cbmV4cG9ydCBjb25zdCBTdGVwUmVzdWx0VHlwZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzdGVwLnJlc3VsdC50eXBlJyk7XG5cbi8qKiBOYW1lIG9mIHRoZSBlcnJvciB0aGF0IGNhdXNlZCBzdGVwIGZhaWx1cmUgKi9cbmV4cG9ydCBjb25zdCBTdGVwRXJyb3JOYW1lID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3N0ZXAuZXJyb3IubmFtZScpO1xuXG4vKiogRXJyb3IgbWVzc2FnZSB3aGVuIHN0ZXAgZmFpbHMgKi9cbmV4cG9ydCBjb25zdCBTdGVwRXJyb3JNZXNzYWdlID1cbiAgU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3N0ZXAuZXJyb3IubWVzc2FnZScpO1xuXG4vKiogV2hldGhlciB0aGUgc3RlcCBmYWlsZWQgd2l0aCBhIGZhdGFsIGVycm9yIChubyByZXRyaWVzKSAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBGYXRhbEVycm9yID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KCdzdGVwLmZhdGFsX2Vycm9yJyk7XG5cbi8qKiBXaGV0aGVyIGFsbCByZXRyeSBhdHRlbXB0cyBoYXZlIGJlZW4gZXhoYXVzdGVkICovXG5leHBvcnQgY29uc3QgU3RlcFJldHJ5RXhoYXVzdGVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnc3RlcC5yZXRyeS5leGhhdXN0ZWQnXG4pO1xuXG4vKiogTnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZWZvcmUgbmV4dCByZXRyeSBhdHRlbXB0ICovXG5leHBvcnQgY29uc3QgU3RlcFJldHJ5VGltZW91dFNlY29uZHMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3N0ZXAucmV0cnkudGltZW91dF9zZWNvbmRzJ1xuKTtcblxuLyoqIFdoZXRoZXIgdGhlIHN0ZXAgd2lsbCBiZSByZXRyaWVkIGFmdGVyIHRoaXMgZmFpbHVyZSAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBSZXRyeVdpbGxSZXRyeSA9IFNlbWFudGljQ29udmVudGlvbjxib29sZWFuPihcbiAgJ3N0ZXAucmV0cnkud2lsbF9yZXRyeSdcbik7XG5cbi8vIFF1ZXVlL01lc3NhZ2luZyBhdHRyaWJ1dGVzIC0gU3RhbmRhcmQgT1RFTCBtZXNzYWdpbmcgY29udmVudGlvbnNcbi8vIFNlZTogaHR0cHM6Ly9vcGVudGVsZW1ldHJ5LmlvL2RvY3Mvc3BlY3Mvc2VtY29udi9tZXNzYWdpbmcvbWVzc2FnaW5nLXNwYW5zL1xuXG4vKiogTWVzc2FnaW5nIHN5c3RlbSBpZGVudGlmaWVyIChzdGFuZGFyZCBPVEVMOiBtZXNzYWdpbmcuc3lzdGVtKSAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2luZ1N5c3RlbSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdtZXNzYWdpbmcuc3lzdGVtJyk7XG5cbi8qKiBEZXN0aW5hdGlvbiBuYW1lL3F1ZXVlIG5hbWUgKHN0YW5kYXJkIE9URUw6IG1lc3NhZ2luZy5kZXN0aW5hdGlvbi5uYW1lKSAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2luZ0Rlc3RpbmF0aW9uTmFtZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnbWVzc2FnaW5nLmRlc3RpbmF0aW9uLm5hbWUnXG4pO1xuXG4vKiogVGhlIG1lc3NhZ2UgaWQgYmVpbmcgaGFuZGxlZCAoc3RhbmRhcmQgT1RFTDogbWVzc2FnaW5nLm1lc3NhZ2UuaWQpICovXG5leHBvcnQgY29uc3QgTWVzc2FnaW5nTWVzc2FnZUlkID0gU2VtYW50aWNDb252ZW50aW9uPE1lc3NhZ2VJZD4oXG4gICdtZXNzYWdpbmcubWVzc2FnZS5pZCdcbik7XG5cbi8qKiBPcGVyYXRpb24gdHlwZSAoc3RhbmRhcmQgT1RFTDogbWVzc2FnaW5nLm9wZXJhdGlvbi50eXBlKSAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2luZ09wZXJhdGlvblR5cGUgPSBTZW1hbnRpY0NvbnZlbnRpb248XG4gICdwdWJsaXNoJyB8ICdyZWNlaXZlJyB8ICdwcm9jZXNzJ1xuPignbWVzc2FnaW5nLm9wZXJhdGlvbi50eXBlJyk7XG5cbi8qKlxuICogTWVzc2FnZXMgY2FycmllZCBieSBvbmUgYmF0Y2hlZCBwdWJsaXNoIChzdGFuZGFyZCBPVEVMOlxuICogbWVzc2FnaW5nLmJhdGNoLm1lc3NhZ2VfY291bnQpLiBTZXQgb25seSBvbiB0aGUgYmF0Y2ggc2VuZCwgc28gYSBzcGFuXG4gKiB3aXRob3V0IGl0IGlzIGEgc2luZ2xlLW1lc3NhZ2UgcHVibGlzaC5cbiAqL1xuZXhwb3J0IGNvbnN0IE1lc3NhZ2luZ0JhdGNoTWVzc2FnZUNvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICdtZXNzYWdpbmcuYmF0Y2gubWVzc2FnZV9jb3VudCdcbik7XG5cbi8qKiBUaW1lIHRha2VuIHRvIGVucXVldWUgdGhlIG1lc3NhZ2UgaW4gbWlsbGlzZWNvbmRzICh3b3JrZmxvdy1zcGVjaWZpYykgKi9cbmV4cG9ydCBjb25zdCBRdWV1ZU92ZXJoZWFkTXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnF1ZXVlLm92ZXJoZWFkX21zJ1xuKTtcblxuLy8gRGVwbG95bWVudCBhdHRyaWJ1dGVzXG5cbi8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIGRlcGxveW1lbnQgZW52aXJvbm1lbnQgKi9cbmV4cG9ydCBjb25zdCBEZXBsb3ltZW50SWQgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignZGVwbG95bWVudC5pZCcpO1xuXG4vKiogVGhlIGRlcGxveW1lbnQgYSBydW4gaXMgcGlubmVkIHRvLCBzZXQgb25seSBvbiBhIG1pc3JvdXRlZCBkZWxpdmVyeS4gKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1J1blBpbm5lZERlcGxveW1lbnRJZCA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnd29ya2Zsb3cuZGVwbG95bWVudC5waW5uZWRfaWQnXG4pO1xuXG4vKiogUmUtcm91dGUgYXR0ZW1wdHMgZm9yIHRoaXMgbWlzcm91dGVkIGRlbGl2ZXJ5LCBpbmNsdWRpbmcgdGhpcyBvbmUuICovXG5leHBvcnQgY29uc3QgV29ya2Zsb3dEZXBsb3ltZW50TWlzbWF0Y2hSZXRyeUNvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5kZXBsb3ltZW50X21pc21hdGNoLnJldHJ5X2NvdW50J1xuKTtcblxuLyoqIFdoZXRoZXIgdGhlIG1pc3JvdXRlZCBkZWxpdmVyeSB3YXMgcmUtcm91dGVkIGluc3RlYWQgb2YgZmFpbGluZyB0aGUgcnVuLiAqL1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93RGVwbG95bWVudE1pc21hdGNoUmVjb3ZlcmVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cuZGVwbG95bWVudF9taXNtYXRjaC5yZWNvdmVyZWQnXG4pO1xuXG4vLyBIb29rIGF0dHJpYnV0ZXNcblxuLyoqIFRva2VuIGlkZW50aWZ5aW5nIGEgc3BlY2lmaWMgaG9vayAqL1xuZXhwb3J0IGNvbnN0IEhvb2tUb2tlbiA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCd3b3JrZmxvdy5ob29rLnRva2VuJyk7XG5cbi8qKiBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBob29rIGluc3RhbmNlICovXG5leHBvcnQgY29uc3QgSG9va0lkID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3dvcmtmbG93Lmhvb2suaWQnKTtcblxuLyoqIFdoZXRoZXIgYSBob29rIHdhcyBmb3VuZCBieSBpdHMgdG9rZW4gKi9cbmV4cG9ydCBjb25zdCBIb29rRm91bmQgPSBTZW1hbnRpY0NvbnZlbnRpb248Ym9vbGVhbj4oJ3dvcmtmbG93Lmhvb2suZm91bmQnKTtcblxuLyoqXG4gKiBQcm9kdWNlci1zaWRlIHNpZ25hbCAob24gdGhlIGBob29rLnJlc3VtZWAgc3BhbikgdGhhdCB0aGUgZGlyZWN0XG4gKiBgaG9va19yZWNlaXZlZGAgd3JpdGUgZmFpbGVkIHRyYW5zaWVudGx5IGJ1dCB0aGUgcXVldWUgZGlzcGF0Y2ggc3VjY2VlZGVkLCBzb1xuICogdGhlIHJlc3VtZSBpcyByZWNvdmVyZWQgdmlhIHRoZSBjb25zdW1lcidzIHJlLWVuc3VyZS4gQ29ycmVzcG9uZHMgdG9cbiAqIGBSZXN1bWVkSG9vay5yZXNpbGllbnRSZXN1bWUgPT09IHRydWVgLlxuICpcbiAqIE5vIGxvbmdlciBlbWl0dGVkOiBjdXJyZW50IHByb2R1Y2VycyByZXF1aXJlIHRoZSBkdXJhYmxlIGV2ZW50IHdyaXRlIHRvXG4gKiBzdWNjZWVkLiBSZXRhaW5lZCBzbyBkYXNoYm9hcmRzIGFuZCBxdWVyaWVzIGJ1aWx0IG9uIHRoZSBhdHRyaWJ1dGUga2VlcFxuICogcmVzb2x2aW5nIHdoaWxlIG9sZGVyIHByb2R1Y2VycyBhcmUgc3RpbGwgZGVwbG95ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBIb29rUmVzaWxpZW50UmVzdW1lID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cuaG9vay5yZXNpbGllbnRfcmVzdW1lJ1xuKTtcblxuLyoqXG4gKiBQcm9kdWNlci1zaWRlIHNpZ25hbCAob24gdGhlIGBob29rLnJlc3VtZWAgc3BhbikgdGhhdCB0aGUgZHVyYWJsZVxuICogYGhvb2tfcmVjZWl2ZWRgIHdyaXRlIENPTU1JVFRFRC4gU3RhbXBlZCBhZnRlciB0aGUgd3JpdGUgcmVzb2x2ZXMsIHNvIGl0XG4gKiBkaXN0aW5ndWlzaGVzIGEgY29tbWl0dGVkIHJlc3VtZSBmcm9tIGFuIGF0dGVtcHRlZCBvbmUg4oCUIGFuIGVudHJ5LXRpbWVcbiAqIGF0dHJpYnV0ZSBjYW5ub3QsIGJlY2F1c2UgYSBzcGFuIHRoYXQgbGF0ZXIgcmVjb3JkcyBhbiBleGNlcHRpb24gbWF5IGhhdmVcbiAqIGZhaWxlZCBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSBjb21taXQuXG4gKi9cbmV4cG9ydCBjb25zdCBIb29rUmVzdW1lQ29tbWl0dGVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cuaG9vay5yZXN1bWVfY29tbWl0dGVkJ1xuKTtcblxuLyoqXG4gKiBQcm9kdWNlci1zaWRlIHNpZ25hbCAob24gdGhlIGBob29rLnJlc3VtZWAgc3BhbikgdGhhdCB0aGUgd29ya2Zsb3cgd2FrZSB3YXNcbiAqIEFDQ0VQVEVEIGJ5IHRoZSBxdWV1ZSwgc3RhbXBlZCBhZnRlciB0aGUgcHVibGlzaCByZXNvbHZlcy5cbiAqXG4gKiBUb2dldGhlciB3aXRoIHtAbGluayBIb29rUmVzdW1lQ29tbWl0dGVkfSB0aGlzIG1ha2VzIHN0cmFuZGVkIHJlc3VtZXNcbiAqIHF1ZXJ5YWJsZTogYHJlc3VtZV9jb21taXR0ZWQ9dHJ1ZWAgd2l0aCBgd2FrZV9wdWJsaXNoZWRgIGFic2VudCBpcyBhIHJlc3VtZVxuICogd2hvc2UgZHVyYWJsZSBldmVudCBleGlzdHMgYnV0IHdob3NlIHdha2UgcHVibGlzaCBmYWlsZWQgKHRoZSBjYWxsZXIgd2FzXG4gKiB0b2xkLCBidXQgbm90aGluZyByZS1kcml2ZXMgaXQpLCBhbmQgYHJlc3VtZV9jb21taXR0ZWQ9dHJ1ZWAgK1xuICogYHdha2VfcHVibGlzaGVkPXRydWVgIHdpdGggbm8gc3Vic2VxdWVudCB3b3JrZmxvdyBleGVjdXRpb24gZm9yIHRoZSBydW4gaXNcbiAqIGEgd2FrZSB0aGUgcXVldWUgYWNjZXB0ZWQgYnV0IG5ldmVyIGRlbGl2ZXJlZC4gQm90aCBhcmUgZGV0ZWN0aW9uLW9ubHlcbiAqIHNpZ25hbHMg4oCUIG5vdGhpbmcgcmVjb3ZlcnMgc3VjaCBhIHJ1biBhdXRvbWF0aWNhbGx5IHRvZGF5IGJleW9uZCBhIGxhdGVyXG4gKiB3YWtlIGZyb20gYW55IG90aGVyIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGNvbnN0IEhvb2tXYWtlUHVibGlzaGVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cuaG9vay53YWtlX3B1Ymxpc2hlZCdcbik7XG5cbi8qKlxuICogQ29uc3VtZXItc2lkZSBzaWduYWwgKG9uIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gc3BhbikgdGhhdCB0aGlzIHJlcGxheVxuICogbWF0ZXJpYWxpemVkIHRoZSBgaG9va19yZWNlaXZlZGAgZXZlbnQgZnJvbSB0aGUgcXVldWUgbWVzc2FnZSdzIGBob29rSW5wdXRgXG4gKiBiZWNhdXNlIG5vIGNvbW1pdHRlZCBldmVudCB3YXMgZm91bmQsIHdoaWNoIGNvbXBsZXRlcyB0aGUgcmVjb3ZlcnkgcGF0aFxuICoge0BsaW5rIEhvb2tSZXNpbGllbnRSZXN1bWV9IGJlZ2FuLlxuICpcbiAqIExlZ2FjeSAvIG5vbi1hdG9taWMgcmUtZW5zdXJlIHNpZ25hbCBvbmx5LiBMZWdhY3kgYXRvbWljIGxhenkgcmVzdW1lc1xuICogKHJlc3VtZUlkICsgZGlnZXN0KSBnbyB0aHJvdWdoIHRoZSBob2lzdGVkIHByZWxvYWQgd3JpdGUgaW5zdGVhZCwgd2hvc2VcbiAqIHJlc3BvbnNlIGNhbm5vdCB0ZWxsIHdoZXRoZXIgdGhlIHByb2R1Y2VyIG9yIHRoZSBjb25zdW1lciB3b24gdGhlXG4gKiBgKHJ1bklkLCByZXN1bWVJZClgIGNsYWltLCBzbyB0aGlzIGF0dHJpYnV0ZSBpcyBkZWxpYmVyYXRlbHkgTk9UIGVtaXR0ZWRcbiAqIGZvciB0aGVtIChlbWl0dGluZyBgdHJ1ZWAgdW5jb25kaXRpb25hbGx5IHdvdWxkIGNvdW50IGV2ZXJ5IHByb2R1Y2VyLXdvblxuICogcmVzdW1lIGFzIGEgcmVjb3ZlcnkpLiBUaGUgcHJvZHVjZXItYmVnaW4gKHtAbGluayBIb29rUmVzaWxpZW50UmVzdW1lfSkgL1xuICogY29uc3VtZXItbWF0ZXJpYWxpemVkIHBhaXJpbmcgaXMgdGhlcmVmb3JlIG5vIGxvbmdlciBjb21wbGV0ZSBmb3IgYXRvbWljXG4gKiBsYXp5IHJlc3VtcHRpb25zOyB1c2Uge0BsaW5rIEhvb2tSZXN1bWVTZXR1cFNvdXJjZX0gdG8gb2JzZXJ2ZSB0aGF0IHBhdGguXG4gKi9cbmV4cG9ydCBjb25zdCBIb29rUmVzaWxpZW50UmVzdW1lTWF0ZXJpYWxpemVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cuaG9vay5yZXNpbGllbnRfcmVzdW1lX21hdGVyaWFsaXplZCdcbik7XG5cbi8qKlxuICogQ29uc3VtZXItc2lkZSBzaWduYWwgKG9uIHRoZSB3b3JrZmxvdyBleGVjdXRpb24gc3Bhbikgb2YgaG93IGEgbGF6eSBob29rXG4gKiByZXN1bWUgaW5pdGlhbGl6ZWQgaXRzIHJlcGxheSBzdGF0ZTpcbiAqXG4gKiAtIGBob29rX3JlY2VpdmVkX3N0cmVhbWA6IHRoZSBob2lzdGVkIGBob29rX3JlY2VpdmVkYCB3cml0ZSByZXR1cm5lZCBhXG4gKiAgIHVzYWJsZSByZXBsYXkgcHJlbG9hZCAocnVuICsgY29tcGxldGUgZXZlbnQgbG9nKSwgc28gdGhlIGludm9jYXRpb25cbiAqICAgc2tpcHBlZCBib3RoIHRoZSBgcnVuX3N0YXJ0ZWRgIHdyaXRlIGFuZCB0aGUgaW5pdGlhbCBgZXZlbnRzLmxpc3RgLlxuICogLSBgaG9va19yZWNlaXZlZF9mYWxsYmFja2A6IHRoZSBob2lzdGVkIHdyaXRlIHN1Y2NlZWRlZCBidXQgcmV0dXJuZWQgbm9cbiAqICAgdXNhYmxlIHByZWxvYWQgKGEgQ0JPUiByZXNwb25zZSBmcm9tIGFuIG9sZGVyIHNlcnZlciwgYSBXb3JsZCB0aGF0XG4gKiAgIGlnbm9yZWQgdGhlIG9wdC1pbiwgYSBib3VuZGVkIGBoYXNNb3JlYCBwYWdlLCBvciBhIHByZWxvYWQgdGhhdCBmYWlsZWRcbiAqICAgdmFsaWRhdGlvbik7IHRoZSBpbnZvY2F0aW9uIGZlbGwgYmFjayB0byB0aGUgYHJ1bl9zdGFydGVkYCBzZXR1cCB3aXRob3V0XG4gKiAgIHJlLXBvc3RpbmcgdGhlIGhvb2suXG4gKlxuICogQWJzZW50IG9uIGxlZ2FjeSBob29rIGRlbGl2ZXJpZXMgKG5vIHJlc3VtZUlkL2RpZ2VzdCkgYW5kIG9uIGV2ZXJ5IG90aGVyXG4gKiBkZWxpdmVyeSBraW5kLCB3aGljaCB0YWtlIHRoZSBgcnVuX3N0YXJ0ZWRgIHNldHVwIHVuY29uZGl0aW9uYWxseS5cbiAqXG4gKiBUaGlzIGlzIGEgbGF0ZW5jeS9zZXR1cC1wYXRoIHNpZ25hbDogaXQgc2F5cyB3aGljaCByZXF1ZXN0cyBpbml0aWFsaXplZFxuICogdGhlIGludm9jYXRpb24sIE5PVCB0aGF0IHRoaXMgY29uc3VtZXIgY3JlYXRlZCB0aGUgYGhvb2tfcmVjZWl2ZWRgIGV2ZW50XG4gKiAodGhlIGhvaXN0ZWQgd3JpdGUgbWF5IGVxdWFsbHkgaGF2ZSBjb252ZXJnZWQgb24gdGhlIHByb2R1Y2VyJ3MsIHNpbmNlXG4gKiBjbGFpbSBvd25lcnNoaXAgaXMgbm90IG9ic2VydmFibGUgY2xpZW50LXNpZGU7IGNmLlxuICoge0BsaW5rIEhvb2tSZXNpbGllbnRSZXN1bWVNYXRlcmlhbGl6ZWR9KS5cbiAqL1xuZXhwb3J0IGNvbnN0IEhvb2tSZXN1bWVTZXR1cFNvdXJjZSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnd29ya2Zsb3cucmVzdW1lX3NldHVwX3NvdXJjZSdcbik7XG5cbi8qKlxuICogUHJvZHVjZXItc2lkZSBzaWduYWwgKG9uIHRoZSBzdXNwZW5zaW9uIHNwYW4pIGNvdW50aW5nIHN0ZXBzIHdob3NlIGRpcmVjdFxuICogYHN0ZXBfY3JlYXRlZGAgd3JpdGUgZmFpbGVkIHRyYW5zaWVudGx5IHdoaWxlIHRoZWlyIGBzdGVwSW5wdXRgLWNhcnJ5aW5nXG4gKiBxdWV1ZSBwdWJsaXNoIHN1Y2NlZWRlZCwgc28gc3RlcCBjcmVhdGlvbiBpcyByZWNvdmVyZWQgdmlhIHRoZSBjb25zdW1lcidzXG4gKiByZS1lbnN1cmUuIE1pcnJvcnMge0BsaW5rIEhvb2tSZXNpbGllbnRSZXN1bWV9LlxuICovXG5leHBvcnQgY29uc3QgU3RlcFJlc2lsaWVudERpc3BhdGNoUmVjb3ZlcmVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5zdGVwLnJlc2lsaWVudF9kaXNwYXRjaF9yZWNvdmVyZWQnXG4pO1xuXG4vKipcbiAqIENvbnN1bWVyLXNpZGUgc2lnbmFsIChvbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIHNwYW4pIHRoYXQgdGhpcyBkZWxpdmVyeVxuICogbWF0ZXJpYWxpemVkIHRoZSBgc3RlcF9jcmVhdGVkYCBldmVudCBmcm9tIHRoZSBxdWV1ZSBtZXNzYWdlJ3MgYHN0ZXBJbnB1dGBcbiAqIGJlY2F1c2UgdGhlIHByb2R1Y2VyJ3MgZGlyZWN0IHdyaXRlIGhhZCBub3QgbGFuZGVkLCB3aGljaCBjb21wbGV0ZXMgdGhlXG4gKiByZWNvdmVyeSBwYXRoIHtAbGluayBTdGVwUmVzaWxpZW50RGlzcGF0Y2hSZWNvdmVyZWR9IGJlZ2FuLlxuICovXG5leHBvcnQgY29uc3QgU3RlcFJlc2lsaWVudERpc3BhdGNoTWF0ZXJpYWxpemVkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cuc3RlcC5yZXNpbGllbnRfZGlzcGF0Y2hfbWF0ZXJpYWxpemVkJ1xuKTtcblxuLyoqXG4gKiBIb3cgdGhlIHF1ZXVlZC1zdGVwIGNvbnN1bWVyIHJlc29sdmVkIHRoZSBydW4gaWRlbnRpdHkgZm9yIHRoaXMgZXhlY3V0aW9uOlxuICogYHJ1bl9jb250ZXh0YCDigJQgY2FycmllZCBvbiB0aGUgZGlzcGF0Y2ggbWVzc2FnZSwgbm8gYHJ1bnMuZ2V0YCBiZWZvcmUgdGhlXG4gKiBzdGVwICh0aGUgZmV0Y2gtZnJlZSBwcm9sb2d1ZSk7IGBydW5zX2dldGAg4oCUIHRoZSBsZWdhY3kgYmxvY2tpbmcgZmV0Y2hcbiAqIChtZXNzYWdlIGZyb20gYW4gb2xkZXIgcHJvZHVjZXIpLiBEaXN0aW5ndWlzaGVzIHRoZSB0d28gcGF0aHMgZHVyaW5nXG4gKiB2ZXJzaW9uLXNrZXcgd2luZG93cyBhbmQgbWFrZXMgdGhlIHNhdmVkIHJvdW5kIHRyaXAgZGlyZWN0bHkgbWVhc3VyYWJsZS5cbiAqL1xuZXhwb3J0IGNvbnN0IFN0ZXBEaXNwYXRjaFByb2xvZ3VlID0gU2VtYW50aWNDb252ZW50aW9uPFxuICAncnVuX2NvbnRleHQnIHwgJ3J1bnNfZ2V0J1xuPignd29ya2Zsb3cuc3RlcC5kaXNwYXRjaF9wcm9sb2d1ZScpO1xuXG4vLyBIb29rLXRyaWdnZXJlZCB0aW1lLXRvLXJlc3VtZSAoVFRSKSBhdHRyaWJ1dGVzXG4vL1xuLy8gU2V0IG9uIHRoZSBgc3RlcC5leGVjdXRlIDxuYW1lPmAgc3BhbiBvZiB0aGUgRklSU1QgZHVyYWJsZSBzdGVwIGZvbGxvd2luZyBhXG4vLyBob29rIHJlc3VtZSwgYW5kIG9ubHkgdGhlcmU6IG9uZSByZXN1bXB0aW9uIHByb2R1Y2VzIGV4YWN0bHkgb25lIHNhbXBsZSwgc29cbi8vIGEgbGF0ZXIgc3RlcCBpbiB0aGUgc2FtZSBpbnZvY2F0aW9uLCBhIHJldHJ5LCBvciBhIHJlZGVsaXZlcnkgbmV2ZXJcbi8vIHJlLXJlcG9ydHMgaXQuIFRoZSBwaGFzZXMgYXJlIG5vbi1vdmVybGFwcGluZyBhbmQgc3VtIGV4YWN0bHkgdG9cbi8vIHtAbGluayBSZXN1bWVUb3RhbE1zfTsgc2VlIHJ1bnRpbWUvcmVzdW1lLWxhdGVuY3kudHMgZm9yIHRoZSBib3VuZGFyeVxuLy8gZGVmaW5pdGlvbnMgYW5kIHRoZSBlbWlzc2lvbiBnYXRlLlxuLy9cbi8vIERlbGliZXJhdGVseSBjYXJyaWVzIG5vIGByZXN1bWVJZGAsIHJ1biBJRCwgb3IgdG9rZW46IHRoZSBtZXRyaWMgaXMgbWVhbnQgdG9cbi8vIGJlIGFnZ3JlZ2F0ZWQgYWNyb3NzIGV2ZXJ5IHJlc3VtZSwgYW5kIGhpZ2gtY2FyZGluYWxpdHkga2V5cyB3b3VsZCBtYWtlIHRoYXRcbi8vIHByb2hpYml0aXZlLiBFeGlzdGluZyB0cmFjZS1jb3JyZWxhdGlvbiBmaWVsZHMgb24gdGhlIHNhbWUgc3BhbiBhcmVcbi8vIHVuY2hhbmdlZCBhbmQgc3RpbGwgaWRlbnRpZnkgdGhlIGluZGl2aWR1YWwgcnVuLlxuXG4vKiogVG90YWwgVFRSOiBlbnRyeSBpbnRvIGByZXN1bWVIb29rKClgIOKGkiBpbW1lZGlhdGVseSBiZWZvcmUgYHN0ZXBGbi5hcHBseSgpYC4gKi9cbmV4cG9ydCBjb25zdCBSZXN1bWVUb3RhbE1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5yZXN1bWUudG90YWxfbXMnXG4pO1xuXG4vKiogUGhhc2U6IGByZXN1bWVIb29rKClgIGVudHJ5IOKGkiB0aGUgcXVldWUgcHVibGlzaCBiZWluZyByZXF1ZXN0ZWQuICovXG5leHBvcnQgY29uc3QgUmVzdW1lUHJvZHVjZXJQcmVwTXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnJlc3VtZS5waGFzZS5wcm9kdWNlcl9wcmVwX21zJ1xuKTtcblxuLyoqIFBoYXNlOiBxdWV1ZSBwdWJsaXNoIHJlcXVlc3RlZCDihpIgdGhlIGZpbmFsIGNvbnN1bWVyJ3MgaGFuZGxlciBiZWluZyBlbnRlcmVkLiAqL1xuZXhwb3J0IGNvbnN0IFJlc3VtZVF1ZXVlRGVsaXZlcnlNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cucmVzdW1lLnBoYXNlLnF1ZXVlX2RlbGl2ZXJ5X21zJ1xuKTtcblxuLyoqIFBoYXNlOiBjb25zdW1lciBlbnRyeSDihpIgcmVwbGF5IGJlZ2lubmluZy4gKi9cbmV4cG9ydCBjb25zdCBSZXN1bWVTZXR1cE1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5yZXN1bWUucGhhc2UucmVzdW1lX3NldHVwX21zJ1xuKTtcblxuLyoqIFBoYXNlOiByZXBsYXkgYmVnaW5uaW5nIOKGkiB0aGUgbmV4dCBkdXJhYmxlIHN0ZXAgYmVpbmcgZW5jb3VudGVyZWQuICovXG5leHBvcnQgY29uc3QgUmVzdW1lUmVwbGF5TXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnJlc3VtZS5waGFzZS5yZXBsYXlfbXMnXG4pO1xuXG4vKiogUGhhc2U6IHN0ZXAgZW5jb3VudGVyZWQg4oaSIHRoZSBgc3RlcF9zdGFydGVkYCByZXF1ZXN0IGJlZ2lubmluZy4gKi9cbmV4cG9ydCBjb25zdCBSZXN1bWVTdGVwRGlzcGF0Y2hNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cucmVzdW1lLnBoYXNlLnN0ZXBfZGlzcGF0Y2hfbXMnXG4pO1xuXG4vKipcbiAqIFBoYXNlOiBgc3RlcF9zdGFydGVkYCByZXF1ZXN0IGJlZ2lubmluZyDihpIgaXRzIHJlc3BvbnNlIHJldHVybmluZy4gT21pdHRlZFxuICogdW5kZXIgb3B0aW1pc3RpYyBpbmxpbmUgc3RhcnQsIHdoZXJlIHRoZSBjbGFpbSBpcyBub3QgYXdhaXRlZCBiZWZvcmUgdGhlXG4gKiBib2R5IHJ1bnMgYW5kIHRoZXJlZm9yZSBoYXMgbm8gY29tcGxldGlvbiBpbnN0YW50IGF0IHRoYXQgcG9pbnQ7IHRoZSB0aW1lXG4gKiBpcyB0aGVuIHJlcG9ydGVkIGVudGlyZWx5IGFzIHtAbGluayBSZXN1bWVTdGVwUHJlcGFyZU1zfS5cbiAqL1xuZXhwb3J0IGNvbnN0IFJlc3VtZVN0ZXBDbGFpbU1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5yZXN1bWUucGhhc2Uuc3RlcF9jbGFpbV9tcydcbik7XG5cbi8qKlxuICogUGhhc2U6IGNsYWltIHJldHVybmluZyDihpIgaW1tZWRpYXRlbHkgYmVmb3JlIGBzdGVwRm4uYXBwbHkoKWAuIERlbGliZXJhdGVseVxuICogaW5jbHVkZXMgZW5jcnlwdGlvbi1rZXkgcmVzb2x1dGlvbiwgYXJndW1lbnQgaHlkcmF0aW9uLCBhbmQgc3RlcC1jb250ZXh0XG4gKiBzZXR1cDsgYHdvcmtmbG93LnF1ZXVlLmRlc2VyaWFsaXplX3RpbWVfbXNgIHN0aWxsIGlzb2xhdGVzIGh5ZHJhdGlvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IFJlc3VtZVN0ZXBQcmVwYXJlTXMgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnJlc3VtZS5waGFzZS5zdGVwX3ByZXBhcmVfbXMnXG4pO1xuXG4vKiogV2hhdCB0cmlnZ2VyZWQgdGhlIG1lYXN1cmVkIHJlc3VtcHRpb24uICovXG5leHBvcnQgY29uc3QgUmVzdW1lVHJpZ2dlciA9IFNlbWFudGljQ29udmVudGlvbjwnaG9vayc+KFxuICAnd29ya2Zsb3cucmVzdW1lLnRyaWdnZXInXG4pO1xuXG4vKipcbiAqIFdoaWNoIGByZXN1bWVIb29rKClgIGRpc3BhdGNoIHBhdGggcHJvZHVjZWQgdGhpcyByZXN1bWUuIGBwYXJhbGxlbGAgb25seVxuICogYXBwZWFycyBmb3IgbWVzc2FnZXMgcHVibGlzaGVkIGJ5IGFuIG9sZGVyIHByb2R1Y2VyLCB3aGljaCB3cm90ZVxuICogYGhvb2tfcmVjZWl2ZWRgIGl0c2VsZiBpbiBwYXJhbGxlbCB3aXRoIHRoZSBwdWJsaXNoLlxuICovXG5leHBvcnQgY29uc3QgUmVzdW1lU3RyYXRlZ3kgPSBTZW1hbnRpY0NvbnZlbnRpb248XG4gICdsYXp5JyB8ICdwYXJhbGxlbCcgfCAnc2VxdWVudGlhbCdcbj4oJ3dvcmtmbG93LnJlc3VtZS5zdHJhdGVneScpO1xuXG4vKipcbiAqIEhvdyB0aGUgY29uc3VtaW5nIGludm9jYXRpb24gaW5pdGlhbGl6ZWQgcmVwbGF5IHN0YXRlLiBEaXN0aW5jdCBmcm9tIHRoZVxuICogcHJlLWV4aXN0aW5nIHtAbGluayBIb29rUmVzdW1lU2V0dXBTb3VyY2V9IChgd29ya2Zsb3cucmVzdW1lX3NldHVwX3NvdXJjZWAsXG4gKiBvbiB0aGUgd29ya2Zsb3cgZXhlY3V0aW9uIHNwYW4pLCB3aGljaCByZXBvcnRzIHRoZSBmaW5lci1ncmFpbmVkXG4gKiBob2lzdGVkLXdyaXRlIG91dGNvbWU7IHRoaXMgb25lIGlzIHRoZSBUVFIgZGltZW5zaW9uIGFuZCBzaGFyZXMgdGhlIG1ldHJpYydzXG4gKiB0aHJlZS12YWx1ZSB2b2NhYnVsYXJ5LlxuICovXG5leHBvcnQgY29uc3QgUmVzdW1lU2V0dXBTb3VyY2UgPSBTZW1hbnRpY0NvbnZlbnRpb248XG4gICdob29rX3ByZWxvYWQnIHwgJ3J1bl9zdGFydGVkJyB8ICdldmVudF9sb2FkJ1xuPignd29ya2Zsb3cucmVzdW1lLnNldHVwX3NvdXJjZScpO1xuXG4vKiogV2hldGhlciB0aGUgbWVhc3VyZWQgc3RlcCByYW4gaW4gdGhlIHJlc3VtaW5nIGludm9jYXRpb24gb3IgYSBxdWV1ZWQgb25lLiAqL1xuZXhwb3J0IGNvbnN0IFJlc3VtZVN0ZXBFeGVjdXRpb24gPSBTZW1hbnRpY0NvbnZlbnRpb248J2lubGluZScgfCAnZGlzcGF0Y2hlZCc+KFxuICAnd29ya2Zsb3cucmVzdW1lLnN0ZXBfZXhlY3V0aW9uJ1xuKTtcblxuLy8gV2ViaG9vayBhdHRyaWJ1dGVzXG5cbi8qKiBOdW1iZXIgb2Ygd2ViaG9vayBoYW5kbGVycyB0cmlnZ2VyZWQgKi9cbmV4cG9ydCBjb25zdCBXZWJob29rSGFuZGxlcnNUcmlnZ2VyZWQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dlYmhvb2suaGFuZGxlcnMudHJpZ2dlcmVkJ1xuKTtcblxuLy8gU3VzcGVuc2lvbiBhdHRyaWJ1dGVzXG5cbmV4cG9ydCBjb25zdCBXb3JrZmxvd1N1c3BlbnNpb25TdGF0ZSA9IFNlbWFudGljQ29udmVudGlvbjwnc3VzcGVuZGVkJz4oXG4gICd3b3JrZmxvdy5zdXNwZW5zaW9uLnN0YXRlJ1xuKTtcbmV4cG9ydCBjb25zdCBXb3JrZmxvd1N1c3BlbnNpb25Ib29rQ291bnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnN1c3BlbnNpb24uaG9va19jb3VudCdcbik7XG5leHBvcnQgY29uc3QgV29ya2Zsb3dTdXNwZW5zaW9uU3RlcENvdW50ID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5zdXNwZW5zaW9uLnN0ZXBfY291bnQnXG4pO1xuZXhwb3J0IGNvbnN0IFdvcmtmbG93U3VzcGVuc2lvbldhaXRDb3VudCA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuc3VzcGVuc2lvbi53YWl0X2NvdW50J1xuKTtcblxuLy8gV29ybGQvU3RvcmFnZSBhdHRyaWJ1dGVzIC0gU3RhbmRhcmQgT1RFTCBIVFRQIGNvbnZlbnRpb25zXG4vLyBTZWU6IGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvaHR0cC9odHRwLXNwYW5zL1xuXG4vKiogSFRUUCByZXF1ZXN0IG1ldGhvZCAoc3RhbmRhcmQgT1RFTDogaHR0cC5yZXF1ZXN0Lm1ldGhvZCkgKi9cbmV4cG9ydCBjb25zdCBIdHRwUmVxdWVzdE1ldGhvZCA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KFxuICAnaHR0cC5yZXF1ZXN0Lm1ldGhvZCdcbik7XG5cbi8qKiBSb3V0ZSBwYXR0ZXJuIGZvciB0aGUgcmVxdWVzdCAoc3RhbmRhcmQgT1RFTDogaHR0cC5yb3V0ZSkgKi9cbmV4cG9ydCBjb25zdCBIdHRwUm91dGUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignaHR0cC5yb3V0ZScpO1xuXG4vKiogRnVsbCBVUkwgb2YgdGhlIHJlcXVlc3QgKHN0YW5kYXJkIE9URUw6IHVybC5mdWxsKSAqL1xuZXhwb3J0IGNvbnN0IFVybEZ1bGwgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPigndXJsLmZ1bGwnKTtcblxuLyoqIFNlcnZlciBob3N0bmFtZSAoc3RhbmRhcmQgT1RFTDogc2VydmVyLmFkZHJlc3MpICovXG5leHBvcnQgY29uc3QgU2VydmVyQWRkcmVzcyA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdzZXJ2ZXIuYWRkcmVzcycpO1xuXG4vKiogU2VydmVyIHBvcnQgKHN0YW5kYXJkIE9URUw6IHNlcnZlci5wb3J0KSAqL1xuZXhwb3J0IGNvbnN0IFNlcnZlclBvcnQgPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPignc2VydmVyLnBvcnQnKTtcblxuLyoqIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgKHN0YW5kYXJkIE9URUw6IGh0dHAucmVzcG9uc2Uuc3RhdHVzX2NvZGUpICovXG5leHBvcnQgY29uc3QgSHR0cFJlc3BvbnNlU3RhdHVzQ29kZSA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnaHR0cC5yZXNwb25zZS5zdGF0dXNfY29kZSdcbik7XG5cbi8qKiBFcnJvciB0eXBlIHdoZW4gcmVxdWVzdCBmYWlscyAoc3RhbmRhcmQgT1RFTDogZXJyb3IudHlwZSkgKi9cbmV4cG9ydCBjb25zdCBFcnJvclR5cGUgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nPignZXJyb3IudHlwZScpO1xuXG4vLyBXb3JsZC1zcGVjaWZpYyBjdXN0b20gYXR0cmlidXRlcyAoZm9yIHdvcmtmbG93LXNwZWNpZmljIGNvbnRleHQpXG5cbi8qKiBGb3JtYXQgdXNlZCBmb3IgcGFyc2luZyByZXNwb25zZSBib2R5IChjYm9yIG9yIGpzb24pICovXG5leHBvcnQgY29uc3QgV29ybGRQYXJzZUZvcm1hdCA9IFNlbWFudGljQ29udmVudGlvbjwnY2JvcicgfCAnanNvbic+KFxuICAnd29ya2Zsb3cud29ybGQucGFyc2UuZm9ybWF0J1xuKTtcblxuLy8gRXZlbnQgbG9hZGluZyBhdHRyaWJ1dGVzXG5cbi8qKiBOdW1iZXIgb2YgcGFnaW5hdGlvbiBwYWdlcyBsb2FkZWQgd2hlbiBmZXRjaGluZyB3b3JrZmxvdyBldmVudHMgKi9cbmV4cG9ydCBjb25zdCBXb3JrZmxvd0V2ZW50c1BhZ2VzTG9hZGVkID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5ldmVudHMucGFnZXNfbG9hZGVkJ1xuKTtcblxuLy8gUXVldWUgdGltaW5nIGJyZWFrZG93biBhdHRyaWJ1dGVzICh3b3JrZmxvdy1zcGVjaWZpYylcblxuLyoqIFRpbWUgc3BlbnQgZGVzZXJpYWxpemluZyB0aGUgcXVldWUgbWVzc2FnZSBpbiBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBjb25zdCBRdWV1ZURlc2VyaWFsaXplVGltZU1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5xdWV1ZS5kZXNlcmlhbGl6ZV90aW1lX21zJ1xuKTtcblxuLyoqIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRoZSBoYW5kbGVyIGxvZ2ljIGluIG1pbGxpc2Vjb25kcyAqL1xuZXhwb3J0IGNvbnN0IFF1ZXVlRXhlY3V0aW9uVGltZU1zID0gU2VtYW50aWNDb252ZW50aW9uPG51bWJlcj4oXG4gICd3b3JrZmxvdy5xdWV1ZS5leGVjdXRpb25fdGltZV9tcydcbik7XG5cbi8qKiBUaW1lIHNwZW50IHNlcmlhbGl6aW5nIHRoZSByZXNwb25zZSBpbiBtaWxsaXNlY29uZHMgKi9cbmV4cG9ydCBjb25zdCBRdWV1ZVNlcmlhbGl6ZVRpbWVNcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cucXVldWUuc2VyaWFsaXplX3RpbWVfbXMnXG4pO1xuXG4vLyBQYXlsb2FkIGNvbXByZXNzaW9uIGF0dHJpYnV0ZXMgKHpzdGQgcHJlZmVycmVkLCBnemlwIGZhbGxiYWNrOyBzcGVjVmVyc2lvbiA+PSA1KVxuLy9cbi8vIFNpemVzIGFyZSBtZWFzdXJlZCBhdCB0aGUgY29tcHJlc3Npb24gYm91bmRhcnk6IGJlZm9yZSBlbmNyeXB0aW9uIG9uIHRoZVxuLy8gd3JpdGUgcGF0aCBhbmQgYWZ0ZXIgZGVjcnlwdGlvbiBvbiB0aGUgcmVhZCBwYXRoLiBUaGV5IHRoZXJlZm9yZSByZWZsZWN0XG4vLyBjb21wcmVzc2lvbidzIGVmZmVjdCwgbm90IHRoZSBhdC1yZXN0IHNpemUgKHdoaWNoIGFsc28gaW5jbHVkZXMgdGhlXG4vLyB+MjgtYnl0ZSBgZW5jcmAgZW52ZWxvcGUgYW5kLCBvbiBzb21lIGJhY2tlbmRzLCBiYXNlNjQgZXhwYW5zaW9uKS5cblxuLyoqIFdoZXRoZXIgdGhpcyBzZXJpYWxpemUvZGVzZXJpYWxpemUgd2FzIGEgd3JpdGUgb3IgcmVhZC4gKi9cbmV4cG9ydCBjb25zdCBTZXJpYWxpemF0aW9uT3BlcmF0aW9uID0gU2VtYW50aWNDb252ZW50aW9uPFxuICAnc2VyaWFsaXplJyB8ICdkZXNlcmlhbGl6ZSdcbj4oJ3dvcmtmbG93LnNlcmlhbGl6YXRpb24ub3BlcmF0aW9uJyk7XG5cbi8qKiBXaGV0aGVyIGEgY29tcHJlc3Npb24gY29kZWMgd2FzIGFwcGxpZWQgKHdyaXRlKSAvIHByZXNlbnQgKHJlYWQpLiAqL1xuZXhwb3J0IGNvbnN0IFNlcmlhbGl6YXRpb25Db21wcmVzc2VkID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KFxuICAnd29ya2Zsb3cuc2VyaWFsaXphdGlvbi5jb21wcmVzc2VkJ1xuKTtcblxuLyoqIFdoaWNoIGNvbXByZXNzaW9uIGNvZGVjIGFwcGxpZWQgLyB3YXMgcHJlc2VudCAoYHpzdGRgLCBgZ3ppcGAsIG9yIGBub25lYCkuICovXG5leHBvcnQgY29uc3QgU2VyaWFsaXphdGlvbkNvZGVjID0gU2VtYW50aWNDb252ZW50aW9uPCd6c3RkJyB8ICdnemlwJyB8ICdub25lJz4oXG4gICd3b3JrZmxvdy5zZXJpYWxpemF0aW9uLmNvZGVjJ1xuKTtcblxuLyoqIExvZ2ljYWwgKHVuY29tcHJlc3NlZCwgZGV2YWx1ZS1wcmVmaXhlZCkgcGF5bG9hZCBzaXplIGluIGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IFNlcmlhbGl6YXRpb25VbmNvbXByZXNzZWRCeXRlcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuc2VyaWFsaXphdGlvbi51bmNvbXByZXNzZWRfYnl0ZXMnXG4pO1xuXG4vKiogU3RvcmVkIChwb3N0LWNvbXByZXNzaW9uLCBwcmUtZW5jcnlwdGlvbikgcGF5bG9hZCBzaXplIGluIGJ5dGVzLiAqL1xuZXhwb3J0IGNvbnN0IFNlcmlhbGl6YXRpb25TdG9yZWRCeXRlcyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuc2VyaWFsaXphdGlvbi5zdG9yZWRfYnl0ZXMnXG4pO1xuXG4vKiogRnJhY3Rpb24gb2YgYnl0ZXMgc2F2ZWQgYnkgY29tcHJlc3Npb24gKDAuLjEpOyBzZXQgb25seSB3aGVuIGNvbXByZXNzZWQuICovXG5leHBvcnQgY29uc3QgU2VyaWFsaXphdGlvbkNvbXByZXNzaW9uUmF0aW8gPSBTZW1hbnRpY0NvbnZlbnRpb248bnVtYmVyPihcbiAgJ3dvcmtmbG93LnNlcmlhbGl6YXRpb24uY29tcHJlc3Npb25fcmF0aW8nXG4pO1xuXG4vKipcbiAqIE51bWJlciBvZiB3b3JrZmxvdyAoZ3Vlc3QpIGNvZGUgZXhlY3V0aW9ucyBzZXJpYWxpemF0aW9uIGNvdWxkIG5vdCBhdm9pZFxuICogKGdldHRlcnMsIHByb3hpZXMsIGN1c3RvbSBzZXJpYWxpemVycyk7IHNldCBvbmx5IHdoZW4gbm9uLXplcm8uXG4gKi9cbmV4cG9ydCBjb25zdCBTZXJpYWxpemF0aW9uR3Vlc3RDb2RlRXhlY3V0aW9ucyA9IFNlbWFudGljQ29udmVudGlvbjxudW1iZXI+KFxuICAnd29ya2Zsb3cuc2VyaWFsaXphdGlvbi5ndWVzdF9jb2RlX2V4ZWN1dGlvbnMnXG4pO1xuXG4vKipcbiAqIERlZHVwbGljYXRlZCBga2luZCAoZGV0YWlsKWAgZGVzY3JpcHRpb25zIG9mIHRoZSBndWVzdC1jb2RlIGV4ZWN1dGlvbnM7XG4gKiBzZXQgb25seSB3aGVuIG5vbi16ZXJvLlxuICovXG5leHBvcnQgY29uc3QgU2VyaWFsaXphdGlvbkd1ZXN0Q29kZURldGFpbHMgPSBTZW1hbnRpY0NvbnZlbnRpb248c3RyaW5nW10+KFxuICAnd29ya2Zsb3cuc2VyaWFsaXphdGlvbi5ndWVzdF9jb2RlX2RldGFpbHMnXG4pO1xuXG4vLyBSUEMvUGVlciBTZXJ2aWNlIGF0dHJpYnV0ZXMgLSBGb3Igc2VydmljZSBtYXBzIGFuZCBkZXBlbmRlbmN5IHRyYWNraW5nXG4vLyBTZWU6IGh0dHBzOi8vb3BlbnRlbGVtZXRyeS5pby9kb2NzL3NwZWNzL3NlbWNvbnYvcnBjL3JwYy1zcGFucy9cblxuLyoqIFRoZSByZW1vdGUgc2VydmljZSBuYW1lIGZvciBEYXRhZG9nIHNlcnZpY2UgbWFwcyAoRGF0YWRvZy1zcGVjaWZpYzogcGVlci5zZXJ2aWNlKSAqL1xuZXhwb3J0IGNvbnN0IFBlZXJTZXJ2aWNlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3BlZXIuc2VydmljZScpO1xuXG4vKiogUlBDIHN5c3RlbSBpZGVudGlmaWVyIChzdGFuZGFyZCBPVEVMOiBycGMuc3lzdGVtKSAqL1xuZXhwb3J0IGNvbnN0IFJwY1N5c3RlbSA9IFNlbWFudGljQ29udmVudGlvbjxzdHJpbmc+KCdycGMuc3lzdGVtJyk7XG5cbi8qKiBSUEMgc2VydmljZSBuYW1lIChzdGFuZGFyZCBPVEVMOiBycGMuc2VydmljZSkgKi9cbmV4cG9ydCBjb25zdCBScGNTZXJ2aWNlID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3JwYy5zZXJ2aWNlJyk7XG5cbi8qKiBSUEMgbWV0aG9kIG5hbWUgKHN0YW5kYXJkIE9URUw6IHJwYy5tZXRob2QpICovXG5leHBvcnQgY29uc3QgUnBjTWV0aG9kID0gU2VtYW50aWNDb252ZW50aW9uPHN0cmluZz4oJ3JwYy5tZXRob2QnKTtcblxuLy8gRXJyb3IgYXR0cmlidXRlcyAtIFN0YW5kYXJkIE9URUwgZXJyb3IgY29udmVudGlvbnNcbi8vIFNlZTogaHR0cHM6Ly9vcGVudGVsZW1ldHJ5LmlvL2RvY3Mvc3BlY3Mvc2VtY29udi9leGNlcHRpb25zL2V4Y2VwdGlvbnMtc3BhbnMvXG5cbi8qKiBXaGV0aGVyIHRoZSBlcnJvciBpcyByZXRyeWFibGUgKHdvcmtmbG93LXNwZWNpZmljKSAqL1xuZXhwb3J0IGNvbnN0IEVycm9yUmV0cnlhYmxlID0gU2VtYW50aWNDb252ZW50aW9uPGJvb2xlYW4+KCdlcnJvci5yZXRyeWFibGUnKTtcblxuLyoqIEVycm9yIGNhdGVnb3J5ICh3b3JrZmxvdy1zcGVjaWZpYzogZmF0YWwsIHJldHJ5YWJsZSwgdHJhbnNpZW50KSAqL1xuZXhwb3J0IGNvbnN0IEVycm9yQ2F0ZWdvcnkgPSBTZW1hbnRpY0NvbnZlbnRpb248XG4gICdmYXRhbCcgfCAncmV0cnlhYmxlJyB8ICd0cmFuc2llbnQnXG4+KCdlcnJvci5jYXRlZ29yeScpO1xuIl19
|