semantifold 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +61 -15
- package/build/index.d.ts +52 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +60 -8
- package/build/src/artifact-path.d.ts +23 -1
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +45 -3
- package/build/src/artifacts.d.ts.map +1 -1
- package/build/src/artifacts.js +66 -1
- package/build/src/backends/android.d.ts +49 -0
- package/build/src/backends/android.d.ts.map +1 -0
- package/build/src/backends/android.js +1274 -0
- package/build/src/backends/c-validation.d.ts.map +1 -1
- package/build/src/backends/c-validation.js +7 -3
- package/build/src/backends/cpp-validation.d.ts.map +1 -1
- package/build/src/backends/cpp-validation.js +7 -3
- package/build/src/backends/csharp.js +7 -1
- package/build/src/backends/dart-runtime.d.ts +2 -0
- package/build/src/backends/dart-runtime.d.ts.map +1 -0
- package/build/src/backends/dart-runtime.js +41 -0
- package/build/src/backends/dart.d.ts +20 -0
- package/build/src/backends/dart.d.ts.map +1 -0
- package/build/src/backends/dart.js +321 -0
- package/build/src/backends/effects.d.ts +60 -0
- package/build/src/backends/effects.d.ts.map +1 -0
- package/build/src/backends/effects.js +746 -0
- package/build/src/backends/go.js +18 -4
- package/build/src/backends/identifiers.d.ts +36 -4
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +160 -10
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -4
- package/build/src/backends/ios.d.ts +68 -0
- package/build/src/backends/ios.d.ts.map +1 -0
- package/build/src/backends/ios.js +1503 -0
- package/build/src/backends/java.d.ts.map +1 -1
- package/build/src/backends/java.js +429 -36
- package/build/src/backends/javascript.d.ts +6 -0
- package/build/src/backends/javascript.d.ts.map +1 -1
- package/build/src/backends/javascript.js +380 -24
- package/build/src/backends/kotlin-runtime.d.ts +3 -0
- package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
- package/build/src/backends/kotlin-runtime.js +29 -0
- package/build/src/backends/kotlin.d.ts +33 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +138 -0
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/ordered-expressions.d.ts.map +1 -1
- package/build/src/backends/ordered-expressions.js +39 -7
- package/build/src/backends/php-stdlib-support.d.ts +19 -0
- package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
- package/build/src/backends/php-stdlib-support.js +227 -0
- package/build/src/backends/php.d.ts.map +1 -1
- package/build/src/backends/php.js +448 -33
- package/build/src/backends/program.d.ts +83 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1309 -0
- package/build/src/backends/python.js +7 -1
- package/build/src/backends/ruby.d.ts.map +1 -1
- package/build/src/backends/ruby.js +310 -24
- package/build/src/backends/rust-runtime.d.ts +7 -0
- package/build/src/backends/rust-runtime.d.ts.map +1 -0
- package/build/src/backends/rust-runtime.js +32 -0
- package/build/src/backends/rust-validation.d.ts +9 -0
- package/build/src/backends/rust-validation.d.ts.map +1 -0
- package/build/src/backends/rust-validation.js +78 -0
- package/build/src/backends/rust.d.ts +24 -0
- package/build/src/backends/rust.d.ts.map +1 -0
- package/build/src/backends/rust.js +344 -0
- package/build/src/backends/scalars.d.ts +14 -6
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +167 -17
- package/build/src/backends/shared.d.ts +23 -4
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +2174 -62
- package/build/src/backends/stdlib-support.d.ts +14 -0
- package/build/src/backends/stdlib-support.d.ts.map +1 -0
- package/build/src/backends/stdlib-support.js +237 -0
- package/build/src/backends/swift-runtime.d.ts +3 -0
- package/build/src/backends/swift-runtime.d.ts.map +1 -0
- package/build/src/backends/swift-runtime.js +14 -0
- package/build/src/backends/swift.d.ts +8 -0
- package/build/src/backends/swift.d.ts.map +1 -0
- package/build/src/backends/swift.js +127 -0
- package/build/src/backends/typescript.d.ts.map +1 -1
- package/build/src/backends/typescript.js +344 -24
- package/build/src/backends/wasm.d.ts +43 -0
- package/build/src/backends/wasm.d.ts.map +1 -0
- package/build/src/backends/wasm.js +2164 -0
- package/build/src/backends/writer.d.ts +255 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +491 -3
- package/build/src/diagnostic.d.ts +4 -3
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +5 -3
- package/build/src/frontends/c.d.ts.map +1 -1
- package/build/src/frontends/c.js +5 -3
- package/build/src/frontends/cpp.d.ts.map +1 -1
- package/build/src/frontends/cpp.js +5 -3
- package/build/src/frontends/csharp.d.ts.map +1 -1
- package/build/src/frontends/csharp.js +7 -3
- package/build/src/frontends/dart.d.ts +10 -0
- package/build/src/frontends/dart.d.ts.map +1 -0
- package/build/src/frontends/dart.js +913 -0
- package/build/src/frontends/index.d.ts +3 -1
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +15 -5
- package/build/src/frontends/java.d.ts +110 -1
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +1725 -70
- package/build/src/frontends/javascript-typescript.d.ts +69 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +1825 -93
- package/build/src/frontends/kotlin.d.ts +10 -0
- package/build/src/frontends/kotlin.d.ts.map +1 -0
- package/build/src/frontends/kotlin.js +685 -0
- package/build/src/frontends/php.d.ts +118 -1
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +1583 -76
- package/build/src/frontends/program.d.ts +74 -0
- package/build/src/frontends/program.d.ts.map +1 -0
- package/build/src/frontends/program.js +989 -0
- package/build/src/frontends/ruby.d.ts +68 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +1446 -101
- package/build/src/frontends/rust-parser.d.ts +11 -0
- package/build/src/frontends/rust-parser.d.ts.map +1 -0
- package/build/src/frontends/rust-parser.js +15 -0
- package/build/src/frontends/rust.d.ts +14 -0
- package/build/src/frontends/rust.d.ts.map +1 -0
- package/build/src/frontends/rust.js +715 -0
- package/build/src/frontends/scalars.d.ts +10 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +28 -2
- package/build/src/frontends/swift.d.ts +10 -0
- package/build/src/frontends/swift.d.ts.map +1 -0
- package/build/src/frontends/swift.js +860 -0
- package/build/src/frontends/types.d.ts +186 -0
- package/build/src/frontends/types.d.ts.map +1 -0
- package/build/src/frontends/types.js +634 -0
- package/build/src/language-registry.d.ts +46 -4
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +177 -13
- package/build/src/mapping.d.ts +2 -2
- package/build/src/mapping.d.ts.map +1 -1
- package/build/src/mapping.js +31 -10
- package/build/src/semantic/capabilities.d.ts +66 -0
- package/build/src/semantic/capabilities.d.ts.map +1 -0
- package/build/src/semantic/capabilities.js +649 -0
- package/build/src/semantic/effects.d.ts +26 -0
- package/build/src/semantic/effects.d.ts.map +1 -0
- package/build/src/semantic/effects.js +764 -0
- package/build/src/semantic/generics.d.ts +23 -0
- package/build/src/semantic/generics.d.ts.map +1 -0
- package/build/src/semantic/generics.js +61 -0
- package/build/src/semantic/lifetime.d.ts +37 -0
- package/build/src/semantic/lifetime.d.ts.map +1 -0
- package/build/src/semantic/lifetime.js +527 -0
- package/build/src/semantic/provenance.d.ts +9 -2
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +462 -20
- package/build/src/semantic/scalars.d.ts +11 -0
- package/build/src/semantic/scalars.d.ts.map +1 -1
- package/build/src/semantic/scalars.js +16 -1
- package/build/src/semantic/stdlib.d.ts +254 -0
- package/build/src/semantic/stdlib.d.ts.map +1 -0
- package/build/src/semantic/stdlib.js +880 -0
- package/build/src/semantic/types.d.ts +3108 -178
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +730 -15
- package/build/src/semantic/validate.d.ts +85 -5
- package/build/src/semantic/validate.d.ts.map +1 -1
- package/build/src/semantic/validate.js +2576 -98
- package/build/src/stdlib-facades.d.ts +304 -0
- package/build/src/stdlib-facades.d.ts.map +1 -0
- package/build/src/stdlib-facades.js +1167 -0
- package/build/src/stdlib-negotiation.d.ts +69 -0
- package/build/src/stdlib-negotiation.d.ts.map +1 -0
- package/build/src/stdlib-negotiation.js +403 -0
- package/build/src/stdlib-providers.d.ts +72 -0
- package/build/src/stdlib-providers.d.ts.map +1 -0
- package/build/src/stdlib-providers.js +339 -0
- package/build/src/toolchains.d.ts +55 -1
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +15 -4
- package/docs/android.md +79 -0
- package/docs/architecture.md +47 -13
- package/docs/dart.md +60 -0
- package/docs/goals.md +3 -3
- package/docs/ios.md +121 -0
- package/docs/kotlin.md +42 -0
- package/docs/language-support.md +238 -26
- package/docs/multi-file-modules.md +52 -0
- package/docs/parser-qualification.md +121 -8
- package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
- package/docs/rust.md +88 -0
- package/docs/source-maps.md +17 -7
- package/docs/specification.md +5 -0
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +381 -4
- package/docs/webassembly.md +52 -0
- package/index.js +66 -8
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
- package/package.json +5 -2
- package/src/artifact-path.js +47 -2
- package/src/artifacts.js +67 -0
- package/src/backends/android.js +1370 -0
- package/src/backends/c-validation.js +6 -1
- package/src/backends/cpp-validation.js +6 -1
- package/src/backends/csharp.js +3 -0
- package/src/backends/dart-runtime.js +41 -0
- package/src/backends/dart.js +326 -0
- package/src/backends/effects.js +705 -0
- package/src/backends/go.js +14 -2
- package/src/backends/identifiers.js +166 -9
- package/src/backends/index.js +27 -2
- package/src/backends/ios.js +1612 -0
- package/src/backends/java.js +454 -36
- package/src/backends/javascript.js +389 -23
- package/src/backends/kotlin-runtime.js +29 -0
- package/src/backends/kotlin.js +144 -0
- package/src/backends/native-validation.js +1 -1
- package/src/backends/ordered-expressions.js +40 -6
- package/src/backends/php-stdlib-support.js +239 -0
- package/src/backends/php.js +469 -32
- package/src/backends/program.js +1408 -0
- package/src/backends/python.js +3 -0
- package/src/backends/ruby.js +326 -23
- package/src/backends/rust-runtime.js +34 -0
- package/src/backends/rust-validation.js +75 -0
- package/src/backends/rust.js +335 -0
- package/src/backends/scalars.js +141 -16
- package/src/backends/shared.js +2314 -115
- package/src/backends/stdlib-support.js +234 -0
- package/src/backends/swift-runtime.js +14 -0
- package/src/backends/swift.js +132 -0
- package/src/backends/typescript.js +349 -23
- package/src/backends/wasm.js +2208 -0
- package/src/backends/writer.js +545 -2
- package/src/diagnostic.js +4 -2
- package/src/frontends/c.js +4 -2
- package/src/frontends/cpp.js +4 -2
- package/src/frontends/csharp.js +4 -2
- package/src/frontends/dart.js +963 -0
- package/src/frontends/index.js +14 -4
- package/src/frontends/java.js +1977 -69
- package/src/frontends/javascript-typescript.js +2046 -102
- package/src/frontends/kotlin.js +713 -0
- package/src/frontends/php.js +1725 -79
- package/src/frontends/program.js +1062 -0
- package/src/frontends/ruby.js +1624 -98
- package/src/frontends/rust-parser.js +18 -0
- package/src/frontends/rust.js +714 -0
- package/src/frontends/scalars.js +31 -1
- package/src/frontends/swift.js +893 -0
- package/src/frontends/types.js +750 -0
- package/src/language-registry.js +182 -12
- package/src/mapping.js +33 -9
- package/src/semantic/capabilities.js +671 -0
- package/src/semantic/effects.js +737 -0
- package/src/semantic/generics.js +58 -0
- package/src/semantic/lifetime.js +517 -0
- package/src/semantic/provenance.js +412 -19
- package/src/semantic/scalars.js +17 -0
- package/src/semantic/stdlib.js +921 -0
- package/src/semantic/types.js +810 -14
- package/src/semantic/validate.js +2934 -209
- package/src/stdlib-facades.js +1211 -0
- package/src/stdlib-negotiation.js +446 -0
- package/src/stdlib-providers.js +377 -0
- package/src/toolchains.js +16 -3
|
@@ -1,12 +1,100 @@
|
|
|
1
1
|
// @ts-check
|
|
2
|
-
/** @typedef {"php" | "ruby" | "javascript" | "typescript" | "java" | "python" | "csharp" | "go" | "c" | "cpp"} SemanticLanguage */
|
|
2
|
+
/** @typedef {"php" | "ruby" | "javascript" | "typescript" | "java" | "kotlin" | "python" | "csharp" | "go" | "c" | "cpp" | "rust" | "swift" | "dart"} SemanticLanguage */
|
|
3
|
+
/** @typedef {SemanticLanguage} TextBackendLanguage */
|
|
4
|
+
/** @typedef {TextBackendLanguage | "wasm" | "ios" | "android"} BackendLanguage */
|
|
5
|
+
/** @typedef {SemanticLanguage | "html"} GeneratedTextLanguage */
|
|
3
6
|
/** @typedef {"integer" | "boolean" | "string"} SemanticTypeName */
|
|
7
|
+
/** @typedef {SemanticTypeName | "void"} FunctionReturnTypeName */
|
|
4
8
|
/** @typedef {"IntegerNegate" | "BooleanNot"} SemanticUnaryOperation */
|
|
5
9
|
/** @typedef {"IntegerAdd" | "IntegerSubtract" | "IntegerMultiply" | "BooleanAnd" | "BooleanOr" | "IntegerEqual" | "IntegerNotEqual" | "BooleanEqual" | "BooleanNotEqual" | "StringEqual" | "StringNotEqual" | "IntegerLessThan" | "IntegerLessThanOrEqual" | "IntegerGreaterThan" | "IntegerGreaterThanOrEqual" | "StringConcat"} SemanticBinaryOperation */
|
|
6
|
-
/** @typedef {"function" | "parameter" | "local"} SemanticSymbolKind */
|
|
7
|
-
/** @typedef {"
|
|
10
|
+
/** @typedef {"capability" | "resource" | "failure" | "operation" | "record" | "class" | "error" | "field" | "constructor" | "method" | "function" | "typeParameter" | "parameter" | "local" | "iteration" | "catch"} SemanticSymbolKind */
|
|
11
|
+
/** @typedef {"record" | "class" | "error" | "function"} SemanticDeclarationKind */
|
|
12
|
+
/** @typedef {"declaration" | "type" | "construct" | "member" | "read" | "write" | "call"} SemanticSymbolRole */
|
|
8
13
|
/** @typedef {"parse" | "generate" | "restore" | "compile" | "link" | "validate" | "instantiate" | "execute"} AcceptanceStage */
|
|
9
14
|
/** @typedef {"entry" | "source" | "manifest" | "support" | "mapping" | "resource" | "loader"} GeneratedArtifactRole */
|
|
15
|
+
/**
|
|
16
|
+
* @typedef IosApplicationConfigurationInput
|
|
17
|
+
* @property {string} productName - Safe Xcode product/path identity.
|
|
18
|
+
* @property {string} moduleName - Safe Swift module identity.
|
|
19
|
+
* @property {string} organizationPrefix - Caller-supplied reverse-DNS organization prefix.
|
|
20
|
+
* @property {string} bundleIdentifier - Caller-supplied reverse-DNS application bundle identity.
|
|
21
|
+
* @property {string} deploymentTarget - Caller-supplied major.minor iOS deployment target; never inferred.
|
|
22
|
+
* @property {string} displayName - User-visible application name.
|
|
23
|
+
* @property {"Sources"} [sourceRoot] - Fixed generated-source root.
|
|
24
|
+
* @property {"Assets.xcassets"} [resourceRoot] - Fixed caller-resource root.
|
|
25
|
+
* @property {"swiftui"} [lifecycle] - Sole supported lifecycle.
|
|
26
|
+
* @property {Record<string, never>} [infoPlist] - Closed baseline caller plist extension; currently empty.
|
|
27
|
+
* @property {unknown[]} [permissions] - Validated as the closed empty baseline permissions.
|
|
28
|
+
* @property {unknown[]} [entitlements] - Validated as the closed empty baseline entitlements.
|
|
29
|
+
* @property {unknown[]} [privacyDeclarations] - Validated as the closed empty baseline privacy declarations.
|
|
30
|
+
* @property {unknown[]} [capabilities] - Validated as the closed empty baseline Apple capabilities.
|
|
31
|
+
*/
|
|
32
|
+
/**
|
|
33
|
+
* @typedef IosApplicationConfiguration
|
|
34
|
+
* @property {string} productName - Validated Xcode product/path identity.
|
|
35
|
+
* @property {string} moduleName - Validated Swift module identity.
|
|
36
|
+
* @property {string} organizationPrefix - Validated reverse-DNS organization prefix.
|
|
37
|
+
* @property {string} bundleIdentifier - Validated reverse-DNS application bundle identity.
|
|
38
|
+
* @property {string} deploymentTarget - Validated caller-supplied deployment target.
|
|
39
|
+
* @property {string} displayName - Validated display name.
|
|
40
|
+
* @property {"Sources"} sourceRoot - Generated-source root.
|
|
41
|
+
* @property {"Assets.xcassets"} resourceRoot - Caller-resource root.
|
|
42
|
+
* @property {"swiftui"} lifecycle - Sole supported lifecycle.
|
|
43
|
+
* @property {Readonly<Record<string, never>>} infoPlist - Empty caller plist extension.
|
|
44
|
+
* @property {readonly never[]} permissions - Empty baseline permissions.
|
|
45
|
+
* @property {readonly never[]} entitlements - Empty baseline entitlements.
|
|
46
|
+
* @property {readonly never[]} privacyDeclarations - Empty baseline privacy declarations.
|
|
47
|
+
* @property {readonly never[]} capabilities - Empty baseline Apple capabilities.
|
|
48
|
+
*/
|
|
49
|
+
/**
|
|
50
|
+
* @typedef IosApplicationAssetInput
|
|
51
|
+
* @property {string} path - Full safe destination below Assets.xcassets.
|
|
52
|
+
* @property {string | Uint8Array} content - Exact caller-provided text or bytes.
|
|
53
|
+
* @property {string} mediaType - Explicit artifact media type.
|
|
54
|
+
* @property {string} sha256 - Lowercase SHA-256 of exact UTF-8 text or bytes.
|
|
55
|
+
*/
|
|
56
|
+
/**
|
|
57
|
+
* @typedef AndroidApplicationConfigurationInput
|
|
58
|
+
* @property {string} [applicationId] - Lowercase reverse-DNS Android application identity.
|
|
59
|
+
* @property {string} [namespace] - Kotlin/Android namespace; defaults to applicationId.
|
|
60
|
+
* @property {string} [packageName] - Generated Kotlin package; defaults to namespace.
|
|
61
|
+
* @property {string} [activityClassName] - Launcher Activity class name.
|
|
62
|
+
* @property {string} [productName] - Deterministic project product name.
|
|
63
|
+
* @property {string} [displayName] - User-visible application label.
|
|
64
|
+
* @property {23} [minimumSdk] - Qualified minimum Android API.
|
|
65
|
+
* @property {35} [targetSdk] - Qualified target Android API.
|
|
66
|
+
* @property {35} [compileSdk] - Qualified compile Android API.
|
|
67
|
+
* @property {"35.0.0"} [buildToolsVersion] - Qualified Android Build Tools version.
|
|
68
|
+
* @property {number} [versionCode] - Positive Android version code.
|
|
69
|
+
* @property {string} [versionName] - Canonical application version name.
|
|
70
|
+
* @property {"unspecified"} [orientation] - Baseline orientation behavior.
|
|
71
|
+
* @property {"system"} [theme] - Baseline platform-native theme.
|
|
72
|
+
* @property {unknown[]} [permissions] - Validated as the closed empty permission set.
|
|
73
|
+
*/
|
|
74
|
+
/**
|
|
75
|
+
* @typedef AndroidApplicationConfiguration
|
|
76
|
+
* @property {string} applicationId - Validated Android application identity.
|
|
77
|
+
* @property {string} namespace - Validated Android namespace.
|
|
78
|
+
* @property {string} packageName - Generated Kotlin package.
|
|
79
|
+
* @property {string} activityClassName - Launcher Activity class name.
|
|
80
|
+
* @property {string} productName - Project product name.
|
|
81
|
+
* @property {string} displayName - User-visible application label.
|
|
82
|
+
* @property {23} minimumSdk - Qualified minimum Android API.
|
|
83
|
+
* @property {35} targetSdk - Qualified target Android API.
|
|
84
|
+
* @property {35} compileSdk - Qualified compile Android API.
|
|
85
|
+
* @property {"35.0.0"} buildToolsVersion - Qualified Android Build Tools version.
|
|
86
|
+
* @property {number} versionCode - Positive Android version code.
|
|
87
|
+
* @property {string} versionName - Canonical application version name.
|
|
88
|
+
* @property {"unspecified"} orientation - Baseline orientation behavior.
|
|
89
|
+
* @property {"system"} theme - Platform-native theme.
|
|
90
|
+
*/
|
|
91
|
+
/**
|
|
92
|
+
* @typedef AndroidApplicationInputFile
|
|
93
|
+
* @property {string} path - Safe path relative to the selected fixed Android resource or asset root.
|
|
94
|
+
* @property {string | Uint8Array} content - Exact caller-provided text or bytes.
|
|
95
|
+
* @property {string} mediaType - Explicit artifact media type.
|
|
96
|
+
* @property {string} sha256 - Lowercase SHA-256 of exact UTF-8 text or bytes.
|
|
97
|
+
*/
|
|
10
98
|
/**
|
|
11
99
|
* @typedef LanguageRoleCapabilities
|
|
12
100
|
* @property {boolean} frontend - Parser adapter availability.
|
|
@@ -14,6 +102,7 @@
|
|
|
14
102
|
* @property {boolean} binaryBackend - Binary backend availability.
|
|
15
103
|
* @property {boolean} applicationBackend - Application-artifact backend availability.
|
|
16
104
|
* @property {boolean} interoperability - Interoperability bridge availability.
|
|
105
|
+
* @property {boolean} provider - Target host stdlib provider/native-binding availability.
|
|
17
106
|
*/
|
|
18
107
|
/**
|
|
19
108
|
* @typedef LanguageMappingCapabilities
|
|
@@ -26,12 +115,27 @@
|
|
|
26
115
|
* @property {readonly AcceptanceStage[]} stages - Applicable ordered acceptance stages.
|
|
27
116
|
* @property {readonly string[]} toolchains - Required canonical toolchain IDs.
|
|
28
117
|
*/
|
|
118
|
+
/**
|
|
119
|
+
* @typedef LanguageFeatureCapabilities
|
|
120
|
+
* @property {boolean} generalFunctionsAndCalls - Task 005 arbitrary required signatures, resolved direct calls, and void functions.
|
|
121
|
+
* @property {boolean} immutableCollections - Task 006 recursive immutable lists/maps, total access, and size.
|
|
122
|
+
* @property {boolean} optionalValues - Task 007 explicit optional values, presence tests, and guarded unwrap.
|
|
123
|
+
* @property {boolean} orderedListIteration - Task 008 ordered immutable-list iteration and nearest-loop control.
|
|
124
|
+
* @property {boolean} orderedMapIteration - Task 014 insertion-ordered immutable-map pair iteration.
|
|
125
|
+
* @property {boolean} conditionControlledLoops - Task 032 strict-Boolean pre-condition loops and resolved control.
|
|
126
|
+
* @property {boolean} closedRecords - Task 009 nominal closed immutable records, construction, and member reads.
|
|
127
|
+
* @property {boolean} typedErrors - Task 011 nominal unchecked errors, raises, and exact typed catches.
|
|
128
|
+
* @property {boolean} typeParametersAndGenerics - Task 012 invariant unbounded type parameters and closed generic applications.
|
|
129
|
+
* @property {boolean} referenceClasses - Task 033 nominal reference classes, private instance state, exact constructors, and receiver methods.
|
|
130
|
+
* @property {boolean} effectfulCapabilitiesAndResources - Task 034 authorized host effects, typed failures, and owned resources.
|
|
131
|
+
*/
|
|
29
132
|
/**
|
|
30
133
|
* @typedef LanguageCapabilities
|
|
31
134
|
* @property {string} id - Stable registry identity.
|
|
32
135
|
* @property {Readonly<LanguageRoleCapabilities>} roles - Independently registered roles.
|
|
33
136
|
* @property {"single" | "multiple"} artifactMultiplicity - Target artifact multiplicity.
|
|
34
137
|
* @property {boolean} roundTrip - Whether frontend/backend round-trip acceptance is declared.
|
|
138
|
+
* @property {Readonly<LanguageFeatureCapabilities>} features - Semantic feature capabilities.
|
|
35
139
|
* @property {Readonly<LanguageMappingCapabilities>} mapping - Mapping forms.
|
|
36
140
|
* @property {Readonly<LanguageAcceptanceCapabilities>} acceptance - Stages and toolchains.
|
|
37
141
|
*/
|
|
@@ -53,6 +157,7 @@
|
|
|
53
157
|
* @property {string} filename - Original filename, preserved verbatim.
|
|
54
158
|
* @property {string | null} content - Original source content, preserved verbatim when available.
|
|
55
159
|
* @property {SemanticLanguage | null} language - Parser language when known.
|
|
160
|
+
* @property {"application" | "facade"} [ownership] - Caller or compiler-owned source role for semantic programs.
|
|
56
161
|
*/
|
|
57
162
|
/**
|
|
58
163
|
* @typedef SourceOrigin
|
|
@@ -124,6 +229,7 @@
|
|
|
124
229
|
* @property {string} name - Semantic symbol name.
|
|
125
230
|
* @property {SemanticSymbolKind} kind - Symbol category.
|
|
126
231
|
* @property {string} declarationNodeId - Declaring node identity.
|
|
232
|
+
* @property {string} [semanticDeclarationId] - Stable semantic declaration identity for record, field, and function symbols.
|
|
127
233
|
* @property {SourceLocation} location - Exact declaration-name range.
|
|
128
234
|
* @property {SemanticSymbolReference[]} references - Ordered resolved references.
|
|
129
235
|
*/
|
|
@@ -150,7 +256,7 @@
|
|
|
150
256
|
/**
|
|
151
257
|
* @typedef GeneratedSource
|
|
152
258
|
* @property {string} filename - Output filename.
|
|
153
|
-
* @property {
|
|
259
|
+
* @property {GeneratedTextLanguage} language - Output text language.
|
|
154
260
|
* @property {string} content - Exact generated LF source.
|
|
155
261
|
*/
|
|
156
262
|
/**
|
|
@@ -209,6 +315,7 @@
|
|
|
209
315
|
* @property {string} target - Stable language or target ID.
|
|
210
316
|
* @property {string} entry - Path of the sole declared entry artifact.
|
|
211
317
|
* @property {readonly GeneratedSetArtifact[]} artifacts - Deterministic artifact order.
|
|
318
|
+
* @property {Readonly<Record<string, unknown>>} [metadata] - Detached target-specific JSON metadata.
|
|
212
319
|
*/
|
|
213
320
|
/**
|
|
214
321
|
* @typedef DiscoveredToolchain
|
|
@@ -216,8 +323,8 @@
|
|
|
216
323
|
* @property {string} command - Documented canonical command.
|
|
217
324
|
* @property {string} executable - Exact absolute executable path.
|
|
218
325
|
* @property {"override" | "canonical"} source - Resolution route.
|
|
219
|
-
* @property {string} version - First
|
|
220
|
-
* @property {string} versionOutput - Complete
|
|
326
|
+
* @property {string} version - First selected-stream version line.
|
|
327
|
+
* @property {string} versionOutput - Complete normalized stdout, or normalized stderr when stdout is empty.
|
|
221
328
|
* @property {readonly string[]} versionArguments - Exact version argument array.
|
|
222
329
|
*/
|
|
223
330
|
/**
|
|
@@ -238,14 +345,255 @@
|
|
|
238
345
|
/**
|
|
239
346
|
* @typedef TypeReference
|
|
240
347
|
* @property {"TypeReference"} kind - Node discriminator.
|
|
241
|
-
* @property {SemanticTypeName} name - Normalized type name.
|
|
348
|
+
* @property {SemanticTypeName} name - Normalized scalar value type name.
|
|
242
349
|
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance that survives semantic transforms.
|
|
243
350
|
*/
|
|
351
|
+
/**
|
|
352
|
+
* @typedef TypeParameter
|
|
353
|
+
* @property {"TypeParameter"} kind - Declaration-scoped invariant unbounded type parameter.
|
|
354
|
+
* @property {string} [id] - Stable declaration-scoped identity, required after validation.
|
|
355
|
+
* @property {string} name - Source-visible type parameter name.
|
|
356
|
+
* @property {SourceLocation} location - Parser-owned declaration location.
|
|
357
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned declaration-name range.
|
|
358
|
+
*/
|
|
359
|
+
/**
|
|
360
|
+
* @typedef TypeVariableReference
|
|
361
|
+
* @property {"TypeVariableReference"} kind - Reference to one declaration-scoped type parameter.
|
|
362
|
+
* @property {string} parameterId - Stable referenced type-parameter identity.
|
|
363
|
+
* @property {SourceLocation} location - Parser-owned reference location.
|
|
364
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type-name range.
|
|
365
|
+
*/
|
|
366
|
+
/**
|
|
367
|
+
* @typedef ListType
|
|
368
|
+
* @property {"ListType"} kind - Recursive list-type discriminator.
|
|
369
|
+
* @property {SemanticValueType} elementType - Homogeneous element type.
|
|
370
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned outer and argument ranges.
|
|
371
|
+
*/
|
|
372
|
+
/**
|
|
373
|
+
* @typedef MapType
|
|
374
|
+
* @property {"MapType"} kind - Recursive map-type discriminator.
|
|
375
|
+
* @property {TypeReference} keyType - Exact string key type.
|
|
376
|
+
* @property {SemanticValueType} valueType - Homogeneous value type.
|
|
377
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned outer and argument ranges.
|
|
378
|
+
*/
|
|
379
|
+
/**
|
|
380
|
+
* @typedef OrderedMapType
|
|
381
|
+
* @property {"OrderedMapType"} kind - Distinct insertion-ordered map-type discriminator.
|
|
382
|
+
* @property {TypeReference} keyType - Exact supported string key type.
|
|
383
|
+
* @property {SemanticValueType} valueType - Homogeneous value type.
|
|
384
|
+
* @property {"insertion"} order - Canonical first-insertion encounter order.
|
|
385
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned outer and argument ranges.
|
|
386
|
+
*/
|
|
387
|
+
/**
|
|
388
|
+
* @typedef OptionalType
|
|
389
|
+
* @property {"OptionalType"} kind - Explicit presence/absence type discriminator.
|
|
390
|
+
* @property {SemanticValueType} valueType - Exact present-value type.
|
|
391
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned outer and constituent ranges.
|
|
392
|
+
*/
|
|
393
|
+
/**
|
|
394
|
+
* @typedef RecordType
|
|
395
|
+
* @property {"RecordType"} kind - Nominal record-type discriminator.
|
|
396
|
+
* @property {string} declarationId - Stable module-local record declaration identity.
|
|
397
|
+
* @property {SemanticValueType[]} [arguments] - Exact invariant type arguments; required for generic declarations and absent for non-generic declarations.
|
|
398
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type-name range.
|
|
399
|
+
*/
|
|
400
|
+
/**
|
|
401
|
+
* @typedef ErrorType
|
|
402
|
+
* @property {"ErrorType"} kind - Nominal unchecked-error type discriminator.
|
|
403
|
+
* @property {string} declarationId - Stable error declaration identity.
|
|
404
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type-name range.
|
|
405
|
+
*/
|
|
406
|
+
/**
|
|
407
|
+
* @typedef ReferenceType
|
|
408
|
+
* @property {"ReferenceType"} kind - Nominal reference-class type discriminator.
|
|
409
|
+
* @property {string} declarationId - Stable module-local class declaration identity.
|
|
410
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type-name range.
|
|
411
|
+
*/
|
|
412
|
+
/**
|
|
413
|
+
* @typedef OwnedResourceType
|
|
414
|
+
* @property {"OwnedResourceType"} kind - Compiler-owned linear resource type.
|
|
415
|
+
* @property {string} resourceId - Exact authority resource declaration identity.
|
|
416
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type-name range.
|
|
417
|
+
*/
|
|
418
|
+
/**
|
|
419
|
+
* @typedef OwnedReferenceType
|
|
420
|
+
* @property {"OwnedReferenceType"} kind - Linear reference that owns one protected resource.
|
|
421
|
+
* @property {string} declarationId - Exact owned class declaration identity.
|
|
422
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type-name range.
|
|
423
|
+
*/
|
|
424
|
+
/** @typedef {TypeReference | TypeVariableReference | ListType | MapType | OrderedMapType | OptionalType | RecordType | ReferenceType | OwnedResourceType | OwnedReferenceType} SemanticValueType */
|
|
425
|
+
/** @typedef {SemanticValueType | ErrorType} SemanticBindingType */
|
|
426
|
+
/**
|
|
427
|
+
* @typedef FunctionReturnTypeReference
|
|
428
|
+
* @property {"TypeReference"} kind - Void return discriminator.
|
|
429
|
+
* @property {"void"} name - Normalized non-value function return.
|
|
430
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance that survives semantic transforms.
|
|
431
|
+
*/
|
|
432
|
+
/** @typedef {SemanticValueType | FunctionReturnTypeReference} SemanticFunctionReturnType */
|
|
433
|
+
/** @typedef {SemanticTypeName | {kind: "TypeVariableReference", parameterId: string} | {kind: "ListType", elementType: SemanticTypeIdentity} | {kind: "MapType", keyType: SemanticTypeIdentity, valueType: SemanticTypeIdentity} | {kind: "OrderedMapType", keyType: SemanticTypeIdentity, valueType: SemanticTypeIdentity, order: "insertion"} | {kind: "OptionalType", valueType: SemanticTypeIdentity} | {kind: "RecordType", declarationId: string, arguments?: SemanticTypeIdentity[]} | {kind: "ReferenceType", declarationId: string} | {kind: "OwnedResourceType", resourceId: string} | {kind: "OwnedReferenceType", declarationId: string}} SemanticTypeIdentity */
|
|
434
|
+
/** @typedef {SemanticTypeIdentity | "void"} FunctionReturnTypeIdentity */
|
|
435
|
+
/**
|
|
436
|
+
* @typedef ResolvedFunctionSignature
|
|
437
|
+
* @property {"ResolvedFunctionSignature"} kind - Resolution discriminator.
|
|
438
|
+
* @property {string} declarationId - Deterministic module-local declaration identity.
|
|
439
|
+
* @property {SemanticTypeIdentity[]} parameterTypes - Exact required positional parameter types.
|
|
440
|
+
* @property {FunctionReturnTypeIdentity} returnType - Exact resolved return type.
|
|
441
|
+
* @property {SemanticTypeIdentity[]} [typeArguments] - Inferred declaration-order type arguments for a generic call.
|
|
442
|
+
*/
|
|
244
443
|
/**
|
|
245
444
|
* @typedef Parameter
|
|
246
445
|
* @property {"Parameter"} kind - Node discriminator.
|
|
247
446
|
* @property {string} name - Parameter name.
|
|
248
|
-
* @property {
|
|
447
|
+
* @property {SemanticValueType} type - Parameter type.
|
|
448
|
+
* @property {SourceLocation} location - Source location.
|
|
449
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
450
|
+
*/
|
|
451
|
+
/**
|
|
452
|
+
* @typedef ResolvedEffectOperationSignature
|
|
453
|
+
* @property {"ResolvedEffectOperationSignature"} kind - Resolution discriminator.
|
|
454
|
+
* @property {string} capabilityId - Exact capability declaration identity.
|
|
455
|
+
* @property {string} operationId - Exact operation declaration identity.
|
|
456
|
+
* @property {SemanticTypeIdentity[]} parameterTypes - Exact ordered parameter types.
|
|
457
|
+
* @property {FunctionReturnTypeIdentity} returnType - Exact operation result.
|
|
458
|
+
* @property {readonly ["host"]} effects - Closed initial effect set.
|
|
459
|
+
* @property {string[]} failureIds - Exact ordered declared failures.
|
|
460
|
+
* @property {EffectResourceFlow} resourceFlow - Exact ownership transition.
|
|
461
|
+
*/
|
|
462
|
+
/**
|
|
463
|
+
* @typedef OwnedMoveExpression
|
|
464
|
+
* @property {"OwnedMoveExpression"} kind - Explicit linear ownership transfer.
|
|
465
|
+
* @property {IdentifierExpression} expression - Moved owner.
|
|
466
|
+
* @property {OwnedResourceType | OwnedReferenceType} type - Exact owned type.
|
|
467
|
+
* @property {SourceLocation} location - Exact transfer location.
|
|
468
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Derived source provenance.
|
|
469
|
+
*/
|
|
470
|
+
/**
|
|
471
|
+
* @typedef OwnedBorrowExpression
|
|
472
|
+
* @property {"OwnedBorrowExpression"} kind - Immediate nonescaping resource borrow.
|
|
473
|
+
* @property {"shared" | "exclusive"} mode - Borrow mode.
|
|
474
|
+
* @property {IdentifierExpression | ReceiverExpression | PrivateFieldRead} expression - Borrowed place.
|
|
475
|
+
* @property {OwnedResourceType | OwnedReferenceType} type - Exact owned type.
|
|
476
|
+
* @property {SourceLocation} location - Exact borrow location.
|
|
477
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Derived source provenance.
|
|
478
|
+
*/
|
|
479
|
+
/**
|
|
480
|
+
* @typedef EffectCallExpression
|
|
481
|
+
* @property {"EffectCallExpression"} kind - Compiler-authorized effect invocation.
|
|
482
|
+
* @property {string} operation - Exact operation declaration identity.
|
|
483
|
+
* @property {Expression[]} arguments - Source-ordered arguments.
|
|
484
|
+
* @property {string} effectSiteId - Deterministic semantic evaluation identity.
|
|
485
|
+
* @property {ResolvedEffectOperationSignature} resolution - Complete authority resolution.
|
|
486
|
+
* @property {SourceLocation} location - Complete call location.
|
|
487
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned operation-name range.
|
|
488
|
+
*/
|
|
489
|
+
/**
|
|
490
|
+
* @typedef EffectParameter
|
|
491
|
+
* @property {string} name - Stable parameter name.
|
|
492
|
+
* @property {SemanticValueType} type - Exact ordered parameter type.
|
|
493
|
+
*/
|
|
494
|
+
/** @typedef {{kind: "none"} | {kind: "acquire", resourceId: string} | {kind: "borrow" | "close", parameterIndex: number, terminalFailureId: string}} EffectResourceFlow */
|
|
495
|
+
/**
|
|
496
|
+
* @typedef EffectResourceDeclaration
|
|
497
|
+
* @property {"EffectResourceDeclaration"} kind - Capability resource declaration.
|
|
498
|
+
* @property {string} id - Deterministic authority-local identity.
|
|
499
|
+
* @property {string} name - Source-visible nominal resource name.
|
|
500
|
+
*/
|
|
501
|
+
/**
|
|
502
|
+
* @typedef EffectFailureDeclaration
|
|
503
|
+
* @property {"EffectFailureDeclaration"} kind - Capability failure declaration.
|
|
504
|
+
* @property {string} id - Deterministic authority-local identity.
|
|
505
|
+
* @property {string} name - Source-visible nominal failure name.
|
|
506
|
+
*/
|
|
507
|
+
/**
|
|
508
|
+
* @typedef EffectOperationDeclaration
|
|
509
|
+
* @property {"EffectOperationDeclaration"} kind - Compiler-authorized operation declaration.
|
|
510
|
+
* @property {string} id - Deterministic authority-local identity.
|
|
511
|
+
* @property {string} name - Source-visible operation name.
|
|
512
|
+
* @property {EffectParameter[]} parameters - Exact positional parameters.
|
|
513
|
+
* @property {SemanticFunctionReturnType} returnType - Exact result type.
|
|
514
|
+
* @property {readonly ["host"]} effects - Closed initial effect set.
|
|
515
|
+
* @property {string[]} failureIds - Ordered nominal failure identities.
|
|
516
|
+
* @property {EffectResourceFlow} resourceFlow - Exact ownership transition.
|
|
517
|
+
*/
|
|
518
|
+
/**
|
|
519
|
+
* @typedef EffectCapabilityDeclaration
|
|
520
|
+
* @property {"EffectCapabilityDeclaration"} kind - Authorized capability declaration.
|
|
521
|
+
* @property {string} id - Deterministic module-local identity.
|
|
522
|
+
* @property {string} authorityId - Opaque authority identity.
|
|
523
|
+
* @property {string} name - Capability name.
|
|
524
|
+
* @property {EffectResourceDeclaration[]} resources - Ordered resources.
|
|
525
|
+
* @property {EffectFailureDeclaration[]} failures - Ordered failures.
|
|
526
|
+
* @property {EffectOperationDeclaration[]} operations - Ordered operations.
|
|
527
|
+
*/
|
|
528
|
+
/**
|
|
529
|
+
* @typedef CapabilityAuthority
|
|
530
|
+
* @property {"SemantifoldCapabilityAuthority"} schema - Authority schema discriminator.
|
|
531
|
+
* @property {1 | 2} schemaVersion - Authority payload version, not a standard-library contract version.
|
|
532
|
+
* @property {string} id - Opaque caller-supplied authority identity.
|
|
533
|
+
* @property {EffectCapabilityDeclaration[]} capabilities - Normalized declarations.
|
|
534
|
+
* @property {string} [contractVersion] - Declared standard-library contract version, present only when the caller supplied one.
|
|
535
|
+
* @property {{identity: string, contractVersion: string, capabilities: EffectCapabilityDeclaration[]}[]} [modules] - Schema-v2 canonical module authorities.
|
|
536
|
+
*/
|
|
537
|
+
/** @typedef {{module: string, name: string}} CapabilityDeclarationReferenceInput */
|
|
538
|
+
/** @typedef {{name: string, type: SemanticTypeName | {kind: "OwnedResourceType", resource: string | CapabilityDeclarationReferenceInput} | {kind: "OptionalType", valueType: SemanticTypeName}}} CapabilityParameterInput */
|
|
539
|
+
/** @typedef {{name: string}} CapabilityNamedInput */
|
|
540
|
+
/** @typedef {{kind: "none"} | {kind: "acquire", resource: string | CapabilityDeclarationReferenceInput} | {kind: "borrow" | "close", parameterIndex: number, terminalFailure: string | CapabilityDeclarationReferenceInput}} CapabilityResourceFlowInput */
|
|
541
|
+
/** @typedef {{name: string, parameters: CapabilityParameterInput[], returnType: FunctionReturnTypeName | {kind: "OwnedResourceType", resource: string | CapabilityDeclarationReferenceInput} | {kind: "OptionalType", valueType: SemanticTypeName}, effects: ["host"], failures: (string | CapabilityDeclarationReferenceInput)[], resourceFlow: CapabilityResourceFlowInput}} CapabilityOperationInput */
|
|
542
|
+
/** @typedef {{name: string, resources: CapabilityNamedInput[], failures: CapabilityNamedInput[], operations: CapabilityOperationInput[]}} CapabilityDeclarationInput */
|
|
543
|
+
/** @typedef {{identity: string, contractVersion: string, capabilities: CapabilityDeclarationInput[]}} CapabilityAuthorityModuleInput */
|
|
544
|
+
/** @typedef {{schema: "SemantifoldCapabilityAuthority", schemaVersion: 1, id: string, capabilities: CapabilityDeclarationInput[], contractVersion?: string} | {schema: "SemantifoldCapabilityAuthority", schemaVersion: 2, id: string, modules: CapabilityAuthorityModuleInput[]}} CapabilityAuthorityInput */
|
|
545
|
+
/**
|
|
546
|
+
* @typedef ListLiteral
|
|
547
|
+
* @property {"ListLiteral"} kind - Ordered immutable list literal.
|
|
548
|
+
* @property {Expression[]} elements - Source-ordered, duplicate-preserving elements.
|
|
549
|
+
* @property {SourceLocation} location - Source location.
|
|
550
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
551
|
+
*/
|
|
552
|
+
/**
|
|
553
|
+
* @typedef MapEntry
|
|
554
|
+
* @property {"MapEntry"} kind - Source-ordered map initializer entry.
|
|
555
|
+
* @property {StringLiteral} key - Literal nonnumeric string key.
|
|
556
|
+
* @property {Expression} value - Entry value.
|
|
557
|
+
* @property {SourceLocation} location - Source location.
|
|
558
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
559
|
+
*/
|
|
560
|
+
/**
|
|
561
|
+
* @typedef MapLiteral
|
|
562
|
+
* @property {"MapLiteral"} kind - Immutable map literal; entry order is diagnostic-only.
|
|
563
|
+
* @property {MapEntry[]} entries - Source initializer order.
|
|
564
|
+
* @property {SourceLocation} location - Source location.
|
|
565
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
566
|
+
*/
|
|
567
|
+
/**
|
|
568
|
+
* @typedef OrderedMapLiteral
|
|
569
|
+
* @property {"OrderedMapLiteral"} kind - Immutable map literal with observable first-insertion order.
|
|
570
|
+
* @property {MapEntry[]} entries - Source-ordered unique entries.
|
|
571
|
+
* @property {SourceLocation} location - Complete ordered construction boundary.
|
|
572
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
573
|
+
*/
|
|
574
|
+
/**
|
|
575
|
+
* @typedef ListIndexExpression
|
|
576
|
+
* @property {"ListIndexExpression"} kind - Total zero-based list index.
|
|
577
|
+
* @property {Expression} collection - List-valued receiver.
|
|
578
|
+
* @property {Expression} index - Integer index.
|
|
579
|
+
* @property {"proven" | "fail-on-absence"} totality - Admission basis; never optional.
|
|
580
|
+
* @property {SourceLocation} location - Source location.
|
|
581
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
582
|
+
*/
|
|
583
|
+
/**
|
|
584
|
+
* @typedef MapLookupExpression
|
|
585
|
+
* @property {"MapLookupExpression"} kind - Total string-key map lookup.
|
|
586
|
+
* @property {Expression} collection - Map-valued receiver.
|
|
587
|
+
* @property {Expression} key - String key expression.
|
|
588
|
+
* @property {"proven" | "fail-on-absence"} totality - Admission basis; never optional.
|
|
589
|
+
* @property {SourceLocation} location - Source location.
|
|
590
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
591
|
+
*/
|
|
592
|
+
/**
|
|
593
|
+
* @typedef CollectionSizeExpression
|
|
594
|
+
* @property {"CollectionSizeExpression"} kind - Finite collection size.
|
|
595
|
+
* @property {Expression} collection - List- or map-valued receiver.
|
|
596
|
+
* @property {"list" | "map"} [collectionKind] - Validated receiver kind for target spelling.
|
|
249
597
|
* @property {SourceLocation} location - Source location.
|
|
250
598
|
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
251
599
|
*/
|
|
@@ -277,6 +625,33 @@
|
|
|
277
625
|
* @property {SourceLocation} location - Source location.
|
|
278
626
|
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
279
627
|
*/
|
|
628
|
+
/**
|
|
629
|
+
* @typedef OptionalNone
|
|
630
|
+
* @property {"OptionalNone"} kind - Contextually typed absence value.
|
|
631
|
+
* @property {SourceLocation} location - Source location.
|
|
632
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
633
|
+
*/
|
|
634
|
+
/**
|
|
635
|
+
* @typedef OptionalSome
|
|
636
|
+
* @property {"OptionalSome"} kind - Explicit present optional value.
|
|
637
|
+
* @property {Expression} value - Exact non-optional present value.
|
|
638
|
+
* @property {SourceLocation} location - Source location.
|
|
639
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
640
|
+
*/
|
|
641
|
+
/**
|
|
642
|
+
* @typedef OptionalIsPresent
|
|
643
|
+
* @property {"OptionalIsPresent"} kind - Presence test for one simple identifier.
|
|
644
|
+
* @property {IdentifierExpression} operand - Tested optional binding.
|
|
645
|
+
* @property {SourceLocation} location - Source location.
|
|
646
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
647
|
+
*/
|
|
648
|
+
/**
|
|
649
|
+
* @typedef OptionalUnwrap
|
|
650
|
+
* @property {"OptionalUnwrap"} kind - Guarded unwrap of one simple identifier.
|
|
651
|
+
* @property {IdentifierExpression} operand - Proven-present optional binding.
|
|
652
|
+
* @property {SourceLocation} location - Source location.
|
|
653
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
654
|
+
*/
|
|
280
655
|
/**
|
|
281
656
|
* @typedef UnaryExpression
|
|
282
657
|
* @property {"UnaryExpression"} kind - Node discriminator.
|
|
@@ -301,15 +676,96 @@
|
|
|
301
676
|
* @property {"CallExpression"} kind - Node discriminator.
|
|
302
677
|
* @property {string} callee - Function name.
|
|
303
678
|
* @property {Expression[]} arguments - Positional arguments.
|
|
679
|
+
* @property {ResolvedFunctionSignature} [resolution] - Deterministic declaration and signature binding, required after frontend validation.
|
|
680
|
+
* @property {string} [effectSiteId] - Deterministic site identity when the resolved function reaches a host effect.
|
|
681
|
+
* @property {readonly ["host"]} [effects] - Inferred checked host-effect fact.
|
|
682
|
+
* @property {string[]} [failureIds] - Ordered capability failures reachable through this call.
|
|
304
683
|
* @property {SourceLocation} location - Source location.
|
|
305
684
|
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
306
685
|
*/
|
|
307
|
-
/**
|
|
686
|
+
/**
|
|
687
|
+
* @typedef ResolvedConstructorSignature
|
|
688
|
+
* @property {"ResolvedConstructorSignature"} kind - Resolution discriminator.
|
|
689
|
+
* @property {string} declarationId - Exact constructor declaration identity.
|
|
690
|
+
* @property {SemanticTypeIdentity[]} parameterTypes - Exact constructor parameter types.
|
|
691
|
+
*/
|
|
692
|
+
/**
|
|
693
|
+
* @typedef ResolvedMethodSignature
|
|
694
|
+
* @property {"ResolvedMethodSignature"} kind - Resolution discriminator.
|
|
695
|
+
* @property {string} declarationId - Exact resolved method identity.
|
|
696
|
+
* @property {SemanticTypeIdentity[]} parameterTypes - Exact method parameter types.
|
|
697
|
+
* @property {FunctionReturnTypeIdentity} returnType - Exact method return type.
|
|
698
|
+
* @property {{kind: "preserve" | "terminal", terminalFailureId?: string}} [resourceFlow] - Owned receiver transition and declared terminal-use failure when applicable.
|
|
699
|
+
*/
|
|
700
|
+
/**
|
|
701
|
+
* @typedef ReceiverExpression
|
|
702
|
+
* @property {"ReceiverExpression"} kind - The declaring class instance receiver.
|
|
703
|
+
* @property {string} classId - Stable declaring class identity.
|
|
704
|
+
* @property {SourceLocation} location - Source receiver location.
|
|
705
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned receiver range.
|
|
706
|
+
*/
|
|
707
|
+
/**
|
|
708
|
+
* @typedef ReferenceConstruction
|
|
709
|
+
* @property {"ReferenceConstruction"} kind - Fresh nominal reference construction.
|
|
710
|
+
* @property {ReferenceType | OwnedReferenceType} reference - Exact class type.
|
|
711
|
+
* @property {Expression[]} arguments - Source-ordered constructor arguments.
|
|
712
|
+
* @property {ResolvedConstructorSignature} [resolution] - Exact constructor binding, required after validation.
|
|
713
|
+
* @property {string} [effectSiteId] - Deterministic site identity when construction reaches a host effect.
|
|
714
|
+
* @property {readonly ["host"]} [effects] - Inferred checked host-effect fact.
|
|
715
|
+
* @property {string[]} [failureIds] - Ordered capability failures reachable through construction.
|
|
716
|
+
* @property {SourceLocation} location - Complete construction location.
|
|
717
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned class-name range.
|
|
718
|
+
*/
|
|
719
|
+
/**
|
|
720
|
+
* @typedef MethodCallExpression
|
|
721
|
+
* @property {"MethodCallExpression"} kind - Resolved receiver-method invocation.
|
|
722
|
+
* @property {Expression} receiver - Receiver evaluated once before arguments.
|
|
723
|
+
* @property {string} method - Stable method identity after validation.
|
|
724
|
+
* @property {Expression[]} arguments - Source-ordered arguments.
|
|
725
|
+
* @property {ResolvedMethodSignature} [resolution] - Exact method binding, required after validation.
|
|
726
|
+
* @property {string} [effectSiteId] - Deterministic site identity when the method reaches a host effect.
|
|
727
|
+
* @property {readonly ["host"]} [effects] - Inferred checked host-effect fact.
|
|
728
|
+
* @property {string[]} [failureIds] - Ordered capability failures reachable through the method.
|
|
729
|
+
* @property {SourceLocation} location - Complete call location.
|
|
730
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned method-name range.
|
|
731
|
+
*/
|
|
732
|
+
/**
|
|
733
|
+
* @typedef PrivateFieldRead
|
|
734
|
+
* @property {"PrivateFieldRead"} kind - Declaring-receiver-only private field read.
|
|
735
|
+
* @property {ReceiverExpression} receiver - Exact declaring receiver.
|
|
736
|
+
* @property {string} field - Stable private field identity.
|
|
737
|
+
* @property {SourceLocation} location - Complete read location.
|
|
738
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned field-name range.
|
|
739
|
+
*/
|
|
740
|
+
/**
|
|
741
|
+
* @typedef RecordConstruction
|
|
742
|
+
* @property {"RecordConstruction"} kind - Nominal record construction.
|
|
743
|
+
* @property {RecordType} record - Resolved record declaration identity.
|
|
744
|
+
* @property {Expression[]} arguments - Complete field-ordered constructor arguments.
|
|
745
|
+
* @property {SourceLocation} location - Complete construction source location.
|
|
746
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned record-name range.
|
|
747
|
+
*/
|
|
748
|
+
/**
|
|
749
|
+
* @typedef MemberRead
|
|
750
|
+
* @property {"MemberRead"} kind - Nominal immutable record-field read.
|
|
751
|
+
* @property {Expression} receiver - Record-valued receiver.
|
|
752
|
+
* @property {string} field - Stable resolved field identity after frontend validation.
|
|
753
|
+
* @property {SourceLocation} location - Complete member-read source location.
|
|
754
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned member-name range.
|
|
755
|
+
*/
|
|
756
|
+
/**
|
|
757
|
+
* @typedef ErrorMessageRead
|
|
758
|
+
* @property {"ErrorMessageRead"} kind - The sole portable error member operation.
|
|
759
|
+
* @property {IdentifierExpression} receiver - Catch binding whose immutable message is read.
|
|
760
|
+
* @property {SourceLocation} location - Complete message-read source location.
|
|
761
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned message-member range.
|
|
762
|
+
*/
|
|
763
|
+
/** @typedef {IdentifierExpression | ReceiverExpression | IntegerLiteral | BooleanLiteral | StringLiteral | OptionalNone | OptionalSome | OptionalIsPresent | OptionalUnwrap | ListLiteral | MapLiteral | OrderedMapLiteral | ListIndexExpression | MapLookupExpression | CollectionSizeExpression | UnaryExpression | BinaryExpression | CallExpression | EffectCallExpression | OwnedMoveExpression | OwnedBorrowExpression | MethodCallExpression | ReferenceConstruction | RecordConstruction | MemberRead | PrivateFieldRead | ErrorMessageRead} Expression */
|
|
308
764
|
/**
|
|
309
765
|
* @typedef LocalDeclaration
|
|
310
766
|
* @property {"LocalDeclaration"} kind - Node discriminator.
|
|
311
767
|
* @property {string} name - Declared local name.
|
|
312
|
-
* @property {
|
|
768
|
+
* @property {SemanticValueType} type - Explicit local type.
|
|
313
769
|
* @property {boolean} mutable - Whether later assignment is allowed.
|
|
314
770
|
* @property {Expression} initializer - Required initializer expression.
|
|
315
771
|
* @property {SourceLocation} location - Declaration source location.
|
|
@@ -323,10 +779,26 @@
|
|
|
323
779
|
* @property {SourceLocation} location - Assignment source location.
|
|
324
780
|
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
325
781
|
*/
|
|
782
|
+
/**
|
|
783
|
+
* @typedef PrivateFieldWriteStatement
|
|
784
|
+
* @property {"PrivateFieldWriteStatement"} kind - Declaring-receiver-only private field mutation.
|
|
785
|
+
* @property {ReceiverExpression} receiver - Exact declaring receiver.
|
|
786
|
+
* @property {string} field - Stable private field identity.
|
|
787
|
+
* @property {Expression} expression - New field value.
|
|
788
|
+
* @property {SourceLocation} location - Assignment source location.
|
|
789
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned field-name range.
|
|
790
|
+
*/
|
|
326
791
|
/**
|
|
327
792
|
* @typedef ReturnStatement
|
|
328
793
|
* @property {"ReturnStatement"} kind - Node discriminator.
|
|
329
|
-
* @property {Expression} expression - Returned expression.
|
|
794
|
+
* @property {Expression} [expression] - Returned expression; absent exactly for a bare void return.
|
|
795
|
+
* @property {SourceLocation} location - Source location.
|
|
796
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
797
|
+
*/
|
|
798
|
+
/**
|
|
799
|
+
* @typedef ExpressionStatement
|
|
800
|
+
* @property {"ExpressionStatement"} kind - Node discriminator.
|
|
801
|
+
* @property {CallExpression | MethodCallExpression | EffectCallExpression} expression - A direct, receiver, or authorized call whose resolved return type is void.
|
|
330
802
|
* @property {SourceLocation} location - Source location.
|
|
331
803
|
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
332
804
|
*/
|
|
@@ -339,8 +811,95 @@
|
|
|
339
811
|
* @property {SourceLocation} location - Source location.
|
|
340
812
|
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
341
813
|
*/
|
|
814
|
+
/**
|
|
815
|
+
* @typedef ValueBinding
|
|
816
|
+
* @property {"ValueBinding"} kind - Iteration-binding discriminator.
|
|
817
|
+
* @property {string} name - Body-local binding name.
|
|
818
|
+
* @property {SemanticValueType} type - Exact list element type.
|
|
819
|
+
* @property {false} mutable - Iteration bindings are always immutable.
|
|
820
|
+
* @property {SourceLocation} location - Binding source location.
|
|
821
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
822
|
+
*/
|
|
823
|
+
/**
|
|
824
|
+
* @typedef ForEachStatement
|
|
825
|
+
* @property {"ForEachStatement"} kind - Ordered list-iteration discriminator.
|
|
826
|
+
* @property {string} [id] - Deterministic module-local loop identity, required after frontend validation.
|
|
827
|
+
* @property {Expression} list - List expression evaluated exactly once before traversal.
|
|
828
|
+
* @property {ValueBinding} valueBinding - Immutable binding scoped to the body.
|
|
829
|
+
* @property {Block} body - Loop body.
|
|
830
|
+
* @property {SourceLocation} location - Complete loop source location.
|
|
831
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
832
|
+
*/
|
|
833
|
+
/**
|
|
834
|
+
* @typedef ForEachMapStatement
|
|
835
|
+
* @property {"ForEachMapStatement"} kind - Insertion-ordered map pair-iteration discriminator.
|
|
836
|
+
* @property {string} [id] - Deterministic module-local loop identity, required after frontend validation.
|
|
837
|
+
* @property {Expression} map - Ordered-map expression evaluated exactly once before traversal.
|
|
838
|
+
* @property {ValueBinding} keyBinding - Immutable string-key binding scoped to the body.
|
|
839
|
+
* @property {ValueBinding} valueBinding - Immutable homogeneous value binding scoped to the body.
|
|
840
|
+
* @property {Block} body - Loop body.
|
|
841
|
+
* @property {SourceLocation} location - Complete loop source location.
|
|
842
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
843
|
+
*/
|
|
844
|
+
/**
|
|
845
|
+
* @typedef WhileStatement
|
|
846
|
+
* @property {"WhileStatement"} kind - Strict-Boolean pre-condition loop discriminator.
|
|
847
|
+
* @property {string} [id] - Deterministic module-local loop identity, required after frontend validation.
|
|
848
|
+
* @property {Expression} condition - Boolean expression evaluated before every iteration.
|
|
849
|
+
* @property {Block} body - Ordered loop body.
|
|
850
|
+
* @property {SourceLocation} location - Complete loop source location.
|
|
851
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
852
|
+
*/
|
|
853
|
+
/**
|
|
854
|
+
* @typedef BreakStatement
|
|
855
|
+
* @property {"BreakStatement"} kind - Nearest-loop break discriminator.
|
|
856
|
+
* @property {string} [targetLoopId] - Resolved nearest-loop identity, required after frontend validation in loop context.
|
|
857
|
+
* @property {SourceLocation} location - Keyword source location.
|
|
858
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
859
|
+
*/
|
|
860
|
+
/**
|
|
861
|
+
* @typedef ContinueStatement
|
|
862
|
+
* @property {"ContinueStatement"} kind - Nearest-loop continue discriminator.
|
|
863
|
+
* @property {string} [targetLoopId] - Resolved nearest-loop identity, required after frontend validation in loop context.
|
|
864
|
+
* @property {SourceLocation} location - Keyword source location.
|
|
865
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
866
|
+
*/
|
|
867
|
+
/**
|
|
868
|
+
* @typedef ErrorConstruction
|
|
869
|
+
* @property {"ErrorConstruction"} kind - Construction of one declared unchecked error.
|
|
870
|
+
* @property {ErrorType} error - Exact nominal error type.
|
|
871
|
+
* @property {Expression} message - Sole immutable string payload.
|
|
872
|
+
* @property {SourceLocation} location - Complete construction source location.
|
|
873
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned type and message ranges.
|
|
874
|
+
*/
|
|
875
|
+
/**
|
|
876
|
+
* @typedef RaiseStatement
|
|
877
|
+
* @property {"RaiseStatement"} kind - Abrupt unchecked-error propagation.
|
|
878
|
+
* @property {ErrorConstruction} error - Exact constructed semantic error.
|
|
879
|
+
* @property {SourceLocation} location - Complete raise source location.
|
|
880
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned raise range.
|
|
881
|
+
*/
|
|
882
|
+
/**
|
|
883
|
+
* @typedef CatchBinding
|
|
884
|
+
* @property {"CatchBinding"} kind - Exact-handler binding discriminator.
|
|
885
|
+
* @property {string} name - Handler-local binding name.
|
|
886
|
+
* @property {ErrorType} type - Exact caught nominal error type.
|
|
887
|
+
* @property {false} mutable - Catch bindings are immutable.
|
|
888
|
+
* @property {SourceLocation} location - Binding source location.
|
|
889
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned binding range.
|
|
890
|
+
*/
|
|
891
|
+
/**
|
|
892
|
+
* @typedef TryStatement
|
|
893
|
+
* @property {"TryStatement"} kind - One body and one exact typed handler.
|
|
894
|
+
* @property {Block} body - Protected body.
|
|
895
|
+
* @property {ErrorType} catchType - Exact caught nominal error type.
|
|
896
|
+
* @property {CatchBinding} catchBinding - Immutable handler-local binding.
|
|
897
|
+
* @property {Block} catchBody - Handler body.
|
|
898
|
+
* @property {SourceLocation} location - Complete try/handler source location.
|
|
899
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned try/catch ranges.
|
|
900
|
+
*/
|
|
342
901
|
/** @typedef {LocalDeclaration | AssignmentStatement} LocalStatement */
|
|
343
|
-
/** @typedef {LocalStatement | IfStatement | ReturnStatement | PrintStatement} Statement */
|
|
902
|
+
/** @typedef {LocalStatement | PrivateFieldWriteStatement | ExpressionStatement | IfStatement | ForEachStatement | ForEachMapStatement | WhileStatement | BreakStatement | ContinueStatement | ReturnStatement | PrintStatement | RaiseStatement | TryStatement} Statement */
|
|
344
903
|
/**
|
|
345
904
|
* @typedef Block
|
|
346
905
|
* @property {"Block"} kind - Node discriminator.
|
|
@@ -351,13 +910,87 @@
|
|
|
351
910
|
/**
|
|
352
911
|
* @typedef FunctionDeclaration
|
|
353
912
|
* @property {"FunctionDeclaration"} kind - Node discriminator.
|
|
913
|
+
* @property {string} [id] - Deterministic module-local declaration identity, required after frontend validation.
|
|
354
914
|
* @property {string} name - Function name.
|
|
915
|
+
* @property {TypeParameter[]} [typeParameters] - Ordered declaration-scoped invariant unbounded parameters.
|
|
355
916
|
* @property {Parameter[]} parameters - Function parameters.
|
|
356
|
-
* @property {
|
|
917
|
+
* @property {SemanticFunctionReturnType} returnType - Return type.
|
|
357
918
|
* @property {Block} body - Function body.
|
|
358
919
|
* @property {SourceLocation} location - Source location.
|
|
359
920
|
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
360
921
|
*/
|
|
922
|
+
/**
|
|
923
|
+
* @typedef RecordField
|
|
924
|
+
* @property {"RecordField"} kind - Closed record-field discriminator.
|
|
925
|
+
* @property {string} [id] - Stable module-local field identity, required after frontend validation.
|
|
926
|
+
* @property {string} name - Field name.
|
|
927
|
+
* @property {SemanticValueType} type - Exact field type.
|
|
928
|
+
* @property {SourceLocation} location - Field declaration source location.
|
|
929
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned name/type ranges.
|
|
930
|
+
*/
|
|
931
|
+
/**
|
|
932
|
+
* @typedef RecordDeclaration
|
|
933
|
+
* @property {"RecordDeclaration"} kind - Nominal closed immutable record declaration.
|
|
934
|
+
* @property {string} [id] - Stable module-local declaration identity, required after frontend validation.
|
|
935
|
+
* @property {string} name - Record name.
|
|
936
|
+
* @property {TypeParameter[]} [typeParameters] - Ordered declaration-scoped invariant unbounded parameters.
|
|
937
|
+
* @property {RecordField[]} fields - Ordered unique visible fields.
|
|
938
|
+
* @property {SourceLocation} location - Complete declaration source location.
|
|
939
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned declaration-name range.
|
|
940
|
+
*/
|
|
941
|
+
/**
|
|
942
|
+
* @typedef PrivateField
|
|
943
|
+
* @property {"PrivateField"} kind - Declaring-class-private mutable instance field.
|
|
944
|
+
* @property {string} [id] - Stable class-scoped field identity, required after validation.
|
|
945
|
+
* @property {string} name - Source-visible field name inside the declaring class only.
|
|
946
|
+
* @property {SemanticValueType} type - Exact field type.
|
|
947
|
+
* @property {SourceLocation} location - Field declaration location.
|
|
948
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned name/type ranges.
|
|
949
|
+
*/
|
|
950
|
+
/**
|
|
951
|
+
* @typedef ConstructorDeclaration
|
|
952
|
+
* @property {"ConstructorDeclaration"} kind - Exact complete private-state initializer.
|
|
953
|
+
* @property {string} [id] - Stable class-scoped constructor identity, required after validation.
|
|
954
|
+
* @property {Parameter[]} parameters - Exact positional constructor signature.
|
|
955
|
+
* @property {Block} body - Field-order initialization body.
|
|
956
|
+
* @property {readonly ["host"]} [effects] - Inferred checked host-effect fact.
|
|
957
|
+
* @property {string[]} [failureIds] - Ordered capability failures reachable through construction.
|
|
958
|
+
* @property {SourceLocation} location - Complete constructor location.
|
|
959
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned constructor range.
|
|
960
|
+
*/
|
|
961
|
+
/**
|
|
962
|
+
* @typedef MethodDeclaration
|
|
963
|
+
* @property {"MethodDeclaration"} kind - Receiver-bound class method.
|
|
964
|
+
* @property {string} [id] - Stable class-scoped method identity, required after validation.
|
|
965
|
+
* @property {string} name - Source-visible method name.
|
|
966
|
+
* @property {Parameter[]} parameters - Exact positional method signature.
|
|
967
|
+
* @property {SemanticFunctionReturnType} returnType - Exact return type.
|
|
968
|
+
* @property {Block} body - Method body.
|
|
969
|
+
* @property {readonly ["host"]} [effects] - Inferred checked host-effect fact.
|
|
970
|
+
* @property {string[]} [failureIds] - Ordered capability failures reachable through the method.
|
|
971
|
+
* @property {SourceLocation} location - Complete method location.
|
|
972
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned method-name range.
|
|
973
|
+
*/
|
|
974
|
+
/**
|
|
975
|
+
* @typedef ClassDeclaration
|
|
976
|
+
* @property {"ClassDeclaration"} kind - Nominal reference class with private mutable state.
|
|
977
|
+
* @property {string} [id] - Stable module-local class identity, required after validation.
|
|
978
|
+
* @property {string} name - Source-visible class name.
|
|
979
|
+
* @property {PrivateField[]} fields - Ordered private instance state.
|
|
980
|
+
* @property {ConstructorDeclaration} constructor - Sole exact constructor.
|
|
981
|
+
* @property {MethodDeclaration[]} methods - Ordered receiver methods.
|
|
982
|
+
* @property {{kind: "ordinary"} | {kind: "ownedResource", fieldId: string, resourceId: string}} [ownership] - Explicit class ownership profile.
|
|
983
|
+
* @property {SourceLocation} location - Complete class location.
|
|
984
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned class-name range.
|
|
985
|
+
*/
|
|
986
|
+
/**
|
|
987
|
+
* @typedef ErrorDeclaration
|
|
988
|
+
* @property {"ErrorDeclaration"} kind - Nominal unchecked error with one immutable string message.
|
|
989
|
+
* @property {string} [id] - Stable module-local declaration identity, required after frontend validation.
|
|
990
|
+
* @property {string} name - Error type name.
|
|
991
|
+
* @property {SourceLocation} location - Complete declaration source location.
|
|
992
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned declaration-name range.
|
|
993
|
+
*/
|
|
361
994
|
/**
|
|
362
995
|
* @typedef PrintStatement
|
|
363
996
|
* @property {"PrintStatement"} kind - Node discriminator.
|
|
@@ -375,13 +1008,95 @@
|
|
|
375
1008
|
/**
|
|
376
1009
|
* @typedef SemanticModule
|
|
377
1010
|
* @property {"Module"} kind - Node discriminator.
|
|
1011
|
+
* @property {RecordDeclaration[]} [records] - Top-level nominal record declarations in source order; omitted when empty.
|
|
1012
|
+
* @property {ClassDeclaration[]} [classes] - Top-level nominal reference classes in source order; omitted when empty.
|
|
1013
|
+
* @property {ErrorDeclaration[]} [errors] - Top-level nominal unchecked error declarations in source order; omitted when empty.
|
|
1014
|
+
* @property {EffectCapabilityDeclaration[]} [capabilities] - Compiler-authorized Task 034 declarations; omission is the legacy empty set.
|
|
378
1015
|
* @property {FunctionDeclaration[]} functions - Top-level functions.
|
|
379
1016
|
* @property {EntryPoint} entryPoint - Executable entry point.
|
|
380
1017
|
* @property {SourceLocation} location - Source location.
|
|
381
1018
|
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
382
1019
|
* @property {SemanticProvenance} [provenance] - Parser-authored source and identity index; optional for legacy caller-authored modules.
|
|
383
1020
|
*/
|
|
384
|
-
/**
|
|
1021
|
+
/**
|
|
1022
|
+
* @typedef SemanticImport
|
|
1023
|
+
* @property {"Import"} kind - Node discriminator.
|
|
1024
|
+
* @property {string} moduleId - Stable imported semantic module identity.
|
|
1025
|
+
* @property {string} importedName - Exported declaration name in the source module.
|
|
1026
|
+
* @property {string} localName - Binding name visible in the importing module.
|
|
1027
|
+
* @property {SemanticDeclarationKind} symbolKind - Imported declaration namespace.
|
|
1028
|
+
* @property {string} declarationId - Stable resolved declaration identity.
|
|
1029
|
+
* @property {boolean} typeOnly - Whether source syntax admitted only type-position use.
|
|
1030
|
+
* @property {SourceLocation} location - Complete import declaration/specifier location.
|
|
1031
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned import ranges.
|
|
1032
|
+
* @property {StdlibFacadeResolutionEvidence} [stdlibFacade] - Exact parser-proved native facade identity evidence.
|
|
1033
|
+
*/
|
|
1034
|
+
/**
|
|
1035
|
+
* @typedef StdlibFacadeResolutionEvidence
|
|
1036
|
+
* @property {"SemantifoldStdlibFacadeResolution"} schema - Evidence schema.
|
|
1037
|
+
* @property {1} version - Evidence version.
|
|
1038
|
+
* @property {string} facadeIdentity - Selected facade identity.
|
|
1039
|
+
* @property {string} facadeVersion - Selected exact facade version.
|
|
1040
|
+
* @property {string} nativeModule - Parser-proved source stdlib module identity.
|
|
1041
|
+
* @property {string} nativeSymbol - Parser-proved source stdlib symbol identity.
|
|
1042
|
+
*/
|
|
1043
|
+
/**
|
|
1044
|
+
* @typedef SemanticExport
|
|
1045
|
+
* @property {"Export"} kind - Node discriminator.
|
|
1046
|
+
* @property {string} exportedName - Name visible to importing modules.
|
|
1047
|
+
* @property {SemanticDeclarationKind} symbolKind - Exported declaration namespace.
|
|
1048
|
+
* @property {string} declarationId - Stable exported declaration identity.
|
|
1049
|
+
* @property {SourceLocation} location - Complete export declaration/specifier location.
|
|
1050
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Parser-owned export ranges.
|
|
1051
|
+
*/
|
|
1052
|
+
/**
|
|
1053
|
+
* @typedef SemanticProgramModule
|
|
1054
|
+
* @property {"Module"} kind - Node discriminator.
|
|
1055
|
+
* @property {string} id - Stable caller-supplied logical module identity.
|
|
1056
|
+
* @property {string} sourceFilename - Explicit source filename; never an implicit read request.
|
|
1057
|
+
* @property {RecordDeclaration[]} [records] - Top-level nominal record declarations.
|
|
1058
|
+
* @property {ClassDeclaration[]} [classes] - Compiler-owned facade reference classes.
|
|
1059
|
+
* @property {ErrorDeclaration[]} [errors] - Top-level nominal unchecked error declarations.
|
|
1060
|
+
* @property {FunctionDeclaration[]} functions - Top-level functions.
|
|
1061
|
+
* @property {SemanticImport[]} imports - Resolved imports in source order.
|
|
1062
|
+
* @property {SemanticExport[]} exports - Resolved exports in source order.
|
|
1063
|
+
* @property {EffectCapabilityDeclaration[]} [capabilities] - Authority declarations shared by reference when the program declares a standard-library contract.
|
|
1064
|
+
* @property {EntryPoint} [entryPoint] - Sole executable entry point, present only on the selected module.
|
|
1065
|
+
* @property {SourceLocation} location - Source location.
|
|
1066
|
+
* @property {SemanticNodeSourceProvenance} [sourceProvenance] - Node-associated provenance.
|
|
1067
|
+
* @property {SemanticProvenance} [provenance] - Parser-authored source and identity index.
|
|
1068
|
+
* @property {{identity: string, version: string}} [stdlibFacade] - Selected compiler-owned facade module identity.
|
|
1069
|
+
*/
|
|
1070
|
+
/**
|
|
1071
|
+
* @typedef StdlibFacadeProgramModuleDescriptor
|
|
1072
|
+
* @property {{identity: string, range: string}[]} dependencies - Versioned facade dependencies.
|
|
1073
|
+
* @property {string} identity - Facade identity.
|
|
1074
|
+
* @property {({identity: string, kind: "module", symbols: string[]} | {forms: ("unqualified-call" | "receiver-call")[], identity: string, kind: "builtin", symbols: string[]})[]} nativeModules - Exact native source identities.
|
|
1075
|
+
* @property {({effects: string[], failures: string[], forms: ("direct-call" | "unqualified-call" | "receiver-call")[], kind: "function", name: string, ownership: "not-applicable", parameters: {name: string, type: string}[], returnType: string} | {constructor: {effects: string[], failures: string[], ownership: "acquired", parameters: {name: string, type: string}[]}, forms: ["constructor-call"], kind: "class", methods: {effects: string[], failures: string[], forms: ["receiver-call"], name: string, ownership: "borrowed" | "consumed", parameters: {name: string, type: string}[], returnType: string}[], name: string, ownership: "owned-reference"})[]} publicDeclarations - Public source declarations.
|
|
1076
|
+
* @property {{module: string, operations: string[], range: string}[]} requirements - Canonical capability requirements.
|
|
1077
|
+
* @property {string} runtimeProfile - Exact source runtime profile.
|
|
1078
|
+
* @property {string} sourceModule - Compiler-owned semantic module identity.
|
|
1079
|
+
* @property {string} version - Exact facade version.
|
|
1080
|
+
* @property {"internal" | "public"} visibility - Native-selectable visibility.
|
|
1081
|
+
*/
|
|
1082
|
+
/**
|
|
1083
|
+
* @typedef StdlibFacadeProgramDescriptor
|
|
1084
|
+
* @property {"SemantifoldStdlibFacades"} schema - Facade descriptor schema.
|
|
1085
|
+
* @property {1} version - Facade descriptor version.
|
|
1086
|
+
* @property {SemanticLanguage} language - Source-language compatibility profile.
|
|
1087
|
+
* @property {StdlibFacadeProgramModuleDescriptor[]} modules - Dependency-first selected executable closure.
|
|
1088
|
+
*/
|
|
1089
|
+
/**
|
|
1090
|
+
* @typedef SemanticProgram
|
|
1091
|
+
* @property {"Program"} kind - Node discriminator.
|
|
1092
|
+
* @property {SemanticProgramModule[]} modules - Dependency-first deterministic module order.
|
|
1093
|
+
* @property {string} entryModule - Stable identity of the sole entry module.
|
|
1094
|
+
* @property {RegisteredSource[]} sources - Caller-order complete source registry.
|
|
1095
|
+
* @property {{contractVersion?: string, identity: string}} [stdlibContract] - Declared standard-library contract; plain, never frozen.
|
|
1096
|
+
* @property {{contractVersion?: string, identity: string}[]} [stdlibContracts] - Ordered declared standard-library contracts; plain, never frozen.
|
|
1097
|
+
* @property {StdlibFacadeProgramDescriptor} [stdlibFacades] - Complete selected source-language facade closure.
|
|
1098
|
+
*/
|
|
1099
|
+
/** @typedef {SemanticModule | SemanticProgramModule | SemanticImport | SemanticExport | RecordDeclaration | ClassDeclaration | ErrorDeclaration | EffectCapabilityDeclaration | EffectResourceDeclaration | EffectFailureDeclaration | EffectOperationDeclaration | RecordField | PrivateField | ConstructorDeclaration | MethodDeclaration | FunctionDeclaration | TypeParameter | Parameter | ValueBinding | CatchBinding | Block | Statement | EntryPoint | Expression | ErrorConstruction | ErrorType | MapEntry | SemanticValueType | FunctionReturnTypeReference} SemanticNode */
|
|
385
1100
|
/** @typedef {SemanticNode} SemanticNodeWithoutLocations */
|
|
386
1101
|
export {};
|
|
387
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLG1JQUFtSTtBQUNuSSxtRUFBbUU7QUFDbkUsdUVBQXVFO0FBQ3ZFLDZWQUE2VjtBQUM3Vix1RUFBdUU7QUFDdkUsOEVBQThFO0FBQzlFLGdJQUFnSTtBQUNoSSx1SEFBdUg7QUFFdkg7Ozs7Ozs7R0FPRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUVILCtFQUErRTtBQUUvRTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7OztHQVFHO0FBRUgsOERBQThEO0FBRTlEOzs7Ozs7Ozs7R0FTRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7R0FJRztBQUVIOzs7OztHQUtHO0FBRUgsa0hBQWtIO0FBRWxIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7OztHQU9HO0FBRUgseUpBQXlKO0FBRXpKOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILHVFQUF1RTtBQUN2RSwyRkFBMkY7QUFFM0Y7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSCw2SUFBNkk7QUFDN0ksMkRBQTJEO0FBRTNELE9BQU8sRUFBRSxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbi8qKiBAdHlwZWRlZiB7XCJwaHBcIiB8IFwicnVieVwiIHwgXCJqYXZhc2NyaXB0XCIgfCBcInR5cGVzY3JpcHRcIiB8IFwiamF2YVwiIHwgXCJweXRob25cIiB8IFwiY3NoYXJwXCIgfCBcImdvXCIgfCBcImNcIiB8IFwiY3BwXCJ9IFNlbWFudGljTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7XCJpbnRlZ2VyXCIgfCBcImJvb2xlYW5cIiB8IFwic3RyaW5nXCJ9IFNlbWFudGljVHlwZU5hbWUgKi9cbi8qKiBAdHlwZWRlZiB7XCJJbnRlZ2VyTmVnYXRlXCIgfCBcIkJvb2xlYW5Ob3RcIn0gU2VtYW50aWNVbmFyeU9wZXJhdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtcIkludGVnZXJBZGRcIiB8IFwiSW50ZWdlclN1YnRyYWN0XCIgfCBcIkludGVnZXJNdWx0aXBseVwiIHwgXCJCb29sZWFuQW5kXCIgfCBcIkJvb2xlYW5PclwiIHwgXCJJbnRlZ2VyRXF1YWxcIiB8IFwiSW50ZWdlck5vdEVxdWFsXCIgfCBcIkJvb2xlYW5FcXVhbFwiIHwgXCJCb29sZWFuTm90RXF1YWxcIiB8IFwiU3RyaW5nRXF1YWxcIiB8IFwiU3RyaW5nTm90RXF1YWxcIiB8IFwiSW50ZWdlckxlc3NUaGFuXCIgfCBcIkludGVnZXJMZXNzVGhhbk9yRXF1YWxcIiB8IFwiSW50ZWdlckdyZWF0ZXJUaGFuXCIgfCBcIkludGVnZXJHcmVhdGVyVGhhbk9yRXF1YWxcIiB8IFwiU3RyaW5nQ29uY2F0XCJ9IFNlbWFudGljQmluYXJ5T3BlcmF0aW9uICovXG4vKiogQHR5cGVkZWYge1wiZnVuY3Rpb25cIiB8IFwicGFyYW1ldGVyXCIgfCBcImxvY2FsXCJ9IFNlbWFudGljU3ltYm9sS2luZCAqL1xuLyoqIEB0eXBlZGVmIHtcImRlY2xhcmF0aW9uXCIgfCBcInJlYWRcIiB8IFwid3JpdGVcIiB8IFwiY2FsbFwifSBTZW1hbnRpY1N5bWJvbFJvbGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJwYXJzZVwiIHwgXCJnZW5lcmF0ZVwiIHwgXCJyZXN0b3JlXCIgfCBcImNvbXBpbGVcIiB8IFwibGlua1wiIHwgXCJ2YWxpZGF0ZVwiIHwgXCJpbnN0YW50aWF0ZVwiIHwgXCJleGVjdXRlXCJ9IEFjY2VwdGFuY2VTdGFnZSAqL1xuLyoqIEB0eXBlZGVmIHtcImVudHJ5XCIgfCBcInNvdXJjZVwiIHwgXCJtYW5pZmVzdFwiIHwgXCJzdXBwb3J0XCIgfCBcIm1hcHBpbmdcIiB8IFwicmVzb3VyY2VcIiB8IFwibG9hZGVyXCJ9IEdlbmVyYXRlZEFydGlmYWN0Um9sZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlUm9sZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSBmcm9udGVuZCAtIFBhcnNlciBhZGFwdGVyIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdGV4dEJhY2tlbmQgLSBTaW5nbGUtIG9yIG11bHRpLWZpbGUgdGV4dCBiYWNrZW5kIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYmluYXJ5QmFja2VuZCAtIEJpbmFyeSBiYWNrZW5kIGF2YWlsYWJpbGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYXBwbGljYXRpb25CYWNrZW5kIC0gQXBwbGljYXRpb24tYXJ0aWZhY3QgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGludGVyb3BlcmFiaWxpdHkgLSBJbnRlcm9wZXJhYmlsaXR5IGJyaWRnZSBhdmFpbGFiaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmljaFRleHQgLSBBdXRob3JpdGF0aXZlIHJpY2ggdGV4dCBtYXBwaW5ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc291cmNlTWFwVjMgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeVJhbmdlcyAtIEJ5dGUtY29vcmRpbmF0ZSBiaW5hcnkvcmVzb3VyY2UgbWFwcGluZ3MuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIEFwcGxpY2FibGUgb3JkZXJlZCBhY2NlcHRhbmNlIHN0YWdlcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHRvb2xjaGFpbnMgLSBSZXF1aXJlZCBjYW5vbmljYWwgdG9vbGNoYWluIElEcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlQ2FwYWJpbGl0aWVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBTdGFibGUgcmVnaXN0cnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlUm9sZUNhcGFiaWxpdGllcz59IHJvbGVzIC0gSW5kZXBlbmRlbnRseSByZWdpc3RlcmVkIHJvbGVzLlxuICogQHByb3BlcnR5IHtcInNpbmdsZVwiIHwgXCJtdWx0aXBsZVwifSBhcnRpZmFjdE11bHRpcGxpY2l0eSAtIFRhcmdldCBhcnRpZmFjdCBtdWx0aXBsaWNpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHJvdW5kVHJpcCAtIFdoZXRoZXIgZnJvbnRlbmQvYmFja2VuZCByb3VuZC10cmlwIGFjY2VwdGFuY2UgaXMgZGVjbGFyZWQuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlTWFwcGluZ0NhcGFiaWxpdGllcz59IG1hcHBpbmcgLSBNYXBwaW5nIGZvcm1zLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXM+fSBhY2NlcHRhbmNlIC0gU3RhZ2VzIGFuZCB0b29sY2hhaW5zLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU291cmNlUG9pbnRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBsaW5lIC0gT25lLWJhc2VkIGxpbmUuXG4gKiBAcHJvcGVydHkge251bWJlcn0gY29sdW1uIC0gT25lLWJhc2VkIFVURi0xNiBjb2RlLXVuaXQgY29sdW1uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IG9mZnNldCAtIFplcm8tYmFzZWQgVVRGLTE2IHNvdXJjZSBvZmZzZXQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VMb2NhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYXRpbmcgZmlsZW5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZVBvaW50fSBzdGFydCAtIEluY2x1c2l2ZSBzdGFydC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlUG9pbnR9IGVuZCAtIEV4Y2x1c2l2ZSBlbmQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWdpc3RlcmVkU291cmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBSZWdpc3RyeS1sb2NhbCBkZXRlcm1pbmlzdGljIHNvdXJjZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE9yaWdpbmFsIGZpbGVuYW1lLCBwcmVzZXJ2ZWQgdmVyYmF0aW0uXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IG51bGx9IGNvbnRlbnQgLSBPcmlnaW5hbCBzb3VyY2UgY29udGVudCwgcHJlc2VydmVkIHZlcmJhdGltIHdoZW4gYXZhaWxhYmxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlIHwgbnVsbH0gbGFuZ3VhZ2UgLSBQYXJzZXIgbGFuZ3VhZ2Ugd2hlbiBrbm93bi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZU9yaWdpblxuICogQHByb3BlcnR5IHtcInNvdXJjZVwifSBraW5kIC0gRGlyZWN0IHNvdXJjZSBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZUlkIC0gUmVnaXN0ZXJlZCBzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IG9yaWdpbmFsIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVsYXRlZE9yaWdpblxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNvdXJjZUlkIC0gUmVnaXN0ZXJlZCBzb3VyY2UgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFJlbGF0ZWQgb3JpZ2luYWwgcmFuZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBSZWxhdGVkIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlbGF0ZWQgc2VtYW50aWMgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFJlbGF0aW9uc2hpcCByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRGVyaXZlZE9yaWdpblxuICogQHByb3BlcnR5IHtcImRlcml2ZWRcIn0ga2luZCAtIFByb3ZlbmFuY2UgZGVyaXZlZCBmcm9tIG9uZSBvciBtb3JlIG9yaWdpbnMuXG4gKiBAcHJvcGVydHkge1JlbGF0ZWRPcmlnaW5bXX0gb3JpZ2lucyAtIE9yZGVyZWQsIG5vbi1lbXB0eSBvcmlnaW5hbCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTeW50aGV0aWNPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJzeW50aGV0aWNcIn0ga2luZCAtIFNvdXJjZS1mcmVlIGdlbmVyYXRlZCBvciBzZW1hbnRpYyBzY2FmZm9sZGluZy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSByZWFzb24gLSBTdGFibGUgaHVtYW4tcmVhZGFibGUgcmVhc29uLlxuICogQHByb3BlcnR5IHtSZWxhdGVkT3JpZ2luW119IHJlbGF0ZWRPcmlnaW5zIC0gT3JkZXJlZCByZWxhdGVkIHJhbmdlcywgcG9zc2libHkgZW1wdHkuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTb3VyY2VPcmlnaW4gfCBEZXJpdmVkT3JpZ2luIHwgU3ludGhldGljT3JpZ2lufSBTZW1hbnRpY09yaWdpbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEJ5dGVSYW5nZVxuICogQHByb3BlcnR5IHt7c3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXJ9fSBnZW5lcmF0ZWQgLSBIYWxmLW9wZW4gZ2VuZXJhdGVkIGJ5dGUgb2Zmc2V0cy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIFNlbWFudGljIG9yIGV4cGxpY2l0IHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gT3JpZ2luYXRpbmcgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc3ltYm9sSWRdIC0gT3JpZ2luYXRpbmcgc2VtYW50aWMgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb2xlXSAtIFNlbWFudGljIG9yIGJpbmFyeS1yZWdpb24gcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkQnl0ZU1hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nXCJ9IHNjaGVtYSAtIFNjaGVtYSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gU2NoZW1hIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1wiYnl0ZXNcIn0gY29vcmRpbmF0ZVN5c3RlbSAtIEdlbmVyYXRlZCBvZmZzZXRzIGFyZSBieXRlcywgbmV2ZXIgdGV4dCBjb2x1bW5zLlxuICogQHByb3BlcnR5IHt7cGF0aDogc3RyaW5nLCBieXRlTGVuZ3RoOiBudW1iZXJ9fSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgYXJ0aWZhY3QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEdlbmVyYXRlZEJ5dGVSYW5nZVtdfSByYW5nZXMgLSBPcmRlcmVkIG5vbi1vdmVybGFwcGluZyByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGROb2RlUHJvdmVuYW5jZVwifSBzY2hlbWEgLSBBc3NvY2lhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHsxfSB2ZXJzaW9uIC0gQXNzb2NpYXRpb24gdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNPcmlnaW59IG9yaWdpbiAtIFNvdXJjZSBhc3NvY2lhdGlvbiBpbmRlcGVuZGVudCBvZiB0cmF2ZXJzYWwgcG9zaXRpb24uXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIEV4YWN0IHNlbWFudGljLXRva2VuIHN1YnJhbmdlcyBieSByb2xlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNOb2RlUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gSlNPTiBQb2ludGVyIGZyb20gdGhlIHNlbWFudGljIG1vZHVsZSByb290LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVbXCJraW5kXCJdIHwgXCJUeXBlUmVmZXJlbmNlXCJ9IGtpbmQgLSBTZW1hbnRpYyBub2RlIGtpbmQuXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgcHJvdmVuYW5jZSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgU291cmNlTG9jYXRpb24+Pn0gcmFuZ2VzIC0gRXhhY3Qgc2VtYW50aWMtdG9rZW4gc3VicmFuZ2VzIGJ5IHJvbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlc29sdmVkIGRlY2xhcmVkL3JlZmVyZW5jZWQgc3ltYm9sIGlkZW50aXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNTeW1ib2xSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBub2RlSWQgLSBSZWZlcnJpbmcgc2VtYW50aWMgbm9kZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xSb2xlfSByb2xlIC0gUmVmZXJlbmNlIHJvbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHJlZmVyZW5jZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljU3ltYm9sUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgc3ltYm9sIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTZW1hbnRpYyBzeW1ib2wgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xLaW5kfSBraW5kIC0gU3ltYm9sIGNhdGVnb3J5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uTm9kZUlkIC0gRGVjbGFyaW5nIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUmVmZXJlbmNlW119IHJlZmVyZW5jZXMgLSBPcmRlcmVkIHJlc29sdmVkIHJlZmVyZW5jZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZFByb3ZlbmFuY2VcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gVmVyc2lvbmVkIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlUHJvdmVuYW5jZVtdfSBub2RlcyAtIERldGVybWluaXN0aWMgbm9kZSBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xQcm92ZW5hbmNlW119IHN5bWJvbHMgLSBEZXRlcm1pbmlzdGljIHN5bWJvbCBpbmRleC5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1wiZXhhY3RcIiB8IFwiYW5jaG9yXCIgfCBcInN5bnRoZXRpY1wifSBNYXBwaW5nS2luZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGlmb2xkTWFwcGluZ1NwYW5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGdlbmVyYXRlZCAtIEdlbmVyYXRlZCBoYWxmLW9wZW4gcmFuZ2UuXG4gKiBAcHJvcGVydHkge01hcHBpbmdLaW5kfSBtYXBwaW5nS2luZCAtIE1hcHBpbmcgcHJlY2lzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIG9yaWdpbmFsIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vZGVJZF0gLSBSZWxhdGVkIGNhbm9uaWNhbCBzZW1hbnRpYyBub2RlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZWxhdGVkIGNhbm9uaWNhbCBzZW1hbnRpYyBzeW1ib2wuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3JvbGVdIC0gU2VtYW50aWMgdG9rZW4gcm9sZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZV0gLSBVc2VmdWwgc3ltYm9sIG5hbWUgZm9yIFNvdXJjZSBNYXAgdjMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWxlbmFtZSAtIE91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBPdXRwdXQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudCAtIEV4YWN0IGdlbmVyYXRlZCBMRiBzb3VyY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZE1hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZE1hcHBpbmdcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkU291cmNlfSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgcHJvZ3JhbSBpZGVudGl0eSBhbmQgY29udGVudC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gT3JpZ2luYWwgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVQcm92ZW5hbmNlW119IG5vZGVzIC0gQ2Fub25pY2FsIHNlbWFudGljIG5vZGUgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBzeW1ib2xzIC0gQ2Fub25pY2FsIHNlbWFudGljIHN5bWJvbCBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBzcGFucyAtIE9yZGVyZWQgZ2VuZXJhdGVkIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEFydGlmYWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29kZSAtIEdlbmVyYXRlZCBvdXRwdXQgcHJvZ3JhbSwgaW5jbHVkaW5nIGFueSByZXF1ZXN0ZWQgZGlyZWN0aXZlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gR2VuZXJhdGVkIG91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBPdXRwdXQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgcmljaCBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTWFwRmlsZW5hbWUgLSBEZWZhdWx0IGV4dGVybmFsIFNvdXJjZSBNYXAgZmlsZW5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUZXh0QXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1widGV4dFwifSBraW5kIC0gUmljaCB0ZXh0IHByb3ZlbmFuY2UgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSByYW5nZSBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBJbnRlcm9wZXJhYmxlIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NvdXJjZU1hcEZpbGVuYW1lXSAtIExvZ2ljYWwgU291cmNlIE1hcCBzaWRlY2FyIHBhdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiYnl0ZXNcIn0ga2luZCAtIEJ5dGUgcHJvdmVuYW5jZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSBieXRlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFydGlmYWN0U3ludGhldGljUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcInN5bnRoZXRpY1wifSBraW5kIC0gU3ludGhldGljIGFydGlmYWN0IGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gRXhwbGljaXQgdGFyZ2V0LXNjYWZmb2xkaW5nIHJlYXNvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIFJlbGF0ZWQgc2VtYW50aWMgc291cmNlIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1RleHRBcnRpZmFjdFByb3ZlbmFuY2UgfCBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlIHwgQXJ0aWZhY3RTeW50aGV0aWNQcm92ZW5hbmNlfSBBcnRpZmFjdFByb3ZlbmFuY2UgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTZXRBcnRpZmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBVbmlxdWUgc2FmZSByZWxhdGl2ZSBQT1NJWCBwYXRoLlxuICogQHByb3BlcnR5IHtcInRleHRcIiB8IFwiYmluYXJ5XCJ9IGNvbnRlbnRLaW5kIC0gQ29udGVudCByZXByZXNlbnRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIFRleHQgb3IgYSBkZXRhY2hlZCBjb3B5IG9mIHRoZSBleGFjdCBnZW5lcmF0ZWQgYnl0ZXMgb24gZXZlcnkgYmluYXJ5IHJlYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gQXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkQXJ0aWZhY3RSb2xlfSByb2xlIC0gQXJ0aWZhY3Qgcm9sZTsgZXhhY3RseSBvbmUgc2V0IGFydGlmYWN0IGlzIGVudHJ5LlxuICogQHByb3BlcnR5IHtcImdlbmVyYXRlZFwifSBvd25lcnNoaXAgLSBUYXNrLTAxNSBvd25lcnNoaXAgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0FydGlmYWN0UHJvdmVuYW5jZX0gcHJvdmVuYW5jZSAtIFRleHQsIGJ5dGUtcmFuZ2UsIG9yIHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQXJ0aWZhY3RTZXRcbiAqIEBwcm9wZXJ0eSB7XCJHZW5lcmF0ZWRBcnRpZmFjdFNldFwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIFN0YWJsZSBsYW5ndWFnZSBvciB0YXJnZXQgSUQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW50cnkgLSBQYXRoIG9mIHRoZSBzb2xlIGRlY2xhcmVkIGVudHJ5IGFydGlmYWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0ZWRTZXRBcnRpZmFjdFtdfSBhcnRpZmFjdHMgLSBEZXRlcm1pbmlzdGljIGFydGlmYWN0IG9yZGVyLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRGlzY292ZXJlZFRvb2xjaGFpblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gVG9vbGNoYWluIElELlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNvbW1hbmQgLSBEb2N1bWVudGVkIGNhbm9uaWNhbCBjb21tYW5kLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBhYnNvbHV0ZSBleGVjdXRhYmxlIHBhdGguXG4gKiBAcHJvcGVydHkge1wib3ZlcnJpZGVcIiB8IFwiY2Fub25pY2FsXCJ9IHNvdXJjZSAtIFJlc29sdXRpb24gcm91dGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdmVyc2lvbiAtIEZpcnN0IGNhcHR1cmVkIHZlcnNpb24gbGluZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uT3V0cHV0IC0gQ29tcGxldGUgY2FwdHVyZWQgdmVyc2lvbiBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB2ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFjY2VwdGFuY2VTdGFnZVJlc3VsdFxuICogQHByb3BlcnR5IHtBY2NlcHRhbmNlU3RhZ2V9IHN0YWdlIC0gQ29tcGxldGVkIHN0YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHVzZWQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd1bWVudHMgLSBFeGFjdCBhcmd1bWVudCBhcnJheSB1c2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBEaXNjb3ZlcmVkIHRvb2wgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgLSBDYXB0dXJlZCBzdGFuZGFyZCBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gQ2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBY2NlcHRhbmNlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gVGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpcmVjdG9yeSAtIFJlbW92ZWQgaXNvbGF0ZWQgcHJvamVjdCBkaXJlY3RvcnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEFjY2VwdGFuY2VTdGFnZVJlc3VsdFtdfSBzdGFnZXMgLSBPcmRlcmVkIGNvbXBsZXRlZCBzdGFnZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSBuYW1lIC0gTm9ybWFsaXplZCB0eXBlIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlIHRoYXQgc3Vydml2ZXMgc2VtYW50aWMgdHJhbnNmb3Jtcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFBhcmFtZXRlclxuICogQHByb3BlcnR5IHtcIlBhcmFtZXRlclwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBQYXJhbWV0ZXIgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7VHlwZVJlZmVyZW5jZX0gdHlwZSAtIFBhcmFtZXRlciB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSWRlbnRpZmllckV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJJZGVudGlmaWVyRXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBSZWZlcmVuY2VkIG5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJbnRlZ2VyTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIkludGVnZXJMaXRlcmFsXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmFsdWUgLSBKYXZhU2NyaXB0LXNhZmUgaW50ZWdlciB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJvb2xlYW5MaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiQm9vbGVhbkxpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdmFsdWUgLSBCb29sZWFuIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3RyaW5nTGl0ZXJhbFxuICogQHByb3BlcnR5IHtcIlN0cmluZ0xpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2YWx1ZSAtIFVuaWNvZGUgc3RyaW5nIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgVW5hcnlFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiVW5hcnlFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVW5hcnlPcGVyYXRpb259IG9wZXJhdGlvbiAtIENsb3NlZCBzZW1hbnRpYyBvcGVyYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IG9wZXJhbmQgLSBPcGVyYW5kIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCBvcGVyYXRpb24gcmVzdWx0IHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCaW5hcnlFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiQmluYXJ5RXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0JpbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gQ2xvc2VkIHNlbWFudGljIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbGVmdCAtIExlZnQgb3BlcmFuZC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gcmlnaHQgLSBSaWdodCBvcGVyYW5kLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSB0eXBlIC0gRXhwbGljaXQgb3BlcmF0aW9uIHJlc3VsdCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2FsbEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJDYWxsRXhwcmVzc2lvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNhbGxlZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gUG9zaXRpb25hbCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IEludGVnZXJMaXRlcmFsIHwgQm9vbGVhbkxpdGVyYWwgfCBTdHJpbmdMaXRlcmFsIHwgVW5hcnlFeHByZXNzaW9uIHwgQmluYXJ5RXhwcmVzc2lvbiB8IENhbGxFeHByZXNzaW9ufSBFeHByZXNzaW9uICovXG5cbi8qKlxuICogQHR5cGVkZWYgTG9jYWxEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkxvY2FsRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gRGVjbGFyZWQgbG9jYWwgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7VHlwZVJlZmVyZW5jZX0gdHlwZSAtIEV4cGxpY2l0IGxvY2FsIHR5cGUuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG11dGFibGUgLSBXaGV0aGVyIGxhdGVyIGFzc2lnbm1lbnQgaXMgYWxsb3dlZC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gaW5pdGlhbGl6ZXIgLSBSZXF1aXJlZCBpbml0aWFsaXplciBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBEZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQXNzaWdubWVudFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IHRhcmdldCAtIFNpbXBsZSBsb2NhbCBhc3NpZ25tZW50IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEFzc2lnbmVkIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEFzc2lnbm1lbnQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJldHVyblN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlJldHVyblN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gUmV0dXJuZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElmU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiSWZTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29uZGl0aW9uIC0gQnJhbmNoIGNvbmRpdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNvbnNlcXVlbnQgLSBUcnVlIGJyYW5jaC5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IFthbHRlcm5hdGVdIC0gRmFsc2UgYnJhbmNoLCBhYnNlbnQgd2hlbiBleGVjdXRpb24gZmFsbHMgdGhyb3VnaC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0xvY2FsRGVjbGFyYXRpb24gfCBBc3NpZ25tZW50U3RhdGVtZW50fSBMb2NhbFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtMb2NhbFN0YXRlbWVudCB8IElmU3RhdGVtZW50IHwgUmV0dXJuU3RhdGVtZW50IHwgUHJpbnRTdGF0ZW1lbnR9IFN0YXRlbWVudCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJsb2NrXG4gKiBAcHJvcGVydHkge1wiQmxvY2tcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U3RhdGVtZW50W119IHN0YXRlbWVudHMgLSBPcmRlcmVkIHN0YXRlbWVudHMgaW4gb25lIGxleGljYWwgc2NvcGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBGdW5jdGlvbkRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRnVuY3Rpb25EZWNsYXJhdGlvblwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBGdW5jdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEZ1bmN0aW9uIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IHJldHVyblR5cGUgLSBSZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBGdW5jdGlvbiBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpbnRTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJQcmludFN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gUHJpbnRlZCBleHByZXNzaW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRW50cnlQb2ludFxuICogQHByb3BlcnR5IHtcIkVudHJ5UG9pbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBFbnRyeS1wb2ludCBib2R5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNNb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25EZWNsYXJhdGlvbltdfSBmdW5jdGlvbnMgLSBUb3AtbGV2ZWwgZnVuY3Rpb25zLlxuICogQHByb3BlcnR5IHtFbnRyeVBvaW50fSBlbnRyeVBvaW50IC0gRXhlY3V0YWJsZSBlbnRyeSBwb2ludC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm92ZW5hbmNlfSBbcHJvdmVuYW5jZV0gLSBQYXJzZXItYXV0aG9yZWQgc291cmNlIGFuZCBpZGVudGl0eSBpbmRleDsgb3B0aW9uYWwgZm9yIGxlZ2FjeSBjYWxsZXItYXV0aG9yZWQgbW9kdWxlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1NlbWFudGljTW9kdWxlIHwgRnVuY3Rpb25EZWNsYXJhdGlvbiB8IFBhcmFtZXRlciB8IEJsb2NrIHwgU3RhdGVtZW50IHwgRW50cnlQb2ludCB8IEV4cHJlc3Npb24gfCBUeXBlUmVmZXJlbmNlfSBTZW1hbnRpY05vZGUgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNOb2RlfSBTZW1hbnRpY05vZGVXaXRob3V0TG9jYXRpb25zICovXG5cbmV4cG9ydCB7fVxuIl19
|
|
1102
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2VtYW50aWMvdHlwZXMuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLDBLQUEwSztBQUMxSyxzREFBc0Q7QUFDdEQsa0ZBQWtGO0FBQ2xGLGlFQUFpRTtBQUNqRSxtRUFBbUU7QUFDbkUsa0VBQWtFO0FBQ2xFLHVFQUF1RTtBQUN2RSw2VkFBNlY7QUFDN1YsMk9BQTJPO0FBQzNPLG1GQUFtRjtBQUNuRixnSEFBZ0g7QUFDaEgsZ0lBQWdJO0FBQ2hJLHVIQUF1SDtBQUV2SDs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUVIOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBRUg7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7R0FJRztBQUVIOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUVILCtFQUErRTtBQUUvRTs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILDhEQUE4RDtBQUU5RDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7O0dBSUc7QUFFSDs7Ozs7R0FLRztBQUVILGtIQUFrSDtBQUVsSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7OztHQUtHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7OztHQUtHO0FBRUgsb01BQW9NO0FBQ3BNLG1FQUFtRTtBQUVuRTs7Ozs7R0FLRztBQUVILDRGQUE0RjtBQUU1Riw4b0JBQThvQjtBQUM5b0IsMEVBQTBFO0FBRTFFOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7O0dBSUc7QUFFSCwyS0FBMks7QUFFM0s7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVILG9GQUFvRjtBQUNwRiw2TkFBNk47QUFDN04scURBQXFEO0FBQ3JELDRQQUE0UDtBQUM1UCwyWUFBMlk7QUFDM1ksd0tBQXdLO0FBQ3hLLHdJQUF3STtBQUN4SSwrU0FBK1M7QUFFL1M7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7O0dBS0c7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFFSDs7Ozs7OztHQU9HO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSCxtaUJBQW1pQjtBQUVuaUI7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7Ozs7O0dBVUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7O0dBT0c7QUFFSDs7Ozs7O0dBTUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVILHVFQUF1RTtBQUN2RSw2UUFBNlE7QUFFN1E7Ozs7OztHQU1HO0FBRUg7Ozs7Ozs7Ozs7O0dBV0c7QUFFSDs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7Ozs7R0FVRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7Ozs7OztHQVdHO0FBRUg7Ozs7Ozs7R0FPRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7Ozs7Ozs7R0FZRztBQUVIOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7O0dBUUc7QUFFSDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFFSDs7Ozs7Ozs7Ozs7R0FXRztBQUVIOzs7Ozs7R0FNRztBQUVIOzs7Ozs7Ozs7R0FTRztBQUVILHdqQkFBd2pCO0FBQ3hqQiwyREFBMkQ7QUFFM0QsT0FBTyxFQUFFLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuLyoqIEB0eXBlZGVmIHtcInBocFwiIHwgXCJydWJ5XCIgfCBcImphdmFzY3JpcHRcIiB8IFwidHlwZXNjcmlwdFwiIHwgXCJqYXZhXCIgfCBcImtvdGxpblwiIHwgXCJweXRob25cIiB8IFwiY3NoYXJwXCIgfCBcImdvXCIgfCBcImNcIiB8IFwiY3BwXCIgfCBcInJ1c3RcIiB8IFwic3dpZnRcIiB8IFwiZGFydFwifSBTZW1hbnRpY0xhbmd1YWdlICovXG4vKiogQHR5cGVkZWYge1NlbWFudGljTGFuZ3VhZ2V9IFRleHRCYWNrZW5kTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7VGV4dEJhY2tlbmRMYW5ndWFnZSB8IFwid2FzbVwiIHwgXCJpb3NcIiB8IFwiYW5kcm9pZFwifSBCYWNrZW5kTGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNMYW5ndWFnZSB8IFwiaHRtbFwifSBHZW5lcmF0ZWRUZXh0TGFuZ3VhZ2UgKi9cbi8qKiBAdHlwZWRlZiB7XCJpbnRlZ2VyXCIgfCBcImJvb2xlYW5cIiB8IFwic3RyaW5nXCJ9IFNlbWFudGljVHlwZU5hbWUgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNUeXBlTmFtZSB8IFwidm9pZFwifSBGdW5jdGlvblJldHVyblR5cGVOYW1lICovXG4vKiogQHR5cGVkZWYge1wiSW50ZWdlck5lZ2F0ZVwiIHwgXCJCb29sZWFuTm90XCJ9IFNlbWFudGljVW5hcnlPcGVyYXRpb24gKi9cbi8qKiBAdHlwZWRlZiB7XCJJbnRlZ2VyQWRkXCIgfCBcIkludGVnZXJTdWJ0cmFjdFwiIHwgXCJJbnRlZ2VyTXVsdGlwbHlcIiB8IFwiQm9vbGVhbkFuZFwiIHwgXCJCb29sZWFuT3JcIiB8IFwiSW50ZWdlckVxdWFsXCIgfCBcIkludGVnZXJOb3RFcXVhbFwiIHwgXCJCb29sZWFuRXF1YWxcIiB8IFwiQm9vbGVhbk5vdEVxdWFsXCIgfCBcIlN0cmluZ0VxdWFsXCIgfCBcIlN0cmluZ05vdEVxdWFsXCIgfCBcIkludGVnZXJMZXNzVGhhblwiIHwgXCJJbnRlZ2VyTGVzc1RoYW5PckVxdWFsXCIgfCBcIkludGVnZXJHcmVhdGVyVGhhblwiIHwgXCJJbnRlZ2VyR3JlYXRlclRoYW5PckVxdWFsXCIgfCBcIlN0cmluZ0NvbmNhdFwifSBTZW1hbnRpY0JpbmFyeU9wZXJhdGlvbiAqL1xuLyoqIEB0eXBlZGVmIHtcImNhcGFiaWxpdHlcIiB8IFwicmVzb3VyY2VcIiB8IFwiZmFpbHVyZVwiIHwgXCJvcGVyYXRpb25cIiB8IFwicmVjb3JkXCIgfCBcImNsYXNzXCIgfCBcImVycm9yXCIgfCBcImZpZWxkXCIgfCBcImNvbnN0cnVjdG9yXCIgfCBcIm1ldGhvZFwiIHwgXCJmdW5jdGlvblwiIHwgXCJ0eXBlUGFyYW1ldGVyXCIgfCBcInBhcmFtZXRlclwiIHwgXCJsb2NhbFwiIHwgXCJpdGVyYXRpb25cIiB8IFwiY2F0Y2hcIn0gU2VtYW50aWNTeW1ib2xLaW5kICovXG4vKiogQHR5cGVkZWYge1wicmVjb3JkXCIgfCBcImNsYXNzXCIgfCBcImVycm9yXCIgfCBcImZ1bmN0aW9uXCJ9IFNlbWFudGljRGVjbGFyYXRpb25LaW5kICovXG4vKiogQHR5cGVkZWYge1wiZGVjbGFyYXRpb25cIiB8IFwidHlwZVwiIHwgXCJjb25zdHJ1Y3RcIiB8IFwibWVtYmVyXCIgfCBcInJlYWRcIiB8IFwid3JpdGVcIiB8IFwiY2FsbFwifSBTZW1hbnRpY1N5bWJvbFJvbGUgKi9cbi8qKiBAdHlwZWRlZiB7XCJwYXJzZVwiIHwgXCJnZW5lcmF0ZVwiIHwgXCJyZXN0b3JlXCIgfCBcImNvbXBpbGVcIiB8IFwibGlua1wiIHwgXCJ2YWxpZGF0ZVwiIHwgXCJpbnN0YW50aWF0ZVwiIHwgXCJleGVjdXRlXCJ9IEFjY2VwdGFuY2VTdGFnZSAqL1xuLyoqIEB0eXBlZGVmIHtcImVudHJ5XCIgfCBcInNvdXJjZVwiIHwgXCJtYW5pZmVzdFwiIHwgXCJzdXBwb3J0XCIgfCBcIm1hcHBpbmdcIiB8IFwicmVzb3VyY2VcIiB8IFwibG9hZGVyXCJ9IEdlbmVyYXRlZEFydGlmYWN0Um9sZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIElvc0FwcGxpY2F0aW9uQ29uZmlndXJhdGlvbklucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvZHVjdE5hbWUgLSBTYWZlIFhjb2RlIHByb2R1Y3QvcGF0aCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGVOYW1lIC0gU2FmZSBTd2lmdCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3JnYW5pemF0aW9uUHJlZml4IC0gQ2FsbGVyLXN1cHBsaWVkIHJldmVyc2UtRE5TIG9yZ2FuaXphdGlvbiBwcmVmaXguXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYnVuZGxlSWRlbnRpZmllciAtIENhbGxlci1zdXBwbGllZCByZXZlcnNlLUROUyBhcHBsaWNhdGlvbiBidW5kbGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVwbG95bWVudFRhcmdldCAtIENhbGxlci1zdXBwbGllZCBtYWpvci5taW5vciBpT1MgZGVwbG95bWVudCB0YXJnZXQ7IG5ldmVyIGluZmVycmVkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVXNlci12aXNpYmxlIGFwcGxpY2F0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1wiU291cmNlc1wifSBbc291cmNlUm9vdF0gLSBGaXhlZCBnZW5lcmF0ZWQtc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wiQXNzZXRzLnhjYXNzZXRzXCJ9IFtyZXNvdXJjZVJvb3RdIC0gRml4ZWQgY2FsbGVyLXJlc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wic3dpZnR1aVwifSBbbGlmZWN5Y2xlXSAtIFNvbGUgc3VwcG9ydGVkIGxpZmVjeWNsZS5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgbmV2ZXI+fSBbaW5mb1BsaXN0XSAtIENsb3NlZCBiYXNlbGluZSBjYWxsZXIgcGxpc3QgZXh0ZW5zaW9uOyBjdXJyZW50bHkgZW1wdHkuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3Blcm1pc3Npb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIHBlcm1pc3Npb25zLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtlbnRpdGxlbWVudHNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgZW50aXRsZW1lbnRzLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtwcml2YWN5RGVjbGFyYXRpb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IGJhc2VsaW5lIHByaXZhY3kgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHt1bmtub3duW119IFtjYXBhYmlsaXRpZXNdIC0gVmFsaWRhdGVkIGFzIHRoZSBjbG9zZWQgZW1wdHkgYmFzZWxpbmUgQXBwbGUgY2FwYWJpbGl0aWVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW9zQXBwbGljYXRpb25Db25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcHJvZHVjdE5hbWUgLSBWYWxpZGF0ZWQgWGNvZGUgcHJvZHVjdC9wYXRoIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZU5hbWUgLSBWYWxpZGF0ZWQgU3dpZnQgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9yZ2FuaXphdGlvblByZWZpeCAtIFZhbGlkYXRlZCByZXZlcnNlLUROUyBvcmdhbml6YXRpb24gcHJlZml4LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGJ1bmRsZUlkZW50aWZpZXIgLSBWYWxpZGF0ZWQgcmV2ZXJzZS1ETlMgYXBwbGljYXRpb24gYnVuZGxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlcGxveW1lbnRUYXJnZXQgLSBWYWxpZGF0ZWQgY2FsbGVyLXN1cHBsaWVkIGRlcGxveW1lbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpc3BsYXlOYW1lIC0gVmFsaWRhdGVkIGRpc3BsYXkgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJTb3VyY2VzXCJ9IHNvdXJjZVJvb3QgLSBHZW5lcmF0ZWQtc291cmNlIHJvb3QuXG4gKiBAcHJvcGVydHkge1wiQXNzZXRzLnhjYXNzZXRzXCJ9IHJlc291cmNlUm9vdCAtIENhbGxlci1yZXNvdXJjZSByb290LlxuICogQHByb3BlcnR5IHtcInN3aWZ0dWlcIn0gbGlmZWN5Y2xlIC0gU29sZSBzdXBwb3J0ZWQgbGlmZWN5Y2xlLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBuZXZlcj4+fSBpbmZvUGxpc3QgLSBFbXB0eSBjYWxsZXIgcGxpc3QgZXh0ZW5zaW9uLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBwZXJtaXNzaW9ucyAtIEVtcHR5IGJhc2VsaW5lIHBlcm1pc3Npb25zLlxuICogQHByb3BlcnR5IHtyZWFkb25seSBuZXZlcltdfSBlbnRpdGxlbWVudHMgLSBFbXB0eSBiYXNlbGluZSBlbnRpdGxlbWVudHMuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IG5ldmVyW119IHByaXZhY3lEZWNsYXJhdGlvbnMgLSBFbXB0eSBiYXNlbGluZSBwcml2YWN5IGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgbmV2ZXJbXX0gY2FwYWJpbGl0aWVzIC0gRW1wdHkgYmFzZWxpbmUgQXBwbGUgY2FwYWJpbGl0aWVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSW9zQXBwbGljYXRpb25Bc3NldElucHV0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEZ1bGwgc2FmZSBkZXN0aW5hdGlvbiBiZWxvdyBBc3NldHMueGNhc3NldHMuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBFeGFjdCBjYWxsZXItcHJvdmlkZWQgdGV4dCBvciBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBFeHBsaWNpdCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYTI1NiAtIExvd2VyY2FzZSBTSEEtMjU2IG9mIGV4YWN0IFVURi04IHRleHQgb3IgYnl0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBbmRyb2lkQXBwbGljYXRpb25Db25maWd1cmF0aW9uSW5wdXRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbYXBwbGljYXRpb25JZF0gLSBMb3dlcmNhc2UgcmV2ZXJzZS1ETlMgQW5kcm9pZCBhcHBsaWNhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbmFtZXNwYWNlXSAtIEtvdGxpbi9BbmRyb2lkIG5hbWVzcGFjZTsgZGVmYXVsdHMgdG8gYXBwbGljYXRpb25JZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcGFja2FnZU5hbWVdIC0gR2VuZXJhdGVkIEtvdGxpbiBwYWNrYWdlOyBkZWZhdWx0cyB0byBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2FjdGl2aXR5Q2xhc3NOYW1lXSAtIExhdW5jaGVyIEFjdGl2aXR5IGNsYXNzIG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Byb2R1Y3ROYW1lXSAtIERldGVybWluaXN0aWMgcHJvamVjdCBwcm9kdWN0IG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Rpc3BsYXlOYW1lXSAtIFVzZXItdmlzaWJsZSBhcHBsaWNhdGlvbiBsYWJlbC5cbiAqIEBwcm9wZXJ0eSB7MjN9IFttaW5pbXVtU2RrXSAtIFF1YWxpZmllZCBtaW5pbXVtIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gW3RhcmdldFNka10gLSBRdWFsaWZpZWQgdGFyZ2V0IEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gW2NvbXBpbGVTZGtdIC0gUXVhbGlmaWVkIGNvbXBpbGUgQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkge1wiMzUuMC4wXCJ9IFtidWlsZFRvb2xzVmVyc2lvbl0gLSBRdWFsaWZpZWQgQW5kcm9pZCBCdWlsZCBUb29scyB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt2ZXJzaW9uQ29kZV0gLSBQb3NpdGl2ZSBBbmRyb2lkIHZlcnNpb24gY29kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdmVyc2lvbk5hbWVdIC0gQ2Fub25pY2FsIGFwcGxpY2F0aW9uIHZlcnNpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7XCJ1bnNwZWNpZmllZFwifSBbb3JpZW50YXRpb25dIC0gQmFzZWxpbmUgb3JpZW50YXRpb24gYmVoYXZpb3IuXG4gKiBAcHJvcGVydHkge1wic3lzdGVtXCJ9IFt0aGVtZV0gLSBCYXNlbGluZSBwbGF0Zm9ybS1uYXRpdmUgdGhlbWUuXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gW3Blcm1pc3Npb25zXSAtIFZhbGlkYXRlZCBhcyB0aGUgY2xvc2VkIGVtcHR5IHBlcm1pc3Npb24gc2V0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQW5kcm9pZEFwcGxpY2F0aW9uQ29uZmlndXJhdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGFwcGxpY2F0aW9uSWQgLSBWYWxpZGF0ZWQgQW5kcm9pZCBhcHBsaWNhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lc3BhY2UgLSBWYWxpZGF0ZWQgQW5kcm9pZCBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGFja2FnZU5hbWUgLSBHZW5lcmF0ZWQgS290bGluIHBhY2thZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYWN0aXZpdHlDbGFzc05hbWUgLSBMYXVuY2hlciBBY3Rpdml0eSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHByb2R1Y3ROYW1lIC0gUHJvamVjdCBwcm9kdWN0IG5hbWUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGlzcGxheU5hbWUgLSBVc2VyLXZpc2libGUgYXBwbGljYXRpb24gbGFiZWwuXG4gKiBAcHJvcGVydHkgezIzfSBtaW5pbXVtU2RrIC0gUXVhbGlmaWVkIG1pbmltdW0gQW5kcm9pZCBBUEkuXG4gKiBAcHJvcGVydHkgezM1fSB0YXJnZXRTZGsgLSBRdWFsaWZpZWQgdGFyZ2V0IEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHszNX0gY29tcGlsZVNkayAtIFF1YWxpZmllZCBjb21waWxlIEFuZHJvaWQgQVBJLlxuICogQHByb3BlcnR5IHtcIjM1LjAuMFwifSBidWlsZFRvb2xzVmVyc2lvbiAtIFF1YWxpZmllZCBBbmRyb2lkIEJ1aWxkIFRvb2xzIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge251bWJlcn0gdmVyc2lvbkNvZGUgLSBQb3NpdGl2ZSBBbmRyb2lkIHZlcnNpb24gY29kZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB2ZXJzaW9uTmFtZSAtIENhbm9uaWNhbCBhcHBsaWNhdGlvbiB2ZXJzaW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1widW5zcGVjaWZpZWRcIn0gb3JpZW50YXRpb24gLSBCYXNlbGluZSBvcmllbnRhdGlvbiBiZWhhdmlvci5cbiAqIEBwcm9wZXJ0eSB7XCJzeXN0ZW1cIn0gdGhlbWUgLSBQbGF0Zm9ybS1uYXRpdmUgdGhlbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBbmRyb2lkQXBwbGljYXRpb25JbnB1dEZpbGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwYXRoIC0gU2FmZSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBzZWxlY3RlZCBmaXhlZCBBbmRyb2lkIHJlc291cmNlIG9yIGFzc2V0IHJvb3QuXG4gKiBAcHJvcGVydHkge3N0cmluZyB8IFVpbnQ4QXJyYXl9IGNvbnRlbnQgLSBFeGFjdCBjYWxsZXItcHJvdmlkZWQgdGV4dCBvciBieXRlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtZWRpYVR5cGUgLSBFeHBsaWNpdCBhcnRpZmFjdCBtZWRpYSB0eXBlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHNoYTI1NiAtIExvd2VyY2FzZSBTSEEtMjU2IG9mIGV4YWN0IFVURi04IHRleHQgb3IgYnl0ZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZVJvbGVDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZnJvbnRlbmQgLSBQYXJzZXIgYWRhcHRlciBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHRleHRCYWNrZW5kIC0gU2luZ2xlLSBvciBtdWx0aS1maWxlIHRleHQgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeUJhY2tlbmQgLSBCaW5hcnkgYmFja2VuZCBhdmFpbGFiaWxpdHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGFwcGxpY2F0aW9uQmFja2VuZCAtIEFwcGxpY2F0aW9uLWFydGlmYWN0IGJhY2tlbmQgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBpbnRlcm9wZXJhYmlsaXR5IC0gSW50ZXJvcGVyYWJpbGl0eSBicmlkZ2UgYXZhaWxhYmlsaXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSBwcm92aWRlciAtIFRhcmdldCBob3N0IHN0ZGxpYiBwcm92aWRlci9uYXRpdmUtYmluZGluZyBhdmFpbGFiaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZU1hcHBpbmdDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcmljaFRleHQgLSBBdXRob3JpdGF0aXZlIHJpY2ggdGV4dCBtYXBwaW5ncy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gc291cmNlTWFwVjMgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJpbmFyeVJhbmdlcyAtIEJ5dGUtY29vcmRpbmF0ZSBiaW5hcnkvcmVzb3VyY2UgbWFwcGluZ3MuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMYW5ndWFnZUFjY2VwdGFuY2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgQWNjZXB0YW5jZVN0YWdlW119IHN0YWdlcyAtIEFwcGxpY2FibGUgb3JkZXJlZCBhY2NlcHRhbmNlIHN0YWdlcy5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgc3RyaW5nW119IHRvb2xjaGFpbnMgLSBSZXF1aXJlZCBjYW5vbmljYWwgdG9vbGNoYWluIElEcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExhbmd1YWdlRmVhdHVyZUNhcGFiaWxpdGllc1xuICogQHByb3BlcnR5IHtib29sZWFufSBnZW5lcmFsRnVuY3Rpb25zQW5kQ2FsbHMgLSBUYXNrIDAwNSBhcmJpdHJhcnkgcmVxdWlyZWQgc2lnbmF0dXJlcywgcmVzb2x2ZWQgZGlyZWN0IGNhbGxzLCBhbmQgdm9pZCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGltbXV0YWJsZUNvbGxlY3Rpb25zIC0gVGFzayAwMDYgcmVjdXJzaXZlIGltbXV0YWJsZSBsaXN0cy9tYXBzLCB0b3RhbCBhY2Nlc3MsIGFuZCBzaXplLlxuICogQHByb3BlcnR5IHtib29sZWFufSBvcHRpb25hbFZhbHVlcyAtIFRhc2sgMDA3IGV4cGxpY2l0IG9wdGlvbmFsIHZhbHVlcywgcHJlc2VuY2UgdGVzdHMsIGFuZCBndWFyZGVkIHVud3JhcC5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gb3JkZXJlZExpc3RJdGVyYXRpb24gLSBUYXNrIDAwOCBvcmRlcmVkIGltbXV0YWJsZS1saXN0IGl0ZXJhdGlvbiBhbmQgbmVhcmVzdC1sb29wIGNvbnRyb2wuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IG9yZGVyZWRNYXBJdGVyYXRpb24gLSBUYXNrIDAxNCBpbnNlcnRpb24tb3JkZXJlZCBpbW11dGFibGUtbWFwIHBhaXIgaXRlcmF0aW9uLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjb25kaXRpb25Db250cm9sbGVkTG9vcHMgLSBUYXNrIDAzMiBzdHJpY3QtQm9vbGVhbiBwcmUtY29uZGl0aW9uIGxvb3BzIGFuZCByZXNvbHZlZCBjb250cm9sLlxuICogQHByb3BlcnR5IHtib29sZWFufSBjbG9zZWRSZWNvcmRzIC0gVGFzayAwMDkgbm9taW5hbCBjbG9zZWQgaW1tdXRhYmxlIHJlY29yZHMsIGNvbnN0cnVjdGlvbiwgYW5kIG1lbWJlciByZWFkcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gdHlwZWRFcnJvcnMgLSBUYXNrIDAxMSBub21pbmFsIHVuY2hlY2tlZCBlcnJvcnMsIHJhaXNlcywgYW5kIGV4YWN0IHR5cGVkIGNhdGNoZXMuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHR5cGVQYXJhbWV0ZXJzQW5kR2VuZXJpY3MgLSBUYXNrIDAxMiBpbnZhcmlhbnQgdW5ib3VuZGVkIHR5cGUgcGFyYW1ldGVycyBhbmQgY2xvc2VkIGdlbmVyaWMgYXBwbGljYXRpb25zLlxuICogQHByb3BlcnR5IHtib29sZWFufSByZWZlcmVuY2VDbGFzc2VzIC0gVGFzayAwMzMgbm9taW5hbCByZWZlcmVuY2UgY2xhc3NlcywgcHJpdmF0ZSBpbnN0YW5jZSBzdGF0ZSwgZXhhY3QgY29uc3RydWN0b3JzLCBhbmQgcmVjZWl2ZXIgbWV0aG9kcy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZWZmZWN0ZnVsQ2FwYWJpbGl0aWVzQW5kUmVzb3VyY2VzIC0gVGFzayAwMzQgYXV0aG9yaXplZCBob3N0IGVmZmVjdHMsIHR5cGVkIGZhaWx1cmVzLCBhbmQgb3duZWQgcmVzb3VyY2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGFuZ3VhZ2VDYXBhYmlsaXRpZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSByZWdpc3RyeSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VSb2xlQ2FwYWJpbGl0aWVzPn0gcm9sZXMgLSBJbmRlcGVuZGVudGx5IHJlZ2lzdGVyZWQgcm9sZXMuXG4gKiBAcHJvcGVydHkge1wic2luZ2xlXCIgfCBcIm11bHRpcGxlXCJ9IGFydGlmYWN0TXVsdGlwbGljaXR5IC0gVGFyZ2V0IGFydGlmYWN0IG11bHRpcGxpY2l0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gcm91bmRUcmlwIC0gV2hldGhlciBmcm9udGVuZC9iYWNrZW5kIHJvdW5kLXRyaXAgYWNjZXB0YW5jZSBpcyBkZWNsYXJlZC5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VGZWF0dXJlQ2FwYWJpbGl0aWVzPn0gZmVhdHVyZXMgLSBTZW1hbnRpYyBmZWF0dXJlIGNhcGFiaWxpdGllcy5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8TGFuZ3VhZ2VNYXBwaW5nQ2FwYWJpbGl0aWVzPn0gbWFwcGluZyAtIE1hcHBpbmcgZm9ybXMuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PExhbmd1YWdlQWNjZXB0YW5jZUNhcGFiaWxpdGllcz59IGFjY2VwdGFuY2UgLSBTdGFnZXMgYW5kIHRvb2xjaGFpbnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VQb2ludFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGxpbmUgLSBPbmUtYmFzZWQgbGluZS5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb2x1bW4gLSBPbmUtYmFzZWQgVVRGLTE2IGNvZGUtdW5pdCBjb2x1bW4uXG4gKiBAcHJvcGVydHkge251bWJlcn0gb2Zmc2V0IC0gWmVyby1iYXNlZCBVVEYtMTYgc291cmNlIG9mZnNldC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNvdXJjZUxvY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmlsZW5hbWUgLSBPcmlnaW5hdGluZyBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlUG9pbnR9IHN0YXJ0IC0gSW5jbHVzaXZlIHN0YXJ0LlxuICogQHByb3BlcnR5IHtTb3VyY2VQb2ludH0gZW5kIC0gRXhjbHVzaXZlIGVuZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlZ2lzdGVyZWRTb3VyY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFJlZ2lzdHJ5LWxvY2FsIGRldGVybWluaXN0aWMgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYWwgZmlsZW5hbWUsIHByZXNlcnZlZCB2ZXJiYXRpbS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgbnVsbH0gY29udGVudCAtIE9yaWdpbmFsIHNvdXJjZSBjb250ZW50LCBwcmVzZXJ2ZWQgdmVyYmF0aW0gd2hlbiBhdmFpbGFibGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTGFuZ3VhZ2UgfCBudWxsfSBsYW5ndWFnZSAtIFBhcnNlciBsYW5ndWFnZSB3aGVuIGtub3duLlxuICogQHByb3BlcnR5IHtcImFwcGxpY2F0aW9uXCIgfCBcImZhY2FkZVwifSBbb3duZXJzaGlwXSAtIENhbGxlciBvciBjb21waWxlci1vd25lZCBzb3VyY2Ugcm9sZSBmb3Igc2VtYW50aWMgcHJvZ3JhbXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTb3VyY2VPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJzb3VyY2VcIn0ga2luZCAtIERpcmVjdCBzb3VyY2UgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VJZCAtIFJlZ2lzdGVyZWQgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBvcmlnaW5hbCByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlbGF0ZWRPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzb3VyY2VJZCAtIFJlZ2lzdGVyZWQgc291cmNlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBSZWxhdGVkIG9yaWdpbmFsIHJhbmdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub2RlSWRdIC0gUmVsYXRlZCBzZW1hbnRpYyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZWxhdGVkIHNlbWFudGljIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBSZWxhdGlvbnNoaXAgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIERlcml2ZWRPcmlnaW5cbiAqIEBwcm9wZXJ0eSB7XCJkZXJpdmVkXCJ9IGtpbmQgLSBQcm92ZW5hbmNlIGRlcml2ZWQgZnJvbSBvbmUgb3IgbW9yZSBvcmlnaW5zLlxuICogQHByb3BlcnR5IHtSZWxhdGVkT3JpZ2luW119IG9yaWdpbnMgLSBPcmRlcmVkLCBub24tZW1wdHkgb3JpZ2luYWwgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3ludGhldGljT3JpZ2luXG4gKiBAcHJvcGVydHkge1wic3ludGhldGljXCJ9IGtpbmQgLSBTb3VyY2UtZnJlZSBnZW5lcmF0ZWQgb3Igc2VtYW50aWMgc2NhZmZvbGRpbmcuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gU3RhYmxlIGh1bWFuLXJlYWRhYmxlIHJlYXNvbi5cbiAqIEBwcm9wZXJ0eSB7UmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIE9yZGVyZWQgcmVsYXRlZCByYW5nZXMsIHBvc3NpYmx5IGVtcHR5LlxuICovXG5cbi8qKiBAdHlwZWRlZiB7U291cmNlT3JpZ2luIHwgRGVyaXZlZE9yaWdpbiB8IFN5bnRoZXRpY09yaWdpbn0gU2VtYW50aWNPcmlnaW4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRCeXRlUmFuZ2VcbiAqIEBwcm9wZXJ0eSB7e3N0YXJ0OiBudW1iZXIsIGVuZDogbnVtYmVyfX0gZ2VuZXJhdGVkIC0gSGFsZi1vcGVuIGdlbmVyYXRlZCBieXRlIG9mZnNldHMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBTZW1hbnRpYyBvciBleHBsaWNpdCBzeW50aGV0aWMgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIE9yaWdpbmF0aW5nIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIE9yaWdpbmF0aW5nIHNlbWFudGljIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBTZW1hbnRpYyBvciBiaW5hcnktcmVnaW9uIHJvbGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nXG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRCeXRlTWFwcGluZ1wifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcImJ5dGVzXCJ9IGNvb3JkaW5hdGVTeXN0ZW0gLSBHZW5lcmF0ZWQgb2Zmc2V0cyBhcmUgYnl0ZXMsIG5ldmVyIHRleHQgY29sdW1ucy5cbiAqIEBwcm9wZXJ0eSB7e3BhdGg6IHN0cmluZywgYnl0ZUxlbmd0aDogbnVtYmVyfX0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIGFydGlmYWN0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0ZWRCeXRlUmFuZ2VbXX0gcmFuZ2VzIC0gT3JkZXJlZCBub24tb3ZlcmxhcHBpbmcgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkTm9kZVByb3ZlbmFuY2VcIn0gc2NoZW1hIC0gQXNzb2NpYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIEFzc29jaWF0aW9uIHZlcnNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBTb3VyY2UgYXNzb2NpYXRpb24gaW5kZXBlbmRlbnQgb2YgdHJhdmVyc2FsIHBvc2l0aW9uLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBTb3VyY2VMb2NhdGlvbj4+fSByYW5nZXMgLSBFeGFjdCBzZW1hbnRpYy10b2tlbiBzdWJyYW5nZXMgYnkgcm9sZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTm9kZVByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcGF0aCAtIEpTT04gUG9pbnRlciBmcm9tIHRoZSBzZW1hbnRpYyBtb2R1bGUgcm9vdC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlW1wia2luZFwiXSB8IFwiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gU2VtYW50aWMgbm9kZSBraW5kLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY09yaWdpbn0gb3JpZ2luIC0gQ2xvc2VkIHByb3ZlbmFuY2UgdmFsdWUuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PFJlY29yZDxzdHJpbmcsIFNvdXJjZUxvY2F0aW9uPj59IHJhbmdlcyAtIEV4YWN0IHNlbWFudGljLXRva2VuIHN1YnJhbmdlcyBieSByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzeW1ib2xJZF0gLSBSZXNvbHZlZCBkZWNsYXJlZC9yZWZlcmVuY2VkIHN5bWJvbCBpZGVudGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljU3ltYm9sUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbm9kZUlkIC0gUmVmZXJyaW5nIHNlbWFudGljIG5vZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUm9sZX0gcm9sZSAtIFJlZmVyZW5jZSByb2xlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCByZWZlcmVuY2UgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIHN5bWJvbCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU2VtYW50aWMgc3ltYm9sIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sS2luZH0ga2luZCAtIFN5bWJvbCBjYXRlZ29yeS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbk5vZGVJZCAtIERlY2xhcmluZyBub2RlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzZW1hbnRpY0RlY2xhcmF0aW9uSWRdIC0gU3RhYmxlIHNlbWFudGljIGRlY2xhcmF0aW9uIGlkZW50aXR5IGZvciByZWNvcmQsIGZpZWxkLCBhbmQgZnVuY3Rpb24gc3ltYm9scy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRXhhY3QgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNTeW1ib2xSZWZlcmVuY2VbXX0gcmVmZXJlbmNlcyAtIE9yZGVyZWQgcmVzb2x2ZWQgcmVmZXJlbmNlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkUHJvdmVuYW5jZVwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtcInV0ZjE2XCJ9IGNvb3JkaW5hdGVTeXN0ZW0gLSBPZmZzZXQgYW5kIGNvbHVtbiB1bml0LlxuICogQHByb3BlcnR5IHtSZWdpc3RlcmVkU291cmNlW119IHNvdXJjZXMgLSBWZXJzaW9uZWQgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVQcm92ZW5hbmNlW119IG5vZGVzIC0gRGV0ZXJtaW5pc3RpYyBub2RlIGluZGV4LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1N5bWJvbFByb3ZlbmFuY2VbXX0gc3ltYm9scyAtIERldGVybWluaXN0aWMgc3ltYm9sIGluZGV4LlxuICovXG5cbi8qKiBAdHlwZWRlZiB7XCJleGFjdFwiIHwgXCJhbmNob3JcIiB8IFwic3ludGhldGljXCJ9IE1hcHBpbmdLaW5kICovXG5cbi8qKlxuICogQHR5cGVkZWYgU2VtYW50aWZvbGRNYXBwaW5nU3BhblxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gZ2VuZXJhdGVkIC0gR2VuZXJhdGVkIGhhbGYtb3BlbiByYW5nZS5cbiAqIEBwcm9wZXJ0eSB7TWFwcGluZ0tpbmR9IG1hcHBpbmdLaW5kIC0gTWFwcGluZyBwcmVjaXNpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljT3JpZ2lufSBvcmlnaW4gLSBDbG9zZWQgb3JpZ2luYWwgcHJvdmVuYW5jZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9kZUlkXSAtIFJlbGF0ZWQgY2Fub25pY2FsIHNlbWFudGljIG5vZGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3N5bWJvbElkXSAtIFJlbGF0ZWQgY2Fub25pY2FsIHNlbWFudGljIHN5bWJvbC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbcm9sZV0gLSBTZW1hbnRpYyB0b2tlbiByb2xlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtuYW1lXSAtIFVzZWZ1bCBzeW1ib2wgbmFtZSBmb3IgU291cmNlIE1hcCB2My5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZFNvdXJjZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gT3V0cHV0IGZpbGVuYW1lLlxuICogQHByb3BlcnR5IHtHZW5lcmF0ZWRUZXh0TGFuZ3VhZ2V9IGxhbmd1YWdlIC0gT3V0cHV0IHRleHQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29udGVudCAtIEV4YWN0IGdlbmVyYXRlZCBMRiBzb3VyY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpZm9sZE1hcHBpbmdcbiAqIEBwcm9wZXJ0eSB7XCJTZW1hbnRpZm9sZE1hcHBpbmdcIn0gc2NoZW1hIC0gU2NoZW1hIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBTY2hlbWEgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJ1dGYxNlwifSBjb29yZGluYXRlU3lzdGVtIC0gT2Zmc2V0IGFuZCBjb2x1bW4gdW5pdC5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkU291cmNlfSBnZW5lcmF0ZWQgLSBHZW5lcmF0ZWQgcHJvZ3JhbSBpZGVudGl0eSBhbmQgY29udGVudC5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gT3JpZ2luYWwgc291cmNlIHJlZ2lzdHJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVQcm92ZW5hbmNlW119IG5vZGVzIC0gQ2Fub25pY2FsIHNlbWFudGljIG5vZGUgaW5kZXguXG4gKiBAcHJvcGVydHkge1NlbWFudGljU3ltYm9sUHJvdmVuYW5jZVtdfSBzeW1ib2xzIC0gQ2Fub25pY2FsIHNlbWFudGljIHN5bWJvbCBpbmRleC5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nU3BhbltdfSBzcGFucyAtIE9yZGVyZWQgZ2VuZXJhdGVkIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEdlbmVyYXRlZEFydGlmYWN0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gY29kZSAtIEdlbmVyYXRlZCBvdXRwdXQgcHJvZ3JhbSwgaW5jbHVkaW5nIGFueSByZXF1ZXN0ZWQgZGlyZWN0aXZlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpbGVuYW1lIC0gR2VuZXJhdGVkIG91dHB1dCBmaWxlbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNMYW5ndWFnZX0gbGFuZ3VhZ2UgLSBPdXRwdXQgbGFuZ3VhZ2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGlmb2xkTWFwcGluZ30gbWFwcGluZyAtIEF1dGhvcml0YXRpdmUgcmljaCBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBTb3VyY2UgTWFwIHYzIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTWFwRmlsZW5hbWUgLSBEZWZhdWx0IGV4dGVybmFsIFNvdXJjZSBNYXAgZmlsZW5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUZXh0QXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1widGV4dFwifSBraW5kIC0gUmljaCB0ZXh0IHByb3ZlbmFuY2UgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWZvbGRNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSByYW5nZSBtYXBwaW5nLlxuICogQHByb3BlcnR5IHtpbXBvcnQoXCJAanJpZGdld2VsbC9nZW4tbWFwcGluZ1wiKS5FbmNvZGVkU291cmNlTWFwfSBzb3VyY2VNYXAgLSBJbnRlcm9wZXJhYmxlIHByb2plY3Rpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NvdXJjZU1hcEZpbGVuYW1lXSAtIExvZ2ljYWwgU291cmNlIE1hcCBzaWRlY2FyIHBhdGguXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlXG4gKiBAcHJvcGVydHkge1wiYnl0ZXNcIn0ga2luZCAtIEJ5dGUgcHJvdmVuYW5jZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpZm9sZEJ5dGVNYXBwaW5nfSBtYXBwaW5nIC0gQXV0aG9yaXRhdGl2ZSBieXRlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFydGlmYWN0U3ludGhldGljUHJvdmVuYW5jZVxuICogQHByb3BlcnR5IHtcInN5bnRoZXRpY1wifSBraW5kIC0gU3ludGhldGljIGFydGlmYWN0IGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVhc29uIC0gRXhwbGljaXQgdGFyZ2V0LXNjYWZmb2xkaW5nIHJlYXNvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUmVsYXRlZE9yaWdpbltdfSByZWxhdGVkT3JpZ2lucyAtIFJlbGF0ZWQgc2VtYW50aWMgc291cmNlIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge1RleHRBcnRpZmFjdFByb3ZlbmFuY2UgfCBCeXRlQXJ0aWZhY3RQcm92ZW5hbmNlIHwgQXJ0aWZhY3RTeW50aGV0aWNQcm92ZW5hbmNlfSBBcnRpZmFjdFByb3ZlbmFuY2UgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHZW5lcmF0ZWRTZXRBcnRpZmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGggLSBVbmlxdWUgc2FmZSByZWxhdGl2ZSBQT1NJWCBwYXRoLlxuICogQHByb3BlcnR5IHtcInRleHRcIiB8IFwiYmluYXJ5XCJ9IGNvbnRlbnRLaW5kIC0gQ29udGVudCByZXByZXNlbnRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nIHwgVWludDhBcnJheX0gY29udGVudCAtIFRleHQgb3IgYSBkZXRhY2hlZCBjb3B5IG9mIHRoZSBleGFjdCBnZW5lcmF0ZWQgYnl0ZXMgb24gZXZlcnkgYmluYXJ5IHJlYWQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWVkaWFUeXBlIC0gQXJ0aWZhY3QgbWVkaWEgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7R2VuZXJhdGVkQXJ0aWZhY3RSb2xlfSByb2xlIC0gQXJ0aWZhY3Qgcm9sZTsgZXhhY3RseSBvbmUgc2V0IGFydGlmYWN0IGlzIGVudHJ5LlxuICogQHByb3BlcnR5IHtcImdlbmVyYXRlZFwifSBvd25lcnNoaXAgLSBUYXNrLTAxNSBvd25lcnNoaXAgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0FydGlmYWN0UHJvdmVuYW5jZX0gcHJvdmVuYW5jZSAtIFRleHQsIGJ5dGUtcmFuZ2UsIG9yIHN5bnRoZXRpYyBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgR2VuZXJhdGVkQXJ0aWZhY3RTZXRcbiAqIEBwcm9wZXJ0eSB7XCJHZW5lcmF0ZWRBcnRpZmFjdFNldFwifSBzY2hlbWEgLSBTY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MX0gdmVyc2lvbiAtIFNjaGVtYSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIFN0YWJsZSBsYW5ndWFnZSBvciB0YXJnZXQgSUQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZW50cnkgLSBQYXRoIG9mIHRoZSBzb2xlIGRlY2xhcmVkIGVudHJ5IGFydGlmYWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBHZW5lcmF0ZWRTZXRBcnRpZmFjdFtdfSBhcnRpZmFjdHMgLSBEZXRlcm1pbmlzdGljIGFydGlmYWN0IG9yZGVyLlxuICogQHByb3BlcnR5IHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj59IFttZXRhZGF0YV0gLSBEZXRhY2hlZCB0YXJnZXQtc3BlY2lmaWMgSlNPTiBtZXRhZGF0YS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIERpc2NvdmVyZWRUb29sY2hhaW5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFRvb2xjaGFpbiBJRC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb21tYW5kIC0gRG9jdW1lbnRlZCBjYW5vbmljYWwgY29tbWFuZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleGVjdXRhYmxlIC0gRXhhY3QgYWJzb2x1dGUgZXhlY3V0YWJsZSBwYXRoLlxuICogQHByb3BlcnR5IHtcIm92ZXJyaWRlXCIgfCBcImNhbm9uaWNhbFwifSBzb3VyY2UgLSBSZXNvbHV0aW9uIHJvdXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBGaXJzdCBzZWxlY3RlZC1zdHJlYW0gdmVyc2lvbiBsaW5lLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb25PdXRwdXQgLSBDb21wbGV0ZSBub3JtYWxpemVkIHN0ZG91dCwgb3Igbm9ybWFsaXplZCBzdGRlcnIgd2hlbiBzdGRvdXQgaXMgZW1wdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSB2ZXJzaW9uQXJndW1lbnRzIC0gRXhhY3QgdmVyc2lvbiBhcmd1bWVudCBhcnJheS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEFjY2VwdGFuY2VTdGFnZVJlc3VsdFxuICogQHByb3BlcnR5IHtBY2NlcHRhbmNlU3RhZ2V9IHN0YWdlIC0gQ29tcGxldGVkIHN0YWdlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4ZWN1dGFibGUgLSBFeGFjdCBleGVjdXRhYmxlIHVzZWQuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd1bWVudHMgLSBFeGFjdCBhcmd1bWVudCBhcnJheSB1c2VkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBEaXNjb3ZlcmVkIHRvb2wgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdGRvdXQgLSBDYXB0dXJlZCBzdGFuZGFyZCBvdXRwdXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RkZXJyIC0gQ2FwdHVyZWQgc3RhbmRhcmQgZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBY2NlcHRhbmNlUmVzdWx0XG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGFyZ2V0IC0gVGFyZ2V0IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRpcmVjdG9yeSAtIFJlbW92ZWQgaXNvbGF0ZWQgcHJvamVjdCBkaXJlY3RvcnkgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IEFjY2VwdGFuY2VTdGFnZVJlc3VsdFtdfSBzdGFnZXMgLSBPcmRlcmVkIGNvbXBsZXRlZCBzdGFnZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUmVmZXJlbmNlXG4gKiBAcHJvcGVydHkge1wiVHlwZVJlZmVyZW5jZVwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1R5cGVOYW1lfSBuYW1lIC0gTm9ybWFsaXplZCBzY2FsYXIgdmFsdWUgdHlwZSBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlUGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge1wiVHlwZVBhcmFtZXRlclwifSBraW5kIC0gRGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgdHlwZSBwYXJhbWV0ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBkZWNsYXJhdGlvbi1zY29wZWQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIHR5cGUgcGFyYW1ldGVyIG5hbWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbiBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGRlY2xhcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBUeXBlVmFyaWFibGVSZWZlcmVuY2VcbiAqIEBwcm9wZXJ0eSB7XCJUeXBlVmFyaWFibGVSZWZlcmVuY2VcIn0ga2luZCAtIFJlZmVyZW5jZSB0byBvbmUgZGVjbGFyYXRpb24tc2NvcGVkIHR5cGUgcGFyYW1ldGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhcmFtZXRlcklkIC0gU3RhYmxlIHJlZmVyZW5jZWQgdHlwZS1wYXJhbWV0ZXIgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFBhcnNlci1vd25lZCByZWZlcmVuY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBMaXN0VHlwZVxuICogQHByb3BlcnR5IHtcIkxpc3RUeXBlXCJ9IGtpbmQgLSBSZWN1cnNpdmUgbGlzdC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSBlbGVtZW50VHlwZSAtIEhvbW9nZW5lb3VzIGVsZW1lbnQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBNYXBUeXBlXG4gKiBAcHJvcGVydHkge1wiTWFwVHlwZVwifSBraW5kIC0gUmVjdXJzaXZlIG1hcC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IGtleVR5cGUgLSBFeGFjdCBzdHJpbmcga2V5IHR5cGUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB2YWx1ZVR5cGUgLSBIb21vZ2VuZW91cyB2YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGFyZ3VtZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9yZGVyZWRNYXBUeXBlXG4gKiBAcHJvcGVydHkge1wiT3JkZXJlZE1hcFR5cGVcIn0ga2luZCAtIERpc3RpbmN0IGluc2VydGlvbi1vcmRlcmVkIG1hcC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1R5cGVSZWZlcmVuY2V9IGtleVR5cGUgLSBFeGFjdCBzdXBwb3J0ZWQgc3RyaW5nIGtleSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gSG9tb2dlbmVvdXMgdmFsdWUgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7XCJpbnNlcnRpb25cIn0gb3JkZXIgLSBDYW5vbmljYWwgZmlyc3QtaW5zZXJ0aW9uIGVuY291bnRlciBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG91dGVyIGFuZCBhcmd1bWVudCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFR5cGVcIn0ga2luZCAtIEV4cGxpY2l0IHByZXNlbmNlL2Fic2VuY2UgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdmFsdWVUeXBlIC0gRXhhY3QgcHJlc2VudC12YWx1ZSB0eXBlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3V0ZXIgYW5kIGNvbnN0aXR1ZW50IHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZFR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJSZWNvcmRUeXBlXCJ9IGtpbmQgLSBOb21pbmFsIHJlY29yZC10eXBlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgcmVjb3JkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZVtdfSBbYXJndW1lbnRzXSAtIEV4YWN0IGludmFyaWFudCB0eXBlIGFyZ3VtZW50czsgcmVxdWlyZWQgZm9yIGdlbmVyaWMgZGVjbGFyYXRpb25zIGFuZCBhYnNlbnQgZm9yIG5vbi1nZW5lcmljIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yVHlwZVxuICogQHByb3BlcnR5IHtcIkVycm9yVHlwZVwifSBraW5kIC0gTm9taW5hbCB1bmNoZWNrZWQtZXJyb3IgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgZXJyb3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWZlcmVuY2VUeXBlXG4gKiBAcHJvcGVydHkge1wiUmVmZXJlbmNlVHlwZVwifSBraW5kIC0gTm9taW5hbCByZWZlcmVuY2UtY2xhc3MgdHlwZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHlwZS1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRSZXNvdXJjZVR5cGVcbiAqIEBwcm9wZXJ0eSB7XCJPd25lZFJlc291cmNlVHlwZVwifSBraW5kIC0gQ29tcGlsZXItb3duZWQgbGluZWFyIHJlc291cmNlIHR5cGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gcmVzb3VyY2VJZCAtIEV4YWN0IGF1dGhvcml0eSByZXNvdXJjZSBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHR5cGUtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkUmVmZXJlbmNlVHlwZVxuICogQHByb3BlcnR5IHtcIk93bmVkUmVmZXJlbmNlVHlwZVwifSBraW5kIC0gTGluZWFyIHJlZmVyZW5jZSB0aGF0IG93bnMgb25lIHByb3RlY3RlZCByZXNvdXJjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3Qgb3duZWQgY2xhc3MgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtUeXBlUmVmZXJlbmNlIHwgVHlwZVZhcmlhYmxlUmVmZXJlbmNlIHwgTGlzdFR5cGUgfCBNYXBUeXBlIHwgT3JkZXJlZE1hcFR5cGUgfCBPcHRpb25hbFR5cGUgfCBSZWNvcmRUeXBlIHwgUmVmZXJlbmNlVHlwZSB8IE93bmVkUmVzb3VyY2VUeXBlIHwgT3duZWRSZWZlcmVuY2VUeXBlfSBTZW1hbnRpY1ZhbHVlVHlwZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1ZhbHVlVHlwZSB8IEVycm9yVHlwZX0gU2VtYW50aWNCaW5kaW5nVHlwZSAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZVxuICogQHByb3BlcnR5IHtcIlR5cGVSZWZlcmVuY2VcIn0ga2luZCAtIFZvaWQgcmV0dXJuIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1widm9pZFwifSBuYW1lIC0gTm9ybWFsaXplZCBub24tdmFsdWUgZnVuY3Rpb24gcmV0dXJuLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZSB0aGF0IHN1cnZpdmVzIHNlbWFudGljIHRyYW5zZm9ybXMuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1ZhbHVlVHlwZSB8IEZ1bmN0aW9uUmV0dXJuVHlwZVJlZmVyZW5jZX0gU2VtYW50aWNGdW5jdGlvblJldHVyblR5cGUgKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY1R5cGVOYW1lIHwge2tpbmQ6IFwiVHlwZVZhcmlhYmxlUmVmZXJlbmNlXCIsIHBhcmFtZXRlcklkOiBzdHJpbmd9IHwge2tpbmQ6IFwiTGlzdFR5cGVcIiwgZWxlbWVudFR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIk1hcFR5cGVcIiwga2V5VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHl9IHwge2tpbmQ6IFwiT3JkZXJlZE1hcFR5cGVcIiwga2V5VHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIHZhbHVlVHlwZTogU2VtYW50aWNUeXBlSWRlbnRpdHksIG9yZGVyOiBcImluc2VydGlvblwifSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZUlkZW50aXR5fSB8IHtraW5kOiBcIlJlY29yZFR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nLCBhcmd1bWVudHM/OiBTZW1hbnRpY1R5cGVJZGVudGl0eVtdfSB8IHtraW5kOiBcIlJlZmVyZW5jZVR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nfSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlSWQ6IHN0cmluZ30gfCB7a2luZDogXCJPd25lZFJlZmVyZW5jZVR5cGVcIiwgZGVjbGFyYXRpb25JZDogc3RyaW5nfX0gU2VtYW50aWNUeXBlSWRlbnRpdHkgKi9cbi8qKiBAdHlwZWRlZiB7U2VtYW50aWNUeXBlSWRlbnRpdHkgfCBcInZvaWRcIn0gRnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHkgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXNvbHZlZEZ1bmN0aW9uU2lnbmF0dXJlXG4gKiBAcHJvcGVydHkge1wiUmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gcGFyYW1ldGVyVHlwZXMgLSBFeGFjdCByZXF1aXJlZCBwb3NpdGlvbmFsIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCByZXNvbHZlZCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlSWRlbnRpdHlbXX0gW3R5cGVBcmd1bWVudHNdIC0gSW5mZXJyZWQgZGVjbGFyYXRpb24tb3JkZXIgdHlwZSBhcmd1bWVudHMgZm9yIGEgZ2VuZXJpYyBjYWxsLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUGFyYW1ldGVyXG4gKiBAcHJvcGVydHkge1wiUGFyYW1ldGVyXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIFBhcmFtZXRlciB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRFZmZlY3RPcGVyYXRpb25TaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGNhcGFiaWxpdHlJZCAtIEV4YWN0IGNhcGFiaWxpdHkgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3BlcmF0aW9uSWQgLSBFeGFjdCBvcGVyYXRpb24gZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3Qgb3JkZXJlZCBwYXJhbWV0ZXIgdHlwZXMuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uUmV0dXJuVHlwZUlkZW50aXR5fSByZXR1cm5UeXBlIC0gRXhhY3Qgb3BlcmF0aW9uIHJlc3VsdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gZWZmZWN0cyAtIENsb3NlZCBpbml0aWFsIGVmZmVjdCBzZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmYWlsdXJlSWRzIC0gRXhhY3Qgb3JkZXJlZCBkZWNsYXJlZCBmYWlsdXJlcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VGbG93fSByZXNvdXJjZUZsb3cgLSBFeGFjdCBvd25lcnNoaXAgdHJhbnNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE93bmVkTW92ZUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJPd25lZE1vdmVFeHByZXNzaW9uXCJ9IGtpbmQgLSBFeHBsaWNpdCBsaW5lYXIgb3duZXJzaGlwIHRyYW5zZmVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIE1vdmVkIG93bmVyLlxuICogQHByb3BlcnR5IHtPd25lZFJlc291cmNlVHlwZSB8IE93bmVkUmVmZXJlbmNlVHlwZX0gdHlwZSAtIEV4YWN0IG93bmVkIHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEV4YWN0IHRyYW5zZmVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBEZXJpdmVkIHNvdXJjZSBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3duZWRCb3Jyb3dFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiT3duZWRCb3Jyb3dFeHByZXNzaW9uXCJ9IGtpbmQgLSBJbW1lZGlhdGUgbm9uZXNjYXBpbmcgcmVzb3VyY2UgYm9ycm93LlxuICogQHByb3BlcnR5IHtcInNoYXJlZFwiIHwgXCJleGNsdXNpdmVcIn0gbW9kZSAtIEJvcnJvdyBtb2RlLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IFJlY2VpdmVyRXhwcmVzc2lvbiB8IFByaXZhdGVGaWVsZFJlYWR9IGV4cHJlc3Npb24gLSBCb3Jyb3dlZCBwbGFjZS5cbiAqIEBwcm9wZXJ0eSB7T3duZWRSZXNvdXJjZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHR5cGUgLSBFeGFjdCBvd25lZCB0eXBlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBFeGFjdCBib3Jyb3cgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIERlcml2ZWQgc291cmNlIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdENhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBDb21waWxlci1hdXRob3JpemVkIGVmZmVjdCBpbnZvY2F0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG9wZXJhdGlvbiAtIEV4YWN0IG9wZXJhdGlvbiBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBTb3VyY2Utb3JkZXJlZCBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZWZmZWN0U2l0ZUlkIC0gRGV0ZXJtaW5pc3RpYyBzZW1hbnRpYyBldmFsdWF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtSZXNvbHZlZEVmZmVjdE9wZXJhdGlvblNpZ25hdHVyZX0gcmVzb2x1dGlvbiAtIENvbXBsZXRlIGF1dGhvcml0eSByZXNvbHV0aW9uLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjYWxsIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgb3BlcmF0aW9uLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RQYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lIC0gU3RhYmxlIHBhcmFtZXRlciBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IG9yZGVyZWQgcGFyYW1ldGVyIHR5cGUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7a2luZDogXCJub25lXCJ9IHwge2tpbmQ6IFwiYWNxdWlyZVwiLCByZXNvdXJjZUlkOiBzdHJpbmd9IHwge2tpbmQ6IFwiYm9ycm93XCIgfCBcImNsb3NlXCIsIHBhcmFtZXRlckluZGV4OiBudW1iZXIsIHRlcm1pbmFsRmFpbHVyZUlkOiBzdHJpbmd9fSBFZmZlY3RSZXNvdXJjZUZsb3cgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RSZXNvdXJjZURlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvblwifSBraW5kIC0gQ2FwYWJpbGl0eSByZXNvdXJjZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBub21pbmFsIHJlc291cmNlIG5hbWUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFZmZlY3RGYWlsdXJlRGVjbGFyYXRpb25cIn0ga2luZCAtIENhcGFiaWxpdHkgZmFpbHVyZSBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIERldGVybWluaXN0aWMgYXV0aG9yaXR5LWxvY2FsIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBub21pbmFsIGZhaWx1cmUgbmFtZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiRWZmZWN0T3BlcmF0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIENvbXBpbGVyLWF1dGhvcml6ZWQgb3BlcmF0aW9uIGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBhdXRob3JpdHktbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG9wZXJhdGlvbiBuYW1lLlxuICogQHByb3BlcnR5IHtFZmZlY3RQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBFeGFjdCByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gZWZmZWN0cyAtIENsb3NlZCBpbml0aWFsIGVmZmVjdCBzZXQuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBmYWlsdXJlSWRzIC0gT3JkZXJlZCBub21pbmFsIGZhaWx1cmUgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0UmVzb3VyY2VGbG93fSByZXNvdXJjZUZsb3cgLSBFeGFjdCBvd25lcnNoaXAgdHJhbnNpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvblwifSBraW5kIC0gQXV0aG9yaXplZCBjYXBhYmlsaXR5IGRlY2xhcmF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGlkIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXV0aG9yaXR5SWQgLSBPcGFxdWUgYXV0aG9yaXR5IGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBDYXBhYmlsaXR5IG5hbWUuXG4gKiBAcHJvcGVydHkge0VmZmVjdFJlc291cmNlRGVjbGFyYXRpb25bXX0gcmVzb3VyY2VzIC0gT3JkZXJlZCByZXNvdXJjZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdEZhaWx1cmVEZWNsYXJhdGlvbltdfSBmYWlsdXJlcyAtIE9yZGVyZWQgZmFpbHVyZXMuXG4gKiBAcHJvcGVydHkge0VmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uW119IG9wZXJhdGlvbnMgLSBPcmRlcmVkIG9wZXJhdGlvbnMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYXBhYmlsaXR5QXV0aG9yaXR5XG4gKiBAcHJvcGVydHkge1wiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCJ9IHNjaGVtYSAtIEF1dGhvcml0eSBzY2hlbWEgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7MSB8IDJ9IHNjaGVtYVZlcnNpb24gLSBBdXRob3JpdHkgcGF5bG9hZCB2ZXJzaW9uLCBub3QgYSBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0IHZlcnNpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBPcGFxdWUgY2FsbGVyLXN1cHBsaWVkIGF1dGhvcml0eSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uW119IGNhcGFiaWxpdGllcyAtIE5vcm1hbGl6ZWQgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtjb250cmFjdFZlcnNpb25dIC0gRGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdCB2ZXJzaW9uLCBwcmVzZW50IG9ubHkgd2hlbiB0aGUgY2FsbGVyIHN1cHBsaWVkIG9uZS5cbiAqIEBwcm9wZXJ0eSB7e2lkZW50aXR5OiBzdHJpbmcsIGNvbnRyYWN0VmVyc2lvbjogc3RyaW5nLCBjYXBhYmlsaXRpZXM6IEVmZmVjdENhcGFiaWxpdHlEZWNsYXJhdGlvbltdfVtdfSBbbW9kdWxlc10gLSBTY2hlbWEtdjIgY2Fub25pY2FsIG1vZHVsZSBhdXRob3JpdGllcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge3ttb2R1bGU6IHN0cmluZywgbmFtZTogc3RyaW5nfX0gQ2FwYWJpbGl0eURlY2xhcmF0aW9uUmVmZXJlbmNlSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e25hbWU6IHN0cmluZywgdHlwZTogU2VtYW50aWNUeXBlTmFtZSB8IHtraW5kOiBcIk93bmVkUmVzb3VyY2VUeXBlXCIsIHJlc291cmNlOiBzdHJpbmcgfCBDYXBhYmlsaXR5RGVjbGFyYXRpb25SZWZlcmVuY2VJbnB1dH0gfCB7a2luZDogXCJPcHRpb25hbFR5cGVcIiwgdmFsdWVUeXBlOiBTZW1hbnRpY1R5cGVOYW1lfX19IENhcGFiaWxpdHlQYXJhbWV0ZXJJbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nfX0gQ2FwYWJpbGl0eU5hbWVkSW5wdXQgKi9cbi8qKiBAdHlwZWRlZiB7e2tpbmQ6IFwibm9uZVwifSB8IHtraW5kOiBcImFjcXVpcmVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcImJvcnJvd1wiIHwgXCJjbG9zZVwiLCBwYXJhbWV0ZXJJbmRleDogbnVtYmVyLCB0ZXJtaW5hbEZhaWx1cmU6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fX0gQ2FwYWJpbGl0eVJlc291cmNlRmxvd0lucHV0ICovXG4vKiogQHR5cGVkZWYge3tuYW1lOiBzdHJpbmcsIHBhcmFtZXRlcnM6IENhcGFiaWxpdHlQYXJhbWV0ZXJJbnB1dFtdLCByZXR1cm5UeXBlOiBGdW5jdGlvblJldHVyblR5cGVOYW1lIHwge2tpbmQ6IFwiT3duZWRSZXNvdXJjZVR5cGVcIiwgcmVzb3VyY2U6IHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0fSB8IHtraW5kOiBcIk9wdGlvbmFsVHlwZVwiLCB2YWx1ZVR5cGU6IFNlbWFudGljVHlwZU5hbWV9LCBlZmZlY3RzOiBbXCJob3N0XCJdLCBmYWlsdXJlczogKHN0cmluZyB8IENhcGFiaWxpdHlEZWNsYXJhdGlvblJlZmVyZW5jZUlucHV0KVtdLCByZXNvdXJjZUZsb3c6IENhcGFiaWxpdHlSZXNvdXJjZUZsb3dJbnB1dH19IENhcGFiaWxpdHlPcGVyYXRpb25JbnB1dCAqL1xuLyoqIEB0eXBlZGVmIHt7bmFtZTogc3RyaW5nLCByZXNvdXJjZXM6IENhcGFiaWxpdHlOYW1lZElucHV0W10sIGZhaWx1cmVzOiBDYXBhYmlsaXR5TmFtZWRJbnB1dFtdLCBvcGVyYXRpb25zOiBDYXBhYmlsaXR5T3BlcmF0aW9uSW5wdXRbXX19IENhcGFiaWxpdHlEZWNsYXJhdGlvbklucHV0ICovXG4vKiogQHR5cGVkZWYge3tpZGVudGl0eTogc3RyaW5nLCBjb250cmFjdFZlcnNpb246IHN0cmluZywgY2FwYWJpbGl0aWVzOiBDYXBhYmlsaXR5RGVjbGFyYXRpb25JbnB1dFtdfX0gQ2FwYWJpbGl0eUF1dGhvcml0eU1vZHVsZUlucHV0ICovXG4vKiogQHR5cGVkZWYge3tzY2hlbWE6IFwiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCIsIHNjaGVtYVZlcnNpb246IDEsIGlkOiBzdHJpbmcsIGNhcGFiaWxpdGllczogQ2FwYWJpbGl0eURlY2xhcmF0aW9uSW5wdXRbXSwgY29udHJhY3RWZXJzaW9uPzogc3RyaW5nfSB8IHtzY2hlbWE6IFwiU2VtYW50aWZvbGRDYXBhYmlsaXR5QXV0aG9yaXR5XCIsIHNjaGVtYVZlcnNpb246IDIsIGlkOiBzdHJpbmcsIG1vZHVsZXM6IENhcGFiaWxpdHlBdXRob3JpdHlNb2R1bGVJbnB1dFtdfX0gQ2FwYWJpbGl0eUF1dGhvcml0eUlucHV0ICovXG5cbi8qKlxuICogQHR5cGVkZWYgTGlzdExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJMaXN0TGl0ZXJhbFwifSBraW5kIC0gT3JkZXJlZCBpbW11dGFibGUgbGlzdCBsaXRlcmFsLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGVsZW1lbnRzIC0gU291cmNlLW9yZGVyZWQsIGR1cGxpY2F0ZS1wcmVzZXJ2aW5nIGVsZW1lbnRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwRW50cnlcbiAqIEBwcm9wZXJ0eSB7XCJNYXBFbnRyeVwifSBraW5kIC0gU291cmNlLW9yZGVyZWQgbWFwIGluaXRpYWxpemVyIGVudHJ5LlxuICogQHByb3BlcnR5IHtTdHJpbmdMaXRlcmFsfSBrZXkgLSBMaXRlcmFsIG5vbm51bWVyaWMgc3RyaW5nIGtleS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gdmFsdWUgLSBFbnRyeSB2YWx1ZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1hcExpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJNYXBMaXRlcmFsXCJ9IGtpbmQgLSBJbW11dGFibGUgbWFwIGxpdGVyYWw7IGVudHJ5IG9yZGVyIGlzIGRpYWdub3N0aWMtb25seS5cbiAqIEBwcm9wZXJ0eSB7TWFwRW50cnlbXX0gZW50cmllcyAtIFNvdXJjZSBpbml0aWFsaXplciBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE9yZGVyZWRNYXBMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiT3JkZXJlZE1hcExpdGVyYWxcIn0ga2luZCAtIEltbXV0YWJsZSBtYXAgbGl0ZXJhbCB3aXRoIG9ic2VydmFibGUgZmlyc3QtaW5zZXJ0aW9uIG9yZGVyLlxuICogQHByb3BlcnR5IHtNYXBFbnRyeVtdfSBlbnRyaWVzIC0gU291cmNlLW9yZGVyZWQgdW5pcXVlIGVudHJpZXMuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG9yZGVyZWQgY29uc3RydWN0aW9uIGJvdW5kYXJ5LlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExpc3RJbmRleEV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJMaXN0SW5kZXhFeHByZXNzaW9uXCJ9IGtpbmQgLSBUb3RhbCB6ZXJvLWJhc2VkIGxpc3QgaW5kZXguXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbGxlY3Rpb24gLSBMaXN0LXZhbHVlZCByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gaW5kZXggLSBJbnRlZ2VyIGluZGV4LlxuICogQHByb3BlcnR5IHtcInByb3ZlblwiIHwgXCJmYWlsLW9uLWFic2VuY2VcIn0gdG90YWxpdHkgLSBBZG1pc3Npb24gYmFzaXM7IG5ldmVyIG9wdGlvbmFsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWFwTG9va3VwRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIk1hcExvb2t1cEV4cHJlc3Npb25cIn0ga2luZCAtIFRvdGFsIHN0cmluZy1rZXkgbWFwIGxvb2t1cC5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIE1hcC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGtleSAtIFN0cmluZyBrZXkgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJwcm92ZW5cIiB8IFwiZmFpbC1vbi1hYnNlbmNlXCJ9IHRvdGFsaXR5IC0gQWRtaXNzaW9uIGJhc2lzOyBuZXZlciBvcHRpb25hbC5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENvbGxlY3Rpb25TaXplRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNvbGxlY3Rpb25TaXplRXhwcmVzc2lvblwifSBraW5kIC0gRmluaXRlIGNvbGxlY3Rpb24gc2l6ZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gY29sbGVjdGlvbiAtIExpc3QtIG9yIG1hcC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge1wibGlzdFwiIHwgXCJtYXBcIn0gW2NvbGxlY3Rpb25LaW5kXSAtIFZhbGlkYXRlZCByZWNlaXZlciBraW5kIGZvciB0YXJnZXQgc3BlbGxpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZGVudGlmaWVyRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIklkZW50aWZpZXJFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFJlZmVyZW5jZWQgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEludGVnZXJMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiSW50ZWdlckxpdGVyYWxcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB2YWx1ZSAtIEphdmFTY3JpcHQtc2FmZSBpbnRlZ2VyIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQm9vbGVhbkxpdGVyYWxcbiAqIEBwcm9wZXJ0eSB7XCJCb29sZWFuTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtib29sZWFufSB2YWx1ZSAtIEJvb2xlYW4gdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdHJpbmdMaXRlcmFsXG4gKiBAcHJvcGVydHkge1wiU3RyaW5nTGl0ZXJhbFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZhbHVlIC0gVW5pY29kZSBzdHJpbmcgdmFsdWUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBPcHRpb25hbE5vbmVcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbE5vbmVcIn0ga2luZCAtIENvbnRleHR1YWxseSB0eXBlZCBhYnNlbmNlIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxTb21lXG4gKiBAcHJvcGVydHkge1wiT3B0aW9uYWxTb21lXCJ9IGtpbmQgLSBFeHBsaWNpdCBwcmVzZW50IG9wdGlvbmFsIHZhbHVlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSB2YWx1ZSAtIEV4YWN0IG5vbi1vcHRpb25hbCBwcmVzZW50IHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxJc1ByZXNlbnRcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbElzUHJlc2VudFwifSBraW5kIC0gUHJlc2VuY2UgdGVzdCBmb3Igb25lIHNpbXBsZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gb3BlcmFuZCAtIFRlc3RlZCBvcHRpb25hbCBiaW5kaW5nLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgT3B0aW9uYWxVbndyYXBcbiAqIEBwcm9wZXJ0eSB7XCJPcHRpb25hbFVud3JhcFwifSBraW5kIC0gR3VhcmRlZCB1bndyYXAgb2Ygb25lIHNpbXBsZSBpZGVudGlmaWVyLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gb3BlcmFuZCAtIFByb3Zlbi1wcmVzZW50IG9wdGlvbmFsIGJpbmRpbmcuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBVbmFyeUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJVbmFyeUV4cHJlc3Npb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNVbmFyeU9wZXJhdGlvbn0gb3BlcmF0aW9uIC0gQ2xvc2VkIHNlbWFudGljIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gb3BlcmFuZCAtIE9wZXJhbmQgZXZhbHVhdGVkIGV4YWN0bHkgb25jZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNUeXBlTmFtZX0gdHlwZSAtIEV4cGxpY2l0IG9wZXJhdGlvbiByZXN1bHQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEJpbmFyeUV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJCaW5hcnlFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1NlbWFudGljQmluYXJ5T3BlcmF0aW9ufSBvcGVyYXRpb24gLSBDbG9zZWQgc2VtYW50aWMgb3BlcmF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBsZWZ0IC0gTGVmdCBvcGVyYW5kLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByaWdodCAtIFJpZ2h0IG9wZXJhbmQuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZU5hbWV9IHR5cGUgLSBFeHBsaWNpdCBvcGVyYXRpb24gcmVzdWx0IHR5cGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDYWxsRXhwcmVzc2lvblxuICogQHByb3BlcnR5IHtcIkNhbGxFeHByZXNzaW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2FsbGVlIC0gRnVuY3Rpb24gbmFtZS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBQb3NpdGlvbmFsIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRGdW5jdGlvblNpZ25hdHVyZX0gW3Jlc29sdXRpb25dIC0gRGV0ZXJtaW5pc3RpYyBkZWNsYXJhdGlvbiBhbmQgc2lnbmF0dXJlIGJpbmRpbmcsIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2VmZmVjdFNpdGVJZF0gLSBEZXRlcm1pbmlzdGljIHNpdGUgaWRlbnRpdHkgd2hlbiB0aGUgcmVzb2x2ZWQgZnVuY3Rpb24gcmVhY2hlcyBhIGhvc3QgZWZmZWN0LlxuICogQHByb3BlcnR5IHtyZWFkb25seSBbXCJob3N0XCJdfSBbZWZmZWN0c10gLSBJbmZlcnJlZCBjaGVja2VkIGhvc3QtZWZmZWN0IGZhY3QuXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBbZmFpbHVyZUlkc10gLSBPcmRlcmVkIGNhcGFiaWxpdHkgZmFpbHVyZXMgcmVhY2hhYmxlIHRocm91Z2ggdGhpcyBjYWxsLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRDb25zdHJ1Y3RvclNpZ25hdHVyZVxuICogQHByb3BlcnR5IHtcIlJlc29sdmVkQ29uc3RydWN0b3JTaWduYXR1cmVcIn0ga2luZCAtIFJlc29sdXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gRXhhY3QgY29uc3RydWN0b3IgZGVjbGFyYXRpb24gaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgY29uc3RydWN0b3IgcGFyYW1ldGVyIHR5cGVzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVzb2x2ZWRNZXRob2RTaWduYXR1cmVcbiAqIEBwcm9wZXJ0eSB7XCJSZXNvbHZlZE1ldGhvZFNpZ25hdHVyZVwifSBraW5kIC0gUmVzb2x1dGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlY2xhcmF0aW9uSWQgLSBFeGFjdCByZXNvbHZlZCBtZXRob2QgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVHlwZUlkZW50aXR5W119IHBhcmFtZXRlclR5cGVzIC0gRXhhY3QgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy5cbiAqIEBwcm9wZXJ0eSB7RnVuY3Rpb25SZXR1cm5UeXBlSWRlbnRpdHl9IHJldHVyblR5cGUgLSBFeGFjdCBtZXRob2QgcmV0dXJuIHR5cGUuXG4gKiBAcHJvcGVydHkge3traW5kOiBcInByZXNlcnZlXCIgfCBcInRlcm1pbmFsXCIsIHRlcm1pbmFsRmFpbHVyZUlkPzogc3RyaW5nfX0gW3Jlc291cmNlRmxvd10gLSBPd25lZCByZWNlaXZlciB0cmFuc2l0aW9uIGFuZCBkZWNsYXJlZCB0ZXJtaW5hbC11c2UgZmFpbHVyZSB3aGVuIGFwcGxpY2FibGUuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNlaXZlckV4cHJlc3Npb25cbiAqIEBwcm9wZXJ0eSB7XCJSZWNlaXZlckV4cHJlc3Npb25cIn0ga2luZCAtIFRoZSBkZWNsYXJpbmcgY2xhc3MgaW5zdGFuY2UgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gY2xhc3NJZCAtIFN0YWJsZSBkZWNsYXJpbmcgY2xhc3MgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSByZWNlaXZlciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJlY2VpdmVyIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVmZXJlbmNlQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVmZXJlbmNlQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBGcmVzaCBub21pbmFsIHJlZmVyZW5jZSBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1JlZmVyZW5jZVR5cGUgfCBPd25lZFJlZmVyZW5jZVR5cGV9IHJlZmVyZW5jZSAtIEV4YWN0IGNsYXNzIHR5cGUuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb25bXX0gYXJndW1lbnRzIC0gU291cmNlLW9yZGVyZWQgY29uc3RydWN0b3IgYXJndW1lbnRzLlxuICogQHByb3BlcnR5IHtSZXNvbHZlZENvbnN0cnVjdG9yU2lnbmF0dXJlfSBbcmVzb2x1dGlvbl0gLSBFeGFjdCBjb25zdHJ1Y3RvciBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gY29uc3RydWN0aW9uIHJlYWNoZXMgYSBob3N0IGVmZmVjdC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1ldGhvZENhbGxFeHByZXNzaW9uXG4gKiBAcHJvcGVydHkge1wiTWV0aG9kQ2FsbEV4cHJlc3Npb25cIn0ga2luZCAtIFJlc29sdmVkIHJlY2VpdmVyLW1ldGhvZCBpbnZvY2F0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByZWNlaXZlciAtIFJlY2VpdmVyIGV2YWx1YXRlZCBvbmNlIGJlZm9yZSBhcmd1bWVudHMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbWV0aG9kIC0gU3RhYmxlIG1ldGhvZCBpZGVudGl0eSBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9uW119IGFyZ3VtZW50cyAtIFNvdXJjZS1vcmRlcmVkIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7UmVzb2x2ZWRNZXRob2RTaWduYXR1cmV9IFtyZXNvbHV0aW9uXSAtIEV4YWN0IG1ldGhvZCBiaW5kaW5nLCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtlZmZlY3RTaXRlSWRdIC0gRGV0ZXJtaW5pc3RpYyBzaXRlIGlkZW50aXR5IHdoZW4gdGhlIG1ldGhvZCByZWFjaGVzIGEgaG9zdCBlZmZlY3QuXG4gKiBAcHJvcGVydHkge3JlYWRvbmx5IFtcImhvc3RcIl19IFtlZmZlY3RzXSAtIEluZmVycmVkIGNoZWNrZWQgaG9zdC1lZmZlY3QgZmFjdC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IFtmYWlsdXJlSWRzXSAtIE9yZGVyZWQgY2FwYWJpbGl0eSBmYWlsdXJlcyByZWFjaGFibGUgdGhyb3VnaCB0aGUgbWV0aG9kLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBjYWxsIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWV0aG9kLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBQcml2YXRlRmllbGRSZWFkXG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkUmVhZFwifSBraW5kIC0gRGVjbGFyaW5nLXJlY2VpdmVyLW9ubHkgcHJpdmF0ZSBmaWVsZCByZWFkLlxuICogQHByb3BlcnR5IHtSZWNlaXZlckV4cHJlc3Npb259IHJlY2VpdmVyIC0gRXhhY3QgZGVjbGFyaW5nIHJlY2VpdmVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZpZWxkIC0gU3RhYmxlIHByaXZhdGUgZmllbGQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIHJlYWQgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBmaWVsZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUmVjb3JkQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkQ29uc3RydWN0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHJlY29yZCBjb25zdHJ1Y3Rpb24uXG4gKiBAcHJvcGVydHkge1JlY29yZFR5cGV9IHJlY29yZCAtIFJlc29sdmVkIHJlY29yZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbltdfSBhcmd1bWVudHMgLSBDb21wbGV0ZSBmaWVsZC1vcmRlcmVkIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIHJlY29yZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgTWVtYmVyUmVhZFxuICogQHByb3BlcnR5IHtcIk1lbWJlclJlYWRcIn0ga2luZCAtIE5vbWluYWwgaW1tdXRhYmxlIHJlY29yZC1maWVsZCByZWFkLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSByZWNlaXZlciAtIFJlY29yZC12YWx1ZWQgcmVjZWl2ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZmllbGQgLSBTdGFibGUgcmVzb2x2ZWQgZmllbGQgaWRlbnRpdHkgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbWVtYmVyLXJlYWQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWVtYmVyLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBFcnJvck1lc3NhZ2VSZWFkXG4gKiBAcHJvcGVydHkge1wiRXJyb3JNZXNzYWdlUmVhZFwifSBraW5kIC0gVGhlIHNvbGUgcG9ydGFibGUgZXJyb3IgbWVtYmVyIG9wZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7SWRlbnRpZmllckV4cHJlc3Npb259IHJlY2VpdmVyIC0gQ2F0Y2ggYmluZGluZyB3aG9zZSBpbW11dGFibGUgbWVzc2FnZSBpcyByZWFkLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBtZXNzYWdlLXJlYWQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbWVzc2FnZS1tZW1iZXIgcmFuZ2UuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtJZGVudGlmaWVyRXhwcmVzc2lvbiB8IFJlY2VpdmVyRXhwcmVzc2lvbiB8IEludGVnZXJMaXRlcmFsIHwgQm9vbGVhbkxpdGVyYWwgfCBTdHJpbmdMaXRlcmFsIHwgT3B0aW9uYWxOb25lIHwgT3B0aW9uYWxTb21lIHwgT3B0aW9uYWxJc1ByZXNlbnQgfCBPcHRpb25hbFVud3JhcCB8IExpc3RMaXRlcmFsIHwgTWFwTGl0ZXJhbCB8IE9yZGVyZWRNYXBMaXRlcmFsIHwgTGlzdEluZGV4RXhwcmVzc2lvbiB8IE1hcExvb2t1cEV4cHJlc3Npb24gfCBDb2xsZWN0aW9uU2l6ZUV4cHJlc3Npb24gfCBVbmFyeUV4cHJlc3Npb24gfCBCaW5hcnlFeHByZXNzaW9uIHwgQ2FsbEV4cHJlc3Npb24gfCBFZmZlY3RDYWxsRXhwcmVzc2lvbiB8IE93bmVkTW92ZUV4cHJlc3Npb24gfCBPd25lZEJvcnJvd0V4cHJlc3Npb24gfCBNZXRob2RDYWxsRXhwcmVzc2lvbiB8IFJlZmVyZW5jZUNvbnN0cnVjdGlvbiB8IFJlY29yZENvbnN0cnVjdGlvbiB8IE1lbWJlclJlYWQgfCBQcml2YXRlRmllbGRSZWFkIHwgRXJyb3JNZXNzYWdlUmVhZH0gRXhwcmVzc2lvbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExvY2FsRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJMb2NhbERlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIERlY2xhcmVkIGxvY2FsIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhwbGljaXQgbG9jYWwgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gbXV0YWJsZSAtIFdoZXRoZXIgbGF0ZXIgYXNzaWdubWVudCBpcyBhbGxvd2VkLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBpbml0aWFsaXplciAtIFJlcXVpcmVkIGluaXRpYWxpemVyIGV4cHJlc3Npb24uXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIERlY2xhcmF0aW9uIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBBc3NpZ25tZW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiQXNzaWdubWVudFN0YXRlbWVudFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtJZGVudGlmaWVyRXhwcmVzc2lvbn0gdGFyZ2V0IC0gU2ltcGxlIGxvY2FsIGFzc2lnbm1lbnQgdGFyZ2V0LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gQXNzaWduZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQXNzaWdubWVudCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkV3JpdGVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJQcml2YXRlRmllbGRXcml0ZVN0YXRlbWVudFwifSBraW5kIC0gRGVjbGFyaW5nLXJlY2VpdmVyLW9ubHkgcHJpdmF0ZSBmaWVsZCBtdXRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7UmVjZWl2ZXJFeHByZXNzaW9ufSByZWNlaXZlciAtIEV4YWN0IGRlY2xhcmluZyByZWNlaXZlci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBmaWVsZCAtIFN0YWJsZSBwcml2YXRlIGZpZWxkIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBleHByZXNzaW9uIC0gTmV3IGZpZWxkIHZhbHVlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBBc3NpZ25tZW50IHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGZpZWxkLW5hbWUgcmFuZ2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZXR1cm5TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJSZXR1cm5TdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gW2V4cHJlc3Npb25dIC0gUmV0dXJuZWQgZXhwcmVzc2lvbjsgYWJzZW50IGV4YWN0bHkgZm9yIGEgYmFyZSB2b2lkIHJldHVybi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEV4cHJlc3Npb25TdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJFeHByZXNzaW9uU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0NhbGxFeHByZXNzaW9uIHwgTWV0aG9kQ2FsbEV4cHJlc3Npb24gfCBFZmZlY3RDYWxsRXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIEEgZGlyZWN0LCByZWNlaXZlciwgb3IgYXV0aG9yaXplZCBjYWxsIHdob3NlIHJlc29sdmVkIHJldHVybiB0eXBlIGlzIHZvaWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBJZlN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIklmU3RhdGVtZW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJyYW5jaCBjb25kaXRpb24uXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBjb25zZXF1ZW50IC0gVHJ1ZSBicmFuY2guXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBbYWx0ZXJuYXRlXSAtIEZhbHNlIGJyYW5jaCwgYWJzZW50IHdoZW4gZXhlY3V0aW9uIGZhbGxzIHRocm91Z2guXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBWYWx1ZUJpbmRpbmdcbiAqIEBwcm9wZXJ0eSB7XCJWYWx1ZUJpbmRpbmdcIn0ga2luZCAtIEl0ZXJhdGlvbi1iaW5kaW5nIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEJvZHktbG9jYWwgYmluZGluZyBuYW1lLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY1ZhbHVlVHlwZX0gdHlwZSAtIEV4YWN0IGxpc3QgZWxlbWVudCB0eXBlLlxuICogQHByb3BlcnR5IHtmYWxzZX0gbXV0YWJsZSAtIEl0ZXJhdGlvbiBiaW5kaW5ncyBhcmUgYWx3YXlzIGltbXV0YWJsZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQmluZGluZyBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRm9yRWFjaFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkZvckVhY2hTdGF0ZW1lbnRcIn0ga2luZCAtIE9yZGVyZWQgbGlzdC1pdGVyYXRpb24gZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gbGlzdCAtIExpc3QgZXhwcmVzc2lvbiBldmFsdWF0ZWQgZXhhY3RseSBvbmNlIGJlZm9yZSB0cmF2ZXJzYWwuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30gdmFsdWVCaW5kaW5nIC0gSW1tdXRhYmxlIGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIExvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRm9yRWFjaE1hcFN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkZvckVhY2hNYXBTdGF0ZW1lbnRcIn0ga2luZCAtIEluc2VydGlvbi1vcmRlcmVkIG1hcCBwYWlyLWl0ZXJhdGlvbiBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBEZXRlcm1pbmlzdGljIG1vZHVsZS1sb2NhbCBsb29wIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciBmcm9udGVuZCB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBtYXAgLSBPcmRlcmVkLW1hcCBleHByZXNzaW9uIGV2YWx1YXRlZCBleGFjdGx5IG9uY2UgYmVmb3JlIHRyYXZlcnNhbC5cbiAqIEBwcm9wZXJ0eSB7VmFsdWVCaW5kaW5nfSBrZXlCaW5kaW5nIC0gSW1tdXRhYmxlIHN0cmluZy1rZXkgYmluZGluZyBzY29wZWQgdG8gdGhlIGJvZHkuXG4gKiBAcHJvcGVydHkge1ZhbHVlQmluZGluZ30gdmFsdWVCaW5kaW5nIC0gSW1tdXRhYmxlIGhvbW9nZW5lb3VzIHZhbHVlIGJpbmRpbmcgc2NvcGVkIHRvIHRoZSBib2R5LlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIExvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgV2hpbGVTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJXaGlsZVN0YXRlbWVudFwifSBraW5kIC0gU3RyaWN0LUJvb2xlYW4gcHJlLWNvbmRpdGlvbiBsb29wIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIERldGVybWluaXN0aWMgbW9kdWxlLWxvY2FsIGxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge0V4cHJlc3Npb259IGNvbmRpdGlvbiAtIEJvb2xlYW4gZXhwcmVzc2lvbiBldmFsdWF0ZWQgYmVmb3JlIGV2ZXJ5IGl0ZXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBPcmRlcmVkIGxvb3AgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgbG9vcCBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQnJlYWtTdGF0ZW1lbnRcbiAqIEBwcm9wZXJ0eSB7XCJCcmVha1N0YXRlbWVudFwifSBraW5kIC0gTmVhcmVzdC1sb29wIGJyZWFrIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldExvb3BJZF0gLSBSZXNvbHZlZCBuZWFyZXN0LWxvb3AgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24gaW4gbG9vcCBjb250ZXh0LlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBLZXl3b3JkIHNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBDb250aW51ZVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIkNvbnRpbnVlU3RhdGVtZW50XCJ9IGtpbmQgLSBOZWFyZXN0LWxvb3AgY29udGludWUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0TG9vcElkXSAtIFJlc29sdmVkIG5lYXJlc3QtbG9vcCBpZGVudGl0eSwgcmVxdWlyZWQgYWZ0ZXIgZnJvbnRlbmQgdmFsaWRhdGlvbiBpbiBsb29wIGNvbnRleHQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEtleXdvcmQgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yQ29uc3RydWN0aW9uXG4gKiBAcHJvcGVydHkge1wiRXJyb3JDb25zdHJ1Y3Rpb25cIn0ga2luZCAtIENvbnN0cnVjdGlvbiBvZiBvbmUgZGVjbGFyZWQgdW5jaGVja2VkIGVycm9yLlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGVycm9yIC0gRXhhY3Qgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtFeHByZXNzaW9ufSBtZXNzYWdlIC0gU29sZSBpbW11dGFibGUgc3RyaW5nIHBheWxvYWQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNvbnN0cnVjdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCB0eXBlIGFuZCBtZXNzYWdlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJhaXNlU3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUmFpc2VTdGF0ZW1lbnRcIn0ga2luZCAtIEFicnVwdCB1bmNoZWNrZWQtZXJyb3IgcHJvcGFnYXRpb24uXG4gKiBAcHJvcGVydHkge0Vycm9yQ29uc3RydWN0aW9ufSBlcnJvciAtIEV4YWN0IGNvbnN0cnVjdGVkIHNlbWFudGljIGVycm9yLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSByYWlzZSBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCByYWlzZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIENhdGNoQmluZGluZ1xuICogQHByb3BlcnR5IHtcIkNhdGNoQmluZGluZ1wifSBraW5kIC0gRXhhY3QtaGFuZGxlciBiaW5kaW5nIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEhhbmRsZXItbG9jYWwgYmluZGluZyBuYW1lLlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IHR5cGUgLSBFeGFjdCBjYXVnaHQgbm9taW5hbCBlcnJvciB0eXBlLlxuICogQHByb3BlcnR5IHtmYWxzZX0gbXV0YWJsZSAtIENhdGNoIGJpbmRpbmdzIGFyZSBpbW11dGFibGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIEJpbmRpbmcgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgYmluZGluZyByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFRyeVN0YXRlbWVudFxuICogQHByb3BlcnR5IHtcIlRyeVN0YXRlbWVudFwifSBraW5kIC0gT25lIGJvZHkgYW5kIG9uZSBleGFjdCB0eXBlZCBoYW5kbGVyLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIFByb3RlY3RlZCBib2R5LlxuICogQHByb3BlcnR5IHtFcnJvclR5cGV9IGNhdGNoVHlwZSAtIEV4YWN0IGNhdWdodCBub21pbmFsIGVycm9yIHR5cGUuXG4gKiBAcHJvcGVydHkge0NhdGNoQmluZGluZ30gY2F0Y2hCaW5kaW5nIC0gSW1tdXRhYmxlIGhhbmRsZXItbG9jYWwgYmluZGluZy5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGNhdGNoQm9keSAtIEhhbmRsZXIgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgdHJ5L2hhbmRsZXIgc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgdHJ5L2NhdGNoIHJhbmdlcy5cbiAqL1xuXG4vKiogQHR5cGVkZWYge0xvY2FsRGVjbGFyYXRpb24gfCBBc3NpZ25tZW50U3RhdGVtZW50fSBMb2NhbFN0YXRlbWVudCAqL1xuLyoqIEB0eXBlZGVmIHtMb2NhbFN0YXRlbWVudCB8IFByaXZhdGVGaWVsZFdyaXRlU3RhdGVtZW50IHwgRXhwcmVzc2lvblN0YXRlbWVudCB8IElmU3RhdGVtZW50IHwgRm9yRWFjaFN0YXRlbWVudCB8IEZvckVhY2hNYXBTdGF0ZW1lbnQgfCBXaGlsZVN0YXRlbWVudCB8IEJyZWFrU3RhdGVtZW50IHwgQ29udGludWVTdGF0ZW1lbnQgfCBSZXR1cm5TdGF0ZW1lbnQgfCBQcmludFN0YXRlbWVudCB8IFJhaXNlU3RhdGVtZW50IHwgVHJ5U3RhdGVtZW50fSBTdGF0ZW1lbnQgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCbG9ja1xuICogQHByb3BlcnR5IHtcIkJsb2NrXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1N0YXRlbWVudFtdfSBzdGF0ZW1lbnRzIC0gT3JkZXJlZCBzdGF0ZW1lbnRzIGluIG9uZSBsZXhpY2FsIHNjb3BlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBTb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIE5vZGUtYXNzb2NpYXRlZCBwcm92ZW5hbmNlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgRnVuY3Rpb25EZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gRGV0ZXJtaW5pc3RpYyBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZ1bmN0aW9uIG5hbWUuXG4gKiBAcHJvcGVydHkge1R5cGVQYXJhbWV0ZXJbXX0gW3R5cGVQYXJhbWV0ZXJzXSAtIE9yZGVyZWQgZGVjbGFyYXRpb24tc2NvcGVkIGludmFyaWFudCB1bmJvdW5kZWQgcGFyYW1ldGVycy5cbiAqIEBwcm9wZXJ0eSB7UGFyYW1ldGVyW119IHBhcmFtZXRlcnMgLSBGdW5jdGlvbiBwYXJhbWV0ZXJzLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0Z1bmN0aW9uUmV0dXJuVHlwZX0gcmV0dXJuVHlwZSAtIFJldHVybiB0eXBlLlxuICogQHByb3BlcnR5IHtCbG9ja30gYm9keSAtIEZ1bmN0aW9uIGJvZHkuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBSZWNvcmRGaWVsZFxuICogQHByb3BlcnR5IHtcIlJlY29yZEZpZWxkXCJ9IGtpbmQgLSBDbG9zZWQgcmVjb3JkLWZpZWxkIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZmllbGQgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEZpZWxkIG5hbWUuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgZmllbGQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmllbGQgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgbmFtZS90eXBlIHJhbmdlcy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFJlY29yZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiUmVjb3JkRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgY2xvc2VkIGltbXV0YWJsZSByZWNvcmQgZGVjbGFyYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFJlY29yZCBuYW1lLlxuICogQHByb3BlcnR5IHtUeXBlUGFyYW1ldGVyW119IFt0eXBlUGFyYW1ldGVyc10gLSBPcmRlcmVkIGRlY2xhcmF0aW9uLXNjb3BlZCBpbnZhcmlhbnQgdW5ib3VuZGVkIHBhcmFtZXRlcnMuXG4gKiBAcHJvcGVydHkge1JlY29yZEZpZWxkW119IGZpZWxkcyAtIE9yZGVyZWQgdW5pcXVlIHZpc2libGUgZmllbGRzLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBkZWNsYXJhdGlvbiBzb3VyY2UgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBkZWNsYXJhdGlvbi1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJpdmF0ZUZpZWxkXG4gKiBAcHJvcGVydHkge1wiUHJpdmF0ZUZpZWxkXCJ9IGtpbmQgLSBEZWNsYXJpbmctY2xhc3MtcHJpdmF0ZSBtdXRhYmxlIGluc3RhbmNlIGZpZWxkLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgY2xhc3Mtc2NvcGVkIGZpZWxkIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBmaWVsZCBuYW1lIGluc2lkZSB0aGUgZGVjbGFyaW5nIGNsYXNzIG9ubHkuXG4gKiBAcHJvcGVydHkge1NlbWFudGljVmFsdWVUeXBlfSB0eXBlIC0gRXhhY3QgZmllbGQgdHlwZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gRmllbGQgZGVjbGFyYXRpb24gbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBuYW1lL3R5cGUgcmFuZ2VzLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ29uc3RydWN0b3JEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNvbnN0cnVjdG9yRGVjbGFyYXRpb25cIn0ga2luZCAtIEV4YWN0IGNvbXBsZXRlIHByaXZhdGUtc3RhdGUgaW5pdGlhbGl6ZXIuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBjbGFzcy1zY29wZWQgY29uc3RydWN0b3IgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge1BhcmFtZXRlcltdfSBwYXJhbWV0ZXJzIC0gRXhhY3QgcG9zaXRpb25hbCBjb25zdHJ1Y3RvciBzaWduYXR1cmUuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRmllbGQtb3JkZXIgaW5pdGlhbGl6YXRpb24gYm9keS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIGNvbnN0cnVjdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgY29uc3RydWN0b3IgbG9jYXRpb24uXG4gKiBAcHJvcGVydHkge1NlbWFudGljTm9kZVNvdXJjZVByb3ZlbmFuY2V9IFtzb3VyY2VQcm92ZW5hbmNlXSAtIFBhcnNlci1vd25lZCBjb25zdHJ1Y3RvciByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIE1ldGhvZERlY2xhcmF0aW9uXG4gKiBAcHJvcGVydHkge1wiTWV0aG9kRGVjbGFyYXRpb25cIn0ga2luZCAtIFJlY2VpdmVyLWJvdW5kIGNsYXNzIG1ldGhvZC5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbaWRdIC0gU3RhYmxlIGNsYXNzLXNjb3BlZCBtZXRob2QgaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIFNvdXJjZS12aXNpYmxlIG1ldGhvZCBuYW1lLlxuICogQHByb3BlcnR5IHtQYXJhbWV0ZXJbXX0gcGFyYW1ldGVycyAtIEV4YWN0IHBvc2l0aW9uYWwgbWV0aG9kIHNpZ25hdHVyZS5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNGdW5jdGlvblJldHVyblR5cGV9IHJldHVyblR5cGUgLSBFeGFjdCByZXR1cm4gdHlwZS5cbiAqIEBwcm9wZXJ0eSB7QmxvY2t9IGJvZHkgLSBNZXRob2QgYm9keS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgW1wiaG9zdFwiXX0gW2VmZmVjdHNdIC0gSW5mZXJyZWQgY2hlY2tlZCBob3N0LWVmZmVjdCBmYWN0LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gW2ZhaWx1cmVJZHNdIC0gT3JkZXJlZCBjYXBhYmlsaXR5IGZhaWx1cmVzIHJlYWNoYWJsZSB0aHJvdWdoIHRoZSBtZXRob2QuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIG1ldGhvZCBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIG1ldGhvZC1uYW1lIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgQ2xhc3NEZWNsYXJhdGlvblxuICogQHByb3BlcnR5IHtcIkNsYXNzRGVjbGFyYXRpb25cIn0ga2luZCAtIE5vbWluYWwgcmVmZXJlbmNlIGNsYXNzIHdpdGggcHJpdmF0ZSBtdXRhYmxlIHN0YXRlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtpZF0gLSBTdGFibGUgbW9kdWxlLWxvY2FsIGNsYXNzIGlkZW50aXR5LCByZXF1aXJlZCBhZnRlciB2YWxpZGF0aW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWUgLSBTb3VyY2UtdmlzaWJsZSBjbGFzcyBuYW1lLlxuICogQHByb3BlcnR5IHtQcml2YXRlRmllbGRbXX0gZmllbGRzIC0gT3JkZXJlZCBwcml2YXRlIGluc3RhbmNlIHN0YXRlLlxuICogQHByb3BlcnR5IHtDb25zdHJ1Y3RvckRlY2xhcmF0aW9ufSBjb25zdHJ1Y3RvciAtIFNvbGUgZXhhY3QgY29uc3RydWN0b3IuXG4gKiBAcHJvcGVydHkge01ldGhvZERlY2xhcmF0aW9uW119IG1ldGhvZHMgLSBPcmRlcmVkIHJlY2VpdmVyIG1ldGhvZHMuXG4gKiBAcHJvcGVydHkge3traW5kOiBcIm9yZGluYXJ5XCJ9IHwge2tpbmQ6IFwib3duZWRSZXNvdXJjZVwiLCBmaWVsZElkOiBzdHJpbmcsIHJlc291cmNlSWQ6IHN0cmluZ319IFtvd25lcnNoaXBdIC0gRXhwbGljaXQgY2xhc3Mgb3duZXJzaGlwIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIENvbXBsZXRlIGNsYXNzIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgY2xhc3MtbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVycm9yRGVjbGFyYXRpb25cbiAqIEBwcm9wZXJ0eSB7XCJFcnJvckRlY2xhcmF0aW9uXCJ9IGtpbmQgLSBOb21pbmFsIHVuY2hlY2tlZCBlcnJvciB3aXRoIG9uZSBpbW11dGFibGUgc3RyaW5nIG1lc3NhZ2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2lkXSAtIFN0YWJsZSBtb2R1bGUtbG9jYWwgZGVjbGFyYXRpb24gaWRlbnRpdHksIHJlcXVpcmVkIGFmdGVyIGZyb250ZW5kIHZhbGlkYXRpb24uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZSAtIEVycm9yIHR5cGUgbmFtZS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZGVjbGFyYXRpb24gc291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgZGVjbGFyYXRpb24tbmFtZSByYW5nZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByaW50U3RhdGVtZW50XG4gKiBAcHJvcGVydHkge1wiUHJpbnRTdGF0ZW1lbnRcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7RXhwcmVzc2lvbn0gZXhwcmVzc2lvbiAtIFByaW50ZWQgZXhwcmVzc2lvbi5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIEVudHJ5UG9pbnRcbiAqIEBwcm9wZXJ0eSB7XCJFbnRyeVBvaW50XCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge0Jsb2NrfSBib2R5IC0gRW50cnktcG9pbnQgYm9keS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gU291cmNlIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBOb2RlLWFzc29jaWF0ZWQgcHJvdmVuYW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljTW9kdWxlXG4gKiBAcHJvcGVydHkge1wiTW9kdWxlXCJ9IGtpbmQgLSBOb2RlIGRpc2NyaW1pbmF0b3IuXG4gKiBAcHJvcGVydHkge1JlY29yZERlY2xhcmF0aW9uW119IFtyZWNvcmRzXSAtIFRvcC1sZXZlbCBub21pbmFsIHJlY29yZCBkZWNsYXJhdGlvbnMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0NsYXNzRGVjbGFyYXRpb25bXX0gW2NsYXNzZXNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVmZXJlbmNlIGNsYXNzZXMgaW4gc291cmNlIG9yZGVyOyBvbWl0dGVkIHdoZW4gZW1wdHkuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zIGluIHNvdXJjZSBvcmRlcjsgb21pdHRlZCB3aGVuIGVtcHR5LlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBDb21waWxlci1hdXRob3JpemVkIFRhc2sgMDM0IGRlY2xhcmF0aW9uczsgb21pc3Npb24gaXMgdGhlIGxlZ2FjeSBlbXB0eSBzZXQuXG4gKiBAcHJvcGVydHkge0Z1bmN0aW9uRGVjbGFyYXRpb25bXX0gZnVuY3Rpb25zIC0gVG9wLWxldmVsIGZ1bmN0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7RW50cnlQb2ludH0gZW50cnlQb2ludCAtIEV4ZWN1dGFibGUgZW50cnkgcG9pbnQuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXg7IG9wdGlvbmFsIGZvciBsZWdhY3kgY2FsbGVyLWF1dGhvcmVkIG1vZHVsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0ltcG9ydFxuICogQHByb3BlcnR5IHtcIkltcG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG1vZHVsZUlkIC0gU3RhYmxlIGltcG9ydGVkIHNlbWFudGljIG1vZHVsZSBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpbXBvcnRlZE5hbWUgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lIGluIHRoZSBzb3VyY2UgbW9kdWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGxvY2FsTmFtZSAtIEJpbmRpbmcgbmFtZSB2aXNpYmxlIGluIHRoZSBpbXBvcnRpbmcgbW9kdWxlLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0RlY2xhcmF0aW9uS2luZH0gc3ltYm9sS2luZCAtIEltcG9ydGVkIGRlY2xhcmF0aW9uIG5hbWVzcGFjZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZWNsYXJhdGlvbklkIC0gU3RhYmxlIHJlc29sdmVkIGRlY2xhcmF0aW9uIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtib29sZWFufSB0eXBlT25seSAtIFdoZXRoZXIgc291cmNlIHN5bnRheCBhZG1pdHRlZCBvbmx5IHR5cGUtcG9zaXRpb24gdXNlLlxuICogQHByb3BlcnR5IHtTb3VyY2VMb2NhdGlvbn0gbG9jYXRpb24gLSBDb21wbGV0ZSBpbXBvcnQgZGVjbGFyYXRpb24vc3BlY2lmaWVyIGxvY2F0aW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY05vZGVTb3VyY2VQcm92ZW5hbmNlfSBbc291cmNlUHJvdmVuYW5jZV0gLSBQYXJzZXItb3duZWQgaW1wb3J0IHJhbmdlcy5cbiAqIEBwcm9wZXJ0eSB7U3RkbGliRmFjYWRlUmVzb2x1dGlvbkV2aWRlbmNlfSBbc3RkbGliRmFjYWRlXSAtIEV4YWN0IHBhcnNlci1wcm92ZWQgbmF0aXZlIGZhY2FkZSBpZGVudGl0eSBldmlkZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYkZhY2FkZVJlc29sdXRpb25FdmlkZW5jZVxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlUmVzb2x1dGlvblwifSBzY2hlbWEgLSBFdmlkZW5jZSBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBFdmlkZW5jZSB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZUlkZW50aXR5IC0gU2VsZWN0ZWQgZmFjYWRlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGZhY2FkZVZlcnNpb24gLSBTZWxlY3RlZCBleGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYXRpdmVNb2R1bGUgLSBQYXJzZXItcHJvdmVkIHNvdXJjZSBzdGRsaWIgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hdGl2ZVN5bWJvbCAtIFBhcnNlci1wcm92ZWQgc291cmNlIHN0ZGxpYiBzeW1ib2wgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY0V4cG9ydFxuICogQHByb3BlcnR5IHtcIkV4cG9ydFwifSBraW5kIC0gTm9kZSBkaXNjcmltaW5hdG9yLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGV4cG9ydGVkTmFtZSAtIE5hbWUgdmlzaWJsZSB0byBpbXBvcnRpbmcgbW9kdWxlcy5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNEZWNsYXJhdGlvbktpbmR9IHN5bWJvbEtpbmQgLSBFeHBvcnRlZCBkZWNsYXJhdGlvbiBuYW1lc3BhY2UuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGVjbGFyYXRpb25JZCAtIFN0YWJsZSBleHBvcnRlZCBkZWNsYXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7U291cmNlTG9jYXRpb259IGxvY2F0aW9uIC0gQ29tcGxldGUgZXhwb3J0IGRlY2xhcmF0aW9uL3NwZWNpZmllciBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gUGFyc2VyLW93bmVkIGV4cG9ydCByYW5nZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTZW1hbnRpY1Byb2dyYW1Nb2R1bGVcbiAqIEBwcm9wZXJ0eSB7XCJNb2R1bGVcIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZCAtIFN0YWJsZSBjYWxsZXItc3VwcGxpZWQgbG9naWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlRmlsZW5hbWUgLSBFeHBsaWNpdCBzb3VyY2UgZmlsZW5hbWU7IG5ldmVyIGFuIGltcGxpY2l0IHJlYWQgcmVxdWVzdC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkRGVjbGFyYXRpb25bXX0gW3JlY29yZHNdIC0gVG9wLWxldmVsIG5vbWluYWwgcmVjb3JkIGRlY2xhcmF0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Q2xhc3NEZWNsYXJhdGlvbltdfSBbY2xhc3Nlc10gLSBDb21waWxlci1vd25lZCBmYWNhZGUgcmVmZXJlbmNlIGNsYXNzZXMuXG4gKiBAcHJvcGVydHkge0Vycm9yRGVjbGFyYXRpb25bXX0gW2Vycm9yc10gLSBUb3AtbGV2ZWwgbm9taW5hbCB1bmNoZWNrZWQgZXJyb3IgZGVjbGFyYXRpb25zLlxuICogQHByb3BlcnR5IHtGdW5jdGlvbkRlY2xhcmF0aW9uW119IGZ1bmN0aW9ucyAtIFRvcC1sZXZlbCBmdW5jdGlvbnMuXG4gKiBAcHJvcGVydHkge1NlbWFudGljSW1wb3J0W119IGltcG9ydHMgLSBSZXNvbHZlZCBpbXBvcnRzIGluIHNvdXJjZSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNFeHBvcnRbXX0gZXhwb3J0cyAtIFJlc29sdmVkIGV4cG9ydHMgaW4gc291cmNlIG9yZGVyLlxuICogQHByb3BlcnR5IHtFZmZlY3RDYXBhYmlsaXR5RGVjbGFyYXRpb25bXX0gW2NhcGFiaWxpdGllc10gLSBBdXRob3JpdHkgZGVjbGFyYXRpb25zIHNoYXJlZCBieSByZWZlcmVuY2Ugd2hlbiB0aGUgcHJvZ3JhbSBkZWNsYXJlcyBhIHN0YW5kYXJkLWxpYnJhcnkgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0VudHJ5UG9pbnR9IFtlbnRyeVBvaW50XSAtIFNvbGUgZXhlY3V0YWJsZSBlbnRyeSBwb2ludCwgcHJlc2VudCBvbmx5IG9uIHRoZSBzZWxlY3RlZCBtb2R1bGUuXG4gKiBAcHJvcGVydHkge1NvdXJjZUxvY2F0aW9ufSBsb2NhdGlvbiAtIFNvdXJjZSBsb2NhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNOb2RlU291cmNlUHJvdmVuYW5jZX0gW3NvdXJjZVByb3ZlbmFuY2VdIC0gTm9kZS1hc3NvY2lhdGVkIHByb3ZlbmFuY2UuXG4gKiBAcHJvcGVydHkge1NlbWFudGljUHJvdmVuYW5jZX0gW3Byb3ZlbmFuY2VdIC0gUGFyc2VyLWF1dGhvcmVkIHNvdXJjZSBhbmQgaWRlbnRpdHkgaW5kZXguXG4gKiBAcHJvcGVydHkge3tpZGVudGl0eTogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmd9fSBbc3RkbGliRmFjYWRlXSAtIFNlbGVjdGVkIGNvbXBpbGVyLW93bmVkIGZhY2FkZSBtb2R1bGUgaWRlbnRpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtTW9kdWxlRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHt7aWRlbnRpdHk6IHN0cmluZywgcmFuZ2U6IHN0cmluZ31bXX0gZGVwZW5kZW5jaWVzIC0gVmVyc2lvbmVkIGZhY2FkZSBkZXBlbmRlbmNpZXMuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWRlbnRpdHkgLSBGYWNhZGUgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkgeyh7aWRlbnRpdHk6IHN0cmluZywga2luZDogXCJtb2R1bGVcIiwgc3ltYm9sczogc3RyaW5nW119IHwge2Zvcm1zOiAoXCJ1bnF1YWxpZmllZC1jYWxsXCIgfCBcInJlY2VpdmVyLWNhbGxcIilbXSwgaWRlbnRpdHk6IHN0cmluZywga2luZDogXCJidWlsdGluXCIsIHN5bWJvbHM6IHN0cmluZ1tdfSlbXX0gbmF0aXZlTW9kdWxlcyAtIEV4YWN0IG5hdGl2ZSBzb3VyY2UgaWRlbnRpdGllcy5cbiAqIEBwcm9wZXJ0eSB7KHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogKFwiZGlyZWN0LWNhbGxcIiB8IFwidW5xdWFsaWZpZWQtY2FsbFwiIHwgXCJyZWNlaXZlci1jYWxsXCIpW10sIGtpbmQ6IFwiZnVuY3Rpb25cIiwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwibm90LWFwcGxpY2FibGVcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9IHwge2NvbnN0cnVjdG9yOiB7ZWZmZWN0czogc3RyaW5nW10sIGZhaWx1cmVzOiBzdHJpbmdbXSwgb3duZXJzaGlwOiBcImFjcXVpcmVkXCIsIHBhcmFtZXRlcnM6IHtuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZ31bXX0sIGZvcm1zOiBbXCJjb25zdHJ1Y3Rvci1jYWxsXCJdLCBraW5kOiBcImNsYXNzXCIsIG1ldGhvZHM6IHtlZmZlY3RzOiBzdHJpbmdbXSwgZmFpbHVyZXM6IHN0cmluZ1tdLCBmb3JtczogW1wicmVjZWl2ZXItY2FsbFwiXSwgbmFtZTogc3RyaW5nLCBvd25lcnNoaXA6IFwiYm9ycm93ZWRcIiB8IFwiY29uc3VtZWRcIiwgcGFyYW1ldGVyczoge25hbWU6IHN0cmluZywgdHlwZTogc3RyaW5nfVtdLCByZXR1cm5UeXBlOiBzdHJpbmd9W10sIG5hbWU6IHN0cmluZywgb3duZXJzaGlwOiBcIm93bmVkLXJlZmVyZW5jZVwifSlbXX0gcHVibGljRGVjbGFyYXRpb25zIC0gUHVibGljIHNvdXJjZSBkZWNsYXJhdGlvbnMuXG4gKiBAcHJvcGVydHkge3ttb2R1bGU6IHN0cmluZywgb3BlcmF0aW9uczogc3RyaW5nW10sIHJhbmdlOiBzdHJpbmd9W119IHJlcXVpcmVtZW50cyAtIENhbm9uaWNhbCBjYXBhYmlsaXR5IHJlcXVpcmVtZW50cy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBydW50aW1lUHJvZmlsZSAtIEV4YWN0IHNvdXJjZSBydW50aW1lIHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc291cmNlTW9kdWxlIC0gQ29tcGlsZXItb3duZWQgc2VtYW50aWMgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHZlcnNpb24gLSBFeGFjdCBmYWNhZGUgdmVyc2lvbi5cbiAqIEBwcm9wZXJ0eSB7XCJpbnRlcm5hbFwiIHwgXCJwdWJsaWNcIn0gdmlzaWJpbGl0eSAtIE5hdGl2ZS1zZWxlY3RhYmxlIHZpc2liaWxpdHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBTdGRsaWJGYWNhZGVQcm9ncmFtRGVzY3JpcHRvclxuICogQHByb3BlcnR5IHtcIlNlbWFudGlmb2xkU3RkbGliRmFjYWRlc1wifSBzY2hlbWEgLSBGYWNhZGUgZGVzY3JpcHRvciBzY2hlbWEuXG4gKiBAcHJvcGVydHkgezF9IHZlcnNpb24gLSBGYWNhZGUgZGVzY3JpcHRvciB2ZXJzaW9uLlxuICogQHByb3BlcnR5IHtTZW1hbnRpY0xhbmd1YWdlfSBsYW5ndWFnZSAtIFNvdXJjZS1sYW5ndWFnZSBjb21wYXRpYmlsaXR5IHByb2ZpbGUuXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1Nb2R1bGVEZXNjcmlwdG9yW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IHNlbGVjdGVkIGV4ZWN1dGFibGUgY2xvc3VyZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFNlbWFudGljUHJvZ3JhbVxuICogQHByb3BlcnR5IHtcIlByb2dyYW1cIn0ga2luZCAtIE5vZGUgZGlzY3JpbWluYXRvci5cbiAqIEBwcm9wZXJ0eSB7U2VtYW50aWNQcm9ncmFtTW9kdWxlW119IG1vZHVsZXMgLSBEZXBlbmRlbmN5LWZpcnN0IGRldGVybWluaXN0aWMgbW9kdWxlIG9yZGVyLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IGVudHJ5TW9kdWxlIC0gU3RhYmxlIGlkZW50aXR5IG9mIHRoZSBzb2xlIGVudHJ5IG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7UmVnaXN0ZXJlZFNvdXJjZVtdfSBzb3VyY2VzIC0gQ2FsbGVyLW9yZGVyIGNvbXBsZXRlIHNvdXJjZSByZWdpc3RyeS5cbiAqIEBwcm9wZXJ0eSB7e2NvbnRyYWN0VmVyc2lvbj86IHN0cmluZywgaWRlbnRpdHk6IHN0cmluZ319IFtzdGRsaWJDb250cmFjdF0gLSBEZWNsYXJlZCBzdGFuZGFyZC1saWJyYXJ5IGNvbnRyYWN0OyBwbGFpbiwgbmV2ZXIgZnJvemVuLlxuICogQHByb3BlcnR5IHt7Y29udHJhY3RWZXJzaW9uPzogc3RyaW5nLCBpZGVudGl0eTogc3RyaW5nfVtdfSBbc3RkbGliQ29udHJhY3RzXSAtIE9yZGVyZWQgZGVjbGFyZWQgc3RhbmRhcmQtbGlicmFyeSBjb250cmFjdHM7IHBsYWluLCBuZXZlciBmcm96ZW4uXG4gKiBAcHJvcGVydHkge1N0ZGxpYkZhY2FkZVByb2dyYW1EZXNjcmlwdG9yfSBbc3RkbGliRmFjYWRlc10gLSBDb21wbGV0ZSBzZWxlY3RlZCBzb3VyY2UtbGFuZ3VhZ2UgZmFjYWRlIGNsb3N1cmUuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY01vZHVsZSB8IFNlbWFudGljUHJvZ3JhbU1vZHVsZSB8IFNlbWFudGljSW1wb3J0IHwgU2VtYW50aWNFeHBvcnQgfCBSZWNvcmREZWNsYXJhdGlvbiB8IENsYXNzRGVjbGFyYXRpb24gfCBFcnJvckRlY2xhcmF0aW9uIHwgRWZmZWN0Q2FwYWJpbGl0eURlY2xhcmF0aW9uIHwgRWZmZWN0UmVzb3VyY2VEZWNsYXJhdGlvbiB8IEVmZmVjdEZhaWx1cmVEZWNsYXJhdGlvbiB8IEVmZmVjdE9wZXJhdGlvbkRlY2xhcmF0aW9uIHwgUmVjb3JkRmllbGQgfCBQcml2YXRlRmllbGQgfCBDb25zdHJ1Y3RvckRlY2xhcmF0aW9uIHwgTWV0aG9kRGVjbGFyYXRpb24gfCBGdW5jdGlvbkRlY2xhcmF0aW9uIHwgVHlwZVBhcmFtZXRlciB8IFBhcmFtZXRlciB8IFZhbHVlQmluZGluZyB8IENhdGNoQmluZGluZyB8IEJsb2NrIHwgU3RhdGVtZW50IHwgRW50cnlQb2ludCB8IEV4cHJlc3Npb24gfCBFcnJvckNvbnN0cnVjdGlvbiB8IEVycm9yVHlwZSB8IE1hcEVudHJ5IHwgU2VtYW50aWNWYWx1ZVR5cGUgfCBGdW5jdGlvblJldHVyblR5cGVSZWZlcmVuY2V9IFNlbWFudGljTm9kZSAqL1xuLyoqIEB0eXBlZGVmIHtTZW1hbnRpY05vZGV9IFNlbWFudGljTm9kZVdpdGhvdXRMb2NhdGlvbnMgKi9cblxuZXhwb3J0IHt9XG4iXX0=
|