semantifold 0.1.1 → 0.3.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 +42 -10
- package/build/index.d.ts +32 -3
- package/build/index.d.ts.map +1 -1
- package/build/index.js +99 -4
- package/build/src/acceptance.d.ts +32 -0
- package/build/src/acceptance.d.ts.map +1 -0
- package/build/src/acceptance.js +358 -0
- package/build/src/array.d.ts +7 -0
- package/build/src/array.d.ts.map +1 -0
- package/build/src/array.js +18 -0
- package/build/src/artifact-path.d.ts +13 -0
- package/build/src/artifact-path.d.ts.map +1 -0
- package/build/src/artifact-path.js +30 -0
- package/build/src/artifacts.d.ts +7 -0
- package/build/src/artifacts.d.ts.map +1 -0
- package/build/src/artifacts.js +389 -0
- package/build/src/backends/c-runtime.d.ts +3 -0
- package/build/src/backends/c-runtime.d.ts.map +1 -0
- package/build/src/backends/c-runtime.js +151 -0
- package/build/src/backends/c-validation.d.ts +12 -0
- package/build/src/backends/c-validation.d.ts.map +1 -0
- package/build/src/backends/c-validation.js +85 -0
- package/build/src/backends/c.d.ts +31 -0
- package/build/src/backends/c.d.ts.map +1 -0
- package/build/src/backends/c.js +308 -0
- package/build/src/backends/cpp-runtime.d.ts +3 -0
- package/build/src/backends/cpp-runtime.d.ts.map +1 -0
- package/build/src/backends/cpp-runtime.js +99 -0
- package/build/src/backends/cpp-validation.d.ts +9 -0
- package/build/src/backends/cpp-validation.d.ts.map +1 -0
- package/build/src/backends/cpp-validation.js +74 -0
- package/build/src/backends/cpp.d.ts +16 -0
- package/build/src/backends/cpp.d.ts.map +1 -0
- package/build/src/backends/cpp.js +285 -0
- package/build/src/backends/csharp.d.ts +20 -0
- package/build/src/backends/csharp.d.ts.map +1 -0
- package/build/src/backends/csharp.js +259 -0
- package/build/src/backends/go.d.ts +20 -0
- package/build/src/backends/go.d.ts.map +1 -0
- package/build/src/backends/go.js +374 -0
- package/build/src/backends/identifiers.d.ts +12 -0
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +79 -2
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -37
- package/build/src/backends/native-validation.d.ts +9 -0
- package/build/src/backends/native-validation.d.ts.map +1 -0
- package/build/src/backends/native-validation.js +59 -0
- package/build/src/backends/ordered-expressions.d.ts +74 -0
- package/build/src/backends/ordered-expressions.d.ts.map +1 -0
- package/build/src/backends/ordered-expressions.js +159 -0
- package/build/src/backends/python.d.ts +8 -0
- package/build/src/backends/python.d.ts.map +1 -0
- package/build/src/backends/python.js +162 -0
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +8 -2
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +67 -19
- package/build/src/binary-mapping.d.ts +32 -0
- package/build/src/binary-mapping.d.ts.map +1 -0
- package/build/src/binary-mapping.js +285 -0
- package/build/src/diagnostic.d.ts +36 -4
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +42 -3
- package/build/src/frontends/c-parser.d.ts +20 -0
- package/build/src/frontends/c-parser.d.ts.map +1 -0
- package/build/src/frontends/c-parser.js +14 -0
- package/build/src/frontends/c.d.ts +220 -0
- package/build/src/frontends/c.d.ts.map +1 -0
- package/build/src/frontends/c.js +750 -0
- package/build/src/frontends/cpp-parser.d.ts +11 -0
- package/build/src/frontends/cpp-parser.d.ts.map +1 -0
- package/build/src/frontends/cpp-parser.js +15 -0
- package/build/src/frontends/cpp.d.ts +227 -0
- package/build/src/frontends/cpp.d.ts.map +1 -0
- package/build/src/frontends/cpp.js +784 -0
- package/build/src/frontends/csharp.d.ts +14 -0
- package/build/src/frontends/csharp.d.ts.map +1 -0
- package/build/src/frontends/csharp.js +708 -0
- package/build/src/frontends/go.d.ts +15 -0
- package/build/src/frontends/go.d.ts.map +1 -0
- package/build/src/frontends/go.js +712 -0
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +5 -23
- package/build/src/frontends/python.d.ts +14 -0
- package/build/src/frontends/python.d.ts.map +1 -0
- package/build/src/frontends/python.js +615 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +21 -1
- package/build/src/language-registry.d.ts +113 -0
- package/build/src/language-registry.d.ts.map +1 -0
- package/build/src/language-registry.js +421 -0
- package/build/src/mapping.js +3 -2
- package/build/src/semantic/location.d.ts +7 -0
- package/build/src/semantic/location.d.ts.map +1 -1
- package/build/src/semantic/location.js +10 -1
- package/build/src/semantic/provenance.js +3 -3
- package/build/src/semantic/types.d.ts +399 -2
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +110 -2
- package/build/src/subprocess.d.ts +38 -0
- package/build/src/subprocess.d.ts.map +1 -0
- package/build/src/subprocess.js +233 -0
- package/build/src/timeout.d.ts +8 -0
- package/build/src/timeout.d.ts.map +1 -0
- package/build/src/timeout.js +11 -0
- package/build/src/toolchains.d.ts +107 -0
- package/build/src/toolchains.d.ts.map +1 -0
- package/build/src/toolchains.js +417 -0
- package/docs/architecture.md +23 -5
- package/docs/c.md +60 -0
- package/docs/cpp.md +61 -0
- package/docs/goals.md +4 -2
- package/docs/language-support.md +46 -6
- package/docs/parser-qualification.md +219 -0
- package/docs/plans/2026-09-05-standard-library-portability.md +46 -0
- package/docs/source-maps.md +38 -5
- package/docs/standard-library-portability.md +190 -0
- package/docs/testing.md +131 -3
- package/index.js +109 -4
- package/node_modules/node-addon-api/LICENSE.md +9 -0
- package/node_modules/node-addon-api/README.md +95 -0
- package/node_modules/node-addon-api/common.gypi +21 -0
- package/node_modules/node-addon-api/except.gypi +25 -0
- package/node_modules/node-addon-api/index.js +14 -0
- package/node_modules/node-addon-api/napi-inl.deprecated.h +186 -0
- package/node_modules/node-addon-api/napi-inl.h +7250 -0
- package/node_modules/node-addon-api/napi.h +3463 -0
- package/node_modules/node-addon-api/node_addon_api.gyp +42 -0
- package/node_modules/node-addon-api/node_api.gyp +9 -0
- package/node_modules/node-addon-api/noexcept.gypi +26 -0
- package/node_modules/node-addon-api/nothing.c +0 -0
- package/node_modules/node-addon-api/package-support.json +21 -0
- package/node_modules/node-addon-api/package.json +481 -0
- package/node_modules/node-addon-api/tools/README.md +73 -0
- package/node_modules/node-addon-api/tools/check-napi.js +99 -0
- package/node_modules/node-addon-api/tools/clang-format.js +71 -0
- package/node_modules/node-addon-api/tools/conversion.js +301 -0
- package/node_modules/node-gyp-build/LICENSE +21 -0
- package/node_modules/node-gyp-build/README.md +58 -0
- package/node_modules/node-gyp-build/SECURITY.md +5 -0
- package/node_modules/node-gyp-build/bin.js +84 -0
- package/node_modules/node-gyp-build/build-test.js +19 -0
- package/node_modules/node-gyp-build/index.js +6 -0
- package/node_modules/node-gyp-build/node-gyp-build.js +207 -0
- package/node_modules/node-gyp-build/optional.js +7 -0
- package/node_modules/node-gyp-build/package.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/LICENSE +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +7 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/README.md +90 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/binding.gyp +79 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/index.js +895 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/package.json +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.cc +106 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.cc +1056 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.cc +298 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.cc +383 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/query.h +39 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.cc +307 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/tree-sitter.d.ts +211 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +501 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +221 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +299 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +419 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +49 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +14 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +774 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2151 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +230 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +62 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4134 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +899 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1060 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +382 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +165 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +714 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +50 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +23 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +109 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1294 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1823 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/README.md +18 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/binding.gyp +29 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/grammar.js +1470 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/package.json +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/darwin-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/linux-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-arm64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/prebuilds/win32-x64/tree-sitter-c.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/highlights.scm +81 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/queries/tags.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/grammar.json +9735 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/node-types.json +4614 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/parser.c +119615 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter-c.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-c/tree-sitter.json +43 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/README.md +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/grammar.js +1436 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/package.json +61 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/darwin-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/linux-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-arm64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/prebuilds/win32-x64/tree-sitter-cpp.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/highlights.scm +70 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/injections.scm +3 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/queries/tags.scm +15 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/grammar.json +17084 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/node-types.json +7997 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/parser.c +530368 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/scanner.c +148 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter-cpp.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-cpp/tree-sitter.json +55 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +22 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +152 -0
- package/node_modules/tree-sitter/LICENSE +21 -0
- package/node_modules/tree-sitter/README.md +128 -0
- package/node_modules/tree-sitter/binding.gyp +88 -0
- package/node_modules/tree-sitter/index.js +950 -0
- package/node_modules/tree-sitter/package.json +76 -0
- package/node_modules/tree-sitter/prebuilds/darwin-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/darwin-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/linux-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-arm64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/prebuilds/win32-x64/tree-sitter.node +0 -0
- package/node_modules/tree-sitter/src/addon_data.h +47 -0
- package/node_modules/tree-sitter/src/binding.cc +35 -0
- package/node_modules/tree-sitter/src/conversions.cc +140 -0
- package/node_modules/tree-sitter/src/conversions.h +22 -0
- package/node_modules/tree-sitter/src/language.cc +105 -0
- package/node_modules/tree-sitter/src/language.h +17 -0
- package/node_modules/tree-sitter/src/logger.cc +70 -0
- package/node_modules/tree-sitter/src/logger.h +19 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.cc +122 -0
- package/node_modules/tree-sitter/src/lookaheaditerator.h +33 -0
- package/node_modules/tree-sitter/src/node.cc +1088 -0
- package/node_modules/tree-sitter/src/node.h +30 -0
- package/node_modules/tree-sitter/src/parser.cc +332 -0
- package/node_modules/tree-sitter/src/parser.h +35 -0
- package/node_modules/tree-sitter/src/query.cc +425 -0
- package/node_modules/tree-sitter/src/query.h +40 -0
- package/node_modules/tree-sitter/src/tree.cc +316 -0
- package/node_modules/tree-sitter/src/tree.h +45 -0
- package/node_modules/tree-sitter/src/tree_cursor.cc +213 -0
- package/node_modules/tree-sitter/src/tree_cursor.h +52 -0
- package/node_modules/tree-sitter/tree-sitter.d.ts +1083 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/include/tree_sitter/api.h +1478 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.c +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/alloc.h +41 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/array.h +291 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/atomic.h +68 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/clock.h +146 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/error_costs.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.c +523 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/get_changed_ranges.h +36 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/host.h +21 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.c +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/language.h +293 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/length.h +52 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.c +483 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lexer.h +54 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/lib.c +12 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/node.c +875 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.c +2297 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/parser.h +286 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/point.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/portable/endian.h +241 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/query.c +4347 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reduce_action.h +34 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/reusable_node.h +95 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.c +912 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/stack.h +133 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.c +1034 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/subtree.h +399 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.c +170 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree.h +31 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.c +716 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/tree_cursor.h +48 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/ts_assert.h +11 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ICU_SHA +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/LICENSE +414 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/README.md +29 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/ptypes.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/umachine.h +448 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/urename.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf.h +1 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf16.h +733 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode/utf8.h +881 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/unicode.h +75 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib-symbols.txt +24 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/stdlib.c +137 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm/wasm-stdlib.h +1314 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.c +1937 -0
- package/node_modules/tree-sitter/vendor/tree-sitter/lib/src/wasm_store.h +31 -0
- package/package.json +24 -6
- package/src/acceptance.js +380 -0
- package/src/array.js +19 -0
- package/src/artifact-path.js +34 -0
- package/src/artifacts.js +420 -0
- package/src/backends/c-runtime.js +151 -0
- package/src/backends/c-validation.js +83 -0
- package/src/backends/c.js +308 -0
- package/src/backends/cpp-runtime.js +99 -0
- package/src/backends/cpp-validation.js +70 -0
- package/src/backends/cpp.js +285 -0
- package/src/backends/csharp.js +270 -0
- package/src/backends/go.js +383 -0
- package/src/backends/identifiers.js +80 -1
- package/src/backends/index.js +23 -32
- package/src/backends/native-validation.js +64 -0
- package/src/backends/ordered-expressions.js +161 -0
- package/src/backends/python.js +175 -0
- package/src/backends/scalars.js +8 -1
- package/src/backends/shared.js +64 -17
- package/src/binary-mapping.js +305 -0
- package/src/diagnostic.js +34 -2
- package/src/frontends/c-parser.js +17 -0
- package/src/frontends/c.js +780 -0
- package/src/frontends/cpp-parser.js +18 -0
- package/src/frontends/cpp.js +816 -0
- package/src/frontends/csharp.js +759 -0
- package/src/frontends/go.js +770 -0
- package/src/frontends/index.js +5 -20
- package/src/frontends/python.js +689 -0
- package/src/frontends/scalars.js +20 -0
- package/src/language-registry.js +454 -0
- package/src/mapping.js +2 -1
- package/src/semantic/location.js +10 -0
- package/src/semantic/provenance.js +2 -2
- package/src/semantic/types.js +124 -1
- package/src/subprocess.js +232 -0
- package/src/timeout.js +12 -0
- package/src/toolchains.js +448 -0
- package/tsconfig.json +1 -0
|
@@ -0,0 +1,750 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { generateCProgram } from "../backends/c.js";
|
|
3
|
+
import { OrderedExpressionPlanner } from "../backends/ordered-expressions.js";
|
|
4
|
+
import { maximumCSourceLength } from "../backends/c-validation.js";
|
|
5
|
+
import { validateNativeGraph } from "../backends/native-validation.js";
|
|
6
|
+
import { isCIdentifier } from "../backends/identifiers.js";
|
|
7
|
+
import { parseCst } from "./c-parser.js";
|
|
8
|
+
import { missingType, parseFailure, SemantifoldDiagnostic, unsupportedSyntax } from "../diagnostic.js";
|
|
9
|
+
import { createCoordinateIndex, indexedPointAt } from "../semantic/location.js";
|
|
10
|
+
import { withAdaptedOperation } from "../semantic/operators.js";
|
|
11
|
+
import { withParserRanges } from "../semantic/provenance.js";
|
|
12
|
+
import { hasOnlyUnicodeScalars } from "../semantic/scalars.js";
|
|
13
|
+
import { validateParsedModule } from "../semantic/validate.js";
|
|
14
|
+
import { sourceScalarType } from "./scalars.js";
|
|
15
|
+
/** @typedef {import("./c-parser.js").CstNode} CstNode */
|
|
16
|
+
/** @typedef {import("../semantic/types.js").Expression} Expression */
|
|
17
|
+
/** @typedef {import("../semantic/types.js").Statement} Statement */
|
|
18
|
+
const binaryOperations = new Map([
|
|
19
|
+
["+", "PhpAdd"], ["-", "Subtract"], ["*", "Multiply"], ["==", "JavaEqual"], ["!=", "JavaNotEqual"],
|
|
20
|
+
["<", "LessThan"], ["<=", "LessThanOrEqual"], [">", "GreaterThan"], [">=", "GreaterThanOrEqual"],
|
|
21
|
+
["&&", "And"], ["||", "Or"]
|
|
22
|
+
]);
|
|
23
|
+
const helpers = new Map([
|
|
24
|
+
["semantifold_integer_add", "PhpAdd"], ["semantifold_integer_subtract", "Subtract"],
|
|
25
|
+
["semantifold_integer_multiply", "Multiply"], ["semantifold_string_concat", "StringConcat"],
|
|
26
|
+
["semantifold_string_equal", "StringEqual"], ["semantifold_string_not_equal", "StringNotEqual"]
|
|
27
|
+
]);
|
|
28
|
+
/** Strict field-and-token consumer for the private frozen C CST. */
|
|
29
|
+
export class CReader {
|
|
30
|
+
/**
|
|
31
|
+
* Owns source content and its coordinate index, never native parser handles.
|
|
32
|
+
* @param {string} filename - Original filename.
|
|
33
|
+
* @param {string} source - Exact original source.
|
|
34
|
+
*/
|
|
35
|
+
constructor(filename, source) {
|
|
36
|
+
this.filename = filename;
|
|
37
|
+
this.source = source;
|
|
38
|
+
this.coordinates = createCoordinateIndex(source);
|
|
39
|
+
this.generated = false;
|
|
40
|
+
/** @type {Map<string, Expression> | undefined} */
|
|
41
|
+
this.temporaryExpressions = undefined;
|
|
42
|
+
/** @type {Set<string> | undefined} */
|
|
43
|
+
this.temporaryNames = undefined;
|
|
44
|
+
/** @type {Map<Statement, {node: CstNode, type: string}>} */
|
|
45
|
+
this.printTypes = new Map();
|
|
46
|
+
/** @type {Set<string>} */
|
|
47
|
+
this.declaredFunctions = new Set();
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Locates one parser-owned range in UTF-16 coordinates.
|
|
51
|
+
* @param {CstNode} node - Parser node.
|
|
52
|
+
* @returns {import("../semantic/types.js").SourceLocation} Verified location.
|
|
53
|
+
*/
|
|
54
|
+
location(node) {
|
|
55
|
+
return { filename: this.filename, start: indexedPointAt(this.coordinates, node.startIndex), end: indexedPointAt(this.coordinates, node.endIndex) };
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Reads only the spelling of an already recognized parser node.
|
|
59
|
+
* @param {CstNode} node - Parser node.
|
|
60
|
+
* @returns {string} Exact token spelling.
|
|
61
|
+
*/
|
|
62
|
+
text(node) {
|
|
63
|
+
return this.source.slice(node.startIndex, node.endIndex);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Rejects a located source-profile violation.
|
|
67
|
+
* @param {CstNode} node - Rejected node.
|
|
68
|
+
* @param {string} [detail] - Profile violation.
|
|
69
|
+
* @returns {never} Always throws.
|
|
70
|
+
*/
|
|
71
|
+
fail(node, detail = node.type) {
|
|
72
|
+
unsupportedSyntax("c", detail, this.location(node));
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Traverses all edges before interpreting any source meaning.
|
|
76
|
+
* @param {CstNode} node - Current parser node.
|
|
77
|
+
* @returns {void}
|
|
78
|
+
*/
|
|
79
|
+
validateTree(node) {
|
|
80
|
+
for (const { node: child } of node.children)
|
|
81
|
+
this.validateTree(child);
|
|
82
|
+
if (node.error || node.missing || node.hasError) {
|
|
83
|
+
throw new SemantifoldDiagnostic({ code: "PARSE_ERROR", language: "c", location: this.location(node), message: `C parser recovery at '${node.type}'.` });
|
|
84
|
+
}
|
|
85
|
+
if (node.extra && node.type != "comment")
|
|
86
|
+
this.fail(node, "unexpected extra parser child");
|
|
87
|
+
if ((node.type == "comment" || node.type == "string_content") && /\?\?[=/'()!<>-]/u.test(this.text(node))) {
|
|
88
|
+
this.fail(node, "trigraph preprocessing");
|
|
89
|
+
}
|
|
90
|
+
if (node.type == "comment") {
|
|
91
|
+
const text = this.text(node);
|
|
92
|
+
// A terminal CR belongs to ordinary CRLF; content after a bare CR is not a C line comment.
|
|
93
|
+
if (/\\(?:\r\n?|\n)/u.test(text) || text.startsWith("//") && /\r(?!\n|$)/u.test(text)) {
|
|
94
|
+
this.fail(node, "preprocessing-sensitive comment");
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Separates harmless comments after every child has been validated.
|
|
100
|
+
* @param {CstNode} node - Parent node.
|
|
101
|
+
* @returns {CstNode[]} Ordered structural children.
|
|
102
|
+
*/
|
|
103
|
+
parts(node) {
|
|
104
|
+
return node.children.map(({ node: child }) => child).filter((child) => child.type != "comment");
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Requires one exact field rather than searching descendants.
|
|
108
|
+
* @param {CstNode} node - Field owner.
|
|
109
|
+
* @param {string} name - Field name.
|
|
110
|
+
* @returns {CstNode} Sole field child.
|
|
111
|
+
*/
|
|
112
|
+
field(node, name) {
|
|
113
|
+
const matches = node.children.filter(({ field }) => field == name);
|
|
114
|
+
if (matches.length != 1)
|
|
115
|
+
return this.fail(node, `expected one '${name}' field`);
|
|
116
|
+
return matches[0].node;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Consumes every structural child, including punctuation.
|
|
120
|
+
* @param {CstNode} node - Shape owner.
|
|
121
|
+
* @param {(CstNode | string)[]} expected - Ordered nodes or token kinds.
|
|
122
|
+
* @returns {void}
|
|
123
|
+
*/
|
|
124
|
+
shape(node, expected) {
|
|
125
|
+
const children = this.parts(node);
|
|
126
|
+
if (children.length != expected.length || children.some((child, index) => typeof expected[index] == "string" ? child.type != expected[index] : child !== expected[index]))
|
|
127
|
+
this.fail(node, `${node.type} child shape`);
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Requires an ordinary caller identifier outside the protected namespace.
|
|
131
|
+
* @param {CstNode} node - Identifier token.
|
|
132
|
+
* @returns {string} Accepted spelling.
|
|
133
|
+
*/
|
|
134
|
+
identifier(node) {
|
|
135
|
+
const name = this.text(node);
|
|
136
|
+
if (node.type != "identifier" || !isCIdentifier(name))
|
|
137
|
+
this.fail(node, "reserved or unsupported identifier");
|
|
138
|
+
return name;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Converts only the canonical scalar type spellings.
|
|
142
|
+
* @param {CstNode} node - Type token.
|
|
143
|
+
* @returns {import("../semantic/types.js").TypeReference} Semantic scalar.
|
|
144
|
+
*/
|
|
145
|
+
type(node) {
|
|
146
|
+
if (!["primitive_type", "type_identifier"].includes(node.type))
|
|
147
|
+
this.fail(node, "scalar type shape");
|
|
148
|
+
const type = sourceScalarType("c", this.text(node), this.location(node));
|
|
149
|
+
if (!type)
|
|
150
|
+
return this.fail(node, "unsupported scalar type");
|
|
151
|
+
return type;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Converts a direct function call's exact argument list.
|
|
155
|
+
* @param {CstNode} node - Call node.
|
|
156
|
+
* @returns {{name: CstNode, arguments: CstNode[]}} Parsed call shape.
|
|
157
|
+
*/
|
|
158
|
+
call(node) {
|
|
159
|
+
if (node.type != "call_expression")
|
|
160
|
+
return this.fail(node, "direct call required");
|
|
161
|
+
const name = this.field(node, "function");
|
|
162
|
+
const list = this.field(node, "arguments");
|
|
163
|
+
this.shape(node, [name, list]);
|
|
164
|
+
if (name.type != "identifier" || list.type != "argument_list")
|
|
165
|
+
this.fail(node, "direct call shape");
|
|
166
|
+
const parts = this.parts(list);
|
|
167
|
+
const args = parts.slice(1, -1).filter((_part, index) => index % 2 == 0);
|
|
168
|
+
this.shape(list, ["(", ...args.flatMap((arg, index) => index == 0 ? [arg] : [",", arg]), ")"]);
|
|
169
|
+
return { arguments: args, name };
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Decodes a parser-backed ordinary C string token as UTF-8 bytes.
|
|
173
|
+
* @param {CstNode} node - String literal.
|
|
174
|
+
* @returns {string} Complete Unicode scalar value.
|
|
175
|
+
*/
|
|
176
|
+
string(node) {
|
|
177
|
+
if (node.type != "string_literal")
|
|
178
|
+
return this.fail(node, "ordinary string literal required");
|
|
179
|
+
const parts = this.parts(node);
|
|
180
|
+
if (parts[0]?.type != '"' || parts.at(-1)?.type != '"')
|
|
181
|
+
this.fail(node, "prefixed string literal");
|
|
182
|
+
const bytes = [];
|
|
183
|
+
for (let index = 1; index < parts.length - 1; index++) {
|
|
184
|
+
const child = parts[index];
|
|
185
|
+
const text = this.text(child);
|
|
186
|
+
if (child.type == "string_content") {
|
|
187
|
+
for (const byte of new TextEncoder().encode(text))
|
|
188
|
+
bytes.push(byte);
|
|
189
|
+
}
|
|
190
|
+
else if (child.type == "escape_sequence") {
|
|
191
|
+
const simple = new Map([["a", 7], ["b", 8], ["f", 12], ["n", 10], ["r", 13], ["t", 9], ["v", 11], ["\\", 92], ['"', 34], ["'", 39], ["?", 63]]);
|
|
192
|
+
const value = text.slice(1);
|
|
193
|
+
if (text[0] != "\\")
|
|
194
|
+
this.fail(child, "invalid escape");
|
|
195
|
+
if (simple.has(value))
|
|
196
|
+
bytes.push(/** @type {number} */ (simple.get(value)));
|
|
197
|
+
else if (/^[0-7]{1,3}$/u.test(value) || /^x[0-9a-fA-F]+$/u.test(value)) {
|
|
198
|
+
const next = parts[index + 1];
|
|
199
|
+
// C consumes every adjacent hex digit; the frozen grammar caps each escape node at four.
|
|
200
|
+
if (value.startsWith("x") && next.type == "string_content" && next.startIndex == child.endIndex && /^[0-9a-fA-F]/u.test(this.text(next))) {
|
|
201
|
+
this.fail(child, "hexadecimal escape split by parser boundary");
|
|
202
|
+
}
|
|
203
|
+
const number = Number.parseInt(value[0] == "x" ? value.slice(1) : value, value[0] == "x" ? 16 : 8);
|
|
204
|
+
if (number > 255)
|
|
205
|
+
this.fail(child, "escape outside byte range");
|
|
206
|
+
bytes.push(number);
|
|
207
|
+
}
|
|
208
|
+
else
|
|
209
|
+
this.fail(child, "unsupported escape");
|
|
210
|
+
}
|
|
211
|
+
else
|
|
212
|
+
this.fail(child, "string child");
|
|
213
|
+
}
|
|
214
|
+
try {
|
|
215
|
+
return new TextDecoder("utf-8", { fatal: true, ignoreBOM: true }).decode(new Uint8Array(bytes));
|
|
216
|
+
}
|
|
217
|
+
catch (error) {
|
|
218
|
+
if (error instanceof TypeError)
|
|
219
|
+
return this.fail(node, "invalid UTF-8 literal bytes");
|
|
220
|
+
throw error;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Converts supported expressions without assuming C argument evaluation order.
|
|
225
|
+
* @param {CstNode} node - Expression node.
|
|
226
|
+
* @param {boolean} [nested] - Whether a semantic call would have unspecified order.
|
|
227
|
+
* @returns {Expression} Semantic expression.
|
|
228
|
+
*/
|
|
229
|
+
expression(node, nested = false) {
|
|
230
|
+
const location = this.location(node);
|
|
231
|
+
if (node.type == "parenthesized_expression") {
|
|
232
|
+
const parts = this.parts(node);
|
|
233
|
+
this.shape(node, ["(", parts[1], ")"]);
|
|
234
|
+
return this.expression(parts[1], nested);
|
|
235
|
+
}
|
|
236
|
+
if (node.type == "identifier") {
|
|
237
|
+
const temporary = this.temporaryExpressions?.get(this.text(node));
|
|
238
|
+
if (temporary) {
|
|
239
|
+
this.temporaryExpressions?.delete(this.text(node));
|
|
240
|
+
return temporary;
|
|
241
|
+
}
|
|
242
|
+
return withParserRanges({ kind: "IdentifierExpression", location, name: this.identifier(node) }, { name: location });
|
|
243
|
+
}
|
|
244
|
+
if (node.type == "true" || node.type == "false") {
|
|
245
|
+
if (this.text(node) != node.type)
|
|
246
|
+
this.fail(node, "noncanonical Boolean literal spelling");
|
|
247
|
+
return withParserRanges({ kind: "BooleanLiteral", location, value: node.type == "true" }, { literal: location });
|
|
248
|
+
}
|
|
249
|
+
if (node.type == "number_literal") {
|
|
250
|
+
const spelling = this.text(node);
|
|
251
|
+
if (!/^(?:0|[1-9][0-9]*)$/u.test(spelling) || !Number.isSafeInteger(Number(spelling)))
|
|
252
|
+
this.fail(node, "non-safe or noncanonical integer");
|
|
253
|
+
return withParserRanges({ kind: "IntegerLiteral", location, value: Number(spelling) }, { literal: location });
|
|
254
|
+
}
|
|
255
|
+
if (node.type == "binary_expression") {
|
|
256
|
+
const left = this.field(node, "left");
|
|
257
|
+
const right = this.field(node, "right");
|
|
258
|
+
const operator = this.field(node, "operator");
|
|
259
|
+
const intent = binaryOperations.get(operator.type);
|
|
260
|
+
this.shape(node, [left, operator, right]);
|
|
261
|
+
if (!intent)
|
|
262
|
+
return this.fail(operator, "unsupported binary operator");
|
|
263
|
+
return this.binary(node, intent, this.expression(left, true), this.expression(right, true), operator);
|
|
264
|
+
}
|
|
265
|
+
if (node.type == "unary_expression") {
|
|
266
|
+
const operator = this.field(node, "operator");
|
|
267
|
+
const argument = this.field(node, "argument");
|
|
268
|
+
this.shape(node, [operator, argument]);
|
|
269
|
+
if (!["-", "!"].includes(operator.type))
|
|
270
|
+
this.fail(operator, "unsupported unary operator");
|
|
271
|
+
return this.unary(node, operator.type == "-" ? "Negate" : "Not", this.expression(argument, true), operator);
|
|
272
|
+
}
|
|
273
|
+
if (node.type == "call_expression") {
|
|
274
|
+
const call = this.call(node);
|
|
275
|
+
const name = this.text(call.name);
|
|
276
|
+
if (name == "INT64_C" || name == "SEMANTIFOLD_STRING") {
|
|
277
|
+
if (call.arguments.length != 1)
|
|
278
|
+
this.fail(node, "literal macro arity");
|
|
279
|
+
if (name == "SEMANTIFOLD_STRING")
|
|
280
|
+
return withParserRanges({ kind: "StringLiteral", location, value: this.string(call.arguments[0]) }, { literal: location });
|
|
281
|
+
if (call.arguments[0].type != "number_literal")
|
|
282
|
+
this.fail(node, "integer literal macro operand");
|
|
283
|
+
return withParserRanges({ ...this.expression(call.arguments[0]), location }, { literal: location });
|
|
284
|
+
}
|
|
285
|
+
// Generated operations are separate temporary initializers; only literal macros may nest as calls.
|
|
286
|
+
if (nested)
|
|
287
|
+
this.fail(node, "caller call in unspecified-order expression");
|
|
288
|
+
if (name == "semantifold_integer_negate") {
|
|
289
|
+
if (call.arguments.length != 1)
|
|
290
|
+
this.fail(node, "negation helper arity");
|
|
291
|
+
return this.unary(node, "Negate", this.expression(call.arguments[0], true), call.name);
|
|
292
|
+
}
|
|
293
|
+
const intent = helpers.get(name);
|
|
294
|
+
if (intent) {
|
|
295
|
+
if (call.arguments.length != 2)
|
|
296
|
+
this.fail(node, "scalar helper arity");
|
|
297
|
+
return this.binary(node, intent, this.expression(call.arguments[0], true), this.expression(call.arguments[1], true), call.name);
|
|
298
|
+
}
|
|
299
|
+
if (call.arguments.length != 2)
|
|
300
|
+
this.fail(node, "semantic call arity");
|
|
301
|
+
const callee = this.identifier(call.name);
|
|
302
|
+
if (!this.generated && !this.declaredFunctions.has(callee))
|
|
303
|
+
this.fail(call.name, "implicit function declaration");
|
|
304
|
+
return withParserRanges({ kind: "CallExpression", location, callee,
|
|
305
|
+
arguments: call.arguments.map((argument) => this.expression(argument, true)) }, { callee: this.location(call.name) });
|
|
306
|
+
}
|
|
307
|
+
return this.fail(node);
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* Records parser intent before shared type resolution.
|
|
311
|
+
* @param {CstNode} node - Owning expression.
|
|
312
|
+
* @param {string} intent - Adapted operation.
|
|
313
|
+
* @param {Expression} left - Left operand.
|
|
314
|
+
* @param {Expression} right - Right operand.
|
|
315
|
+
* @param {CstNode} operator - Operator token.
|
|
316
|
+
* @returns {Expression} Pending binary expression.
|
|
317
|
+
*/
|
|
318
|
+
binary(node, intent, left, right, operator) {
|
|
319
|
+
return /** @type {Expression} */ (withAdaptedOperation(withParserRanges({ kind: "BinaryExpression", location: this.location(node), left, right }, { operator: this.location(operator) }), /** @type {import("../semantic/operators.js").AdaptedOperation} */ (intent)));
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Records parser intent for a unary operation.
|
|
323
|
+
* @param {CstNode} node - Owning expression.
|
|
324
|
+
* @param {"Negate" | "Not"} intent - Adapted operation.
|
|
325
|
+
* @param {Expression} operand - Operand.
|
|
326
|
+
* @param {CstNode} operator - Operator token.
|
|
327
|
+
* @returns {Expression} Pending unary expression.
|
|
328
|
+
*/
|
|
329
|
+
unary(node, intent, operand, operator) {
|
|
330
|
+
return /** @type {Expression} */ (withAdaptedOperation(withParserRanges({ kind: "UnaryExpression", location: this.location(node), operand }, { operator: this.location(operator) }), intent));
|
|
331
|
+
}
|
|
332
|
+
/**
|
|
333
|
+
* Converts one initialized declaration or executable statement.
|
|
334
|
+
* @param {CstNode} node - Statement node.
|
|
335
|
+
* @returns {Statement} Semantic statement.
|
|
336
|
+
*/
|
|
337
|
+
statement(node) {
|
|
338
|
+
const location = this.location(node);
|
|
339
|
+
if (node.type == "declaration") {
|
|
340
|
+
const typeNode = node.children.find(({ field }) => field == "type")?.node;
|
|
341
|
+
if (!typeNode)
|
|
342
|
+
return missingType("c", "local", location);
|
|
343
|
+
const declarator = this.field(node, "declarator");
|
|
344
|
+
const parts = this.parts(node);
|
|
345
|
+
const immutable = parts[0].type == "type_qualifier";
|
|
346
|
+
this.shape(node, [...(immutable ? [parts[0]] : []), typeNode, declarator, ";"]);
|
|
347
|
+
if (immutable && this.text(parts[0]) != "const")
|
|
348
|
+
this.fail(parts[0], "local qualifier");
|
|
349
|
+
if (declarator.type != "init_declarator")
|
|
350
|
+
this.fail(declarator, "initialized simple local required");
|
|
351
|
+
const name = this.field(declarator, "declarator");
|
|
352
|
+
const value = this.field(declarator, "value");
|
|
353
|
+
this.shape(declarator, [name, "=", value]);
|
|
354
|
+
return withParserRanges({ kind: "LocalDeclaration", location, name: this.identifier(name), type: this.type(typeNode), mutable: !immutable,
|
|
355
|
+
initializer: this.expression(value) }, { name: this.location(name), operator: this.location(this.parts(declarator)[1]) });
|
|
356
|
+
}
|
|
357
|
+
if (node.type == "return_statement") {
|
|
358
|
+
const parts = this.parts(node);
|
|
359
|
+
this.shape(node, ["return", parts[1], ";"]);
|
|
360
|
+
return { kind: "ReturnStatement", location, expression: this.expression(parts[1]) };
|
|
361
|
+
}
|
|
362
|
+
if (node.type == "if_statement") {
|
|
363
|
+
const condition = this.field(node, "condition");
|
|
364
|
+
const consequence = this.field(node, "consequence");
|
|
365
|
+
const alternative = node.children.find(({ field }) => field == "alternative")?.node;
|
|
366
|
+
this.shape(node, ["if", condition, consequence, ...(alternative ? [alternative] : [])]);
|
|
367
|
+
const statement = { kind: /** @type {const} */ ("IfStatement"), location, condition: this.expression(condition), consequent: this.block(consequence) };
|
|
368
|
+
if (!alternative)
|
|
369
|
+
return statement;
|
|
370
|
+
const branch = this.parts(alternative)[1];
|
|
371
|
+
this.shape(alternative, ["else", branch]);
|
|
372
|
+
return { ...statement, alternate: branch.type == "if_statement"
|
|
373
|
+
? { kind: "Block", location: this.location(branch), statements: [this.statement(branch)] } : this.block(branch) };
|
|
374
|
+
}
|
|
375
|
+
if (node.type == "expression_statement") {
|
|
376
|
+
const expression = this.parts(node)[0];
|
|
377
|
+
this.shape(node, [expression, ";"]);
|
|
378
|
+
if (expression.type == "assignment_expression") {
|
|
379
|
+
const left = this.field(expression, "left");
|
|
380
|
+
const right = this.field(expression, "right");
|
|
381
|
+
const operator = this.field(expression, "operator");
|
|
382
|
+
this.shape(expression, [left, "=", right]);
|
|
383
|
+
const target = withParserRanges({ kind: /** @type {const} */ ("IdentifierExpression"), name: this.identifier(left), location: this.location(left) }, { name: this.location(left) });
|
|
384
|
+
return withParserRanges({ kind: "AssignmentStatement", location, target, expression: this.expression(right) }, { operator: this.location(operator) });
|
|
385
|
+
}
|
|
386
|
+
const call = this.call(expression);
|
|
387
|
+
if (!/^semantifold_print_(?:integer|boolean|string)$/u.test(this.text(call.name)) || call.arguments.length != 1)
|
|
388
|
+
this.fail(node, "print scaffold");
|
|
389
|
+
const value = this.expression(call.arguments[0]);
|
|
390
|
+
const statement = { kind: /** @type {const} */ ("PrintStatement"), location, expression: value };
|
|
391
|
+
this.printTypes.set(statement, { node: call.name, type: this.text(call.name).slice("semantifold_print_".length) });
|
|
392
|
+
return statement;
|
|
393
|
+
}
|
|
394
|
+
return this.fail(node);
|
|
395
|
+
}
|
|
396
|
+
/**
|
|
397
|
+
* Converts one lexical braced block in source order.
|
|
398
|
+
* @param {CstNode} node - Block node.
|
|
399
|
+
* @returns {import("../semantic/types.js").Block} Semantic block.
|
|
400
|
+
*/
|
|
401
|
+
block(node) {
|
|
402
|
+
if (node.type != "compound_statement")
|
|
403
|
+
this.fail(node, "braced block required");
|
|
404
|
+
const parts = this.parts(node);
|
|
405
|
+
this.shape(node, ["{", ...parts.slice(1, -1), "}"]);
|
|
406
|
+
return { kind: "Block", location: this.location(node), statements: this.generated
|
|
407
|
+
? this.generatedStatements(node.children.map(({ node: child }) => child).slice(1, -1))
|
|
408
|
+
: parts.slice(1, -1).map((child) => this.statement(child)) };
|
|
409
|
+
}
|
|
410
|
+
/**
|
|
411
|
+
* Converts one file-local semantic function.
|
|
412
|
+
* @param {CstNode} node - Function definition.
|
|
413
|
+
* @returns {import("../semantic/types.js").FunctionDeclaration} Semantic function.
|
|
414
|
+
*/
|
|
415
|
+
function(node) {
|
|
416
|
+
const type = this.field(node, "type");
|
|
417
|
+
const declarator = this.field(node, "declarator");
|
|
418
|
+
const body = this.field(node, "body");
|
|
419
|
+
this.shape(node, ["storage_class_specifier", type, declarator, body]);
|
|
420
|
+
if (this.text(this.parts(node)[0]) != "static" || declarator.type != "function_declarator")
|
|
421
|
+
this.fail(node, "file-local function required");
|
|
422
|
+
const name = this.field(declarator, "declarator");
|
|
423
|
+
const parameters = this.field(declarator, "parameters");
|
|
424
|
+
this.shape(declarator, [name, parameters]);
|
|
425
|
+
const parts = this.parts(parameters);
|
|
426
|
+
this.shape(parameters, ["(", "parameter_declaration", ",", "parameter_declaration", ")"]);
|
|
427
|
+
const converted = [parts[1], parts[3]].map((parameter) => {
|
|
428
|
+
const typeNode = this.field(parameter, "type");
|
|
429
|
+
const nameNode = this.field(parameter, "declarator");
|
|
430
|
+
this.shape(parameter, [typeNode, nameNode]);
|
|
431
|
+
return withParserRanges({ kind: /** @type {const} */ ("Parameter"), location: this.location(parameter), name: this.identifier(nameNode), type: this.type(typeNode) }, { name: this.location(nameNode) });
|
|
432
|
+
});
|
|
433
|
+
this.declaredFunctions.add(this.identifier(name));
|
|
434
|
+
return withParserRanges({ kind: "FunctionDeclaration", location: this.location(node), name: this.identifier(name), parameters: converted,
|
|
435
|
+
returnType: this.type(type), body: this.block(body) }, { name: this.location(name) });
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Removes only the exact main cleanup and status scaffolding.
|
|
439
|
+
* @param {CstNode} node - Entry definition.
|
|
440
|
+
* @returns {import("../semantic/types.js").EntryPoint} Semantic entry.
|
|
441
|
+
*/
|
|
442
|
+
main(node) {
|
|
443
|
+
const type = this.field(node, "type");
|
|
444
|
+
const declarator = this.field(node, "declarator");
|
|
445
|
+
const body = this.field(node, "body");
|
|
446
|
+
this.shape(node, [type, declarator, body]);
|
|
447
|
+
const name = this.field(declarator, "declarator");
|
|
448
|
+
const parameters = this.field(declarator, "parameters");
|
|
449
|
+
this.shape(declarator, [name, parameters]);
|
|
450
|
+
if (this.text(type) != "int" || this.text(name) != "main")
|
|
451
|
+
this.fail(node, "main signature");
|
|
452
|
+
this.shape(parameters, ["(", "parameter_declaration", ")"]);
|
|
453
|
+
const voidParameter = this.parts(parameters)[1];
|
|
454
|
+
this.shape(voidParameter, ["primitive_type"]);
|
|
455
|
+
if (this.text(this.parts(voidParameter)[0]) != "void")
|
|
456
|
+
this.fail(voidParameter, "main parameters");
|
|
457
|
+
const parts = this.parts(body);
|
|
458
|
+
const cleanup = parts.at(-3);
|
|
459
|
+
const status = parts.at(-2);
|
|
460
|
+
if (!cleanup || !status || body.type != "compound_statement")
|
|
461
|
+
this.fail(body, "main cleanup");
|
|
462
|
+
this.shape(body, ["{", ...parts.slice(1, -1), "}"]);
|
|
463
|
+
this.shape(cleanup, ["call_expression", ";"]);
|
|
464
|
+
const call = this.call(this.parts(cleanup)[0]);
|
|
465
|
+
if (this.text(call.name) != "semantifold_cleanup" || call.arguments.length != 0)
|
|
466
|
+
this.fail(cleanup, "entry cleanup");
|
|
467
|
+
this.shape(status, ["return", "number_literal", ";"]);
|
|
468
|
+
if (this.text(this.parts(status)[1]) != "0")
|
|
469
|
+
this.fail(status, "entry status");
|
|
470
|
+
return { kind: "EntryPoint", location: this.location(node), body: { kind: "Block", location: this.location(body),
|
|
471
|
+
statements: this.generated ? this.generatedStatements(body.children.map(({ node: child }) => child).filter((child) => child.startIndex > body.startIndex && child.endIndex <= cleanup.startIndex))
|
|
472
|
+
: parts.slice(1, -3).map((child) => this.statement(child)) } };
|
|
473
|
+
}
|
|
474
|
+
/**
|
|
475
|
+
* Converts one complete translation unit after exhaustive recovery rejection.
|
|
476
|
+
* @param {CstNode} root - Frozen translation unit.
|
|
477
|
+
* @returns {import("../semantic/types.js").SemanticModule} Validated semantic module.
|
|
478
|
+
*/
|
|
479
|
+
module(root) {
|
|
480
|
+
this.validateTree(root);
|
|
481
|
+
this.generated = root.children.some(({ node }) => node.type == "comment" && this.text(node) == "/* semantifold:program:c:v1 */");
|
|
482
|
+
if (!this.generated)
|
|
483
|
+
this.rejectScaffoldComments(root);
|
|
484
|
+
if (root.type != "translation_unit")
|
|
485
|
+
this.fail(root, "translation unit required");
|
|
486
|
+
const parts = this.parts(root);
|
|
487
|
+
const definitions = parts.slice(1).filter((node) => !this.generated || node.type != "declaration");
|
|
488
|
+
if (parts.length < 3 || parts[0].type != "preproc_include" || definitions.some((node) => node.type != "function_definition"))
|
|
489
|
+
this.fail(root, "translation unit members");
|
|
490
|
+
const include = parts[0];
|
|
491
|
+
const header = this.field(include, "path");
|
|
492
|
+
this.shape(include, ["#include", header]);
|
|
493
|
+
if (header.type != "string_literal" || this.text(header) != '"semantifold_runtime.h"')
|
|
494
|
+
this.fail(include, "support header include");
|
|
495
|
+
if (definitions.length < 2)
|
|
496
|
+
this.fail(root, "semantic function and main required");
|
|
497
|
+
const module = { kind: /** @type {const} */ ("Module"), location: this.location(root), functions: definitions.slice(0, -1).map((node) => this.function(node)),
|
|
498
|
+
entryPoint: this.main(definitions[definitions.length - 1]) };
|
|
499
|
+
if (this.generated)
|
|
500
|
+
validateNativeGraph(module);
|
|
501
|
+
const validated = validateParsedModule(module, "c");
|
|
502
|
+
this.validatePrintTypes(validated);
|
|
503
|
+
if (this.generated) {
|
|
504
|
+
const canonical = generateCProgram({ module: validated }).artifacts[0].content;
|
|
505
|
+
if (typeof canonical != "string")
|
|
506
|
+
throw new Error("C backend returned a nontext entry artifact.");
|
|
507
|
+
this.compareTree(root, parseCst(canonical).root, new CReader(this.filename, canonical));
|
|
508
|
+
}
|
|
509
|
+
return validated;
|
|
510
|
+
}
|
|
511
|
+
/**
|
|
512
|
+
* Checks native print helper selection after semantic scalar resolution.
|
|
513
|
+
* @param {import("../semantic/types.js").SemanticModule} module - Resolved module.
|
|
514
|
+
* @returns {void}
|
|
515
|
+
*/
|
|
516
|
+
validatePrintTypes(module) {
|
|
517
|
+
const planner = new OrderedExpressionPlanner(module);
|
|
518
|
+
/**
|
|
519
|
+
* Checks one lexical block with its visible scalar bindings.
|
|
520
|
+
* @param {import("../semantic/types.js").Block} block - Semantic block.
|
|
521
|
+
* @param {Map<string, import("../semantic/types.js").SemanticTypeName>} inherited - Visible bindings.
|
|
522
|
+
* @returns {void}
|
|
523
|
+
*/
|
|
524
|
+
const visit = (block, inherited) => {
|
|
525
|
+
const bindings = new Map(inherited);
|
|
526
|
+
for (const statement of block.statements) {
|
|
527
|
+
if (statement.kind == "LocalDeclaration")
|
|
528
|
+
bindings.set(statement.name, statement.type.name);
|
|
529
|
+
if (statement.kind == "PrintStatement") {
|
|
530
|
+
const expected = this.printTypes.get(statement);
|
|
531
|
+
if (!expected)
|
|
532
|
+
throw new Error("C print statement lost its parser helper identity.");
|
|
533
|
+
if (planner.type(statement.expression, bindings) != expected.type)
|
|
534
|
+
this.fail(expected.node, "print helper scalar mismatch");
|
|
535
|
+
}
|
|
536
|
+
if (statement.kind == "IfStatement") {
|
|
537
|
+
visit(statement.consequent, bindings);
|
|
538
|
+
if (statement.alternate)
|
|
539
|
+
visit(statement.alternate, bindings);
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
};
|
|
543
|
+
for (const declaration of module.functions)
|
|
544
|
+
visit(declaration.body, new Map(declaration.parameters.map((parameter) => [parameter.name, parameter.type.name])));
|
|
545
|
+
visit(module.entryPoint.body, new Map());
|
|
546
|
+
}
|
|
547
|
+
/**
|
|
548
|
+
* Rejects profile-looking comments outside a complete canonical generated program.
|
|
549
|
+
* @param {CstNode} node - Current node.
|
|
550
|
+
* @returns {void}
|
|
551
|
+
*/
|
|
552
|
+
rejectScaffoldComments(node) {
|
|
553
|
+
if (node.type == "comment" && /semantifold:|@semantifold/u.test(this.text(node)))
|
|
554
|
+
this.fail(node, "unrecognized scaffold comment");
|
|
555
|
+
for (const { node: child } of node.children)
|
|
556
|
+
this.rejectScaffoldComments(child);
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Retains every scaffold comment and structural edge, ignoring only ordinary comments.
|
|
560
|
+
* @param {CstNode} node - CST parent.
|
|
561
|
+
* @returns {CstNode[]} Complete significant child list.
|
|
562
|
+
*/
|
|
563
|
+
significant(node) {
|
|
564
|
+
return node.children.map(({ node: child }) => child).filter((child) => child.type != "comment" || /semantifold:|@semantifold/u.test(this.text(child)));
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Verifies every token, field, type, use, ordering edge and consumer against the canonical plan.
|
|
568
|
+
* This checks the original CST; it never recovers meaning from generated source text.
|
|
569
|
+
* @param {CstNode} actual - Original tree node.
|
|
570
|
+
* @param {CstNode} expected - Canonical tree node for the reconstructed semantics.
|
|
571
|
+
* @param {CReader} canonical - Canonical token reader.
|
|
572
|
+
* @returns {void}
|
|
573
|
+
*/
|
|
574
|
+
compareTree(actual, expected, canonical) {
|
|
575
|
+
if (actual.type != expected.type || actual.named != expected.named || actual.extra != expected.extra)
|
|
576
|
+
this.fail(actual, "generated scaffold node shape");
|
|
577
|
+
const left = this.significant(actual);
|
|
578
|
+
const right = canonical.significant(expected);
|
|
579
|
+
if (left.length != right.length)
|
|
580
|
+
this.fail(actual, "generated scaffold child count");
|
|
581
|
+
if (!left.length && this.text(actual) != canonical.text(expected))
|
|
582
|
+
this.fail(actual, "generated scaffold token, type, order or consumer");
|
|
583
|
+
left.forEach((child, index) => {
|
|
584
|
+
if (actual.children.find((edge) => edge.node === child)?.field != expected.children.find((edge) => edge.node === right[index])?.field)
|
|
585
|
+
this.fail(child, "generated scaffold field");
|
|
586
|
+
this.compareTree(child, right[index], canonical);
|
|
587
|
+
});
|
|
588
|
+
}
|
|
589
|
+
/**
|
|
590
|
+
* Recognizes the shape of an inert generated unused-binding cast; canonical comparison checks its exact target and placement.
|
|
591
|
+
* @param {CstNode} node - Candidate statement.
|
|
592
|
+
* @returns {boolean} Whether this is a discard-shaped candidate.
|
|
593
|
+
*/
|
|
594
|
+
discard(node) {
|
|
595
|
+
return node.type == "expression_statement" && this.parts(node)[0]?.type == "cast_expression";
|
|
596
|
+
}
|
|
597
|
+
/**
|
|
598
|
+
* Reconstructs paired statement regions before mandatory whole-CST canonical verification.
|
|
599
|
+
* @param {CstNode[]} children - Ordered block children without braces or main cleanup.
|
|
600
|
+
* @returns {Statement[]} Candidate semantic statements.
|
|
601
|
+
*/
|
|
602
|
+
generatedStatements(children) {
|
|
603
|
+
const nodes = children.filter((node) => node.type != "comment" || /semantifold:|@semantifold/u.test(this.text(node)));
|
|
604
|
+
/** @type {Statement[]} */
|
|
605
|
+
const statements = [];
|
|
606
|
+
let cursor = 0;
|
|
607
|
+
while (cursor < nodes.length && this.discard(nodes[cursor]))
|
|
608
|
+
cursor++;
|
|
609
|
+
while (cursor < nodes.length) {
|
|
610
|
+
const begin = nodes[cursor++];
|
|
611
|
+
const match = begin.type == "comment" && /^\/\* semantifold:ordered-expression:c:v1 begin ([0-9]{6}) ([0-9a-f]{64}) \*\/$/u.exec(this.text(begin));
|
|
612
|
+
if (!match)
|
|
613
|
+
this.fail(begin, "complete ordered statement region required");
|
|
614
|
+
const outer = this.temporaryExpressions;
|
|
615
|
+
const outerNames = this.temporaryNames;
|
|
616
|
+
this.temporaryExpressions = new Map();
|
|
617
|
+
this.temporaryNames = new Set();
|
|
618
|
+
while (cursor < nodes.length && this.temporaryDeclaration(nodes[cursor]))
|
|
619
|
+
cursor = this.readTemporary(nodes, cursor);
|
|
620
|
+
const consumer = nodes[cursor++];
|
|
621
|
+
if (!consumer)
|
|
622
|
+
this.fail(begin, "missing ordered consumer");
|
|
623
|
+
const statement = this.statement(consumer);
|
|
624
|
+
if (this.temporaryExpressions.size != 0)
|
|
625
|
+
this.fail(consumer, "unconsumed ordered temporary");
|
|
626
|
+
if (statement.kind == "LocalDeclaration" && nodes[cursor] && this.discard(nodes[cursor]))
|
|
627
|
+
cursor++;
|
|
628
|
+
const end = nodes[cursor++];
|
|
629
|
+
if (!end || end.type != "comment" || this.text(end) != `/* semantifold:ordered-expression:c:v1 end ${match[1]} ${match[2]} */`)
|
|
630
|
+
this.fail(end ?? begin, "ordered marker pair");
|
|
631
|
+
this.temporaryExpressions = outer;
|
|
632
|
+
this.temporaryNames = outerNames;
|
|
633
|
+
statements.push(statement);
|
|
634
|
+
}
|
|
635
|
+
return statements;
|
|
636
|
+
}
|
|
637
|
+
/**
|
|
638
|
+
* Identifies only a declaration at the current region level, without descendant searching.
|
|
639
|
+
* @param {CstNode} node - Candidate node.
|
|
640
|
+
* @returns {boolean} Whether the direct initialized name uses the reserved prefix.
|
|
641
|
+
*/
|
|
642
|
+
temporaryDeclaration(node) {
|
|
643
|
+
if (node.type != "declaration")
|
|
644
|
+
return false;
|
|
645
|
+
const declarator = node.children.find(({ field }) => field == "declarator")?.node;
|
|
646
|
+
const name = declarator?.children.find(({ field }) => field == "declarator")?.node;
|
|
647
|
+
return name?.type == "identifier" && this.text(name).startsWith("semantifold_ordered_");
|
|
648
|
+
}
|
|
649
|
+
/**
|
|
650
|
+
* Expands one candidate temporary, including its conditional RHS, retaining original operation tokens.
|
|
651
|
+
* @param {CstNode[]} nodes - Current lexical sequence.
|
|
652
|
+
* @param {number} cursor - Declaration position.
|
|
653
|
+
* @returns {number} Next unconsumed position.
|
|
654
|
+
*/
|
|
655
|
+
readTemporary(nodes, cursor) {
|
|
656
|
+
const node = nodes[cursor++];
|
|
657
|
+
const declarator = this.field(node, "declarator");
|
|
658
|
+
const nameNode = this.field(declarator, "declarator");
|
|
659
|
+
const name = this.text(nameNode);
|
|
660
|
+
const type = this.field(node, "type");
|
|
661
|
+
const value = this.field(declarator, "value");
|
|
662
|
+
this.shape(node, [type, declarator, ";"]);
|
|
663
|
+
this.shape(declarator, [nameNode, "=", value]);
|
|
664
|
+
this.type(type);
|
|
665
|
+
if (!/^semantifold_ordered_[0-9]{6}$/u.test(name) || this.temporaryNames?.has(name))
|
|
666
|
+
this.fail(nameNode, "ordered temporary declaration");
|
|
667
|
+
this.temporaryNames?.add(name);
|
|
668
|
+
let expression = this.expression(value);
|
|
669
|
+
const branch = nodes[cursor];
|
|
670
|
+
if (branch?.type == "if_statement" && ["identifier", "true", "false"].includes(value.type)) {
|
|
671
|
+
const condition = this.field(branch, "condition");
|
|
672
|
+
const body = this.field(branch, "consequence");
|
|
673
|
+
this.shape(branch, ["if", condition, body]);
|
|
674
|
+
this.shape(condition, ["(", this.parts(condition)[1], ")"]);
|
|
675
|
+
const test = this.parts(condition)[1];
|
|
676
|
+
const isOr = test.type == "unary_expression";
|
|
677
|
+
const target = isOr ? this.field(test, "argument") : test;
|
|
678
|
+
if (target.type != "identifier" || this.text(target) != name)
|
|
679
|
+
this.fail(target, "short-circuit temporary test");
|
|
680
|
+
if (isOr)
|
|
681
|
+
this.shape(test, ["!", target]);
|
|
682
|
+
if (body.type != "compound_statement")
|
|
683
|
+
this.fail(body, "short-circuit block");
|
|
684
|
+
const inside = this.significant(body).slice(1, -1);
|
|
685
|
+
let offset = 0;
|
|
686
|
+
while (offset < inside.length && this.temporaryDeclaration(inside[offset]))
|
|
687
|
+
offset = this.readTemporary(inside, offset);
|
|
688
|
+
if (offset != inside.length - 1)
|
|
689
|
+
this.fail(body, "short-circuit final write");
|
|
690
|
+
const assignment = inside[offset];
|
|
691
|
+
this.shape(assignment, ["assignment_expression", ";"]);
|
|
692
|
+
const assigned = this.parts(assignment)[0];
|
|
693
|
+
const left = this.field(assigned, "left");
|
|
694
|
+
const right = this.field(assigned, "right");
|
|
695
|
+
this.shape(assigned, [left, "=", right]);
|
|
696
|
+
if (left.type != "identifier" || this.text(left) != name)
|
|
697
|
+
this.fail(left, "short-circuit result write");
|
|
698
|
+
this.shape(right, ["(", "binary_expression", ")"]);
|
|
699
|
+
const binary = this.parts(right)[1];
|
|
700
|
+
const repeated = this.field(binary, "left");
|
|
701
|
+
const operand = this.field(binary, "right");
|
|
702
|
+
const operator = this.field(binary, "operator");
|
|
703
|
+
this.shape(binary, [repeated, isOr ? "||" : "&&", operand]);
|
|
704
|
+
if (repeated.type != "identifier" || this.text(repeated) != name)
|
|
705
|
+
this.fail(repeated, "short-circuit consumed value");
|
|
706
|
+
expression = this.binary(node, isOr ? "Or" : "And", expression, this.expression(operand), operator);
|
|
707
|
+
cursor++;
|
|
708
|
+
}
|
|
709
|
+
this.temporaryExpressions?.set(name, expression);
|
|
710
|
+
return cursor;
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
/**
|
|
714
|
+
* Parses only the frozen legacy CST, with no source-text recovery path.
|
|
715
|
+
* @param {{filename: string, source: string}} input - Exact caller source.
|
|
716
|
+
* @returns {import("../semantic/types.js").SemanticModule} Parsed C semantics.
|
|
717
|
+
*/
|
|
718
|
+
export function parseC({ filename, source }) {
|
|
719
|
+
if (!hasOnlyUnicodeScalars(source)) {
|
|
720
|
+
const coordinates = createCoordinateIndex(source);
|
|
721
|
+
const offset = source.search(/[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?<![\uD800-\uDBFF])[\uDC00-\uDFFF]/u);
|
|
722
|
+
throw new SemantifoldDiagnostic({ code: "PARSE_ERROR", language: "c", message: "C source contains a lone UTF-16 surrogate.",
|
|
723
|
+
location: { filename, start: indexedPointAt(coordinates, offset), end: indexedPointAt(coordinates, offset + 1) } });
|
|
724
|
+
}
|
|
725
|
+
if (source.length > maximumCSourceLength) {
|
|
726
|
+
const coordinates = createCoordinateIndex(source);
|
|
727
|
+
return unsupportedSyntax("c", "source exceeds the frozen C parser's 32767 UTF-16 input limit", {
|
|
728
|
+
filename, start: indexedPointAt(coordinates, 0), end: indexedPointAt(coordinates, source.length)
|
|
729
|
+
});
|
|
730
|
+
}
|
|
731
|
+
let snapshot;
|
|
732
|
+
try {
|
|
733
|
+
snapshot = parseCst(source);
|
|
734
|
+
}
|
|
735
|
+
catch (error) {
|
|
736
|
+
return parseFailure("c", error);
|
|
737
|
+
}
|
|
738
|
+
const reader = new CReader(filename, source);
|
|
739
|
+
try {
|
|
740
|
+
return reader.module(snapshot.root);
|
|
741
|
+
}
|
|
742
|
+
catch (error) {
|
|
743
|
+
if (reader.generated && error instanceof SemantifoldDiagnostic && error.language == "c" &&
|
|
744
|
+
error.code != "PARSE_ERROR" && error.code != "UNSUPPORTED_SYNTAX") {
|
|
745
|
+
return unsupportedSyntax("c", `invalid generated ordered scaffold: ${error.code}`, error.location ?? reader.location(snapshot.root));
|
|
746
|
+
}
|
|
747
|
+
throw error;
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcm9udGVuZHMvYy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUE7QUFDakQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sb0NBQW9DLENBQUE7QUFDM0UsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sNkJBQTZCLENBQUE7QUFDaEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sa0NBQWtDLENBQUE7QUFDcEUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDRCQUE0QixDQUFBO0FBQ3hELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxlQUFlLENBQUE7QUFDdEMsT0FBTyxFQUFDLFdBQVcsRUFBRSxZQUFZLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQTtBQUNwRyxPQUFPLEVBQUMscUJBQXFCLEVBQUUsY0FBYyxFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDN0UsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMEJBQTBCLENBQUE7QUFDN0QsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sMkJBQTJCLENBQUE7QUFDMUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUE7QUFDNUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0seUJBQXlCLENBQUE7QUFDNUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFBO0FBRTdDLHlEQUF5RDtBQUN6RCxzRUFBc0U7QUFDdEUsb0VBQW9FO0FBRXBFLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDL0IsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxD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QUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsa0NBQWtDLENBQUMsQ0FBQTtZQUMxSSxPQUFPLGdCQUFnQixDQUFDLEVBQUMsSUFBSSxFQUFFLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxFQUFDLEVBQUUsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQTtRQUMzRyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLG1CQUFtQixFQUFFLENBQUM7WUFDckMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUE7WUFDckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUE7WUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUE7WUFDN0MsTUFBTSxNQUFNLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUVsRCxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQTtZQUN6QyxJQUFJLENBQUMsTUFBTTtnQkFBRSxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLDZCQUE2QixDQUFDLENBQUE7WUFDdEUsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUE7UUFD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Q0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFBO0lBRTVDLElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDckMsQ0FBQztJQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7UUFDZixJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksS0FBSyxZQUFZLHFCQUFxQixJQUFJLEtBQUssQ0FBQyxRQUFRLElBQUksR0FBRztZQUNyRixLQUFLLENBQUMsSUFBSSxJQUFJLGFBQWEsSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLG9CQUFvQixFQUFFLENBQUM7WUFDcEUsT0FBTyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUUsdUNBQXVDLEtBQUssQ0FBQyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7UUFDdEksQ0FBQztRQUNELE1BQU0sS0FBSyxDQUFBO0lBQ2IsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtnZW5lcmF0ZUNQcm9ncmFtfSBmcm9tIFwiLi4vYmFja2VuZHMvYy5qc1wiXG5pbXBvcnQge09yZGVyZWRFeHByZXNzaW9uUGxhbm5lcn0gZnJvbSBcIi4uL2JhY2tlbmRzL29yZGVyZWQtZXhwcmVzc2lvbnMuanNcIlxuaW1wb3J0IHttYXhpbXVtQ1NvdXJjZUxlbmd0aH0gZnJvbSBcIi4uL2JhY2tlbmRzL2MtdmFsaWRhdGlvbi5qc1wiXG5pbXBvcnQge3ZhbGlkYXRlTmF0aXZlR3JhcGh9IGZyb20gXCIuLi9iYWNrZW5kcy9uYXRpdmUtdmFsaWRhdGlvbi5qc1wiXG5pbXBvcnQge2lzQ0lkZW50aWZpZXJ9IGZyb20gXCIuLi9iYWNrZW5kcy9pZGVudGlmaWVycy5qc1wiXG5pbXBvcnQge3BhcnNlQ3N0fSBmcm9tIFwiLi9jLXBhcnNlci5qc1wiXG5pbXBvcnQge21pc3NpbmdUeXBlLCBwYXJzZUZhaWx1cmUsIFNlbWFudGlmb2xkRGlhZ25vc3RpYywgdW5zdXBwb3J0ZWRTeW50YXh9IGZyb20gXCIuLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7Y3JlYXRlQ29vcmRpbmF0ZUluZGV4LCBpbmRleGVkUG9pbnRBdH0gZnJvbSBcIi4uL3NlbWFudGljL2xvY2F0aW9uLmpzXCJcbmltcG9ydCB7d2l0aEFkYXB0ZWRPcGVyYXRpb259IGZyb20gXCIuLi9zZW1hbnRpYy9vcGVyYXRvcnMuanNcIlxuaW1wb3J0IHt3aXRoUGFyc2VyUmFuZ2VzfSBmcm9tIFwiLi4vc2VtYW50aWMvcHJvdmVuYW5jZS5qc1wiXG5pbXBvcnQge2hhc09ubHlVbmljb2RlU2NhbGFyc30gZnJvbSBcIi4uL3NlbWFudGljL3NjYWxhcnMuanNcIlxuaW1wb3J0IHt2YWxpZGF0ZVBhcnNlZE1vZHVsZX0gZnJvbSBcIi4uL3NlbWFudGljL3ZhbGlkYXRlLmpzXCJcbmltcG9ydCB7c291cmNlU2NhbGFyVHlwZX0gZnJvbSBcIi4vc2NhbGFycy5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9jLXBhcnNlci5qc1wiKS5Dc3ROb2RlfSBDc3ROb2RlICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkV4cHJlc3Npb259IEV4cHJlc3Npb24gKi9cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuU3RhdGVtZW50fSBTdGF0ZW1lbnQgKi9cblxuY29uc3QgYmluYXJ5T3BlcmF0aW9ucyA9IG5ldyBNYXAoW1xuICBbXCIrXCIsIFwiUGhwQWRkXCJdLCBbXCItXCIsIFwiU3VidHJhY3RcIl0sIFtcIipcIiwgXCJNdWx0aXBseVwiXSwgW1wiPT1cIiwgXCJKYXZhRXF1YWxcIl0sIFtcIiE9XCIsIFwiSmF2YU5vdEVxdWFsXCJdLFxuICBbXCI8XCIsIFwiTGVzc1RoYW5cIl0sIFtcIjw9XCIsIFwiTGVzc1RoYW5PckVxdWFsXCJdLCBbXCI+XCIsIFwiR3JlYXRlclRoYW5cIl0sIFtcIj49XCIsIFwiR3JlYXRlclRoYW5PckVxdWFsXCJdLFxuICBbXCImJlwiLCBcIkFuZFwiXSwgW1wifHxcIiwgXCJPclwiXVxuXSlcbmNvbnN0IGhlbHBlcnMgPSBuZXcgTWFwKFtcbiAgW1wic2VtYW50aWZvbGRfaW50ZWdlcl9hZGRcIiwgXCJQaHBBZGRcIl0sIFtcInNlbWFudGlmb2xkX2ludGVnZXJfc3VidHJhY3RcIiwgXCJTdWJ0cmFjdFwiXSxcbiAgW1wic2VtYW50aWZvbGRfaW50ZWdlcl9tdWx0aXBseVwiLCBcIk11bHRpcGx5XCJdLCBbXCJzZW1hbnRpZm9sZF9zdHJpbmdfY29uY2F0XCIsIFwiU3RyaW5nQ29uY2F0XCJdLFxuICBbXCJzZW1hbnRpZm9sZF9zdHJpbmdfZXF1YWxcIiwgXCJTdHJpbmdFcXVhbFwiXSwgW1wic2VtYW50aWZvbGRfc3RyaW5nX25vdF9lcXVhbFwiLCBcIlN0cmluZ05vdEVxdWFsXCJdXG5dKVxuXG4vKiogU3RyaWN0IGZpZWxkLWFuZC10b2tlbiBjb25zdW1lciBmb3IgdGhlIHByaXZhdGUgZnJvemVuIEMgQ1NULiAqL1xuZXhwb3J0IGNsYXNzIENSZWFkZXIge1xuICAvKipcbiAgICogT3ducyBzb3VyY2UgY29udGVudCBhbmQgaXRzIGNvb3JkaW5hdGUgaW5kZXgsIG5ldmVyIG5hdGl2ZSBwYXJzZXIgaGFuZGxlcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGZpbGVuYW1lIC0gT3JpZ2luYWwgZmlsZW5hbWUuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgLSBFeGFjdCBvcmlnaW5hbCBzb3VyY2UuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihmaWxlbmFtZSwgc291cmNlKSB7XG4gICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lXG4gICAgdGhpcy5zb3VyY2UgPSBzb3VyY2VcbiAgICB0aGlzLmNvb3JkaW5hdGVzID0gY3JlYXRlQ29vcmRpbmF0ZUluZGV4KHNvdXJjZSlcbiAgICB0aGlzLmdlbmVyYXRlZCA9IGZhbHNlXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBFeHByZXNzaW9uPiB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLnRlbXBvcmFyeUV4cHJlc3Npb25zID0gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPiB8IHVuZGVmaW5lZH0gKi9cbiAgICB0aGlzLnRlbXBvcmFyeU5hbWVzID0gdW5kZWZpbmVkXG4gICAgLyoqIEB0eXBlIHtNYXA8U3RhdGVtZW50LCB7bm9kZTogQ3N0Tm9kZSwgdHlwZTogc3RyaW5nfT59ICovXG4gICAgdGhpcy5wcmludFR5cGVzID0gbmV3IE1hcCgpXG4gICAgLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi9cbiAgICB0aGlzLmRlY2xhcmVkRnVuY3Rpb25zID0gbmV3IFNldCgpXG4gIH1cblxuICAvKipcbiAgICogTG9jYXRlcyBvbmUgcGFyc2VyLW93bmVkIHJhbmdlIGluIFVURi0xNiBjb29yZGluYXRlcy5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gUGFyc2VyIG5vZGUuXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5Tb3VyY2VMb2NhdGlvbn0gVmVyaWZpZWQgbG9jYXRpb24uXG4gICAqL1xuICBsb2NhdGlvbihub2RlKSB7XG4gICAgcmV0dXJuIHtmaWxlbmFtZTogdGhpcy5maWxlbmFtZSwgc3RhcnQ6IGluZGV4ZWRQb2ludEF0KHRoaXMuY29vcmRpbmF0ZXMsIG5vZGUuc3RhcnRJbmRleCksIGVuZDogaW5kZXhlZFBvaW50QXQodGhpcy5jb29yZGluYXRlcywgbm9kZS5lbmRJbmRleCl9XG4gIH1cblxuICAvKipcbiAgICogUmVhZHMgb25seSB0aGUgc3BlbGxpbmcgb2YgYW4gYWxyZWFkeSByZWNvZ25pemVkIHBhcnNlciBub2RlLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBQYXJzZXIgbm9kZS5cbiAgICogQHJldHVybnMge3N0cmluZ30gRXhhY3QgdG9rZW4gc3BlbGxpbmcuXG4gICAqL1xuICB0ZXh0KG5vZGUpIHtcbiAgICByZXR1cm4gdGhpcy5zb3VyY2Uuc2xpY2Uobm9kZS5zdGFydEluZGV4LCBub2RlLmVuZEluZGV4KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdHMgYSBsb2NhdGVkIHNvdXJjZS1wcm9maWxlIHZpb2xhdGlvbi5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gUmVqZWN0ZWQgbm9kZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtkZXRhaWxdIC0gUHJvZmlsZSB2aW9sYXRpb24uXG4gICAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAgICovXG4gIGZhaWwobm9kZSwgZGV0YWlsID0gbm9kZS50eXBlKSB7XG4gICAgdW5zdXBwb3J0ZWRTeW50YXgoXCJjXCIsIGRldGFpbCwgdGhpcy5sb2NhdGlvbihub2RlKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmF2ZXJzZXMgYWxsIGVkZ2VzIGJlZm9yZSBpbnRlcnByZXRpbmcgYW55IHNvdXJjZSBtZWFuaW5nLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBDdXJyZW50IHBhcnNlciBub2RlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHZhbGlkYXRlVHJlZShub2RlKSB7XG4gICAgZm9yIChjb25zdCB7bm9kZTogY2hpbGR9IG9mIG5vZGUuY2hpbGRyZW4pIHRoaXMudmFsaWRhdGVUcmVlKGNoaWxkKVxuICAgIGlmIChub2RlLmVycm9yIHx8IG5vZGUubWlzc2luZyB8fCBub2RlLmhhc0Vycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIlBBUlNFX0VSUk9SXCIsIGxhbmd1YWdlOiBcImNcIiwgbG9jYXRpb246IHRoaXMubG9jYXRpb24obm9kZSksIG1lc3NhZ2U6IGBDIHBhcnNlciByZWNvdmVyeSBhdCAnJHtub2RlLnR5cGV9Jy5gfSlcbiAgICB9XG4gICAgaWYgKG5vZGUuZXh0cmEgJiYgbm9kZS50eXBlICE9IFwiY29tbWVudFwiKSB0aGlzLmZhaWwobm9kZSwgXCJ1bmV4cGVjdGVkIGV4dHJhIHBhcnNlciBjaGlsZFwiKVxuICAgIGlmICgobm9kZS50eXBlID09IFwiY29tbWVudFwiIHx8IG5vZGUudHlwZSA9PSBcInN0cmluZ19jb250ZW50XCIpICYmIC9cXD9cXD9bPS8nKCkhPD4tXS91LnRlc3QodGhpcy50ZXh0KG5vZGUpKSkge1xuICAgICAgdGhpcy5mYWlsKG5vZGUsIFwidHJpZ3JhcGggcHJlcHJvY2Vzc2luZ1wiKVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwiY29tbWVudFwiKSB7XG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0KG5vZGUpXG5cbiAgICAgIC8vIEEgdGVybWluYWwgQ1IgYmVsb25ncyB0byBvcmRpbmFyeSBDUkxGOyBjb250ZW50IGFmdGVyIGEgYmFyZSBDUiBpcyBub3QgYSBDIGxpbmUgY29tbWVudC5cbiAgICAgIGlmICgvXFxcXCg/Olxcclxcbj98XFxuKS91LnRlc3QodGV4dCkgfHwgdGV4dC5zdGFydHNXaXRoKFwiLy9cIikgJiYgL1xccig/IVxcbnwkKS91LnRlc3QodGV4dCkpIHtcbiAgICAgICAgdGhpcy5mYWlsKG5vZGUsIFwicHJlcHJvY2Vzc2luZy1zZW5zaXRpdmUgY29tbWVudFwiKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXBhcmF0ZXMgaGFybWxlc3MgY29tbWVudHMgYWZ0ZXIgZXZlcnkgY2hpbGQgaGFzIGJlZW4gdmFsaWRhdGVkLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBQYXJlbnQgbm9kZS5cbiAgICogQHJldHVybnMge0NzdE5vZGVbXX0gT3JkZXJlZCBzdHJ1Y3R1cmFsIGNoaWxkcmVuLlxuICAgKi9cbiAgcGFydHMobm9kZSkge1xuICAgIHJldHVybiBub2RlLmNoaWxkcmVuLm1hcCgoe25vZGU6IGNoaWxkfSkgPT4gY2hpbGQpLmZpbHRlcigoY2hpbGQpID0+IGNoaWxkLnR5cGUgIT0gXCJjb21tZW50XCIpXG4gIH1cblxuICAvKipcbiAgICogUmVxdWlyZXMgb25lIGV4YWN0IGZpZWxkIHJhdGhlciB0aGFuIHNlYXJjaGluZyBkZXNjZW5kYW50cy5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gRmllbGQgb3duZXIuXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gRmllbGQgbmFtZS5cbiAgICogQHJldHVybnMge0NzdE5vZGV9IFNvbGUgZmllbGQgY2hpbGQuXG4gICAqL1xuICBmaWVsZChub2RlLCBuYW1lKSB7XG4gICAgY29uc3QgbWF0Y2hlcyA9IG5vZGUuY2hpbGRyZW4uZmlsdGVyKCh7ZmllbGR9KSA9PiBmaWVsZCA9PSBuYW1lKVxuXG4gICAgaWYgKG1hdGNoZXMubGVuZ3RoICE9IDEpIHJldHVybiB0aGlzLmZhaWwobm9kZSwgYGV4cGVjdGVkIG9uZSAnJHtuYW1lfScgZmllbGRgKVxuICAgIHJldHVybiBtYXRjaGVzWzBdLm5vZGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdW1lcyBldmVyeSBzdHJ1Y3R1cmFsIGNoaWxkLCBpbmNsdWRpbmcgcHVuY3R1YXRpb24uXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIFNoYXBlIG93bmVyLlxuICAgKiBAcGFyYW0geyhDc3ROb2RlIHwgc3RyaW5nKVtdfSBleHBlY3RlZCAtIE9yZGVyZWQgbm9kZXMgb3IgdG9rZW4ga2luZHMuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgc2hhcGUobm9kZSwgZXhwZWN0ZWQpIHtcbiAgICBjb25zdCBjaGlsZHJlbiA9IHRoaXMucGFydHMobm9kZSlcblxuICAgIGlmIChjaGlsZHJlbi5sZW5ndGggIT0gZXhwZWN0ZWQubGVuZ3RoIHx8IGNoaWxkcmVuLnNvbWUoKGNoaWxkLCBpbmRleCkgPT5cbiAgICAgIHR5cGVvZiBleHBlY3RlZFtpbmRleF0gPT0gXCJzdHJpbmdcIiA/IGNoaWxkLnR5cGUgIT0gZXhwZWN0ZWRbaW5kZXhdIDogY2hpbGQgIT09IGV4cGVjdGVkW2luZGV4XSkpIHRoaXMuZmFpbChub2RlLCBgJHtub2RlLnR5cGV9IGNoaWxkIHNoYXBlYClcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXF1aXJlcyBhbiBvcmRpbmFyeSBjYWxsZXIgaWRlbnRpZmllciBvdXRzaWRlIHRoZSBwcm90ZWN0ZWQgbmFtZXNwYWNlLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBJZGVudGlmaWVyIHRva2VuLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBBY2NlcHRlZCBzcGVsbGluZy5cbiAgICovXG4gIGlkZW50aWZpZXIobm9kZSkge1xuICAgIGNvbnN0IG5hbWUgPSB0aGlzLnRleHQobm9kZSlcblxuICAgIGlmIChub2RlLnR5cGUgIT0gXCJpZGVudGlmaWVyXCIgfHwgIWlzQ0lkZW50aWZpZXIobmFtZSkpIHRoaXMuZmFpbChub2RlLCBcInJlc2VydmVkIG9yIHVuc3VwcG9ydGVkIGlkZW50aWZpZXJcIilcbiAgICByZXR1cm4gbmFtZVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIG9ubHkgdGhlIGNhbm9uaWNhbCBzY2FsYXIgdHlwZSBzcGVsbGluZ3MuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIFR5cGUgdG9rZW4uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5UeXBlUmVmZXJlbmNlfSBTZW1hbnRpYyBzY2FsYXIuXG4gICAqL1xuICB0eXBlKG5vZGUpIHtcbiAgICBpZiAoIVtcInByaW1pdGl2ZV90eXBlXCIsIFwidHlwZV9pZGVudGlmaWVyXCJdLmluY2x1ZGVzKG5vZGUudHlwZSkpIHRoaXMuZmFpbChub2RlLCBcInNjYWxhciB0eXBlIHNoYXBlXCIpXG4gICAgY29uc3QgdHlwZSA9IHNvdXJjZVNjYWxhclR5cGUoXCJjXCIsIHRoaXMudGV4dChub2RlKSwgdGhpcy5sb2NhdGlvbihub2RlKSlcblxuICAgIGlmICghdHlwZSkgcmV0dXJuIHRoaXMuZmFpbChub2RlLCBcInVuc3VwcG9ydGVkIHNjYWxhciB0eXBlXCIpXG4gICAgcmV0dXJuIHR5cGVcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIGRpcmVjdCBmdW5jdGlvbiBjYWxsJ3MgZXhhY3QgYXJndW1lbnQgbGlzdC5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gQ2FsbCBub2RlLlxuICAgKiBAcmV0dXJucyB7e25hbWU6IENzdE5vZGUsIGFyZ3VtZW50czogQ3N0Tm9kZVtdfX0gUGFyc2VkIGNhbGwgc2hhcGUuXG4gICAqL1xuICBjYWxsKG5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlICE9IFwiY2FsbF9leHByZXNzaW9uXCIpIHJldHVybiB0aGlzLmZhaWwobm9kZSwgXCJkaXJlY3QgY2FsbCByZXF1aXJlZFwiKVxuICAgIGNvbnN0IG5hbWUgPSB0aGlzLmZpZWxkKG5vZGUsIFwiZnVuY3Rpb25cIilcbiAgICBjb25zdCBsaXN0ID0gdGhpcy5maWVsZChub2RlLCBcImFyZ3VtZW50c1wiKVxuXG4gICAgdGhpcy5zaGFwZShub2RlLCBbbmFtZSwgbGlzdF0pXG4gICAgaWYgKG5hbWUudHlwZSAhPSBcImlkZW50aWZpZXJcIiB8fCBsaXN0LnR5cGUgIT0gXCJhcmd1bWVudF9saXN0XCIpIHRoaXMuZmFpbChub2RlLCBcImRpcmVjdCBjYWxsIHNoYXBlXCIpXG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKGxpc3QpXG4gICAgY29uc3QgYXJncyA9IHBhcnRzLnNsaWNlKDEsIC0xKS5maWx0ZXIoKF9wYXJ0LCBpbmRleCkgPT4gaW5kZXggJSAyID09IDApXG5cbiAgICB0aGlzLnNoYXBlKGxpc3QsIFtcIihcIiwgLi4uYXJncy5mbGF0TWFwKChhcmcsIGluZGV4KSA9PiBpbmRleCA9PSAwID8gW2FyZ10gOiBbXCIsXCIsIGFyZ10pLCBcIilcIl0pXG4gICAgcmV0dXJuIHthcmd1bWVudHM6IGFyZ3MsIG5hbWV9XG4gIH1cblxuICAvKipcbiAgICogRGVjb2RlcyBhIHBhcnNlci1iYWNrZWQgb3JkaW5hcnkgQyBzdHJpbmcgdG9rZW4gYXMgVVRGLTggYnl0ZXMuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIFN0cmluZyBsaXRlcmFsLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfSBDb21wbGV0ZSBVbmljb2RlIHNjYWxhciB2YWx1ZS5cbiAgICovXG4gIHN0cmluZyhub2RlKSB7XG4gICAgaWYgKG5vZGUudHlwZSAhPSBcInN0cmluZ19saXRlcmFsXCIpIHJldHVybiB0aGlzLmZhaWwobm9kZSwgXCJvcmRpbmFyeSBzdHJpbmcgbGl0ZXJhbCByZXF1aXJlZFwiKVxuICAgIGNvbnN0IHBhcnRzID0gdGhpcy5wYXJ0cyhub2RlKVxuXG4gICAgaWYgKHBhcnRzWzBdPy50eXBlICE9ICdcIicgfHwgcGFydHMuYXQoLTEpPy50eXBlICE9ICdcIicpIHRoaXMuZmFpbChub2RlLCBcInByZWZpeGVkIHN0cmluZyBsaXRlcmFsXCIpXG4gICAgY29uc3QgYnl0ZXMgPSBbXVxuXG4gICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHBhcnRzLmxlbmd0aCAtIDE7IGluZGV4KyspIHtcbiAgICAgIGNvbnN0IGNoaWxkID0gcGFydHNbaW5kZXhdXG4gICAgICBjb25zdCB0ZXh0ID0gdGhpcy50ZXh0KGNoaWxkKVxuXG4gICAgICBpZiAoY2hpbGQudHlwZSA9PSBcInN0cmluZ19jb250ZW50XCIpIHtcbiAgICAgICAgZm9yIChjb25zdCBieXRlIG9mIG5ldyBUZXh0RW5jb2RlcigpLmVuY29kZSh0ZXh0KSkgYnl0ZXMucHVzaChieXRlKVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoY2hpbGQudHlwZSA9PSBcImVzY2FwZV9zZXF1ZW5jZVwiKSB7XG4gICAgICAgIGNvbnN0IHNpbXBsZSA9IG5ldyBNYXAoW1tcImFcIiwgN10sIFtcImJcIiwgOF0sIFtcImZcIiwgMTJdLCBbXCJuXCIsIDEwXSwgW1wiclwiLCAxM10sIFtcInRcIiwgOV0sIFtcInZcIiwgMTFdLCBbXCJcXFxcXCIsIDkyXSwgWydcIicsIDM0XSwgW1wiJ1wiLCAzOV0sIFtcIj9cIiwgNjNdXSlcbiAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0LnNsaWNlKDEpXG5cbiAgICAgICAgaWYgKHRleHRbMF0gIT0gXCJcXFxcXCIpIHRoaXMuZmFpbChjaGlsZCwgXCJpbnZhbGlkIGVzY2FwZVwiKVxuICAgICAgICBpZiAoc2ltcGxlLmhhcyh2YWx1ZSkpIGJ5dGVzLnB1c2goLyoqIEB0eXBlIHtudW1iZXJ9ICovIChzaW1wbGUuZ2V0KHZhbHVlKSkpXG4gICAgICAgIGVsc2UgaWYgKC9eWzAtN117MSwzfSQvdS50ZXN0KHZhbHVlKSB8fCAvXnhbMC05YS1mQS1GXSskL3UudGVzdCh2YWx1ZSkpIHtcbiAgICAgICAgICBjb25zdCBuZXh0ID0gcGFydHNbaW5kZXggKyAxXVxuXG4gICAgICAgICAgLy8gQyBjb25zdW1lcyBldmVyeSBhZGphY2VudCBoZXggZGlnaXQ7IHRoZSBmcm96ZW4gZ3JhbW1hciBjYXBzIGVhY2ggZXNjYXBlIG5vZGUgYXQgZm91ci5cbiAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChcInhcIikgJiYgbmV4dC50eXBlID09IFwic3RyaW5nX2NvbnRlbnRcIiAmJiBuZXh0LnN0YXJ0SW5kZXggPT0gY2hpbGQuZW5kSW5kZXggJiYgL15bMC05YS1mQS1GXS91LnRlc3QodGhpcy50ZXh0KG5leHQpKSkge1xuICAgICAgICAgICAgdGhpcy5mYWlsKGNoaWxkLCBcImhleGFkZWNpbWFsIGVzY2FwZSBzcGxpdCBieSBwYXJzZXIgYm91bmRhcnlcIilcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgbnVtYmVyID0gTnVtYmVyLnBhcnNlSW50KHZhbHVlWzBdID09IFwieFwiID8gdmFsdWUuc2xpY2UoMSkgOiB2YWx1ZSwgdmFsdWVbMF0gPT0gXCJ4XCIgPyAxNiA6IDgpXG5cbiAgICAgICAgICBpZiAobnVtYmVyID4gMjU1KSB0aGlzLmZhaWwoY2hpbGQsIFwiZXNjYXBlIG91dHNpZGUgYnl0ZSByYW5nZVwiKVxuICAgICAgICAgIGJ5dGVzLnB1c2gobnVtYmVyKVxuICAgICAgICB9IGVsc2UgdGhpcy5mYWlsKGNoaWxkLCBcInVuc3VwcG9ydGVkIGVzY2FwZVwiKVxuICAgICAgfSBlbHNlIHRoaXMuZmFpbChjaGlsZCwgXCJzdHJpbmcgY2hpbGRcIilcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBuZXcgVGV4dERlY29kZXIoXCJ1dGYtOFwiLCB7ZmF0YWw6IHRydWUsIGlnbm9yZUJPTTogdHJ1ZX0pLmRlY29kZShuZXcgVWludDhBcnJheShieXRlcykpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFR5cGVFcnJvcikgcmV0dXJuIHRoaXMuZmFpbChub2RlLCBcImludmFsaWQgVVRGLTggbGl0ZXJhbCBieXRlc1wiKVxuICAgICAgdGhyb3cgZXJyb3JcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgc3VwcG9ydGVkIGV4cHJlc3Npb25zIHdpdGhvdXQgYXNzdW1pbmcgQyBhcmd1bWVudCBldmFsdWF0aW9uIG9yZGVyLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBFeHByZXNzaW9uIG5vZGUuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW25lc3RlZF0gLSBXaGV0aGVyIGEgc2VtYW50aWMgY2FsbCB3b3VsZCBoYXZlIHVuc3BlY2lmaWVkIG9yZGVyLlxuICAgKiBAcmV0dXJucyB7RXhwcmVzc2lvbn0gU2VtYW50aWMgZXhwcmVzc2lvbi5cbiAgICovXG4gIGV4cHJlc3Npb24obm9kZSwgbmVzdGVkID0gZmFsc2UpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMubG9jYXRpb24obm9kZSlcblxuICAgIGlmIChub2RlLnR5cGUgPT0gXCJwYXJlbnRoZXNpemVkX2V4cHJlc3Npb25cIikge1xuICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKG5vZGUpXG5cbiAgICAgIHRoaXMuc2hhcGUobm9kZSwgW1wiKFwiLCBwYXJ0c1sxXSwgXCIpXCJdKVxuICAgICAgcmV0dXJuIHRoaXMuZXhwcmVzc2lvbihwYXJ0c1sxXSwgbmVzdGVkKVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwiaWRlbnRpZmllclwiKSB7XG4gICAgICBjb25zdCB0ZW1wb3JhcnkgPSB0aGlzLnRlbXBvcmFyeUV4cHJlc3Npb25zPy5nZXQodGhpcy50ZXh0KG5vZGUpKVxuXG4gICAgICBpZiAodGVtcG9yYXJ5KSB7XG4gICAgICAgIHRoaXMudGVtcG9yYXJ5RXhwcmVzc2lvbnM/LmRlbGV0ZSh0aGlzLnRleHQobm9kZSkpXG4gICAgICAgIHJldHVybiB0ZW1wb3JhcnlcbiAgICAgIH1cbiAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiBcIklkZW50aWZpZXJFeHByZXNzaW9uXCIsIGxvY2F0aW9uLCBuYW1lOiB0aGlzLmlkZW50aWZpZXIobm9kZSl9LCB7bmFtZTogbG9jYXRpb259KVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwidHJ1ZVwiIHx8IG5vZGUudHlwZSA9PSBcImZhbHNlXCIpIHtcbiAgICAgIGlmICh0aGlzLnRleHQobm9kZSkgIT0gbm9kZS50eXBlKSB0aGlzLmZhaWwobm9kZSwgXCJub25jYW5vbmljYWwgQm9vbGVhbiBsaXRlcmFsIHNwZWxsaW5nXCIpXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogXCJCb29sZWFuTGl0ZXJhbFwiLCBsb2NhdGlvbiwgdmFsdWU6IG5vZGUudHlwZSA9PSBcInRydWVcIn0sIHtsaXRlcmFsOiBsb2NhdGlvbn0pXG4gICAgfVxuICAgIGlmIChub2RlLnR5cGUgPT0gXCJudW1iZXJfbGl0ZXJhbFwiKSB7XG4gICAgICBjb25zdCBzcGVsbGluZyA9IHRoaXMudGV4dChub2RlKVxuXG4gICAgICBpZiAoIS9eKD86MHxbMS05XVswLTldKikkL3UudGVzdChzcGVsbGluZykgfHwgIU51bWJlci5pc1NhZmVJbnRlZ2VyKE51bWJlcihzcGVsbGluZykpKSB0aGlzLmZhaWwobm9kZSwgXCJub24tc2FmZSBvciBub25jYW5vbmljYWwgaW50ZWdlclwiKVxuICAgICAgcmV0dXJuIHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IFwiSW50ZWdlckxpdGVyYWxcIiwgbG9jYXRpb24sIHZhbHVlOiBOdW1iZXIoc3BlbGxpbmcpfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgICB9XG4gICAgaWYgKG5vZGUudHlwZSA9PSBcImJpbmFyeV9leHByZXNzaW9uXCIpIHtcbiAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLmZpZWxkKG5vZGUsIFwibGVmdFwiKVxuICAgICAgY29uc3QgcmlnaHQgPSB0aGlzLmZpZWxkKG5vZGUsIFwicmlnaHRcIilcbiAgICAgIGNvbnN0IG9wZXJhdG9yID0gdGhpcy5maWVsZChub2RlLCBcIm9wZXJhdG9yXCIpXG4gICAgICBjb25zdCBpbnRlbnQgPSBiaW5hcnlPcGVyYXRpb25zLmdldChvcGVyYXRvci50eXBlKVxuXG4gICAgICB0aGlzLnNoYXBlKG5vZGUsIFtsZWZ0LCBvcGVyYXRvciwgcmlnaHRdKVxuICAgICAgaWYgKCFpbnRlbnQpIHJldHVybiB0aGlzLmZhaWwob3BlcmF0b3IsIFwidW5zdXBwb3J0ZWQgYmluYXJ5IG9wZXJhdG9yXCIpXG4gICAgICByZXR1cm4gdGhpcy5iaW5hcnkobm9kZSwgaW50ZW50LCB0aGlzLmV4cHJlc3Npb24obGVmdCwgdHJ1ZSksIHRoaXMuZXhwcmVzc2lvbihyaWdodCwgdHJ1ZSksIG9wZXJhdG9yKVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwidW5hcnlfZXhwcmVzc2lvblwiKSB7XG4gICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuZmllbGQobm9kZSwgXCJvcGVyYXRvclwiKVxuICAgICAgY29uc3QgYXJndW1lbnQgPSB0aGlzLmZpZWxkKG5vZGUsIFwiYXJndW1lbnRcIilcblxuICAgICAgdGhpcy5zaGFwZShub2RlLCBbb3BlcmF0b3IsIGFyZ3VtZW50XSlcbiAgICAgIGlmICghW1wiLVwiLCBcIiFcIl0uaW5jbHVkZXMob3BlcmF0b3IudHlwZSkpIHRoaXMuZmFpbChvcGVyYXRvciwgXCJ1bnN1cHBvcnRlZCB1bmFyeSBvcGVyYXRvclwiKVxuICAgICAgcmV0dXJuIHRoaXMudW5hcnkobm9kZSwgb3BlcmF0b3IudHlwZSA9PSBcIi1cIiA/IFwiTmVnYXRlXCIgOiBcIk5vdFwiLCB0aGlzLmV4cHJlc3Npb24oYXJndW1lbnQsIHRydWUpLCBvcGVyYXRvcilcbiAgICB9XG4gICAgaWYgKG5vZGUudHlwZSA9PSBcImNhbGxfZXhwcmVzc2lvblwiKSB7XG4gICAgICBjb25zdCBjYWxsID0gdGhpcy5jYWxsKG5vZGUpXG4gICAgICBjb25zdCBuYW1lID0gdGhpcy50ZXh0KGNhbGwubmFtZSlcblxuICAgICAgaWYgKG5hbWUgPT0gXCJJTlQ2NF9DXCIgfHwgbmFtZSA9PSBcIlNFTUFOVElGT0xEX1NUUklOR1wiKSB7XG4gICAgICAgIGlmIChjYWxsLmFyZ3VtZW50cy5sZW5ndGggIT0gMSkgdGhpcy5mYWlsKG5vZGUsIFwibGl0ZXJhbCBtYWNybyBhcml0eVwiKVxuICAgICAgICBpZiAobmFtZSA9PSBcIlNFTUFOVElGT0xEX1NUUklOR1wiKSByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogXCJTdHJpbmdMaXRlcmFsXCIsIGxvY2F0aW9uLCB2YWx1ZTogdGhpcy5zdHJpbmcoY2FsbC5hcmd1bWVudHNbMF0pfSwge2xpdGVyYWw6IGxvY2F0aW9ufSlcbiAgICAgICAgaWYgKGNhbGwuYXJndW1lbnRzWzBdLnR5cGUgIT0gXCJudW1iZXJfbGl0ZXJhbFwiKSB0aGlzLmZhaWwobm9kZSwgXCJpbnRlZ2VyIGxpdGVyYWwgbWFjcm8gb3BlcmFuZFwiKVxuICAgICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7Li4udGhpcy5leHByZXNzaW9uKGNhbGwuYXJndW1lbnRzWzBdKSwgbG9jYXRpb259LCB7bGl0ZXJhbDogbG9jYXRpb259KVxuICAgICAgfVxuICAgICAgLy8gR2VuZXJhdGVkIG9wZXJhdGlvbnMgYXJlIHNlcGFyYXRlIHRlbXBvcmFyeSBpbml0aWFsaXplcnM7IG9ubHkgbGl0ZXJhbCBtYWNyb3MgbWF5IG5lc3QgYXMgY2FsbHMuXG4gICAgICBpZiAobmVzdGVkKSB0aGlzLmZhaWwobm9kZSwgXCJjYWxsZXIgY2FsbCBpbiB1bnNwZWNpZmllZC1vcmRlciBleHByZXNzaW9uXCIpXG4gICAgICBpZiAobmFtZSA9PSBcInNlbWFudGlmb2xkX2ludGVnZXJfbmVnYXRlXCIpIHtcbiAgICAgICAgaWYgKGNhbGwuYXJndW1lbnRzLmxlbmd0aCAhPSAxKSB0aGlzLmZhaWwobm9kZSwgXCJuZWdhdGlvbiBoZWxwZXIgYXJpdHlcIilcbiAgICAgICAgcmV0dXJuIHRoaXMudW5hcnkobm9kZSwgXCJOZWdhdGVcIiwgdGhpcy5leHByZXNzaW9uKGNhbGwuYXJndW1lbnRzWzBdLCB0cnVlKSwgY2FsbC5uYW1lKVxuICAgICAgfVxuICAgICAgY29uc3QgaW50ZW50ID0gaGVscGVycy5nZXQobmFtZSlcblxuICAgICAgaWYgKGludGVudCkge1xuICAgICAgICBpZiAoY2FsbC5hcmd1bWVudHMubGVuZ3RoICE9IDIpIHRoaXMuZmFpbChub2RlLCBcInNjYWxhciBoZWxwZXIgYXJpdHlcIilcbiAgICAgICAgcmV0dXJuIHRoaXMuYmluYXJ5KG5vZGUsIGludGVudCwgdGhpcy5leHByZXNzaW9uKGNhbGwuYXJndW1lbnRzWzBdLCB0cnVlKSwgdGhpcy5leHByZXNzaW9uKGNhbGwuYXJndW1lbnRzWzFdLCB0cnVlKSwgY2FsbC5uYW1lKVxuICAgICAgfVxuICAgICAgaWYgKGNhbGwuYXJndW1lbnRzLmxlbmd0aCAhPSAyKSB0aGlzLmZhaWwobm9kZSwgXCJzZW1hbnRpYyBjYWxsIGFyaXR5XCIpXG4gICAgICBjb25zdCBjYWxsZWUgPSB0aGlzLmlkZW50aWZpZXIoY2FsbC5uYW1lKVxuXG4gICAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkICYmICF0aGlzLmRlY2xhcmVkRnVuY3Rpb25zLmhhcyhjYWxsZWUpKSB0aGlzLmZhaWwoY2FsbC5uYW1lLCBcImltcGxpY2l0IGZ1bmN0aW9uIGRlY2xhcmF0aW9uXCIpXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogXCJDYWxsRXhwcmVzc2lvblwiLCBsb2NhdGlvbiwgY2FsbGVlLFxuICAgICAgICBhcmd1bWVudHM6IGNhbGwuYXJndW1lbnRzLm1hcCgoYXJndW1lbnQpID0+IHRoaXMuZXhwcmVzc2lvbihhcmd1bWVudCwgdHJ1ZSkpfSwge2NhbGxlZTogdGhpcy5sb2NhdGlvbihjYWxsLm5hbWUpfSlcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmFpbChub2RlKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgcGFyc2VyIGludGVudCBiZWZvcmUgc2hhcmVkIHR5cGUgcmVzb2x1dGlvbi5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gT3duaW5nIGV4cHJlc3Npb24uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlbnQgLSBBZGFwdGVkIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtFeHByZXNzaW9ufSBsZWZ0IC0gTGVmdCBvcGVyYW5kLlxuICAgKiBAcGFyYW0ge0V4cHJlc3Npb259IHJpZ2h0IC0gUmlnaHQgb3BlcmFuZC5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBvcGVyYXRvciAtIE9wZXJhdG9yIHRva2VuLlxuICAgKiBAcmV0dXJucyB7RXhwcmVzc2lvbn0gUGVuZGluZyBiaW5hcnkgZXhwcmVzc2lvbi5cbiAgICovXG4gIGJpbmFyeShub2RlLCBpbnRlbnQsIGxlZnQsIHJpZ2h0LCBvcGVyYXRvcikge1xuICAgIHJldHVybiAvKiogQHR5cGUge0V4cHJlc3Npb259ICovICh3aXRoQWRhcHRlZE9wZXJhdGlvbih3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiBcIkJpbmFyeUV4cHJlc3Npb25cIiwgbG9jYXRpb246IHRoaXMubG9jYXRpb24obm9kZSksIGxlZnQsIHJpZ2h0fSxcbiAgICAgIHtvcGVyYXRvcjogdGhpcy5sb2NhdGlvbihvcGVyYXRvcil9KSwgLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy9vcGVyYXRvcnMuanNcIikuQWRhcHRlZE9wZXJhdGlvbn0gKi8gKGludGVudCkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgcGFyc2VyIGludGVudCBmb3IgYSB1bmFyeSBvcGVyYXRpb24uXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIE93bmluZyBleHByZXNzaW9uLlxuICAgKiBAcGFyYW0ge1wiTmVnYXRlXCIgfCBcIk5vdFwifSBpbnRlbnQgLSBBZGFwdGVkIG9wZXJhdGlvbi5cbiAgICogQHBhcmFtIHtFeHByZXNzaW9ufSBvcGVyYW5kIC0gT3BlcmFuZC5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBvcGVyYXRvciAtIE9wZXJhdG9yIHRva2VuLlxuICAgKiBAcmV0dXJucyB7RXhwcmVzc2lvbn0gUGVuZGluZyB1bmFyeSBleHByZXNzaW9uLlxuICAgKi9cbiAgdW5hcnkobm9kZSwgaW50ZW50LCBvcGVyYW5kLCBvcGVyYXRvcikge1xuICAgIHJldHVybiAvKiogQHR5cGUge0V4cHJlc3Npb259ICovICh3aXRoQWRhcHRlZE9wZXJhdGlvbih3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiBcIlVuYXJ5RXhwcmVzc2lvblwiLCBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbihub2RlKSwgb3BlcmFuZH0sXG4gICAgICB7b3BlcmF0b3I6IHRoaXMubG9jYXRpb24ob3BlcmF0b3IpfSksIGludGVudCkpXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgb25lIGluaXRpYWxpemVkIGRlY2xhcmF0aW9uIG9yIGV4ZWN1dGFibGUgc3RhdGVtZW50LlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IG5vZGUgLSBTdGF0ZW1lbnQgbm9kZS5cbiAgICogQHJldHVybnMge1N0YXRlbWVudH0gU2VtYW50aWMgc3RhdGVtZW50LlxuICAgKi9cbiAgc3RhdGVtZW50KG5vZGUpIHtcbiAgICBjb25zdCBsb2NhdGlvbiA9IHRoaXMubG9jYXRpb24obm9kZSlcblxuICAgIGlmIChub2RlLnR5cGUgPT0gXCJkZWNsYXJhdGlvblwiKSB7XG4gICAgICBjb25zdCB0eXBlTm9kZSA9IG5vZGUuY2hpbGRyZW4uZmluZCgoe2ZpZWxkfSkgPT4gZmllbGQgPT0gXCJ0eXBlXCIpPy5ub2RlXG5cbiAgICAgIGlmICghdHlwZU5vZGUpIHJldHVybiBtaXNzaW5nVHlwZShcImNcIiwgXCJsb2NhbFwiLCBsb2NhdGlvbilcbiAgICAgIGNvbnN0IGRlY2xhcmF0b3IgPSB0aGlzLmZpZWxkKG5vZGUsIFwiZGVjbGFyYXRvclwiKVxuICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKG5vZGUpXG4gICAgICBjb25zdCBpbW11dGFibGUgPSBwYXJ0c1swXS50eXBlID09IFwidHlwZV9xdWFsaWZpZXJcIlxuXG4gICAgICB0aGlzLnNoYXBlKG5vZGUsIFsuLi4oaW1tdXRhYmxlID8gW3BhcnRzWzBdXSA6IFtdKSwgdHlwZU5vZGUsIGRlY2xhcmF0b3IsIFwiO1wiXSlcbiAgICAgIGlmIChpbW11dGFibGUgJiYgdGhpcy50ZXh0KHBhcnRzWzBdKSAhPSBcImNvbnN0XCIpIHRoaXMuZmFpbChwYXJ0c1swXSwgXCJsb2NhbCBxdWFsaWZpZXJcIilcbiAgICAgIGlmIChkZWNsYXJhdG9yLnR5cGUgIT0gXCJpbml0X2RlY2xhcmF0b3JcIikgdGhpcy5mYWlsKGRlY2xhcmF0b3IsIFwiaW5pdGlhbGl6ZWQgc2ltcGxlIGxvY2FsIHJlcXVpcmVkXCIpXG4gICAgICBjb25zdCBuYW1lID0gdGhpcy5maWVsZChkZWNsYXJhdG9yLCBcImRlY2xhcmF0b3JcIilcbiAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWVsZChkZWNsYXJhdG9yLCBcInZhbHVlXCIpXG5cbiAgICAgIHRoaXMuc2hhcGUoZGVjbGFyYXRvciwgW25hbWUsIFwiPVwiLCB2YWx1ZV0pXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogXCJMb2NhbERlY2xhcmF0aW9uXCIsIGxvY2F0aW9uLCBuYW1lOiB0aGlzLmlkZW50aWZpZXIobmFtZSksIHR5cGU6IHRoaXMudHlwZSh0eXBlTm9kZSksIG11dGFibGU6ICFpbW11dGFibGUsXG4gICAgICAgIGluaXRpYWxpemVyOiB0aGlzLmV4cHJlc3Npb24odmFsdWUpfSwge25hbWU6IHRoaXMubG9jYXRpb24obmFtZSksIG9wZXJhdG9yOiB0aGlzLmxvY2F0aW9uKHRoaXMucGFydHMoZGVjbGFyYXRvcilbMV0pfSlcbiAgICB9XG4gICAgaWYgKG5vZGUudHlwZSA9PSBcInJldHVybl9zdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKG5vZGUpXG5cbiAgICAgIHRoaXMuc2hhcGUobm9kZSwgW1wicmV0dXJuXCIsIHBhcnRzWzFdLCBcIjtcIl0pXG4gICAgICByZXR1cm4ge2tpbmQ6IFwiUmV0dXJuU3RhdGVtZW50XCIsIGxvY2F0aW9uLCBleHByZXNzaW9uOiB0aGlzLmV4cHJlc3Npb24ocGFydHNbMV0pfVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwiaWZfc3RhdGVtZW50XCIpIHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IHRoaXMuZmllbGQobm9kZSwgXCJjb25kaXRpb25cIilcbiAgICAgIGNvbnN0IGNvbnNlcXVlbmNlID0gdGhpcy5maWVsZChub2RlLCBcImNvbnNlcXVlbmNlXCIpXG4gICAgICBjb25zdCBhbHRlcm5hdGl2ZSA9IG5vZGUuY2hpbGRyZW4uZmluZCgoe2ZpZWxkfSkgPT4gZmllbGQgPT0gXCJhbHRlcm5hdGl2ZVwiKT8ubm9kZVxuXG4gICAgICB0aGlzLnNoYXBlKG5vZGUsIFtcImlmXCIsIGNvbmRpdGlvbiwgY29uc2VxdWVuY2UsIC4uLihhbHRlcm5hdGl2ZSA/IFthbHRlcm5hdGl2ZV0gOiBbXSldKVxuICAgICAgY29uc3Qgc3RhdGVtZW50ID0ge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIklmU3RhdGVtZW50XCIpLCBsb2NhdGlvbiwgY29uZGl0aW9uOiB0aGlzLmV4cHJlc3Npb24oY29uZGl0aW9uKSwgY29uc2VxdWVudDogdGhpcy5ibG9jayhjb25zZXF1ZW5jZSl9XG5cbiAgICAgIGlmICghYWx0ZXJuYXRpdmUpIHJldHVybiBzdGF0ZW1lbnRcbiAgICAgIGNvbnN0IGJyYW5jaCA9IHRoaXMucGFydHMoYWx0ZXJuYXRpdmUpWzFdXG5cbiAgICAgIHRoaXMuc2hhcGUoYWx0ZXJuYXRpdmUsIFtcImVsc2VcIiwgYnJhbmNoXSlcbiAgICAgIHJldHVybiB7Li4uc3RhdGVtZW50LCBhbHRlcm5hdGU6IGJyYW5jaC50eXBlID09IFwiaWZfc3RhdGVtZW50XCJcbiAgICAgICAgPyB7a2luZDogXCJCbG9ja1wiLCBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbihicmFuY2gpLCBzdGF0ZW1lbnRzOiBbdGhpcy5zdGF0ZW1lbnQoYnJhbmNoKV19IDogdGhpcy5ibG9jayhicmFuY2gpfVxuICAgIH1cbiAgICBpZiAobm9kZS50eXBlID09IFwiZXhwcmVzc2lvbl9zdGF0ZW1lbnRcIikge1xuICAgICAgY29uc3QgZXhwcmVzc2lvbiA9IHRoaXMucGFydHMobm9kZSlbMF1cblxuICAgICAgdGhpcy5zaGFwZShub2RlLCBbZXhwcmVzc2lvbiwgXCI7XCJdKVxuICAgICAgaWYgKGV4cHJlc3Npb24udHlwZSA9PSBcImFzc2lnbm1lbnRfZXhwcmVzc2lvblwiKSB7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLmZpZWxkKGV4cHJlc3Npb24sIFwibGVmdFwiKVxuICAgICAgICBjb25zdCByaWdodCA9IHRoaXMuZmllbGQoZXhwcmVzc2lvbiwgXCJyaWdodFwiKVxuICAgICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuZmllbGQoZXhwcmVzc2lvbiwgXCJvcGVyYXRvclwiKVxuXG4gICAgICAgIHRoaXMuc2hhcGUoZXhwcmVzc2lvbiwgW2xlZnQsIFwiPVwiLCByaWdodF0pXG4gICAgICAgIGNvbnN0IHRhcmdldCA9IHdpdGhQYXJzZXJSYW5nZXMoe2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIklkZW50aWZpZXJFeHByZXNzaW9uXCIpLCBuYW1lOiB0aGlzLmlkZW50aWZpZXIobGVmdCksIGxvY2F0aW9uOiB0aGlzLmxvY2F0aW9uKGxlZnQpfSwge25hbWU6IHRoaXMubG9jYXRpb24obGVmdCl9KVxuXG4gICAgICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiBcIkFzc2lnbm1lbnRTdGF0ZW1lbnRcIiwgbG9jYXRpb24sIHRhcmdldCwgZXhwcmVzc2lvbjogdGhpcy5leHByZXNzaW9uKHJpZ2h0KX0sIHtvcGVyYXRvcjogdGhpcy5sb2NhdGlvbihvcGVyYXRvcil9KVxuICAgICAgfVxuICAgICAgY29uc3QgY2FsbCA9IHRoaXMuY2FsbChleHByZXNzaW9uKVxuXG4gICAgICBpZiAoIS9ec2VtYW50aWZvbGRfcHJpbnRfKD86aW50ZWdlcnxib29sZWFufHN0cmluZykkL3UudGVzdCh0aGlzLnRleHQoY2FsbC5uYW1lKSkgfHwgY2FsbC5hcmd1bWVudHMubGVuZ3RoICE9IDEpIHRoaXMuZmFpbChub2RlLCBcInByaW50IHNjYWZmb2xkXCIpXG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZXhwcmVzc2lvbihjYWxsLmFyZ3VtZW50c1swXSlcblxuICAgICAgY29uc3Qgc3RhdGVtZW50ID0ge2tpbmQ6IC8qKiBAdHlwZSB7Y29uc3R9ICovIChcIlByaW50U3RhdGVtZW50XCIpLCBsb2NhdGlvbiwgZXhwcmVzc2lvbjogdmFsdWV9XG5cbiAgICAgIHRoaXMucHJpbnRUeXBlcy5zZXQoc3RhdGVtZW50LCB7bm9kZTogY2FsbC5uYW1lLCB0eXBlOiB0aGlzLnRleHQoY2FsbC5uYW1lKS5zbGljZShcInNlbWFudGlmb2xkX3ByaW50X1wiLmxlbmd0aCl9KVxuICAgICAgcmV0dXJuIHN0YXRlbWVudFxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mYWlsKG5vZGUpXG4gIH1cblxuICAvKipcbiAgICogQ29udmVydHMgb25lIGxleGljYWwgYnJhY2VkIGJsb2NrIGluIHNvdXJjZSBvcmRlci5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gQmxvY2sgbm9kZS5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkJsb2NrfSBTZW1hbnRpYyBibG9jay5cbiAgICovXG4gIGJsb2NrKG5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlICE9IFwiY29tcG91bmRfc3RhdGVtZW50XCIpIHRoaXMuZmFpbChub2RlLCBcImJyYWNlZCBibG9jayByZXF1aXJlZFwiKVxuICAgIGNvbnN0IHBhcnRzID0gdGhpcy5wYXJ0cyhub2RlKVxuXG4gICAgdGhpcy5zaGFwZShub2RlLCBbXCJ7XCIsIC4uLnBhcnRzLnNsaWNlKDEsIC0xKSwgXCJ9XCJdKVxuICAgIHJldHVybiB7a2luZDogXCJCbG9ja1wiLCBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbihub2RlKSwgc3RhdGVtZW50czogdGhpcy5nZW5lcmF0ZWRcbiAgICAgID8gdGhpcy5nZW5lcmF0ZWRTdGF0ZW1lbnRzKG5vZGUuY2hpbGRyZW4ubWFwKCh7bm9kZTogY2hpbGR9KSA9PiBjaGlsZCkuc2xpY2UoMSwgLTEpKVxuICAgICAgOiBwYXJ0cy5zbGljZSgxLCAtMSkubWFwKChjaGlsZCkgPT4gdGhpcy5zdGF0ZW1lbnQoY2hpbGQpKX1cbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBvbmUgZmlsZS1sb2NhbCBzZW1hbnRpYyBmdW5jdGlvbi5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBub2RlIC0gRnVuY3Rpb24gZGVmaW5pdGlvbi5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLkZ1bmN0aW9uRGVjbGFyYXRpb259IFNlbWFudGljIGZ1bmN0aW9uLlxuICAgKi9cbiAgZnVuY3Rpb24obm9kZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpZWxkKG5vZGUsIFwidHlwZVwiKVxuICAgIGNvbnN0IGRlY2xhcmF0b3IgPSB0aGlzLmZpZWxkKG5vZGUsIFwiZGVjbGFyYXRvclwiKVxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmZpZWxkKG5vZGUsIFwiYm9keVwiKVxuXG4gICAgdGhpcy5zaGFwZShub2RlLCBbXCJzdG9yYWdlX2NsYXNzX3NwZWNpZmllclwiLCB0eXBlLCBkZWNsYXJhdG9yLCBib2R5XSlcbiAgICBpZiAodGhpcy50ZXh0KHRoaXMucGFydHMobm9kZSlbMF0pICE9IFwic3RhdGljXCIgfHwgZGVjbGFyYXRvci50eXBlICE9IFwiZnVuY3Rpb25fZGVjbGFyYXRvclwiKSB0aGlzLmZhaWwobm9kZSwgXCJmaWxlLWxvY2FsIGZ1bmN0aW9uIHJlcXVpcmVkXCIpXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZmllbGQoZGVjbGFyYXRvciwgXCJkZWNsYXJhdG9yXCIpXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZmllbGQoZGVjbGFyYXRvciwgXCJwYXJhbWV0ZXJzXCIpXG5cbiAgICB0aGlzLnNoYXBlKGRlY2xhcmF0b3IsIFtuYW1lLCBwYXJhbWV0ZXJzXSlcbiAgICBjb25zdCBwYXJ0cyA9IHRoaXMucGFydHMocGFyYW1ldGVycylcblxuICAgIHRoaXMuc2hhcGUocGFyYW1ldGVycywgW1wiKFwiLCBcInBhcmFtZXRlcl9kZWNsYXJhdGlvblwiLCBcIixcIiwgXCJwYXJhbWV0ZXJfZGVjbGFyYXRpb25cIiwgXCIpXCJdKVxuICAgIGNvbnN0IGNvbnZlcnRlZCA9IFtwYXJ0c1sxXSwgcGFydHNbM11dLm1hcCgocGFyYW1ldGVyKSA9PiB7XG4gICAgICBjb25zdCB0eXBlTm9kZSA9IHRoaXMuZmllbGQocGFyYW1ldGVyLCBcInR5cGVcIilcbiAgICAgIGNvbnN0IG5hbWVOb2RlID0gdGhpcy5maWVsZChwYXJhbWV0ZXIsIFwiZGVjbGFyYXRvclwiKVxuXG4gICAgICB0aGlzLnNoYXBlKHBhcmFtZXRlciwgW3R5cGVOb2RlLCBuYW1lTm9kZV0pXG4gICAgICByZXR1cm4gd2l0aFBhcnNlclJhbmdlcyh7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiUGFyYW1ldGVyXCIpLCBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbihwYXJhbWV0ZXIpLCBuYW1lOiB0aGlzLmlkZW50aWZpZXIobmFtZU5vZGUpLCB0eXBlOiB0aGlzLnR5cGUodHlwZU5vZGUpfSwge25hbWU6IHRoaXMubG9jYXRpb24obmFtZU5vZGUpfSlcbiAgICB9KVxuXG4gICAgdGhpcy5kZWNsYXJlZEZ1bmN0aW9ucy5hZGQodGhpcy5pZGVudGlmaWVyKG5hbWUpKVxuICAgIHJldHVybiB3aXRoUGFyc2VyUmFuZ2VzKHtraW5kOiBcIkZ1bmN0aW9uRGVjbGFyYXRpb25cIiwgbG9jYXRpb246IHRoaXMubG9jYXRpb24obm9kZSksIG5hbWU6IHRoaXMuaWRlbnRpZmllcihuYW1lKSwgcGFyYW1ldGVyczogY29udmVydGVkLFxuICAgICAgcmV0dXJuVHlwZTogdGhpcy50eXBlKHR5cGUpLCBib2R5OiB0aGlzLmJsb2NrKGJvZHkpfSwge25hbWU6IHRoaXMubG9jYXRpb24obmFtZSl9KVxuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgb25seSB0aGUgZXhhY3QgbWFpbiBjbGVhbnVwIGFuZCBzdGF0dXMgc2NhZmZvbGRpbmcuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIEVudHJ5IGRlZmluaXRpb24uXG4gICAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5FbnRyeVBvaW50fSBTZW1hbnRpYyBlbnRyeS5cbiAgICovXG4gIG1haW4obm9kZSkge1xuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpZWxkKG5vZGUsIFwidHlwZVwiKVxuICAgIGNvbnN0IGRlY2xhcmF0b3IgPSB0aGlzLmZpZWxkKG5vZGUsIFwiZGVjbGFyYXRvclwiKVxuICAgIGNvbnN0IGJvZHkgPSB0aGlzLmZpZWxkKG5vZGUsIFwiYm9keVwiKVxuXG4gICAgdGhpcy5zaGFwZShub2RlLCBbdHlwZSwgZGVjbGFyYXRvciwgYm9keV0pXG4gICAgY29uc3QgbmFtZSA9IHRoaXMuZmllbGQoZGVjbGFyYXRvciwgXCJkZWNsYXJhdG9yXCIpXG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHRoaXMuZmllbGQoZGVjbGFyYXRvciwgXCJwYXJhbWV0ZXJzXCIpXG5cbiAgICB0aGlzLnNoYXBlKGRlY2xhcmF0b3IsIFtuYW1lLCBwYXJhbWV0ZXJzXSlcbiAgICBpZiAodGhpcy50ZXh0KHR5cGUpICE9IFwiaW50XCIgfHwgdGhpcy50ZXh0KG5hbWUpICE9IFwibWFpblwiKSB0aGlzLmZhaWwobm9kZSwgXCJtYWluIHNpZ25hdHVyZVwiKVxuICAgIHRoaXMuc2hhcGUocGFyYW1ldGVycywgW1wiKFwiLCBcInBhcmFtZXRlcl9kZWNsYXJhdGlvblwiLCBcIilcIl0pXG4gICAgY29uc3Qgdm9pZFBhcmFtZXRlciA9IHRoaXMucGFydHMocGFyYW1ldGVycylbMV1cblxuICAgIHRoaXMuc2hhcGUodm9pZFBhcmFtZXRlciwgW1wicHJpbWl0aXZlX3R5cGVcIl0pXG4gICAgaWYgKHRoaXMudGV4dCh0aGlzLnBhcnRzKHZvaWRQYXJhbWV0ZXIpWzBdKSAhPSBcInZvaWRcIikgdGhpcy5mYWlsKHZvaWRQYXJhbWV0ZXIsIFwibWFpbiBwYXJhbWV0ZXJzXCIpXG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKGJvZHkpXG4gICAgY29uc3QgY2xlYW51cCA9IHBhcnRzLmF0KC0zKVxuICAgIGNvbnN0IHN0YXR1cyA9IHBhcnRzLmF0KC0yKVxuXG4gICAgaWYgKCFjbGVhbnVwIHx8ICFzdGF0dXMgfHwgYm9keS50eXBlICE9IFwiY29tcG91bmRfc3RhdGVtZW50XCIpIHRoaXMuZmFpbChib2R5LCBcIm1haW4gY2xlYW51cFwiKVxuICAgIHRoaXMuc2hhcGUoYm9keSwgW1wie1wiLCAuLi5wYXJ0cy5zbGljZSgxLCAtMSksIFwifVwiXSlcbiAgICB0aGlzLnNoYXBlKGNsZWFudXAsIFtcImNhbGxfZXhwcmVzc2lvblwiLCBcIjtcIl0pXG4gICAgY29uc3QgY2FsbCA9IHRoaXMuY2FsbCh0aGlzLnBhcnRzKGNsZWFudXApWzBdKVxuXG4gICAgaWYgKHRoaXMudGV4dChjYWxsLm5hbWUpICE9IFwic2VtYW50aWZvbGRfY2xlYW51cFwiIHx8IGNhbGwuYXJndW1lbnRzLmxlbmd0aCAhPSAwKSB0aGlzLmZhaWwoY2xlYW51cCwgXCJlbnRyeSBjbGVhbnVwXCIpXG4gICAgdGhpcy5zaGFwZShzdGF0dXMsIFtcInJldHVyblwiLCBcIm51bWJlcl9saXRlcmFsXCIsIFwiO1wiXSlcbiAgICBpZiAodGhpcy50ZXh0KHRoaXMucGFydHMoc3RhdHVzKVsxXSkgIT0gXCIwXCIpIHRoaXMuZmFpbChzdGF0dXMsIFwiZW50cnkgc3RhdHVzXCIpXG4gICAgcmV0dXJuIHtraW5kOiBcIkVudHJ5UG9pbnRcIiwgbG9jYXRpb246IHRoaXMubG9jYXRpb24obm9kZSksIGJvZHk6IHtraW5kOiBcIkJsb2NrXCIsIGxvY2F0aW9uOiB0aGlzLmxvY2F0aW9uKGJvZHkpLFxuICAgICAgc3RhdGVtZW50czogdGhpcy5nZW5lcmF0ZWQgPyB0aGlzLmdlbmVyYXRlZFN0YXRlbWVudHMoYm9keS5jaGlsZHJlbi5tYXAoKHtub2RlOiBjaGlsZH0pID0+IGNoaWxkKS5maWx0ZXIoKGNoaWxkKSA9PlxuICAgICAgICBjaGlsZC5zdGFydEluZGV4ID4gYm9keS5zdGFydEluZGV4ICYmIGNoaWxkLmVuZEluZGV4IDw9IGNsZWFudXAuc3RhcnRJbmRleCkpXG4gICAgICAgIDogcGFydHMuc2xpY2UoMSwgLTMpLm1hcCgoY2hpbGQpID0+IHRoaXMuc3RhdGVtZW50KGNoaWxkKSl9fVxuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIG9uZSBjb21wbGV0ZSB0cmFuc2xhdGlvbiB1bml0IGFmdGVyIGV4aGF1c3RpdmUgcmVjb3ZlcnkgcmVqZWN0aW9uLlxuICAgKiBAcGFyYW0ge0NzdE5vZGV9IHJvb3QgLSBGcm96ZW4gdHJhbnNsYXRpb24gdW5pdC5cbiAgICogQHJldHVybnMge2ltcG9ydChcIi4uL3NlbWFudGljL3R5cGVzLmpzXCIpLlNlbWFudGljTW9kdWxlfSBWYWxpZGF0ZWQgc2VtYW50aWMgbW9kdWxlLlxuICAgKi9cbiAgbW9kdWxlKHJvb3QpIHtcbiAgICB0aGlzLnZhbGlkYXRlVHJlZShyb290KVxuICAgIHRoaXMuZ2VuZXJhdGVkID0gcm9vdC5jaGlsZHJlbi5zb21lKCh7bm9kZX0pID0+IG5vZGUudHlwZSA9PSBcImNvbW1lbnRcIiAmJiB0aGlzLnRleHQobm9kZSkgPT0gXCIvKiBzZW1hbnRpZm9sZDpwcm9ncmFtOmM6djEgKi9cIilcbiAgICBpZiAoIXRoaXMuZ2VuZXJhdGVkKSB0aGlzLnJlamVjdFNjYWZmb2xkQ29tbWVudHMocm9vdClcbiAgICBpZiAocm9vdC50eXBlICE9IFwidHJhbnNsYXRpb25fdW5pdFwiKSB0aGlzLmZhaWwocm9vdCwgXCJ0cmFuc2xhdGlvbiB1bml0IHJlcXVpcmVkXCIpXG4gICAgY29uc3QgcGFydHMgPSB0aGlzLnBhcnRzKHJvb3QpXG4gICAgY29uc3QgZGVmaW5pdGlvbnMgPSBwYXJ0cy5zbGljZSgxKS5maWx0ZXIoKG5vZGUpID0+ICF0aGlzLmdlbmVyYXRlZCB8fCBub2RlLnR5cGUgIT0gXCJkZWNsYXJhdGlvblwiKVxuXG4gICAgaWYgKHBhcnRzLmxlbmd0aCA8IDMgfHwgcGFydHNbMF0udHlwZSAhPSBcInByZXByb2NfaW5jbHVkZVwiIHx8IGRlZmluaXRpb25zLnNvbWUoKG5vZGUpID0+IG5vZGUudHlwZSAhPSBcImZ1bmN0aW9uX2RlZmluaXRpb25cIikpIHRoaXMuZmFpbChyb290LCBcInRyYW5zbGF0aW9uIHVuaXQgbWVtYmVyc1wiKVxuICAgIGNvbnN0IGluY2x1ZGUgPSBwYXJ0c1swXVxuICAgIGNvbnN0IGhlYWRlciA9IHRoaXMuZmllbGQoaW5jbHVkZSwgXCJwYXRoXCIpXG5cbiAgICB0aGlzLnNoYXBlKGluY2x1ZGUsIFtcIiNpbmNsdWRlXCIsIGhlYWRlcl0pXG4gICAgaWYgKGhlYWRlci50eXBlICE9IFwic3RyaW5nX2xpdGVyYWxcIiB8fCB0aGlzLnRleHQoaGVhZGVyKSAhPSAnXCJzZW1hbnRpZm9sZF9ydW50aW1lLmhcIicpIHRoaXMuZmFpbChpbmNsdWRlLCBcInN1cHBvcnQgaGVhZGVyIGluY2x1ZGVcIilcbiAgICBpZiAoZGVmaW5pdGlvbnMubGVuZ3RoIDwgMikgdGhpcy5mYWlsKHJvb3QsIFwic2VtYW50aWMgZnVuY3Rpb24gYW5kIG1haW4gcmVxdWlyZWRcIilcbiAgICBjb25zdCBtb2R1bGUgPSB7a2luZDogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwiTW9kdWxlXCIpLCBsb2NhdGlvbjogdGhpcy5sb2NhdGlvbihyb290KSwgZnVuY3Rpb25zOiBkZWZpbml0aW9ucy5zbGljZSgwLCAtMSkubWFwKChub2RlKSA9PiB0aGlzLmZ1bmN0aW9uKG5vZGUpKSxcbiAgICAgIGVudHJ5UG9pbnQ6IHRoaXMubWFpbihkZWZpbml0aW9uc1tkZWZpbml0aW9ucy5sZW5ndGggLSAxXSl9XG5cbiAgICBpZiAodGhpcy5nZW5lcmF0ZWQpIHZhbGlkYXRlTmF0aXZlR3JhcGgobW9kdWxlKVxuICAgIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlUGFyc2VkTW9kdWxlKG1vZHVsZSwgXCJjXCIpXG5cbiAgICB0aGlzLnZhbGlkYXRlUHJpbnRUeXBlcyh2YWxpZGF0ZWQpXG4gICAgaWYgKHRoaXMuZ2VuZXJhdGVkKSB7XG4gICAgICBjb25zdCBjYW5vbmljYWwgPSBnZW5lcmF0ZUNQcm9ncmFtKHttb2R1bGU6IHZhbGlkYXRlZH0pLmFydGlmYWN0c1swXS5jb250ZW50XG5cbiAgICAgIGlmICh0eXBlb2YgY2Fub25pY2FsICE9IFwic3RyaW5nXCIpIHRocm93IG5ldyBFcnJvcihcIkMgYmFja2VuZCByZXR1cm5lZCBhIG5vbnRleHQgZW50cnkgYXJ0aWZhY3QuXCIpXG4gICAgICB0aGlzLmNvbXBhcmVUcmVlKHJvb3QsIHBhcnNlQ3N0KGNhbm9uaWNhbCkucm9vdCwgbmV3IENSZWFkZXIodGhpcy5maWxlbmFtZSwgY2Fub25pY2FsKSlcbiAgICB9XG4gICAgcmV0dXJuIHZhbGlkYXRlZFxuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBuYXRpdmUgcHJpbnQgaGVscGVyIHNlbGVjdGlvbiBhZnRlciBzZW1hbnRpYyBzY2FsYXIgcmVzb2x1dGlvbi5cbiAgICogQHBhcmFtIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gbW9kdWxlIC0gUmVzb2x2ZWQgbW9kdWxlLlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIHZhbGlkYXRlUHJpbnRUeXBlcyhtb2R1bGUpIHtcbiAgICBjb25zdCBwbGFubmVyID0gbmV3IE9yZGVyZWRFeHByZXNzaW9uUGxhbm5lcihtb2R1bGUpXG4gICAgLyoqXG4gICAgICogQ2hlY2tzIG9uZSBsZXhpY2FsIGJsb2NrIHdpdGggaXRzIHZpc2libGUgc2NhbGFyIGJpbmRpbmdzLlxuICAgICAqIEBwYXJhbSB7aW1wb3J0KFwiLi4vc2VtYW50aWMvdHlwZXMuanNcIikuQmxvY2t9IGJsb2NrIC0gU2VtYW50aWMgYmxvY2suXG4gICAgICogQHBhcmFtIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY1R5cGVOYW1lPn0gaW5oZXJpdGVkIC0gVmlzaWJsZSBiaW5kaW5ncy5cbiAgICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICAgKi9cbiAgICBjb25zdCB2aXNpdCA9IChibG9jaywgaW5oZXJpdGVkKSA9PiB7XG4gICAgICBjb25zdCBiaW5kaW5ncyA9IG5ldyBNYXAoaW5oZXJpdGVkKVxuXG4gICAgICBmb3IgKGNvbnN0IHN0YXRlbWVudCBvZiBibG9jay5zdGF0ZW1lbnRzKSB7XG4gICAgICAgIGlmIChzdGF0ZW1lbnQua2luZCA9PSBcIkxvY2FsRGVjbGFyYXRpb25cIikgYmluZGluZ3Muc2V0KHN0YXRlbWVudC5uYW1lLCBzdGF0ZW1lbnQudHlwZS5uYW1lKVxuICAgICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJQcmludFN0YXRlbWVudFwiKSB7XG4gICAgICAgICAgY29uc3QgZXhwZWN0ZWQgPSB0aGlzLnByaW50VHlwZXMuZ2V0KHN0YXRlbWVudClcblxuICAgICAgICAgIGlmICghZXhwZWN0ZWQpIHRocm93IG5ldyBFcnJvcihcIkMgcHJpbnQgc3RhdGVtZW50IGxvc3QgaXRzIHBhcnNlciBoZWxwZXIgaWRlbnRpdHkuXCIpXG4gICAgICAgICAgaWYgKHBsYW5uZXIudHlwZShzdGF0ZW1lbnQuZXhwcmVzc2lvbiwgYmluZGluZ3MpICE9IGV4cGVjdGVkLnR5cGUpIHRoaXMuZmFpbChleHBlY3RlZC5ub2RlLCBcInByaW50IGhlbHBlciBzY2FsYXIgbWlzbWF0Y2hcIilcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJJZlN0YXRlbWVudFwiKSB7XG4gICAgICAgICAgdmlzaXQoc3RhdGVtZW50LmNvbnNlcXVlbnQsIGJpbmRpbmdzKVxuICAgICAgICAgIGlmIChzdGF0ZW1lbnQuYWx0ZXJuYXRlKSB2aXNpdChzdGF0ZW1lbnQuYWx0ZXJuYXRlLCBiaW5kaW5ncylcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgZGVjbGFyYXRpb24gb2YgbW9kdWxlLmZ1bmN0aW9ucykgdmlzaXQoZGVjbGFyYXRpb24uYm9keSwgbmV3IE1hcChkZWNsYXJhdGlvbi5wYXJhbWV0ZXJzLm1hcCgocGFyYW1ldGVyKSA9PiBbcGFyYW1ldGVyLm5hbWUsIHBhcmFtZXRlci50eXBlLm5hbWVdKSkpXG4gICAgdmlzaXQobW9kdWxlLmVudHJ5UG9pbnQuYm9keSwgbmV3IE1hcCgpKVxuICB9XG5cbiAgLyoqXG4gICAqIFJlamVjdHMgcHJvZmlsZS1sb29raW5nIGNvbW1lbnRzIG91dHNpZGUgYSBjb21wbGV0ZSBjYW5vbmljYWwgZ2VuZXJhdGVkIHByb2dyYW0uXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIEN1cnJlbnQgbm9kZS5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWplY3RTY2FmZm9sZENvbW1lbnRzKG5vZGUpIHtcbiAgICBpZiAobm9kZS50eXBlID09IFwiY29tbWVudFwiICYmIC9zZW1hbnRpZm9sZDp8QHNlbWFudGlmb2xkL3UudGVzdCh0aGlzLnRleHQobm9kZSkpKSB0aGlzLmZhaWwobm9kZSwgXCJ1bnJlY29nbml6ZWQgc2NhZmZvbGQgY29tbWVudFwiKVxuICAgIGZvciAoY29uc3Qge25vZGU6IGNoaWxkfSBvZiBub2RlLmNoaWxkcmVuKSB0aGlzLnJlamVjdFNjYWZmb2xkQ29tbWVudHMoY2hpbGQpXG4gIH1cblxuICAvKipcbiAgICogUmV0YWlucyBldmVyeSBzY2FmZm9sZCBjb21tZW50IGFuZCBzdHJ1Y3R1cmFsIGVkZ2UsIGlnbm9yaW5nIG9ubHkgb3JkaW5hcnkgY29tbWVudHMuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIENTVCBwYXJlbnQuXG4gICAqIEByZXR1cm5zIHtDc3ROb2RlW119IENvbXBsZXRlIHNpZ25pZmljYW50IGNoaWxkIGxpc3QuXG4gICAqL1xuICBzaWduaWZpY2FudChub2RlKSB7XG4gICAgcmV0dXJuIG5vZGUuY2hpbGRyZW4ubWFwKCh7bm9kZTogY2hpbGR9KSA9PiBjaGlsZCkuZmlsdGVyKChjaGlsZCkgPT5cbiAgICAgIGNoaWxkLnR5cGUgIT0gXCJjb21tZW50XCIgfHwgL3NlbWFudGlmb2xkOnxAc2VtYW50aWZvbGQvdS50ZXN0KHRoaXMudGV4dChjaGlsZCkpKVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGV2ZXJ5IHRva2VuLCBmaWVsZCwgdHlwZSwgdXNlLCBvcmRlcmluZyBlZGdlIGFuZCBjb25zdW1lciBhZ2FpbnN0IHRoZSBjYW5vbmljYWwgcGxhbi5cbiAgICogVGhpcyBjaGVja3MgdGhlIG9yaWdpbmFsIENTVDsgaXQgbmV2ZXIgcmVjb3ZlcnMgbWVhbmluZyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgdGV4dC5cbiAgICogQHBhcmFtIHtDc3ROb2RlfSBhY3R1YWwgLSBPcmlnaW5hbCB0cmVlIG5vZGUuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gZXhwZWN0ZWQgLSBDYW5vbmljYWwgdHJlZSBub2RlIGZvciB0aGUgcmVjb25zdHJ1Y3RlZCBzZW1hbnRpY3MuXG4gICAqIEBwYXJhbSB7Q1JlYWRlcn0gY2Fub25pY2FsIC0gQ2Fub25pY2FsIHRva2VuIHJlYWRlci5cbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICBjb21wYXJlVHJlZShhY3R1YWwsIGV4cGVjdGVkLCBjYW5vbmljYWwpIHtcbiAgICBpZiAoYWN0dWFsLnR5cGUgIT0gZXhwZWN0ZWQudHlwZSB8fCBhY3R1YWwubmFtZWQgIT0gZXhwZWN0ZWQubmFtZWQgfHwgYWN0dWFsLmV4dHJhICE9IGV4cGVjdGVkLmV4dHJhKSB0aGlzLmZhaWwoYWN0dWFsLCBcImdlbmVyYXRlZCBzY2FmZm9sZCBub2RlIHNoYXBlXCIpXG4gICAgY29uc3QgbGVmdCA9IHRoaXMuc2lnbmlmaWNhbnQoYWN0dWFsKVxuICAgIGNvbnN0IHJpZ2h0ID0gY2Fub25pY2FsLnNpZ25pZmljYW50KGV4cGVjdGVkKVxuXG4gICAgaWYgKGxlZnQubGVuZ3RoICE9IHJpZ2h0Lmxlbmd0aCkgdGhpcy5mYWlsKGFjdHVhbCwgXCJnZW5lcmF0ZWQgc2NhZmZvbGQgY2hpbGQgY291bnRcIilcbiAgICBpZiAoIWxlZnQubGVuZ3RoICYmIHRoaXMudGV4dChhY3R1YWwpICE9IGNhbm9uaWNhbC50ZXh0KGV4cGVjdGVkKSkgdGhpcy5mYWlsKGFjdHVhbCwgXCJnZW5lcmF0ZWQgc2NhZmZvbGQgdG9rZW4sIHR5cGUsIG9yZGVyIG9yIGNvbnN1bWVyXCIpXG4gICAgbGVmdC5mb3JFYWNoKChjaGlsZCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChhY3R1YWwuY2hpbGRyZW4uZmluZCgoZWRnZSkgPT4gZWRnZS5ub2RlID09PSBjaGlsZCk/LmZpZWxkICE9IGV4cGVjdGVkLmNoaWxkcmVuLmZpbmQoKGVkZ2UpID0+IGVkZ2Uubm9kZSA9PT0gcmlnaHRbaW5kZXhdKT8uZmllbGQpIHRoaXMuZmFpbChjaGlsZCwgXCJnZW5lcmF0ZWQgc2NhZmZvbGQgZmllbGRcIilcbiAgICAgIHRoaXMuY29tcGFyZVRyZWUoY2hpbGQsIHJpZ2h0W2luZGV4XSwgY2Fub25pY2FsKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmVjb2duaXplcyB0aGUgc2hhcGUgb2YgYW4gaW5lcnQgZ2VuZXJhdGVkIHVudXNlZC1iaW5kaW5nIGNhc3Q7IGNhbm9uaWNhbCBjb21wYXJpc29uIGNoZWNrcyBpdHMgZXhhY3QgdGFyZ2V0IGFuZCBwbGFjZW1lbnQuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIENhbmRpZGF0ZSBzdGF0ZW1lbnQuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoaXMgaXMgYSBkaXNjYXJkLXNoYXBlZCBjYW5kaWRhdGUuXG4gICAqL1xuICBkaXNjYXJkKG5vZGUpIHtcbiAgICByZXR1cm4gbm9kZS50eXBlID09IFwiZXhwcmVzc2lvbl9zdGF0ZW1lbnRcIiAmJiB0aGlzLnBhcnRzKG5vZGUpWzBdPy50eXBlID09IFwiY2FzdF9leHByZXNzaW9uXCJcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWNvbnN0cnVjdHMgcGFpcmVkIHN0YXRlbWVudCByZWdpb25zIGJlZm9yZSBtYW5kYXRvcnkgd2hvbGUtQ1NUIGNhbm9uaWNhbCB2ZXJpZmljYXRpb24uXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZVtdfSBjaGlsZHJlbiAtIE9yZGVyZWQgYmxvY2sgY2hpbGRyZW4gd2l0aG91dCBicmFjZXMgb3IgbWFpbiBjbGVhbnVwLlxuICAgKiBAcmV0dXJucyB7U3RhdGVtZW50W119IENhbmRpZGF0ZSBzZW1hbnRpYyBzdGF0ZW1lbnRzLlxuICAgKi9cbiAgZ2VuZXJhdGVkU3RhdGVtZW50cyhjaGlsZHJlbikge1xuICAgIGNvbnN0IG5vZGVzID0gY2hpbGRyZW4uZmlsdGVyKChub2RlKSA9PiBub2RlLnR5cGUgIT0gXCJjb21tZW50XCIgfHwgL3NlbWFudGlmb2xkOnxAc2VtYW50aWZvbGQvdS50ZXN0KHRoaXMudGV4dChub2RlKSkpXG4gICAgLyoqIEB0eXBlIHtTdGF0ZW1lbnRbXX0gKi9cbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gW11cbiAgICBsZXQgY3Vyc29yID0gMFxuXG4gICAgd2hpbGUgKGN1cnNvciA8IG5vZGVzLmxlbmd0aCAmJiB0aGlzLmRpc2NhcmQobm9kZXNbY3Vyc29yXSkpIGN1cnNvcisrXG4gICAgd2hpbGUgKGN1cnNvciA8IG5vZGVzLmxlbmd0aCkge1xuICAgICAgY29uc3QgYmVnaW4gPSBub2Rlc1tjdXJzb3IrK11cbiAgICAgIGNvbnN0IG1hdGNoID0gYmVnaW4udHlwZSA9PSBcImNvbW1lbnRcIiAmJiAvXlxcL1xcKiBzZW1hbnRpZm9sZDpvcmRlcmVkLWV4cHJlc3Npb246Yzp2MSBiZWdpbiAoWzAtOV17Nn0pIChbMC05YS1mXXs2NH0pIFxcKlxcLyQvdS5leGVjKHRoaXMudGV4dChiZWdpbikpXG5cbiAgICAgIGlmICghbWF0Y2gpIHRoaXMuZmFpbChiZWdpbiwgXCJjb21wbGV0ZSBvcmRlcmVkIHN0YXRlbWVudCByZWdpb24gcmVxdWlyZWRcIilcbiAgICAgIGNvbnN0IG91dGVyID0gdGhpcy50ZW1wb3JhcnlFeHByZXNzaW9uc1xuICAgICAgY29uc3Qgb3V0ZXJOYW1lcyA9IHRoaXMudGVtcG9yYXJ5TmFtZXNcblxuICAgICAgdGhpcy50ZW1wb3JhcnlFeHByZXNzaW9ucyA9IG5ldyBNYXAoKVxuICAgICAgdGhpcy50ZW1wb3JhcnlOYW1lcyA9IG5ldyBTZXQoKVxuICAgICAgd2hpbGUgKGN1cnNvciA8IG5vZGVzLmxlbmd0aCAmJiB0aGlzLnRlbXBvcmFyeURlY2xhcmF0aW9uKG5vZGVzW2N1cnNvcl0pKSBjdXJzb3IgPSB0aGlzLnJlYWRUZW1wb3Jhcnkobm9kZXMsIGN1cnNvcilcbiAgICAgIGNvbnN0IGNvbnN1bWVyID0gbm9kZXNbY3Vyc29yKytdXG5cbiAgICAgIGlmICghY29uc3VtZXIpIHRoaXMuZmFpbChiZWdpbiwgXCJtaXNzaW5nIG9yZGVyZWQgY29uc3VtZXJcIilcbiAgICAgIGNvbnN0IHN0YXRlbWVudCA9IHRoaXMuc3RhdGVtZW50KGNvbnN1bWVyKVxuXG4gICAgICBpZiAodGhpcy50ZW1wb3JhcnlFeHByZXNzaW9ucy5zaXplICE9IDApIHRoaXMuZmFpbChjb25zdW1lciwgXCJ1bmNvbnN1bWVkIG9yZGVyZWQgdGVtcG9yYXJ5XCIpXG4gICAgICBpZiAoc3RhdGVtZW50LmtpbmQgPT0gXCJMb2NhbERlY2xhcmF0aW9uXCIgJiYgbm9kZXNbY3Vyc29yXSAmJiB0aGlzLmRpc2NhcmQobm9kZXNbY3Vyc29yXSkpIGN1cnNvcisrXG4gICAgICBjb25zdCBlbmQgPSBub2Rlc1tjdXJzb3IrK11cblxuICAgICAgaWYgKCFlbmQgfHwgZW5kLnR5cGUgIT0gXCJjb21tZW50XCIgfHwgdGhpcy50ZXh0KGVuZCkgIT0gYC8qIHNlbWFudGlmb2xkOm9yZGVyZWQtZXhwcmVzc2lvbjpjOnYxIGVuZCAke21hdGNoWzFdfSAke21hdGNoWzJdfSAqL2ApIHRoaXMuZmFpbChlbmQgPz8gYmVnaW4sIFwib3JkZXJlZCBtYXJrZXIgcGFpclwiKVxuICAgICAgdGhpcy50ZW1wb3JhcnlFeHByZXNzaW9ucyA9IG91dGVyXG4gICAgICB0aGlzLnRlbXBvcmFyeU5hbWVzID0gb3V0ZXJOYW1lc1xuICAgICAgc3RhdGVtZW50cy5wdXNoKHN0YXRlbWVudClcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlbWVudHNcbiAgfVxuXG4gIC8qKlxuICAgKiBJZGVudGlmaWVzIG9ubHkgYSBkZWNsYXJhdGlvbiBhdCB0aGUgY3VycmVudCByZWdpb24gbGV2ZWwsIHdpdGhvdXQgZGVzY2VuZGFudCBzZWFyY2hpbmcuXG4gICAqIEBwYXJhbSB7Q3N0Tm9kZX0gbm9kZSAtIENhbmRpZGF0ZSBub2RlLlxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGlyZWN0IGluaXRpYWxpemVkIG5hbWUgdXNlcyB0aGUgcmVzZXJ2ZWQgcHJlZml4LlxuICAgKi9cbiAgdGVtcG9yYXJ5RGVjbGFyYXRpb24obm9kZSkge1xuICAgIGlmIChub2RlLnR5cGUgIT0gXCJkZWNsYXJhdGlvblwiKSByZXR1cm4gZmFsc2VcbiAgICBjb25zdCBkZWNsYXJhdG9yID0gbm9kZS5jaGlsZHJlbi5maW5kKCh7ZmllbGR9KSA9PiBmaWVsZCA9PSBcImRlY2xhcmF0b3JcIik/Lm5vZGVcbiAgICBjb25zdCBuYW1lID0gZGVjbGFyYXRvcj8uY2hpbGRyZW4uZmluZCgoe2ZpZWxkfSkgPT4gZmllbGQgPT0gXCJkZWNsYXJhdG9yXCIpPy5ub2RlXG5cbiAgICByZXR1cm4gbmFtZT8udHlwZSA9PSBcImlkZW50aWZpZXJcIiAmJiB0aGlzLnRleHQobmFtZSkuc3RhcnRzV2l0aChcInNlbWFudGlmb2xkX29yZGVyZWRfXCIpXG4gIH1cblxuICAvKipcbiAgICogRXhwYW5kcyBvbmUgY2FuZGlkYXRlIHRlbXBvcmFyeSwgaW5jbHVkaW5nIGl0cyBjb25kaXRpb25hbCBSSFMsIHJldGFpbmluZyBvcmlnaW5hbCBvcGVyYXRpb24gdG9rZW5zLlxuICAgKiBAcGFyYW0ge0NzdE5vZGVbXX0gbm9kZXMgLSBDdXJyZW50IGxleGljYWwgc2VxdWVuY2UuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBjdXJzb3IgLSBEZWNsYXJhdGlvbiBwb3NpdGlvbi5cbiAgICogQHJldHVybnMge251bWJlcn0gTmV4dCB1bmNvbnN1bWVkIHBvc2l0aW9uLlxuICAgKi9cbiAgcmVhZFRlbXBvcmFyeShub2RlcywgY3Vyc29yKSB7XG4gICAgY29uc3Qgbm9kZSA9IG5vZGVzW2N1cnNvcisrXVxuICAgIGNvbnN0IGRlY2xhcmF0b3IgPSB0aGlzLmZpZWxkKG5vZGUsIFwiZGVjbGFyYXRvclwiKVxuICAgIGNvbnN0IG5hbWVOb2RlID0gdGhpcy5maWVsZChkZWNsYXJhdG9yLCBcImRlY2xhcmF0b3JcIilcbiAgICBjb25zdCBuYW1lID0gdGhpcy50ZXh0KG5hbWVOb2RlKVxuICAgIGNvbnN0IHR5cGUgPSB0aGlzLmZpZWxkKG5vZGUsIFwidHlwZVwiKVxuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maWVsZChkZWNsYXJhdG9yLCBcInZhbHVlXCIpXG5cbiAgICB0aGlzLnNoYXBlKG5vZGUsIFt0eXBlLCBkZWNsYXJhdG9yLCBcIjtcIl0pXG4gICAgdGhpcy5zaGFwZShkZWNsYXJhdG9yLCBbbmFtZU5vZGUsIFwiPVwiLCB2YWx1ZV0pXG4gICAgdGhpcy50eXBlKHR5cGUpXG4gICAgaWYgKCEvXnNlbWFudGlmb2xkX29yZGVyZWRfWzAtOV17Nn0kL3UudGVzdChuYW1lKSB8fCB0aGlzLnRlbXBvcmFyeU5hbWVzPy5oYXMobmFtZSkpIHRoaXMuZmFpbChuYW1lTm9kZSwgXCJvcmRlcmVkIHRlbXBvcmFyeSBkZWNsYXJhdGlvblwiKVxuICAgIHRoaXMudGVtcG9yYXJ5TmFtZXM/LmFkZChuYW1lKVxuICAgIGxldCBleHByZXNzaW9uID0gdGhpcy5leHByZXNzaW9uKHZhbHVlKVxuICAgIGNvbnN0IGJyYW5jaCA9IG5vZGVzW2N1cnNvcl1cblxuICAgIGlmIChicmFuY2g/LnR5cGUgPT0gXCJpZl9zdGF0ZW1lbnRcIiAmJiBbXCJpZGVudGlmaWVyXCIsIFwidHJ1ZVwiLCBcImZhbHNlXCJdLmluY2x1ZGVzKHZhbHVlLnR5cGUpKSB7XG4gICAgICBjb25zdCBjb25kaXRpb24gPSB0aGlzLmZpZWxkKGJyYW5jaCwgXCJjb25kaXRpb25cIilcbiAgICAgIGNvbnN0IGJvZHkgPSB0aGlzLmZpZWxkKGJyYW5jaCwgXCJjb25zZXF1ZW5jZVwiKVxuXG4gICAgICB0aGlzLnNoYXBlKGJyYW5jaCwgW1wiaWZcIiwgY29uZGl0aW9uLCBib2R5XSlcbiAgICAgIHRoaXMuc2hhcGUoY29uZGl0aW9uLCBbXCIoXCIsIHRoaXMucGFydHMoY29uZGl0aW9uKVsxXSwgXCIpXCJdKVxuICAgICAgY29uc3QgdGVzdCA9IHRoaXMucGFydHMoY29uZGl0aW9uKVsxXVxuICAgICAgY29uc3QgaXNPciA9IHRlc3QudHlwZSA9PSBcInVuYXJ5X2V4cHJlc3Npb25cIlxuICAgICAgY29uc3QgdGFyZ2V0ID0gaXNPciA/IHRoaXMuZmllbGQodGVzdCwgXCJhcmd1bWVudFwiKSA6IHRlc3RcblxuICAgICAgaWYgKHRhcmdldC50eXBlICE9IFwiaWRlbnRpZmllclwiIHx8IHRoaXMudGV4dCh0YXJnZXQpICE9IG5hbWUpIHRoaXMuZmFpbCh0YXJnZXQsIFwic2hvcnQtY2lyY3VpdCB0ZW1wb3JhcnkgdGVzdFwiKVxuICAgICAgaWYgKGlzT3IpIHRoaXMuc2hhcGUodGVzdCwgW1wiIVwiLCB0YXJnZXRdKVxuICAgICAgaWYgKGJvZHkudHlwZSAhPSBcImNvbXBvdW5kX3N0YXRlbWVudFwiKSB0aGlzLmZhaWwoYm9keSwgXCJzaG9ydC1jaXJjdWl0IGJsb2NrXCIpXG4gICAgICBjb25zdCBpbnNpZGUgPSB0aGlzLnNpZ25pZmljYW50KGJvZHkpLnNsaWNlKDEsIC0xKVxuICAgICAgbGV0IG9mZnNldCA9IDBcblxuICAgICAgd2hpbGUgKG9mZnNldCA8IGluc2lkZS5sZW5ndGggJiYgdGhpcy50ZW1wb3JhcnlEZWNsYXJhdGlvbihpbnNpZGVbb2Zmc2V0XSkpIG9mZnNldCA9IHRoaXMucmVhZFRlbXBvcmFyeShpbnNpZGUsIG9mZnNldClcbiAgICAgIGlmIChvZmZzZXQgIT0gaW5zaWRlLmxlbmd0aCAtIDEpIHRoaXMuZmFpbChib2R5LCBcInNob3J0LWNpcmN1aXQgZmluYWwgd3JpdGVcIilcbiAgICAgIGNvbnN0IGFzc2lnbm1lbnQgPSBpbnNpZGVbb2Zmc2V0XVxuXG4gICAgICB0aGlzLnNoYXBlKGFzc2lnbm1lbnQsIFtcImFzc2lnbm1lbnRfZXhwcmVzc2lvblwiLCBcIjtcIl0pXG4gICAgICBjb25zdCBhc3NpZ25lZCA9IHRoaXMucGFydHMoYXNzaWdubWVudClbMF1cbiAgICAgIGNvbnN0IGxlZnQgPSB0aGlzLmZpZWxkKGFzc2lnbmVkLCBcImxlZnRcIilcbiAgICAgIGNvbnN0IHJpZ2h0ID0gdGhpcy5maWVsZChhc3NpZ25lZCwgXCJyaWdodFwiKVxuXG4gICAgICB0aGlzLnNoYXBlKGFzc2lnbmVkLCBbbGVmdCwgXCI9XCIsIHJpZ2h0XSlcbiAgICAgIGlmIChsZWZ0LnR5cGUgIT0gXCJpZGVudGlmaWVyXCIgfHwgdGhpcy50ZXh0KGxlZnQpICE9IG5hbWUpIHRoaXMuZmFpbChsZWZ0LCBcInNob3J0LWNpcmN1aXQgcmVzdWx0IHdyaXRlXCIpXG4gICAgICB0aGlzLnNoYXBlKHJpZ2h0LCBbXCIoXCIsIFwiYmluYXJ5X2V4cHJlc3Npb25cIiwgXCIpXCJdKVxuICAgICAgY29uc3QgYmluYXJ5ID0gdGhpcy5wYXJ0cyhyaWdodClbMV1cbiAgICAgIGNvbnN0IHJlcGVhdGVkID0gdGhpcy5maWVsZChiaW5hcnksIFwibGVmdFwiKVxuICAgICAgY29uc3Qgb3BlcmFuZCA9IHRoaXMuZmllbGQoYmluYXJ5LCBcInJpZ2h0XCIpXG4gICAgICBjb25zdCBvcGVyYXRvciA9IHRoaXMuZmllbGQoYmluYXJ5LCBcIm9wZXJhdG9yXCIpXG5cbiAgICAgIHRoaXMuc2hhcGUoYmluYXJ5LCBbcmVwZWF0ZWQsIGlzT3IgPyBcInx8XCIgOiBcIiYmXCIsIG9wZXJhbmRdKVxuICAgICAgaWYgKHJlcGVhdGVkLnR5cGUgIT0gXCJpZGVudGlmaWVyXCIgfHwgdGhpcy50ZXh0KHJlcGVhdGVkKSAhPSBuYW1lKSB0aGlzLmZhaWwocmVwZWF0ZWQsIFwic2hvcnQtY2lyY3VpdCBjb25zdW1lZCB2YWx1ZVwiKVxuICAgICAgZXhwcmVzc2lvbiA9IHRoaXMuYmluYXJ5KG5vZGUsIGlzT3IgPyBcIk9yXCIgOiBcIkFuZFwiLCBleHByZXNzaW9uLCB0aGlzLmV4cHJlc3Npb24ob3BlcmFuZCksIG9wZXJhdG9yKVxuICAgICAgY3Vyc29yKytcbiAgICB9XG4gICAgdGhpcy50ZW1wb3JhcnlFeHByZXNzaW9ucz8uc2V0KG5hbWUsIGV4cHJlc3Npb24pXG4gICAgcmV0dXJuIGN1cnNvclxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIG9ubHkgdGhlIGZyb3plbiBsZWdhY3kgQ1NULCB3aXRoIG5vIHNvdXJjZS10ZXh0IHJlY292ZXJ5IHBhdGguXG4gKiBAcGFyYW0ge3tmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2U6IHN0cmluZ319IGlucHV0IC0gRXhhY3QgY2FsbGVyIHNvdXJjZS5cbiAqIEByZXR1cm5zIHtpbXBvcnQoXCIuLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5TZW1hbnRpY01vZHVsZX0gUGFyc2VkIEMgc2VtYW50aWNzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VDKHtmaWxlbmFtZSwgc291cmNlfSkge1xuICBpZiAoIWhhc09ubHlVbmljb2RlU2NhbGFycyhzb3VyY2UpKSB7XG4gICAgY29uc3QgY29vcmRpbmF0ZXMgPSBjcmVhdGVDb29yZGluYXRlSW5kZXgoc291cmNlKVxuICAgIGNvbnN0IG9mZnNldCA9IHNvdXJjZS5zZWFyY2goL1tcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/PCFbXFx1RDgwMC1cXHVEQkZGXSlbXFx1REMwMC1cXHVERkZGXS91KVxuXG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJQQVJTRV9FUlJPUlwiLCBsYW5ndWFnZTogXCJjXCIsIG1lc3NhZ2U6IFwiQyBzb3VyY2UgY29udGFpbnMgYSBsb25lIFVURi0xNiBzdXJyb2dhdGUuXCIsXG4gICAgICBsb2NhdGlvbjoge2ZpbGVuYW1lLCBzdGFydDogaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIG9mZnNldCksIGVuZDogaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIG9mZnNldCArIDEpfX0pXG4gIH1cbiAgaWYgKHNvdXJjZS5sZW5ndGggPiBtYXhpbXVtQ1NvdXJjZUxlbmd0aCkge1xuICAgIGNvbnN0IGNvb3JkaW5hdGVzID0gY3JlYXRlQ29vcmRpbmF0ZUluZGV4KHNvdXJjZSlcblxuICAgIHJldHVybiB1bnN1cHBvcnRlZFN5bnRheChcImNcIiwgXCJzb3VyY2UgZXhjZWVkcyB0aGUgZnJvemVuIEMgcGFyc2VyJ3MgMzI3NjcgVVRGLTE2IGlucHV0IGxpbWl0XCIsIHtcbiAgICAgIGZpbGVuYW1lLCBzdGFydDogaW5kZXhlZFBvaW50QXQoY29vcmRpbmF0ZXMsIDApLCBlbmQ6IGluZGV4ZWRQb2ludEF0KGNvb3JkaW5hdGVzLCBzb3VyY2UubGVuZ3RoKVxuICAgIH0pXG4gIH1cbiAgbGV0IHNuYXBzaG90XG5cbiAgdHJ5IHtcbiAgICBzbmFwc2hvdCA9IHBhcnNlQ3N0KHNvdXJjZSlcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4gcGFyc2VGYWlsdXJlKFwiY1wiLCBlcnJvcilcbiAgfVxuICBjb25zdCByZWFkZXIgPSBuZXcgQ1JlYWRlcihmaWxlbmFtZSwgc291cmNlKVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlYWRlci5tb2R1bGUoc25hcHNob3Qucm9vdClcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBpZiAocmVhZGVyLmdlbmVyYXRlZCAmJiBlcnJvciBpbnN0YW5jZW9mIFNlbWFudGlmb2xkRGlhZ25vc3RpYyAmJiBlcnJvci5sYW5ndWFnZSA9PSBcImNcIiAmJlxuICAgICAgZXJyb3IuY29kZSAhPSBcIlBBUlNFX0VSUk9SXCIgJiYgZXJyb3IuY29kZSAhPSBcIlVOU1VQUE9SVEVEX1NZTlRBWFwiKSB7XG4gICAgICByZXR1cm4gdW5zdXBwb3J0ZWRTeW50YXgoXCJjXCIsIGBpbnZhbGlkIGdlbmVyYXRlZCBvcmRlcmVkIHNjYWZmb2xkOiAke2Vycm9yLmNvZGV9YCwgZXJyb3IubG9jYXRpb24gPz8gcmVhZGVyLmxvY2F0aW9uKHNuYXBzaG90LnJvb3QpKVxuICAgIH1cbiAgICB0aHJvdyBlcnJvclxuICB9XG59XG4iXX0=
|