[
  {
    "path": ".aspect/bazelrc/README.md",
    "content": "## Aspect bazelrc Presets\n\nSee:\n- [Aspect Presets](https://github.com/bazel-contrib/bazel-lib/tree/main/.aspect/bazelrc)"
  },
  {
    "path": ".aspect/bazelrc/automatic_updates.md",
    "content": "## Automatic updates\n\nA convenient way to automatically keep your vendored copy up-to-date is to use the `write_aspect_bazelrc_presets` rule in `.aspect/bazelrc/BUILD.bazel`:\n\n```python title=\".aspect/bazelrc/BUILD.bazel\"\n\"Aspect bazelrc presets; see https://docs.aspect.build/guides/bazelrc\"\n\nload(\"@aspect_bazel_lib//lib:bazelrc_presets.bzl\", \"write_aspect_bazelrc_presets\")\n\nwrite_aspect_bazelrc_presets(name = \"update_aspect_bazelrc_presets\")\n```\n\nWhen `@aspect_bazel_lib` is upgraded in your `WORKSPACE.bazel` or your `MODULE.bazel` file, a `diff_test`\nstamped out by `write_aspect_bazelrc_presets` will fail if your vendored copy is out-of-date and print the Bazel command\nto run to update it. For example, `bazel run //.aspect/bazelrc:update_aspect_bazelrc_presets`.\n\nSee the [bazelrc](https://github.com/aspect-build/bazel-examples/blob/main/bazelrc/.aspect/bazelrc/BUILD.bazel) example\nin our [bazel-examples](https://github.com/aspect-build/bazel-examples) repository for a working example.\n"
  },
  {
    "path": ".aspect/bazelrc/bazel6.bazelrc",
    "content": "# Speed up all builds by not checking if external repository files have been modified.\n# Docs: https://github.com/bazelbuild/bazel/blob/1af61b21df99edc2fc66939cdf14449c2661f873/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java#L244\nbuild --noexperimental_check_external_repository_files\nfetch --noexperimental_check_external_repository_files\nquery --noexperimental_check_external_repository_files\n\n# Directories used by sandboxed non-worker execution may be reused to avoid unnecessary setup costs.\n# Save time on Sandbox creation and deletion when many of the same kind of action run during the\n# build.\n# Docs: https://bazel.build/reference/command-line-reference#flag--reuse_sandbox_directories\nbuild --reuse_sandbox_directories\n\n# Avoid this flag being enabled by remote_download_minimal or remote_download_toplevel\n# See https://meroton.com/blog/bazel-6-errors-build-without-the-bytes/\nbuild --noexperimental_action_cache_store_output_metadata\n\n# Speed up all builds by not checking if output files have been modified. Lets you make changes to\n# the output tree without triggering a build for local debugging. For example, you can modify\n# [rules_js](https://github.com/aspect-build/rules_js) 3rd party npm packages in the output tree\n# when local debugging.\n# Docs: https://github.com/bazelbuild/bazel/blob/1af61b21df99edc2fc66939cdf14449c2661f873/src/main/java/com/google/devtools/build/lib/pkgcache/PackageOptions.java#L185\n# NB: This flag is in bazel6.bazelrc as when used in Bazel 7 is has been observed to break\n# \"build without the bytes\" --remote_download_outputs=toplevel. See https://github.com/bazel-contrib/bazel-lib/pull/711\n# for more info.\nbuild --noexperimental_check_output_files\nfetch --noexperimental_check_output_files\nquery --noexperimental_check_output_files\n\n# Don't apply `--noremote_upload_local_results` and `--noremote_accept_cached` to the disk cache.\n# If you have both `--noremote_upload_local_results` and `--disk_cache`, then this fixes a bug where\n# Bazel doesn't write to the local disk cache as it treats as a remote cache.\n# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_remote_results_ignore_disk\n# NB: This flag is in bazel6.bazelrc because it became a no-op in Bazel 7 and has been removed\n# in Bazel 8.\nbuild --incompatible_remote_results_ignore_disk\n\n# Propagate tags from a target declaration to the actions' execution requirements.\n# Ensures that tags applied in your BUILD file, like `tags=[\"no-remote\"]`\n# get propagated to actions created by the rule.\n# Without this option, you rely on rules authors to manually check the tags you passed\n# and apply relevant ones to the actions they create.\n# See https://github.com/bazelbuild/bazel/issues/8830 for details.\n# Docs: https://bazel.build/reference/command-line-reference#flag--experimental_allow_tags_propagation\nbuild --experimental_allow_tags_propagation\nfetch --experimental_allow_tags_propagation\nquery --experimental_allow_tags_propagation\n"
  },
  {
    "path": ".aspect/bazelrc/bazel7.bazelrc",
    "content": "# Speed up all builds by not checking if external repository files have been modified.\n# Docs: https://github.com/bazelbuild/bazel/blob/1af61b21df99edc2fc66939cdf14449c2661f873/src/main/java/com/google/devtools/build/lib/bazel/repository/RepositoryOptions.java#L244\ncommon --noexperimental_check_external_repository_files\n\n# Don't report when the root module's lower bound for a dependency happens to be less than the resolved version.\n# This is expected and should NOT prompt an engineer to update our lower bound to match.\n# WARNING: For repository 'aspect_bazel_lib', the root module requires module version aspect_bazel_lib@1.30.2,\n# but got aspect_bazel_lib@1.31.2 in the resolved dependency graph.\ncommon --check_direct_dependencies=off\n\n# Directories used by sandboxed non-worker execution may be reused to avoid unnecessary setup costs.\n# Save time on Sandbox creation and deletion when many of the same kind of action run during the\n# build.\n# Docs: https://bazel.build/reference/command-line-reference#flag--reuse_sandbox_directories\nbuild --reuse_sandbox_directories\n"
  },
  {
    "path": ".aspect/bazelrc/bazel8.bazelrc",
    "content": "# No Bazel 8 specific flag presets yet.\n"
  },
  {
    "path": ".aspect/bazelrc/ci.bazelrc",
    "content": "# Set this flag to enable re-tries of failed tests on CI.\n# When any test target fails, try one or more times. This applies regardless of whether the \"flaky\"\n# tag appears on the target definition.\n# This is a tradeoff: legitimately failing tests will take longer to report,\n# but we can paper over flaky tests that pass most of the time.\n# The alternative is to mark every flaky test with the `flaky = True` attribute, but this requires\n# the buildcop to make frequent code edits.\n# Not recommended for local builds so that the flakiness is observed during development and thus\n# is more likely to get fixed.\n# Note that when passing after the first attempt, Bazel will give a special \"FLAKY\" status.\n# Docs: https://bazel.build/docs/user-manual#flaky-test-attempts\ntest --flaky_test_attempts=2\n\n# Announce all announces command options read from the bazelrc file(s) when starting up at the\n# beginning of each Bazel invocation. This is very useful on CI to be able to inspect what Bazel rc\n# settings are being applied on each run.\n# Docs: https://bazel.build/docs/user-manual#announce-rc\nbuild --announce_rc\n\n# Add a timestamp to each message generated by Bazel specifying the time at which the message was\n# displayed.\n# Docs: https://bazel.build/docs/user-manual#show-timestamps\nbuild --show_timestamps\n\n# Only show progress every 60 seconds on CI.\n# We want to find a compromise between printing often enough to show that the build isn't stuck,\n# but not so often that we produce a long log file that requires a lot of scrolling.\n# https://bazel.build/reference/command-line-reference#flag--show_progress_rate_limit\nbuild --show_progress_rate_limit=60\n\n# Use cursor controls in screen output.\n# Docs: https://bazel.build/docs/user-manual#curses\nbuild --curses=yes\n\n# Use colors to highlight output on the screen. Set to `no` if your CI does not display colors.\n# Docs: https://bazel.build/docs/user-manual#color\nbuild --color=yes\n\n# The terminal width in columns. Configure this to override the default value based on what your CI system renders.\n# Docs: https://github.com/bazelbuild/bazel/blob/1af61b21df99edc2fc66939cdf14449c2661f873/src/main/java/com/google/devtools/build/lib/runtime/UiOptions.java#L151\nbuild --terminal_columns=143\n\n######################################\n# Generic remote cache configuration #\n######################################\n\n# Only download remote outputs of top level targets to the local machine.\n# Docs: https://bazel.build/reference/command-line-reference#flag--remote_download_toplevel\nbuild --remote_download_toplevel\n\n# The maximum amount of time to wait for remote execution and cache calls.\n# https://bazel.build/reference/command-line-reference#flag--remote_timeout\nbuild --remote_timeout=3600\n\n# Upload locally executed action results to the remote cache.\n# Docs: https://bazel.build/reference/command-line-reference#flag--remote_upload_local_results\nbuild --remote_upload_local_results\n\n# Fall back to standalone local execution strategy if remote execution fails. If the grpc remote\n# cache connection fails, it will fail the build, add this so it falls back to the local cache.\n# Docs: https://bazel.build/reference/command-line-reference#flag--remote_local_fallback\nbuild --remote_local_fallback\n\n# Fixes builds hanging on CI that get the TCP connection closed without sending RST packets.\n# Docs: https://bazel.build/reference/command-line-reference#flag--grpc_keepalive_time\nbuild --grpc_keepalive_time=30s\n"
  },
  {
    "path": ".aspect/bazelrc/convenience.bazelrc",
    "content": "# Attempt to build & test every target whose prerequisites were successfully built.\n# Docs: https://bazel.build/docs/user-manual#keep-going\nbuild --keep_going\n\n# Output test errors to stderr so users don't have to `cat` or open test failure log files when test\n# fail. This makes the log noisier in exchange for reducing the time-to-feedback on test failures for\n# users.\n# Docs: https://bazel.build/docs/user-manual#test-output\ntest --test_output=errors\n\n# Show the output files created by builds that requested more than one target. This helps users\n# locate the build outputs in more cases\n# Docs: https://bazel.build/docs/user-manual#show-result\nbuild --show_result=20\n\n# Bazel picks up host-OS-specific config lines from bazelrc files. For example, if the host OS is\n# Linux and you run bazel build, Bazel picks up lines starting with build:linux. Supported OS\n# identifiers are `linux`, `macos`, `windows`, `freebsd`, and `openbsd`. Enabling this flag is\n# equivalent to using `--config=linux` on Linux, `--config=windows` on Windows, etc.\n# Docs: https://bazel.build/reference/command-line-reference#flag--enable_platform_specific_config\ncommon --enable_platform_specific_config\n\n# Output a heap dump if an OOM is thrown during a Bazel invocation\n# (including OOMs due to `--experimental_oom_more_eagerly_threshold`).\n# The dump will be written to `<output_base>/<invocation_id>.heapdump.hprof`.\n# You may need to configure CI to capture this artifact and upload for later use.\n# Docs: https://bazel.build/reference/command-line-reference#flag--heap_dump_on_oom\ncommon --heap_dump_on_oom\n"
  },
  {
    "path": ".aspect/bazelrc/correctness.bazelrc",
    "content": "# Do not upload locally executed action results to the remote cache.\n# This should be the default for local builds so local builds cannot poison the remote cache.\n# It should be flipped to `--remote_upload_local_results` on CI\n# by using `--bazelrc=.aspect/bazelrc/ci.bazelrc`.\n# Docs: https://bazel.build/reference/command-line-reference#flag--remote_upload_local_results\nbuild --noremote_upload_local_results\n\n# Don't allow network access for build actions in the sandbox.\n# Ensures that you don't accidentally make non-hermetic actions/tests which depend on remote\n# services.\n# Developers should tag targets with `tags=[\"requires-network\"]` to opt-out of the enforcement.\n# Docs: https://bazel.build/reference/command-line-reference#flag--sandbox_default_allow_network\nbuild --sandbox_default_allow_network=false\n\n# Warn if a test's timeout is significantly longer than the test's actual execution time.\n# Bazel's default for test_timeout is medium (5 min), but most tests should instead be short (1 min).\n# While a test's timeout should be set such that it is not flaky, a test that has a highly\n# over-generous timeout can hide real problems that crop up unexpectedly.\n# For instance, a test that normally executes in a minute or two should not have a timeout of\n# ETERNAL or LONG as these are much, much too generous.\n# Docs: https://bazel.build/docs/user-manual#test-verbose-timeout-warnings\ntest --test_verbose_timeout_warnings\n\n# Allow the Bazel server to check directory sources for changes. Ensures that the Bazel server\n# notices when a directory changes, if you have a directory listed in the srcs of some target.\n# Recommended when using\n# [copy_directory](https://github.com/bazel-contrib/bazel-lib/blob/main/docs/copy_directory.md) and\n# [rules_js](https://github.com/aspect-build/rules_js) since npm package are source directories\n# inputs to copy_directory actions.\n# Docs: https://bazel.build/reference/command-line-reference#flag--host_jvm_args\nstartup --host_jvm_args=-DBAZEL_TRACK_SOURCE_DIRECTORIES=1\n\n# Allow exclusive tests to run in the sandbox. Fixes a bug where Bazel doesn't enable sandboxing for\n# tests with `tags=[\"exclusive\"]`.\n# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_exclusive_test_sandboxed\ntest --incompatible_exclusive_test_sandboxed\n\n# Use a static value for `PATH` and does not inherit `LD_LIBRARY_PATH`. Doesn't let environment\n# variables like `PATH` sneak into the build, which can cause massive cache misses when they change.\n# Use `--action_env=ENV_VARIABLE` if you want to inherit specific environment variables from the\n# client, but note that doing so can prevent cross-user caching if a shared cache is used.\n# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_strict_action_env\nbuild --incompatible_strict_action_env\n\n# Do not automatically create `__init__.py` files in the runfiles of Python targets. Fixes the wrong\n# default that comes from Google's internal monorepo by using `__init__.py` to delimit a Python\n# package. Precisely, when a `py_binary` or `py_test` target has `legacy_create_init` set to `auto (the\n# default), it is treated as false if and only if this flag is set. See\n# https://github.com/bazelbuild/bazel/issues/10076.\n# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_default_to_explicit_init_py\nbuild --incompatible_default_to_explicit_init_py\n\n# Set default value of `allow_empty` to `False` in `glob()`. This prevents a common mistake when\n# attempting to use `glob()` to match files in a subdirectory that is opaque to the current package\n# because it contains a BUILD file. See https://github.com/bazelbuild/bazel/issues/8195.\n# Docs: https://bazel.build/reference/command-line-reference#flag--incompatible_disallow_empty_glob\ncommon --incompatible_disallow_empty_glob\n\n# Always download coverage files for tests from the remote cache. By default, coverage files are not\n# downloaded on test result cache hits when --remote_download_minimal is enabled, making it impossible\n# to generate a full coverage report.\n# Docs: https://bazel.build/reference/command-line-reference#flag--experimental_fetch_all_coverage_outputs\n# detching remote cache results\ntest --experimental_fetch_all_coverage_outputs\n"
  },
  {
    "path": ".aspect/bazelrc/debug.bazelrc",
    "content": "############################################################\n# Use `bazel test --config=debug` to enable these settings #\n############################################################\n\n# Stream stdout/stderr output from each test in real-time.\n# Docs: https://bazel.build/docs/user-manual#test-output\ntest:debug --test_output=streamed\n\n# Run one test at a time.\n# Docs: https://bazel.build/reference/command-line-reference#flag--test_strategy\ntest:debug --test_strategy=exclusive\n\n# Prevent long running tests from timing out.\n# Docs: https://bazel.build/docs/user-manual#test-timeout\ntest:debug --test_timeout=9999\n\n# Always run tests even if they have cached results.\n# Docs: https://bazel.build/docs/user-manual#cache-test-results\ntest:debug --nocache_test_results\n"
  },
  {
    "path": ".aspect/bazelrc/intro.md",
    "content": "# Aspect bazelrc presets\n\nThe `.bazelrc` files found here are the source-of-truth for our recommended Bazel presets.\n\nThey are mirrored on our docsite at https://docs.aspect.build/guides/bazelrc.\n"
  },
  {
    "path": ".aspect/bazelrc/java.bazelrc",
    "content": "# Aspect recommended Bazel flags when using rules_java and rules_jvm_external\n\n# Pin java versions to desired language level\n# See https://bazel.build/docs/bazel-and-java#java-versions\n# and https://en.wikipedia.org/wiki/Java_version_history\n\n# What version of Java are the source files in this repo?\n# See https://bazel.build/docs/user-manual#java-language-version\ncommon --java_language_version=17\n\n# The Java language version used to build tools that are executed during a build\n# See https://bazel.build/docs/user-manual#tool-java-language-version\ncommon --tool_java_language_version=17\n\n# The version of JVM to use to execute the code and run the tests.\n# NB: The default value is local_jdk which is non-hermetic.\n# See https://bazel.build/docs/user-manual#java-runtime-version\ncommon --java_runtime_version=remotejdk_17\n\n# The version of JVM used to execute tools that are needed during a build.\n# See https://bazel.build/docs/user-manual#tool-java-runtime-version\ncommon --tool_java_runtime_version=remotejdk_17\n\n# Repository rules, such as rules_jvm_external: put Bazel's JDK on the path.\n# Avoids non-hermeticity from dependency on a JAVA_HOME pointing at a system JDK\n# see https://github.com/bazelbuild/rules_jvm_external/issues/445\ncommon --repo_env=JAVA_HOME=../bazel_tools/jdk\n"
  },
  {
    "path": ".aspect/bazelrc/javascript.bazelrc",
    "content": "# Aspect recommended Bazel flags when using Aspect's JavaScript rules: https://github.com/aspect-build/rules_js\n# Docs for Node.js flags: https://nodejs.org/en/docs/guides/debugging-getting-started/#command-line-options\n\n# Support for debugging Node.js tests. Use bazel run with `--config=debug` to turn on the NodeJS\n# inspector agent. The node process will break before user code starts and wait for the debugger to\n# connect. Pass the --inspect-brk option to all tests which enables the node inspector agent. See\n# https://nodejs.org/de/docs/guides/debugging-getting-started/#command-line-options for more\n# details.\n# Docs: https://nodejs.org/en/docs/guides/debugging-getting-started/#command-line-options\nrun:debug -- --node_options=--inspect-brk\ntest:debug --test_env=NODE_OPTIONS=--inspect-brk\n"
  },
  {
    "path": ".aspect/bazelrc/performance.bazelrc",
    "content": "# Directories used by sandboxed non-worker execution may be reused to avoid unnecessary setup costs.\n# Save time on Sandbox creation and deletion when many of the same kind of action run during the\n# build.\n# No longer experimental in Bazel 6: https://github.com/bazelbuild/bazel/commit/c1a95501a5611878e5cc43a3cc531f2b9e47835b\n# Docs: https://bazel.build/reference/command-line-reference#flag--reuse_sandbox_directories\nbuild --experimental_reuse_sandbox_directories\n\n# Do not build runfiles symlink forests for external repositories under\n# `.runfiles/wsname/external/repo` (in addition to `.runfiles/repo`). This reduces runfiles &\n# sandbox creation times & prevents accidentally depending on this feature which may flip to off by\n# default in the future. Note, some rules may fail under this flag, please file issues with the rule\n# author.\n# Docs: https://bazel.build/reference/command-line-reference#flag--legacy_external_runfiles\nbuild --nolegacy_external_runfiles\n\n# Avoid creating a runfiles tree for binaries or tests until it is needed.\n# Docs: https://bazel.build/reference/command-line-reference#flag--build_runfile_links\n# See https://github.com/bazelbuild/bazel/issues/6627\n#\n# This may break local workflows that `build` a binary target, then run the resulting program\n# outside of `bazel run`. In those cases, the script will need to call\n# `bazel build --build_runfile_links //my/binary:target` and then execute the resulting program.\nbuild --nobuild_runfile_links\n\n# Needed prior to Bazel 8; see\n# https://github.com/bazelbuild/bazel/issues/20577\ncoverage --build_runfile_links\n"
  },
  {
    "path": ".aspect/bazelrc/usage.md",
    "content": "## Using Aspect bazelrc presets in your project\n\nThe `.bazelrc` file can get large, fast.\nSome settings don't apply everywhere - some options are appropriate only on CI,\nand some vary depending on the version of Bazel you use or languages used.\n\nBazel rc files can contain `import` statements, which allow you to organize the content better.\n\nTo use these presets in your project, simply vendor the `*.bazelrc` files from\nhttps://github.com/bazel-contrib/bazel-lib/tree/main/.aspect/bazelrc into the\n`.aspect/bazelrc` folder in your repository and `import` them in your `.bazelrc` file.\n\nFor example,\n\n```python title=\".bazelrc\"\n# Import Aspect bazelrc presets\nimport %workspace%/.aspect/bazelrc/bazel6.bazelrc\nimport %workspace%/.aspect/bazelrc/convenience.bazelrc\nimport %workspace%/.aspect/bazelrc/correctness.bazelrc\nimport %workspace%/.aspect/bazelrc/debug.bazelrc\nimport %workspace%/.aspect/bazelrc/javascript.bazelrc\nimport %workspace%/.aspect/bazelrc/performance.bazelrc\n\n### YOUR PROJECT SPECIFIC OPTIONS GO HERE ###\n\n# Load any settings & overrides specific to the current user from `.aspect/bazelrc/user.bazelrc`.\n# This file should appear in `.gitignore` so that settings are not shared with team members. This\n# should be last statement in this config so the user configuration is able to overwrite flags from\n# this file. See https://bazel.build/configure/best-practices#bazelrc-file.\ntry-import %workspace%/.aspect/bazelrc/user.bazelrc\n```\n"
  },
  {
    "path": ".bazelrc",
    "content": "#\n# Copyright (c) 2017-2024, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# **********************************\n# ASPECT PRESETS\n# https://github.com/bazel-contrib/bazel-lib/tree/main/.aspect/bazelrc\n# **********************************\n\n\nimport %workspace%/.aspect/bazelrc/bazel7.bazelrc\nimport %workspace%/.aspect/bazelrc/convenience.bazelrc\nimport %workspace%/.aspect/bazelrc/correctness.bazelrc\n\n\n# **********************************\n# BZLMOD\n# **********************************\n\ncommon --enable_bzlmod\n\n# **********************************\n# ARTIFACT STAMPING\n# **********************************\n# These settings ensure Spring Boot artifacts are built with stamped version info.\n# The Spring Boot rule uses the stamping information to populate the /manage/info endpoint\n# refer to our tools/buildstamp/README.md for more details\nbuild --stamp\nbuild --workspace_status_command tools/buildstamp/get_workspace_status\n\n\n# **********************************\n# JAVA COMPILATION\n# **********************************\n\n# Currently, only the exmaples use Java, so these settings are limited to the examples.\n# Spring Boot 3 requires JDK17\n\n# Compile and Test/Run JDKs\ncommon --java_language_version=17 # used for compilation (version for compiling java sources)\ncommon --java_runtime_version=17  # used for execution & testing java binaries\n\n# Tools - the jdk used for running tools that get executed during the build\ncommon --tool_java_language_version=17\ncommon --tool_java_runtime_version=17"
  },
  {
    "path": ".bazelversion",
    "content": "7.4.1\n"
  },
  {
    "path": ".gitignore",
    "content": "#\n# Copyright (c) 2017-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# bazel build dirs\nbazel-*\n\n# set your user to your public GitHub user in a script like this:\n#   git config --global user.email '#####+username@users.noreply.github.com'\n# but dont check it in\nsetGitOSSUser.sh\n\n# python\n__pycache__\n\n# //tools/python_interpreter\ncaptive_python3\nbin\n\n# after running the //tools/codecoverage tooling you will be left with this root level folder\n# it contains your test results, so do not checkin\ncoverage-reports\n\n# release zips\nrules-spring-*.zip\n\n.vscode\n.ijwb\n\n.idea"
  },
  {
    "path": "BUILD",
    "content": "#\n# Copyright (c) 2017-2024, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\nload(\"@rules_license//rules:license.bzl\", \"license\")\n\nexports_files([\n    \"LICENSE.txt\",\n])\n\n# Using a package wide default ensure that all targets are associated with the\n# license.\npackage(\n    default_applicable_licenses = [\":license\"],\n    default_visibility = [\"//visibility:public\"],\n)\n\nlicense(\n    name = \"license\",\n    copyright_notice = \"Copyright (c) 2017-2024, Salesforce\",\n    license_kinds = [\n        \"@rules_license//licenses/spdx:Apache-2.0\",\n    ],\n    license_text = \"//:LICENSE.txt\",\n    package_name = \"@rules_spring\",\n    package_url = \"https://github.com/salesforce/rules_spring\",\n    package_version = \"2.4.2\",\n    visibility = [\"//visibility:public\"],\n)\n"
  },
  {
    "path": "CODEOWNERS",
    "content": "# Comment line immediately above ownership line is reserved for related gus information. Please be careful while editing.\n#ECCN:Open Source\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Salesforce Open Source Community Code of Conduct\n\n## About the Code of Conduct\n\nEquality is a core value at Salesforce. We believe a diverse and inclusive\ncommunity fosters innovation and creativity, and are committed to building a\nculture where everyone feels included.\n\nSalesforce open-source projects are committed to providing a friendly, safe, and\nwelcoming environment for all, regardless of gender identity and expression,\nsexual orientation, disability, physical appearance, body size, ethnicity, nationality, \nrace, age, religion, level of experience, education, socioeconomic status, or \nother similar personal characteristics.\n\nThe goal of this code of conduct is to specify a baseline standard of behavior so\nthat people with different social values and communication styles can work\ntogether effectively, productively, and respectfully in our open source community.\nIt also establishes a mechanism for reporting issues and resolving conflicts.\n\nAll questions and reports of abusive, harassing, or otherwise unacceptable behavior\nin a Salesforce open-source project may be reported by contacting the Salesforce\nOpen Source Conduct Committee at ossconduct@salesforce.com.\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, we as\ncontributors and maintainers pledge to making participation in our project and\nour community a harassment-free experience for everyone, regardless of gender \nidentity and expression, sexual orientation, disability, physical appearance, \nbody size, ethnicity, nationality, race, age, religion, level of experience, education, \nsocioeconomic status, or other similar personal characteristics.\n\n## Our Standards\n\nExamples of behavior that contributes to creating a positive environment\ninclude:\n\n* Using welcoming and inclusive language\n* Being respectful of differing viewpoints and experiences\n* Gracefully accepting constructive criticism\n* Focusing on what is best for the community\n* Showing empathy toward other community members\n\nExamples of unacceptable behavior by participants include:\n\n* The use of sexualized language or imagery and unwelcome sexual attention or\nadvances\n* Personal attacks, insulting/derogatory comments, or trolling\n* Public or private harassment\n* Publishing, or threatening to publish, others' private information—such as\na physical or electronic address—without explicit permission\n* Other conduct which could reasonably be considered inappropriate in a\nprofessional setting\n* Advocating for or encouraging any of the above behaviors\n\n## Our Responsibilities\n\nProject maintainers are responsible for clarifying the standards of acceptable\nbehavior and are expected to take appropriate and fair corrective action in\nresponse to any instances of unacceptable behavior.\n\nProject maintainers have the right and responsibility to remove, edit, or\nreject comments, commits, code, wiki edits, issues, and other contributions\nthat are not aligned with this Code of Conduct, or to ban temporarily or\npermanently any contributor for other behaviors that they deem inappropriate,\nthreatening, offensive, or harmful.\n\n## Scope\n\nThis Code of Conduct applies both within project spaces and in public spaces\nwhen an individual is representing the project or its community. Examples of\nrepresenting a project or community include using an official project email\naddress, posting via an official social media account, or acting as an appointed\nrepresentative at an online or offline event. Representation of a project may be\nfurther defined and clarified by project maintainers.\n\n## Enforcement\n\nInstances of abusive, harassing, or otherwise unacceptable behavior may be\nreported by contacting the Salesforce Open Source Conduct Committee \nat ossconduct@salesforce.com. All complaints will be reviewed and investigated \nand will result in a response that is deemed necessary and appropriate to the \ncircumstances. The committee is obligated to maintain confidentiality with \nregard to the reporter of an incident. Further details of specific enforcement \npolicies may be posted separately.\n\nProject maintainers who do not follow or enforce the Code of Conduct in good\nfaith may face temporary or permanent repercussions as determined by other\nmembers of the project's leadership and the Salesforce Open Source Conduct \nCommittee.\n\n## Attribution\n\nThis Code of Conduct is adapted from the [Contributor Covenant][contributor-covenant-home],\nversion 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html. \nIt includes adaptions and additions from [Go Community Code of Conduct][golang-coc], \n[CNCF Code of Conduct][cncf-coc], and [Microsoft Open Source Code of Conduct][microsoft-coc].\n\nThis Code of Conduct is licensed under the [Creative Commons Attribution 3.0 License][cc-by-3-us].\n\n[contributor-covenant-home]: https://www.contributor-covenant.org (https://www.contributor-covenant.org/)\n[golang-coc]: https://golang.org/conduct\n[cncf-coc]: https://github.com/cncf/foundation/blob/master/code-of-conduct.md\n[microsoft-coc]: https://opensource.microsoft.com/codeofconduct/\n[cc-by-3-us]: https://creativecommons.org/licenses/by/3.0/us/"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright (c) 2017-2024, Salesforce\nAll rights reserved.\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n"
  },
  {
    "path": "MODULE.bazel",
    "content": "module(\n    name = \"rules_spring\",\n    version = \"2.6.3\",\n    compatibility_level = 2,\n    repo_name = \"rules_spring\",\n)\n\n# Python for dupe class checking support\nbazel_dep(name = \"rules_python\", version = \"0.40.0\")\n\n# For License support\nbazel_dep(name = \"rules_license\", version = \"1.0.0\")\n\n# For unittest toolchain\nbazel_dep(name = \"bazel_skylib\", version = \"1.1.1\")\n\n# DEV DEPENDENCIES\n\n# Maven dependencies for the examples\nbazel_dep(name = \"rules_jvm_external\", version = \"6.6\", dev_dependency = True)\n\nmaven = use_extension(\"@rules_jvm_external//:extensions.bzl\", \"maven\", dev_dependency = True)\nmaven.install(\n    artifacts = [\n        \"org.slf4j:slf4j-api:2.0.17\",\n        \"org.springframework.boot:spring-boot:3.4.4\",\n        \"org.springframework.boot:spring-boot-actuator:3.4.4\",\n        \"org.springframework.boot:spring-boot-actuator-autoconfigure:3.4.4\",\n        \"org.springframework.boot:spring-boot-autoconfigure:3.4.4\",\n        \"org.springframework.boot:spring-boot-configuration-processor:3.4.4\",\n        \"org.springframework.boot:spring-boot-loader:3.4.4\",\n        \"org.springframework.boot:spring-boot-loader-tools:3.4.4\",\n        \"org.springframework.boot:spring-boot-jarmode-tools:3.4.4\",\n        \"org.springframework.boot:spring-boot-starter:3.4.4\",\n        \"org.springframework.boot:spring-boot-starter-actuator:3.4.4\",\n        \"org.springframework.boot:spring-boot-starter-freemarker:3.4.4\",\n        \"org.springframework.boot:spring-boot-starter-jdbc:3.4.4\",\n        \"org.springframework.boot:spring-boot-starter-jetty:3.4.4\",\n        \"org.springframework.boot:spring-boot-starter-logging:3.4.4\",\n        \"org.springframework.boot:spring-boot-starter-security:3.4.4\",\n        \"org.springframework.boot:spring-boot-starter-test:3.4.4\",\n        \"org.springframework.boot:spring-boot-starter-web:3.4.4\",\n        \"org.springframework.boot:spring-boot-test:3.4.4\",\n        \"org.springframework.boot:spring-boot-test-autoconfigure:3.4.4\",\n        \"org.springframework.boot:spring-boot-starter-thymeleaf:3.4.4\",\n        \"org.springframework:spring-aop:6.2.5\",\n        \"org.springframework:spring-aspects:6.2.5\",\n        \"org.springframework:spring-beans:6.2.5\",\n        \"org.springframework:spring-context:6.2.5\",\n        \"org.springframework:spring-context-support:6.2.5\",\n        \"org.springframework:spring-core:6.2.5\",\n        \"org.springframework:spring-expression:6.2.5\",\n        \"org.springframework:spring-jdbc:6.2.5\",\n        \"org.springframework:spring-test:6.2.5\",\n        \"org.springframework:spring-tx:6.2.5\",\n        \"org.springframework:spring-web:6.2.5\",\n        \"org.springframework:spring-webmvc:6.2.5\",\n\n        # intentionally ancient version annotation-api; in demoapp we use\n        # a filter to exclude this dependency\n        \"javax.annotation:javax.annotation-api:1.3.2\",\n\n\n        # test deps\n        \"junit:junit:4.13.2\",\n        \"org.hamcrest:hamcrest-core:2.2\",\n        \"org.assertj:assertj-core:3.25.3\",\n    ],\n    lock_file = \"//:maven_install.json\",\n)\nuse_repo(maven, \"maven\")\n\nunmanaged_maven = use_extension(\"@rules_jvm_external//:extensions.bzl\", \"maven\", dev_dependency = True)\nunmanaged_maven.install(\n    name = \"unmanaged_deps_filter\",\n    artifacts = [\n        \"org.springframework.boot:spring-boot-starter-data-jpa:3.3.11\",\n        \"org.springframework.boot:spring-boot-starter-security:3.3.11\",\n        \"com.fasterxml.jackson.core:jackson-databind:2.17.2\",\n        \"org.hibernate.orm:hibernate-core:6.4.4.Final\",\n        \"org.springframework.boot:spring-boot-starter-oauth2-client:3.3.11\",\n        \"org.springframework.boot:spring-boot-starter-webflux:3.3.11\",\n        \"org.springframework.boot:spring-boot-starter-actuator:3.3.11\",\n        \"jakarta.servlet.jsp:jakarta.servlet.jsp-api:3.1.1\",\n        \"junit:junit:4.13.2\",\n        \"org.assertj:assertj-core:3.26.0\",\n        \"io.micrometer:micrometer-commons:1.13.13\",\n        \"org.slf4j:jul-to-slf4j:2.0.17\",\n    ],\n    excluded_artifacts = [\n        \"org.slf4j:slf4j-api\",\n        \"org.yaml:snakeyaml\",\n    ],\n    lock_file = \"//springboot/deps_filter_rules/tests/external_deps:unmanaged_deps_filter_install.json\",\n)\nuse_repo(unmanaged_maven, \"unmanaged_deps_filter\")\n\n"
  },
  {
    "path": "README.md",
    "content": "## Salesforce Spring Rules for Bazel\n\nThis repository contains the [Spring Boot](https://spring.io/guides/gs/spring-boot/) rule\n  for the [Bazel](https://bazel.build/) build system.\nIt enables Bazel to build Spring Boot applications and package them as an executable jar file.\nThe executable jar is the best way to deploy your Spring Boot application in production environments.\n\nThe Salesforce *springboot* rule can be found, along with documentation, in this directory:\n- [springboot](springboot): a Bazel extension to build and package Spring Boot applications\n\n### Support and Ongoing Development\n\nThis rule was developed and is supported by Salesforce.\nIf you have any issues with this repository, please create a [GitHub Issue](https://github.com/salesforce/rules_spring/issues).\nWe will try to quickly address problems and answer questions.\nNote that we do not yet officially support running these [rules on Windows](https://github.com/salesforce/rules_spring/issues/25) but some users have gotten it to work.\n\nOngoing development is planned and tracked using this GitHub repository's [Issues list](https://github.com/salesforce/rules_spring/issues).\nTo see what bug fixes and new features are planned, consult the backlog located there.\nGenerally, we prioritize based on our internal requirements at Salesforce, but if you need something \n  please post a comment on the issue and that will help us prioritize.\nTo see what features/fixes were delivered in a particular release, use the release \n  [version labels](https://github.com/salesforce/rules_spring/issues/labels) and filter on Closed issues.\n  [(example)](https://github.com/salesforce/rules_spring/issues?q=label%3A2.6.1+is%3Aclosed).\n\n:octocat: Please do us a **huge favor**. If you think this project could be useful for you, now or in the future,\n  please hit the **Star** button at the top. That helps us advocate for more time and resources on this project. Thanks!\n\n### Loading the Spring Rules in your WORKSPACE\n\nBefore you can use the rule in your BUILD files, you need to add it to your workspace.\n\n**Bzlmod**\n\n```starlark\nbazel_dep(name = \"rules_spring\", version = \"2.6.3\")\n```\n\n**WORKSPACE (legacy)**\n\nThis loads a pre-built version of this rule into your workspace during the build.\n```starlark\nhttp_archive(\n    name = \"rules_spring\",\n    sha256 = \"2d0805b4096db89b8e407ed0c243ce81c3d20f346e4c259885041d5eabc59436\",\n    urls = [\n        \"https://github.com/salesforce/rules_spring/releases/download/2.6.3/rules-spring-2.6.3.zip\",\n    ],\n)\n```\n\nIf you choose not to use an official release, you may be tempted to use a *git_repository* workspace\n  rule to point to our *main* branch,\nPlease **do not** do this, as we use *main* for ongoing work.\nWe may check breaking changes into *main* at any time.\n\n\n### Upgrading to Spring Boot 3\n\nThis is largely outside the scope of *rules_spring*.\nYou will need to update your dependencies in your *maven_install* rules, of course.\nBut there are [a ton of other steps](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide).\nSalesforce has some [docs/tools that will help](https://github.com/salesforce/rules_spring/issues/230) for Bazel users.\n\nThe one change that you will need to make for *rules_spring* is to choose the Boot3 launcher class.\nThis is because Boot rewrote the launcher for Boot3 and it is available under a different name.\nThe Boot2 launcher is the default for *rules_spring* so as not to break backwards compatibility.\n\nExample:\n```starlark\nspringboot(\n    name = \"helloworld_boot3\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n\n    # SPRING BOOT 3\n    # The launcher class changed in Spring Boot 3.2.0, so we provide the\n    # Boot3 launcher class here (the Boot2 one is the default)\n    boot_launcher_class = 'org.springframework.boot.loader.launch.JarLauncher',\n)\n```\n\n### Appendix: Alternate Approach for Building and Running Spring Boot Applications\n\nIf you don't need to create a runnable executable jar file, there is an alternate approach to Spring Boot\n  in the *rules_jvm_external* repository.\nThat approach is sufficient if Bazel and your Bazel workspace (i.e. source code) are available in\n  all environments that launch the application.\n- [rules_jvm_external Spring Boot example](https://github.com/bazelbuild/rules_jvm_external/tree/master/examples/spring_boot)\n\nAt Salesforce, Bazel is not available in production environments, and so this alternate approach is not viable.\n"
  },
  {
    "path": "REPO.bazel",
    "content": "repo(\n    default_package_metadata = [\"//:license\"],\n)\n"
  },
  {
    "path": "SECURITY.md",
    "content": "## Security\n\nPlease report any security issue to [security@salesforce.com](mailto:security@salesforce.com)\nas soon as it is discovered. This library limits its runtime dependencies in\norder to reduce the total cost of ownership as much as can be, but all consumers\nshould remain vigilant and have their security stakeholders review all third-party\nproducts (3PP) like this one and their dependencies."
  },
  {
    "path": "examples/README.md",
    "content": "## Bazel Spring Boot Rule Examples\n\nNavigate into our examples directories:\n\n- [Hello World](helloworld): bare bones example\n- [Demo App](demoapp): demonstrates how to use various features in the rule\n\nThe examples above are coresident with the rule itself, which makes them not precise.\nYour usage of rules_spring will be as a remote repository.\nThese same examples are availabe in a dedicated repository:\n\n- [External Demos](https://github.com/plaird/rules_spring_demoapp)\n\nThere is also a Kotlin example, which is kept in a separate branch in this repository:\n\n- [KotlinApp](https://github.com/salesforce/rules_spring/tree/examples_kotlin) shows how to build and run  Spring Boot applications written in Kotlin with *rules_spring*\n"
  },
  {
    "path": "examples/demoapp/BUILD",
    "content": "#\n# Copyright (c) 2017-2024, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# NOTE:\n#   This sample is embedded in the same workspace as the springboot rule. Therefore references\n#   to local path \"//springboot\" work here. But you will need to change them to:\n#   \"@rules_spring//springboot\" when you consume the official release via http_archive.\n\nload(\"//springboot:springboot.bzl\", \"springboot\")\nload(\"//springboot/deps_filter_rules_legacy:deps_filter.bzl\", \"deps_filter\")\nload(\"//tools/license:licenses_used.bzl\", \"licenses_used\")\nload(\":generate-build-info.bzl\", \"gen_buildinfo_rule\")\n\n# dependencies from other packages in the workspace\ndeps = [\n    \"//examples/demoapp/libs/lib1\",\n    \"//examples/demoapp/libs/lib2\",\n\n    # the neverlink example lib is only included at compile time, and not packaged in the jar\n    \"//examples/demoapp/libs/lib3_neverlink\",\n]\n\n# create our deps list for Spring Boot\nspringboot_deps = [\n    \"//springboot/import_bundles:springboot_required_deps\",\n    \"@maven//:org_springframework_boot_spring_boot_starter_jetty\",\n    \"@maven//:org_springframework_boot_spring_boot_starter_web\",\n    \"@maven//:org_springframework_boot_spring_boot_loader_tools\",\n    \"@maven//:org_springframework_boot_spring_boot_jarmode_tools\",\n    \"@maven//:org_springframework_spring_webmvc\",\n\n    # bring in same dep again as above, but through a different maven_install\n    # rule: the springboot rule does not package duplicate deps, first one wins\n    #\"@spring_boot_starter_jetty//:org_springframework_boot_spring_boot_starter_jetty\",\n]\n\n# Sometimes you have a transitive that you don't want. The unwanted_classes.md doc\n# covers this case, and this snippet shows how to use it:\ndeps_filter(\n    name = \"filtered_deps\",\n    deps_exclude_labels = [\n        # tomcat comes in transitively, but we want to use jetty\n        \"@maven//:org_apache_tomcat_embed_tomcat_embed_core\",\n        \"@maven//:org_apache_tomcat_embed_tomcat_embed_el\",\n        \"@maven//:org_apache_tomcat_embed_tomcat_embed_websocket\",\n\n        # just a demo of excluding a transitive\n        \"@maven//:javax_annotation_javax_annotation_api\",\n    ],\n    exclude_transitives = True,\n    deps = springboot_deps + deps,  # the input list\n)\n\n# This Java library contains the app code\njava_library(\n    name = \"demoapp_lib\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    resources = glob([\"src/main/resources/**\"]) + [\":generate_build_info\"],\n    deps = [\":filtered_deps\"],\n)\n\n# This is just an example of having a dependency that you want only added to\n# the springboot jar, not the java_library. This is rare.\njava_library(\n    name = \"rootclassloader_lib\",\n    srcs = glob([\"src_root/main/java/**/*.java\"]),\n)\n\ntest_deps = [\n    \"@maven//:junit_junit\",\n    \"@maven//:org_hamcrest_hamcrest_core\",\n]\n\njava_test(\n    name = \"SampleRestUnitTest\",\n    srcs = [\"src/test/java/com/sample/SampleRestUnitTest.java\"],\n    deps = [\":demoapp_lib\"] + test_deps,\n)\n\nfilegroup(\n    name = \"bazelrun_data_files\",\n    srcs = [\n        \"application.properties\",\n        \"application-dev.properties\",\n        \"config/application.properties\",\n        \"example_data.txt\",\n    ],\n)\n\n# Build the app as a Spring Boot executable jar\n# To launch: bazel run //examples/demoapp\nspringboot(\n    name = \"demoapp\",\n\n    # sometimes packagers want to put certain files into the root of the springboot app jar\n    # these addins will be copied into the root of the generated springboot jar\n    addins = [\n        \":info.txt\",\n        \":author.txt\",\n    ],\n\n    # add JVM exports/opens for Java modularization\n    bazelrun_addexports = [\n        \"java.base/java.base=ALL-UNNAMED\",\n        \"java.base/java.io=ALL-UNNAMED\",\n        \"java.base/java.nio=ALL-UNNAMED\",\n    ],\n    bazelrun_addopens = [\n        \"java.base/java.util.concurrent=ALL-UNNAMED\",\n        \"java.base/java.util.logging=ALL-UNNAMED\",\n    ],\n\n    # data files can be made available in the working directory for when the app is launched with bazel run\n    bazelrun_data = [\":bazelrun_data_files\"],\n    # Specify optional environment variables to set when the application is launched with 'bazel run'\n    bazelrun_env_flag_list = [\n        \"PROP1=blue\",\n        \"PROP2=green\",\n    ],\n    bazelrun_jvm_flag_list = [\n        \"-Dcustomprop3=bronze\",\n        \"-DcustomProp4=copper\",\n    ],  # new way\n\n    # Specify optional JVM args to use when the application is launched with 'bazel run'\n    bazelrun_jvm_flags = \"-Dcustomprop=gold -DcustomProp2=silver\",  # old way\n    boot_app_class = \"com.sample.SampleMain\",\n\n    # SPRING BOOT 3\n    # The launcher class changed in between Boot2 and Boot3, so we provide the\n    # Boot3 launcher class here (the Boot2 one is the default)\n    boot_launcher_class = \"org.springframework.boot.loader.launch.JarLauncher\",\n\n    # BANNED DEPS\n    # These are dependencies that you never want in your springboot jar.\n    # This is used to detect mistakes in your transitive dependency graph. They\n    # might be test jars, or compile time jars like lombok. The list of strings\n    # is matched against the dependency jar filenames with a 'contains' match.\n    deps_banned = [\n        \"junit\",\n        \"mockito\",\n        \"lombok\",\n    ],\n\n    # run the application in the background (command returns immediately)\n    #bazelrun_background = True,\n\n    # if you have conflicting classes in dependency jar files, you can define the order in which the jars are loaded\n    #  https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html#executable-jar-war-index-files-classpath\n    deps_index_file = \":demoapp_classpath.idx\",\n\n    # TO TEST THE DUPE CLASSES FEATURE:\n    #   There is an intentionally duplicated class in lib1 and lib2. Do this:\n    #   1. set fail_on_duplicate_classes = True\n    #   2. comment out lib1 or lib2 in demoapp_dupeclass_allowlist.txt\n    #   Build should fail due to the duplicate class.\n    dupeclassescheck_enable = True,\n    dupeclassescheck_ignorelist = \"demoapp_dupeclass_allowlist.txt\",\n    java_library = \":demoapp_lib\",\n\n    # DEPS ARE OPTIONAL HERE\n    #  The springboot rule inherits all deps and runtime_deps from the java_library()\n    #  but this jar for uncommon reason is just added to the springboot rule.\n    deps = [\":rootclassloader_lib\"],\n)\n\nspringboottest_deps = [\n    \"@maven//:org_springframework_spring_beans\",\n    \"@maven//:org_springframework_boot_spring_boot_test\",\n    \"@maven//:org_springframework_spring_test\",\n]\n\njava_test(\n    name = \"SampleRestFuncTest\",\n    srcs = [\"src/test/java/com/sample/SampleRestFuncTest.java\"],\n    resources = glob([\"src/test/resources/**\"]),\n    deps = [\":demoapp_lib\"] + test_deps + springboottest_deps,\n)\n\njava_test(\n    name = \"PackagingTest\",\n    srcs = [\"src/test/java/com/salesforce/rules_spring/PackagingTest.java\"],\n    data = [\":demoapp\"],\n    deps = [\":demoapp_lib\"] + test_deps,\n)\n\nlicenses_used(\n    name = \"demoapp_licenses\",\n    out = \"demoapp_licenses.json\",\n    deps = [\":demoapp\"],\n)\n\n# Prove that we can have a second springboot() app in the same BUILD file.\n#   https://github.com/salesforce/rules_spring/issues/139\n# To launch: bazel run //examples/demoapp:demoapp-second\nspringboot(\n    name = \"demoapp-second\",\n\n    # you may choose to override the launcher script that is used when you invoke 'bazel run //examples/demoapp'\n    bazelrun_script = \"custom_bazelrun_script.sh\",\n    boot_app_class = \"com.sample.SampleMain\",\n    boot_launcher_class = \"org.springframework.boot.loader.launch.JarLauncher\",\n    java_library = \":demoapp_lib\",\n    deps = [\":rootclassloader_lib\"],\n)\n\n# BuildProperties Support\n# See the generate-build-info.sh for usage details.\nexports_files([\n    \"generate-build-info.sh\",\n])\n\ngen_buildinfo_rule(\n    name = \"generate_build_info\",\n)\n"
  },
  {
    "path": "examples/demoapp/README.md",
    "content": "## Demo App Spring Boot Example\n\n\nThis example shows how to use many of the features of the Spring Boot rule for Bazel.\n\nTo build:\n\n```bash\nbazel build //examples/demoapp\n```\n\nTo run:\n\n```bash\nbazel run //examples/demoapp\n\n# or to see build data in the endpoint, run like this:\nbazel run --action_env=BUILD_NUMBER=998 --action_env=BUILD_TAG=green examples/demoapp\n```\n\nEndpoints:\n```\nhttp://localhost:8080/\nhttp://localhost:8080/actuator/configprops\nhttp://localhost:8080/actuator/info\n```\n\nFor full documentation of rules_spring, see the [//springboot](../../springboot) package documentation.\n"
  },
  {
    "path": "examples/demoapp/application-dev.properties",
    "content": "demoapp.config.rootdirectory=loaded (via dev profile)\n"
  },
  {
    "path": "examples/demoapp/application.properties",
    "content": "demoapp.config.rootdirectory=loaded\n"
  },
  {
    "path": "examples/demoapp/author.txt",
    "content": "Salesforce\n"
  },
  {
    "path": "examples/demoapp/config/application.properties",
    "content": "demoapp.config.configsubdirectory=loaded"
  },
  {
    "path": "examples/demoapp/custom_bazelrun_script.sh",
    "content": "#!/bin/bash\n\n# Copyright (c) 2021-2024, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\nset -e\n\n# Custom Launcher Script for launching a SpringBoot application with 'bazel run'\n# this is wired up in the springboot rule (the bazelrun_script attribute)\n\necho \"USING A CUSTOM LAUNCHER SCRIPT AS A DEMO (see custom_launcher_script.sh)\"\n\n# Launcher Script for launching a SpringBoot application with 'bazel run'\n\n# The following environment variables will be set by the springboot rule, and can\n# be reliably used for scripting:\n#  RULE_NAME=helloworld\n#  LABEL_PATH=examples/helloworld/\n#  SPRINGBOOTJAR_FILENAME=helloworld.jar\n#  JVM_FLAGS=\"-Dcustomprop=gold  -DcustomProp2=silver\"\n#  DO_BACKGROUND=true/false   (if true, the caller is expecting the launcher not to block and return immediately)\n#\n# There are several other env variables set by Bazel. These should be stable between\n# versions of Bazel because they are documented:\n#  https://docs.bazel.build/versions/master/user-manual.html#run\n\ncurrent_dir=$(pwd)\n\n# Picking the Java VM to run is a bit of an ordeal. \n# Precedence order is documented here: \n#   https://github.com/salesforce/rules_spring/blob/main/springboot/bazelrun.md#launcher-jvm\n\nif [ -f \"${BAZEL_RUN_JAVA}\" ]; then\n  # BAZEL_RUN_JAVA points to the actual java executable (file), not the java_home directory\n  echo \"Selected the JVM using the BAZEL_RUN_JAVA environment variable.\"\n  java_cmd=$BAZEL_RUN_JAVA\nelif [ -f \"${JAVABIN}\" ]; then\n  # JAVABIN points to the actual java executable (file), not the java_home directory\n  # this is java_binary's convention: https://bazel.build/reference/be/java#java_binary\n  echo \"Selected the JVM using the JAVABIN environment variable.\"\n  java_cmd=$JAVABIN\nelif [ -f \"$JAVA_TOOLCHAIN\" ]; then\n  echo \"Selected the JVM using the Bazel Java toolchain: $JAVA_TOOLCHAIN_NAME\"\n  java_cmd=$JAVA_TOOLCHAIN\nelif [ -d \"${JAVA_HOME}\" ]; then\n  echo \"Selected the JVM using the JAVA_HOME environment variable.\"\n  java_cmd=\"${JAVA_HOME}/bin/java\"\nelse\n  echo \"Selected the JVM by executing 'which java'\"\n  java_cmd=\"$(which java)\"\nfi\n\nif [ -z \"${java_cmd}\" ]; then\n  echo \"ERROR: no java found, either set JAVA_HOME or add the java executable to your PATH\"\n  exit 1\nfi\necho \"Using Java at ${java_cmd}\"\n${java_cmd} -version\necho \"\"\n\n# data files, which may include external config files\nif [ ! -z \"${DATAFILES}\" ]; then\n  echo \"Available datafiles:\"\n  configpaths=\"\"\n  for datafile in ${DATAFILES}; do\n      echo \"  datafile: $current_dir/$datafile\"\n      if [[ $datafile == *\"application\"*\".properties\" ]]; then\n          path=\"file:$current_dir/$datafile\"\n          if [ ! -z \"${configpaths}\" ]; then\n            configpaths=\"$configpaths,\"\n          fi\n          configpaths=\"$configpaths$path\"\n      fi\n  done\n  if [ ! -z \"${configpaths}\" ]; then\n      JVM_FLAGS=\"${JVM_FLAGS} -Dspring.config.additional-location=$configpaths\"\n  fi\n  echo \"\"\nfi\n\n# java args\necho \"Using JAVA_OPTS from the environment: ${JAVA_OPTS}\"\necho \"Using bazelrun_jvm_flags from the BUILD file: ${JVM_FLAGS}\"\n\n# main args\nmain_args=\"$@\"\n\n# spring boot jar; these are replaced by the springboot starlark code:\npath=${LABEL_PATH}\njar=${SPRINGBOOTJAR_FILENAME}\n\n# assemble the command\n# use exec so that we can pass signals to the underlying process (https://github.com/salesforce/rules_spring/issues/91)\ncmd=\"exec ${java_cmd} ${JVM_FLAGS} ${JAVA_OPTS} -jar ${path}${jar} ${main_args}\"\n\necho \"Running ${cmd}\"\necho \"In directory $current_dir\"\necho \"\"\necho \"You can also run from the root of the repo:\"\necho \"java -jar bazel-bin/${path}${jar}\"\necho \"\"\n\n# DO_BACKGROUND is set to true if the bazelrun_background attribute on the springboot rule is set to True\n# BAZELRUN_DO_BACKGROUND=true may be set by the user in the shell env prior to running bazel run\n# If either is true, we will run the application in the background and return immediately\nif [ \"$DO_BACKGROUND\" = true ] || [ \"$BAZELRUN_DO_BACKGROUND\" = true ]; then\n  logfile=/tmp/${RULE_NAME}.log\n  pidfile=/tmp/${RULE_NAME}.pid\n\n  ${cmd} > $logfile 2>&1 &\n  pid=$!\n  echo $pid > $pidfile\n\n  echo \"Launched the Spring Boot application in the background...\"\n  echo \"  BUILD rule 'bazelrun_background' attribute = [$DO_BACKGROUND]  Environment variable BAZELRUN_DO_BACKGROUND = [$BAZELRUN_DO_BACKGROUND]\"\n  echo \"  Console log is being written to $logfile\"\n  echo \"  Application process id [$pid] has been written to $pidfile\"\n  echo \"\"\nelse\n  echo \"Launching the Spring Boot application in the foreground...\"\n  echo \"\"\n  ${cmd}\nfi\n"
  },
  {
    "path": "examples/demoapp/demoapp_classpath.idx",
    "content": "- \"liblib1.jar\"\n- \"liblib2.jar\"\n"
  },
  {
    "path": "examples/demoapp/demoapp_dupeclass_allowlist.txt",
    "content": "#\n# Copyright (c) 2019-2024, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\nliblib1.jar\nliblib2.jar\n"
  },
  {
    "path": "examples/demoapp/example_data.txt",
    "content": "x=0\ny=0\n"
  },
  {
    "path": "examples/demoapp/generate-build-info.bzl",
    "content": "# This macro runs a shell script to implant build variables into a properties file,\n# which is in turn consumed by Spring's BuildProperties bean. See the script for\n# usage details.\n\ndef gen_buildinfo_rule(name, output = \"src/main/resources/META-INF/build-info.properties\"):\n    native.genrule(\n        name = name,\n        cmd = \"\"\"$(location //examples/demoapp:generate-build-info.sh) $@\"\"\",\n        tools = [\"//examples/demoapp:generate-build-info.sh\"],\n        outs = [output],\n    )\n"
  },
  {
    "path": "examples/demoapp/generate-build-info.sh",
    "content": "#!/bin/bash\nset -e\n\n# This script is invoked by generate-build-info.bzl, which is in turn invoked by\n# the BUILD file. Consult those files for usage info.\n\n# This script implants build data into the Spring Boot app, which is then\n# accessible by autowiring the org.springframework.boot.info.BuildProperties bean.\n# See SampleAutoConfiguration.java for an example usage of BuildProperties.\n\nbuildpropsfile=$1\n\n# These must be set by the bazel command that launches the app.\n# bazel run --action_env=BUILD_NUMBER=998 --action_env=BUILD_TAG=green examples/demoapp\n\necho \"build.number=$BUILD_NUMBER\" >> $buildpropsfile\necho \"build.tag=$BUILD_TAG\" >> $buildpropsfile"
  },
  {
    "path": "examples/demoapp/info.txt",
    "content": "This springboot jar was built by Bazel rules_spring.\n\nIt is copied into the toplevel directory of the springboot jar as an 'addin'.\n"
  },
  {
    "path": "examples/demoapp/libs/lib1/BUILD",
    "content": "#\n# Copyright (c) 2020-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\ndeps = [\n    \"@maven//:org_slf4j_slf4j_api\",\n]\n\ntest_deps = [\n    \"@maven//:junit_junit\",\n    \"@maven//:org_hamcrest_hamcrest_core\",\n]\n\njava_library(\n    name = \"lib1\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    visibility = [\"//visibility:public\"],\n    deps = deps,\n)\n\njava_test(\n    name = \"IntentionalDupedClassTest\",\n    srcs = [\"src/test/java/com/bazel/demo/IntentionalDupedClassTest.java\"],\n    deps = [\":lib1\"] + test_deps,\n)\n"
  },
  {
    "path": "examples/demoapp/libs/lib1/src/main/java/com/bazel/demo/IntentionalDupedClass.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.bazel.demo;\n\npublic class IntentionalDupedClass {\n    public String hello() {\n      return \"Hello LIB1!\";\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/libs/lib1/src/test/java/com/bazel/demo/IntentionalDupedClassTest.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.bazel.demo;\n\nimport static org.junit.Assert.assertEquals;\nimport org.junit.Test;\n\npublic class IntentionalDupedClassTest {\n\n    @Test\n    public void helloTest() {\n      IntentionalDupedClass testClass = new IntentionalDupedClass();\n      assertEquals(\"Hello LIB1!\", testClass.hello());\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/libs/lib2/BUILD",
    "content": "#\n# Copyright (c) 2020-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\ndeps = [\n    \"@maven//:org_slf4j_slf4j_api\",\n]\n\ntest_deps = [\n    \"@maven//:junit_junit\",\n    \"@maven//:org_hamcrest_hamcrest_core\",\n]\n\njava_library(\n    name = \"lib2\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    visibility = [\"//visibility:public\"],\n    deps = deps,\n)\n\njava_test(\n    name = \"IntentionalDupedClassTest\",\n    srcs = [\"src/test/java/com/bazel/demo/IntentionalDupedClassTest.java\"],\n    deps = [\":lib2\"] + test_deps,\n)\n"
  },
  {
    "path": "examples/demoapp/libs/lib2/src/main/java/com/bazel/demo/IntentionalDupedClass.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.bazel.demo;\n\npublic class IntentionalDupedClass {\n    public String hello() {\n      return \"Hello LIB2!\";\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/libs/lib2/src/test/java/com/bazel/demo/IntentionalDupedClassTest.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.bazel.demo;\n\nimport static org.junit.Assert.assertEquals;\nimport org.junit.Test;\n\npublic class IntentionalDupedClassTest {\n\n    @Test\n    public void helloTest() {\n      IntentionalDupedClass testClass = new IntentionalDupedClass();\n      assertEquals(\"Hello LIB2!\", testClass.hello());\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/libs/lib3_neverlink/BUILD",
    "content": "#\n# Copyright (c) 2020-2024, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\ndeps = [\n    \"@maven//:org_slf4j_slf4j_api\",\n]\n\ntest_deps = [\n    \"@maven//:junit_junit\",\n    \"@maven//:org_hamcrest_hamcrest_core\",\n]\n\njava_library(\n    name = \"lib3_neverlink\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    visibility = [\"//visibility:public\"],\n    deps = deps,\n\n    # Signals that this is a compile only dep\n    neverlink = 1,\n)\n\njava_test(\n    name = \"NeverLinkTest\",\n    srcs = [\"src/test/java/com/bazel/demo/NeverLinkTest.java\"],\n    deps = [\":lib3_neverlink\"] + test_deps,\n)\n"
  },
  {
    "path": "examples/demoapp/libs/lib3_neverlink/README.md",
    "content": "## Neverlink Lib\n\nThis example *java_library* has *neverlink* set to true.\n\n```\nBoolean; default is False\n\nWhether this library should only be used for compilation and not at runtime. Useful if the library will be provided by the runtime environment during execution. Examples of such libraries are the IDE APIs for IDE plug-ins or tools.jar for anything running on a standard JDK.\n\nNote that neverlink = True does not prevent the compiler from inlining material from this library into compilation targets that depend on it, as permitted by the Java Language Specification (e.g., static final constants of String or of primitive types). The preferred use case is therefore when the runtime library is identical to the compilation library.\n\nIf the runtime library differs from the compilation library then you must ensure that it differs only in places that the JLS forbids compilers to inline (and that must hold for all future versions of the JLS).\n```"
  },
  {
    "path": "examples/demoapp/libs/lib3_neverlink/src/main/java/com/bazel/demo/NeverLinkedClass.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.bazel.demo;\n\npublic class NeverLinkedClass {\n    public String hello() {\n      return \"Hello LIB3!\";\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/libs/lib3_neverlink/src/test/java/com/bazel/demo/NeverLinkTest.java",
    "content": "/*\n * Copyright (c) 2019-2024, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.bazel.demo;\n\nimport static org.junit.Assert.assertEquals;\nimport org.junit.Test;\n\npublic class NeverLinkTest {\n\n    // because the library is marked neverlink, it should not be on the runtime classpath\n    // TODO this is not testing the SpringBoot app, just the java_library, need to rewrite as SpringBootTest\n    // manually confirmed with: jar -tvf bazel-bin/examples/demoapp/demoapp.jar | grep lib3\n    @Test(expected = NoClassDefFoundError.class)\n    public void neverlinkTest() {\n      new NeverLinkedClass();\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/remote_debug.sh",
    "content": "# Remote attach debugging of the demoapp executable jar\n\njava -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y -jar ../../bazel-bin/examples/demoapp/demoapp.jar\n"
  },
  {
    "path": "examples/demoapp/src/main/java/com/sample/SampleAutoConfiguration.java",
    "content": "package com.sample;\n\nimport jakarta.annotation.PostConstruct;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.boot.info.BuildProperties;\nimport org.springframework.boot.loader.tools.SignalUtils;\n\npublic class SampleAutoConfiguration {\n\n    @Value(\"${demoapp.config.internal:not found}\")\n    String config_internal;\n\n    @Value(\"${demoapp.config.rootdirectory:not found}\")\n    String config_external_root;\n\n    @Value(\"${demoapp.config.configsubdirectory:not found}\")\n    String config_external_configsub;\n\n    @Value(\"${prop1:not found}\")\n    String config_external_env_prop1;\n\n    @Value(\"${prop2:not found}\")\n    String config_external_env_prop2;\n\n    /**\n     * BuildProperties is a Spring facility for implanting build data into the app.\n     * This is not enabled by default for rules_spring. You must wire it up using\n     * the example code in generate-build-info.sh\n     */\n    @Autowired\n    private BuildProperties buildProperties;\n\n    @PostConstruct\n    public void logLoadedProperties() {\n        System.out.println(\"SampleAutoConfiguration loading of application.properties files:\");\n        System.out.println(\"  internal application.properties: \"+config_internal);\n        System.out.println(\"  external application.properties: \"+config_external_root);\n        System.out.println(\"  external config/application.properties: \"+config_external_configsub);\n        System.out.println(\"SampleAutoConfiguration loading of environment variables:\");\n        System.out.println(\"  PROP1: \"+config_external_env_prop1);\n        System.out.println(\"  PROP2: \"+config_external_env_prop2);\n        System.out.println(\"SampleAutoConfiguration loading of BuildProperties:\");\n        System.out.println(\"  (set BUILD_NUMBER and BUILD_TAG action_env variables for Bazel build to use)\");\n        System.out.println(\"  build.number: \"+buildProperties.get(\"number\"));\n        System.out.println(\"  build.tag: \"+buildProperties.get(\"tag\"));\n    }\n\n    @PostConstruct\n    public void setupSignalHandler() {\n        // SignalUtils is really limited, it only attaches to the INT signal (2)\n        // You could steal the code and attach to other signals.\n        // https://github.com/spring-projects/spring-boot/blob/master/spring-boot-project/spring-boot-tools/spring-boot-loader-tools/src/main/java/org/springframework/boot/loader/tools/SignalUtils.java\n        SignalUtils.attachSignalHandler(new SampleSignalHandler());\n    }\n\n    /**\n     * Shows how you can catch an OS signal. This is a good test of the launcher script See\n     * https://github.com/salesforce/rules_spring/issues/91\n     * The only signal that SignalUtils attaches to is 2 (interrupt). kill -2 [pid]\n     */\n    private static class SampleSignalHandler implements Runnable {\n        @Override\n        public void run() {\n            System.out.println(\"Caught an Interrupt signal.\");\n            System.exit(0);\n        }\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/src/main/java/com/sample/SampleMain.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.sample;\n\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\nimport org.springframework.boot.SpringApplication;\nimport com.bazel.demo.IntentionalDupedClass;\n\n@SpringBootApplication\npublic class SampleMain {\n\n  // both //examples/demoapp/libs/lib1 and //examples/demoapp/libs/lib2 have this class\n  // this is only a problem if the springboot rule is configured to fail on dupes.\n  static private IntentionalDupedClass dupedClass = new IntentionalDupedClass();\n\n  public static void main(String[] args) throws Exception {\n    System.out.println(\"SampleMain: Launching the sample SpringBoot demo application...\");\n    StringBuffer sb = new StringBuffer();\n    for (String arg : args) {\n      sb.append(\"[\");\n      sb.append(arg);\n      sb.append(\"] \");\n    }\n    System.out.println(\"SampleMain:  Command line args: \"+sb.toString());\n\n    System.out.println(\"\\nSampleMain:  Intentional duped class version: \"+dupedClass.hello());\n\n    // test that the root class is available\n    Class.forName(\"com.sample.SampleRootClass\");\n    System.out.println(\"\\nSampleMain:  loaded the root class com.sample.SampleRootClass\");\n\n    SpringApplication.run(SampleMain.class, args);\n  }\n\n}\n"
  },
  {
    "path": "examples/demoapp/src/main/java/com/sample/SampleRest.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\n\npackage com.sample;\n\nimport org.springframework.web.bind.annotation.RestController;\nimport org.springframework.web.bind.annotation.RequestMapping;\n\n@RestController\npublic class SampleRest {\n    @RequestMapping(\"/\")\n    public String hello() {\n      return \"Hello!\";\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "content": "com.sample.SampleAutoConfiguration"
  },
  {
    "path": "examples/demoapp/src/main/resources/application.properties",
    "content": "#\n# Copyright (c) 2017-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# expose the actuator endpoints\n#  http://localhost:8080/actuator/beans\n#  http://localhost:8080/actuator/info\nmanagement.endpoints.web.exposure.include=*\n\ndemoapp.config.internal=loaded"
  },
  {
    "path": "examples/demoapp/src/test/java/com/salesforce/rules_spring/PackagingTest.java",
    "content": "/*\n * Copyright (c) 2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.salesforce.rules_spring;\n\nimport org.junit.Before;\nimport org.junit.Test;\n\nimport java.io.File;\nimport java.io.InputStream;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Enumeration;\nimport java.util.Iterator;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipFile;\n\nimport static org.junit.Assert.*;\n\n/**\n */\npublic class PackagingTest {\n\n    File springbootJarFile = null;\n\n    // file contents\n    String gitPropertiesContents = null;\n    String buildPropertiesContents = null;\n    String applicationPropertiesContents = null;\n\n    // file existence\n    boolean exists_lib1 = false;\n    boolean exists_lib2 = false;\n    boolean exists_lib3_neverlink = false;\n\n    @Before\n    public void setup() throws Exception {\n        springbootJarFile = new File(\"./examples/demoapp/demoapp.jar\");\n        if (!springbootJarFile.exists()) {\n            throw new IllegalStateException(\"Missing demoapp springboot jar; looked in path: \" +\n                    springbootJarFile.getAbsolutePath());\n        }\n        extractFilesFromSpringBootJar();\n    }\n\n    @Test\n    public void gitPropertiesFileTest() {\n        assertNotNull(gitPropertiesContents);\n        assertTrue(gitPropertiesContents.contains(\"git.commit\"));\n    }\n\n    @Test\n    public void buildPropertiesFileTest() {\n        assertNotNull(buildPropertiesContents);\n        assertTrue(buildPropertiesContents.contains(\"build.number\"));\n    }\n\n    @Test\n    public void applicationPropertiesFileTest() {\n        assertNotNull(applicationPropertiesContents);\n        assertTrue(applicationPropertiesContents.contains(\"demoapp.config.internal\"));\n    }\n\n    @Test\n    public void internalLibsAreIncludedTest() {\n        assertTrue(this.exists_lib1);\n        assertTrue(this.exists_lib2);\n    }\n\n    @Test\n    public void neverlinkLibsAreExcludedTest() {\n        assertFalse(this.exists_lib3_neverlink);\n    }\n\n    private void extractFilesFromSpringBootJar() throws Exception {\n        try (ZipFile sbZip = new ZipFile(springbootJarFile)) {\n            Enumeration<? extends ZipEntry> entries = sbZip.entries();\n            for (Iterator<? extends ZipEntry> it = entries.asIterator(); it.hasNext(); ) {\n                ZipEntry entry = it.next();\n                String name = entry.getName();\n                System.out.println(\"  zipentry: \"+name);\n                if (name.equals(\"BOOT-INF/classes/git.properties\")) {\n                    InputStream is = sbZip.getInputStream(entry);\n                    gitPropertiesContents = new String(is.readAllBytes(), StandardCharsets.UTF_8);\n                } else if (name.equals(\"BOOT-INF/classes/META-INF/build-info.properties\")) {\n                    InputStream is = sbZip.getInputStream(entry);\n                    buildPropertiesContents = new String(is.readAllBytes(), StandardCharsets.UTF_8);\n                } else if (name.equals(\"BOOT-INF/classes/application.properties\")) {\n                    InputStream is = sbZip.getInputStream(entry);\n                    applicationPropertiesContents = new String(is.readAllBytes(), StandardCharsets.UTF_8);\n                } else if (name.equals(\"BOOT-INF/lib/examples/demoapp/libs/lib1/liblib1.jar\")) {\n                    exists_lib1 = true;\n                } else if (name.equals(\"BOOT-INF/lib/examples/demoapp/libs/lib2/liblib2.jar\")) {\n                    exists_lib2 = true;\n                } else if (name.contains(\"neverlink\")) {\n                    // we have a lib named lib3_neverlink that has neverlink = True, which means it should NOT be\n                    // included in the springboot jar\n                    exists_lib3_neverlink = true;\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/src/test/java/com/sample/SampleRestFuncTest.java",
    "content": "/*\n * Copyright (c) 2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.sample;\n\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.TestPropertySource;\nimport org.springframework.test.context.junit4.SpringRunner;\n\nimport static org.junit.Assert.assertEquals;\nimport org.junit.Test;\n\n/**\n * This test class starts the Spring Boot application. Because the Spring context is\n * created, you can autowire spring beans into the test.\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest(classes = SampleMain.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)\n@TestPropertySource(locations = {\"classpath:/test.properties\"})\npublic class SampleRestFuncTest {\n\n    @Autowired\n    private SampleRest sampleRest;\n\n    @Test\n    public void apiTest() {\n      assertEquals(\"Hello!\", sampleRest.hello());\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/src/test/java/com/sample/SampleRestUnitTest.java",
    "content": "/*\n * Copyright (c) 2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.sample;\n\nimport static org.junit.Assert.assertEquals;\nimport org.junit.Test;\n\n/**\n * This test class does NOT start the Spring Boot application. It is a simple unit test.\n */\npublic class SampleRestUnitTest {\n\n    @Test\n    public void apiTest() {\n      SampleRest testClass = new SampleRest();\n      assertEquals(\"Hello!\", testClass.hello());\n    }\n}\n"
  },
  {
    "path": "examples/demoapp/src/test/resources/test.properties",
    "content": "anyprop=somevalue\n"
  },
  {
    "path": "examples/demoapp/src_root/main/java/com/sample/SampleRootClass.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.sample;\n\npublic class SampleRootClass {\n\n    public String helloMessage;\n\n}\n"
  },
  {
    "path": "examples/helloworld/BUILD",
    "content": "#\n# Copyright (c) 2017-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# NOTE:\n#   This sample is embedded in the same workspace as the springboot rule. Therefore references\n#   to local path \"//springboot\" work here. But you will need to change them to:\n#   \"@rules_spring//springboot\" when you consume the official release via http_archive.\n\n# load our Spring Boot rule\nload(\"//springboot:springboot.bzl\", \"springboot\")\n\n# dependencies from other packages in the workspace\nlib_deps = [\n    \"//examples/helloworld/libs/lib1\",\n    \"//examples/helloworld/libs/lib2\",\n]\n\n# create our deps list for Spring Boot\nspringboot_deps = [\n    \"//springboot/import_bundles:springboot_required_deps\",\n    \"@maven//:org_springframework_boot_spring_boot_starter_jetty\",\n    \"@maven//:org_springframework_boot_spring_boot_starter_web\",\n    \"@maven//:org_springframework_boot_spring_boot_loader_tools\",\n    \"@maven//:org_springframework_boot_spring_boot_jarmode_tools\",\n    \"@maven//:org_springframework_spring_webmvc\",\n\n    \"@maven//:javax_annotation_javax_annotation_api\",\n]\n\n# This Java library contains the app code\njava_library(\n    name = \"helloworld_lib\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    resources = glob([\"src/main/resources/**\"]),\n    deps = springboot_deps + lib_deps,\n)\n\ntest_deps = [\n    \"@maven//:junit_junit\",\n    \"@maven//:org_hamcrest_hamcrest_core\",\n]\n\njava_test(\n   name = \"SampleRestUnitTest\",\n   srcs = [\"src/test/java/com/sample/SampleRestUnitTest.java\"],\n   deps = [ \":helloworld_lib\" ] + test_deps,\n)\n\n# Build the app as a Spring Boot executable jar\n# To launch: bazel run //examples/helloworld\nspringboot(\n    name = \"helloworld\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n\n    # SPRING BOOT 3\n    # The launcher class changed in between Boot2 and Boot3, so we provide the\n    # Boot3 launcher class here (the Boot2 one is the default)\n    boot_launcher_class = 'org.springframework.boot.loader.launch.JarLauncher',\n)\n\nspringboottest_deps = [\n    \"@maven//:org_springframework_spring_beans\",\n    \"@maven//:org_springframework_boot_spring_boot_test\",\n    \"@maven//:org_springframework_spring_test\",\n]\n\njava_test(\n    name = \"SampleRestFuncTest\",\n    srcs = [\"src/test/java/com/sample/SampleRestFuncTest.java\"],\n    deps = [ \":helloworld_lib\" ] + test_deps + springboottest_deps,\n    resources = glob([\"src/test/resources/**\"]),\n)\n"
  },
  {
    "path": "examples/helloworld/README.md",
    "content": "## Hello World Spring Boot Example\n\n\nThis example shows a simple Spring Boot application packaged with Bazel.\n\nTo build:\n\n```bash\nbazel build //examples/helloworld\n```\n\nTo run:\n\n```bash\nbazel run //examples/helloworld\n```\n\nFor full documentation, see the [//springboot](../../springboot) package documentation.\n"
  },
  {
    "path": "examples/helloworld/libs/lib1/BUILD",
    "content": "#\n# Copyright (c) 2020-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\ndeps = [\n    \"@maven//:org_slf4j_slf4j_api\",\n]\n\ntest_deps = [\n    \"@maven//:junit_junit\",\n    \"@maven//:org_hamcrest_hamcrest_core\",\n]\n\njava_library(\n    name = \"lib1\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    visibility = [\"//visibility:public\"],\n    deps = deps,\n)\n\njava_test(\n    name = \"IntentionalDupedClassTest\",\n    srcs = [\"src/test/java/com/bazel/demo/IntentionalDupedClassTest.java\"],\n    deps = [\":lib1\"] + test_deps,\n)\n"
  },
  {
    "path": "examples/helloworld/libs/lib1/src/main/java/com/bazel/demo/IntentionalDupedClass.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.bazel.demo;\n\npublic class IntentionalDupedClass {\n    public String hello() {\n      return \"Hello LIB1!\";\n    }\n}\n"
  },
  {
    "path": "examples/helloworld/libs/lib1/src/test/java/com/bazel/demo/IntentionalDupedClassTest.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.bazel.demo;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\n\npublic class IntentionalDupedClassTest {\n\n    @Test\n    public void helloTest() {\n      IntentionalDupedClass testClass = new IntentionalDupedClass();\n      assertEquals(\"Hello LIB1!\", testClass.hello());\n    }\n}\n"
  },
  {
    "path": "examples/helloworld/libs/lib2/BUILD",
    "content": "#\n# Copyright (c) 2020-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\ndeps = [\n    \"@maven//:org_slf4j_slf4j_api\",\n]\n\ntest_deps = [\n    \"@maven//:junit_junit\",\n    \"@maven//:org_hamcrest_hamcrest_core\",\n]\n\njava_library(\n    name = \"lib2\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    visibility = [\"//visibility:public\"],\n    deps = deps,\n)\n\njava_test(\n    name = \"IntentionalDupedClassTest\",\n    srcs = [\"src/test/java/com/bazel/demo/IntentionalDupedClassTest.java\"],\n    deps = [\":lib2\"] + test_deps,\n)\n"
  },
  {
    "path": "examples/helloworld/libs/lib2/src/main/java/com/bazel/demo/IntentionalDupedClass.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.bazel.demo;\n\npublic class IntentionalDupedClass {\n    public String hello() {\n      return \"Hello LIB2!\";\n    }\n}\n"
  },
  {
    "path": "examples/helloworld/libs/lib2/src/test/java/com/bazel/demo/IntentionalDupedClassTest.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.bazel.demo;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\n\npublic class IntentionalDupedClassTest {\n\n    @Test\n    public void helloTest() {\n      IntentionalDupedClass testClass = new IntentionalDupedClass();\n      assertEquals(\"Hello LIB2!\", testClass.hello());\n    }\n}\n"
  },
  {
    "path": "examples/helloworld/remote_debug.sh",
    "content": "# Remote attach debugging of the helloworld executable jar\n\njava -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y -jar ../../bazel-bin/examples/helloworld/helloworld.jar\n"
  },
  {
    "path": "examples/helloworld/src/main/java/com/sample/SampleAutoConfiguration.java",
    "content": "package com.sample;\n\nimport org.springframework.context.annotation.Bean;\n\npublic class SampleAutoConfiguration {\n    @Bean\n    public String helloMessage() {\n        return \"Hello SpringBoot!\";\n    }\n}\n"
  },
  {
    "path": "examples/helloworld/src/main/java/com/sample/SampleMain.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.sample;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n@SpringBootApplication\npublic class SampleMain {\n\n  public static void main(String[] args) {\n    System.out.println(\"SampleMain: Launching the sample SpringBoot demo application...\");\n    StringBuffer sb = new StringBuffer();\n    for (String arg : args) {\n      sb.append(arg);\n      sb.append(\" \");\n    }\n    System.out.println(\"SampleMain:  Command line args: \"+sb.toString());\n\n    SpringApplication.run(SampleMain.class, args);\n  }\n\n}\n"
  },
  {
    "path": "examples/helloworld/src/main/java/com/sample/SampleRest.java",
    "content": "/*\n * Copyright (c) 2019-2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\n\npackage com.sample;\n\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RestController;\n\n@RestController\npublic class SampleRest {\n\n    @RequestMapping(\"/\")\n    public String hello() {\n        return \"Hello!\";\n    }\n}\n"
  },
  {
    "path": "examples/helloworld/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports",
    "content": "com.sample.SampleAutoConfiguration"
  },
  {
    "path": "examples/helloworld/src/main/resources/application.properties",
    "content": "#\n# Copyright (c) 2017-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# expose the actuator endpoints\n#  http://localhost:8080/actuator/beans\n#  http://localhost:8080/actuator/info\nmanagement.endpoints.web.exposure.include=*\n"
  },
  {
    "path": "examples/helloworld/src/test/java/com/sample/SampleRestFuncTest.java",
    "content": "/*\n * Copyright (c) 2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.sample;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\nimport org.junit.runner.RunWith;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.boot.test.context.SpringBootTest;\nimport org.springframework.test.context.TestPropertySource;\nimport org.springframework.test.context.junit4.SpringRunner;\n\n/**\n * This test class starts the Spring Boot application. Because the Spring context is\n * created, you can autowire spring beans into the test.\n */\n@RunWith(SpringRunner.class)\n@SpringBootTest(classes = SampleMain.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)\n@TestPropertySource(locations = {\"classpath:/test.properties\"})\npublic class SampleRestFuncTest {\n\n    @Autowired\n    private SampleRest sampleRest;\n\n    @Test\n    public void apiTest() {\n      assertEquals(\"Hello!\", sampleRest.hello());\n    }\n}\n"
  },
  {
    "path": "examples/helloworld/src/test/java/com/sample/SampleRestUnitTest.java",
    "content": "/*\n * Copyright (c) 2021, salesforce.com, inc.\n * All rights reserved.\n * Licensed under the BSD 3-Clause license.\n * For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n*/\npackage com.sample;\n\nimport static org.junit.Assert.assertEquals;\n\nimport org.junit.Test;\n\n/**\n * This test class does NOT start the Spring Boot application. It is a simple unit test.\n */\npublic class SampleRestUnitTest {\n\n    @Test\n    public void apiTest() {\n      SampleRest testClass = new SampleRest();\n      assertEquals(\"Hello!\", testClass.hello());\n    }\n}\n"
  },
  {
    "path": "examples/helloworld/src/test/resources/test.properties",
    "content": "anyprop=somevalue\n"
  },
  {
    "path": "examples/kotlinapp/README.md",
    "content": "## Kotlin Example for Bazel Spring Boot\n\nTo avoid cluttering the WORKSPACE file for everyone, the Kotlin example is published\n  in a dedicated branch of this repository.\n\n- [KotlinApp](https://github.com/salesforce/rules_spring/tree/examples_kotlin) shows how to build and run  Spring Boot applications written in Kotlin with *rules_spring*\n"
  },
  {
    "path": "makerelease.sh",
    "content": "#\n# Copyright (c) 2017-2024, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\nrelease_version=2.4.1\n\necho \"RELEASE: You are about to create a local zip file that contains the release bits.\"\necho \"After it is created, there will be instructions on how to upload it to GitHub and create the release metadata.\"\necho \"\"\necho \"Please enter the release version (e.g. 2.4.1):\"\nread release_version\necho \"\"\necho \"You have entered $release_version, are you good with this version? Enter to continue, ctrl-c to abort.\"\nread DOTHETHING\n\necho \"STEP 1: update MODULE.bazel with version $release_version\"\necho \"You must do this manually, I will wait for you. After it is done, press Enter here.\"\nread DOTHETHING\n\n\necho \"\"\necho \"STEP 2: packaging the release zip file.\"\necho \"I can do this all by myself....\"\necho \"\"\n# remove/relocate local build artifacts and tools\nrm -rf bazel-*\n\n# move some dev directories out, so they don't get zipped up in the archive\ntmpdir=/tmp/rules-spring-release\nmkdir $tmpdir 2>/dev/null\nmv examples $tmpdir 2>/dev/null\n\nrm -rf coverage-reports\nrm -rf springboot/tests/__pycache__\nrm -rf springboot/__pycache__\nrm *.zip\n\n# jar up the code\nrelease_zip=rules-spring-${release_version}.zip\njar -cvf $release_zip *\n\n# restore the dev directories\nmv $tmpdir/examples examples 2>/dev/null\n\nrm -rf $tmpdir\n\nsha256=$(shasum -a 256 $release_zip)\n\n\necho \"\"\necho \"RELEASE artifact built successfully: rules-spring-${release_version}.zip\"\necho \"  SHA256 of the release artifact: $sha256\"\necho \"\"\necho \"\"\necho \"STEP 3: release tasks\"\necho \" 0. commit and push the MODULE.bazel update you just did\"\necho \" 1. Create a new release on GitHub and upload the zip file to it. Look at previous releases and use the same doc conventions. Make sure you tag the release.\"\necho \" 2. Update the bzlmod/http_archive stanzas in the top level README.md to refer to the latest release.\"\necho \" 3. Test new release with the external demoapp repository: https://github.com/plaird/rules_spring_demoapp\"\necho \"\"\necho \"OK, go do those tasks now, please.\"\nread DID_RELEASE\necho \"\"\n\necho \"\"\necho \"STEP 4: BCR update tasks\"\necho \"OK, now you have to publish the release to the Bazel central registry.\"\necho \"1. Activate your python virtual env (e.g. source ~/dev/bin/activate)\"\necho \"2. sync your BCR fork: git pull upstream main\"\necho \"3. run the add module script in your BCR fork: python3 tools/add_module.py\"\necho \"  Please enter the module name: rules_spring\"\necho \"  Please enter the module version: 2.6.2\"\necho \"  Please enter the compatibility level [default is 0]: 2\"\necho \"  Please enter the URL of the source archive: https://github.com/salesforce/rules_spring/releases/download/2.6.2/rules-spring-2.6.2.zip\"\necho \"  Please enter the strip_prefix value of the archive [default None]:\" \necho \"  Do you want to add patch files? [y/N]: n\"\necho \"  Do you want to add a BUILD file? [y/N]: n\"\necho \"  Do you want to specify a MODULE.bazel file? [y/N]: y\"\necho \"  Please enter the MODULE.bazel file path: ../../rules_spring/MODULE.bazel\"\necho \"  Do you want to specify an existing presubmit.yml file? y\"\necho \"  Please enter the presubmit.yml file path: modules/rules_spring/2.6.0/presubmit.yml\"\necho \"4. git add modules\"\necho \"5. submit a PR to BCR\"\necho \"\"\n\n"
  },
  {
    "path": "maven_install.json",
    "content": "{\n  \"__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY\": \"THERE_IS_NO_DATA_ONLY_ZUUL\",\n  \"__INPUT_ARTIFACTS_HASH\": 280632942,\n  \"__RESOLVED_ARTIFACTS_HASH\": 217268227,\n  \"conflict_resolution\": {\n    \"com.google.errorprone:error_prone_annotations:2.5.1\": \"com.google.errorprone:error_prone_annotations:2.18.0\",\n    \"org.assertj:assertj-core:3.25.3\": \"org.assertj:assertj-core:3.26.3\",\n    \"org.mockito:mockito-core:4.3.1\": \"org.mockito:mockito-core:5.14.2\"\n  },\n  \"artifacts\": {\n    \"biz.aQute.bnd:biz.aQute.bnd.util\": {\n      \"shasums\": {\n        \"jar\": \"65b5bd4a0fab16812f1800c98ff74a038f37a38bfe899af382efed4efdc1e3e1\"\n      },\n      \"version\": \"6.4.0\"\n    },\n    \"biz.aQute.bnd:biz.aQute.bndlib\": {\n      \"shasums\": {\n        \"jar\": \"357145074872f9dbf67e629fcd237e6152707e575d735df4535282f9f588d2d8\"\n      },\n      \"version\": \"6.4.0\"\n    },\n    \"ch.qos.logback:logback-classic\": {\n      \"shasums\": {\n        \"jar\": \"3e1533d0321f8815eef46750aee0111b41554f9a4644c3c4d2d404744b09f60f\"\n      },\n      \"version\": \"1.5.18\"\n    },\n    \"ch.qos.logback:logback-core\": {\n      \"shasums\": {\n        \"jar\": \"85139e7b57b464f8e5e36326dd81317648bed199ccc4f98cd42585f8d7571027\"\n      },\n      \"version\": \"1.5.18\"\n    },\n    \"com.fasterxml.jackson.core:jackson-annotations\": {\n      \"shasums\": {\n        \"jar\": \"8aa5740d80b5a5025508b41bbadbaa1fb3772267c628b2e30681a4f45f8b8931\"\n      },\n      \"version\": \"2.18.3\"\n    },\n    \"com.fasterxml.jackson.core:jackson-core\": {\n      \"shasums\": {\n        \"jar\": \"056bc4d3e5e53ce821450fa97b3f9e0f8dde125cf6da6884353bb1f09582e1d9\"\n      },\n      \"version\": \"2.18.3\"\n    },\n    \"com.fasterxml.jackson.core:jackson-databind\": {\n      \"shasums\": {\n        \"jar\": \"510bdda75a7a6186c5bf33b851239488a1450906ae5757121f2e1cc48a7e108f\"\n      },\n      \"version\": \"2.18.3\"\n    },\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\": {\n      \"shasums\": {\n        \"jar\": \"1f517af91ace54150525cdb30a012fca19a536194564756f580c21acfc7e04a0\"\n      },\n      \"version\": \"2.18.3\"\n    },\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\": {\n      \"shasums\": {\n        \"jar\": \"2e1df2feb93683d379969ceaf78b76a0ac115c67d04671958fddf4eed6e6401d\"\n      },\n      \"version\": \"2.18.3\"\n    },\n    \"com.fasterxml.jackson.module:jackson-module-parameter-names\": {\n      \"shasums\": {\n        \"jar\": \"3797241e299fcde9be2bf5f3a52ac61b66f749e7157478f5b246eb597e962c26\"\n      },\n      \"version\": \"2.18.3\"\n    },\n    \"com.google.auto.value:auto-value-annotations\": {\n      \"shasums\": {\n        \"jar\": \"37ec09b47d7ed35a99d13927db5c86fc9071f620f943ead5d757144698310852\"\n      },\n      \"version\": \"1.8.1\"\n    },\n    \"com.google.caliper:caliper\": {\n      \"shasums\": {\n        \"jar\": \"d54e1bfdbe9359a79e175c217b8d472555cf20da9c5c0a18bdb1ea7db979ed8e\"\n      },\n      \"version\": \"1.0-beta-3\"\n    },\n    \"com.google.caliper:caliper-api\": {\n      \"shasums\": {\n        \"jar\": \"374f0c6c0c1f8784cb69d885e1dcbb7498c34ca20369e0597264568530642928\"\n      },\n      \"version\": \"1.0-beta-3\"\n    },\n    \"com.google.caliper:caliper-core\": {\n      \"shasums\": {\n        \"jar\": \"514deac8f8b09dd4262733e0a4406a333208c899dc7ea726b03600b9bb94f192\"\n      },\n      \"version\": \"1.0-beta-3\"\n    },\n    \"com.google.caliper:caliper-runner\": {\n      \"shasums\": {\n        \"jar\": \"3ab58890aa01343361adedf859500d280f67813df0cedfcd165b169533b9b1fa\"\n      },\n      \"version\": \"1.0-beta-3\"\n    },\n    \"com.google.caliper:caliper-util\": {\n      \"shasums\": {\n        \"jar\": \"6e9af500c7020450dfdb5003d09501d512d395f431c54c7ee8f79e712463fe66\"\n      },\n      \"version\": \"1.0-beta-3\"\n    },\n    \"com.google.caliper:caliper-worker\": {\n      \"shasums\": {\n        \"jar\": \"315d8e51df1f60551645a0e3bf2c504d2c79762f688e6f728eb9d1d9cd9a491b\"\n      },\n      \"version\": \"1.0-beta-3\"\n    },\n    \"com.google.caliper:caliper-worker-jvm\": {\n      \"shasums\": {\n        \"jar\": \"e14e1ecfdf939c82abdb902105be41ff3f83c18cb968116232015f2662d065a4\"\n      },\n      \"version\": \"1.0-beta-3\"\n    },\n    \"com.google.code.findbugs:jsr305\": {\n      \"shasums\": {\n        \"jar\": \"766ad2a0783f2687962c8ad74ceecc38a28b9f72a2d085ee438b7813e928d0c7\"\n      },\n      \"version\": \"3.0.2\"\n    },\n    \"com.google.code.gson:gson\": {\n      \"shasums\": {\n        \"jar\": \"d3999291855de495c94c743761b8ab5176cfeabe281a5ab0d8e8d45326fd703e\"\n      },\n      \"version\": \"2.8.9\"\n    },\n    \"com.google.code.java-allocation-instrumenter:java-allocation-instrumenter\": {\n      \"shasums\": {\n        \"jar\": \"1ef5535a8bd41cf3072469f381b9ee6ab28275311a7499f53d6e52adf976fef0\"\n      },\n      \"version\": \"3.3.0\"\n    },\n    \"com.google.dagger:dagger\": {\n      \"shasums\": {\n        \"jar\": \"329d4340f24c4f5717af016c097e90668bfea2a5376e6aa9964b01cef3fd241a\"\n      },\n      \"version\": \"2.22.1\"\n    },\n    \"com.google.dagger:dagger-producers\": {\n      \"shasums\": {\n        \"jar\": \"f834a0082014213a68ff06a0f048d750178d02196c58b0b15beb367d32b97e35\"\n      },\n      \"version\": \"2.22.1\"\n    },\n    \"com.google.errorprone:error_prone_annotations\": {\n      \"shasums\": {\n        \"jar\": \"9e6814cb71816988a4fd1b07a993a8f21bb7058d522c162b1de849e19bea54ae\"\n      },\n      \"version\": \"2.18.0\"\n    },\n    \"com.google.guava:failureaccess\": {\n      \"shasums\": {\n        \"jar\": \"a171ee4c734dd2da837e4b16be9df4661afab72a41adaf31eb84dfdaf936ca26\"\n      },\n      \"version\": \"1.0.1\"\n    },\n    \"com.google.guava:guava\": {\n      \"shasums\": {\n        \"jar\": \"bd7fa227591fb8509677d0d1122cf95158f3b8a9f45653f58281d879f6dc48c5\"\n      },\n      \"version\": \"32.0.1-jre\"\n    },\n    \"com.google.guava:guava-testlib\": {\n      \"shasums\": {\n        \"jar\": \"c97511849a5e085280f106df2b059566febd280b118d33d6a9e068d238100b63\"\n      },\n      \"version\": \"32.0.1-jre\"\n    },\n    \"com.google.guava:listenablefuture\": {\n      \"shasums\": {\n        \"jar\": \"b372a037d4230aa57fbeffdef30fd6123f9c0c2db85d0aced00c91b974f33f99\"\n      },\n      \"version\": \"9999.0-empty-to-avoid-conflict-with-guava\"\n    },\n    \"com.google.j2objc:j2objc-annotations\": {\n      \"shasums\": {\n        \"jar\": \"f02a95fa1a5e95edb3ed859fd0fb7df709d121a35290eff8b74dce2ab7f4d6ed\"\n      },\n      \"version\": \"2.8\"\n    },\n    \"com.google.truth:truth\": {\n      \"shasums\": {\n        \"jar\": \"a85e03b8b6ae8780f060cfded9500a3d1b5f52808f99a2ea6da9c683313c7518\"\n      },\n      \"version\": \"1.1.2\"\n    },\n    \"com.jayway.jsonpath:json-path\": {\n      \"shasums\": {\n        \"jar\": \"11a9ee6f88bb31f1450108d1cf6441377dec84aca075eb6bb2343be157575bea\"\n      },\n      \"version\": \"2.9.0\"\n    },\n    \"com.squareup.okhttp:okhttp\": {\n      \"shasums\": {\n        \"jar\": \"88ac9fd1bb51f82bcc664cc1eb9c225c90dc4389d660231b4cc737bebfe7d0aa\"\n      },\n      \"version\": \"2.7.5\"\n    },\n    \"com.squareup.okio:okio\": {\n      \"shasums\": {\n        \"jar\": \"114bdc1f47338a68bcbc95abf2f5cdc72beeec91812f2fcd7b521c1937876266\"\n      },\n      \"version\": \"1.6.0\"\n    },\n    \"com.sun.jersey:jersey-client\": {\n      \"shasums\": {\n        \"jar\": \"639c825c5db580f8115bf49ffc893093526d2ed1079fbc929b6a5fbd0b2eda40\"\n      },\n      \"version\": \"1.19.4\"\n    },\n    \"com.sun.jersey:jersey-core\": {\n      \"shasums\": {\n        \"jar\": \"64b03198e0264849d0fc341857ebcc9c882b1909a2dc35a0972fe7d901b826e5\"\n      },\n      \"version\": \"1.19.4\"\n    },\n    \"com.vaadin.external.google:android-json\": {\n      \"shasums\": {\n        \"jar\": \"dfb7bae2f404cfe0b72b4d23944698cb716b7665171812a0a4d0f5926c0fac79\"\n      },\n      \"version\": \"0.0.20131108.vaadin1\"\n    },\n    \"com.zaxxer:HikariCP\": {\n      \"shasums\": {\n        \"jar\": \"a47a6ee62379694ee52c30036f0931b72f9aee2a801d590341ed82bd839e2134\"\n      },\n      \"version\": \"5.1.0\"\n    },\n    \"info.picocli:picocli\": {\n      \"shasums\": {\n        \"jar\": \"b0a5159e926de8084ff066025142270443533656bc599b8bb31d14d11fd138a4\"\n      },\n      \"version\": \"4.6.3\"\n    },\n    \"io.micrometer:micrometer-commons\": {\n      \"shasums\": {\n        \"jar\": \"e98485ffecb7d8cc9af47cfe627ea8bf3897915dd0f34b3e3a190d6896875b4b\"\n      },\n      \"version\": \"1.14.5\"\n    },\n    \"io.micrometer:micrometer-core\": {\n      \"shasums\": {\n        \"jar\": \"7c0c55ef7fe1bef5b89453655e768ee05fd35b381bd67f9d42cfe48362174ca5\"\n      },\n      \"version\": \"1.14.5\"\n    },\n    \"io.micrometer:micrometer-jakarta9\": {\n      \"shasums\": {\n        \"jar\": \"08c0e061df58583ae11b4b0ec664f0205e43dbb16ccd41571cf068269823803a\"\n      },\n      \"version\": \"1.14.5\"\n    },\n    \"io.micrometer:micrometer-observation\": {\n      \"shasums\": {\n        \"jar\": \"7cfbf714abdf3779c820ff19712199ac9bae03d2f0e809ba8e74c3663c12128a\"\n      },\n      \"version\": \"1.14.5\"\n    },\n    \"jakarta.activation:jakarta.activation-api\": {\n      \"shasums\": {\n        \"jar\": \"01b176d718a169263e78290691fc479977186bcc6b333487325084d6586f4627\"\n      },\n      \"version\": \"2.1.3\"\n    },\n    \"jakarta.annotation:jakarta.annotation-api\": {\n      \"shasums\": {\n        \"jar\": \"5f65fdaf424eee2b55e1d882ba9bb376be93fb09b37b808be6e22e8851c909fe\"\n      },\n      \"version\": \"2.1.1\"\n    },\n    \"jakarta.enterprise:jakarta.enterprise.cdi-api\": {\n      \"shasums\": {\n        \"jar\": \"beaf74c4f2618189309e3f4a09c43effab633dd96aa1f6dc58a6ba7ee0042717\"\n      },\n      \"version\": \"4.0.1\"\n    },\n    \"jakarta.enterprise:jakarta.enterprise.lang-model\": {\n      \"shasums\": {\n        \"jar\": \"53acafe65b6ef0195fa1b8a0ef2650e5aa024c32cb4059c4df372d6b32089cd3\"\n      },\n      \"version\": \"4.0.1\"\n    },\n    \"jakarta.inject:jakarta.inject-api\": {\n      \"shasums\": {\n        \"jar\": \"f7dc98062fccf14126abb751b64fab12c312566e8cbdc8483598bffcea93af7c\"\n      },\n      \"version\": \"2.0.1\"\n    },\n    \"jakarta.interceptor:jakarta.interceptor-api\": {\n      \"shasums\": {\n        \"jar\": \"ef787d3f713fc6ff4f02cd4b0dbed08f93d8af3400c90cbb43fb4b5c0583710b\"\n      },\n      \"version\": \"2.1.0\"\n    },\n    \"jakarta.servlet:jakarta.servlet-api\": {\n      \"shasums\": {\n        \"jar\": \"c034eb1afb158987dbb53a5fea0cadf611c8dae8daadd59c44d9d5ab70129cef\"\n      },\n      \"version\": \"6.0.0\"\n    },\n    \"jakarta.transaction:jakarta.transaction-api\": {\n      \"shasums\": {\n        \"jar\": \"50c0a7c760c13ae6c042acf182b28f0047413db95b4636fb8879bcffab5ba875\"\n      },\n      \"version\": \"2.0.1\"\n    },\n    \"jakarta.websocket:jakarta.websocket-api\": {\n      \"shasums\": {\n        \"jar\": \"beadb92c26d04da653f6d2db2532b549b7a0dbe59c6e22c23e55bd03617f0120\"\n      },\n      \"version\": \"2.1.1\"\n    },\n    \"jakarta.websocket:jakarta.websocket-client-api\": {\n      \"shasums\": {\n        \"jar\": \"e8fe8c1dff948385a461dbc85dec5467cbe350f065ec1a0f3bfed53b79e7b102\"\n      },\n      \"version\": \"2.1.1\"\n    },\n    \"jakarta.xml.bind:jakarta.xml.bind-api\": {\n      \"shasums\": {\n        \"jar\": \"0d6bcfe47763e85047acf7c398336dc84ff85ebcad0a7cb6f3b9d3e981245406\"\n      },\n      \"version\": \"4.0.2\"\n    },\n    \"javax.annotation:javax.annotation-api\": {\n      \"shasums\": {\n        \"jar\": \"e04ba5195bcd555dc95650f7cc614d151e4bcd52d29a10b8aa2197f3ab89ab9b\"\n      },\n      \"version\": \"1.3.2\"\n    },\n    \"javax.inject:javax.inject\": {\n      \"shasums\": {\n        \"jar\": \"91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff\"\n      },\n      \"version\": \"1\"\n    },\n    \"javax.ws.rs:jsr311-api\": {\n      \"shasums\": {\n        \"jar\": \"ab1534b73b5fa055808e6598a5e73b599ccda28c3159c3c0908977809422ee4a\"\n      },\n      \"version\": \"1.1.1\"\n    },\n    \"joda-time:joda-time\": {\n      \"shasums\": {\n        \"jar\": \"dd8e7c92185a678d1b7b933f31209b6203c8ffa91e9880475a1be0346b9617e3\"\n      },\n      \"version\": \"2.10.10\"\n    },\n    \"junit:junit\": {\n      \"shasums\": {\n        \"jar\": \"8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3\"\n      },\n      \"version\": \"4.13.2\"\n    },\n    \"net.bytebuddy:byte-buddy\": {\n      \"shasums\": {\n        \"jar\": \"4a683d83ff219f20d44f35ca302d821e0c6842e3fa8f9f1ee913eb16f49cec6c\"\n      },\n      \"version\": \"1.15.4\"\n    },\n    \"net.bytebuddy:byte-buddy-agent\": {\n      \"shasums\": {\n        \"jar\": \"1d76defd159a564b9cb7a968d0dea27367b8b70ebde75a968e7ef1921bc75ee4\"\n      },\n      \"version\": \"1.15.4\"\n    },\n    \"net.minidev:accessors-smart\": {\n      \"shasums\": {\n        \"jar\": \"9b8a7bc43861d6156c021166d941fb7dddbe4463e2fa5ee88077e4b01452a836\"\n      },\n      \"version\": \"2.5.2\"\n    },\n    \"net.minidev:json-smart\": {\n      \"shasums\": {\n        \"jar\": \"4fbdedb0105cedc7f766b95c297d2e88fb6a560da48f3bbaa0cc538ea8b7bf71\"\n      },\n      \"version\": \"2.5.2\"\n    },\n    \"org.apache.commons:commons-compress\": {\n      \"shasums\": {\n        \"jar\": \"d0ec8014ebbb0749f471803122b21796afddf2e98e194e4374622e5fbaf69f49\"\n      },\n      \"version\": \"1.25.0\"\n    },\n    \"org.apache.logging.log4j:log4j-api\": {\n      \"shasums\": {\n        \"jar\": \"5b4a0a0cd0e751ded431c162442bdbdd53328d1f8bb2bae5fc1bbeee0f66d80f\"\n      },\n      \"version\": \"2.24.3\"\n    },\n    \"org.apache.logging.log4j:log4j-to-slf4j\": {\n      \"shasums\": {\n        \"jar\": \"c7f2b0c612a4eb05b1587d1c880eb4cf5f4f53850676a8ede8da2b8fabb4f73f\"\n      },\n      \"version\": \"2.24.3\"\n    },\n    \"org.apache.tomcat.embed:tomcat-embed-core\": {\n      \"shasums\": {\n        \"jar\": \"1a488786e23293aef05c12c14d375b6649e85a312f8d1db23d9274196b7b0eb5\"\n      },\n      \"version\": \"10.1.39\"\n    },\n    \"org.apache.tomcat.embed:tomcat-embed-el\": {\n      \"shasums\": {\n        \"jar\": \"de993a5a8af0b6ca6473ba59b95026d7ded93de3a1683d9fb7753b7b76d38ee7\"\n      },\n      \"version\": \"10.1.39\"\n    },\n    \"org.apache.tomcat.embed:tomcat-embed-websocket\": {\n      \"shasums\": {\n        \"jar\": \"3b4fb77c4df8c523ec631a817936c4dff152386d4451090f03cb18425bfd8aaf\"\n      },\n      \"version\": \"10.1.39\"\n    },\n    \"org.apiguardian:apiguardian-api\": {\n      \"shasums\": {\n        \"jar\": \"b509448ac506d607319f182537f0b35d71007582ec741832a1f111e5b5b70b38\"\n      },\n      \"version\": \"1.1.2\"\n    },\n    \"org.aspectj:aspectjweaver\": {\n      \"shasums\": {\n        \"jar\": \"cd2dd01ec2424c05669df4d557f6c6cd7ed87b05257ee3c866b4c5b116b18a78\"\n      },\n      \"version\": \"1.9.22.1\"\n    },\n    \"org.assertj:assertj-core\": {\n      \"shasums\": {\n        \"jar\": \"4c2f86418ff47ee6b67fbc6adb194e80219b793281b3bda28799d4425bc9a0bd\"\n      },\n      \"version\": \"3.26.3\"\n    },\n    \"org.attoparser:attoparser\": {\n      \"shasums\": {\n        \"jar\": \"75dd1c045492bff8e1963aabb28bfe903c2064e11e27fe2f0f0aff1ad3d84476\"\n      },\n      \"version\": \"2.0.7.RELEASE\"\n    },\n    \"org.awaitility:awaitility\": {\n      \"shasums\": {\n        \"jar\": \"e831fee30ed401e2208f1bd5a0ef9add538d9cb1103c0e43216691b647bde9c6\"\n      },\n      \"version\": \"4.2.2\"\n    },\n    \"org.checkerframework:checker-compat-qual\": {\n      \"shasums\": {\n        \"jar\": \"d76b9afea61c7c082908023f0cbc1427fab9abd2df915c8b8a3e7a509bccbc6d\"\n      },\n      \"version\": \"2.5.3\"\n    },\n    \"org.checkerframework:checker-qual\": {\n      \"shasums\": {\n        \"jar\": \"e316255bbfcd9fe50d165314b85abb2b33cb2a66a93c491db648e498a82c2de1\"\n      },\n      \"version\": \"3.33.0\"\n    },\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client\": {\n      \"shasums\": {\n        \"jar\": \"39ae38c9557fe7caaa1f1bc4d17ceb2371c2c22e04142e2b6a0fb885256c7f51\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common\": {\n      \"shasums\": {\n        \"jar\": \"20bf9c4bcf43ce40f6f2279a67891a9302c4ee958d89b324a675aa8c2961aa02\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server\": {\n      \"shasums\": {\n        \"jar\": \"a295318242248d16b7efbeff99de2ce7b968af2b94032db3b1c56586ac78ecf4\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server\": {\n      \"shasums\": {\n        \"jar\": \"720ba8972ce908bb6f3346e7635337b73b23f1b1c96bfed6d8bf9f4f2fcd1b02\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet\": {\n      \"shasums\": {\n        \"jar\": \"c10bfd34b4042fdea16771520a2ac7a01e3394b483316e83432c8ea6c66c7f45\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.ee10:jetty-ee10-annotations\": {\n      \"shasums\": {\n        \"jar\": \"6ddfe086147eb648560c39cc6ec2daa2aa21a9783a521cc242145a9a5b0dde3b\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.ee10:jetty-ee10-plus\": {\n      \"shasums\": {\n        \"jar\": \"20e74b84e7f584795d1df246007bbf1229b35e6e3231b7678707b5969e9ef550\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.ee10:jetty-ee10-servlet\": {\n      \"shasums\": {\n        \"jar\": \"eaa998fd854d64fe161c822d21f0745986954db5c817ae7b83c3b13e94aa3e06\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.ee10:jetty-ee10-servlets\": {\n      \"shasums\": {\n        \"jar\": \"4adcaedb3a5dd75c55e345b04c457e24da293312563cd08474ef8d5a0b019d0d\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.ee10:jetty-ee10-webapp\": {\n      \"shasums\": {\n        \"jar\": \"c03115edb4a682bdb49ec8245f0acd7ecd25805caf2fbdd50eeac342d56af250\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.websocket:jetty-websocket-core-client\": {\n      \"shasums\": {\n        \"jar\": \"d67d396cdcb673d60742f80e42810b9193dd9f2aeec2692714acdeca7dfbe634\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.websocket:jetty-websocket-core-common\": {\n      \"shasums\": {\n        \"jar\": \"427ec242bc57c02638dd19c2c8d4bf66ebeea52ae58ad6d6a9b4013af88bb201\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.websocket:jetty-websocket-core-server\": {\n      \"shasums\": {\n        \"jar\": \"698163a545e21de0d6a330f0a082f81d4e96988703bea4881825fca4bd21d6f4\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.websocket:jetty-websocket-jetty-api\": {\n      \"shasums\": {\n        \"jar\": \"9ddc0de474bcc065b5cbb4682bb2f3a03f214e77268752c71f082a26683431ca\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty.websocket:jetty-websocket-jetty-common\": {\n      \"shasums\": {\n        \"jar\": \"0a0b71ddaed72b8f71c47fe37cceda1ebacfaae69020038d12ec75e2791b15ce\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-alpn-client\": {\n      \"shasums\": {\n        \"jar\": \"e43c7c5a4cbb605089835b4d73c094768af965eba4bff702f905fe1750bc3846\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-client\": {\n      \"shasums\": {\n        \"jar\": \"f061ea09047445a79177591f0103deff0e0bdf352027462f094cfe486f0ed30f\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-ee\": {\n      \"shasums\": {\n        \"jar\": \"c2698b929cd5a2d0122d5c9c6be5daaebbe3fbb8984e925882e277716a14806f\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-http\": {\n      \"shasums\": {\n        \"jar\": \"640cf950ebad1f88d5a96e46548a34ff8da418b6171e2bc2e30e73f49111b068\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-io\": {\n      \"shasums\": {\n        \"jar\": \"2528c3240b0615fd735ef67825ee7cd7a2f430e405fd57eed756377d2d0702a7\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-plus\": {\n      \"shasums\": {\n        \"jar\": \"adedbee25414d4f2b76f641b346c9799494e384b2e14f55df8273f48f90b6be0\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-security\": {\n      \"shasums\": {\n        \"jar\": \"e98507bf4c273b22ad7bf54910032d0948a9ba838529260f1b91a8d60c76b749\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-server\": {\n      \"shasums\": {\n        \"jar\": \"118c8f784ffcbf4a69e1018b871fd396cd4ec631fc6f764fe958beb091e50568\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-session\": {\n      \"shasums\": {\n        \"jar\": \"b69800641f1e9adc15940dbbf226506f4154f543a52a036268e5e298fab85f87\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-util\": {\n      \"shasums\": {\n        \"jar\": \"c4c9e7435f7f005a74f746d94952e148ec803356e20c99e6d46a52f896e1e413\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.eclipse.jetty:jetty-xml\": {\n      \"shasums\": {\n        \"jar\": \"4c228050d6a0e0fff22844bab9607d2f9093c39f6faea68dec53024448ab441c\"\n      },\n      \"version\": \"12.0.18\"\n    },\n    \"org.freemarker:freemarker\": {\n      \"shasums\": {\n        \"jar\": \"9a9fb91cd64199232eb1ca9766148a5d30ef8944be5fac051018f96c70c8f6a3\"\n      },\n      \"version\": \"2.3.34\"\n    },\n    \"org.hamcrest:hamcrest\": {\n      \"shasums\": {\n        \"jar\": \"5e62846a89f05cd78cd9c1a553f340d002458380c320455dd1f8fc5497a8a1c1\"\n      },\n      \"version\": \"2.2\"\n    },\n    \"org.hamcrest:hamcrest-core\": {\n      \"shasums\": {\n        \"jar\": \"094f5d92b4b7d9c8a2bf53cc69d356243ae89c3499457bcb4b92f7ed3bf95879\"\n      },\n      \"version\": \"2.2\"\n    },\n    \"org.hdrhistogram:HdrHistogram\": {\n      \"shasums\": {\n        \"jar\": \"22d1d4316c4ec13a68b559e98c8256d69071593731da96136640f864fa14fad8\"\n      },\n      \"version\": \"2.2.2\"\n    },\n    \"org.junit.jupiter:junit-jupiter\": {\n      \"shasums\": {\n        \"jar\": \"aa880e4afba87d447357e4c1fc098c5cb1d200cb9403496c00d3b35a5bd0e8db\"\n      },\n      \"version\": \"5.11.4\"\n    },\n    \"org.junit.jupiter:junit-jupiter-api\": {\n      \"shasums\": {\n        \"jar\": \"ab83ef9e51ac4597d59d26b4b58812129550e2f579a404c8af7d09f5ce5b4293\"\n      },\n      \"version\": \"5.11.4\"\n    },\n    \"org.junit.jupiter:junit-jupiter-engine\": {\n      \"shasums\": {\n        \"jar\": \"cdf8ac59f3fad774ca738ad03890950eeb91833ef0e8908753177edd26f1581c\"\n      },\n      \"version\": \"5.11.4\"\n    },\n    \"org.junit.jupiter:junit-jupiter-params\": {\n      \"shasums\": {\n        \"jar\": \"02a6e015de7ce94ac7f256e7fa05b8091dea861fe79a555a7993313d0f6c7d96\"\n      },\n      \"version\": \"5.11.4\"\n    },\n    \"org.junit.platform:junit-platform-commons\": {\n      \"shasums\": {\n        \"jar\": \"9edd969b0d0670c54105bc91ae79bd1c6f503e12115faba82073b84c86bbc334\"\n      },\n      \"version\": \"1.11.4\"\n    },\n    \"org.junit.platform:junit-platform-engine\": {\n      \"shasums\": {\n        \"jar\": \"b1dd998f64f9acadc15966d9cd3d08074662677b3e390f0a38fcbf0bb4c72330\"\n      },\n      \"version\": \"1.11.4\"\n    },\n    \"org.latencyutils:LatencyUtils\": {\n      \"shasums\": {\n        \"jar\": \"a32a9ffa06b2f4e01c5360f8f9df7bc5d9454a5d373cd8f361347fa5a57165ec\"\n      },\n      \"version\": \"2.0.3\"\n    },\n    \"org.mockito:mockito-core\": {\n      \"shasums\": {\n        \"jar\": \"2296141c1e1f2e1ae35c08d36a9ab4563ecd66e03533fe82630a764e7aa49182\"\n      },\n      \"version\": \"5.14.2\"\n    },\n    \"org.mockito:mockito-junit-jupiter\": {\n      \"shasums\": {\n        \"jar\": \"9a126e3bf6dd31826a138523c17f49de12b3243f3b5616b9ea977542e4a47a09\"\n      },\n      \"version\": \"5.14.2\"\n    },\n    \"org.objenesis:objenesis\": {\n      \"shasums\": {\n        \"jar\": \"02dfd0b0439a5591e35b708ed2f5474eb0948f53abf74637e959b8e4ef69bfeb\"\n      },\n      \"version\": \"3.3\"\n    },\n    \"org.opentest4j:opentest4j\": {\n      \"shasums\": {\n        \"jar\": \"48e2df636cab6563ced64dcdff8abb2355627cb236ef0bf37598682ddf742f1b\"\n      },\n      \"version\": \"1.3.0\"\n    },\n    \"org.osgi:org.osgi.dto\": {\n      \"shasums\": {\n        \"jar\": \"cb75f3c7e48e5a31a31df22e26873346f5bf659e2dcab2369e031e4850d2ff43\"\n      },\n      \"version\": \"1.0.0\"\n    },\n    \"org.osgi:org.osgi.framework\": {\n      \"shasums\": {\n        \"jar\": \"ec194b7871af27681716ff05259319a5c3c9b9727e8000e9e832499b93484b4e\"\n      },\n      \"version\": \"1.8.0\"\n    },\n    \"org.osgi:org.osgi.resource\": {\n      \"shasums\": {\n        \"jar\": \"81fc50f1f1d38a4af28e131907d4afe213249aab05060484edca0e60c4af9b4a\"\n      },\n      \"version\": \"1.0.0\"\n    },\n    \"org.osgi:org.osgi.service.log\": {\n      \"shasums\": {\n        \"jar\": \"ff6710c4856d32684cf3ebdc45248f41036ff734f2b03bbc08c4609a61fecfa0\"\n      },\n      \"version\": \"1.3.0\"\n    },\n    \"org.osgi:org.osgi.service.repository\": {\n      \"shasums\": {\n        \"jar\": \"c5553e95b459529192433486d4c4cc22ff45a2eae4968484f9f717319264a532\"\n      },\n      \"version\": \"1.1.0\"\n    },\n    \"org.osgi:org.osgi.util.function\": {\n      \"shasums\": {\n        \"jar\": \"208819c7c71690c15a6bb8b187474e7f9d0147946b680182a62b9f222ae014ec\"\n      },\n      \"version\": \"1.2.0\"\n    },\n    \"org.osgi:org.osgi.util.promise\": {\n      \"shasums\": {\n        \"jar\": \"fef86e64f584d012a16a0306160764f6179663b90988a226c4641b920f3a4b36\"\n      },\n      \"version\": \"1.2.0\"\n    },\n    \"org.osgi:org.osgi.util.tracker\": {\n      \"shasums\": {\n        \"jar\": \"7d78c2cc9bcb6421c24f17aa097866ce8d9115c219a4f8d6cc753bc4dfb97efa\"\n      },\n      \"version\": \"1.5.4\"\n    },\n    \"org.osgi:osgi.annotation\": {\n      \"shasums\": {\n        \"jar\": \"a0e8a4c362bd3600812f37b0ea45fba966c7bc049d01fed56a09ecc74082759e\"\n      },\n      \"version\": \"8.0.1\"\n    },\n    \"org.ow2.asm:asm\": {\n      \"shasums\": {\n        \"jar\": \"8cadd43ac5eb6d09de05faecca38b917a040bb9139c7edeb4cc81c740b713281\"\n      },\n      \"version\": \"9.7.1\"\n    },\n    \"org.ow2.asm:asm-analysis\": {\n      \"shasums\": {\n        \"jar\": \"be922aae60ff1ff1768e8e6544a38a7f92bd0a6d6b0b9791f94955d1bd453de2\"\n      },\n      \"version\": \"7.2\"\n    },\n    \"org.ow2.asm:asm-commons\": {\n      \"shasums\": {\n        \"jar\": \"9a579b54d292ad9be171d4313fd4739c635592c2b5ac3a459bbd1049cddec6a0\"\n      },\n      \"version\": \"9.7.1\"\n    },\n    \"org.ow2.asm:asm-tree\": {\n      \"shasums\": {\n        \"jar\": \"9929881f59eb6b840e86d54570c77b59ce721d104e6dfd7a40978991c2d3b41f\"\n      },\n      \"version\": \"9.7.1\"\n    },\n    \"org.ow2.asm:asm-util\": {\n      \"shasums\": {\n        \"jar\": \"6e24913b021ffacfe8e7e053d6e0ccc731941148cfa078d4f1ed3d96904530f8\"\n      },\n      \"version\": \"7.2\"\n    },\n    \"org.skyscreamer:jsonassert\": {\n      \"shasums\": {\n        \"jar\": \"719095c07d4203961320da593441d8b3b643c18eb1d81aa98ea933bb7eb351ba\"\n      },\n      \"version\": \"1.5.3\"\n    },\n    \"org.slf4j:jul-to-slf4j\": {\n      \"shasums\": {\n        \"jar\": \"a7afcd23b9cfd1475e55c94f943b808c5922035e7e2c2a5c65a487a4106bc538\"\n      },\n      \"version\": \"2.0.17\"\n    },\n    \"org.slf4j:slf4j-api\": {\n      \"shasums\": {\n        \"jar\": \"7b751d952061954d5abfed7181c1f645d336091b679891591d63329c622eb832\"\n      },\n      \"version\": \"2.0.17\"\n    },\n    \"org.springframework.boot:spring-boot\": {\n      \"shasums\": {\n        \"jar\": \"f134d42d19c1f707408e2ce6ace8d5887a9e7c3e50a351a75ada80afbbd6ecaf\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-actuator\": {\n      \"shasums\": {\n        \"jar\": \"94c1c6c9af96d4d2ca4af55b80c778b9750fcc63a378893f5873122b3b9c0dfc\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-actuator-autoconfigure\": {\n      \"shasums\": {\n        \"jar\": \"bed2fa189789b95d511ce1838dff9c041a34c93dac6f903c3a86959db033b7ac\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-autoconfigure\": {\n      \"shasums\": {\n        \"jar\": \"04a3b4f7c4e0ab39fb8b4dd77a2092ed5c036961133d278060af14455dc55d39\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-configuration-processor\": {\n      \"shasums\": {\n        \"jar\": \"b2db830eb773c97f7afe6b932af9b4cceded82ef44f7ef7da9855f63c1491791\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-jarmode-tools\": {\n      \"shasums\": {\n        \"jar\": \"c5e02a90aa82ef90a4770b75a6534dabee50702d1b7cefa38188a997f2308bdb\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-loader\": {\n      \"shasums\": {\n        \"jar\": \"55b6362f3b1c73b59f6b38d8fa6eca2cb576ee004650970c437e7b8f5c39c471\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-loader-tools\": {\n      \"shasums\": {\n        \"jar\": \"5b0d1f1c1d600f700c6d20b74c04f6e825b3f166ddd21b95d1930c04df9af5f7\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter\": {\n      \"shasums\": {\n        \"jar\": \"2fcdc0037fd1c0acebb4b1ef700818c97d8457fabc6d5bebc3878f584c1c727f\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-actuator\": {\n      \"shasums\": {\n        \"jar\": \"738e74d67afbeb229ead61d3e233477ee9b45f007789079a5afd7f839ba417cf\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-freemarker\": {\n      \"shasums\": {\n        \"jar\": \"c7bd38b5acbcaa51d3f1bdd5f994a0aa95271c041ff9d373235b9b192fe60f22\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-jdbc\": {\n      \"shasums\": {\n        \"jar\": \"170abba02cb4b7d5bbda965872d54d587ec1fa7cd0494337ba6a29440b744e58\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-jetty\": {\n      \"shasums\": {\n        \"jar\": \"8996a1b5038f95052515fe330e6769c0f4bde4de8b84d4b3a4039772ff134fa2\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-json\": {\n      \"shasums\": {\n        \"jar\": \"c92ddd6f7d109a517391a59c0d9d4f0256d5c5ba8db5d1af4710e0ca17fdf2c2\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-logging\": {\n      \"shasums\": {\n        \"jar\": \"1fcd1236a38b5eebc357527c058070669272b7b60c8394f887db882b4b47a240\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-security\": {\n      \"shasums\": {\n        \"jar\": \"796452c20a9a0b46ed721d6f32fd35daf84074e8e345cec8318ad1217d08e7f1\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-test\": {\n      \"shasums\": {\n        \"jar\": \"ef3e20f5cc7046ca4e79f5c756ff6a2b3d104acd43facf3e7cfefec7a15e8c08\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-thymeleaf\": {\n      \"shasums\": {\n        \"jar\": \"cb6cd3fe4392b50bf58ec8ac20b103bbf15a3fcc1fda4891fb298e269ba8c1ee\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-tomcat\": {\n      \"shasums\": {\n        \"jar\": \"fdae817f961cfc561af6f305895a2d334a3986bd4544d469e26a321814edff54\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-starter-web\": {\n      \"shasums\": {\n        \"jar\": \"c628b8d0d7c830c7ea3bc125950e11332b7ce3779ebd6d655f183e456ffe4481\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-test\": {\n      \"shasums\": {\n        \"jar\": \"bc69584886005c5607d89120fba3750bc689396c12586b6b917e21bd5bb92b15\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.boot:spring-boot-test-autoconfigure\": {\n      \"shasums\": {\n        \"jar\": \"89626caa8edf7d47de5a8b6988c20b89abf4d73a04640d40fba3ad944399113a\"\n      },\n      \"version\": \"3.4.4\"\n    },\n    \"org.springframework.security:spring-security-config\": {\n      \"shasums\": {\n        \"jar\": \"f13f2365b4af41b33e40af657014db773de858d84c74f34c9ada471c96f9c169\"\n      },\n      \"version\": \"6.4.4\"\n    },\n    \"org.springframework.security:spring-security-core\": {\n      \"shasums\": {\n        \"jar\": \"d9f7ca559ecadc0700555fc16cbd4c8bdfbbedd2474f5fd1f0c429bed946658d\"\n      },\n      \"version\": \"6.4.4\"\n    },\n    \"org.springframework.security:spring-security-crypto\": {\n      \"shasums\": {\n        \"jar\": \"62b3424be620e457146a51a3da9aa878ee9874667cd2498d73085a8394d36940\"\n      },\n      \"version\": \"6.4.4\"\n    },\n    \"org.springframework.security:spring-security-web\": {\n      \"shasums\": {\n        \"jar\": \"7705eec34c86607d3e2c81965d20584fa46819baf311aa3e9381deebbeceb9a4\"\n      },\n      \"version\": \"6.4.4\"\n    },\n    \"org.springframework:spring-aop\": {\n      \"shasums\": {\n        \"jar\": \"dfde58e5b277e12e464d5f0d7d60c49ce10c96da94aa32a196a8711467af7dd8\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-aspects\": {\n      \"shasums\": {\n        \"jar\": \"4f8ef69ffc4cb3d651596a00f53b29dc813e40e75523ed5213547e20b47d8d8d\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-beans\": {\n      \"shasums\": {\n        \"jar\": \"63f7ff64a72187d71c402f8c77c5fe6ba9d38e03465e4f9a601c3522265051d4\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-context\": {\n      \"shasums\": {\n        \"jar\": \"21941e0c9f23310c78403f35a624b27f3a1301f1ccf5de250d7478956e7bab51\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-context-support\": {\n      \"shasums\": {\n        \"jar\": \"93f2de3b6236dd82ea52f3f184c1c3bd49496162d87f06ddbc426058905fcda7\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-core\": {\n      \"shasums\": {\n        \"jar\": \"4cee02cf2d0227c1f1bfb97c2edc29d3af83b93c83d08b38e5987c3fa0fe4f1e\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-expression\": {\n      \"shasums\": {\n        \"jar\": \"ec76c41d4e45779b48ae10020322b32ecb2e2f4f2d930b0d93844a44490d76c5\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-jcl\": {\n      \"shasums\": {\n        \"jar\": \"4f93915fab10c14df3b90054cfd5d1c01a29def59b6e25c0f33d9eac4ffec079\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-jdbc\": {\n      \"shasums\": {\n        \"jar\": \"2268b0a2fb0877f47677f6ea67f283d972b9591f4cd28d63719a3dfbabcd0a2d\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-test\": {\n      \"shasums\": {\n        \"jar\": \"5585586296cf9778d8d027971b529746561e0d9b2953d00956b27a1f5b1f0d7e\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-tx\": {\n      \"shasums\": {\n        \"jar\": \"a0fc4f275e04cf1b31dde8b5348e10ed03372cd734c6e3d14e0863263794a9e0\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-web\": {\n      \"shasums\": {\n        \"jar\": \"85f0c1acaf033a5f7abdcaf348f1dd2cebe1f77687ee77f05e8cb66bfbc6fecf\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.springframework:spring-webmvc\": {\n      \"shasums\": {\n        \"jar\": \"b8d281aedf1e9cbf73bb2c6cf72d3eaf811f9298b2dc5017e9c40b3cb9284b46\"\n      },\n      \"version\": \"6.2.5\"\n    },\n    \"org.thymeleaf:thymeleaf\": {\n      \"shasums\": {\n        \"jar\": \"165ef16cd71020c4d572e77d73cf7baffd431f3f3e8c1d84b410de23dc79f92c\"\n      },\n      \"version\": \"3.1.3.RELEASE\"\n    },\n    \"org.thymeleaf:thymeleaf-spring6\": {\n      \"shasums\": {\n        \"jar\": \"79c7f0897008831e9cf87315c8ca452e5ea95d32cbf04648dc11f9e6bad0a50e\"\n      },\n      \"version\": \"3.1.3.RELEASE\"\n    },\n    \"org.unbescape:unbescape\": {\n      \"shasums\": {\n        \"jar\": \"597cf87d5b1a4f385b9d1cec974b7b483abb3ee85fc5b3f8b62af8e4bec95c2c\"\n      },\n      \"version\": \"1.1.6.RELEASE\"\n    },\n    \"org.xmlunit:xmlunit-core\": {\n      \"shasums\": {\n        \"jar\": \"3f89b0a629d3d9cca66e15f8dde5e0947852fa44172bc77ea26edf96e3e4fcf8\"\n      },\n      \"version\": \"2.10.0\"\n    },\n    \"org.yaml:snakeyaml\": {\n      \"shasums\": {\n        \"jar\": \"63a76fe66b652360bd4c2c107e6f0258daa7d4bb492008ba8c26fcd230ff9146\"\n      },\n      \"version\": \"2.3\"\n    }\n  },\n  \"dependencies\": {\n    \"biz.aQute.bnd:biz.aQute.bndlib\": [\n      \"biz.aQute.bnd:biz.aQute.bnd.util\",\n      \"org.osgi:org.osgi.dto\",\n      \"org.osgi:org.osgi.framework\",\n      \"org.osgi:org.osgi.resource\",\n      \"org.osgi:org.osgi.service.log\",\n      \"org.osgi:org.osgi.service.repository\",\n      \"org.osgi:org.osgi.util.function\",\n      \"org.osgi:org.osgi.util.promise\",\n      \"org.osgi:org.osgi.util.tracker\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"ch.qos.logback:logback-classic\": [\n      \"ch.qos.logback:logback-core\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"com.fasterxml.jackson.core:jackson-databind\": [\n      \"com.fasterxml.jackson.core:jackson-annotations\",\n      \"com.fasterxml.jackson.core:jackson-core\"\n    ],\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\": [\n      \"com.fasterxml.jackson.core:jackson-core\",\n      \"com.fasterxml.jackson.core:jackson-databind\"\n    ],\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\": [\n      \"com.fasterxml.jackson.core:jackson-annotations\",\n      \"com.fasterxml.jackson.core:jackson-core\",\n      \"com.fasterxml.jackson.core:jackson-databind\"\n    ],\n    \"com.fasterxml.jackson.module:jackson-module-parameter-names\": [\n      \"com.fasterxml.jackson.core:jackson-core\",\n      \"com.fasterxml.jackson.core:jackson-databind\"\n    ],\n    \"com.google.caliper:caliper\": [\n      \"com.google.caliper:caliper-core\",\n      \"com.google.caliper:caliper-runner\",\n      \"com.google.caliper:caliper-worker-jvm\",\n      \"com.google.code.java-allocation-instrumenter:java-allocation-instrumenter\",\n      \"com.google.dagger:dagger\",\n      \"com.google.guava:guava\",\n      \"com.sun.jersey:jersey-client\"\n    ],\n    \"com.google.caliper:caliper-api\": [\n      \"com.google.guava:guava\",\n      \"joda-time:joda-time\"\n    ],\n    \"com.google.caliper:caliper-core\": [\n      \"com.google.auto.value:auto-value-annotations\",\n      \"com.google.caliper:caliper-api\",\n      \"com.google.caliper:caliper-util\",\n      \"com.google.dagger:dagger\",\n      \"com.google.guava:guava\",\n      \"com.squareup.okhttp:okhttp\",\n      \"joda-time:joda-time\"\n    ],\n    \"com.google.caliper:caliper-runner\": [\n      \"com.google.caliper:caliper-api\",\n      \"com.google.caliper:caliper-core\",\n      \"com.google.caliper:caliper-util\",\n      \"com.google.dagger:dagger\",\n      \"com.google.dagger:dagger-producers\",\n      \"com.google.guava:guava\",\n      \"com.squareup.okhttp:okhttp\",\n      \"joda-time:joda-time\"\n    ],\n    \"com.google.caliper:caliper-util\": [\n      \"com.google.code.gson:gson\",\n      \"com.google.dagger:dagger\",\n      \"com.google.guava:guava\",\n      \"joda-time:joda-time\"\n    ],\n    \"com.google.caliper:caliper-worker\": [\n      \"com.google.caliper:caliper-api\",\n      \"com.google.caliper:caliper-core\",\n      \"com.google.caliper:caliper-util\",\n      \"com.google.dagger:dagger\",\n      \"com.google.guava:guava\",\n      \"com.squareup.okhttp:okhttp\",\n      \"joda-time:joda-time\"\n    ],\n    \"com.google.caliper:caliper-worker-jvm\": [\n      \"com.google.caliper:caliper-core\",\n      \"com.google.caliper:caliper-worker\",\n      \"com.google.code.java-allocation-instrumenter:java-allocation-instrumenter\",\n      \"com.google.dagger:dagger\",\n      \"com.google.guava:guava\",\n      \"com.sun.jersey:jersey-client\"\n    ],\n    \"com.google.code.java-allocation-instrumenter:java-allocation-instrumenter\": [\n      \"com.google.guava:guava\",\n      \"javax.annotation:javax.annotation-api\",\n      \"org.ow2.asm:asm\",\n      \"org.ow2.asm:asm-analysis\",\n      \"org.ow2.asm:asm-commons\",\n      \"org.ow2.asm:asm-tree\",\n      \"org.ow2.asm:asm-util\"\n    ],\n    \"com.google.dagger:dagger\": [\n      \"javax.inject:javax.inject\"\n    ],\n    \"com.google.dagger:dagger-producers\": [\n      \"com.google.dagger:dagger\",\n      \"com.google.guava:guava\",\n      \"javax.inject:javax.inject\",\n      \"org.checkerframework:checker-compat-qual\"\n    ],\n    \"com.google.guava:guava\": [\n      \"com.google.code.findbugs:jsr305\",\n      \"com.google.errorprone:error_prone_annotations\",\n      \"com.google.guava:failureaccess\",\n      \"com.google.guava:listenablefuture\",\n      \"com.google.j2objc:j2objc-annotations\",\n      \"org.checkerframework:checker-qual\"\n    ],\n    \"com.google.guava:guava-testlib\": [\n      \"com.google.code.findbugs:jsr305\",\n      \"com.google.errorprone:error_prone_annotations\",\n      \"com.google.guava:guava\",\n      \"com.google.j2objc:j2objc-annotations\",\n      \"junit:junit\",\n      \"org.checkerframework:checker-qual\"\n    ],\n    \"com.google.truth:truth\": [\n      \"com.google.auto.value:auto-value-annotations\",\n      \"com.google.errorprone:error_prone_annotations\",\n      \"com.google.guava:guava\",\n      \"junit:junit\",\n      \"org.checkerframework:checker-qual\",\n      \"org.ow2.asm:asm\"\n    ],\n    \"com.jayway.jsonpath:json-path\": [\n      \"net.minidev:json-smart\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"com.squareup.okhttp:okhttp\": [\n      \"com.squareup.okio:okio\"\n    ],\n    \"com.sun.jersey:jersey-client\": [\n      \"com.sun.jersey:jersey-core\"\n    ],\n    \"com.sun.jersey:jersey-core\": [\n      \"javax.ws.rs:jsr311-api\"\n    ],\n    \"com.zaxxer:HikariCP\": [\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"io.micrometer:micrometer-core\": [\n      \"io.micrometer:micrometer-commons\",\n      \"io.micrometer:micrometer-observation\",\n      \"org.hdrhistogram:HdrHistogram\",\n      \"org.latencyutils:LatencyUtils\"\n    ],\n    \"io.micrometer:micrometer-jakarta9\": [\n      \"io.micrometer:micrometer-commons\",\n      \"io.micrometer:micrometer-core\",\n      \"io.micrometer:micrometer-observation\"\n    ],\n    \"io.micrometer:micrometer-observation\": [\n      \"io.micrometer:micrometer-commons\"\n    ],\n    \"jakarta.enterprise:jakarta.enterprise.cdi-api\": [\n      \"jakarta.annotation:jakarta.annotation-api\",\n      \"jakarta.enterprise:jakarta.enterprise.lang-model\",\n      \"jakarta.inject:jakarta.inject-api\",\n      \"jakarta.interceptor:jakarta.interceptor-api\"\n    ],\n    \"jakarta.interceptor:jakarta.interceptor-api\": [\n      \"jakarta.annotation:jakarta.annotation-api\"\n    ],\n    \"jakarta.xml.bind:jakarta.xml.bind-api\": [\n      \"jakarta.activation:jakarta.activation-api\"\n    ],\n    \"junit:junit\": [\n      \"org.hamcrest:hamcrest-core\"\n    ],\n    \"net.minidev:accessors-smart\": [\n      \"org.ow2.asm:asm\"\n    ],\n    \"net.minidev:json-smart\": [\n      \"net.minidev:accessors-smart\"\n    ],\n    \"org.apache.logging.log4j:log4j-to-slf4j\": [\n      \"org.apache.logging.log4j:log4j-api\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.apache.tomcat.embed:tomcat-embed-websocket\": [\n      \"org.apache.tomcat.embed:tomcat-embed-core\"\n    ],\n    \"org.assertj:assertj-core\": [\n      \"net.bytebuddy:byte-buddy\"\n    ],\n    \"org.awaitility:awaitility\": [\n      \"org.hamcrest:hamcrest\"\n    ],\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client\": [\n      \"jakarta.websocket:jakarta.websocket-api\",\n      \"jakarta.websocket:jakarta.websocket-client-api\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-core-client\",\n      \"org.eclipse.jetty:jetty-client\"\n    ],\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common\": [\n      \"jakarta.websocket:jakarta.websocket-api\",\n      \"jakarta.websocket:jakarta.websocket-client-api\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-core-client\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server\": [\n      \"jakarta.websocket:jakarta.websocket-api\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-annotations\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server\": [\n      \"jakarta.servlet:jakarta.servlet-api\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-annotations\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-servlet\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-jetty-api\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-jetty-common\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet\": [\n      \"org.eclipse.jetty.ee10:jetty-ee10-servlet\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-core-server\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty.ee10:jetty-ee10-annotations\": [\n      \"jakarta.annotation:jakarta.annotation-api\",\n      \"jakarta.servlet:jakarta.servlet-api\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-plus\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-webapp\",\n      \"org.ow2.asm:asm\",\n      \"org.ow2.asm:asm-commons\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty.ee10:jetty-ee10-plus\": [\n      \"jakarta.enterprise:jakarta.enterprise.cdi-api\",\n      \"jakarta.enterprise:jakarta.enterprise.lang-model\",\n      \"jakarta.interceptor:jakarta.interceptor-api\",\n      \"jakarta.transaction:jakarta.transaction-api\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-webapp\",\n      \"org.eclipse.jetty:jetty-plus\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty.ee10:jetty-ee10-servlet\": [\n      \"jakarta.servlet:jakarta.servlet-api\",\n      \"org.eclipse.jetty:jetty-security\",\n      \"org.eclipse.jetty:jetty-server\",\n      \"org.eclipse.jetty:jetty-session\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty.ee10:jetty-ee10-servlets\": [\n      \"org.eclipse.jetty:jetty-http\",\n      \"org.eclipse.jetty:jetty-io\",\n      \"org.eclipse.jetty:jetty-util\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty.ee10:jetty-ee10-webapp\": [\n      \"org.eclipse.jetty.ee10:jetty-ee10-servlet\",\n      \"org.eclipse.jetty:jetty-ee\",\n      \"org.eclipse.jetty:jetty-session\",\n      \"org.eclipse.jetty:jetty-xml\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty.websocket:jetty-websocket-core-client\": [\n      \"org.eclipse.jetty.websocket:jetty-websocket-core-common\",\n      \"org.eclipse.jetty:jetty-client\"\n    ],\n    \"org.eclipse.jetty.websocket:jetty-websocket-core-common\": [\n      \"org.eclipse.jetty:jetty-http\",\n      \"org.eclipse.jetty:jetty-io\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty.websocket:jetty-websocket-core-server\": [\n      \"org.eclipse.jetty.websocket:jetty-websocket-core-common\",\n      \"org.eclipse.jetty:jetty-server\"\n    ],\n    \"org.eclipse.jetty.websocket:jetty-websocket-jetty-common\": [\n      \"org.eclipse.jetty.websocket:jetty-websocket-core-common\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-jetty-api\"\n    ],\n    \"org.eclipse.jetty:jetty-alpn-client\": [\n      \"org.eclipse.jetty:jetty-io\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty:jetty-client\": [\n      \"org.eclipse.jetty:jetty-alpn-client\",\n      \"org.eclipse.jetty:jetty-http\",\n      \"org.eclipse.jetty:jetty-io\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty:jetty-ee\": [\n      \"org.eclipse.jetty:jetty-server\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty:jetty-http\": [\n      \"org.eclipse.jetty:jetty-io\",\n      \"org.eclipse.jetty:jetty-util\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty:jetty-io\": [\n      \"org.eclipse.jetty:jetty-util\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty:jetty-plus\": [\n      \"org.eclipse.jetty:jetty-security\",\n      \"org.eclipse.jetty:jetty-util\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty:jetty-security\": [\n      \"org.eclipse.jetty:jetty-server\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty:jetty-server\": [\n      \"org.eclipse.jetty:jetty-http\",\n      \"org.eclipse.jetty:jetty-io\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty:jetty-session\": [\n      \"org.eclipse.jetty:jetty-server\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty:jetty-util\": [\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.eclipse.jetty:jetty-xml\": [\n      \"org.eclipse.jetty:jetty-util\",\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.hamcrest:hamcrest-core\": [\n      \"org.hamcrest:hamcrest\"\n    ],\n    \"org.junit.jupiter:junit-jupiter\": [\n      \"org.junit.jupiter:junit-jupiter-api\",\n      \"org.junit.jupiter:junit-jupiter-engine\",\n      \"org.junit.jupiter:junit-jupiter-params\"\n    ],\n    \"org.junit.jupiter:junit-jupiter-api\": [\n      \"org.apiguardian:apiguardian-api\",\n      \"org.junit.platform:junit-platform-commons\",\n      \"org.opentest4j:opentest4j\"\n    ],\n    \"org.junit.jupiter:junit-jupiter-engine\": [\n      \"org.apiguardian:apiguardian-api\",\n      \"org.junit.jupiter:junit-jupiter-api\",\n      \"org.junit.platform:junit-platform-engine\"\n    ],\n    \"org.junit.jupiter:junit-jupiter-params\": [\n      \"org.apiguardian:apiguardian-api\",\n      \"org.junit.jupiter:junit-jupiter-api\"\n    ],\n    \"org.junit.platform:junit-platform-commons\": [\n      \"org.apiguardian:apiguardian-api\"\n    ],\n    \"org.junit.platform:junit-platform-engine\": [\n      \"org.apiguardian:apiguardian-api\",\n      \"org.junit.platform:junit-platform-commons\",\n      \"org.opentest4j:opentest4j\"\n    ],\n    \"org.mockito:mockito-core\": [\n      \"net.bytebuddy:byte-buddy\",\n      \"net.bytebuddy:byte-buddy-agent\",\n      \"org.objenesis:objenesis\"\n    ],\n    \"org.mockito:mockito-junit-jupiter\": [\n      \"org.junit.jupiter:junit-jupiter-api\",\n      \"org.mockito:mockito-core\"\n    ],\n    \"org.osgi:org.osgi.util.function\": [\n      \"org.osgi:osgi.annotation\"\n    ],\n    \"org.osgi:org.osgi.util.promise\": [\n      \"org.osgi:org.osgi.util.function\",\n      \"org.osgi:osgi.annotation\"\n    ],\n    \"org.osgi:org.osgi.util.tracker\": [\n      \"org.osgi:osgi.annotation\"\n    ],\n    \"org.ow2.asm:asm-analysis\": [\n      \"org.ow2.asm:asm-tree\"\n    ],\n    \"org.ow2.asm:asm-commons\": [\n      \"org.ow2.asm:asm\",\n      \"org.ow2.asm:asm-tree\"\n    ],\n    \"org.ow2.asm:asm-tree\": [\n      \"org.ow2.asm:asm\"\n    ],\n    \"org.ow2.asm:asm-util\": [\n      \"org.ow2.asm:asm\",\n      \"org.ow2.asm:asm-analysis\",\n      \"org.ow2.asm:asm-tree\"\n    ],\n    \"org.skyscreamer:jsonassert\": [\n      \"com.vaadin.external.google:android-json\"\n    ],\n    \"org.slf4j:jul-to-slf4j\": [\n      \"org.slf4j:slf4j-api\"\n    ],\n    \"org.springframework.boot:spring-boot\": [\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework.boot:spring-boot-actuator\": [\n      \"org.springframework.boot:spring-boot\"\n    ],\n    \"org.springframework.boot:spring-boot-actuator-autoconfigure\": [\n      \"com.fasterxml.jackson.core:jackson-databind\",\n      \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\",\n      \"org.springframework.boot:spring-boot\",\n      \"org.springframework.boot:spring-boot-actuator\",\n      \"org.springframework.boot:spring-boot-autoconfigure\"\n    ],\n    \"org.springframework.boot:spring-boot-autoconfigure\": [\n      \"org.springframework.boot:spring-boot\"\n    ],\n    \"org.springframework.boot:spring-boot-jarmode-tools\": [\n      \"org.springframework.boot:spring-boot-loader\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework.boot:spring-boot-loader-tools\": [\n      \"org.apache.commons:commons-compress\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework.boot:spring-boot-starter\": [\n      \"jakarta.annotation:jakarta.annotation-api\",\n      \"org.springframework.boot:spring-boot\",\n      \"org.springframework.boot:spring-boot-autoconfigure\",\n      \"org.springframework.boot:spring-boot-starter-logging\",\n      \"org.springframework:spring-core\",\n      \"org.yaml:snakeyaml\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-actuator\": [\n      \"io.micrometer:micrometer-jakarta9\",\n      \"io.micrometer:micrometer-observation\",\n      \"org.springframework.boot:spring-boot-actuator-autoconfigure\",\n      \"org.springframework.boot:spring-boot-starter\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-freemarker\": [\n      \"org.freemarker:freemarker\",\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework:spring-context-support\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-jdbc\": [\n      \"com.zaxxer:HikariCP\",\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework:spring-jdbc\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-jetty\": [\n      \"jakarta.servlet:jakarta.servlet-api\",\n      \"jakarta.websocket:jakarta.websocket-api\",\n      \"jakarta.websocket:jakarta.websocket-client-api\",\n      \"org.apache.tomcat.embed:tomcat-embed-el\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-servlets\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-webapp\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-json\": [\n      \"com.fasterxml.jackson.core:jackson-databind\",\n      \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\",\n      \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\",\n      \"com.fasterxml.jackson.module:jackson-module-parameter-names\",\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework:spring-web\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-logging\": [\n      \"ch.qos.logback:logback-classic\",\n      \"org.apache.logging.log4j:log4j-to-slf4j\",\n      \"org.slf4j:jul-to-slf4j\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-security\": [\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework.security:spring-security-config\",\n      \"org.springframework.security:spring-security-web\",\n      \"org.springframework:spring-aop\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-test\": [\n      \"com.jayway.jsonpath:json-path\",\n      \"jakarta.xml.bind:jakarta.xml.bind-api\",\n      \"net.minidev:json-smart\",\n      \"org.assertj:assertj-core\",\n      \"org.awaitility:awaitility\",\n      \"org.hamcrest:hamcrest\",\n      \"org.junit.jupiter:junit-jupiter\",\n      \"org.mockito:mockito-core\",\n      \"org.mockito:mockito-junit-jupiter\",\n      \"org.skyscreamer:jsonassert\",\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework.boot:spring-boot-test\",\n      \"org.springframework.boot:spring-boot-test-autoconfigure\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-test\",\n      \"org.xmlunit:xmlunit-core\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-thymeleaf\": [\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.thymeleaf:thymeleaf-spring6\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-tomcat\": [\n      \"jakarta.annotation:jakarta.annotation-api\",\n      \"org.apache.tomcat.embed:tomcat-embed-core\",\n      \"org.apache.tomcat.embed:tomcat-embed-el\",\n      \"org.apache.tomcat.embed:tomcat-embed-websocket\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-web\": [\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework.boot:spring-boot-starter-json\",\n      \"org.springframework.boot:spring-boot-starter-tomcat\",\n      \"org.springframework:spring-web\",\n      \"org.springframework:spring-webmvc\"\n    ],\n    \"org.springframework.boot:spring-boot-test\": [\n      \"org.springframework.boot:spring-boot\",\n      \"org.springframework:spring-test\"\n    ],\n    \"org.springframework.boot:spring-boot-test-autoconfigure\": [\n      \"org.springframework.boot:spring-boot\",\n      \"org.springframework.boot:spring-boot-autoconfigure\",\n      \"org.springframework.boot:spring-boot-test\"\n    ],\n    \"org.springframework.security:spring-security-config\": [\n      \"org.springframework.security:spring-security-core\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework.security:spring-security-core\": [\n      \"io.micrometer:micrometer-observation\",\n      \"org.springframework.security:spring-security-crypto\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-expression\"\n    ],\n    \"org.springframework.security:spring-security-web\": [\n      \"org.springframework.security:spring-security-core\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-expression\",\n      \"org.springframework:spring-web\"\n    ],\n    \"org.springframework:spring-aop\": [\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-aspects\": [\n      \"org.aspectj:aspectjweaver\"\n    ],\n    \"org.springframework:spring-beans\": [\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-context\": [\n      \"io.micrometer:micrometer-observation\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-expression\"\n    ],\n    \"org.springframework:spring-context-support\": [\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-core\": [\n      \"org.springframework:spring-jcl\"\n    ],\n    \"org.springframework:spring-expression\": [\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-jdbc\": [\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-tx\"\n    ],\n    \"org.springframework:spring-test\": [\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-tx\": [\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-web\": [\n      \"io.micrometer:micrometer-observation\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-webmvc\": [\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-expression\",\n      \"org.springframework:spring-web\"\n    ],\n    \"org.thymeleaf:thymeleaf\": [\n      \"org.attoparser:attoparser\",\n      \"org.slf4j:slf4j-api\",\n      \"org.unbescape:unbescape\"\n    ],\n    \"org.thymeleaf:thymeleaf-spring6\": [\n      \"org.slf4j:slf4j-api\",\n      \"org.thymeleaf:thymeleaf\"\n    ],\n    \"org.xmlunit:xmlunit-core\": [\n      \"jakarta.xml.bind:jakarta.xml.bind-api\"\n    ]\n  },\n  \"packages\": {\n    \"biz.aQute.bnd:biz.aQute.bnd.util\": [\n      \"aQute.bnd.classfile\",\n      \"aQute.bnd.classfile.builder\",\n      \"aQute.bnd.classfile.preview\",\n      \"aQute.bnd.exceptions\",\n      \"aQute.bnd.memoize\",\n      \"aQute.bnd.result\",\n      \"aQute.bnd.signatures\",\n      \"aQute.bnd.stream\",\n      \"aQute.bnd.unmodifiable\",\n      \"aQute.lib.io\",\n      \"aQute.lib.stringrover\",\n      \"aQute.libg.glob\"\n    ],\n    \"biz.aQute.bnd:biz.aQute.bndlib\": [\n      \"aQute.bnd.annotation\",\n      \"aQute.bnd.annotation.baseline\",\n      \"aQute.bnd.annotation.component\",\n      \"aQute.bnd.annotation.headers\",\n      \"aQute.bnd.annotation.jpms\",\n      \"aQute.bnd.annotation.licenses\",\n      \"aQute.bnd.annotation.metatype\",\n      \"aQute.bnd.annotation.plugin\",\n      \"aQute.bnd.annotation.service\",\n      \"aQute.bnd.annotation.spi\",\n      \"aQute.bnd.annotation.xml\",\n      \"aQute.bnd.apiguardian.api\",\n      \"aQute.bnd.aspectj.plugin\",\n      \"aQute.bnd.build\",\n      \"aQute.bnd.build.api\",\n      \"aQute.bnd.build.model\",\n      \"aQute.bnd.build.model.clauses\",\n      \"aQute.bnd.build.model.conversions\",\n      \"aQute.bnd.buildtool\",\n      \"aQute.bnd.bundle.annotations\",\n      \"aQute.bnd.cdi\",\n      \"aQute.bnd.classindex\",\n      \"aQute.bnd.compatibility\",\n      \"aQute.bnd.component\",\n      \"aQute.bnd.component.annotations\",\n      \"aQute.bnd.component.error\",\n      \"aQute.bnd.connection.settings\",\n      \"aQute.bnd.differ\",\n      \"aQute.bnd.exporter.executable\",\n      \"aQute.bnd.exporter.runbundles\",\n      \"aQute.bnd.filerepo\",\n      \"aQute.bnd.header\",\n      \"aQute.bnd.help\",\n      \"aQute.bnd.help.instructions\",\n      \"aQute.bnd.http\",\n      \"aQute.bnd.junit\",\n      \"aQute.bnd.make\",\n      \"aQute.bnd.make.calltree\",\n      \"aQute.bnd.make.component\",\n      \"aQute.bnd.make.coverage\",\n      \"aQute.bnd.make.metatype\",\n      \"aQute.bnd.maven\",\n      \"aQute.bnd.maven.support\",\n      \"aQute.bnd.metatype\",\n      \"aQute.bnd.metatype.annotations\",\n      \"aQute.bnd.obr\",\n      \"aQute.bnd.osgi\",\n      \"aQute.bnd.osgi.eclipse\",\n      \"aQute.bnd.osgi.repository\",\n      \"aQute.bnd.osgi.resource\",\n      \"aQute.bnd.plugin.ant\",\n      \"aQute.bnd.plugin.eclipse\",\n      \"aQute.bnd.plugin.git\",\n      \"aQute.bnd.plugin.gradle\",\n      \"aQute.bnd.plugin.jpms\",\n      \"aQute.bnd.plugin.maven\",\n      \"aQute.bnd.plugin.spi\",\n      \"aQute.bnd.print\",\n      \"aQute.bnd.properties\",\n      \"aQute.bnd.remoteworkspace.client\",\n      \"aQute.bnd.remoteworkspace.server\",\n      \"aQute.bnd.resource.repository\",\n      \"aQute.bnd.service\",\n      \"aQute.bnd.service.action\",\n      \"aQute.bnd.service.classparser\",\n      \"aQute.bnd.service.clipboard\",\n      \"aQute.bnd.service.diff\",\n      \"aQute.bnd.service.export\",\n      \"aQute.bnd.service.extension\",\n      \"aQute.bnd.service.externalplugin\",\n      \"aQute.bnd.service.generate\",\n      \"aQute.bnd.service.library\",\n      \"aQute.bnd.service.lifecycle\",\n      \"aQute.bnd.service.maven\",\n      \"aQute.bnd.service.message\",\n      \"aQute.bnd.service.progress\",\n      \"aQute.bnd.service.release\",\n      \"aQute.bnd.service.remotelaunch\",\n      \"aQute.bnd.service.remoteworkspace\",\n      \"aQute.bnd.service.reporter\",\n      \"aQute.bnd.service.repository\",\n      \"aQute.bnd.service.resolve.hook\",\n      \"aQute.bnd.service.specifications\",\n      \"aQute.bnd.service.url\",\n      \"aQute.bnd.service.verifier\",\n      \"aQute.bnd.signing\",\n      \"aQute.bnd.url\",\n      \"aQute.bnd.util.dto\",\n      \"aQute.bnd.util.home\",\n      \"aQute.bnd.util.repository\",\n      \"aQute.bnd.version\",\n      \"aQute.bnd.version.maven\",\n      \"aQute.bnd.xmlattribute\",\n      \"aQute.lib.aspects\",\n      \"aQute.lib.base64\",\n      \"aQute.lib.collections\",\n      \"aQute.lib.concurrent.serial\",\n      \"aQute.lib.concurrentinit\",\n      \"aQute.lib.converter\",\n      \"aQute.lib.date\",\n      \"aQute.lib.deployer\",\n      \"aQute.lib.fileset\",\n      \"aQute.lib.filter\",\n      \"aQute.lib.formatter\",\n      \"aQute.lib.hex\",\n      \"aQute.lib.hierarchy\",\n      \"aQute.lib.io\",\n      \"aQute.lib.json\",\n      \"aQute.lib.link\",\n      \"aQute.lib.manifest\",\n      \"aQute.lib.mavenpasswordobfuscator\",\n      \"aQute.lib.persistentmap\",\n      \"aQute.lib.redirect\",\n      \"aQute.lib.settings\",\n      \"aQute.lib.specinterface\",\n      \"aQute.lib.spring\",\n      \"aQute.lib.stringrover\",\n      \"aQute.lib.strings\",\n      \"aQute.lib.tag\",\n      \"aQute.lib.utf8properties\",\n      \"aQute.lib.watcher\",\n      \"aQute.lib.xml\",\n      \"aQute.lib.xpath\",\n      \"aQute.lib.zip\",\n      \"aQute.libg.command\",\n      \"aQute.libg.cryptography\",\n      \"aQute.libg.filelock\",\n      \"aQute.libg.generics\",\n      \"aQute.libg.glob\",\n      \"aQute.libg.gzip\",\n      \"aQute.libg.ints\",\n      \"aQute.libg.map\",\n      \"aQute.libg.qtokens\",\n      \"aQute.libg.reporter\",\n      \"aQute.libg.reporter.slf4j\",\n      \"aQute.libg.sed\",\n      \"aQute.libg.tuple\",\n      \"aQute.libg.uri\",\n      \"aQute.service.reporter\"\n    ],\n    \"ch.qos.logback:logback-classic\": [\n      \"ch.qos.logback.classic\",\n      \"ch.qos.logback.classic.boolex\",\n      \"ch.qos.logback.classic.encoder\",\n      \"ch.qos.logback.classic.filter\",\n      \"ch.qos.logback.classic.helpers\",\n      \"ch.qos.logback.classic.html\",\n      \"ch.qos.logback.classic.joran\",\n      \"ch.qos.logback.classic.joran.action\",\n      \"ch.qos.logback.classic.joran.sanity\",\n      \"ch.qos.logback.classic.joran.serializedModel\",\n      \"ch.qos.logback.classic.jul\",\n      \"ch.qos.logback.classic.layout\",\n      \"ch.qos.logback.classic.log4j\",\n      \"ch.qos.logback.classic.model\",\n      \"ch.qos.logback.classic.model.processor\",\n      \"ch.qos.logback.classic.model.util\",\n      \"ch.qos.logback.classic.net\",\n      \"ch.qos.logback.classic.net.server\",\n      \"ch.qos.logback.classic.pattern\",\n      \"ch.qos.logback.classic.pattern.color\",\n      \"ch.qos.logback.classic.selector\",\n      \"ch.qos.logback.classic.selector.servlet\",\n      \"ch.qos.logback.classic.servlet\",\n      \"ch.qos.logback.classic.sift\",\n      \"ch.qos.logback.classic.spi\",\n      \"ch.qos.logback.classic.turbo\",\n      \"ch.qos.logback.classic.tyler\",\n      \"ch.qos.logback.classic.util\"\n    ],\n    \"ch.qos.logback:logback-core\": [\n      \"ch.qos.logback.core\",\n      \"ch.qos.logback.core.boolex\",\n      \"ch.qos.logback.core.encoder\",\n      \"ch.qos.logback.core.filter\",\n      \"ch.qos.logback.core.helpers\",\n      \"ch.qos.logback.core.hook\",\n      \"ch.qos.logback.core.html\",\n      \"ch.qos.logback.core.joran\",\n      \"ch.qos.logback.core.joran.action\",\n      \"ch.qos.logback.core.joran.conditional\",\n      \"ch.qos.logback.core.joran.event\",\n      \"ch.qos.logback.core.joran.node\",\n      \"ch.qos.logback.core.joran.sanity\",\n      \"ch.qos.logback.core.joran.spi\",\n      \"ch.qos.logback.core.joran.util\",\n      \"ch.qos.logback.core.joran.util.beans\",\n      \"ch.qos.logback.core.layout\",\n      \"ch.qos.logback.core.model\",\n      \"ch.qos.logback.core.model.conditional\",\n      \"ch.qos.logback.core.model.processor\",\n      \"ch.qos.logback.core.model.processor.conditional\",\n      \"ch.qos.logback.core.model.util\",\n      \"ch.qos.logback.core.net\",\n      \"ch.qos.logback.core.net.server\",\n      \"ch.qos.logback.core.net.ssl\",\n      \"ch.qos.logback.core.pattern\",\n      \"ch.qos.logback.core.pattern.color\",\n      \"ch.qos.logback.core.pattern.parser\",\n      \"ch.qos.logback.core.pattern.util\",\n      \"ch.qos.logback.core.property\",\n      \"ch.qos.logback.core.read\",\n      \"ch.qos.logback.core.recovery\",\n      \"ch.qos.logback.core.rolling\",\n      \"ch.qos.logback.core.rolling.helper\",\n      \"ch.qos.logback.core.sift\",\n      \"ch.qos.logback.core.spi\",\n      \"ch.qos.logback.core.status\",\n      \"ch.qos.logback.core.subst\",\n      \"ch.qos.logback.core.testUtil\",\n      \"ch.qos.logback.core.util\"\n    ],\n    \"com.fasterxml.jackson.core:jackson-annotations\": [\n      \"com.fasterxml.jackson.annotation\"\n    ],\n    \"com.fasterxml.jackson.core:jackson-core\": [\n      \"com.fasterxml.jackson.core\",\n      \"com.fasterxml.jackson.core.async\",\n      \"com.fasterxml.jackson.core.base\",\n      \"com.fasterxml.jackson.core.exc\",\n      \"com.fasterxml.jackson.core.filter\",\n      \"com.fasterxml.jackson.core.format\",\n      \"com.fasterxml.jackson.core.internal.shaded.fdp.v2_18_3\",\n      \"com.fasterxml.jackson.core.io\",\n      \"com.fasterxml.jackson.core.io.schubfach\",\n      \"com.fasterxml.jackson.core.json\",\n      \"com.fasterxml.jackson.core.json.async\",\n      \"com.fasterxml.jackson.core.sym\",\n      \"com.fasterxml.jackson.core.type\",\n      \"com.fasterxml.jackson.core.util\"\n    ],\n    \"com.fasterxml.jackson.core:jackson-databind\": [\n      \"com.fasterxml.jackson.databind\",\n      \"com.fasterxml.jackson.databind.annotation\",\n      \"com.fasterxml.jackson.databind.cfg\",\n      \"com.fasterxml.jackson.databind.deser\",\n      \"com.fasterxml.jackson.databind.deser.impl\",\n      \"com.fasterxml.jackson.databind.deser.std\",\n      \"com.fasterxml.jackson.databind.exc\",\n      \"com.fasterxml.jackson.databind.ext\",\n      \"com.fasterxml.jackson.databind.introspect\",\n      \"com.fasterxml.jackson.databind.jdk14\",\n      \"com.fasterxml.jackson.databind.json\",\n      \"com.fasterxml.jackson.databind.jsonFormatVisitors\",\n      \"com.fasterxml.jackson.databind.jsonschema\",\n      \"com.fasterxml.jackson.databind.jsontype\",\n      \"com.fasterxml.jackson.databind.jsontype.impl\",\n      \"com.fasterxml.jackson.databind.module\",\n      \"com.fasterxml.jackson.databind.node\",\n      \"com.fasterxml.jackson.databind.ser\",\n      \"com.fasterxml.jackson.databind.ser.impl\",\n      \"com.fasterxml.jackson.databind.ser.std\",\n      \"com.fasterxml.jackson.databind.type\",\n      \"com.fasterxml.jackson.databind.util\",\n      \"com.fasterxml.jackson.databind.util.internal\"\n    ],\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\": [\n      \"com.fasterxml.jackson.datatype.jdk8\"\n    ],\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\": [\n      \"com.fasterxml.jackson.datatype.jsr310\",\n      \"com.fasterxml.jackson.datatype.jsr310.deser\",\n      \"com.fasterxml.jackson.datatype.jsr310.deser.key\",\n      \"com.fasterxml.jackson.datatype.jsr310.ser\",\n      \"com.fasterxml.jackson.datatype.jsr310.ser.key\",\n      \"com.fasterxml.jackson.datatype.jsr310.util\"\n    ],\n    \"com.fasterxml.jackson.module:jackson-module-parameter-names\": [\n      \"com.fasterxml.jackson.module.paramnames\"\n    ],\n    \"com.google.auto.value:auto-value-annotations\": [\n      \"com.google.auto.value\",\n      \"com.google.auto.value.extension.memoized\",\n      \"com.google.auto.value.extension.serializable\",\n      \"com.google.auto.value.extension.toprettystring\"\n    ],\n    \"com.google.caliper:caliper\": [\n      \"com.google.caliper.runner\",\n      \"com.google.caliper.runner.instrument\",\n      \"com.google.caliper.runner.resultprocessor\"\n    ],\n    \"com.google.caliper:caliper-api\": [\n      \"com.google.caliper\",\n      \"com.google.caliper.api\",\n      \"com.google.caliper.model\"\n    ],\n    \"com.google.caliper:caliper-core\": [\n      \"com.google.caliper.bridge\",\n      \"com.google.caliper.core\",\n      \"com.google.caliper.memory\"\n    ],\n    \"com.google.caliper:caliper-runner\": [\n      \"com.google.caliper.runner\",\n      \"com.google.caliper.runner.config\",\n      \"com.google.caliper.runner.experiment\",\n      \"com.google.caliper.runner.instrument\",\n      \"com.google.caliper.runner.options\",\n      \"com.google.caliper.runner.resultprocessor\",\n      \"com.google.caliper.runner.server\",\n      \"com.google.caliper.runner.target\",\n      \"com.google.caliper.runner.worker\",\n      \"com.google.caliper.runner.worker.dryrun\",\n      \"com.google.caliper.runner.worker.targetinfo\",\n      \"com.google.caliper.runner.worker.trial\"\n    ],\n    \"com.google.caliper:caliper-util\": [\n      \"com.google.caliper.json\",\n      \"com.google.caliper.util\"\n    ],\n    \"com.google.caliper:caliper-worker\": [\n      \"com.google.caliper.worker\",\n      \"com.google.caliper.worker.connection\",\n      \"com.google.caliper.worker.handler\",\n      \"com.google.caliper.worker.instrument\"\n    ],\n    \"com.google.caliper:caliper-worker-jvm\": [\n      \"com.google.caliper.worker\"\n    ],\n    \"com.google.code.findbugs:jsr305\": [\n      \"javax.annotation\",\n      \"javax.annotation.concurrent\",\n      \"javax.annotation.meta\"\n    ],\n    \"com.google.code.gson:gson\": [\n      \"com.google.gson\",\n      \"com.google.gson.annotations\",\n      \"com.google.gson.internal\",\n      \"com.google.gson.internal.bind\",\n      \"com.google.gson.internal.bind.util\",\n      \"com.google.gson.internal.reflect\",\n      \"com.google.gson.internal.sql\",\n      \"com.google.gson.reflect\",\n      \"com.google.gson.stream\"\n    ],\n    \"com.google.code.java-allocation-instrumenter:java-allocation-instrumenter\": [\n      \"com.google.monitoring.runtime.instrumentation\",\n      \"com.google.monitoring.runtime.instrumentation.asm\",\n      \"com.google.monitoring.runtime.instrumentation.asm.commons\",\n      \"com.google.monitoring.runtime.instrumentation.asm.signature\",\n      \"com.google.monitoring.runtime.instrumentation.asm.tree\",\n      \"com.google.monitoring.runtime.instrumentation.asm.tree.analysis\",\n      \"com.google.monitoring.runtime.instrumentation.asm.util\",\n      \"com.google.monitoring.runtime.instrumentation.checker.nullness.compatqual\",\n      \"com.google.monitoring.runtime.instrumentation.common.annotations\",\n      \"com.google.monitoring.runtime.instrumentation.common.base\",\n      \"com.google.monitoring.runtime.instrumentation.common.base.internal\",\n      \"com.google.monitoring.runtime.instrumentation.common.cache\",\n      \"com.google.monitoring.runtime.instrumentation.common.collect\",\n      \"com.google.monitoring.runtime.instrumentation.common.escape\",\n      \"com.google.monitoring.runtime.instrumentation.common.eventbus\",\n      \"com.google.monitoring.runtime.instrumentation.common.graph\",\n      \"com.google.monitoring.runtime.instrumentation.common.hash\",\n      \"com.google.monitoring.runtime.instrumentation.common.html\",\n      \"com.google.monitoring.runtime.instrumentation.common.io\",\n      \"com.google.monitoring.runtime.instrumentation.common.math\",\n      \"com.google.monitoring.runtime.instrumentation.common.net\",\n      \"com.google.monitoring.runtime.instrumentation.common.primitives\",\n      \"com.google.monitoring.runtime.instrumentation.common.reflect\",\n      \"com.google.monitoring.runtime.instrumentation.common.util.concurrent\",\n      \"com.google.monitoring.runtime.instrumentation.common.xml\",\n      \"com.google.monitoring.runtime.instrumentation.errorprone.annotations\",\n      \"com.google.monitoring.runtime.instrumentation.errorprone.annotations.concurrent\",\n      \"com.google.monitoring.runtime.instrumentation.j2objc.annotations\",\n      \"com.google.thirdparty.publicsuffix\"\n    ],\n    \"com.google.dagger:dagger\": [\n      \"dagger\",\n      \"dagger.internal\",\n      \"dagger.multibindings\"\n    ],\n    \"com.google.dagger:dagger-producers\": [\n      \"dagger.producers\",\n      \"dagger.producers.internal\",\n      \"dagger.producers.monitoring\",\n      \"dagger.producers.monitoring.internal\"\n    ],\n    \"com.google.errorprone:error_prone_annotations\": [\n      \"com.google.errorprone.annotations\",\n      \"com.google.errorprone.annotations.concurrent\"\n    ],\n    \"com.google.guava:failureaccess\": [\n      \"com.google.common.util.concurrent.internal\"\n    ],\n    \"com.google.guava:guava\": [\n      \"com.google.common.annotations\",\n      \"com.google.common.base\",\n      \"com.google.common.base.internal\",\n      \"com.google.common.cache\",\n      \"com.google.common.collect\",\n      \"com.google.common.escape\",\n      \"com.google.common.eventbus\",\n      \"com.google.common.graph\",\n      \"com.google.common.hash\",\n      \"com.google.common.html\",\n      \"com.google.common.io\",\n      \"com.google.common.math\",\n      \"com.google.common.net\",\n      \"com.google.common.primitives\",\n      \"com.google.common.reflect\",\n      \"com.google.common.util.concurrent\",\n      \"com.google.common.xml\",\n      \"com.google.thirdparty.publicsuffix\"\n    ],\n    \"com.google.guava:guava-testlib\": [\n      \"com.google.common.collect.testing\",\n      \"com.google.common.collect.testing.features\",\n      \"com.google.common.collect.testing.google\",\n      \"com.google.common.collect.testing.suites\",\n      \"com.google.common.collect.testing.testers\",\n      \"com.google.common.escape.testing\",\n      \"com.google.common.testing\",\n      \"com.google.common.util.concurrent.testing\"\n    ],\n    \"com.google.j2objc:j2objc-annotations\": [\n      \"com.google.j2objc.annotations\"\n    ],\n    \"com.google.truth:truth\": [\n      \"com.google.common.truth\"\n    ],\n    \"com.jayway.jsonpath:json-path\": [\n      \"com.jayway.jsonpath\",\n      \"com.jayway.jsonpath.internal\",\n      \"com.jayway.jsonpath.internal.filter\",\n      \"com.jayway.jsonpath.internal.function\",\n      \"com.jayway.jsonpath.internal.function.json\",\n      \"com.jayway.jsonpath.internal.function.latebinding\",\n      \"com.jayway.jsonpath.internal.function.numeric\",\n      \"com.jayway.jsonpath.internal.function.sequence\",\n      \"com.jayway.jsonpath.internal.function.text\",\n      \"com.jayway.jsonpath.internal.path\",\n      \"com.jayway.jsonpath.spi.cache\",\n      \"com.jayway.jsonpath.spi.json\",\n      \"com.jayway.jsonpath.spi.mapper\"\n    ],\n    \"com.squareup.okhttp:okhttp\": [\n      \"com.squareup.okhttp\",\n      \"com.squareup.okhttp.internal\",\n      \"com.squareup.okhttp.internal.framed\",\n      \"com.squareup.okhttp.internal.http\",\n      \"com.squareup.okhttp.internal.io\",\n      \"com.squareup.okhttp.internal.tls\"\n    ],\n    \"com.squareup.okio:okio\": [\n      \"okio\"\n    ],\n    \"com.sun.jersey:jersey-client\": [\n      \"com.sun.jersey.api.client\",\n      \"com.sun.jersey.api.client.async\",\n      \"com.sun.jersey.api.client.config\",\n      \"com.sun.jersey.api.client.filter\",\n      \"com.sun.jersey.client.impl\",\n      \"com.sun.jersey.client.impl.async\",\n      \"com.sun.jersey.client.proxy\",\n      \"com.sun.jersey.client.urlconnection\",\n      \"com.sun.ws.rs.ext\"\n    ],\n    \"com.sun.jersey:jersey-core\": [\n      \"com.sun.jersey.api.provider.jaxb\",\n      \"com.sun.jersey.api.representation\",\n      \"com.sun.jersey.api.uri\",\n      \"com.sun.jersey.core.header\",\n      \"com.sun.jersey.core.header.reader\",\n      \"com.sun.jersey.core.impl.provider.entity\",\n      \"com.sun.jersey.core.impl.provider.header\",\n      \"com.sun.jersey.core.impl.provider.xml\",\n      \"com.sun.jersey.core.osgi\",\n      \"com.sun.jersey.core.provider\",\n      \"com.sun.jersey.core.provider.jaxb\",\n      \"com.sun.jersey.core.reflection\",\n      \"com.sun.jersey.core.spi.component\",\n      \"com.sun.jersey.core.spi.component.ioc\",\n      \"com.sun.jersey.core.spi.factory\",\n      \"com.sun.jersey.core.spi.scanning\",\n      \"com.sun.jersey.core.spi.scanning.uri\",\n      \"com.sun.jersey.core.util\",\n      \"com.sun.jersey.impl\",\n      \"com.sun.jersey.localization\",\n      \"com.sun.jersey.spi\",\n      \"com.sun.jersey.spi.inject\",\n      \"com.sun.jersey.spi.service\"\n    ],\n    \"com.vaadin.external.google:android-json\": [\n      \"org.json\"\n    ],\n    \"com.zaxxer:HikariCP\": [\n      \"com.zaxxer.hikari\",\n      \"com.zaxxer.hikari.hibernate\",\n      \"com.zaxxer.hikari.metrics\",\n      \"com.zaxxer.hikari.metrics.dropwizard\",\n      \"com.zaxxer.hikari.metrics.micrometer\",\n      \"com.zaxxer.hikari.metrics.prometheus\",\n      \"com.zaxxer.hikari.pool\",\n      \"com.zaxxer.hikari.util\"\n    ],\n    \"info.picocli:picocli\": [\n      \"picocli\"\n    ],\n    \"io.micrometer:micrometer-commons\": [\n      \"io.micrometer.common\",\n      \"io.micrometer.common.annotation\",\n      \"io.micrometer.common.docs\",\n      \"io.micrometer.common.lang\",\n      \"io.micrometer.common.util\",\n      \"io.micrometer.common.util.internal.logging\"\n    ],\n    \"io.micrometer:micrometer-core\": [\n      \"io.micrometer.core.annotation\",\n      \"io.micrometer.core.aop\",\n      \"io.micrometer.core.instrument\",\n      \"io.micrometer.core.instrument.binder\",\n      \"io.micrometer.core.instrument.binder.cache\",\n      \"io.micrometer.core.instrument.binder.commonspool2\",\n      \"io.micrometer.core.instrument.binder.db\",\n      \"io.micrometer.core.instrument.binder.grpc\",\n      \"io.micrometer.core.instrument.binder.http\",\n      \"io.micrometer.core.instrument.binder.httpcomponents\",\n      \"io.micrometer.core.instrument.binder.httpcomponents.hc5\",\n      \"io.micrometer.core.instrument.binder.hystrix\",\n      \"io.micrometer.core.instrument.binder.jdk\",\n      \"io.micrometer.core.instrument.binder.jersey.server\",\n      \"io.micrometer.core.instrument.binder.jetty\",\n      \"io.micrometer.core.instrument.binder.jpa\",\n      \"io.micrometer.core.instrument.binder.jvm\",\n      \"io.micrometer.core.instrument.binder.kafka\",\n      \"io.micrometer.core.instrument.binder.logging\",\n      \"io.micrometer.core.instrument.binder.mongodb\",\n      \"io.micrometer.core.instrument.binder.netty4\",\n      \"io.micrometer.core.instrument.binder.okhttp3\",\n      \"io.micrometer.core.instrument.binder.system\",\n      \"io.micrometer.core.instrument.binder.tomcat\",\n      \"io.micrometer.core.instrument.composite\",\n      \"io.micrometer.core.instrument.config\",\n      \"io.micrometer.core.instrument.config.validate\",\n      \"io.micrometer.core.instrument.cumulative\",\n      \"io.micrometer.core.instrument.distribution\",\n      \"io.micrometer.core.instrument.distribution.pause\",\n      \"io.micrometer.core.instrument.docs\",\n      \"io.micrometer.core.instrument.dropwizard\",\n      \"io.micrometer.core.instrument.internal\",\n      \"io.micrometer.core.instrument.kotlin\",\n      \"io.micrometer.core.instrument.logging\",\n      \"io.micrometer.core.instrument.noop\",\n      \"io.micrometer.core.instrument.observation\",\n      \"io.micrometer.core.instrument.push\",\n      \"io.micrometer.core.instrument.search\",\n      \"io.micrometer.core.instrument.simple\",\n      \"io.micrometer.core.instrument.step\",\n      \"io.micrometer.core.instrument.util\",\n      \"io.micrometer.core.ipc.http\",\n      \"io.micrometer.core.lang\",\n      \"io.micrometer.core.util.internal.logging\"\n    ],\n    \"io.micrometer:micrometer-jakarta9\": [\n      \"io.micrometer.jakarta9.instrument.jms\"\n    ],\n    \"io.micrometer:micrometer-observation\": [\n      \"io.micrometer.observation\",\n      \"io.micrometer.observation.annotation\",\n      \"io.micrometer.observation.aop\",\n      \"io.micrometer.observation.contextpropagation\",\n      \"io.micrometer.observation.docs\",\n      \"io.micrometer.observation.transport\"\n    ],\n    \"jakarta.activation:jakarta.activation-api\": [\n      \"jakarta.activation\",\n      \"jakarta.activation.spi\"\n    ],\n    \"jakarta.annotation:jakarta.annotation-api\": [\n      \"jakarta.annotation\",\n      \"jakarta.annotation.security\",\n      \"jakarta.annotation.sql\"\n    ],\n    \"jakarta.enterprise:jakarta.enterprise.cdi-api\": [\n      \"jakarta.decorator\",\n      \"jakarta.enterprise.context\",\n      \"jakarta.enterprise.context.control\",\n      \"jakarta.enterprise.context.spi\",\n      \"jakarta.enterprise.event\",\n      \"jakarta.enterprise.inject\",\n      \"jakarta.enterprise.inject.build.compatible.spi\",\n      \"jakarta.enterprise.inject.literal\",\n      \"jakarta.enterprise.inject.se\",\n      \"jakarta.enterprise.inject.spi\",\n      \"jakarta.enterprise.inject.spi.configurator\",\n      \"jakarta.enterprise.util\"\n    ],\n    \"jakarta.enterprise:jakarta.enterprise.lang-model\": [\n      \"jakarta.enterprise.lang.model\",\n      \"jakarta.enterprise.lang.model.declarations\",\n      \"jakarta.enterprise.lang.model.types\"\n    ],\n    \"jakarta.inject:jakarta.inject-api\": [\n      \"jakarta.inject\"\n    ],\n    \"jakarta.interceptor:jakarta.interceptor-api\": [\n      \"jakarta.interceptor\"\n    ],\n    \"jakarta.servlet:jakarta.servlet-api\": [\n      \"jakarta.servlet\",\n      \"jakarta.servlet.annotation\",\n      \"jakarta.servlet.descriptor\",\n      \"jakarta.servlet.http\"\n    ],\n    \"jakarta.transaction:jakarta.transaction-api\": [\n      \"jakarta.transaction\"\n    ],\n    \"jakarta.websocket:jakarta.websocket-api\": [\n      \"jakarta.websocket.server\"\n    ],\n    \"jakarta.websocket:jakarta.websocket-client-api\": [\n      \"jakarta.websocket\"\n    ],\n    \"jakarta.xml.bind:jakarta.xml.bind-api\": [\n      \"jakarta.xml.bind\",\n      \"jakarta.xml.bind.annotation\",\n      \"jakarta.xml.bind.annotation.adapters\",\n      \"jakarta.xml.bind.attachment\",\n      \"jakarta.xml.bind.helpers\",\n      \"jakarta.xml.bind.util\"\n    ],\n    \"javax.annotation:javax.annotation-api\": [\n      \"javax.annotation\",\n      \"javax.annotation.security\",\n      \"javax.annotation.sql\"\n    ],\n    \"javax.inject:javax.inject\": [\n      \"javax.inject\"\n    ],\n    \"javax.ws.rs:jsr311-api\": [\n      \"javax.ws.rs\",\n      \"javax.ws.rs.core\",\n      \"javax.ws.rs.ext\"\n    ],\n    \"joda-time:joda-time\": [\n      \"org.joda.time\",\n      \"org.joda.time.base\",\n      \"org.joda.time.chrono\",\n      \"org.joda.time.convert\",\n      \"org.joda.time.field\",\n      \"org.joda.time.format\",\n      \"org.joda.time.tz\"\n    ],\n    \"junit:junit\": [\n      \"junit.extensions\",\n      \"junit.framework\",\n      \"junit.runner\",\n      \"junit.textui\",\n      \"org.junit\",\n      \"org.junit.experimental\",\n      \"org.junit.experimental.categories\",\n      \"org.junit.experimental.max\",\n      \"org.junit.experimental.results\",\n      \"org.junit.experimental.runners\",\n      \"org.junit.experimental.theories\",\n      \"org.junit.experimental.theories.internal\",\n      \"org.junit.experimental.theories.suppliers\",\n      \"org.junit.function\",\n      \"org.junit.internal\",\n      \"org.junit.internal.builders\",\n      \"org.junit.internal.management\",\n      \"org.junit.internal.matchers\",\n      \"org.junit.internal.requests\",\n      \"org.junit.internal.runners\",\n      \"org.junit.internal.runners.model\",\n      \"org.junit.internal.runners.rules\",\n      \"org.junit.internal.runners.statements\",\n      \"org.junit.matchers\",\n      \"org.junit.rules\",\n      \"org.junit.runner\",\n      \"org.junit.runner.manipulation\",\n      \"org.junit.runner.notification\",\n      \"org.junit.runners\",\n      \"org.junit.runners.model\",\n      \"org.junit.runners.parameterized\",\n      \"org.junit.validator\"\n    ],\n    \"net.bytebuddy:byte-buddy\": [\n      \"net.bytebuddy\",\n      \"net.bytebuddy.agent.builder\",\n      \"net.bytebuddy.asm\",\n      \"net.bytebuddy.build\",\n      \"net.bytebuddy.description\",\n      \"net.bytebuddy.description.annotation\",\n      \"net.bytebuddy.description.enumeration\",\n      \"net.bytebuddy.description.field\",\n      \"net.bytebuddy.description.method\",\n      \"net.bytebuddy.description.modifier\",\n      \"net.bytebuddy.description.type\",\n      \"net.bytebuddy.dynamic\",\n      \"net.bytebuddy.dynamic.loading\",\n      \"net.bytebuddy.dynamic.scaffold\",\n      \"net.bytebuddy.dynamic.scaffold.inline\",\n      \"net.bytebuddy.dynamic.scaffold.subclass\",\n      \"net.bytebuddy.implementation\",\n      \"net.bytebuddy.implementation.attribute\",\n      \"net.bytebuddy.implementation.auxiliary\",\n      \"net.bytebuddy.implementation.bind\",\n      \"net.bytebuddy.implementation.bind.annotation\",\n      \"net.bytebuddy.implementation.bytecode\",\n      \"net.bytebuddy.implementation.bytecode.assign\",\n      \"net.bytebuddy.implementation.bytecode.assign.primitive\",\n      \"net.bytebuddy.implementation.bytecode.assign.reference\",\n      \"net.bytebuddy.implementation.bytecode.collection\",\n      \"net.bytebuddy.implementation.bytecode.constant\",\n      \"net.bytebuddy.implementation.bytecode.member\",\n      \"net.bytebuddy.jar.asm\",\n      \"net.bytebuddy.jar.asm.commons\",\n      \"net.bytebuddy.jar.asm.signature\",\n      \"net.bytebuddy.matcher\",\n      \"net.bytebuddy.pool\",\n      \"net.bytebuddy.utility\",\n      \"net.bytebuddy.utility.dispatcher\",\n      \"net.bytebuddy.utility.nullability\",\n      \"net.bytebuddy.utility.privilege\",\n      \"net.bytebuddy.utility.visitor\"\n    ],\n    \"net.bytebuddy:byte-buddy-agent\": [\n      \"net.bytebuddy.agent\",\n      \"net.bytebuddy.agent.utility.nullability\"\n    ],\n    \"net.minidev:accessors-smart\": [\n      \"net.minidev.asm\",\n      \"net.minidev.asm.ex\"\n    ],\n    \"net.minidev:json-smart\": [\n      \"net.minidev.json\",\n      \"net.minidev.json.annotate\",\n      \"net.minidev.json.parser\",\n      \"net.minidev.json.reader\",\n      \"net.minidev.json.writer\"\n    ],\n    \"org.apache.commons:commons-compress\": [\n      \"org.apache.commons.compress\",\n      \"org.apache.commons.compress.archivers\",\n      \"org.apache.commons.compress.archivers.ar\",\n      \"org.apache.commons.compress.archivers.arj\",\n      \"org.apache.commons.compress.archivers.cpio\",\n      \"org.apache.commons.compress.archivers.dump\",\n      \"org.apache.commons.compress.archivers.examples\",\n      \"org.apache.commons.compress.archivers.jar\",\n      \"org.apache.commons.compress.archivers.sevenz\",\n      \"org.apache.commons.compress.archivers.tar\",\n      \"org.apache.commons.compress.archivers.zip\",\n      \"org.apache.commons.compress.changes\",\n      \"org.apache.commons.compress.compressors\",\n      \"org.apache.commons.compress.compressors.brotli\",\n      \"org.apache.commons.compress.compressors.bzip2\",\n      \"org.apache.commons.compress.compressors.deflate\",\n      \"org.apache.commons.compress.compressors.deflate64\",\n      \"org.apache.commons.compress.compressors.gzip\",\n      \"org.apache.commons.compress.compressors.lz4\",\n      \"org.apache.commons.compress.compressors.lz77support\",\n      \"org.apache.commons.compress.compressors.lzma\",\n      \"org.apache.commons.compress.compressors.lzw\",\n      \"org.apache.commons.compress.compressors.pack200\",\n      \"org.apache.commons.compress.compressors.snappy\",\n      \"org.apache.commons.compress.compressors.xz\",\n      \"org.apache.commons.compress.compressors.z\",\n      \"org.apache.commons.compress.compressors.zstandard\",\n      \"org.apache.commons.compress.harmony\",\n      \"org.apache.commons.compress.harmony.archive.internal.nls\",\n      \"org.apache.commons.compress.harmony.pack200\",\n      \"org.apache.commons.compress.harmony.unpack200\",\n      \"org.apache.commons.compress.harmony.unpack200.bytecode\",\n      \"org.apache.commons.compress.harmony.unpack200.bytecode.forms\",\n      \"org.apache.commons.compress.java.util.jar\",\n      \"org.apache.commons.compress.parallel\",\n      \"org.apache.commons.compress.utils\"\n    ],\n    \"org.apache.logging.log4j:log4j-api\": [\n      \"org.apache.logging.log4j\",\n      \"org.apache.logging.log4j.internal\",\n      \"org.apache.logging.log4j.internal.map\",\n      \"org.apache.logging.log4j.message\",\n      \"org.apache.logging.log4j.simple\",\n      \"org.apache.logging.log4j.simple.internal\",\n      \"org.apache.logging.log4j.spi\",\n      \"org.apache.logging.log4j.status\",\n      \"org.apache.logging.log4j.util\",\n      \"org.apache.logging.log4j.util.internal\"\n    ],\n    \"org.apache.logging.log4j:log4j-to-slf4j\": [\n      \"org.apache.logging.slf4j\"\n    ],\n    \"org.apache.tomcat.embed:tomcat-embed-core\": [\n      \"jakarta.security.auth.message\",\n      \"jakarta.security.auth.message.callback\",\n      \"jakarta.security.auth.message.config\",\n      \"jakarta.security.auth.message.module\",\n      \"jakarta.servlet\",\n      \"jakarta.servlet.annotation\",\n      \"jakarta.servlet.descriptor\",\n      \"jakarta.servlet.http\",\n      \"org.apache.catalina\",\n      \"org.apache.catalina.authenticator\",\n      \"org.apache.catalina.authenticator.jaspic\",\n      \"org.apache.catalina.connector\",\n      \"org.apache.catalina.core\",\n      \"org.apache.catalina.deploy\",\n      \"org.apache.catalina.filters\",\n      \"org.apache.catalina.loader\",\n      \"org.apache.catalina.manager\",\n      \"org.apache.catalina.manager.host\",\n      \"org.apache.catalina.manager.util\",\n      \"org.apache.catalina.mapper\",\n      \"org.apache.catalina.mbeans\",\n      \"org.apache.catalina.realm\",\n      \"org.apache.catalina.security\",\n      \"org.apache.catalina.servlets\",\n      \"org.apache.catalina.session\",\n      \"org.apache.catalina.startup\",\n      \"org.apache.catalina.users\",\n      \"org.apache.catalina.util\",\n      \"org.apache.catalina.valves\",\n      \"org.apache.catalina.valves.rewrite\",\n      \"org.apache.catalina.webresources\",\n      \"org.apache.catalina.webresources.war\",\n      \"org.apache.coyote\",\n      \"org.apache.coyote.ajp\",\n      \"org.apache.coyote.http11\",\n      \"org.apache.coyote.http11.filters\",\n      \"org.apache.coyote.http11.upgrade\",\n      \"org.apache.coyote.http2\",\n      \"org.apache.juli\",\n      \"org.apache.juli.logging\",\n      \"org.apache.naming\",\n      \"org.apache.naming.factory\",\n      \"org.apache.naming.factory.webservices\",\n      \"org.apache.naming.java\",\n      \"org.apache.tomcat\",\n      \"org.apache.tomcat.jni\",\n      \"org.apache.tomcat.util\",\n      \"org.apache.tomcat.util.bcel\",\n      \"org.apache.tomcat.util.bcel.classfile\",\n      \"org.apache.tomcat.util.buf\",\n      \"org.apache.tomcat.util.codec.binary\",\n      \"org.apache.tomcat.util.collections\",\n      \"org.apache.tomcat.util.compat\",\n      \"org.apache.tomcat.util.descriptor\",\n      \"org.apache.tomcat.util.descriptor.tagplugin\",\n      \"org.apache.tomcat.util.descriptor.web\",\n      \"org.apache.tomcat.util.digester\",\n      \"org.apache.tomcat.util.file\",\n      \"org.apache.tomcat.util.http\",\n      \"org.apache.tomcat.util.http.fileupload\",\n      \"org.apache.tomcat.util.http.fileupload.disk\",\n      \"org.apache.tomcat.util.http.fileupload.impl\",\n      \"org.apache.tomcat.util.http.fileupload.servlet\",\n      \"org.apache.tomcat.util.http.fileupload.util\",\n      \"org.apache.tomcat.util.http.fileupload.util.mime\",\n      \"org.apache.tomcat.util.http.parser\",\n      \"org.apache.tomcat.util.json\",\n      \"org.apache.tomcat.util.log\",\n      \"org.apache.tomcat.util.modeler\",\n      \"org.apache.tomcat.util.modeler.modules\",\n      \"org.apache.tomcat.util.net\",\n      \"org.apache.tomcat.util.net.jsse\",\n      \"org.apache.tomcat.util.net.openssl\",\n      \"org.apache.tomcat.util.net.openssl.ciphers\",\n      \"org.apache.tomcat.util.res\",\n      \"org.apache.tomcat.util.scan\",\n      \"org.apache.tomcat.util.security\",\n      \"org.apache.tomcat.util.threads\"\n    ],\n    \"org.apache.tomcat.embed:tomcat-embed-el\": [\n      \"jakarta.el\",\n      \"org.apache.el\",\n      \"org.apache.el.lang\",\n      \"org.apache.el.parser\",\n      \"org.apache.el.stream\",\n      \"org.apache.el.util\"\n    ],\n    \"org.apache.tomcat.embed:tomcat-embed-websocket\": [\n      \"jakarta.websocket\",\n      \"jakarta.websocket.server\",\n      \"org.apache.tomcat.websocket\",\n      \"org.apache.tomcat.websocket.pojo\",\n      \"org.apache.tomcat.websocket.server\"\n    ],\n    \"org.apiguardian:apiguardian-api\": [\n      \"org.apiguardian.api\"\n    ],\n    \"org.aspectj:aspectjweaver\": [\n      \"aj.org.objectweb.asm\",\n      \"aj.org.objectweb.asm.commons\",\n      \"aj.org.objectweb.asm.signature\",\n      \"org.aspectj.apache.bcel\",\n      \"org.aspectj.apache.bcel.classfile\",\n      \"org.aspectj.apache.bcel.classfile.annotation\",\n      \"org.aspectj.apache.bcel.generic\",\n      \"org.aspectj.apache.bcel.util\",\n      \"org.aspectj.asm\",\n      \"org.aspectj.asm.internal\",\n      \"org.aspectj.bridge\",\n      \"org.aspectj.bridge.context\",\n      \"org.aspectj.internal.lang.annotation\",\n      \"org.aspectj.internal.lang.reflect\",\n      \"org.aspectj.lang\",\n      \"org.aspectj.lang.annotation\",\n      \"org.aspectj.lang.annotation.control\",\n      \"org.aspectj.lang.internal.lang\",\n      \"org.aspectj.lang.reflect\",\n      \"org.aspectj.runtime\",\n      \"org.aspectj.runtime.internal\",\n      \"org.aspectj.runtime.internal.cflowstack\",\n      \"org.aspectj.runtime.reflect\",\n      \"org.aspectj.util\",\n      \"org.aspectj.weaver\",\n      \"org.aspectj.weaver.ast\",\n      \"org.aspectj.weaver.bcel\",\n      \"org.aspectj.weaver.bcel.asm\",\n      \"org.aspectj.weaver.internal.tools\",\n      \"org.aspectj.weaver.loadtime\",\n      \"org.aspectj.weaver.loadtime.definition\",\n      \"org.aspectj.weaver.ltw\",\n      \"org.aspectj.weaver.model\",\n      \"org.aspectj.weaver.patterns\",\n      \"org.aspectj.weaver.reflect\",\n      \"org.aspectj.weaver.tools\",\n      \"org.aspectj.weaver.tools.cache\"\n    ],\n    \"org.assertj:assertj-core\": [\n      \"org.assertj.core.annotations\",\n      \"org.assertj.core.api\",\n      \"org.assertj.core.api.exception\",\n      \"org.assertj.core.api.filter\",\n      \"org.assertj.core.api.iterable\",\n      \"org.assertj.core.api.junit.jupiter\",\n      \"org.assertj.core.api.recursive\",\n      \"org.assertj.core.api.recursive.assertion\",\n      \"org.assertj.core.api.recursive.comparison\",\n      \"org.assertj.core.condition\",\n      \"org.assertj.core.configuration\",\n      \"org.assertj.core.data\",\n      \"org.assertj.core.description\",\n      \"org.assertj.core.error\",\n      \"org.assertj.core.error.array2d\",\n      \"org.assertj.core.error.future\",\n      \"org.assertj.core.error.uri\",\n      \"org.assertj.core.extractor\",\n      \"org.assertj.core.groups\",\n      \"org.assertj.core.internal\",\n      \"org.assertj.core.matcher\",\n      \"org.assertj.core.presentation\",\n      \"org.assertj.core.util\",\n      \"org.assertj.core.util.diff\",\n      \"org.assertj.core.util.diff.myers\",\n      \"org.assertj.core.util.introspection\",\n      \"org.assertj.core.util.xml\"\n    ],\n    \"org.attoparser:attoparser\": [\n      \"org.attoparser\",\n      \"org.attoparser.config\",\n      \"org.attoparser.discard\",\n      \"org.attoparser.dom\",\n      \"org.attoparser.duplicate\",\n      \"org.attoparser.minimize\",\n      \"org.attoparser.output\",\n      \"org.attoparser.prettyhtml\",\n      \"org.attoparser.select\",\n      \"org.attoparser.simple\",\n      \"org.attoparser.trace\",\n      \"org.attoparser.util\"\n    ],\n    \"org.awaitility:awaitility\": [\n      \"org.awaitility\",\n      \"org.awaitility.classpath\",\n      \"org.awaitility.constraint\",\n      \"org.awaitility.core\",\n      \"org.awaitility.pollinterval\",\n      \"org.awaitility.reflect\",\n      \"org.awaitility.reflect.exception\",\n      \"org.awaitility.spi\"\n    ],\n    \"org.checkerframework:checker-compat-qual\": [\n      \"org.checkerframework.checker.nullness.compatqual\"\n    ],\n    \"org.checkerframework:checker-qual\": [\n      \"org.checkerframework.checker.builder.qual\",\n      \"org.checkerframework.checker.calledmethods.qual\",\n      \"org.checkerframework.checker.compilermsgs.qual\",\n      \"org.checkerframework.checker.fenum.qual\",\n      \"org.checkerframework.checker.formatter.qual\",\n      \"org.checkerframework.checker.guieffect.qual\",\n      \"org.checkerframework.checker.i18n.qual\",\n      \"org.checkerframework.checker.i18nformatter.qual\",\n      \"org.checkerframework.checker.index.qual\",\n      \"org.checkerframework.checker.initialization.qual\",\n      \"org.checkerframework.checker.interning.qual\",\n      \"org.checkerframework.checker.lock.qual\",\n      \"org.checkerframework.checker.mustcall.qual\",\n      \"org.checkerframework.checker.nullness.qual\",\n      \"org.checkerframework.checker.optional.qual\",\n      \"org.checkerframework.checker.propkey.qual\",\n      \"org.checkerframework.checker.regex.qual\",\n      \"org.checkerframework.checker.signature.qual\",\n      \"org.checkerframework.checker.signedness.qual\",\n      \"org.checkerframework.checker.tainting.qual\",\n      \"org.checkerframework.checker.units.qual\",\n      \"org.checkerframework.common.aliasing.qual\",\n      \"org.checkerframework.common.initializedfields.qual\",\n      \"org.checkerframework.common.reflection.qual\",\n      \"org.checkerframework.common.returnsreceiver.qual\",\n      \"org.checkerframework.common.subtyping.qual\",\n      \"org.checkerframework.common.util.report.qual\",\n      \"org.checkerframework.common.value.qual\",\n      \"org.checkerframework.dataflow.qual\",\n      \"org.checkerframework.framework.qual\"\n    ],\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client\": [\n      \"org.eclipse.jetty.ee10.websocket.jakarta.client\",\n      \"org.eclipse.jetty.ee10.websocket.jakarta.client.internal\"\n    ],\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common\": [\n      \"org.eclipse.jetty.ee10.websocket.jakarta.common\",\n      \"org.eclipse.jetty.ee10.websocket.jakarta.common.decoders\",\n      \"org.eclipse.jetty.ee10.websocket.jakarta.common.encoders\",\n      \"org.eclipse.jetty.ee10.websocket.jakarta.common.messages\"\n    ],\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server\": [\n      \"org.eclipse.jetty.ee10.websocket.jakarta.server\",\n      \"org.eclipse.jetty.ee10.websocket.jakarta.server.config\",\n      \"org.eclipse.jetty.ee10.websocket.jakarta.server.internal\"\n    ],\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server\": [\n      \"org.eclipse.jetty.ee10.websocket.server\",\n      \"org.eclipse.jetty.ee10.websocket.server.config\",\n      \"org.eclipse.jetty.ee10.websocket.server.internal\"\n    ],\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet\": [\n      \"org.eclipse.jetty.ee10.websocket.servlet\"\n    ],\n    \"org.eclipse.jetty.ee10:jetty-ee10-annotations\": [\n      \"org.eclipse.jetty.ee10.annotations\"\n    ],\n    \"org.eclipse.jetty.ee10:jetty-ee10-plus\": [\n      \"org.eclipse.jetty.ee10.plus.jndi\",\n      \"org.eclipse.jetty.ee10.plus.webapp\"\n    ],\n    \"org.eclipse.jetty.ee10:jetty-ee10-servlet\": [\n      \"org.eclipse.jetty.ee10.servlet\",\n      \"org.eclipse.jetty.ee10.servlet.jmx\",\n      \"org.eclipse.jetty.ee10.servlet.listener\",\n      \"org.eclipse.jetty.ee10.servlet.security\",\n      \"org.eclipse.jetty.ee10.servlet.security.authentication\",\n      \"org.eclipse.jetty.ee10.servlet.util\"\n    ],\n    \"org.eclipse.jetty.ee10:jetty-ee10-servlets\": [\n      \"org.eclipse.jetty.ee10.servlets\"\n    ],\n    \"org.eclipse.jetty.ee10:jetty-ee10-webapp\": [\n      \"org.eclipse.jetty.ee10.webapp\"\n    ],\n    \"org.eclipse.jetty.websocket:jetty-websocket-core-client\": [\n      \"org.eclipse.jetty.websocket.core.client\",\n      \"org.eclipse.jetty.websocket.core.client.internal\"\n    ],\n    \"org.eclipse.jetty.websocket:jetty-websocket-core-common\": [\n      \"org.eclipse.jetty.websocket.core\",\n      \"org.eclipse.jetty.websocket.core.exception\",\n      \"org.eclipse.jetty.websocket.core.internal\",\n      \"org.eclipse.jetty.websocket.core.messages\",\n      \"org.eclipse.jetty.websocket.core.util\"\n    ],\n    \"org.eclipse.jetty.websocket:jetty-websocket-core-server\": [\n      \"org.eclipse.jetty.websocket.core.server\",\n      \"org.eclipse.jetty.websocket.core.server.internal\"\n    ],\n    \"org.eclipse.jetty.websocket:jetty-websocket-jetty-api\": [\n      \"org.eclipse.jetty.websocket.api\",\n      \"org.eclipse.jetty.websocket.api.annotations\",\n      \"org.eclipse.jetty.websocket.api.exceptions\",\n      \"org.eclipse.jetty.websocket.api.util\"\n    ],\n    \"org.eclipse.jetty.websocket:jetty-websocket-jetty-common\": [\n      \"org.eclipse.jetty.websocket.common\",\n      \"org.eclipse.jetty.websocket.common.internal\"\n    ],\n    \"org.eclipse.jetty:jetty-alpn-client\": [\n      \"org.eclipse.jetty.alpn.client\"\n    ],\n    \"org.eclipse.jetty:jetty-client\": [\n      \"org.eclipse.jetty.client\",\n      \"org.eclipse.jetty.client.internal\",\n      \"org.eclipse.jetty.client.jmx\",\n      \"org.eclipse.jetty.client.transport\",\n      \"org.eclipse.jetty.client.transport.internal\"\n    ],\n    \"org.eclipse.jetty:jetty-ee\": [\n      \"org.eclipse.jetty.ee\"\n    ],\n    \"org.eclipse.jetty:jetty-http\": [\n      \"org.eclipse.jetty.http\",\n      \"org.eclipse.jetty.http.compression\",\n      \"org.eclipse.jetty.http.content\",\n      \"org.eclipse.jetty.http.pathmap\"\n    ],\n    \"org.eclipse.jetty:jetty-io\": [\n      \"org.eclipse.jetty.io\",\n      \"org.eclipse.jetty.io.content\",\n      \"org.eclipse.jetty.io.internal\",\n      \"org.eclipse.jetty.io.jmx\",\n      \"org.eclipse.jetty.io.ssl\"\n    ],\n    \"org.eclipse.jetty:jetty-plus\": [\n      \"org.eclipse.jetty.plus.annotation\",\n      \"org.eclipse.jetty.plus.jndi\",\n      \"org.eclipse.jetty.plus.security\"\n    ],\n    \"org.eclipse.jetty:jetty-security\": [\n      \"org.eclipse.jetty.security\",\n      \"org.eclipse.jetty.security.authentication\",\n      \"org.eclipse.jetty.security.internal\",\n      \"org.eclipse.jetty.security.jaas\",\n      \"org.eclipse.jetty.security.jaas.callback\",\n      \"org.eclipse.jetty.security.jaas.spi\"\n    ],\n    \"org.eclipse.jetty:jetty-server\": [\n      \"org.eclipse.jetty.server\",\n      \"org.eclipse.jetty.server.handler\",\n      \"org.eclipse.jetty.server.handler.gzip\",\n      \"org.eclipse.jetty.server.handler.jmx\",\n      \"org.eclipse.jetty.server.internal\",\n      \"org.eclipse.jetty.server.jmx\"\n    ],\n    \"org.eclipse.jetty:jetty-session\": [\n      \"org.eclipse.jetty.session\"\n    ],\n    \"org.eclipse.jetty:jetty-util\": [\n      \"org.eclipse.jetty.util\",\n      \"org.eclipse.jetty.util.annotation\",\n      \"org.eclipse.jetty.util.component\",\n      \"org.eclipse.jetty.util.compression\",\n      \"org.eclipse.jetty.util.jndi\",\n      \"org.eclipse.jetty.util.preventers\",\n      \"org.eclipse.jetty.util.resource\",\n      \"org.eclipse.jetty.util.security\",\n      \"org.eclipse.jetty.util.ssl\",\n      \"org.eclipse.jetty.util.statistic\",\n      \"org.eclipse.jetty.util.thread\",\n      \"org.eclipse.jetty.util.thread.strategy\"\n    ],\n    \"org.eclipse.jetty:jetty-xml\": [\n      \"org.eclipse.jetty.xml\"\n    ],\n    \"org.freemarker:freemarker\": [\n      \"freemarker.cache\",\n      \"freemarker.core\",\n      \"freemarker.debug\",\n      \"freemarker.debug.impl\",\n      \"freemarker.ext.ant\",\n      \"freemarker.ext.beans\",\n      \"freemarker.ext.dom\",\n      \"freemarker.ext.jakarta.jsp\",\n      \"freemarker.ext.jakarta.servlet\",\n      \"freemarker.ext.jdom\",\n      \"freemarker.ext.jsp\",\n      \"freemarker.ext.jython\",\n      \"freemarker.ext.rhino\",\n      \"freemarker.ext.servlet\",\n      \"freemarker.ext.util\",\n      \"freemarker.ext.xml\",\n      \"freemarker.log\",\n      \"freemarker.template\",\n      \"freemarker.template.utility\"\n    ],\n    \"org.hamcrest:hamcrest\": [\n      \"org.hamcrest\",\n      \"org.hamcrest.beans\",\n      \"org.hamcrest.collection\",\n      \"org.hamcrest.comparator\",\n      \"org.hamcrest.core\",\n      \"org.hamcrest.internal\",\n      \"org.hamcrest.io\",\n      \"org.hamcrest.number\",\n      \"org.hamcrest.object\",\n      \"org.hamcrest.text\",\n      \"org.hamcrest.xml\"\n    ],\n    \"org.hamcrest:hamcrest-core\": [\n      \"org.hamcrest.core.deprecated\"\n    ],\n    \"org.hdrhistogram:HdrHistogram\": [\n      \"org.HdrHistogram\",\n      \"org.HdrHistogram.packedarray\"\n    ],\n    \"org.junit.jupiter:junit-jupiter-api\": [\n      \"org.junit.jupiter.api\",\n      \"org.junit.jupiter.api.condition\",\n      \"org.junit.jupiter.api.extension\",\n      \"org.junit.jupiter.api.extension.support\",\n      \"org.junit.jupiter.api.function\",\n      \"org.junit.jupiter.api.io\",\n      \"org.junit.jupiter.api.parallel\"\n    ],\n    \"org.junit.jupiter:junit-jupiter-engine\": [\n      \"org.junit.jupiter.engine\",\n      \"org.junit.jupiter.engine.config\",\n      \"org.junit.jupiter.engine.descriptor\",\n      \"org.junit.jupiter.engine.discovery\",\n      \"org.junit.jupiter.engine.discovery.predicates\",\n      \"org.junit.jupiter.engine.execution\",\n      \"org.junit.jupiter.engine.extension\",\n      \"org.junit.jupiter.engine.support\"\n    ],\n    \"org.junit.jupiter:junit-jupiter-params\": [\n      \"org.junit.jupiter.params\",\n      \"org.junit.jupiter.params.aggregator\",\n      \"org.junit.jupiter.params.converter\",\n      \"org.junit.jupiter.params.provider\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.annotations\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.annotations.helpers\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.common\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.common.beans\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.common.fields\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.common.input\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.common.input.concurrent\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.common.iterators\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.common.processor.core\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.common.record\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.common.routine\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.conversions\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.csv\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.fixed\",\n      \"org.junit.jupiter.params.shadow.com.univocity.parsers.tsv\",\n      \"org.junit.jupiter.params.support\"\n    ],\n    \"org.junit.platform:junit-platform-commons\": [\n      \"org.junit.platform.commons\",\n      \"org.junit.platform.commons.annotation\",\n      \"org.junit.platform.commons.function\",\n      \"org.junit.platform.commons.logging\",\n      \"org.junit.platform.commons.support\",\n      \"org.junit.platform.commons.support.conversion\",\n      \"org.junit.platform.commons.util\"\n    ],\n    \"org.junit.platform:junit-platform-engine\": [\n      \"org.junit.platform.engine\",\n      \"org.junit.platform.engine.discovery\",\n      \"org.junit.platform.engine.reporting\",\n      \"org.junit.platform.engine.support.config\",\n      \"org.junit.platform.engine.support.descriptor\",\n      \"org.junit.platform.engine.support.discovery\",\n      \"org.junit.platform.engine.support.filter\",\n      \"org.junit.platform.engine.support.hierarchical\",\n      \"org.junit.platform.engine.support.store\"\n    ],\n    \"org.latencyutils:LatencyUtils\": [\n      \"org.LatencyUtils\"\n    ],\n    \"org.mockito:mockito-core\": [\n      \"org.mockito\",\n      \"org.mockito.codegen\",\n      \"org.mockito.configuration\",\n      \"org.mockito.creation.instance\",\n      \"org.mockito.exceptions.base\",\n      \"org.mockito.exceptions.misusing\",\n      \"org.mockito.exceptions.stacktrace\",\n      \"org.mockito.exceptions.verification\",\n      \"org.mockito.exceptions.verification.junit\",\n      \"org.mockito.exceptions.verification.opentest4j\",\n      \"org.mockito.hamcrest\",\n      \"org.mockito.internal\",\n      \"org.mockito.internal.configuration\",\n      \"org.mockito.internal.configuration.injection\",\n      \"org.mockito.internal.configuration.injection.filter\",\n      \"org.mockito.internal.configuration.injection.scanner\",\n      \"org.mockito.internal.configuration.plugins\",\n      \"org.mockito.internal.creation\",\n      \"org.mockito.internal.creation.bytebuddy\",\n      \"org.mockito.internal.creation.instance\",\n      \"org.mockito.internal.creation.proxy\",\n      \"org.mockito.internal.creation.settings\",\n      \"org.mockito.internal.creation.util\",\n      \"org.mockito.internal.debugging\",\n      \"org.mockito.internal.exceptions\",\n      \"org.mockito.internal.exceptions.stacktrace\",\n      \"org.mockito.internal.exceptions.util\",\n      \"org.mockito.internal.framework\",\n      \"org.mockito.internal.hamcrest\",\n      \"org.mockito.internal.handler\",\n      \"org.mockito.internal.invocation\",\n      \"org.mockito.internal.invocation.finder\",\n      \"org.mockito.internal.invocation.mockref\",\n      \"org.mockito.internal.junit\",\n      \"org.mockito.internal.listeners\",\n      \"org.mockito.internal.matchers\",\n      \"org.mockito.internal.matchers.apachecommons\",\n      \"org.mockito.internal.matchers.text\",\n      \"org.mockito.internal.progress\",\n      \"org.mockito.internal.reporting\",\n      \"org.mockito.internal.runners\",\n      \"org.mockito.internal.runners.util\",\n      \"org.mockito.internal.session\",\n      \"org.mockito.internal.stubbing\",\n      \"org.mockito.internal.stubbing.answers\",\n      \"org.mockito.internal.stubbing.defaultanswers\",\n      \"org.mockito.internal.util\",\n      \"org.mockito.internal.util.collections\",\n      \"org.mockito.internal.util.concurrent\",\n      \"org.mockito.internal.util.io\",\n      \"org.mockito.internal.util.reflection\",\n      \"org.mockito.internal.verification\",\n      \"org.mockito.internal.verification.api\",\n      \"org.mockito.internal.verification.argumentmatching\",\n      \"org.mockito.internal.verification.checkers\",\n      \"org.mockito.invocation\",\n      \"org.mockito.junit\",\n      \"org.mockito.listeners\",\n      \"org.mockito.mock\",\n      \"org.mockito.plugins\",\n      \"org.mockito.quality\",\n      \"org.mockito.session\",\n      \"org.mockito.stubbing\",\n      \"org.mockito.verification\"\n    ],\n    \"org.mockito:mockito-junit-jupiter\": [\n      \"org.mockito.junit.jupiter\",\n      \"org.mockito.junit.jupiter.resolver\"\n    ],\n    \"org.objenesis:objenesis\": [\n      \"org.objenesis\",\n      \"org.objenesis.instantiator\",\n      \"org.objenesis.instantiator.android\",\n      \"org.objenesis.instantiator.annotations\",\n      \"org.objenesis.instantiator.basic\",\n      \"org.objenesis.instantiator.gcj\",\n      \"org.objenesis.instantiator.perc\",\n      \"org.objenesis.instantiator.sun\",\n      \"org.objenesis.instantiator.util\",\n      \"org.objenesis.strategy\"\n    ],\n    \"org.opentest4j:opentest4j\": [\n      \"org.opentest4j\"\n    ],\n    \"org.osgi:org.osgi.dto\": [\n      \"org.osgi.dto\"\n    ],\n    \"org.osgi:org.osgi.framework\": [\n      \"org.osgi.framework\",\n      \"org.osgi.framework.dto\",\n      \"org.osgi.framework.hooks.bundle\",\n      \"org.osgi.framework.hooks.resolver\",\n      \"org.osgi.framework.hooks.service\",\n      \"org.osgi.framework.hooks.weaving\",\n      \"org.osgi.framework.launch\",\n      \"org.osgi.framework.namespace\",\n      \"org.osgi.framework.startlevel\",\n      \"org.osgi.framework.startlevel.dto\",\n      \"org.osgi.framework.wiring\",\n      \"org.osgi.framework.wiring.dto\"\n    ],\n    \"org.osgi:org.osgi.resource\": [\n      \"org.osgi.resource\",\n      \"org.osgi.resource.dto\"\n    ],\n    \"org.osgi:org.osgi.service.log\": [\n      \"org.osgi.service.log\"\n    ],\n    \"org.osgi:org.osgi.service.repository\": [\n      \"org.osgi.service.repository\"\n    ],\n    \"org.osgi:org.osgi.util.function\": [\n      \"org.osgi.util.function\"\n    ],\n    \"org.osgi:org.osgi.util.promise\": [\n      \"org.osgi.util.promise\"\n    ],\n    \"org.osgi:org.osgi.util.tracker\": [\n      \"org.osgi.util.tracker\"\n    ],\n    \"org.osgi:osgi.annotation\": [\n      \"org.osgi.annotation.bundle\",\n      \"org.osgi.annotation.versioning\"\n    ],\n    \"org.ow2.asm:asm\": [\n      \"org.objectweb.asm\",\n      \"org.objectweb.asm.signature\"\n    ],\n    \"org.ow2.asm:asm-analysis\": [\n      \"org.objectweb.asm.tree.analysis\"\n    ],\n    \"org.ow2.asm:asm-commons\": [\n      \"org.objectweb.asm.commons\"\n    ],\n    \"org.ow2.asm:asm-tree\": [\n      \"org.objectweb.asm.tree\"\n    ],\n    \"org.ow2.asm:asm-util\": [\n      \"org.objectweb.asm.util\"\n    ],\n    \"org.skyscreamer:jsonassert\": [\n      \"org.json\",\n      \"org.skyscreamer.jsonassert\",\n      \"org.skyscreamer.jsonassert.comparator\"\n    ],\n    \"org.slf4j:jul-to-slf4j\": [\n      \"org.slf4j.bridge\"\n    ],\n    \"org.slf4j:slf4j-api\": [\n      \"org.slf4j\",\n      \"org.slf4j.event\",\n      \"org.slf4j.helpers\",\n      \"org.slf4j.spi\"\n    ],\n    \"org.springframework.boot:spring-boot\": [\n      \"org.springframework.boot\",\n      \"org.springframework.boot.admin\",\n      \"org.springframework.boot.ansi\",\n      \"org.springframework.boot.availability\",\n      \"org.springframework.boot.builder\",\n      \"org.springframework.boot.cloud\",\n      \"org.springframework.boot.context\",\n      \"org.springframework.boot.context.annotation\",\n      \"org.springframework.boot.context.config\",\n      \"org.springframework.boot.context.event\",\n      \"org.springframework.boot.context.logging\",\n      \"org.springframework.boot.context.metrics.buffering\",\n      \"org.springframework.boot.context.properties\",\n      \"org.springframework.boot.context.properties.bind\",\n      \"org.springframework.boot.context.properties.bind.handler\",\n      \"org.springframework.boot.context.properties.bind.validation\",\n      \"org.springframework.boot.context.properties.source\",\n      \"org.springframework.boot.convert\",\n      \"org.springframework.boot.diagnostics\",\n      \"org.springframework.boot.diagnostics.analyzer\",\n      \"org.springframework.boot.env\",\n      \"org.springframework.boot.flyway\",\n      \"org.springframework.boot.http.client\",\n      \"org.springframework.boot.info\",\n      \"org.springframework.boot.io\",\n      \"org.springframework.boot.jackson\",\n      \"org.springframework.boot.jdbc\",\n      \"org.springframework.boot.jdbc.init\",\n      \"org.springframework.boot.jdbc.metadata\",\n      \"org.springframework.boot.jms\",\n      \"org.springframework.boot.jooq\",\n      \"org.springframework.boot.json\",\n      \"org.springframework.boot.liquibase\",\n      \"org.springframework.boot.logging\",\n      \"org.springframework.boot.logging.java\",\n      \"org.springframework.boot.logging.log4j2\",\n      \"org.springframework.boot.logging.logback\",\n      \"org.springframework.boot.logging.structured\",\n      \"org.springframework.boot.origin\",\n      \"org.springframework.boot.orm.jpa\",\n      \"org.springframework.boot.orm.jpa.hibernate\",\n      \"org.springframework.boot.r2dbc\",\n      \"org.springframework.boot.r2dbc.init\",\n      \"org.springframework.boot.reactor\",\n      \"org.springframework.boot.rsocket.context\",\n      \"org.springframework.boot.rsocket.messaging\",\n      \"org.springframework.boot.rsocket.netty\",\n      \"org.springframework.boot.rsocket.server\",\n      \"org.springframework.boot.security.reactive\",\n      \"org.springframework.boot.security.servlet\",\n      \"org.springframework.boot.sql.init\",\n      \"org.springframework.boot.sql.init.dependency\",\n      \"org.springframework.boot.ssl\",\n      \"org.springframework.boot.ssl.jks\",\n      \"org.springframework.boot.ssl.pem\",\n      \"org.springframework.boot.system\",\n      \"org.springframework.boot.task\",\n      \"org.springframework.boot.type.classreading\",\n      \"org.springframework.boot.util\",\n      \"org.springframework.boot.validation\",\n      \"org.springframework.boot.validation.beanvalidation\",\n      \"org.springframework.boot.web.client\",\n      \"org.springframework.boot.web.codec\",\n      \"org.springframework.boot.web.context\",\n      \"org.springframework.boot.web.embedded.jetty\",\n      \"org.springframework.boot.web.embedded.netty\",\n      \"org.springframework.boot.web.embedded.tomcat\",\n      \"org.springframework.boot.web.embedded.undertow\",\n      \"org.springframework.boot.web.error\",\n      \"org.springframework.boot.web.reactive.context\",\n      \"org.springframework.boot.web.reactive.error\",\n      \"org.springframework.boot.web.reactive.filter\",\n      \"org.springframework.boot.web.reactive.function.client\",\n      \"org.springframework.boot.web.reactive.result.view\",\n      \"org.springframework.boot.web.reactive.server\",\n      \"org.springframework.boot.web.server\",\n      \"org.springframework.boot.web.servlet\",\n      \"org.springframework.boot.web.servlet.context\",\n      \"org.springframework.boot.web.servlet.error\",\n      \"org.springframework.boot.web.servlet.filter\",\n      \"org.springframework.boot.web.servlet.server\",\n      \"org.springframework.boot.web.servlet.support\",\n      \"org.springframework.boot.web.servlet.view\",\n      \"org.springframework.boot.webservices.client\"\n    ],\n    \"org.springframework.boot:spring-boot-actuator\": [\n      \"org.springframework.boot.actuate.amqp\",\n      \"org.springframework.boot.actuate.audit\",\n      \"org.springframework.boot.actuate.audit.listener\",\n      \"org.springframework.boot.actuate.availability\",\n      \"org.springframework.boot.actuate.beans\",\n      \"org.springframework.boot.actuate.cache\",\n      \"org.springframework.boot.actuate.cassandra\",\n      \"org.springframework.boot.actuate.context\",\n      \"org.springframework.boot.actuate.context.properties\",\n      \"org.springframework.boot.actuate.couchbase\",\n      \"org.springframework.boot.actuate.data.elasticsearch\",\n      \"org.springframework.boot.actuate.data.mongo\",\n      \"org.springframework.boot.actuate.data.redis\",\n      \"org.springframework.boot.actuate.elasticsearch\",\n      \"org.springframework.boot.actuate.endpoint\",\n      \"org.springframework.boot.actuate.endpoint.annotation\",\n      \"org.springframework.boot.actuate.endpoint.invoke\",\n      \"org.springframework.boot.actuate.endpoint.invoke.convert\",\n      \"org.springframework.boot.actuate.endpoint.invoke.reflect\",\n      \"org.springframework.boot.actuate.endpoint.invoker.cache\",\n      \"org.springframework.boot.actuate.endpoint.jackson\",\n      \"org.springframework.boot.actuate.endpoint.jmx\",\n      \"org.springframework.boot.actuate.endpoint.jmx.annotation\",\n      \"org.springframework.boot.actuate.endpoint.web\",\n      \"org.springframework.boot.actuate.endpoint.web.annotation\",\n      \"org.springframework.boot.actuate.endpoint.web.jersey\",\n      \"org.springframework.boot.actuate.endpoint.web.reactive\",\n      \"org.springframework.boot.actuate.endpoint.web.servlet\",\n      \"org.springframework.boot.actuate.env\",\n      \"org.springframework.boot.actuate.flyway\",\n      \"org.springframework.boot.actuate.hazelcast\",\n      \"org.springframework.boot.actuate.health\",\n      \"org.springframework.boot.actuate.info\",\n      \"org.springframework.boot.actuate.integration\",\n      \"org.springframework.boot.actuate.jdbc\",\n      \"org.springframework.boot.actuate.jms\",\n      \"org.springframework.boot.actuate.ldap\",\n      \"org.springframework.boot.actuate.liquibase\",\n      \"org.springframework.boot.actuate.logging\",\n      \"org.springframework.boot.actuate.mail\",\n      \"org.springframework.boot.actuate.management\",\n      \"org.springframework.boot.actuate.metrics\",\n      \"org.springframework.boot.actuate.metrics.amqp\",\n      \"org.springframework.boot.actuate.metrics.annotation\",\n      \"org.springframework.boot.actuate.metrics.cache\",\n      \"org.springframework.boot.actuate.metrics.data\",\n      \"org.springframework.boot.actuate.metrics.export.prometheus\",\n      \"org.springframework.boot.actuate.metrics.http\",\n      \"org.springframework.boot.actuate.metrics.jdbc\",\n      \"org.springframework.boot.actuate.metrics.r2dbc\",\n      \"org.springframework.boot.actuate.metrics.startup\",\n      \"org.springframework.boot.actuate.metrics.system\",\n      \"org.springframework.boot.actuate.metrics.web.client\",\n      \"org.springframework.boot.actuate.metrics.web.jetty\",\n      \"org.springframework.boot.actuate.metrics.web.reactive.client\",\n      \"org.springframework.boot.actuate.metrics.web.tomcat\",\n      \"org.springframework.boot.actuate.neo4j\",\n      \"org.springframework.boot.actuate.quartz\",\n      \"org.springframework.boot.actuate.r2dbc\",\n      \"org.springframework.boot.actuate.sbom\",\n      \"org.springframework.boot.actuate.scheduling\",\n      \"org.springframework.boot.actuate.security\",\n      \"org.springframework.boot.actuate.session\",\n      \"org.springframework.boot.actuate.ssl\",\n      \"org.springframework.boot.actuate.startup\",\n      \"org.springframework.boot.actuate.system\",\n      \"org.springframework.boot.actuate.web.exchanges\",\n      \"org.springframework.boot.actuate.web.exchanges.reactive\",\n      \"org.springframework.boot.actuate.web.exchanges.servlet\",\n      \"org.springframework.boot.actuate.web.mappings\",\n      \"org.springframework.boot.actuate.web.mappings.reactive\",\n      \"org.springframework.boot.actuate.web.mappings.servlet\"\n    ],\n    \"org.springframework.boot:spring-boot-actuator-autoconfigure\": [\n      \"org.springframework.boot.actuate.autoconfigure\",\n      \"org.springframework.boot.actuate.autoconfigure.amqp\",\n      \"org.springframework.boot.actuate.autoconfigure.audit\",\n      \"org.springframework.boot.actuate.autoconfigure.availability\",\n      \"org.springframework.boot.actuate.autoconfigure.beans\",\n      \"org.springframework.boot.actuate.autoconfigure.cache\",\n      \"org.springframework.boot.actuate.autoconfigure.cassandra\",\n      \"org.springframework.boot.actuate.autoconfigure.cloudfoundry\",\n      \"org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive\",\n      \"org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet\",\n      \"org.springframework.boot.actuate.autoconfigure.condition\",\n      \"org.springframework.boot.actuate.autoconfigure.context\",\n      \"org.springframework.boot.actuate.autoconfigure.context.properties\",\n      \"org.springframework.boot.actuate.autoconfigure.couchbase\",\n      \"org.springframework.boot.actuate.autoconfigure.data.elasticsearch\",\n      \"org.springframework.boot.actuate.autoconfigure.data.mongo\",\n      \"org.springframework.boot.actuate.autoconfigure.data.redis\",\n      \"org.springframework.boot.actuate.autoconfigure.elasticsearch\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.condition\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.expose\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.jackson\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.jmx\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.web\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.web.jersey\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.web.reactive\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.web.servlet\",\n      \"org.springframework.boot.actuate.autoconfigure.env\",\n      \"org.springframework.boot.actuate.autoconfigure.flyway\",\n      \"org.springframework.boot.actuate.autoconfigure.hazelcast\",\n      \"org.springframework.boot.actuate.autoconfigure.health\",\n      \"org.springframework.boot.actuate.autoconfigure.info\",\n      \"org.springframework.boot.actuate.autoconfigure.integration\",\n      \"org.springframework.boot.actuate.autoconfigure.jdbc\",\n      \"org.springframework.boot.actuate.autoconfigure.jms\",\n      \"org.springframework.boot.actuate.autoconfigure.ldap\",\n      \"org.springframework.boot.actuate.autoconfigure.liquibase\",\n      \"org.springframework.boot.actuate.autoconfigure.logging\",\n      \"org.springframework.boot.actuate.autoconfigure.logging.otlp\",\n      \"org.springframework.boot.actuate.autoconfigure.mail\",\n      \"org.springframework.boot.actuate.autoconfigure.management\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.amqp\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.cache\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.data\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.appoptics\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.atlas\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.datadog\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.dynatrace\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.elastic\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.ganglia\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.graphite\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.humio\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.influx\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.jmx\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.kairos\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.newrelic\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.otlp\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.properties\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.signalfx\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.simple\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.stackdriver\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.statsd\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.wavefront\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.integration\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.jdbc\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.jersey\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.mongo\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.r2dbc\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.redis\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.startup\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.task\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.web.jetty\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.web.tomcat\",\n      \"org.springframework.boot.actuate.autoconfigure.neo4j\",\n      \"org.springframework.boot.actuate.autoconfigure.observation\",\n      \"org.springframework.boot.actuate.autoconfigure.observation.batch\",\n      \"org.springframework.boot.actuate.autoconfigure.observation.graphql\",\n      \"org.springframework.boot.actuate.autoconfigure.observation.web.client\",\n      \"org.springframework.boot.actuate.autoconfigure.observation.web.reactive\",\n      \"org.springframework.boot.actuate.autoconfigure.observation.web.servlet\",\n      \"org.springframework.boot.actuate.autoconfigure.opentelemetry\",\n      \"org.springframework.boot.actuate.autoconfigure.quartz\",\n      \"org.springframework.boot.actuate.autoconfigure.r2dbc\",\n      \"org.springframework.boot.actuate.autoconfigure.sbom\",\n      \"org.springframework.boot.actuate.autoconfigure.scheduling\",\n      \"org.springframework.boot.actuate.autoconfigure.security.reactive\",\n      \"org.springframework.boot.actuate.autoconfigure.security.servlet\",\n      \"org.springframework.boot.actuate.autoconfigure.session\",\n      \"org.springframework.boot.actuate.autoconfigure.ssl\",\n      \"org.springframework.boot.actuate.autoconfigure.startup\",\n      \"org.springframework.boot.actuate.autoconfigure.system\",\n      \"org.springframework.boot.actuate.autoconfigure.tracing\",\n      \"org.springframework.boot.actuate.autoconfigure.tracing.otlp\",\n      \"org.springframework.boot.actuate.autoconfigure.tracing.prometheus\",\n      \"org.springframework.boot.actuate.autoconfigure.tracing.wavefront\",\n      \"org.springframework.boot.actuate.autoconfigure.tracing.zipkin\",\n      \"org.springframework.boot.actuate.autoconfigure.wavefront\",\n      \"org.springframework.boot.actuate.autoconfigure.web\",\n      \"org.springframework.boot.actuate.autoconfigure.web.exchanges\",\n      \"org.springframework.boot.actuate.autoconfigure.web.jersey\",\n      \"org.springframework.boot.actuate.autoconfigure.web.mappings\",\n      \"org.springframework.boot.actuate.autoconfigure.web.reactive\",\n      \"org.springframework.boot.actuate.autoconfigure.web.server\",\n      \"org.springframework.boot.actuate.autoconfigure.web.servlet\"\n    ],\n    \"org.springframework.boot:spring-boot-autoconfigure\": [\n      \"org.springframework.boot.autoconfigure\",\n      \"org.springframework.boot.autoconfigure.admin\",\n      \"org.springframework.boot.autoconfigure.amqp\",\n      \"org.springframework.boot.autoconfigure.aop\",\n      \"org.springframework.boot.autoconfigure.availability\",\n      \"org.springframework.boot.autoconfigure.batch\",\n      \"org.springframework.boot.autoconfigure.cache\",\n      \"org.springframework.boot.autoconfigure.cassandra\",\n      \"org.springframework.boot.autoconfigure.codec\",\n      \"org.springframework.boot.autoconfigure.condition\",\n      \"org.springframework.boot.autoconfigure.container\",\n      \"org.springframework.boot.autoconfigure.context\",\n      \"org.springframework.boot.autoconfigure.couchbase\",\n      \"org.springframework.boot.autoconfigure.dao\",\n      \"org.springframework.boot.autoconfigure.data\",\n      \"org.springframework.boot.autoconfigure.data.cassandra\",\n      \"org.springframework.boot.autoconfigure.data.couchbase\",\n      \"org.springframework.boot.autoconfigure.data.elasticsearch\",\n      \"org.springframework.boot.autoconfigure.data.jdbc\",\n      \"org.springframework.boot.autoconfigure.data.jpa\",\n      \"org.springframework.boot.autoconfigure.data.ldap\",\n      \"org.springframework.boot.autoconfigure.data.mongo\",\n      \"org.springframework.boot.autoconfigure.data.neo4j\",\n      \"org.springframework.boot.autoconfigure.data.r2dbc\",\n      \"org.springframework.boot.autoconfigure.data.redis\",\n      \"org.springframework.boot.autoconfigure.data.rest\",\n      \"org.springframework.boot.autoconfigure.data.web\",\n      \"org.springframework.boot.autoconfigure.diagnostics.analyzer\",\n      \"org.springframework.boot.autoconfigure.domain\",\n      \"org.springframework.boot.autoconfigure.elasticsearch\",\n      \"org.springframework.boot.autoconfigure.flyway\",\n      \"org.springframework.boot.autoconfigure.freemarker\",\n      \"org.springframework.boot.autoconfigure.graphql\",\n      \"org.springframework.boot.autoconfigure.graphql.data\",\n      \"org.springframework.boot.autoconfigure.graphql.reactive\",\n      \"org.springframework.boot.autoconfigure.graphql.rsocket\",\n      \"org.springframework.boot.autoconfigure.graphql.security\",\n      \"org.springframework.boot.autoconfigure.graphql.servlet\",\n      \"org.springframework.boot.autoconfigure.groovy.template\",\n      \"org.springframework.boot.autoconfigure.gson\",\n      \"org.springframework.boot.autoconfigure.h2\",\n      \"org.springframework.boot.autoconfigure.hateoas\",\n      \"org.springframework.boot.autoconfigure.hazelcast\",\n      \"org.springframework.boot.autoconfigure.http\",\n      \"org.springframework.boot.autoconfigure.http.client\",\n      \"org.springframework.boot.autoconfigure.http.codec\",\n      \"org.springframework.boot.autoconfigure.info\",\n      \"org.springframework.boot.autoconfigure.integration\",\n      \"org.springframework.boot.autoconfigure.jackson\",\n      \"org.springframework.boot.autoconfigure.jdbc\",\n      \"org.springframework.boot.autoconfigure.jdbc.metadata\",\n      \"org.springframework.boot.autoconfigure.jersey\",\n      \"org.springframework.boot.autoconfigure.jms\",\n      \"org.springframework.boot.autoconfigure.jms.activemq\",\n      \"org.springframework.boot.autoconfigure.jms.artemis\",\n      \"org.springframework.boot.autoconfigure.jmx\",\n      \"org.springframework.boot.autoconfigure.jooq\",\n      \"org.springframework.boot.autoconfigure.jsonb\",\n      \"org.springframework.boot.autoconfigure.kafka\",\n      \"org.springframework.boot.autoconfigure.ldap\",\n      \"org.springframework.boot.autoconfigure.ldap.embedded\",\n      \"org.springframework.boot.autoconfigure.liquibase\",\n      \"org.springframework.boot.autoconfigure.logging\",\n      \"org.springframework.boot.autoconfigure.mail\",\n      \"org.springframework.boot.autoconfigure.mongo\",\n      \"org.springframework.boot.autoconfigure.mustache\",\n      \"org.springframework.boot.autoconfigure.neo4j\",\n      \"org.springframework.boot.autoconfigure.netty\",\n      \"org.springframework.boot.autoconfigure.orm.jpa\",\n      \"org.springframework.boot.autoconfigure.pulsar\",\n      \"org.springframework.boot.autoconfigure.quartz\",\n      \"org.springframework.boot.autoconfigure.r2dbc\",\n      \"org.springframework.boot.autoconfigure.reactor\",\n      \"org.springframework.boot.autoconfigure.reactor.netty\",\n      \"org.springframework.boot.autoconfigure.rsocket\",\n      \"org.springframework.boot.autoconfigure.security\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.client\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.client.reactive\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.client.servlet\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.resource\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.resource.reactive\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.resource.servlet\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.server.servlet\",\n      \"org.springframework.boot.autoconfigure.security.reactive\",\n      \"org.springframework.boot.autoconfigure.security.rsocket\",\n      \"org.springframework.boot.autoconfigure.security.saml2\",\n      \"org.springframework.boot.autoconfigure.security.servlet\",\n      \"org.springframework.boot.autoconfigure.sendgrid\",\n      \"org.springframework.boot.autoconfigure.service.connection\",\n      \"org.springframework.boot.autoconfigure.session\",\n      \"org.springframework.boot.autoconfigure.sql.init\",\n      \"org.springframework.boot.autoconfigure.ssl\",\n      \"org.springframework.boot.autoconfigure.task\",\n      \"org.springframework.boot.autoconfigure.template\",\n      \"org.springframework.boot.autoconfigure.thread\",\n      \"org.springframework.boot.autoconfigure.thymeleaf\",\n      \"org.springframework.boot.autoconfigure.transaction\",\n      \"org.springframework.boot.autoconfigure.transaction.jta\",\n      \"org.springframework.boot.autoconfigure.validation\",\n      \"org.springframework.boot.autoconfigure.web\",\n      \"org.springframework.boot.autoconfigure.web.client\",\n      \"org.springframework.boot.autoconfigure.web.embedded\",\n      \"org.springframework.boot.autoconfigure.web.format\",\n      \"org.springframework.boot.autoconfigure.web.reactive\",\n      \"org.springframework.boot.autoconfigure.web.reactive.error\",\n      \"org.springframework.boot.autoconfigure.web.reactive.function.client\",\n      \"org.springframework.boot.autoconfigure.web.servlet\",\n      \"org.springframework.boot.autoconfigure.web.servlet.error\",\n      \"org.springframework.boot.autoconfigure.webservices\",\n      \"org.springframework.boot.autoconfigure.webservices.client\",\n      \"org.springframework.boot.autoconfigure.websocket.reactive\",\n      \"org.springframework.boot.autoconfigure.websocket.servlet\"\n    ],\n    \"org.springframework.boot:spring-boot-configuration-processor\": [\n      \"org.springframework.boot.configurationprocessor\",\n      \"org.springframework.boot.configurationprocessor.fieldvalues\",\n      \"org.springframework.boot.configurationprocessor.fieldvalues.javac\",\n      \"org.springframework.boot.configurationprocessor.json\",\n      \"org.springframework.boot.configurationprocessor.metadata\",\n      \"org.springframework.boot.configurationprocessor.support\"\n    ],\n    \"org.springframework.boot:spring-boot-jarmode-tools\": [\n      \"org.springframework.boot.jarmode.tools\"\n    ],\n    \"org.springframework.boot:spring-boot-loader\": [\n      \"org.springframework.boot.loader.jar\",\n      \"org.springframework.boot.loader.jarmode\",\n      \"org.springframework.boot.loader.launch\",\n      \"org.springframework.boot.loader.log\",\n      \"org.springframework.boot.loader.net.protocol\",\n      \"org.springframework.boot.loader.net.protocol.jar\",\n      \"org.springframework.boot.loader.net.protocol.nested\",\n      \"org.springframework.boot.loader.net.util\",\n      \"org.springframework.boot.loader.nio.file\",\n      \"org.springframework.boot.loader.ref\",\n      \"org.springframework.boot.loader.zip\"\n    ],\n    \"org.springframework.boot:spring-boot-loader-tools\": [\n      \"org.springframework.boot.loader.tools\",\n      \"org.springframework.boot.loader.tools.layer\"\n    ],\n    \"org.springframework.boot:spring-boot-test\": [\n      \"org.springframework.boot.test.context\",\n      \"org.springframework.boot.test.context.assertj\",\n      \"org.springframework.boot.test.context.filter\",\n      \"org.springframework.boot.test.context.runner\",\n      \"org.springframework.boot.test.graphql.tester\",\n      \"org.springframework.boot.test.json\",\n      \"org.springframework.boot.test.mock.mockito\",\n      \"org.springframework.boot.test.mock.web\",\n      \"org.springframework.boot.test.rsocket.server\",\n      \"org.springframework.boot.test.system\",\n      \"org.springframework.boot.test.util\",\n      \"org.springframework.boot.test.web\",\n      \"org.springframework.boot.test.web.client\",\n      \"org.springframework.boot.test.web.htmlunit\",\n      \"org.springframework.boot.test.web.htmlunit.webdriver\",\n      \"org.springframework.boot.test.web.reactive.server\",\n      \"org.springframework.boot.test.web.reactor.netty\",\n      \"org.springframework.boot.test.web.server\"\n    ],\n    \"org.springframework.boot:spring-boot-test-autoconfigure\": [\n      \"org.springframework.boot.test.autoconfigure\",\n      \"org.springframework.boot.test.autoconfigure.actuate.observability\",\n      \"org.springframework.boot.test.autoconfigure.core\",\n      \"org.springframework.boot.test.autoconfigure.data.cassandra\",\n      \"org.springframework.boot.test.autoconfigure.data.couchbase\",\n      \"org.springframework.boot.test.autoconfigure.data.elasticsearch\",\n      \"org.springframework.boot.test.autoconfigure.data.jdbc\",\n      \"org.springframework.boot.test.autoconfigure.data.ldap\",\n      \"org.springframework.boot.test.autoconfigure.data.mongo\",\n      \"org.springframework.boot.test.autoconfigure.data.neo4j\",\n      \"org.springframework.boot.test.autoconfigure.data.r2dbc\",\n      \"org.springframework.boot.test.autoconfigure.data.redis\",\n      \"org.springframework.boot.test.autoconfigure.filter\",\n      \"org.springframework.boot.test.autoconfigure.graphql\",\n      \"org.springframework.boot.test.autoconfigure.graphql.tester\",\n      \"org.springframework.boot.test.autoconfigure.jdbc\",\n      \"org.springframework.boot.test.autoconfigure.jooq\",\n      \"org.springframework.boot.test.autoconfigure.json\",\n      \"org.springframework.boot.test.autoconfigure.orm.jpa\",\n      \"org.springframework.boot.test.autoconfigure.properties\",\n      \"org.springframework.boot.test.autoconfigure.restdocs\",\n      \"org.springframework.boot.test.autoconfigure.web.client\",\n      \"org.springframework.boot.test.autoconfigure.web.reactive\",\n      \"org.springframework.boot.test.autoconfigure.web.servlet\",\n      \"org.springframework.boot.test.autoconfigure.webservices.client\",\n      \"org.springframework.boot.test.autoconfigure.webservices.server\"\n    ],\n    \"org.springframework.security:spring-security-config\": [\n      \"org.springframework.security.config\",\n      \"org.springframework.security.config.annotation\",\n      \"org.springframework.security.config.annotation.authentication\",\n      \"org.springframework.security.config.annotation.authentication.builders\",\n      \"org.springframework.security.config.annotation.authentication.configuration\",\n      \"org.springframework.security.config.annotation.authentication.configurers.ldap\",\n      \"org.springframework.security.config.annotation.authentication.configurers.provisioning\",\n      \"org.springframework.security.config.annotation.authentication.configurers.userdetails\",\n      \"org.springframework.security.config.annotation.configuration\",\n      \"org.springframework.security.config.annotation.method.configuration\",\n      \"org.springframework.security.config.annotation.rsocket\",\n      \"org.springframework.security.config.annotation.web\",\n      \"org.springframework.security.config.annotation.web.builders\",\n      \"org.springframework.security.config.annotation.web.configuration\",\n      \"org.springframework.security.config.annotation.web.configurers\",\n      \"org.springframework.security.config.annotation.web.configurers.oauth2.client\",\n      \"org.springframework.security.config.annotation.web.configurers.oauth2.server.resource\",\n      \"org.springframework.security.config.annotation.web.configurers.ott\",\n      \"org.springframework.security.config.annotation.web.configurers.saml2\",\n      \"org.springframework.security.config.annotation.web.headers\",\n      \"org.springframework.security.config.annotation.web.messaging\",\n      \"org.springframework.security.config.annotation.web.oauth2.client\",\n      \"org.springframework.security.config.annotation.web.oauth2.login\",\n      \"org.springframework.security.config.annotation.web.oauth2.resourceserver\",\n      \"org.springframework.security.config.annotation.web.reactive\",\n      \"org.springframework.security.config.annotation.web.saml2\",\n      \"org.springframework.security.config.annotation.web.servlet.configuration\",\n      \"org.springframework.security.config.annotation.web.session\",\n      \"org.springframework.security.config.annotation.web.socket\",\n      \"org.springframework.security.config.aot.hint\",\n      \"org.springframework.security.config.authentication\",\n      \"org.springframework.security.config.core\",\n      \"org.springframework.security.config.core.userdetails\",\n      \"org.springframework.security.config.crypto\",\n      \"org.springframework.security.config.debug\",\n      \"org.springframework.security.config.http\",\n      \"org.springframework.security.config.ldap\",\n      \"org.springframework.security.config.method\",\n      \"org.springframework.security.config.oauth2.client\",\n      \"org.springframework.security.config.observation\",\n      \"org.springframework.security.config.provisioning\",\n      \"org.springframework.security.config.saml2\",\n      \"org.springframework.security.config.web.server\",\n      \"org.springframework.security.config.websocket\"\n    ],\n    \"org.springframework.security:spring-security-core\": [\n      \"org.springframework.security.access\",\n      \"org.springframework.security.access.annotation\",\n      \"org.springframework.security.access.event\",\n      \"org.springframework.security.access.expression\",\n      \"org.springframework.security.access.expression.method\",\n      \"org.springframework.security.access.hierarchicalroles\",\n      \"org.springframework.security.access.intercept\",\n      \"org.springframework.security.access.intercept.aopalliance\",\n      \"org.springframework.security.access.intercept.aspectj\",\n      \"org.springframework.security.access.method\",\n      \"org.springframework.security.access.prepost\",\n      \"org.springframework.security.access.vote\",\n      \"org.springframework.security.aot.hint\",\n      \"org.springframework.security.authentication\",\n      \"org.springframework.security.authentication.dao\",\n      \"org.springframework.security.authentication.event\",\n      \"org.springframework.security.authentication.jaas\",\n      \"org.springframework.security.authentication.jaas.event\",\n      \"org.springframework.security.authentication.jaas.memory\",\n      \"org.springframework.security.authentication.ott\",\n      \"org.springframework.security.authentication.ott.reactive\",\n      \"org.springframework.security.authentication.password\",\n      \"org.springframework.security.authorization\",\n      \"org.springframework.security.authorization.event\",\n      \"org.springframework.security.authorization.method\",\n      \"org.springframework.security.concurrent\",\n      \"org.springframework.security.context\",\n      \"org.springframework.security.converter\",\n      \"org.springframework.security.core\",\n      \"org.springframework.security.core.annotation\",\n      \"org.springframework.security.core.authority\",\n      \"org.springframework.security.core.authority.mapping\",\n      \"org.springframework.security.core.context\",\n      \"org.springframework.security.core.parameters\",\n      \"org.springframework.security.core.session\",\n      \"org.springframework.security.core.token\",\n      \"org.springframework.security.core.userdetails\",\n      \"org.springframework.security.core.userdetails.cache\",\n      \"org.springframework.security.core.userdetails.jdbc\",\n      \"org.springframework.security.core.userdetails.memory\",\n      \"org.springframework.security.jackson2\",\n      \"org.springframework.security.provisioning\",\n      \"org.springframework.security.scheduling\",\n      \"org.springframework.security.task\",\n      \"org.springframework.security.util\"\n    ],\n    \"org.springframework.security:spring-security-crypto\": [\n      \"org.springframework.security.crypto.argon2\",\n      \"org.springframework.security.crypto.bcrypt\",\n      \"org.springframework.security.crypto.codec\",\n      \"org.springframework.security.crypto.encrypt\",\n      \"org.springframework.security.crypto.factory\",\n      \"org.springframework.security.crypto.keygen\",\n      \"org.springframework.security.crypto.password\",\n      \"org.springframework.security.crypto.scrypt\",\n      \"org.springframework.security.crypto.util\"\n    ],\n    \"org.springframework.security:spring-security-web\": [\n      \"org.springframework.security.web\",\n      \"org.springframework.security.web.access\",\n      \"org.springframework.security.web.access.channel\",\n      \"org.springframework.security.web.access.expression\",\n      \"org.springframework.security.web.access.intercept\",\n      \"org.springframework.security.web.aot.hint\",\n      \"org.springframework.security.web.authentication\",\n      \"org.springframework.security.web.authentication.logout\",\n      \"org.springframework.security.web.authentication.ott\",\n      \"org.springframework.security.web.authentication.password\",\n      \"org.springframework.security.web.authentication.preauth\",\n      \"org.springframework.security.web.authentication.preauth.j2ee\",\n      \"org.springframework.security.web.authentication.preauth.websphere\",\n      \"org.springframework.security.web.authentication.preauth.x509\",\n      \"org.springframework.security.web.authentication.rememberme\",\n      \"org.springframework.security.web.authentication.session\",\n      \"org.springframework.security.web.authentication.switchuser\",\n      \"org.springframework.security.web.authentication.ui\",\n      \"org.springframework.security.web.authentication.www\",\n      \"org.springframework.security.web.bind.annotation\",\n      \"org.springframework.security.web.bind.support\",\n      \"org.springframework.security.web.context\",\n      \"org.springframework.security.web.context.request.async\",\n      \"org.springframework.security.web.context.support\",\n      \"org.springframework.security.web.csrf\",\n      \"org.springframework.security.web.debug\",\n      \"org.springframework.security.web.firewall\",\n      \"org.springframework.security.web.header\",\n      \"org.springframework.security.web.header.writers\",\n      \"org.springframework.security.web.header.writers.frameoptions\",\n      \"org.springframework.security.web.http\",\n      \"org.springframework.security.web.jaasapi\",\n      \"org.springframework.security.web.jackson2\",\n      \"org.springframework.security.web.method.annotation\",\n      \"org.springframework.security.web.reactive.result.method.annotation\",\n      \"org.springframework.security.web.reactive.result.view\",\n      \"org.springframework.security.web.savedrequest\",\n      \"org.springframework.security.web.server\",\n      \"org.springframework.security.web.server.authentication\",\n      \"org.springframework.security.web.server.authentication.logout\",\n      \"org.springframework.security.web.server.authentication.ott\",\n      \"org.springframework.security.web.server.authorization\",\n      \"org.springframework.security.web.server.context\",\n      \"org.springframework.security.web.server.csrf\",\n      \"org.springframework.security.web.server.firewall\",\n      \"org.springframework.security.web.server.header\",\n      \"org.springframework.security.web.server.jackson2\",\n      \"org.springframework.security.web.server.savedrequest\",\n      \"org.springframework.security.web.server.transport\",\n      \"org.springframework.security.web.server.ui\",\n      \"org.springframework.security.web.server.util.matcher\",\n      \"org.springframework.security.web.servlet.support.csrf\",\n      \"org.springframework.security.web.servlet.util.matcher\",\n      \"org.springframework.security.web.servletapi\",\n      \"org.springframework.security.web.session\",\n      \"org.springframework.security.web.util\",\n      \"org.springframework.security.web.util.matcher\",\n      \"org.springframework.security.web.webauthn.api\",\n      \"org.springframework.security.web.webauthn.authentication\",\n      \"org.springframework.security.web.webauthn.jackson\",\n      \"org.springframework.security.web.webauthn.management\",\n      \"org.springframework.security.web.webauthn.registration\"\n    ],\n    \"org.springframework:spring-aop\": [\n      \"org.aopalliance.aop\",\n      \"org.aopalliance.intercept\",\n      \"org.springframework.aop\",\n      \"org.springframework.aop.aspectj\",\n      \"org.springframework.aop.aspectj.annotation\",\n      \"org.springframework.aop.aspectj.autoproxy\",\n      \"org.springframework.aop.config\",\n      \"org.springframework.aop.framework\",\n      \"org.springframework.aop.framework.adapter\",\n      \"org.springframework.aop.framework.autoproxy\",\n      \"org.springframework.aop.framework.autoproxy.target\",\n      \"org.springframework.aop.interceptor\",\n      \"org.springframework.aop.scope\",\n      \"org.springframework.aop.support\",\n      \"org.springframework.aop.support.annotation\",\n      \"org.springframework.aop.target\",\n      \"org.springframework.aop.target.dynamic\"\n    ],\n    \"org.springframework:spring-aspects\": [\n      \"org.springframework.beans.factory.aspectj\",\n      \"org.springframework.cache.aspectj\",\n      \"org.springframework.context.annotation.aspectj\",\n      \"org.springframework.scheduling.aspectj\",\n      \"org.springframework.transaction.aspectj\"\n    ],\n    \"org.springframework:spring-beans\": [\n      \"org.springframework.beans\",\n      \"org.springframework.beans.factory\",\n      \"org.springframework.beans.factory.annotation\",\n      \"org.springframework.beans.factory.aot\",\n      \"org.springframework.beans.factory.config\",\n      \"org.springframework.beans.factory.groovy\",\n      \"org.springframework.beans.factory.parsing\",\n      \"org.springframework.beans.factory.serviceloader\",\n      \"org.springframework.beans.factory.support\",\n      \"org.springframework.beans.factory.wiring\",\n      \"org.springframework.beans.factory.xml\",\n      \"org.springframework.beans.propertyeditors\",\n      \"org.springframework.beans.support\"\n    ],\n    \"org.springframework:spring-context\": [\n      \"org.springframework.cache\",\n      \"org.springframework.cache.annotation\",\n      \"org.springframework.cache.concurrent\",\n      \"org.springframework.cache.config\",\n      \"org.springframework.cache.interceptor\",\n      \"org.springframework.cache.support\",\n      \"org.springframework.context\",\n      \"org.springframework.context.annotation\",\n      \"org.springframework.context.aot\",\n      \"org.springframework.context.config\",\n      \"org.springframework.context.event\",\n      \"org.springframework.context.expression\",\n      \"org.springframework.context.i18n\",\n      \"org.springframework.context.index\",\n      \"org.springframework.context.support\",\n      \"org.springframework.context.weaving\",\n      \"org.springframework.ejb.config\",\n      \"org.springframework.format\",\n      \"org.springframework.format.annotation\",\n      \"org.springframework.format.datetime\",\n      \"org.springframework.format.datetime.standard\",\n      \"org.springframework.format.number\",\n      \"org.springframework.format.number.money\",\n      \"org.springframework.format.support\",\n      \"org.springframework.instrument.classloading\",\n      \"org.springframework.instrument.classloading.glassfish\",\n      \"org.springframework.instrument.classloading.jboss\",\n      \"org.springframework.instrument.classloading.tomcat\",\n      \"org.springframework.jmx\",\n      \"org.springframework.jmx.access\",\n      \"org.springframework.jmx.export\",\n      \"org.springframework.jmx.export.annotation\",\n      \"org.springframework.jmx.export.assembler\",\n      \"org.springframework.jmx.export.metadata\",\n      \"org.springframework.jmx.export.naming\",\n      \"org.springframework.jmx.export.notification\",\n      \"org.springframework.jmx.support\",\n      \"org.springframework.jndi\",\n      \"org.springframework.jndi.support\",\n      \"org.springframework.scheduling\",\n      \"org.springframework.scheduling.annotation\",\n      \"org.springframework.scheduling.concurrent\",\n      \"org.springframework.scheduling.config\",\n      \"org.springframework.scheduling.support\",\n      \"org.springframework.scripting\",\n      \"org.springframework.scripting.bsh\",\n      \"org.springframework.scripting.config\",\n      \"org.springframework.scripting.groovy\",\n      \"org.springframework.scripting.support\",\n      \"org.springframework.stereotype\",\n      \"org.springframework.ui\",\n      \"org.springframework.ui.context\",\n      \"org.springframework.ui.context.support\",\n      \"org.springframework.validation\",\n      \"org.springframework.validation.annotation\",\n      \"org.springframework.validation.beanvalidation\",\n      \"org.springframework.validation.method\",\n      \"org.springframework.validation.support\"\n    ],\n    \"org.springframework:spring-context-support\": [\n      \"org.springframework.cache.caffeine\",\n      \"org.springframework.cache.jcache\",\n      \"org.springframework.cache.jcache.config\",\n      \"org.springframework.cache.jcache.interceptor\",\n      \"org.springframework.cache.transaction\",\n      \"org.springframework.mail\",\n      \"org.springframework.mail.javamail\",\n      \"org.springframework.scheduling.quartz\",\n      \"org.springframework.ui.freemarker\"\n    ],\n    \"org.springframework:spring-core\": [\n      \"org.springframework.aot\",\n      \"org.springframework.aot.generate\",\n      \"org.springframework.aot.hint\",\n      \"org.springframework.aot.hint.annotation\",\n      \"org.springframework.aot.hint.predicate\",\n      \"org.springframework.aot.hint.support\",\n      \"org.springframework.aot.nativex\",\n      \"org.springframework.aot.nativex.feature\",\n      \"org.springframework.aot.nativex.substitution\",\n      \"org.springframework.asm\",\n      \"org.springframework.cglib\",\n      \"org.springframework.cglib.beans\",\n      \"org.springframework.cglib.core\",\n      \"org.springframework.cglib.core.internal\",\n      \"org.springframework.cglib.proxy\",\n      \"org.springframework.cglib.reflect\",\n      \"org.springframework.cglib.transform\",\n      \"org.springframework.cglib.transform.impl\",\n      \"org.springframework.cglib.util\",\n      \"org.springframework.core\",\n      \"org.springframework.core.annotation\",\n      \"org.springframework.core.codec\",\n      \"org.springframework.core.convert\",\n      \"org.springframework.core.convert.converter\",\n      \"org.springframework.core.convert.support\",\n      \"org.springframework.core.env\",\n      \"org.springframework.core.io\",\n      \"org.springframework.core.io.buffer\",\n      \"org.springframework.core.io.support\",\n      \"org.springframework.core.log\",\n      \"org.springframework.core.metrics\",\n      \"org.springframework.core.metrics.jfr\",\n      \"org.springframework.core.serializer\",\n      \"org.springframework.core.serializer.support\",\n      \"org.springframework.core.style\",\n      \"org.springframework.core.task\",\n      \"org.springframework.core.task.support\",\n      \"org.springframework.core.type\",\n      \"org.springframework.core.type.classreading\",\n      \"org.springframework.core.type.filter\",\n      \"org.springframework.javapoet\",\n      \"org.springframework.lang\",\n      \"org.springframework.objenesis\",\n      \"org.springframework.objenesis.instantiator\",\n      \"org.springframework.objenesis.instantiator.android\",\n      \"org.springframework.objenesis.instantiator.annotations\",\n      \"org.springframework.objenesis.instantiator.basic\",\n      \"org.springframework.objenesis.instantiator.gcj\",\n      \"org.springframework.objenesis.instantiator.perc\",\n      \"org.springframework.objenesis.instantiator.sun\",\n      \"org.springframework.objenesis.instantiator.util\",\n      \"org.springframework.objenesis.strategy\",\n      \"org.springframework.util\",\n      \"org.springframework.util.backoff\",\n      \"org.springframework.util.comparator\",\n      \"org.springframework.util.concurrent\",\n      \"org.springframework.util.function\",\n      \"org.springframework.util.unit\",\n      \"org.springframework.util.xml\"\n    ],\n    \"org.springframework:spring-expression\": [\n      \"org.springframework.expression\",\n      \"org.springframework.expression.common\",\n      \"org.springframework.expression.spel\",\n      \"org.springframework.expression.spel.ast\",\n      \"org.springframework.expression.spel.standard\",\n      \"org.springframework.expression.spel.support\"\n    ],\n    \"org.springframework:spring-jcl\": [\n      \"org.apache.commons.logging\",\n      \"org.apache.commons.logging.impl\"\n    ],\n    \"org.springframework:spring-jdbc\": [\n      \"org.springframework.jdbc\",\n      \"org.springframework.jdbc.config\",\n      \"org.springframework.jdbc.core\",\n      \"org.springframework.jdbc.core.metadata\",\n      \"org.springframework.jdbc.core.namedparam\",\n      \"org.springframework.jdbc.core.simple\",\n      \"org.springframework.jdbc.core.support\",\n      \"org.springframework.jdbc.datasource\",\n      \"org.springframework.jdbc.datasource.embedded\",\n      \"org.springframework.jdbc.datasource.init\",\n      \"org.springframework.jdbc.datasource.lookup\",\n      \"org.springframework.jdbc.object\",\n      \"org.springframework.jdbc.support\",\n      \"org.springframework.jdbc.support.incrementer\",\n      \"org.springframework.jdbc.support.lob\",\n      \"org.springframework.jdbc.support.rowset\",\n      \"org.springframework.jdbc.support.xml\"\n    ],\n    \"org.springframework:spring-test\": [\n      \"org.springframework.mock.env\",\n      \"org.springframework.mock.http\",\n      \"org.springframework.mock.http.client\",\n      \"org.springframework.mock.http.client.reactive\",\n      \"org.springframework.mock.http.server.reactive\",\n      \"org.springframework.mock.web\",\n      \"org.springframework.mock.web.reactive.function.server\",\n      \"org.springframework.mock.web.server\",\n      \"org.springframework.test.annotation\",\n      \"org.springframework.test.context\",\n      \"org.springframework.test.context.aot\",\n      \"org.springframework.test.context.bean.override\",\n      \"org.springframework.test.context.bean.override.convention\",\n      \"org.springframework.test.context.bean.override.mockito\",\n      \"org.springframework.test.context.cache\",\n      \"org.springframework.test.context.event\",\n      \"org.springframework.test.context.event.annotation\",\n      \"org.springframework.test.context.hint\",\n      \"org.springframework.test.context.jdbc\",\n      \"org.springframework.test.context.junit.jupiter\",\n      \"org.springframework.test.context.junit.jupiter.web\",\n      \"org.springframework.test.context.junit4\",\n      \"org.springframework.test.context.junit4.rules\",\n      \"org.springframework.test.context.junit4.statements\",\n      \"org.springframework.test.context.observation\",\n      \"org.springframework.test.context.support\",\n      \"org.springframework.test.context.testng\",\n      \"org.springframework.test.context.transaction\",\n      \"org.springframework.test.context.util\",\n      \"org.springframework.test.context.web\",\n      \"org.springframework.test.context.web.socket\",\n      \"org.springframework.test.http\",\n      \"org.springframework.test.jdbc\",\n      \"org.springframework.test.json\",\n      \"org.springframework.test.util\",\n      \"org.springframework.test.validation\",\n      \"org.springframework.test.web\",\n      \"org.springframework.test.web.client\",\n      \"org.springframework.test.web.client.match\",\n      \"org.springframework.test.web.client.response\",\n      \"org.springframework.test.web.reactive.server\",\n      \"org.springframework.test.web.servlet\",\n      \"org.springframework.test.web.servlet.assertj\",\n      \"org.springframework.test.web.servlet.client\",\n      \"org.springframework.test.web.servlet.htmlunit\",\n      \"org.springframework.test.web.servlet.htmlunit.webdriver\",\n      \"org.springframework.test.web.servlet.request\",\n      \"org.springframework.test.web.servlet.result\",\n      \"org.springframework.test.web.servlet.setup\"\n    ],\n    \"org.springframework:spring-tx\": [\n      \"org.springframework.dao\",\n      \"org.springframework.dao.annotation\",\n      \"org.springframework.dao.support\",\n      \"org.springframework.jca.endpoint\",\n      \"org.springframework.jca.support\",\n      \"org.springframework.transaction\",\n      \"org.springframework.transaction.annotation\",\n      \"org.springframework.transaction.config\",\n      \"org.springframework.transaction.event\",\n      \"org.springframework.transaction.interceptor\",\n      \"org.springframework.transaction.jta\",\n      \"org.springframework.transaction.reactive\",\n      \"org.springframework.transaction.support\"\n    ],\n    \"org.springframework:spring-web\": [\n      \"org.springframework.http\",\n      \"org.springframework.http.client\",\n      \"org.springframework.http.client.observation\",\n      \"org.springframework.http.client.reactive\",\n      \"org.springframework.http.client.support\",\n      \"org.springframework.http.codec\",\n      \"org.springframework.http.codec.cbor\",\n      \"org.springframework.http.codec.json\",\n      \"org.springframework.http.codec.multipart\",\n      \"org.springframework.http.codec.protobuf\",\n      \"org.springframework.http.codec.support\",\n      \"org.springframework.http.codec.xml\",\n      \"org.springframework.http.converter\",\n      \"org.springframework.http.converter.cbor\",\n      \"org.springframework.http.converter.feed\",\n      \"org.springframework.http.converter.json\",\n      \"org.springframework.http.converter.protobuf\",\n      \"org.springframework.http.converter.smile\",\n      \"org.springframework.http.converter.support\",\n      \"org.springframework.http.converter.xml\",\n      \"org.springframework.http.converter.yaml\",\n      \"org.springframework.http.server\",\n      \"org.springframework.http.server.observation\",\n      \"org.springframework.http.server.reactive\",\n      \"org.springframework.http.server.reactive.observation\",\n      \"org.springframework.http.support\",\n      \"org.springframework.web\",\n      \"org.springframework.web.accept\",\n      \"org.springframework.web.bind\",\n      \"org.springframework.web.bind.annotation\",\n      \"org.springframework.web.bind.support\",\n      \"org.springframework.web.client\",\n      \"org.springframework.web.client.support\",\n      \"org.springframework.web.context\",\n      \"org.springframework.web.context.annotation\",\n      \"org.springframework.web.context.request\",\n      \"org.springframework.web.context.request.async\",\n      \"org.springframework.web.context.support\",\n      \"org.springframework.web.cors\",\n      \"org.springframework.web.cors.reactive\",\n      \"org.springframework.web.filter\",\n      \"org.springframework.web.filter.reactive\",\n      \"org.springframework.web.jsf\",\n      \"org.springframework.web.jsf.el\",\n      \"org.springframework.web.method\",\n      \"org.springframework.web.method.annotation\",\n      \"org.springframework.web.method.support\",\n      \"org.springframework.web.multipart\",\n      \"org.springframework.web.multipart.support\",\n      \"org.springframework.web.server\",\n      \"org.springframework.web.server.adapter\",\n      \"org.springframework.web.server.handler\",\n      \"org.springframework.web.server.i18n\",\n      \"org.springframework.web.server.session\",\n      \"org.springframework.web.service\",\n      \"org.springframework.web.service.annotation\",\n      \"org.springframework.web.service.invoker\",\n      \"org.springframework.web.util\",\n      \"org.springframework.web.util.pattern\"\n    ],\n    \"org.springframework:spring-webmvc\": [\n      \"org.springframework.web.servlet\",\n      \"org.springframework.web.servlet.config\",\n      \"org.springframework.web.servlet.config.annotation\",\n      \"org.springframework.web.servlet.function\",\n      \"org.springframework.web.servlet.function.support\",\n      \"org.springframework.web.servlet.handler\",\n      \"org.springframework.web.servlet.i18n\",\n      \"org.springframework.web.servlet.mvc\",\n      \"org.springframework.web.servlet.mvc.annotation\",\n      \"org.springframework.web.servlet.mvc.condition\",\n      \"org.springframework.web.servlet.mvc.method\",\n      \"org.springframework.web.servlet.mvc.method.annotation\",\n      \"org.springframework.web.servlet.mvc.support\",\n      \"org.springframework.web.servlet.resource\",\n      \"org.springframework.web.servlet.support\",\n      \"org.springframework.web.servlet.tags\",\n      \"org.springframework.web.servlet.tags.form\",\n      \"org.springframework.web.servlet.theme\",\n      \"org.springframework.web.servlet.view\",\n      \"org.springframework.web.servlet.view.document\",\n      \"org.springframework.web.servlet.view.feed\",\n      \"org.springframework.web.servlet.view.freemarker\",\n      \"org.springframework.web.servlet.view.groovy\",\n      \"org.springframework.web.servlet.view.json\",\n      \"org.springframework.web.servlet.view.script\",\n      \"org.springframework.web.servlet.view.xml\",\n      \"org.springframework.web.servlet.view.xslt\"\n    ],\n    \"org.thymeleaf:thymeleaf\": [\n      \"org.thymeleaf\",\n      \"org.thymeleaf.cache\",\n      \"org.thymeleaf.context\",\n      \"org.thymeleaf.dialect\",\n      \"org.thymeleaf.engine\",\n      \"org.thymeleaf.exceptions\",\n      \"org.thymeleaf.expression\",\n      \"org.thymeleaf.inline\",\n      \"org.thymeleaf.linkbuilder\",\n      \"org.thymeleaf.messageresolver\",\n      \"org.thymeleaf.model\",\n      \"org.thymeleaf.postprocessor\",\n      \"org.thymeleaf.preprocessor\",\n      \"org.thymeleaf.processor\",\n      \"org.thymeleaf.processor.cdatasection\",\n      \"org.thymeleaf.processor.comment\",\n      \"org.thymeleaf.processor.doctype\",\n      \"org.thymeleaf.processor.element\",\n      \"org.thymeleaf.processor.processinginstruction\",\n      \"org.thymeleaf.processor.templateboundaries\",\n      \"org.thymeleaf.processor.text\",\n      \"org.thymeleaf.processor.xmldeclaration\",\n      \"org.thymeleaf.standard\",\n      \"org.thymeleaf.standard.expression\",\n      \"org.thymeleaf.standard.inline\",\n      \"org.thymeleaf.standard.processor\",\n      \"org.thymeleaf.standard.serializer\",\n      \"org.thymeleaf.standard.util\",\n      \"org.thymeleaf.templatemode\",\n      \"org.thymeleaf.templateparser\",\n      \"org.thymeleaf.templateparser.markup\",\n      \"org.thymeleaf.templateparser.markup.decoupled\",\n      \"org.thymeleaf.templateparser.raw\",\n      \"org.thymeleaf.templateparser.reader\",\n      \"org.thymeleaf.templateparser.text\",\n      \"org.thymeleaf.templateresolver\",\n      \"org.thymeleaf.templateresource\",\n      \"org.thymeleaf.util\",\n      \"org.thymeleaf.util.temporal\",\n      \"org.thymeleaf.web\",\n      \"org.thymeleaf.web.servlet\"\n    ],\n    \"org.thymeleaf:thymeleaf-spring6\": [\n      \"org.thymeleaf.spring6\",\n      \"org.thymeleaf.spring6.context\",\n      \"org.thymeleaf.spring6.context.webflux\",\n      \"org.thymeleaf.spring6.context.webmvc\",\n      \"org.thymeleaf.spring6.dialect\",\n      \"org.thymeleaf.spring6.expression\",\n      \"org.thymeleaf.spring6.messageresolver\",\n      \"org.thymeleaf.spring6.naming\",\n      \"org.thymeleaf.spring6.processor\",\n      \"org.thymeleaf.spring6.requestdata\",\n      \"org.thymeleaf.spring6.templateresolver\",\n      \"org.thymeleaf.spring6.templateresource\",\n      \"org.thymeleaf.spring6.util\",\n      \"org.thymeleaf.spring6.view\",\n      \"org.thymeleaf.spring6.view.reactive\",\n      \"org.thymeleaf.spring6.web.webflux\",\n      \"org.thymeleaf.spring6.webflow.view\"\n    ],\n    \"org.unbescape:unbescape\": [\n      \"org.unbescape\",\n      \"org.unbescape.css\",\n      \"org.unbescape.csv\",\n      \"org.unbescape.html\",\n      \"org.unbescape.java\",\n      \"org.unbescape.javascript\",\n      \"org.unbescape.json\",\n      \"org.unbescape.properties\",\n      \"org.unbescape.uri\",\n      \"org.unbescape.xml\"\n    ],\n    \"org.xmlunit:xmlunit-core\": [\n      \"org.xmlunit\",\n      \"org.xmlunit.builder\",\n      \"org.xmlunit.builder.javax_jaxb\",\n      \"org.xmlunit.diff\",\n      \"org.xmlunit.input\",\n      \"org.xmlunit.transform\",\n      \"org.xmlunit.util\",\n      \"org.xmlunit.validation\",\n      \"org.xmlunit.xpath\"\n    ],\n    \"org.yaml:snakeyaml\": [\n      \"org.yaml.snakeyaml\",\n      \"org.yaml.snakeyaml.comments\",\n      \"org.yaml.snakeyaml.composer\",\n      \"org.yaml.snakeyaml.constructor\",\n      \"org.yaml.snakeyaml.emitter\",\n      \"org.yaml.snakeyaml.env\",\n      \"org.yaml.snakeyaml.error\",\n      \"org.yaml.snakeyaml.events\",\n      \"org.yaml.snakeyaml.extensions.compactnotation\",\n      \"org.yaml.snakeyaml.external.biz.base64Coder\",\n      \"org.yaml.snakeyaml.external.com.google.gdata.util.common.base\",\n      \"org.yaml.snakeyaml.inspector\",\n      \"org.yaml.snakeyaml.internal\",\n      \"org.yaml.snakeyaml.introspector\",\n      \"org.yaml.snakeyaml.nodes\",\n      \"org.yaml.snakeyaml.parser\",\n      \"org.yaml.snakeyaml.reader\",\n      \"org.yaml.snakeyaml.representer\",\n      \"org.yaml.snakeyaml.resolver\",\n      \"org.yaml.snakeyaml.scanner\",\n      \"org.yaml.snakeyaml.serializer\",\n      \"org.yaml.snakeyaml.tokens\",\n      \"org.yaml.snakeyaml.util\"\n    ]\n  },\n  \"repositories\": {\n    \"https://repo1.maven.org/maven2/\": [\n      \"biz.aQute.bnd:biz.aQute.bnd.util\",\n      \"biz.aQute.bnd:biz.aQute.bndlib\",\n      \"ch.qos.logback:logback-classic\",\n      \"ch.qos.logback:logback-core\",\n      \"com.fasterxml.jackson.core:jackson-annotations\",\n      \"com.fasterxml.jackson.core:jackson-core\",\n      \"com.fasterxml.jackson.core:jackson-databind\",\n      \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\",\n      \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\",\n      \"com.fasterxml.jackson.module:jackson-module-parameter-names\",\n      \"com.google.auto.value:auto-value-annotations\",\n      \"com.google.caliper:caliper\",\n      \"com.google.caliper:caliper-api\",\n      \"com.google.caliper:caliper-core\",\n      \"com.google.caliper:caliper-runner\",\n      \"com.google.caliper:caliper-util\",\n      \"com.google.caliper:caliper-worker\",\n      \"com.google.caliper:caliper-worker-jvm\",\n      \"com.google.code.findbugs:jsr305\",\n      \"com.google.code.gson:gson\",\n      \"com.google.code.java-allocation-instrumenter:java-allocation-instrumenter\",\n      \"com.google.dagger:dagger\",\n      \"com.google.dagger:dagger-producers\",\n      \"com.google.errorprone:error_prone_annotations\",\n      \"com.google.guava:failureaccess\",\n      \"com.google.guava:guava\",\n      \"com.google.guava:guava-testlib\",\n      \"com.google.guava:listenablefuture\",\n      \"com.google.j2objc:j2objc-annotations\",\n      \"com.google.truth:truth\",\n      \"com.jayway.jsonpath:json-path\",\n      \"com.squareup.okhttp:okhttp\",\n      \"com.squareup.okio:okio\",\n      \"com.sun.jersey:jersey-client\",\n      \"com.sun.jersey:jersey-core\",\n      \"com.vaadin.external.google:android-json\",\n      \"com.zaxxer:HikariCP\",\n      \"info.picocli:picocli\",\n      \"io.micrometer:micrometer-commons\",\n      \"io.micrometer:micrometer-core\",\n      \"io.micrometer:micrometer-jakarta9\",\n      \"io.micrometer:micrometer-observation\",\n      \"jakarta.activation:jakarta.activation-api\",\n      \"jakarta.annotation:jakarta.annotation-api\",\n      \"jakarta.enterprise:jakarta.enterprise.cdi-api\",\n      \"jakarta.enterprise:jakarta.enterprise.lang-model\",\n      \"jakarta.inject:jakarta.inject-api\",\n      \"jakarta.interceptor:jakarta.interceptor-api\",\n      \"jakarta.servlet:jakarta.servlet-api\",\n      \"jakarta.transaction:jakarta.transaction-api\",\n      \"jakarta.websocket:jakarta.websocket-api\",\n      \"jakarta.websocket:jakarta.websocket-client-api\",\n      \"jakarta.xml.bind:jakarta.xml.bind-api\",\n      \"javax.annotation:javax.annotation-api\",\n      \"javax.inject:javax.inject\",\n      \"javax.ws.rs:jsr311-api\",\n      \"joda-time:joda-time\",\n      \"junit:junit\",\n      \"net.bytebuddy:byte-buddy\",\n      \"net.bytebuddy:byte-buddy-agent\",\n      \"net.minidev:accessors-smart\",\n      \"net.minidev:json-smart\",\n      \"org.apache.commons:commons-compress\",\n      \"org.apache.logging.log4j:log4j-api\",\n      \"org.apache.logging.log4j:log4j-to-slf4j\",\n      \"org.apache.tomcat.embed:tomcat-embed-core\",\n      \"org.apache.tomcat.embed:tomcat-embed-el\",\n      \"org.apache.tomcat.embed:tomcat-embed-websocket\",\n      \"org.apiguardian:apiguardian-api\",\n      \"org.aspectj:aspectjweaver\",\n      \"org.assertj:assertj-core\",\n      \"org.attoparser:attoparser\",\n      \"org.awaitility:awaitility\",\n      \"org.checkerframework:checker-compat-qual\",\n      \"org.checkerframework:checker-qual\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-common\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server\",\n      \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-servlet\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-annotations\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-plus\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-servlet\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-servlets\",\n      \"org.eclipse.jetty.ee10:jetty-ee10-webapp\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-core-client\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-core-common\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-core-server\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-jetty-api\",\n      \"org.eclipse.jetty.websocket:jetty-websocket-jetty-common\",\n      \"org.eclipse.jetty:jetty-alpn-client\",\n      \"org.eclipse.jetty:jetty-client\",\n      \"org.eclipse.jetty:jetty-ee\",\n      \"org.eclipse.jetty:jetty-http\",\n      \"org.eclipse.jetty:jetty-io\",\n      \"org.eclipse.jetty:jetty-plus\",\n      \"org.eclipse.jetty:jetty-security\",\n      \"org.eclipse.jetty:jetty-server\",\n      \"org.eclipse.jetty:jetty-session\",\n      \"org.eclipse.jetty:jetty-util\",\n      \"org.eclipse.jetty:jetty-xml\",\n      \"org.freemarker:freemarker\",\n      \"org.hamcrest:hamcrest\",\n      \"org.hamcrest:hamcrest-core\",\n      \"org.hdrhistogram:HdrHistogram\",\n      \"org.junit.jupiter:junit-jupiter\",\n      \"org.junit.jupiter:junit-jupiter-api\",\n      \"org.junit.jupiter:junit-jupiter-engine\",\n      \"org.junit.jupiter:junit-jupiter-params\",\n      \"org.junit.platform:junit-platform-commons\",\n      \"org.junit.platform:junit-platform-engine\",\n      \"org.latencyutils:LatencyUtils\",\n      \"org.mockito:mockito-core\",\n      \"org.mockito:mockito-junit-jupiter\",\n      \"org.objenesis:objenesis\",\n      \"org.opentest4j:opentest4j\",\n      \"org.osgi:org.osgi.dto\",\n      \"org.osgi:org.osgi.framework\",\n      \"org.osgi:org.osgi.resource\",\n      \"org.osgi:org.osgi.service.log\",\n      \"org.osgi:org.osgi.service.repository\",\n      \"org.osgi:org.osgi.util.function\",\n      \"org.osgi:org.osgi.util.promise\",\n      \"org.osgi:org.osgi.util.tracker\",\n      \"org.osgi:osgi.annotation\",\n      \"org.ow2.asm:asm\",\n      \"org.ow2.asm:asm-analysis\",\n      \"org.ow2.asm:asm-commons\",\n      \"org.ow2.asm:asm-tree\",\n      \"org.ow2.asm:asm-util\",\n      \"org.skyscreamer:jsonassert\",\n      \"org.slf4j:jul-to-slf4j\",\n      \"org.slf4j:slf4j-api\",\n      \"org.springframework.boot:spring-boot\",\n      \"org.springframework.boot:spring-boot-actuator\",\n      \"org.springframework.boot:spring-boot-actuator-autoconfigure\",\n      \"org.springframework.boot:spring-boot-autoconfigure\",\n      \"org.springframework.boot:spring-boot-configuration-processor\",\n      \"org.springframework.boot:spring-boot-jarmode-tools\",\n      \"org.springframework.boot:spring-boot-loader\",\n      \"org.springframework.boot:spring-boot-loader-tools\",\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework.boot:spring-boot-starter-actuator\",\n      \"org.springframework.boot:spring-boot-starter-freemarker\",\n      \"org.springframework.boot:spring-boot-starter-jdbc\",\n      \"org.springframework.boot:spring-boot-starter-jetty\",\n      \"org.springframework.boot:spring-boot-starter-json\",\n      \"org.springframework.boot:spring-boot-starter-logging\",\n      \"org.springframework.boot:spring-boot-starter-security\",\n      \"org.springframework.boot:spring-boot-starter-test\",\n      \"org.springframework.boot:spring-boot-starter-thymeleaf\",\n      \"org.springframework.boot:spring-boot-starter-tomcat\",\n      \"org.springframework.boot:spring-boot-starter-web\",\n      \"org.springframework.boot:spring-boot-test\",\n      \"org.springframework.boot:spring-boot-test-autoconfigure\",\n      \"org.springframework.security:spring-security-config\",\n      \"org.springframework.security:spring-security-core\",\n      \"org.springframework.security:spring-security-crypto\",\n      \"org.springframework.security:spring-security-web\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-aspects\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-context-support\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-expression\",\n      \"org.springframework:spring-jcl\",\n      \"org.springframework:spring-jdbc\",\n      \"org.springframework:spring-test\",\n      \"org.springframework:spring-tx\",\n      \"org.springframework:spring-web\",\n      \"org.springframework:spring-webmvc\",\n      \"org.thymeleaf:thymeleaf\",\n      \"org.thymeleaf:thymeleaf-spring6\",\n      \"org.unbescape:unbescape\",\n      \"org.xmlunit:xmlunit-core\",\n      \"org.yaml:snakeyaml\"\n    ]\n  },\n  \"services\": {\n    \"ch.qos.logback:logback-classic\": {\n      \"jakarta.servlet.ServletContainerInitializer\": [\n        \"ch.qos.logback.classic.servlet.LogbackServletContainerInitializer\"\n      ],\n      \"org.slf4j.spi.SLF4JServiceProvider\": [\n        \"ch.qos.logback.classic.spi.LogbackServiceProvider\"\n      ]\n    },\n    \"com.fasterxml.jackson.core:jackson-core\": {\n      \"com.fasterxml.jackson.core.JsonFactory\": [\n        \"com.fasterxml.jackson.core.JsonFactory\"\n      ]\n    },\n    \"com.fasterxml.jackson.core:jackson-databind\": {\n      \"com.fasterxml.jackson.core.ObjectCodec\": [\n        \"com.fasterxml.jackson.databind.ObjectMapper\"\n      ]\n    },\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\": {\n      \"com.fasterxml.jackson.databind.Module\": [\n        \"com.fasterxml.jackson.datatype.jdk8.Jdk8Module\"\n      ]\n    },\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\": {\n      \"com.fasterxml.jackson.databind.Module\": [\n        \"com.fasterxml.jackson.datatype.jsr310.JavaTimeModule\"\n      ]\n    },\n    \"com.fasterxml.jackson.module:jackson-module-parameter-names\": {\n      \"com.fasterxml.jackson.databind.Module\": [\n        \"com.fasterxml.jackson.module.paramnames.ParameterNamesModule\"\n      ]\n    },\n    \"com.sun.jersey:jersey-core\": {\n      \"com.sun.jersey.spi.HeaderDelegateProvider\": [\n        \"com.sun.jersey.core.impl.provider.header.CacheControlProvider\",\n        \"com.sun.jersey.core.impl.provider.header.CookieProvider\",\n        \"com.sun.jersey.core.impl.provider.header.DateProvider\",\n        \"com.sun.jersey.core.impl.provider.header.EntityTagProvider\",\n        \"com.sun.jersey.core.impl.provider.header.LocaleProvider\",\n        \"com.sun.jersey.core.impl.provider.header.MediaTypeProvider\",\n        \"com.sun.jersey.core.impl.provider.header.NewCookieProvider\",\n        \"com.sun.jersey.core.impl.provider.header.StringProvider\",\n        \"com.sun.jersey.core.impl.provider.header.URIProvider\"\n      ],\n      \"com.sun.jersey.spi.inject.InjectableProvider\": [\n        \"com.sun.jersey.core.impl.provider.xml.DocumentBuilderFactoryProvider\",\n        \"com.sun.jersey.core.impl.provider.xml.SAXParserContextProvider\",\n        \"com.sun.jersey.core.impl.provider.xml.TransformerFactoryProvider\",\n        \"com.sun.jersey.core.impl.provider.xml.XMLStreamReaderContextProvider\"\n      ],\n      \"javax.ws.rs.ext.MessageBodyReader\": [\n        \"com.sun.jersey.core.impl.provider.entity.ByteArrayProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.DataSourceProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.DocumentProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.EntityHolderReader\",\n        \"com.sun.jersey.core.impl.provider.entity.FileProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.FormMultivaluedMapProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.FormProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.InputStreamProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.ReaderProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.RenderedImageProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader\",\n        \"com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader\",\n        \"com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader\",\n        \"com.sun.jersey.core.impl.provider.entity.StringProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$App\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$App\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$Text\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$Text\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$App\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$Text\"\n      ],\n      \"javax.ws.rs.ext.MessageBodyWriter\": [\n        \"com.sun.jersey.core.impl.provider.entity.ByteArrayProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.DataSourceProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.DocumentProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.FileProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.FormMultivaluedMapProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.FormProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.InputStreamProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.ReaderProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.RenderedImageProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.SourceProvider$SourceWriter\",\n        \"com.sun.jersey.core.impl.provider.entity.StreamingOutputProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.StringProvider\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$App\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$Text\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$App\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$Text\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$App\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General\",\n        \"com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$Text\"\n      ]\n    },\n    \"io.micrometer:micrometer-observation\": {\n      \"io.micrometer.context.ThreadLocalAccessor\": [\n        \"io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor\"\n      ]\n    },\n    \"org.apache.logging.log4j:log4j-api\": {\n      \"org.apache.logging.log4j.util.PropertySource\": [\n        \"org.apache.logging.log4j.util.EnvironmentPropertySource\",\n        \"org.apache.logging.log4j.util.SystemPropertiesPropertySource\"\n      ]\n    },\n    \"org.apache.logging.log4j:log4j-to-slf4j\": {\n      \"org.apache.logging.log4j.spi.Provider\": [\n        \"org.apache.logging.slf4j.SLF4JProvider\"\n      ]\n    },\n    \"org.apache.tomcat.embed:tomcat-embed-el\": {\n      \"jakarta.el.ExpressionFactory\": [\n        \"org.apache.el.ExpressionFactoryImpl\"\n      ]\n    },\n    \"org.apache.tomcat.embed:tomcat-embed-websocket\": {\n      \"jakarta.servlet.ServletContainerInitializer\": [\n        \"org.apache.tomcat.websocket.server.WsSci\"\n      ],\n      \"jakarta.websocket.ContainerProvider\": [\n        \"org.apache.tomcat.websocket.WsContainerProvider\"\n      ],\n      \"jakarta.websocket.server.ServerEndpointConfig$Configurator\": [\n        \"org.apache.tomcat.websocket.server.DefaultServerEndpointConfigurator\"\n      ]\n    },\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-client\": {\n      \"jakarta.websocket.ContainerProvider\": [\n        \"org.eclipse.jetty.ee10.websocket.jakarta.client.JakartaWebSocketClientContainerProvider\"\n      ]\n    },\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jakarta-server\": {\n      \"jakarta.servlet.ServletContainerInitializer\": [\n        \"org.eclipse.jetty.ee10.websocket.jakarta.server.config.JakartaWebSocketServletContainerInitializer\"\n      ],\n      \"jakarta.websocket.server.ServerEndpointConfig$Configurator\": [\n        \"org.eclipse.jetty.ee10.websocket.jakarta.server.config.ContainerDefaultConfigurator\"\n      ],\n      \"org.eclipse.jetty.ee10.webapp.Configuration\": [\n        \"org.eclipse.jetty.ee10.websocket.jakarta.server.config.JakartaWebSocketConfiguration\"\n      ]\n    },\n    \"org.eclipse.jetty.ee10.websocket:jetty-ee10-websocket-jetty-server\": {\n      \"jakarta.servlet.ServletContainerInitializer\": [\n        \"org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketServletContainerInitializer\"\n      ],\n      \"org.eclipse.jetty.ee10.webapp.Configuration\": [\n        \"org.eclipse.jetty.ee10.websocket.server.config.JettyWebSocketConfiguration\"\n      ]\n    },\n    \"org.eclipse.jetty.ee10:jetty-ee10-annotations\": {\n      \"org.eclipse.jetty.ee10.webapp.Configuration\": [\n        \"org.eclipse.jetty.ee10.annotations.AnnotationConfiguration\"\n      ]\n    },\n    \"org.eclipse.jetty.ee10:jetty-ee10-plus\": {\n      \"org.eclipse.jetty.ee10.webapp.Configuration\": [\n        \"org.eclipse.jetty.ee10.plus.webapp.EnvConfiguration\",\n        \"org.eclipse.jetty.ee10.plus.webapp.PlusConfiguration\"\n      ]\n    },\n    \"org.eclipse.jetty.ee10:jetty-ee10-webapp\": {\n      \"org.eclipse.jetty.ee10.webapp.Configuration\": [\n        \"org.eclipse.jetty.ee10.webapp.FragmentConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.JaasConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.JaspiConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.JettyWebXmlConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.JmxConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.JndiConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.JspConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.MetaInfConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.ServletsConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.WebAppConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.WebInfConfiguration\",\n        \"org.eclipse.jetty.ee10.webapp.WebXmlConfiguration\"\n      ]\n    },\n    \"org.eclipse.jetty.websocket:jetty-websocket-core-common\": {\n      \"org.eclipse.jetty.websocket.core.Extension\": [\n        \"org.eclipse.jetty.websocket.core.internal.FragmentExtension\",\n        \"org.eclipse.jetty.websocket.core.internal.FrameCaptureExtension\",\n        \"org.eclipse.jetty.websocket.core.internal.IdentityExtension\",\n        \"org.eclipse.jetty.websocket.core.internal.PerMessageDeflateExtension\",\n        \"org.eclipse.jetty.websocket.core.internal.ValidationExtension\"\n      ]\n    },\n    \"org.eclipse.jetty.websocket:jetty-websocket-jetty-common\": {\n      \"org.eclipse.jetty.websocket.api.ExtensionConfig$Parser\": [\n        \"org.eclipse.jetty.websocket.common.ExtensionConfigParser\"\n      ]\n    },\n    \"org.eclipse.jetty:jetty-http\": {\n      \"org.eclipse.jetty.http.HttpFieldPreEncoder\": [\n        \"org.eclipse.jetty.http.Http10FieldPreEncoder\",\n        \"org.eclipse.jetty.http.Http11FieldPreEncoder\"\n      ]\n    },\n    \"org.junit.jupiter:junit-jupiter-engine\": {\n      \"org.junit.platform.engine.TestEngine\": [\n        \"org.junit.jupiter.engine.JupiterTestEngine\"\n      ]\n    },\n    \"org.junit.platform:junit-platform-engine\": {\n      \"org.junit.platform.engine.discovery.DiscoverySelectorIdentifierParser\": [\n        \"org.junit.platform.engine.discovery.ClassSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.ClasspathResourceSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.ClasspathRootSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.DirectorySelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.FileSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.IterationSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.MethodSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.ModuleSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.NestedClassSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.NestedMethodSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.PackageSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.UniqueIdSelector$IdentifierParser\",\n        \"org.junit.platform.engine.discovery.UriSelector$IdentifierParser\"\n      ]\n    },\n    \"org.springframework.boot:spring-boot\": {\n      \"ch.qos.logback.classic.spi.Configurator\": [\n        \"org.springframework.boot.logging.logback.RootLogLevelConfigurator\"\n      ],\n      \"org.apache.logging.log4j.util.PropertySource\": [\n        \"org.springframework.boot.logging.log4j2.SpringBootPropertySource\"\n      ]\n    },\n    \"org.springframework.boot:spring-boot-actuator-autoconfigure\": {\n      \"org.junit.platform.launcher.TestExecutionListener\": [\n        \"org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryEventPublisherBeansTestExecutionListener\"\n      ]\n    },\n    \"org.springframework.boot:spring-boot-configuration-processor\": {\n      \"javax.annotation.processing.Processor\": [\n        \"org.springframework.boot.configurationprocessor.ConfigurationMetadataAnnotationProcessor\"\n      ]\n    },\n    \"org.springframework.boot:spring-boot-loader\": {\n      \"java.nio.file.spi.FileSystemProvider\": [\n        \"org.springframework.boot.loader.nio.file.NestedFileSystemProvider\"\n      ]\n    },\n    \"org.springframework:spring-core\": {\n      \"reactor.blockhound.integration.BlockHoundIntegration\": [\n        \"org.springframework.core.ReactiveAdapterRegistry$SpringCoreBlockHoundIntegration\"\n      ]\n    },\n    \"org.springframework:spring-jcl\": {\n      \"org.apache.commons.logging.LogFactory\": [\n        \"org.apache.commons.logging.LogFactoryService\"\n      ]\n    },\n    \"org.springframework:spring-web\": {\n      \"jakarta.servlet.ServletContainerInitializer\": [\n        \"org.springframework.web.SpringServletContainerInitializer\"\n      ],\n      \"reactor.blockhound.integration.BlockHoundIntegration\": [\n        \"org.springframework.web.server.adapter.WebHttpHandlerBuilder$SpringWebBlockHoundIntegration\"\n      ]\n    }\n  },\n  \"version\": \"2\"\n}\n"
  },
  {
    "path": "springboot/BUILD",
    "content": "#\n# Copyright (c) 2017-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# Spring Boot Packager\n# (implemented by Salesforce)\n\n# See the README.md file for detailed usage instructions.\n\nload(\"@rules_python//python:defs.bzl\", \"py_binary\", \"py_test\")\nload(\"@rules_license//rules:license.bzl\", \"license\")\n\n# Using a package wide default ensure that all targets are associated with the\n# license.\npackage(\n    default_applicable_licenses = [\":license\"],\n    default_visibility = [\"//visibility:public\"],\n)\n\nexports_files([\n    \"springboot.bzl\",\n    \"springboot_pkg.sh\",\n    \"check_dupe_classes.py\",\n    \"detect_javax_classes.py\",\n    \"write_gitinfo_properties.sh\",\n    \"write_manifest.sh\",\n    \"write_bazelrun_env.sh\",\n    \"default_bazelrun_script.sh\",\n    \"dupe_class_jar_allowlist.txt\",\n    \"empty.txt\",\n    \"addin_end.txt\",\n])\n\nlicense(\n    name = \"license\",\n    copyright_notice = \"Copyright (c) 2017-2024, Salesforce\",\n    license_kinds = [\n        \"@rules_license//licenses/spdx:Apache-2.0\",\n    ],\n    license_text = \"//:LICENSE.txt\",\n    package_name = \"@rules_spring//springboot\",\n    package_url = \"https://github.com/salesforce/rules_spring\",\n    package_version = \"2.4.2\",\n    visibility = [\"//visibility:public\"],\n)\n\npy_binary(\n    name = \"detect_javax_classes\",\n    srcs = [\n        \"detect_javax_classes.py\",\n    ],\n    visibility = [\"//visibility:public\"],\n)\n\npy_binary(\n    name = \"check_dupe_classes\",\n    srcs = [\n        \"check_dupe_classes.py\",\n    ],\n    visibility = [\"//visibility:public\"],\n)\n\npy_test(\n    name = \"check_dupe_classes_test\",\n    size = \"small\",\n    srcs = [\n        \"check_dupe_classes.py\",\n        \"tests/check_dupe_classes_test.py\",\n    ],\n    imports = [\".\"],\n    tags = [\"manual\"],\n)\n\njava_library(\n    name = \"springboot_lib\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    deps = [],\n)\n\njava_binary(\n    name = \"springboot_cli\",\n    runtime_deps = [\":springboot_lib\"],\n    main_class = \"com.salesforce.rulesspring.cli.SpringBootInspector\",\n)\n"
  },
  {
    "path": "springboot/README.md",
    "content": "## SpringBoot Rule\n\nThis implements a Bazel rule for packaging a Spring Boot application as an executable jar file from a Bazel build.\nThe output of this rule is a jar file that can be copied to production environments and run as an executable jar.\n\nSee the [top-level README](../README.md) for the stanza to add to your *MODULE.bazel* file to load the rule.\nThe *springboot* rule runs on modern versions of Bazel.\nSee the [.bazelversion](../.bazelversion) file to see which one is used for testing.\n\n### Spring Boot 3 Upgrade?\n\n:eyes: are you an existing rules_spring user upgrading to Spring Boot 3?\nWe [have some docs for that](https://github.com/salesforce/rules_spring/issues/230).\n\n### Use the rule in your BUILD file\n\nThis is a *BUILD* file code snippet of how to invoke the rule:\n\n```starlark\n# load our Spring Boot rule\nload(\"@rules_spring//springboot:springboot.bzl\", \"springboot\",)\n\n# create our deps list for Spring Boot\nspringboot_deps = [\n  # the import bundle has some common defaults\n  \"@rules_spring//springboot/import_bundles:springboot_required_deps\",\n  # and add some others\n  \"@maven//:org_springframework_boot_spring_boot_starter_jetty\",\n  \"@maven//:org_springframework_boot_spring_boot_starter_web\",\n  \"@maven//:org_springframework_spring_webmvc\",\n]\n\n# this Java library contains your service code\njava_library(\n    name = 'helloworld_lib',\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    resources = glob([\"src/main/resources/**\"]),\n    deps = springboot_deps + [\n        \"@maven//:green_lib\", # red/green libs are fake, put each dep you need here\n        \"@maven//:red_lib\",\n    ],\n)\n\n# use the springboot rule to build the app as a Spring Boot executable jar\nspringboot(\n    name = \"helloworld\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n)\n```\n\nThe required *springboot* rule attributes are as follows:\n\n- *name*: name of your application; the convention is to use the same name as the enclosing folder (i.e. the Bazel package name)\n- *boot_app_class*: the classname (java package+type) of the @SpringBootApplication class in your app\n- *java_library*: the library containing your service code\n\nThere are many more attributes described below and in the [Springboot() Attribute doc](attributes.md).\n\n## Build and Run\n\nAfter installing the rule into your workspace, you are ready to build.\nAdd the rule invocation to your Spring Boot application *BUILD* file as shown above.\n```bash\n# Build\nbazel build //examples/helloworld\n# Run\nbazel run //examples/helloworld\n# Run with arguments\nbazel run //examples/helloworld red green blue\n```\n\nIn production environments, you will likely not have Bazel installed nor the Bazel workspace files.\nThis is the primary use case for the executable jar file.\nThe build will create the executable jar file in the *bazel-bin* directory.\nRun the jar file locally using *java* like so:\n```bash\njava -jar bazel-bin/examples/helloworld/helloworld.jar\n```\n\nThe executable jar file is ready to be copied to your production environment or  \n  embedded into [a Docker image in your build](https://github.com/salesforce/rules_spring/issues/94).\n\n\n## In Depth\n\nThe documentation below explains how to use (or links to subdocuments) all of the features supported by the _springboot_ rule.\n\n### Rule Attributes Reference\n\nFor reference, the full list available attributes that support these features are documented \n  on the [attributes reference doc.](attributes.md).\n\n### Manage External Dependencies in your MODULE.bazel\n\nThis repository has an example [MODULE.bazel](../../MODULE.bazel) file that lists necessary and some optional Spring Boot dependencies.\nThese will come from a Nexus/Artifactory repository, or Maven Central.\nBecause the version of each dependency needs to be explicitly managed, it is left for you to review and add to your *MODULE.bazel* file.\n\n### Detecting, Excluding and Suppressing Unwanted Classes\n\nThe Spring Boot rule will copy the transitive closure of all Java jar deps into the Spring Boot executable jar.\nThis is normally what you want.\n\nBut sometimes you have a transitive dependency that causes problems when included in your Spring Boot jar, but\n  you don't have the control to remove it from your dependency graph.\nThis can cause problems such as:\n- multiple jars have the same class, but at different versions\n- an unwanted class carries a Spring annotation such that the class gets instantiated at startup\n\nThe Spring Boot rule has a set of strategies and features for dealing with this situation, which unfortunately\n  is somewhat common:\n- [Detecting, Excluding and Suppressing Unwanted Classes](unwanted_classes.md) - dupe checking, excludes, classpath order, classpath index\n\n### Build Stamping of the Spring Boot jar\n\nSpring Boot has a nice feature that can display Git coordinates for your built service in the\n  [/actuator/info](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints) webadmin endpoint.\nIf you are interested in this feature, it is supported by this *springboot* rule.\nHowever, to avoid breaking Bazel remote caching, we generally have this feature disabled for most builds.\nSee the [//tools/buildstamp](../buildstamp) package for more details on how to enable and disable it.\n\n\n### Customizing Bazel Run\n\nAs shown above, the *springboot* rule has support for launching the application using *bazel run*.\nThere are many ways to customize the way the application is launched.\nSee the dedicated *bazel run* documentation for details:\n- [Customizing Bazel Run](bazelrun.md)\n\n\n### Debugging the Rule Execution\n\nIf the environment variable `DEBUG_SPRINGBOOT_RULE` is set, the rule writes debug output to `$TMPDIR/bazel/debug/springboot`.\nIf `$TMPDIR` is not defined, it defaults to `/tmp`.\nIn order to pass this environment variable to Bazel, use the `--action_env` argument:\n\n```bash\nbazel build //... --action_env=DEBUG_SPRINGBOOT_RULE=1\n```\n\n### Writing Tests for your Spring Boot Application\n\nThis topic is covered in our dedicated [testing guide](testing_springboot.md).\n\n### Customizing the Spring Boot rule\n\nTo understand how this rule works, start by reading the [springboot.bzl file](springboot.bzl).\n\n### Springboot CLI\n\nThis package also contains a CLI for inspecting Spring Boot jars after they have been built.\nThis can be useful when troubleshooting behavior differences over time due to changing dependencies.\nSee [the CLI user guide](cli.md) for details.\n"
  },
  {
    "path": "springboot/addin_end.txt",
    "content": "Marker file that indicates the end of the addin list.\n"
  },
  {
    "path": "springboot/attributes.md",
    "content": "## Springboot() Attributes\n\nThis doc explains conventions and reference for the rule attributes.\n\n### Standard Spring Boot Dependencies\n\nThe [@rules_spring//springboot/import_bundles](import_bundles) package contains an\n    example list of core set of Spring Boot dependencies.\nWe recommend starting with this list, and then creating your own lists that fit your needs.\n\n\n### Pattern of Repo-Wide Defaults\n\nDo you want to provide a default value for an attribute, across all _springboot()_ invocations in your repo?\nThere is a pattern for that.\nThis is just standard Bazel, nothing specific to *rules_spring*.\n\nFirst, create a Bazel file somewhere in your repo, with a function like this:\n```\ndef mycompany_springboot(**kwargs):\n\n    # OVERRIDE: The rules_spring default list is [], which is too strict for mycompany,\n    #   open up some modules if the caller does not override it.\n    if kwargs.get(\"bazelrun_addopens\") == None:\n        kwargs[\"bazelrun_addopens\"] = [        \n            \"java.base/java.base=ALL-UNNAMED\",\n            \"java.base/java.io=ALL-UNNAMED\",\n            \"java.base/java.math=ALL-UNNAMED\",\n        ]\n\n    # And then delegate to the default impl\n    springboot(**kwargs)\n```\n\nAnd then use your function in your BUILD file like:\n```\nload(\"//tools/mycompany:myutils.bzl\", \"mycompany_springboot\",\n\nmycompany_springboot(\n    name = \"myapp\",\n    java_library = \":base_lib\",\n    boot_app_class = \"com.mycompany.MyApp\",\n)\n```\n\n\n### Attribute Reference\n\n| Name  | Description | Default Value | Doc Link |\n| :-------------: | :-------------: | :-------------: | :-------------: |\n| name |  **Required**. The name of the Spring Boot application. Typically this is set the same as the package name.   Ex: *helloworld*.   |  none | |\n| java_library |  **Required**. The built jar, identified by the name of the java_library rule, that contains the   Spring Boot application.   |  none | |\n| boot_app_class |  **Required**. The fully qualified name of the class annotated with @SpringBootApplication.   Ex: *com.sample.SampleMain*   |  none | |\n| boot_launcher_class |  Optional. Allows you to switch to the new *org.springframework.boot.loader.launch.JarLauncher* introduced in Boot 3.2.0. Defaults to the old launcher.   |  *org.springframework.boot.loader.JarLauncher* | [details](../README.md#upgrading-to-spring-boot-3) |\n| include_git_properties_file |  If *True*, will include a git.properties file with build details in the resulting jar.   |  <code>True</code> | [details](README.md#build-stamping-of-the-spring-boot-jar) |\n| addins |  Uncommon option to add additional files to the root of the springboot jar. For example, a license file. Pass an array of files from the package.   |  <code>[]</code> | |\n| jartools_toolchains | Optional. Toolchain for running build tools like singlejar | <code>[\"@bazel_tools//tools/jdk:current_host_java_runtime\"]</code> | see [Issue 250](https://github.com/salesforce/rules_spring/issues/250) |\n| **Dependencies** | | | |\n| deps |  Optional. An additional set of Java dependencies to add to the executable. Normally all dependencies are set on the *java_library*.   |  <code>None</code> | |\n| deps_exclude_labels | Optional. A list of jar labels that will be omitted from the final packaging step. This is a manual option for eliminating a problematic dependency that cannot be eliminated upstream. Ex: *[\"@maven//:commons_cli_commons_cli\"]*. |  <code>None</code> | [details](unwanted_classes.md) |\n| deps_exclude | Deprecated. Use deps_exclude_labels instead. Functions the same as deps_exclude_labels but retained for backward compatibility. |  <code>None</code> | |  <code>None</code> | |\n| deps_exclude_paths |  Optional. This attribute provides a list of partial paths that will be omitted   from the final packaging step if the string is contained within the dep filename. This is a more raw method than deps_exclude_labels for eliminating a problematic dependency/file that cannot be eliminated upstream.   Ex: [*jackson-databind-*].   |  <code>None</code> | [details](unwanted_classes.md) |\n| deps_banned| Optional. A list of strings to match against the jar filenames in the transitive graph of dependencies for this springboot app. If any of these strings is found within any jar name, the rule will fail. This is useful for detecting jars that should never go to production. The list of dependencies is obtained after the deps_exclude_labels and deps_exclude_paths processing has run. | <code>[ \"junit\", \"mockito\" ]</code> | [details](unwanted_classes.md) |\n| dupeclassescheck_enable |  If *True*, will analyze the list of dependencies looking for any class that appears more than   once, but with a different hash. This indicates that your dependency tree has conflicting libraries.   |  <code>False</code> | [details](unwanted_classes.md) |\n| dupeclassescheck_ignorelist |  Optional. When using the duplicate class check, this attribute provides a file   that contains a list of libraries excluded from the analysis. Ex: *dupeclass_libs.txt*   |  <code>None</code> | [details](unwanted_classes.md) |\n| deps_index_file |  Optional. Uses Spring Boot's index to define classpath order. This feature is not commonly used, as the application must be extracted from the jar   file for it to work. Ex: *my_classpath_index.idx*   |  <code>None</code> | [classpath index feature](https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html#executable-jar-war-index-files-classpath) |\n| deps_use_starlark_order |  When running the Spring Boot application from the executable jar file, setting this attribute to   *True* will use the classpath order as expressed by the order of deps in the BUILD file. Otherwise it is random order.   |  <code>True</code> | |\n| **Bazel Run** | | | |\n| bazelrun_java_toolchain |  Optional. When launching the application using 'bazel run', this attribute can identify the label of the Java toolchain used to launch the JVM. Ex: *//tools/jdk:my_default_toolchain*. See *default_java_toolchain* in the Bazel documentation.  |  <code>None</code> | [details](bazelrun.md) |\n| bazelrun_script |  Optional. When launching the application using 'bazel run', a default launcher script is used.   This attribute can be used to provide a customized launcher script. Ex: *my_custom_script.sh*   |  <code>None</code> | [details](bazelrun.md) |\n| bazelrun_jvm_flag_list |  Optional. An optional set of JVM flags to pass to the JVM at startup. Ex: *[\"-Dcustomprop=gold\", \"-DcustomProp2=silver*\"]   |  <code>None</code> | [details](bazelrun.md) |\n| bazelrun_env_flag_list | Optional. An optional set of OS environment variables to set before startup. Ex: *[\"PROP1\", \"PROP2=copper\"] |  <code>None</code> | [details](bazelrun.md) |\n| bazelrun_data |  Optional. Adds data files to target's runfiles. Behaves like the *data* attribute defined for *java_binary*. See *bazel run* docs for special behavior when application.properties files are listed here. |  <code>None</code> | [details](bazelrun.md) |\n| bazelrun_background |  Optional. If True, the *bazel run* launcher will not block. The run command will return and process will remain running.   |  <code>False</code> | [details](bazelrun.md) |\n| **Standard Attributes** | | | |\n| tags |  Optional. Bazel standard attribute.   |  <code>[]</code> | |\n| testonly |  Optional. Bazel standard attribute. Defaults to False.   |  <code>False</code> | |\n| visibility |  Optional. Bazel standard attribute.   |  <code>None</code> | |\n| **Javax -> Jakarta** | | | |\n| javaxdetect_enable | If *True*, will analyze the list of dependencies looking for any class from javax.* package and fail the build if found. The lib is a candidate for migration to jakarta. | <code>False</code> | [details](javax.md) |\n| javaxdetect_ignorelist | Optional. When using the javax detect check, this attribute provides a file that contains a list of libraries excluded from the analysis. Ex: *javaxdetect_ignorelist.txt* | <code>None</code> | [details](javax.md) |\n\n\nThe following attributes are deprecated and will be removed in a future release.\n| Name  | Description |\n| :-------------: | :-------------: | \n| exclude |  Deprecated synonym of *deps_exclude_labels* and *deps_exclude* |\n| classpath_index |  Deprecated synonym of *deps_index_file* |\n| use_build_dependency_order |  Deprecated synonym of *deps_use_starlark_order* |\n| fail_on_duplicate_classes |  Deprecated synonym of *dupeclassescheck_enable* |\n| duplicate_class_allowlist |  Deprecated synonym of *dupeclassescheck_ignorelist* |\n| jvm_flags |  Deprecated form of *bazelrun_jvm_flag_list* |\n| bazelrun_jvm_flags |  Deprecated form of *bazelrun_jvm_flag_list* |\n| data |  Deprecated synonym of *bazelrun_data* |\n"
  },
  {
    "path": "springboot/bazelrun.md",
    "content": "## Customizing Bazel Run\n\nAs shown in the [README](README.md), you can launch the Spring Boot application directly from Bazel using the *bazel run* idiom:\n\n```bash\nbazel run //examples/helloworld\n```\n\nBut you may wish to customize the launch.\nThe *springboot* rule supports several features for customization.\nNote that these features do **not** apply when running the application directly using ```java -jar [file]```.\n\n### Launcher JVM\n\n:warning: It is best to use the docs from the Git tag of the release of *rules_spring* you are using.\nThis section in particular has changed often, so please make sure you are looking at the correct version (tag)\nof this doc for your chosen release.\n\nBy default, the service will be started using the JVM from the current Java toolchain in your\n  Bazel workspace - `@bazel_tools//tools/jdk:current_java_toolchain`\nSee the [Bazel Java docs](https://bazel.build/docs/bazel-and-java) on how toolchains are defined.\nHowever, there are multiple ways to override this.\n\nFirst, you can set the `BAZEL_RUN_JAVA` environment variable to the Java executable of your choice.\nFor example, this works well for local override when you want to quickly test your service on an alternate JVM.\nThis variable, when set, takes priority over the toolchain configurations.\n\n```\n# note this is different than setting JAVA_HOME, it needs the path to the actual java executable\nexport BAZEL_RUN_JAVA=/opt/my_jdk/bin/java\n```\n\nSecond, you can set the `JAVABIN` environment variable, set with the same convention as `BAZEL_RUN_JAVA`.\n`JAVABIN` is also used by [Bazel's java_binary()](https://bazel.build/reference/be/java#java_binary), \n  so may be more convenient to use.\n\n```\n# note this is different than setting JAVA_HOME, it needs the path to the actual java executable\nexport JAVABIN=/opt/my_jdk/bin/java\n```\n\nThird, you can use the `bazelrun_java_toolchain` attribute on the `springboot` rule to pass the label \n  of a specific Java toolchain defined in your Bazel workspace.\nThis is useful when your workspace has multiple Java toolchains, and you want the service to use an\n  alternate one when launching with `bazel run`.\nWhen set, the launcher will use the JVM from the toolchain.\n\n```\nspringboot(\n   ...\n   bazelrun_java_toolchain = \"//tools/jdk:my_other_toolchain\",  \n)\n```\n\nFourth, the default Java toolchain `@bazel_tools//tools/jdk:current_java_toolchain` will be used.\n\nSummary of the precedence order:\n1. environmental variable BAZEL_RUN_JAVA\n1. environmental variable JAVABIN \n1. java executable from the custom java toolchain passed into the rule\n1. java executable from the default java toolchain (default)\n1. environmental variable JAVA_HOME (fallback, we only get here if there is a bug in the above logic)\n1. as a last resort, use 'which java'\n\nAdditional usages of Bazel Java configuraiton, such as *runtime_java_version*, is perhaps desirable.\nBut due to variations of implementation across Bazel versions, and other complexities, it has\n  not been implemented.\nThe [Java configured for Bazel Run Issue](https://github.com/salesforce/rules_spring/issues/16) \n  tracks thoughts and experiments with this feature. \n\nAlternatively, you can provide a custom launcher script (see below) that can tailor JVM selection as needed.\nThis is the most flexible option, but it may cause compatibility issues with newer versions of rules_spring.\n\n### Java Startup Options\n\nYou may wish to customize the bazel run launcher with JVM options.\nThere are two mechanisms that are supported for this - *bazelrun_jvm_flags* and *JAVA_OPTS*.\n\nThe *springboot* rule attribute *bazelrun_jvm_flags* is for cases in which you always want the options to apply when the application is launched from Bazel.\nIt is specified as an attribute on the *springboot* rule invocation:\n\n```starlark\nspringboot(\n    name = \"helloworld\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n    bazelrun_jvm_flag_list = [\"-Dcustomprop=gold\", \"-Dcustomprop2=silver\"],\n)\n```\n\nThe environment variable *JAVA_OPTS* is useful when a developer wants to make a local override.\nIt is set in your shell before launching the application:\n\n```bash\nexport JAVA_OPTS='-Dcustomprop3=bronze'\nbazel run //examples/helloworld\n```\n\nInside the bazel run launcher, these two options are injected into the command line launcher as if you had invoked the jar like this:\n\n```bash\n# internally, this is how bazelrun_jvm_flags and JAVA_OPTS are passed to java\njava [bazelrun_jvm_flag_list] [JAVA_OPTS] -jar [springboot jar]\n```\n\n### Application Arguments\n\nYou may wish to pass arguments to your Spring Boot application.\nThese arguments are interpreted by your application as you like (see SampleMain.java for an example).\nFor most cases, you can just add them after the Bazel target, like this:\n\n```bash\nbazel run //examples/helloworld one two three=four\n```\n\nwhich would arrive in your main class as args \\[one\\] \\[two\\] \\[three=four\\].\nBut if you need to pass an argument that starts with '--' to Spring Boot or your application, you will need to follow this pattern\n  (notice the extra -- in the command line):\n\n```bash\nbazel run //examples/helloworld -- --spring.config.location=/tmp/myconfig/\n```\n\notherwise Bazel will try to consume the '--' argument for itself.\n\n### External Configuration with application.properties\n\nSpring Boot will load internal application.properties files, typically put in *src/main/resources* and\nadd to your *java_library* resources attribute.\n\nBut when launching with *bazel run*, you may also provide external application.properties files.\nThis is done via Bazel's [data dependencies](https://bazel.build/concepts/dependencies#data-dependencies) capability, surfaced in the *springboot* rule via the *bazelrun_data* attribute.\n\n```\nfilegroup(\n    name = \"bazelrun_data_files\",\n    srcs = [\n        \"application.properties\",\n        \"application-dev.properties\",\n        \"config/application.properties\",\n    ],\n)\n\nspringboot(\n    ...\n    bazelrun_data = [\":bazelrun_data_files\"],\n)\n```\nThe default launcher script will detect filenames with pattern _application*.properties_ as being \n  external configuration files, and configure them as additional configuration files for Spring Boot.\n\n### External Configuration with Environment Variables\n\nSpring Boot will read in [shell environment variables](https://docs.spring.io/spring-boot/reference/features/external-config.html) \n  as external configuration.\nThis technique can be used to set individual configuration properties.\n\nThis is surfaced in the *springboot* rule using the *bazelrun_env_flag_list* attribute, which is set as an array\n  of environment variables.\n\n```\nspringboot(\n    ...\n    bazelrun_env_flag_list = [\"PROP1=blue\", \"PROP2=green\"],\n)\n```\n\nwhich could then be used in @Value annotations using lowercased names:\n\n```\n    @Value(\"${prop1:not found}\")\n    String prop1;\n```\n\n### Custom Launcher Script\n\nIf you need more customization, you may completely replace the *bazel run* launcher script for advanced use cases.\nMake a copy of the [default_bazelrun_script.sh](default_bazelrun_script.sh) into your package,\n  and make changes as necessary.\nThen pass it via the *bazelrun_script* attribute, like this:\n\n```starlark\nspringboot(\n    name = \"helloworld\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n    bazelrun_script = \"my_custom_bazelrun_script.sh\",\n)\n```\n\n### Background the Application on Launch\n\nBy default, the *bazel run* command will block on the application.\nControl will not return until the Spring Boot application has terminated.\n\nFor some use cases, this is not desirable.\nYou may want the *bazel run* command to return immediately, and leave the Spring Boot application running in the background.\nThis is common for integration testing, where you want to have a scripted flow such as:\n- start the application\n- run the integration tests\n- stop the application\n\nThis is supported.\nThere are two mechanisms for signaling that the application should be started in the background:\n- the *springboot* rule supports the optional *bazelrun_background* attribute, which can be set to *True*\n- the user may set the environment variable *BAZELRUN_DO_BACKGROUND=true* in the shell prior to invoking *bazel run*\n\nIf either the attribute or environment variable are set to true, the application will be launched in the background and:\n- the process id will be persisted to a file (/tmp/${rulename}.pid)\n- stdout and stderr will be piped to a file (/tmp/${rulename}.log)\n\n### Bazel Run Internals\n\nIf you need to modify your service launch via *bazel run* using the above options, it is sometimes helpful\n  to understand how it all works.\nThere are three main components to it.\n\nThe biggest reveal is that *bazel run* is nothing more than a shell script invocation of a \"wrapper script\".\nThe springboot() rule writes that wrapper script, plus two other scripts to support launch.\nIn fact, you can invoke the wrapper script directly, which is useful when troubleshooting.\n\n```\n# Direct invocation\n# Format: bazel-bin/relative-path/packagename/targetname\n# The last element of the path is a file, named the same as your target name. \n# It is without a .sh suffix, even though it is a shell script file.\n./bazel-bin/examples/demoapp/demoapp\n```\n\nThe best way to learn is to inspect the script files.\nThe paths below are listed for the //examples/demoapp service.\n\n- **wrapper script** (*bazel-bin/examples/demoapp/demoapp*): is mostly boiler plate; the contents are embedded directly into the [springboot.bzl](springboot.bzl) code - look for the *_bazelrun_script_template* variable. It coordinates the launch of the other two scripts.\n- **env script** (*bazel-bin/examples/demoapp/demoapp_bazelrun_env.sh*): is written by the [write_bazelrun_env.sh](write_bazelrun_env.sh) script that is run by the springboot macro. Certain springboot() attributes allow you to add more variables to this file (e.g. *bazelrun_data* and *bazelrun_env_flag_list*).\n- **launcher script** (*bazel-bin/examples/demoapp/demoapp.runfiles/_main/springboot/default_bazelrun_script.sh*): actually launches the springboot jar. The default launcher script is [default_bazelrun_script.sh](default_bazelrun_script.sh). This script can be completely replaced by using the *bazelrun_script* attribute to fully customize your service launch. \n"
  },
  {
    "path": "springboot/check_dupe_classes.py",
    "content": "#\n# Copyright (c) 2019-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\nfrom collections import defaultdict\nimport hashlib\nimport os\nimport sys\nimport zipfile\nimport tempfile\n\n\ndef _check_for_duplicate_classes(springbootzip_filepath, ignorelisted_jars, output_filepath):\n    \"\"\"\n    Prints error message and returns True if duplicate classes were found,\n    false otherwise.\n\n    Jars in the ignorelisted_jars list are excluded from the check.\n    \"\"\"\n\n    # this will be set to True if any duplicate classes are found, that are not\n    # contained by any jar in the ignorelist\n    found_illegal_duplicates = False\n    # this set will contain the jars that contain the violaters\n    dupe_containing_jars = set()\n    # list of paths of classes that are duped and have different hashes\n    # use each string entry as a key into the class_catalog dict\n    dupe_classes = []\n    dupe_message_lines = \"\"\n\n    # dict that maps the path to a class to all jars (as list) it was found in,\n    #   and the hash for each appearance\n    # for example:\n    # com/acme/common/HostUtil.class ->\n    # [\n    #   { bazel-out/.../foolib.jar, 5807cc49dfbda8dd937de3b33a885409 },\n    #   { bazel-out/.../blahlib.jar, 5807cc49dfbda8dd937de3b33a885409 }\n    # ]\n    class_catalog = defaultdict(list)\n\n    # Starting the search....\n    # iterate through the springboot jar file, and find inner jars,\n    # open each inner jar and catalog each .class file found\n    try:\n        springbootzip = zipfile.ZipFile(springbootzip_filepath)\n    except zipfile.BadZipFile:\n        # this error happened to me when my computer ran out of disk space during a build\n        result = \"Spring Boot dupe detection has failed for %s because the generated jar file is corrupt, please delete this file.\\n\" % springbootzip_filepath\n        print(result)\n        _write_result_to_output_file(output_filepath, result)\n        return True\n\n    sprintbootzipentries = springbootzip.infolist()\n    for springbootzipentry in sprintbootzipentries:\n        if springbootzipentry.filename.endswith(\".jar\"):\n            jar_path = springbootzipentry.filename\n            innerjar = springbootzip.open(springbootzipentry.filename)\n\n            # create a temporary copy of the inner jar as a file on disk\n            innerjar_binarycontent = innerjar.read()\n            innerjar_tmp_fileondisk = tempfile.TemporaryFile()\n            innerjar_tmp_fileondisk.write(innerjar_binarycontent)\n            # initialize a ZipFile object using the temporary copy\n            innerjar_zip = zipfile.ZipFile(innerjar_tmp_fileondisk)\n            innerjar_zipentries = innerjar_zip.infolist()\n\n            for innerjar_zipentry in innerjar_zipentries:\n                innerjar_zipentry_path = innerjar_zipentry.filename\n                if innerjar_zipentry_path.endswith(\".class\"):\n                    if innerjar_zipentry_path.endswith(\"module-info.class\"):\n                        continue\n                    class_bytes = innerjar_zip.read(innerjar_zipentry_path)\n                    digest = hashlib.md5(class_bytes).hexdigest()\n\n                    # now check if we have seen this class before\n                    other_locations = class_catalog[innerjar_zipentry_path]\n                    for other_location in other_locations:\n                        other_digest = other_location[1]\n                        if other_digest != digest:\n                            jar_base = os.path.basename(jar_path)\n                            other_jar_base = os.path.basename(other_location[0])\n                            this_is_a_dupe = False\n                            # we fail as a dupe if both jars are not in the ignorelist\n                            # we could be nicer and only fail if one of the jars is not in the ignorelist?\n                            if jar_base not in ignorelisted_jars:\n                                dupe_containing_jars.add(jar_base)\n                                found_illegal_duplicates = True\n                                this_is_a_dupe = True\n                            if other_jar_base not in ignorelisted_jars:\n                                dupe_containing_jars.add(other_jar_base)\n                                found_illegal_duplicates = True\n                                this_is_a_dupe = True\n                            if this_is_a_dupe:\n                                dupe_message_lines += \"  class %s\\n\" % (innerjar_zipentry_path)\n                                dupe_message_lines += \"    jar %s hash %s\\n\" % (jar_base, digest)\n                                dupe_message_lines += \"    jar %s hash %s\\n\" % (other_jar_base, other_digest)\n\n                    class_catalog_entry = (jar_path, digest)\n                    class_catalog[innerjar_zipentry_path].append(class_catalog_entry)\n\n            # end innerzipentries for loop\n            innerjar_tmp_fileondisk.close()\n\n    if found_illegal_duplicates:\n      result = \"Spring Boot packaging has failed for %s because multiple copies of the same class, but with different hashes, were found:\\n\" % springbootzip_filepath\n      result += dupe_message_lines\n      result += \"You should eliminate the conflicting dependencies, or if that is not possible you can add these jars to the dupeclassescheck_ignorelist file:\\n\"\n      for ignorelist_candidate in dupe_containing_jars:\n          result += \"   %s\\n\" % ignorelist_candidate\n      print(result)\n      _write_result_to_output_file(output_filepath, result)\n\n    return found_illegal_duplicates\n\ndef _parse_ignorelisted_jars_file(ignorelist_file):\n    \"\"\"\n    Reads the ignorelist.txt file and returns the jars as a set.\n    File format: each line in the file is the name of a jar, like:\n      foo.jar\n      bar.jar\n    \"\"\"\n    ignorelisted_jars = set()\n\n    if ignorelist_file != None:\n        with open(ignorelist_file, \"r\") as lines:\n            for line in lines:\n                line = line.strip()\n                if len(line) == 0 or line.startswith(\"#\"):\n                    continue\n                # cannot use the whole jar path as it is different for generated jars on linux and mac\n                # this logic might need to change if two jars with the same name are part of the ignorelist\n                jar = os.path.basename(line)\n                ignorelisted_jars.add(jar)\n\n    #if len(ignorelisted_jars) > 0:\n    #    print(\"Springboot duplicate class checker ignorelisted jars:\")\n    #    for ignorelisted_jar in ignorelisted_jars:\n    #        print(\"  %s\" % ignorelisted_jar)\n\n    return ignorelisted_jars\n\ndef _write_result_to_output_file(output_filepath, result):\n    if output_filepath != None:\n      f = open(output_filepath, \"a\")\n      f.write(result)\n      f.close()\n\ndef run_with_ignorelist(springbootzip_filepath, ignorelisted_jars, output_filepath):\n    found_illegal_duplicates = _check_for_duplicate_classes(springbootzip_filepath, ignorelisted_jars,\n        output_filepath)\n    if found_illegal_duplicates:\n        raise Exception(\"Found duplicate classes in the packaged springboot jar\")\n    else:\n        _write_result_to_output_file(output_filepath, \"SUCCESS\")\n    return found_illegal_duplicates\n\ndef run(springbootzip_filepath, ignorelist_file, output_filepath):\n    \"\"\"\n    Iterates through a Spring Boot jar and looks for classes in inner jars. If the same\n    class (package name + class name) appears more than once, verify that the .class files\n    have the same hash code. If there is a conflict, this invocation will fail with an error.\n    If both jars are listed in the ignorelist, the conflict will be ignored.\n    \"\"\"\n    ignorelisted_jars = _parse_ignorelisted_jars_file(ignorelist_file)\n    run_with_ignorelist(springbootzip_filepath, ignorelisted_jars, output_filepath)\n\nif __name__ == \"__main__\":\n    # arg1  path to the spring boot jar file (required)\n    # arg2  path to the text file containing the jars to ignore as sources of dupes (optional)\n    # arg3  outputfile (optional, will contain \"SUCCESS\" if the check passed, or the list of errors)\n    ignorelist_file = None\n    if len(sys.argv) > 2:\n      ignorelist_file = sys.argv[2]\n      if ignorelist_file == \"no_ignorelist\":\n          ignorelist_file = None\n\n    output_file = None\n    if len(sys.argv) > 3:\n      output_file = sys.argv[3]\n\n    run(sys.argv[1], ignorelist_file, output_file)\n"
  },
  {
    "path": "springboot/cli.md",
    "content": "## SpringBoot Jar CLI\n\nIn addition to the Bazel rule, this package also contains a CLI for inspecting Spring Boot jars after they have been built.\nThis can be useful when troubleshooting behavior differences over time due to changing dependencies.\nThe CLI works on any executable Spring Boot jar, regardless of whether it was built with Bazel, Maven, or Gradle.\n\n\n### Running the CLI\n\nIf you are importing rules_spring into your Bazel workspace, you can access the tool by a pattern like this:\n\n```\nbazel run @rules_spring//springboot:springboot_cli [args]\n```\n\nOtherwise, if you have Bazel, you can run it from this repository:\n\n```\nbazel run //springboot:springboot_cli [args]\n```\n\nFor non-Bazel users, a built jar will periodically be added to this directory as _springboot-cli.jar_.\n\n```\njar -jar springboot-cli.jar [args]\n```\n\n### Inspector\n\nInspector is used for any operation involving a single Spring Boot jar.\n\n#### Inspector Index\n\nThe _index_ operation iterates through the Spring Boot jar and creates an index of the contained files.\nThe index is written to file, and the output can be customized to meet the requirements of your analysis work.\nThis operation can be useful when trying to investigate issues with dependencies in the application.\n\nIf you are building your Spring Boot application with Bazel, this operation is similar in some ways to\n  what can be obtained from Bazel Query.\nBazel Query will output the set of libraries that are dependencies.\nThe _index_ is more detailed though in that it can output exact file sizes and is run on the final\n  Spring Boot jar.\nIf you are using *rules_spring* features like *deps_exclude_labels* and *deps_exclude_paths*, the Bazel Query output will be incorrect.\n\nUsage examples:\n```\n# do the default index operation\nbazel run @rules_spring//springboot:springboot_cli inspector index /opt/bazelws/bazel-bin/services/ordering/ordering.jar /tmp/output.txt\n\n# customize the report output; this only writes out the jar files found (L) and will also write the file size of each jar file (Z)\nbazel run @rules_spring//springboot:springboot_cli inspector index /opt/bazelws/bazel-bin/services/ordering/ordering.jar /tmp/output.txt --report LZ\n```\n\nThe customizable report output options are implemented in *SpringBootIndexReporter* which is the best place to look for documentation.\nThis class is pretty simple, so the code serves as the documentation.\n"
  },
  {
    "path": "springboot/default_bazelrun_script.sh",
    "content": "#!/bin/bash\n\n# Copyright (c) 2021-2024, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\nset -e\n\n# Launcher Script for launching a SpringBoot application with 'bazel run'\n\n# The following environment variables will be set by the springboot rule, and can\n# be reliably used for scripting (with example values):\n#  RULE_NAME=helloworld\n#  LABEL_PATH=examples/helloworld/\n#  SPRINGBOOTJAR_FILENAME=helloworld.jar\n#  DATAFILES=application.properties\n#  JVM_FLAGS=\"-Dcustomprop=gold  -DcustomProp2=silver\"\n#  DO_BACKGROUND=true/false   (if true, the caller is expecting the launcher not to block and return immediately)\n#\n# There are several other env variables set by Bazel. These should be stable between\n# versions of Bazel because they are documented:\n#  https://docs.bazel.build/versions/master/user-manual.html#run\n\ncurrent_dir=$(pwd)\n\n# Picking the Java VM to run is a bit of an ordeal. \n# Precedence order is documented here: \n#   https://github.com/salesforce/rules_spring/blob/main/springboot/bazelrun.md#launcher-jvm\n\nif [ -f \"${BAZEL_RUN_JAVA}\" ]; then\n  # BAZEL_RUN_JAVA points to the actual java executable (file), not the java_home directory\n  echo \"Selected the JVM using the BAZEL_RUN_JAVA environment variable.\"\n  java_cmd=$BAZEL_RUN_JAVA\nelif [ -f \"${JAVABIN}\" ]; then\n  # JAVABIN points to the actual java executable (file), not the java_home directory\n  # this is java_binary's convention: https://bazel.build/reference/be/java#java_binary\n  echo \"Selected the JVM using the JAVABIN environment variable.\"\n  java_cmd=$JAVABIN\nelif [ -f \"$JAVA_TOOLCHAIN\" ]; then\n  echo \"Selected the JVM using the Bazel Java toolchain: $JAVA_TOOLCHAIN_NAME\"\n  java_cmd=$JAVA_TOOLCHAIN\nelif [ -d \"${JAVA_HOME}\" ]; then\n  echo \"Selected the JVM using the JAVA_HOME environment variable.\"\n  java_cmd=\"${JAVA_HOME}/bin/java\"\nelse\n  echo \"Selected the JVM by executing 'which java'\"\n  java_cmd=\"$(which java)\"\nfi\n\nif [ -z \"${java_cmd}\" ]; then\n  echo \"ERROR: no java found. See the Bazel Run docs in rules_spring for details.\"\n  exit 1\nfi\necho \"Using Java at ${java_cmd}\"\n${java_cmd} -version\necho \"\"\n\n# data files, which may include external config files\nif [ ! -z \"${DATAFILES}\" ]; then\n  configpaths=\"\"\n  echo \"Available datafiles:\"\n  for datafile in ${DATAFILES}; do\n      echo \"  datafile: $current_dir/$datafile\"\n      if [[ $datafile == *\"application\"*\".properties\" ]]; then\n          path=\"file:$current_dir/$datafile\"\n          if [ ! -z \"${configpaths}\" ]; then\n            configpaths=\"$configpaths,\"\n          fi\n          configpaths=\"$configpaths$path\"\n      fi\n  done\n  if [ ! -z \"${configpaths}\" ]; then\n      JVM_FLAGS=\"${JVM_FLAGS} -Dspring.config.additional-location=$configpaths\"\n  fi\n  echo \"\"\nfi\n\n# java args\necho \"Using JAVA_OPTS from the environment: ${JAVA_OPTS}\"\necho \"Using bazelrun_jvm_flags from the BUILD file: ${JVM_FLAGS}\"\n\n# main args\nmain_args=\"$@\"\n\n# spring boot jar; these are replaced by the springboot starlark code:\npath=${LABEL_PATH}\njar=${SPRINGBOOTJAR_FILENAME}\njar_path=${path}${jar}\nif [ ! -f $jar_path ]; then\n    # some folks like to hit the bazel run wrapper script directly, which requires us to dig for the jar in bazel-bin\n    # ./bazel-bin/examples/helloworld/helloworld  <= invocation command\n    jar_path=\"bazel-bin/${path}${jar}\"\nfi\n\n# assemble the command\n# use exec so that we can pass signals to the underlying process (https://github.com/salesforce/rules_spring/issues/91)\ncmd=\"exec ${java_cmd} ${JVM_FLAGS} ${JAVA_OPTS} -jar ${jar_path} ${main_args}\"\n\necho \"Running ${cmd}\"\necho \"In directory $current_dir\"\necho \"\"\necho \"You can also run from the root of the repo:\"\necho \"java -jar bazel-bin/${jar_path}\"\necho \"\"\n\n# DO_BACKGROUND is set to true if the bazelrun_background attribute on the springboot rule is set to True\n# BAZELRUN_DO_BACKGROUND=true may be set by the user in the shell env prior to running bazel run\n# If either is true, we will run the application in the background and return immediately\nif [ \"$DO_BACKGROUND\" = true ] || [ \"$BAZELRUN_DO_BACKGROUND\" = true ]; then\n  logfile=/tmp/${RULE_NAME}.log\n  pidfile=/tmp/${RULE_NAME}.pid\n\n  ${cmd} > $logfile 2>&1 &\n  pid=$!\n  echo $pid > $pidfile\n\n  echo \"Launched the Spring Boot application in the background...\"\n  echo \"  BUILD rule 'bazelrun_background' attribute = [$DO_BACKGROUND]  Environment variable BAZELRUN_DO_BACKGROUND = [$BAZELRUN_DO_BACKGROUND]\"\n  echo \"  Console log is being written to $logfile\"\n  echo \"  Application process id [$pid] has been written to $pidfile\"\n  echo \"\"\nelse\n  echo \"Launching the Spring Boot application in the foreground...\"\n  echo \"\"\n  ${cmd}\nfi\n"
  },
  {
    "path": "springboot/deps_filter_rules/BUILD",
    "content": ""
  },
  {
    "path": "springboot/deps_filter_rules/README.md",
    "content": "# Dependencies Filter\n\nA Bazel rule that filters compile-time and runtime dependencies in Java projects, ensuring only the necessary ones are included in the build. This rule can be referenced by other Java targets, such as `java_library`, and helps to remove problematic or unwanted dependencies, offering better control over dependency graphs.\n\n## Overview\n\nThe `deps_filter` rule removes Java dependencies from your dependency graph when you have knowledge that Bazel does not, specifically that your application does not need a dependency at runtime. It provides two main exclusion mechanisms:\n\n- **Label-based exclusions**: Exclude specific dependencies by their Bazel label\n- **Path-based exclusions**: Exclude dependencies matching path patterns in their filenames\n\nThis is useful in cases where:\n- You want to exclude a dependency for a specific reason (it has a vulnerability)\n- There are multiple versions of a dependency on the classpath (dupe classes) and you want to exclude the unfavored one\n\n> **For large monorepos**: Consider using the [`dependencyset` macro](DEPENDENCYSET.md) which wraps `deps_filter` to enable centralized exclusion management and policy-as-code enforcement across hundreds of services.\n\n## Usage\n\n```python\nload(\"//springboot/deps_filter_rules:deps_filter.bzl\", \"deps_filter\")\n\ndeps_filter(\n    name = \"filtered_deps\",\n    deps = [\":lib_a\", \":lib_b\"],\n    runtime_deps = [\":lib_c\", \":lib_d\"],\n    deps_exclude_labels = [\":lib_e\"],  # Exclude by label\n    deps_exclude_paths = [\"lib_f\"],    # Exclude by path pattern\n    exclude_transitives = False,       # Whether to exclude transitive deps\n)\n```\n\n## Attributes\n\n| Attribute | Type | Default | Description |\n|-----------|------|---------|-------------|\n| `deps` | `label_list` | `[]` | List of dependencies to include |\n| `runtime_deps` | `label_list` | `[]` | List of runtime dependencies to include |\n| `deps_exclude_labels` | `label_list` | `[]` | Dependencies to exclude from the build |\n| `deps_exclude_paths` | `string_list` | `[]` | patterns for excluding dependencies |\n| `exclude_transitives` | `bool` | `False` | If `True`, transitive dependencies of excluded dependencies are also removed |\n| `testonly` | `bool` | `False` | Restricts usage to test environments |\n| `verbose` | `bool` | `False` | Enable debug output |\n\n## Key Features\n\n### 1. Dual Exclusion Mechanisms\n- **Label-based**: Precise exclusion using Bazel labels\n- **Path-based**: Flexible exclusion using filename patterns\n\n### 2. Transitive Dependency Control\n- `exclude_transitives=False`: Only excludes direct dependencies, preserves transitives\n- `exclude_transitives=True`: Excludes both direct and transitive dependencies of deps_exclude_labels\n- **Important**: `exclude_transitives` only removes transitive deps of deps specified in `deps_exclude_labels`, not those matched by `deps_exclude_paths`.\n\n### 3. JAR Type Handling\n- Properly handles interface JARs (`-ijar`) and implementation JARs\n- Maintains distinction between compile-time and runtime JARs\n- Preserves transitive dependency relationships\n\n### 4. Mixed Dependency Support\n- Supports projects with only compile-time dependencies\n- Supports projects with only runtime dependencies  \n- Supports projects with mixed compile-time and runtime dependencies\n\n## Examples\n\n### Basic Filtering\n```python\ndeps_filter(\n    name = \"basic_filter\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":unwanted_lib\"],\n)\n```\n\n### Path-based Filtering\n```python\ndeps_filter(\n    name = \"path_filter\",\n    deps = [\":base_lib\"],\n    deps_exclude_paths = [\"unwanted\", \"deprecated\"],\n)\n```\n\n### Path and Label-based Filtering\n```python\ndeps_filter(\n    name = \"mixed_filter\",\n    deps = [\":compile_lib\"],\n    runtime_deps = [\":runtime_lib\"],\n    deps_exclude_labels = [\":unwanted_compile\"],\n    deps_exclude_paths = [\"unwanted_runtime\"],\n)\n```\n\n### With Transitive Exclusions\n```python\ndeps_filter(\n    name = \"transitive_filter\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":problematic_lib\"],\n    exclude_transitives = True,  # Also exclude transitives of problematic_lib\n    testonly = True,  # Restrict to test environments\n)\n```\n\n## Output\n\nThe rule returns a `JavaInfo` provider with:\n- **Compile-time JARs**: Interface and implementation JARs for compilation\n- **Runtime JARs**: Implementation JARs needed at runtime\n- **Transitive dependencies**: Properly filtered transitive JARs\n\n## Testing\n\nComprehensive tests are available in `tests/internal_dependencies/` covering:\n- Compile-time only scenarios\n- Runtime only scenarios  \n- Mixed dependency scenarios\n- Complex dependency graphs\n- Various exclusion patterns\n\nRun tests with:\n```bash\nbazel test //tests/internal_dependencies/...\n```\n\n## Integration with Other Targets\n\nThe `deps_filter` rule is designed to be referenced by other Java targets:\n\n```python\ndeps_filter(\n    name = \"filtered_deps\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_labels = [\"@maven//:some_dep_you_dont_want\"],\n    deps_exclude_paths = [\"javax-servlet\"],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"my_library\",\n    deps = [\":filtered_deps\"],  # Use your filtered deps here!\n    # ... other attributes\n)\n```\n\n## Use Cases\n\n- **Dependency pruning**: Remove unwanted dependencies from the classpath\n- **Security**: Exclude dependencies with known vulnerabilities\n- **Size optimization**: Reduce JAR size by excluding unnecessary dependencies\n- **Conflict resolution**: Exclude conflicting dependency versions\n- **Build optimization**: Remove dependencies that cause build issues\n- **Spring Boot applications**: Particularly useful for complex classpaths in Spring Boot apps\n\n## Important: Bazel Query Limitations\n\n**Note:** The `bazel query \"deps(target)\"` command does not accurately reflect the filtered deps when using `deps_filter_rule`. This is due to how bazel processes dependency queries.\n\n\n## Edge Cases and Behaviors\n\n### 1. Empty Dependencies\nAt least one of `deps` or `runtime_deps` must be non-empty:\n```python\n# Fails: Error: atleast one of 'deps' or 'runtime_deps' must be non-empty\ndeps_filter(\n    name = \"empty_deps\",\n    deps = [],\n    runtime_deps = [],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n)\n```\n\n### 2. Duplicate Exclusions\nDuplicate labels or paths in exclusion lists are not allowed:\n```python\n# Fails: Label '@@maven//:io_micrometer_micrometer_commons' is duplicated in the 'deps_exclude_labels' attribute of rule 'duplicates'\ndeps_filter(\n    name = \"duplicates\",\n    deps = [\":lib_a\"],\n    deps_exclude_labels = [\n        \"@maven//:io_micrometer_micrometer_commons\",\n        \"@maven//:io_micrometer_micrometer_commons\",  # Duplicate\n        \"@maven//:org_slf4j_jul_to_slf4j\",\n    ],\n    deps_exclude_paths = [\n        \"slf4j\",\n    ],\n)\n```\n\n### 3. Non-existent Dependencies\nExcluding non-existent dependencies will cause a build failure:\n```python\n# Fails: Error: no such target '@@maven//:nonexistent_dependency': target 'nonexistent_dependency' not declared in package\ndeps_filter(\n    name = \"nonexistent\",\n    deps = [\":lib_a\"],\n    deps_exclude_labels = [\"@maven//:nonexistent_dependency\"],\n)\n```\n\n### 4. Complete Dependency Exclusion\nExcluding all dependencies from a target will cause a build failure:\n```python\n# Fails: Error: org_springframework_boot_spring_boot_starter_data_jpa has no implementation jars left after filtering exclusions. Remove it from 'deps' and 'runtime_deps'.\ndeps_filter(\n    name = \"exclude_all\",\n    deps = [\n            \"@maven//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@maven//:org_springframework_boot_spring_boot_starter_security\",\n        ],\n    deps_exclude_labels = [\n            \"@maven//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@maven//:org_springframework_boot_spring_boot_starter_security\",\n        ],  # Excluding all deps\n)\n```\n\n### 5. Filtering Removes All Implementation JARs (listed in `deps` or `runtime_deps`)\nWhen filtering removes all implementation JARs from a dependency, the build fails:\n```python\n# Fails: Error: com_fasterxml_jackson_core_jackson_databind has no implementation jars left after filtering exclusions. Remove it from 'deps' and 'runtime_deps'\ndeps_filter(\n    name = \"filtered_to_nothing\",\n    deps = [\n            \":lib_a\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n        ],\n    deps_exclude_paths = [\"jackson\"],  # Removes all implementation JARs\n    exclude_transitives = True,\n)\n```\n"
  },
  {
    "path": "springboot/deps_filter_rules/dependencyset.bzl",
    "content": "load(\"//springboot/deps_filter_rules:deps_filter.bzl\", \"deps_filter\")\n\ndef dependencyset(name, items, deps_exclude_labels = [], deps_exclude_paths = [], \n        exclude_transitives = False, verbose = False, testonly = False):\n\n    # implement logic to add default exclusions. \n\n    if \"runtime_deps\" in name:\n        return deps_filter(\n            name = name,\n            runtime_deps = items,\n            deps_exclude_labels = deps_exclude_labels,\n            deps_exclude_paths = deps_exclude_paths,\n            exclude_transitives = exclude_transitives,\n            verbose = verbose,\n            testonly = testonly,\n        )\n    else:\n        return deps_filter(\n            name = name,\n            deps = items,\n            deps_exclude_labels = deps_exclude_labels,\n            deps_exclude_paths = deps_exclude_paths,\n            exclude_transitives = exclude_transitives,\n            verbose = verbose,\n            testonly = testonly,\n        )"
  },
  {
    "path": "springboot/deps_filter_rules/dependencyset.md",
    "content": "# dependencyset Macro\n\nA wrapper around `deps_filter` that scales dependency filtering across your entire monorepo. Enforces consistent dependency management patterns.\n\n## Why dependencyset?\n\nFor large monorepos with hundreds of services, managing exclusions at each `deps_filter` call is impractical. `dependencyset` enables:\n\n- **Centralized exclusions**: Security and platform teams maintain shared exclusion lists (CVEs, deprecated libs, etc.)\n- **Local flexibility**: Services and libraries can add target-level exclusions when needed\n- **Standardized usage**: All services must use `dependencyset`, ensuring consistent classpaths\n\n## How It Works\n\nThe `dependencyset` macro automatically detects whether to apply exclusions to `deps` or `runtime_deps` based on the target name:\n\n```python\nload(\"@rules_spring//springboot/deps_filter_rules:dependencyset.bzl\", \"dependencyset\")\n\n# Automatically treats as deps (compile-time)\ndependencyset(\n    name = \"deps\",\n    items = [\":lib_a\", \":lib_b\"],\n    deps_exclude_labels = [\":local_exclude\"],  # Additional exclusions other than centralized exclusions\n)\n\n# Automatically treats as runtime_deps (name contains \"runtime_deps\")\ndependencyset(\n    name = \"runtime_deps\",\n    items = [\":lib_c\", \":lib_d\"],\n    # Centralized exclusions automatically applied here\n)\n```\n\n## Before vs After\n\n### Before: Manual Dependency Lists\n\n```python\ndeps = [\n    # list of deps\n],\n\nruntime_deps = [\n    # list of runtime deps\n],\n\njava_library(\n    name = \"base_lib\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    deps = [\":deps\"],\n    runtime_deps = [\":runtime_deps\"],\n)\n```\n\n### After: Standardized Dependency Sets\n\n```python\nload(\"@rules_spring//springboot/deps_filter_rules:dependencyset.bzl\", \"dependencyset\")\n\ndependencyset(\n    name = \"deps\",\n    items = [\n        # list of deps\n    ],\n    # Centralized exclusions automatically applied\n    # Optional: deps_exclude_labels = [\":additional_exclusions\"]\n)\n\ndependencyset(\n    name = \"runtime_deps\",\n    items = [\n        # list of runtime deps\n    ],\n)\n\njava_library(\n    name = \"base_lib\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    deps = [\":deps\"],\n    runtime_deps = [\":runtime_deps\"],\n)\n```\n\n**Important**: This structure enforces all services/libs to use `dependencyset` instead of raw dependency lists. This standardized approach provides better control over dependencies across large monorepos.\n\n## Problems It Helps Fix\n\n✓ **Eliminates classpath conflicts**\n- Prevents duplicate classes from conflicting versions\n- Removes version skew issues\n\n✓ **Stops test flakiness**\n- Aligns test and production classpaths\n- Eliminates \"works in test, fails in prod\" surprises\n\n✓ **Accelerates security response**\n- Centralized CVE exclusions remove vulnerable jars automatically\n- Enables faster remediation across the fleet\n\n✓ **Removes dependency noise**\n- Filters out unwanted transitives you don't actually use\n- Creates cleaner, smaller classpaths\n\n✓ **Ensures consistent dependency hygiene**\n- Standardized patterns enforce clean classpaths everywhere\n- Provides centralized control with local flexibility\n\n## Adoption Path\n\n1. **Introduce dependencyset macro**: Add wrapper around `deps_filter` rule in your repo\n2. **Seed central exclude lists**: Security + platform teams define shared exclusions\n3. **Migrate targets**: Convert services/libs to use `dependencyset`\n4. **Add target-level exclusions**: Allow local exclusions where needed\n\n## Customization\n\nTo add centralized exclusions, modify the `dependencyset` macro in your repository to include default exclusion lists:\n\n```python\ndef dependencyset(name, items, deps_exclude_labels = [], ...):\n    # Add your centralized exclusions here\n    central_excludes = [\n        \"@maven//:vulnerable_lib\",\n        # ... more centralized exclusions\n    ]\n    \n    deps_exclude_labels = central_excludes + deps_exclude_labels\n    \n    return deps_filter(\n        name = name,\n        items = items,\n        deps_exclude_labels = deps_exclude_labels,\n        # ...\n    )\n```\n\n## See Also\n\n- [`deps_filter` rule documentation](README.md): The underlying rule that powers `dependencyset`\n- [dependencyset tests](../../tests/dependencyset/): Comprehensive test examples\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/deps_filter.bzl",
    "content": "load(\"@bazel_tools//tools/jdk:toolchain_utils.bzl\", \"find_java_toolchain\")\n\ndef _filter_deps(deps_list, excludes, ctx, is_compile_time = False):\n    \"\"\"\n    Filters dependencies based on exclusion patterns.\n    \n    Args:\n        deps_list: List of dependencies to filter\n        excludes: Dictionary of paths that should be excluded\n        ctx: The rule context containing exclusion patterns\n        \n    Returns:\n        List of filtered dependencies that don't match any exclusion patterns\n    \"\"\"\n    filtered_deps = []\n    for dep in deps_list:\n        dep_path = dep.path\n        if is_compile_time:\n            dep_path = dep_path.replace(\"-ijar.jar\", \".jar\")\n            dep_path = dep_path.replace(\"-hjar.jar\", \".jar\")\n            dep_path = dep_path.replace(\"/header_\", \"/processed_\")\n        \n        if excludes.get(dep_path, None) != None:\n            if ctx.attr.verbose:\n                print(\"[DEBUG] excluded: \" + dep_path)\n            pass\n        else:\n            # Default to including the JAR unless a pattern match excludes it\n            include = True\n            for pattern in ctx.attr.deps_exclude_paths:\n                if dep_path.find(pattern) > -1:\n                    include = False\n                    break\n            if include:\n                filtered_deps.append(dep)    \n            else:\n                if ctx.attr.verbose:\n                    print(\"[DEBUG] excluded: \" + dep_path)\n    return filtered_deps\n\ndef _pack_jars(jars, ctx, java_toolchain, label_name = \"\"):\n    \"\"\"\n    Packs multiple JARs into a single JAR.\n    \n    Args:\n        jars: List of JARs to pack\n        ctx: Rule context\n        java_toolchain: Java toolchain to use\n        label_name: Name for the output JAR\n    \n    Returns: \n        The packed JAR\n    \"\"\"\n    if len(jars) == 0:\n        return None\n    if len(jars) == 1:\n        return jars[0]\n        \n    if not label_name:\n        fail(\"Error: label_name cannot be empty\")\n        \n    return java_common.pack_sources(\n        ctx.actions,\n        output_source_jar = ctx.actions.declare_file(label_name),\n        sources = jars,\n        java_toolchain = java_toolchain,\n    )\n\ndef _build_exclusion_set(excluded_deps, exclude_transitives):\n    \"\"\"Builds a set of JAR paths to exclude from dependencies.\n    \n    Args:\n        excluded_deps: List of dependencies to exclude\n        exclude_transitives: Whether to exclude transitive deps\n\n    Returns:\n        excludes: Dictionary of JAR paths to exclude\n    \"\"\"\n    excludes = {}\n    for dep in excluded_deps:\n        # Add direct JARs\n        for jar in dep[JavaInfo].full_compile_jars.to_list() + dep[JavaInfo].compile_jars.to_list():\n            excludes[jar.path] = True\n            \n        # Add transitive JARs if exclude_transitives is set to True\n        if exclude_transitives:\n            for jar in dep[JavaInfo].transitive_compile_time_jars.to_list() + dep[JavaInfo].transitive_runtime_jars.to_list():\n                excludes[jar.path] = True\n                \n    return excludes\n\ndef _create_filtered_java_info(filtered_jars, filtered_compile_jar, filtered_full_compile_jar):\n    \"\"\"\n    Creates a JavaInfo object with filtered JARs.\n    \n    Args:\n        filtered_jars: Dictionary containing filtered JARs\n        filtered_compile_jar: Filtered interace/header JAR\n        filtered_full_compile_jar: Filtered implementation JAR\n            \n    Returns:\n        JavaInfo object with filtered JARs\n    \"\"\"\n    return JavaInfo(\n        source_jar = filtered_full_compile_jar, \n        compile_jar = filtered_compile_jar,  # Interface/Header JAR\n        output_jar = filtered_full_compile_jar,  # Implementation JAR\n        # Note: filtered_transitive_compile_jars contains only interface jars (ijars)\n        # Using impl_jar as output_jar to avoid interface jar output\n        deps = [JavaInfo(source_jar = None, compile_jar = jar, output_jar = filtered_full_compile_jar) \n               for jar in filtered_jars[\"transitive_compile_jars\"]],\n        runtime_deps = [JavaInfo(source_jar = jar, compile_jar = jar, output_jar = jar) \n                      for jar in filtered_jars[\"transitive_runtime_jars\"]],\n    )\n\ndef _check_jar(full_compile_jar, compile_jar):\n    dep_path = compile_jar.path\n    dep_path = dep_path.replace(\"-ijar.jar\", \".jar\")\n    dep_path = dep_path.replace(\"-hjar.jar\", \".jar\")\n    dep_path = dep_path.replace(\"/header_\", \"/processed_\")\n    if dep_path == full_compile_jar.path:\n        return True\n    return False\n\ndef _get_compile_jar(full_compile_jar, index, compile_jars_list):\n    if len(compile_jars_list) > index and _check_jar(full_compile_jar, compile_jars_list[index]):\n        return compile_jars_list[index]\n\n    for jar in compile_jars_list:\n        if _check_jar(full_compile_jar, jar):\n            return jar\n    return None\n\ndef _aggregate_deps(declared_deps, ctx, java_toolchain):\n    \"\"\"\n    Aggregates and processes dependencies, handling exclusions and transitive dependencies.\n    \n    Args:\n        declared_deps: List of all explicitly declared direct dependencies to process\n        ctx: The rule context containing exclusion settings\n        java_toolchain: Java toolchain to use\n        \n    Returns:\n        Tuple of (processed JavaInfo objects, filtered direct dependencies)\n    \"\"\"\n    # Build exclusion set from excluded labels\n    excludes = _build_exclusion_set(ctx.attr.deps_exclude_labels, ctx.attr.exclude_transitives)\n    \n    # Process each dependency:\n    # 1. Extract compile and transitive JARs\n    # 2. Filter out excluded JARs\n    # 3. Create new JavaInfo with filtered JARs\n    output_java_info_list = []\n    output_direct_jars_list = []\n    \n    for dep in declared_deps:\n        # Example: lets say dep is A, and the dependency graph is:\n        #\n        #     A (compile)\n        #    /   \\\n        #   B     C (transitive compile)\n        #  /       \\\n        # D         E (transitive runtime)\n        #\n        # Initial sets:\n        #   - compile_jars            = [A-i.jar]\n        #   - full_compile_jars       = [A.jar]\n        #   - transitive_compile_jars = [A-i.jar, B-i.jar, C-i.jar]\n        #   - transitive_runtime_jars = [A.jar, B.jar, C.jar, D.jar, E.jar]\n        #\n        # If C.jar and D.jar are excluded:\n        #   - filtered_compile_jars            = [A-i.jar]\n        #   - filtered_full_compile_jars       = [A.jar]\n        #   - filtered_transitive_compile_jars = [A-i.jar, B-i.jar]         # C-i.jar removed\n        #   - filtered_transitive_runtime_jars = [A.jar, B.jar, E.jar]      # C.jar, D.jar removed\n        #\n        # If exclude_transitives=True and C.jar is excluded:\n        #   - filtered_compile_jars            = [A-i.jar]\n        #   - filtered_full_compile_jars       = [A.jar]\n        #   - filtered_transitive_compile_jars = [A-i.jar, B-i.jar]\n        #   - filtered_transitive_runtime_jars = [A.jar, B.jar]             # E.jar dropped (reachable only via C)\n        #\n        # dep_java_info will be constructed with:\n        #   - source_jar   = A.jar\n        #   - compile_jar  = A-i.jar\n        #   - output_jar   = A.jar\n        #   - deps         = [JavaInfo for A-i.jar, B-i.jar]\n        #   - runtime_deps = [JavaInfo for A.jar, B.jar, E.jar]  # E.jar not included if exclude_transitives=True\n        \n        # JAR Types:\n        # - full_compile_jars: Implementation JARs (e.g., lib_A.jar)\n        # - compile_jars: Interface/Header JARs (e.g., lib_A-ijar.jar)\n        # - transitive_compile_jars: Interface JARs from transitive deps\n        # - transitive_runtime_jars: Implementation JARs from transitive deps\n        \n        filtered_jars = {\n            \"compile_jars\": _filter_deps(dep[JavaInfo].compile_jars.to_list(), excludes, ctx, is_compile_time = True),\n            \"full_compile_jars\": _filter_deps(dep[JavaInfo].full_compile_jars.to_list(), excludes, ctx),\n            \"transitive_compile_jars\": _filter_deps(dep[JavaInfo].transitive_compile_time_jars.to_list(), excludes, ctx, is_compile_time = True),\n            \"transitive_runtime_jars\": _filter_deps(dep[JavaInfo].transitive_runtime_jars.to_list(), excludes, ctx),\n        }\n        \n        if len(filtered_jars[\"full_compile_jars\"]) == 0:\n            fail(\"Error: \" + dep.label.name + \" has no implementation jars left after filtering exclusions. Remove it from 'deps' and 'runtime_deps'.\")\n\n        for index in range(len(filtered_jars[\"full_compile_jars\"])):\n            filtered_full_compile_jar = filtered_jars[\"full_compile_jars\"][index]\n            filtered_compile_jar = _get_compile_jar(filtered_full_compile_jar, index, filtered_jars[\"compile_jars\"])\n            if filtered_compile_jar == None:\n                print(\"[DEBUG] No compile jar found for:\" + filtered_full_compile_jar.path + \". Check compile jars list:\" + str(filtered_jars[\"compile_jars\"]))\n\n            # Create JavaInfo with filtered JARs\n            java_info = _create_filtered_java_info(filtered_jars, filtered_compile_jar, filtered_full_compile_jar)\n            output_java_info_list.append(java_info)\n            output_direct_jars_list.append(filtered_full_compile_jar)\n\n    return output_java_info_list, output_direct_jars_list\n\n\ndef _deps_filter_impl(ctx):\n    \"\"\"\n    Implementation of the deps_filter rule that filters out specified dependencies and JARs.\n    \n    This rule filters out specified deps and JARs from the compile-time \n    and runtime deps. It utilizes the 'deps_exclude_labels' attribute to omit \n    specific JAR labels and the 'deps_exclude_paths' attribute to exclude \n    deps based on partial paths in their filenames. If 'exclude_transitives'\n    is set to `True` (default: `False`), any transitive deps solely required\n    by the deps in 'deps_exclude_labels' are also excluded. These exclusions ensure\n    the final collection includes only the necessary elements for the build\n    process, eliminating problematic deps.\n    \"\"\" \n    \n    if len(ctx.attr.deps) == 0 and len(ctx.attr.runtime_deps) == 0:\n        fail(\"Error: atleast one of 'deps' or 'runtime_deps' must be non-empty\")\n    \n    java_toolchain = find_java_toolchain(ctx, ctx.attr._java_toolchain)\n    compile_deps_info, compile_jars = _aggregate_deps(ctx.attr.deps, ctx, java_toolchain)\n    runtime_deps_info, runtime_jars = _aggregate_deps(ctx.attr.runtime_deps, ctx, java_toolchain)\n\n    if len(compile_jars) == 0 and len(runtime_jars) == 0:\n        fail(\"Error: The rule must return at least one compile-time or runtime JAR. Excluding all compile-time or runtime dependencies is not allowed.\")\n\n    if len(compile_jars) == 0:\n        # Only runtime deps present\n        output_jar = runtime_jars[0]\n        return [\n            DefaultInfo(files = depset([])),\n            JavaInfo(\n                compile_jar = None,\n                output_jar = output_jar,\n                # exports = runtime_deps_info,\n                runtime_deps = runtime_deps_info,\n            ),\n        ]\n    else:\n        # Compile-time deps present\n        output_jar = compile_jars[0]\n        return [\n            DefaultInfo(files = depset(compile_jars)),\n            JavaInfo(\n                source_jar = output_jar,\n                compile_jar = None,\n                output_jar = output_jar,\n                exports = compile_deps_info,\n                runtime_deps = compile_deps_info + runtime_deps_info,\n                deps = compile_deps_info,\n            ),\n        ]\n\n\n# Rule definition for filtering dependencies\ndeps_filter = rule(\n    implementation = _deps_filter_impl,\n    attrs = {\n        \"deps\": attr.label_list(providers = [java_common.provider], allow_empty = True),\n        \"runtime_deps\": attr.label_list(providers = [java_common.provider], allow_empty = True),\n        \"deps_exclude_labels\": attr.label_list(providers = [java_common.provider], allow_empty = True),\n        \"deps_exclude_paths\": attr.string_list(),\n        \"exclude_transitives\": attr.bool(default = False),\n        \"verbose\": attr.bool(default = False),\n        \"_java_toolchain\": attr.label(default = \"@bazel_tools//tools/jdk:current_java_toolchain\"),\n    },    \n    toolchains = [\"@bazel_tools//tools/jdk:toolchain_type\"],\n)\n\ndef deps_filter_rule(name, deps, runtime_deps, deps_exclude_labels = [], deps_exclude_paths = [], exclude_transitives = False, testonly = False, verbose = False):\n    # We will not be using this as we planned to use dependencyset for both deps and runtime_deps.\n    # Keeping it here for now.\n    deps_filter(\n        name = name + \"_compile\",\n        deps = deps,\n        deps_exclude_labels = deps_exclude_labels,\n        deps_exclude_paths = deps_exclude_paths,\n        exclude_transitives = exclude_transitives,\n        verbose = verbose,\n        testonly = testonly,\n    )\n\n    deps_filter(\n        name = name + \"_runtime\",\n        runtime_deps = runtime_deps,\n        deps_exclude_labels = deps_exclude_labels,\n        deps_exclude_paths = deps_exclude_paths,\n        exclude_transitives = exclude_transitives,\n        verbose = verbose,\n        testonly = testonly,\n    )"
  },
  {
    "path": "springboot/deps_filter_rules/tests/README.md",
    "content": "# Testing Overview\n\nThis directory contains comprehensive tests for the `deps_filter` Bazel rule and `dependencyset` macro. The test suites validate compile-time and runtime dependency filtering across synthetic internal graphs and real external libraries.\n\n## Directory Structure\n\n```\ntests/\n├── depsfilter/                    # Tests for deps_filter rule\n│   ├── internal_dependencies/     # Synthetic dependency graphs\n│   └── external_dependencies/     # Real external libraries\n├── dependencyset/                 # Tests for dependencyset macro\n│   ├── internal_dependencies/     \n│   └── external_dependencies/     \n├── test_utils/                    # Shared testing utilities\n│   ├── verification_utils.bzl     # Starlark verification helpers\n│   ├── dependency_graph.txt       # Pre-generated dependency graph\n│   └── src/                       # Java test utilities\n└── external_deps/                 # External dependency management\n    ├── unmanaged_deps_filter.bzl  # Maven dependency definitions\n    └── unmanaged_deps_filter_install.json  # Lock file\n```\n\n## Detailed Documentation\n\n- **[Internal Dependencies Testing](internal_dependencies_testing.md)**: Comprehensive guide for internal dependency testing\n- **[External Dependencies Testing](external_dependencies_testing.md)**: Comprehensive guide for real external dependency testing\n\n## What These Tests Verify\n\n### Core Functionality\n- Correct JAR sets for all jar types: `compile_jars`, `full_compile_jars`, `transitive_compile_jars`, `transitive_runtime_jars`\n- Interface (compile time) vs implementation (runtime) JAR distinction (`-hjar` vs full JARs)\n- Mixed dependency graphs: compile-only, runtime-only, and mixed compile+runtime cases\n\n### Exclusion Mechanisms\n- **Label-based exclusions**: Exclude dependencies by their Bazel label\n- **Path/pattern-based exclusions**: Exclude dependencies matching path patterns in JAR names\n- **`exclude_transitives`**: Control whether transitive dependencies are also excluded\n- **Multiple exclusions**: Combined label and path exclusions\n\n### Edge Cases\n- Empty exclusion lists\n- Special characters in path patterns (dots, hyphens)\n- Case sensitivity in pattern matching\n- Multiple paths to the same dependency\n- Complex cross-branch dependency relationships\n\n## Testing Approaches\n\n### Starlark Testing - Rule/Macro Output Verification\nStarlark tests verify the `deps_filter` rule's and `dependencyset` macro's output.\n\n### Java Testing - Runtime Classpath Verification\nJava tests verify that the correct JARs are available at runtime.\n\nMore details in [internal dependencies testing](internal_dependencies_testing.md) and [external dependencies testing](external_dependencies_testing.md).\n\n## Common Utilities\n\n### test_utils/\n- **`verification_utils.bzl`**: Starlark utilities for verifying JAR collections and exclusion counts\n- **`DependencyGraphAnalyzer`**: Java utility for parsing and analyzing Bazel dependency graphs\n- **`DepsFilterTestHelper`**: Java utility for computing runtime classpath dependencies\n\n### external_deps/\n- **`unmanaged_deps_filter.bzl`**: Defines external Maven dependencies (Spring Boot, Jakarta, etc.)\n- **`unmanaged_deps_filter_install.json`**: Lock file for pinned dependency versions\n\n## Managing External Dependencies\n\nTo update external dependencies:\n1. Edit `external_deps/unmanaged_deps_filter.bzl`\n2. Run: `bazel run @unpinned_unmanaged_deps_filter//:pin`\n\n## Refreshing Dependency Graphs\n\nSome Java tests use a pre-generated graph file. To refresh:\n```bash\nbazel query 'deps(\"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\")' --output=graph > dependency_graph.txt\n```\n\n## Running Tests\n\n```bash\n# Run all tests\nbazel test //springboot/deps_filter_rules/tests/...\n```\n\n## Test Coverage Summary\n\nThe comprehensive test suite ensures the `deps_filter` rule and `dependencyset` macro work correctly across:\n- Basic dependency filtering functionality\n- All exclusion mechanisms (label, path, transitive)\n- Interface vs implementation JAR distinction\n- Mixed compile-time and runtime dependencies\n- Complex dependency graph scenarios\n- Real-world external library integration\n- Edge cases and error conditions\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:dependencyset.bzl\", \"dependencyset\")\nload(\n    \"//springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime:compile_and_runtime_test.bzl\",\n    \"no_filtering_test\",\n    \"with_label_exclusions_test\",\n    \"with_label_exclusions_with_exclude_transitives_test\",\n    \"with_path_exclusions_test\",\n    \"with_path_exclusions_with_exclude_transitives_test\",\n    \"multiple_exclusions_with_exclude_transitives_test\",\n    \"multiple_exclusions_without_exclude_transitives_test\",\n    \"empty_exclusion_lists_test\",\n    \"path_based_exclusions_comprehensive_test\",\n    \"runtime_deps_only_test\",\n    \"compile_deps_only_test\",\n    \"single_dep_with_exclusions_test\",\n    \"single_runtime_dep_with_exclusions_test\",\n    \"one_compile_one_runtime_dep_test\",\n    \"path_patterns_with_special_characters_test\",\n    \"case_sensitive_pattern_matching_test\",\n)\n\ndeps = [\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\", \n    \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n    \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n    \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n]\n\nruntime_deps = [\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n]\n\ntest_deps = [\n    \"@unmanaged_deps_filter//:junit_junit\",\n    \"@unmanaged_deps_filter//:org_assertj_assertj_core\",\n]\n\n# Test 1: No filtering - baseline test\ndependencyset(\n    name = \"deps_no_filtering\",\n    items = deps,\n)\n\ndependencyset(\n    name = \"runtime_deps_no_filtering\",\n    items = runtime_deps,\n)\n\njava_library(\n    name = \"no_filtering_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_no_filtering\"],\n    runtime_deps = [\":runtime_deps_no_filtering\"],\n)\n\nno_filtering_test(\n    name = \"no_filtering_test\",\n    test_lib = \":no_filtering_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterNoFilteringTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterNoFilteringTest.java\"\n    ],\n    deps = [\":no_filtering_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 2: Label-based exclusions without transitives\ndependencyset(\n    name = \"deps_with_label_exclusions\",\n    items = deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n)\n\ndependencyset(\n    name = \"runtime_deps_with_label_exclusions\",\n    items = runtime_deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n)\n\njava_library(\n    name = \"with_label_exclusions_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_with_label_exclusions\"],\n    runtime_deps = [\":runtime_deps_with_label_exclusions\"],\n)\n\nwith_label_exclusions_test(\n    name = \"with_label_exclusions_test\",\n    test_lib = \":with_label_exclusions_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterLabelExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterLabelExclusionsTest.java\"\n    ],\n    deps = [\":with_label_exclusions_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 3: Label-based exclusions with exclude_transitives\ndependencyset(\n    name = \"deps_with_label_exclusions_with_exclude_transitives\",\n    items = deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    exclude_transitives = True,\n)\n\ndependencyset(\n    name = \"runtime_deps_with_label_exclusions_with_exclude_transitives\",\n    items = runtime_deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"with_label_exclusions_with_exclude_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_with_label_exclusions_with_exclude_transitives\"],\n    runtime_deps = [\":runtime_deps_with_label_exclusions_with_exclude_transitives\"],\n)\n\nwith_label_exclusions_with_exclude_transitives_test(\n    name = \"with_label_exclusions_with_exclude_transitives_test\",\n    test_lib = \":with_label_exclusions_with_exclude_transitives_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterExcludeTransitiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterExcludeTransitiveTest.java\"\n    ],\n    deps = [\":with_label_exclusions_with_exclude_transitives_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 4: Path-based exclusions without transitives\ndependencyset(\n    name = \"deps_with_path_exclusions\",\n    items = deps,\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\"\n    ],\n)\n\ndependencyset(\n    name = \"runtime_deps_with_path_exclusions\",\n    items = runtime_deps,\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\"\n    ],\n)\n\njava_library(\n    name = \"with_path_exclusions_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_with_path_exclusions\"],\n    runtime_deps = [\":runtime_deps_with_path_exclusions\"],\n)\n\nwith_path_exclusions_test(\n    name = \"with_path_exclusions_test\",\n    test_lib = \":with_path_exclusions_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterPathExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathExclusionsTest.java\"\n    ],\n    deps = [\":with_path_exclusions_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 5: Path-based exclusions with exclude_transitives\ndependencyset(\n    name = \"deps_with_path_exclusions_with_exclude_transitives\",\n    items = deps,\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\"\n    ],\n    exclude_transitives = True,\n)\n\ndependencyset(\n    name = \"runtime_deps_with_path_exclusions_with_exclude_transitives\",\n    items = runtime_deps,\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\"\n    ],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"with_path_exclusions_with_exclude_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_with_path_exclusions_with_exclude_transitives\"],\n    runtime_deps = [\":runtime_deps_with_path_exclusions_with_exclude_transitives\"],\n)\n\nwith_path_exclusions_with_exclude_transitives_test(\n    name = \"with_path_exclusions_with_exclude_transitives_test\",\n    test_lib = \":with_path_exclusions_with_exclude_transitives_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterPathExclusionsWithTransitivesTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathExclusionsWithTransitivesTest.java\"\n    ],\n    deps = [\":with_path_exclusions_with_exclude_transitives_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 6: Multiple exclusions with exclude_transitives (labels + patterns)\ndependencyset(\n    name = \"deps_multiple_exclusions_with_exclude_transitives\",\n    items = deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    deps_exclude_paths = [\n        \"slf4j\"\n    ],\n    exclude_transitives = True,\n)\n\ndependencyset(\n    name = \"runtime_deps_multiple_exclusions_with_exclude_transitives\",\n    items = runtime_deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    deps_exclude_paths = [\n        \"slf4j\"\n    ],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"multiple_exclusions_with_exclude_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_multiple_exclusions_with_exclude_transitives\"],\n    runtime_deps = [\":runtime_deps_multiple_exclusions_with_exclude_transitives\"],\n)\n\nmultiple_exclusions_with_exclude_transitives_test(\n    name = \"multiple_exclusions_with_exclude_transitives_test\",\n    test_lib = \":multiple_exclusions_with_exclude_transitives_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterMultipleExclusionsWithTransitivesTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithTransitivesTest.java\"\n    ],\n    deps = [\":multiple_exclusions_with_exclude_transitives_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 7: Multiple exclusions without exclude_transitives (labels + patterns)\ndependencyset(\n    name = \"deps_multiple_exclusions_without_exclude_transitives\",\n    items = deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    deps_exclude_paths = [\n        \"slf4j\",\n    ],\n    exclude_transitives = False,\n)\n\ndependencyset(\n    name = \"runtime_deps_multiple_exclusions_without_exclude_transitives\",\n    items = runtime_deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    deps_exclude_paths = [\n        \"slf4j\",\n    ],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"multiple_exclusions_without_exclude_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_multiple_exclusions_without_exclude_transitives\"],\n    runtime_deps = [\":runtime_deps_multiple_exclusions_without_exclude_transitives\"],\n)\n\nmultiple_exclusions_without_exclude_transitives_test(\n    name = \"multiple_exclusions_without_exclude_transitives_test\",\n    test_lib = \":multiple_exclusions_without_exclude_transitives_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterMultipleExclusionsWithoutTransitivesTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithoutTransitivesTest.java\"\n    ],\n    deps = [\":multiple_exclusions_without_exclude_transitives_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 8: Empty exclusion lists\ndependencyset(\n    name = \"deps_empty_exclusion_lists\",\n    items = deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\ndependencyset(\n    name = \"runtime_deps_empty_exclusion_lists\",\n    items = runtime_deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"empty_exclusion_lists_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_empty_exclusion_lists\"],\n    runtime_deps = [\":runtime_deps_empty_exclusion_lists\"],\n)\n\nempty_exclusion_lists_test(\n    name = \"empty_exclusion_lists_test\",\n    test_lib = \":empty_exclusion_lists_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterEmptyExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterEmptyExclusionsTest.java\"\n    ],\n    deps = [\":empty_exclusion_lists_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 9: Comprehensive path-based exclusions\ndependencyset(\n    name = \"deps_path_based_exclusions_comprehensive\",\n    items = deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\",\n        \"logback\"\n    ],\n    exclude_transitives = False,\n)\n\ndependencyset(\n    name = \"runtime_deps_path_based_exclusions_comprehensive\",\n    items = runtime_deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\",\n        \"logback\"\n    ],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"path_based_exclusions_comprehensive_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_path_based_exclusions_comprehensive\"],\n    runtime_deps = [\":runtime_deps_path_based_exclusions_comprehensive\"],\n)\n\npath_based_exclusions_comprehensive_test(\n    name = \"path_based_exclusions_comprehensive_test\",\n    test_lib = \":path_based_exclusions_comprehensive_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterPathBasedExclusionsComprehensiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathBasedExclusionsComprehensiveTest.java\"\n    ],\n    deps = [\":path_based_exclusions_comprehensive_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 10: Runtime deps only\ndependencyset(\n    name = \"runtime_deps_only\",\n    items = runtime_deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"runtime_deps_only_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    runtime_deps = [\":runtime_deps_only\"],\n)\n\nruntime_deps_only_test(\n    name = \"runtime_deps_only_test\",\n    test_lib = \":runtime_deps_only_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterRuntimeDepsOnlyTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterRuntimeDepsOnlyTest.java\"\n    ],\n    deps = [\":runtime_deps_only_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 11: Compile deps only\ndependencyset(\n    name = \"compile_deps_only\",\n    items = deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"compile_deps_only_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":compile_deps_only\"],\n)\n\ncompile_deps_only_test(\n    name = \"compile_deps_only_test\",\n    test_lib = \":compile_deps_only_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterCompileDepsOnlyTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterCompileDepsOnlyTest.java\"\n    ],\n    deps = [\":compile_deps_only_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 12: Single dependency with exclusions\ndependencyset(\n    name = \"deps_single_dep_with_exclusions\",\n    items = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n    ],\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n    ],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"single_dep_with_exclusions_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_single_dep_with_exclusions\"],\n)\n\nsingle_dep_with_exclusions_test(\n    name = \"single_dep_with_exclusions_test\",\n    test_lib = \":single_dep_with_exclusions_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterSingleDepWithExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterSingleDepWithExclusionsTest.java\"\n    ],\n    deps = [\":single_dep_with_exclusions_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 13: Single runtime dependency with exclusions\ndependencyset(\n    name = \"runtime_deps_single_runtime_dep_with_exclusions\",\n    items = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n    ],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"slf4j\",\n    ],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"single_runtime_dep_with_exclusions_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    runtime_deps = [\":runtime_deps_single_runtime_dep_with_exclusions\"],\n)\n\nsingle_runtime_dep_with_exclusions_test(\n    name = \"single_runtime_dep_with_exclusions_test\",\n    test_lib = \":single_runtime_dep_with_exclusions_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterSingleRuntimeDepWithExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterSingleRuntimeDepWithExclusionsTest.java\"\n    ],\n    deps = [\":single_runtime_dep_with_exclusions_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 14: One compile dep and one runtime dep\ndependencyset(\n    name = \"deps_one_compile_one_runtime_dep\",\n    items = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n    ],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\ndependencyset(\n    name = \"runtime_deps_one_compile_one_runtime_dep\",\n    items = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n    ],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"one_compile_one_runtime_dep_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_one_compile_one_runtime_dep\"],\n    runtime_deps = [\":runtime_deps_one_compile_one_runtime_dep\"],\n)\n\none_compile_one_runtime_dep_test(\n    name = \"one_compile_one_runtime_dep_test\",\n    test_lib = \":one_compile_one_runtime_dep_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterOneCompileOneRuntimeDepTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterOneCompileOneRuntimeDepTest.java\"\n    ],\n    deps = [\":one_compile_one_runtime_dep_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 15: Path patterns with special characters\ndependencyset(\n    name = \"deps_path_patterns_with_special_characters\",\n    items = deps,\n    deps_exclude_paths = [\n        \"io.micrometer\",  \n        \"to-slf4j\", \n    ],\n    exclude_transitives = True,\n)\n\ndependencyset(\n    name = \"runtime_deps_path_patterns_with_special_characters\",\n    items = runtime_deps,\n    deps_exclude_paths = [\n        \"io.micrometer\",  \n        \"to-slf4j\", \n    ],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"path_patterns_with_special_characters_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_path_patterns_with_special_characters\"],\n    runtime_deps = [\":runtime_deps_path_patterns_with_special_characters\"],\n)\n\npath_patterns_with_special_characters_test(\n    name = \"path_patterns_with_special_characters_test\",\n    test_lib = \":path_patterns_with_special_characters_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterPathPatternsWithSpecialCharactersTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathPatternsWithSpecialCharactersTest.java\"\n    ],\n    deps = [\":path_patterns_with_special_characters_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 16: Case sensitive pattern matching\ndependencyset(\n    name = \"deps_case_sensitive_pattern_matching\",\n    items = deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"SPRING\",  # Uppercase pattern\n        \"Jackson\", # Mixed case pattern\n        \"HIBERNATE\", # Uppercase pattern\n    ],\n    exclude_transitives = False,\n)\n\ndependencyset(\n    name = \"runtime_deps_case_sensitive_pattern_matching\",\n    items = runtime_deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"SPRING\",  # Uppercase pattern\n        \"Jackson\", # Mixed case pattern\n        \"HIBERNATE\", # Uppercase pattern\n    ],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"case_sensitive_pattern_matching_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_case_sensitive_pattern_matching\"],\n    runtime_deps = [\":runtime_deps_case_sensitive_pattern_matching\"],\n)\n\ncase_sensitive_pattern_matching_test(\n    name = \"case_sensitive_pattern_matching_test\",\n    test_lib = \":case_sensitive_pattern_matching_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterCaseSensitivePatternMatchingTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterCaseSensitivePatternMatchingTest.java\"\n    ],\n    deps = [\":case_sensitive_pattern_matching_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/compile_and_runtime_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules:deps_filter.bzl\", \"deps_filter\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\",\n        \"compute_expected_jars\",\n)\n\n\ndef _test_no_filtering(ctx):\n    \"\"\"\n    Tests deps without any filtering - baseline test.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"no_filtering_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_jars_and_dropped_counts(env, expected, \n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n\n    return unittest.end(env)\n\nno_filtering_test = unittest.make(_test_no_filtering, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n})\n\n\ndef _test_with_label_exclusions(ctx):\n    \"\"\"\n    Tests deps with label-based exclusions (without transitives).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"with_label_exclusions_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Verify dropped counts - label exclusions should drop direct JARs but not transitives when exclude_transitives=False\n    dropped_counts = {\n        \"compile_jars_dropped\": expected[\"compile_jars_dropped\"],\n    \"full_compile_jars_dropped\": expected[\"full_compile_jars_dropped\"],\n        \"transitive_compile_jars_dropped\": expected[\"transitive_compile_jars_dropped\"],\n        \"transitive_runtime_jars_dropped\": expected[\"transitive_runtime_jars_dropped\"],\n    }\n    verify_dropped_counts(env, expected, \n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n\n    return unittest.end(env)\n\nwith_label_exclusions_test = unittest.make(_test_with_label_exclusions, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n            \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_with_label_exclusions_with_exclude_transitives(ctx):\n    \"\"\"\n    Tests deps with label-based exclusions including exclude_transitives.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"with_label_exclusions_with_exclude_transitives_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_jars_and_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n\n    return unittest.end(env)\n\nwith_label_exclusions_with_exclude_transitives_test = unittest.make(_test_with_label_exclusions_with_exclude_transitives, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n            \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\n\ndef _test_with_path_exclusions(ctx):\n    \"\"\"\n    Tests deps with path-based exclusions (without transitives).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"with_path_exclusions_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nwith_path_exclusions_test = unittest.make(_test_with_path_exclusions, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [        \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"micrometer\",\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\n\ndef _test_with_path_exclusions_with_exclude_transitives(ctx):\n    \"\"\"\n    Tests deps with path-based exclusions including exclude_transitives.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"with_path_exclusions_with_exclude_transitives_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n    \n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nwith_path_exclusions_with_exclude_transitives_test = unittest.make(_test_with_path_exclusions_with_exclude_transitives, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [        \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"micrometer\",\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\ndef _test_multiple_exclusions_with_exclude_transitives(ctx):\n    \"\"\"\n    Tests multiple exclusion types (labels + paths) with exclude_transitives=True.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"multiple_exclusions_with_exclude_transitives_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nmultiple_exclusions_with_exclude_transitives_test = unittest.make(_test_multiple_exclusions_with_exclude_transitives, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\ndef _test_multiple_exclusions_without_exclude_transitives(ctx):\n    \"\"\"\n    Tests multiple exclusion types (labels + paths) with exclude_transitives=False.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"multiple_exclusions_without_exclude_transitives_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nmultiple_exclusions_without_exclude_transitives_test = unittest.make(_test_multiple_exclusions_without_exclude_transitives, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"empty_exclusion_lists_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_path_based_exclusions_comprehensive(ctx):\n    \"\"\"\n    Tests comprehensive path-based exclusions with various patterns.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"path_based_exclusions_comprehensive_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Additional verification: ensure excluded patterns are not present\n    transitive_runtime_jars = [jar.basename for jar in javainfo_filtered.transitive_runtime_jars.to_list()]\n    for pattern in [\"micrometer\", \"slf4j\", \"logback\"]:\n        for jar in transitive_runtime_jars:\n            asserts.true(env, pattern not in jar, \n                \"Excluded pattern '{}' found in JAR: {}\".format(pattern, jar))\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    \n    return unittest.end(env)\n\npath_based_exclusions_comprehensive_test = unittest.make(_test_path_based_exclusions_comprehensive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"micrometer\",\n            \"slf4j\",\n            \"logback\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_runtime_deps_only(ctx):\n    \"\"\"\n    Tests behavior when only runtime_deps are provided (no deps).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"runtime_deps_only_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\nruntime_deps_only_test = unittest.make(_test_runtime_deps_only, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_compile_deps_only(ctx):\n    \"\"\"\n    Tests behavior when only deps are provided (no runtime_deps).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"compile_deps_only_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Compile deps should contribute to both compile and runtime JARs\n    compile_jars = [jar.basename for jar in javainfo_filtered.compile_jars.to_list()]\n    transitive_runtime_jars = [jar.basename for jar in javainfo_filtered.transitive_runtime_jars.to_list()]\n    \n    asserts.true(env, len(compile_jars) > 0, \n        \"Expected compile JARs when deps provided, got: {}\".format(len(compile_jars)))\n    asserts.true(env, len(transitive_runtime_jars) > 0, \n        \"Expected transitive runtime JARs when deps provided, got: {}\".format(len(transitive_runtime_jars)))\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\ncompile_deps_only_test = unittest.make(_test_compile_deps_only, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_single_dep_with_exclusions(ctx):\n    \"\"\"\n    Tests behavior with a single dependency and exclusions.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"single_dep_with_exclusions_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nsingle_dep_with_exclusions_test = unittest.make(_test_single_dep_with_exclusions, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_single_runtime_dep_with_exclusions(ctx):\n    \"\"\"\n    Tests behavior with a single runtime dependency and exclusions.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"single_runtime_dep_with_exclusions_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nsingle_runtime_dep_with_exclusions_test = unittest.make(_test_single_runtime_dep_with_exclusions, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"slf4j\",\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_one_compile_one_runtime_dep(ctx):\n    \"\"\"\n    Tests behavior with exactly one compile dep and one runtime dep.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"one_compile_one_runtime_dep_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\none_compile_one_runtime_dep_test = unittest.make(_test_one_compile_one_runtime_dep, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_path_patterns_with_special_characters(ctx):\n    \"\"\"\n    Tests behavior with path patterns containing special characters.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"path_patterns_with_special_characters_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\npath_patterns_with_special_characters_test = unittest.make(_test_path_patterns_with_special_characters, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"io.micrometer\",  # Pattern with dot\n            \"to-slf4j\",  # Pattern with hyphen\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\ndef _test_case_sensitive_pattern_matching(ctx):\n    \"\"\"\n    Tests case sensitivity in path pattern matching.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    test_lib_name = \"case_sensitive_pattern_matching_test_lib\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\ncase_sensitive_pattern_matching_test = unittest.make(_test_case_sensitive_pattern_matching, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"SPRING\",  # Uppercase pattern\n            \"Jackson\", # Mixed case pattern\n            \"HIBERNATE\", # Uppercase pattern\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\n\n\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/main/java/com/depsfilter/A.java",
    "content": "package com.depsfilter;\n\npublic class A {\n    int a;\n    public A() {\n        a = 1;\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterCaseSensitivePatternMatchingTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterCaseSensitivePatternMatchingTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testCaseSensitivePatternMatching() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"SPRING\", \"Jackson\", \"HIBERNATE\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterCaseSensitivePatternMatchingTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libcase_sensitive_pattern_matching_test_lib.jar\");\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterCompileDepsOnlyTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterCompileDepsOnlyTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testCompileDepsOnly() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of(\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\"\n        );\n        Set<String> runtimeDepsLabels = Set.of();\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterCompileDepsOnlyTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libcompile_deps_only_test_lib.jar\");\n        \n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterEmptyExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterEmptyExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testTransitivesExclusion() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForNoFilteringFiltered();\n\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterEmptyExclusionsTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libempty_exclusion_lists_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterExcludeTransitiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterExcludeTransitiveTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testTransitivesExclusion() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForLabelExclusionsFiltered(\n            excludedLabels, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterExcludeTransitiveTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libwith_label_exclusions_with_exclude_transitives_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterLabelExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport java.util.HashSet;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterLabelExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testLabelExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForLabelExclusionsFiltered(\n            excludedLabels, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterLabelExclusionsTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libwith_label_exclusions_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithTransitivesTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterMultipleExclusionsWithTransitivesTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testMultipleExclusionsWithTransitives() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        Set<String> excludedPatterns = Set.of(\"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForMultipleExclusionsFiltered(\n            excludedLabels, excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterMultipleExclusionsWithTransitivesTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libmultiple_exclusions_with_exclude_transitives_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithoutTransitivesTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterMultipleExclusionsWithoutTransitivesTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testMultipleExclusionsWithoutTransitives() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        Set<String> excludedPatterns = Set.of(\"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForMultipleExclusionsFiltered(\n            excludedLabels, excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterMultipleExclusionsWithoutTransitivesTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libmultiple_exclusions_without_exclude_transitives_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterNoFilteringTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterNoFilteringTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testNoFiltering() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForNoFilteringFiltered();\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterNoFilteringTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libno_filtering_test_lib.jar\");\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterOneCompileOneRuntimeDepTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterOneCompileOneRuntimeDepTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testOneCompileOneRuntimeDep() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of(\"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\");\n        Set<String> runtimeDepsLabels = Set.of(\"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\");\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterOneCompileOneRuntimeDepTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libone_compile_one_runtime_dep_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterPathBasedExclusionsComprehensiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathBasedExclusionsComprehensiveTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathBasedExclusionsComprehensive() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"micrometer\", \"slf4j\", \"logback\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterPathBasedExclusionsComprehensiveTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libpath_based_exclusions_comprehensive_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterPathExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"micrometer\", \"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterPathExclusionsTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libwith_path_exclusions_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterPathExclusionsWithTransitivesTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathExclusionsWithTransitivesTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathExclusionsWithTransitives() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"micrometer\", \"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterPathExclusionsWithTransitivesTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libwith_path_exclusions_with_exclude_transitives_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterPathPatternsWithSpecialCharactersTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathPatternsWithSpecialCharactersTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathPatternsWithSpecialCharacters() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"io.micrometer\", \"to-slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterPathPatternsWithSpecialCharactersTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libpath_patterns_with_special_characters_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterRuntimeDepsOnlyTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterRuntimeDepsOnlyTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testRuntimeDepsOnly() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of();\n        Set<String> runtimeDepsLabels = Set.of(\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\"\n        );\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterRuntimeDepsOnlyTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libruntime_deps_only_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterSingleDepWithExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterSingleDepWithExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testSingleDepWithExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> depsLabels = Set.of(\"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\");\n        Set<String> runtimeDepsLabels = Set.of();\n        Set<String> excludedLabels = Set.of(\"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\");\n        Set<String> excludedPatterns = Set.of();\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterSingleDepWithExclusionsTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libsingle_dep_with_exclusions_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterSingleRuntimeDepWithExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterSingleRuntimeDepWithExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testSingleRuntimeDepWithExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of();\n        Set<String> runtimeDepsLabels = Set.of(\"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\");\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of(\"slf4j\");\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/DepsFilterSingleRuntimeDepWithExclusionsTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/external_dependencies/compile_and_runtime/libsingle_runtime_dep_with_exclusions_test_lib.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:dependencyset.bzl\", \"dependencyset\")\nload(\n    \"//springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1:compile_and_runtime_test.bzl\",\n    \"no_filtering_test\",\n    \"filtered_deps_test\",\n    \"filtered_deps_exclude_transitive_test\",\n    \"path_based_exclusions_test\",\n    \"interface_implementation_jars_test\",\n    \"multiple_exclusions_with_transitive_test\",\n    \"multiple_exclusions_without_transitive_test\",\n    \"empty_exclusion_lists_test\",\n    \"multiple_paths_test\",\n)\n\n# Dependency Graph Structure:\n\n#          base_lib      \n#             |\n#        dependencyset\n#    (\"deps\")  (\"runtime_deps\")\n#        /       \\  \n#      A (c)    I (r)\n#      /  \\        |\n#     /   \\     G (r)\n#    /     \\       |\n#   B (c)  E (r)  /\n#   |      |     /\n#   |      |   /\n#   |    F (c)\n#    \\   /\n#    C (c)\n#     | \n#    D (r)   \n\njava_library(\n    name = \"lib_a\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\n        \":lib_b\",  # A -> B (c)\n    ],\n    runtime_deps = [\n        \":lib_e\",  # A -> E (r)\n    ],\n)\n\njava_library(\n    name = \"lib_b\",\n    srcs = [\"src/main/java/com/depsfilter/B.java\"],  \n    deps = [\":lib_c\"], # B -> C (c)\n)\n\njava_library(\n    name = \"lib_c\",\n    srcs = [\"src/main/java/com/depsfilter/C.java\"],\n    runtime_deps = [\":lib_d\"], # C -> D (r)\n)\n\njava_library(\n    name = \"lib_d\",\n    srcs = [\"src/main/java/com/depsfilter/D.java\"], \n)\n\njava_library(\n    name = \"lib_e\",\n    srcs = [\"src/main/java/com/depsfilter/E.java\"],\n    deps = [\":lib_f\"], # E -> F (c)\n)\n\njava_library(\n    name = \"lib_f\",\n    srcs = [\"src/main/java/com/depsfilter/F.java\"],\n    deps = [\":lib_c\"], # F -> C (c)\n)\n\njava_library(\n    name = \"lib_g\",\n    srcs = [\"src/main/java/com/depsfilter/G.java\"],\n    deps = [\":lib_f\"], # G -> F (c)\n)\n\njava_library(\n    name = \"lib_i\",\n    srcs = [\"src/main/java/com/depsfilter/I.java\"],\n    runtime_deps = [\":lib_g\"], # I -> G path\n)\n\n# Consumer library that uses the filtered dependencies\njava_library(\n    name = \"base_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":lib_a\"], # base_lib -> A (c)\n    runtime_deps = [\":lib_i\"], # base_lib -> I (r)\n)\n\n# Test 1: No filtering\ndependencyset(\n    name = \"deps_no_filtering\",\n    items = [\":lib_a\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_no_filtering\",\n    items = [\":lib_i\"],\n)\n\njava_library(\n    name = \"no_filtering_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_no_filtering\"],\n    runtime_deps = [\":runtime_deps_no_filtering\"],\n)\n\nno_filtering_test(\n    name = \"deps_filter_no_filtering_test\",\n    java_library = \":base_lib\",  \n    java_library_dependencyset = \":no_filtering_test_lib\",\n)\n\n# Test 2: Exclude by labels and exclude_transitives = False\ndependencyset(\n    name = \"deps_exclude_b_g\",\n    items = [\":lib_a\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_exclude_b_g\",\n    items = [\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"exclude_b_g_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_exclude_b_g\"],\n    runtime_deps = [\":runtime_deps_exclude_b_g\"],\n)\n\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    test_lib = \":exclude_b_g_test_lib\",\n)\n\n# Test 3: Exclude by labels and exclude_transitives = True\ndependencyset(\n    name = \"deps_exclude_b_g_transitives\",\n    items = [\":lib_a\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n    exclude_transitives = True,\n)\n\ndependencyset(\n    name = \"runtime_deps_exclude_b_g_transitives\",\n    items = [\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"exclude_b_g_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_exclude_b_g_transitives\"],\n    runtime_deps = [\":runtime_deps_exclude_b_g_transitives\"],\n)\n\nfiltered_deps_exclude_transitive_test(\n    name = \"deps_filter_exclude_b_g_exclude_transitive_test\",\n    test_lib = \":exclude_b_g_transitives_test_lib\",\n)\n\n# Test 4: Test for path-based exclusions\ndependencyset(\n    name = \"deps_exclude_paths\",\n    items = [\":lib_a\"],\n    deps_exclude_paths = [\"lib_b\", \"lib_f\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_exclude_paths\",\n    items = [\":lib_i\"],\n    deps_exclude_paths = [\"lib_b\", \"lib_f\"],\n)\n\njava_library(\n    name = \"path_based_exclusions_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_exclude_paths\"],\n    runtime_deps = [\":runtime_deps_exclude_paths\"],\n)\n\npath_based_exclusions_test(\n    name = \"deps_filter_path_based_exclusions_test\",\n    test_lib = \":path_based_exclusions_test_lib\",\n)\n\n# Test 5: Interface vs Implementation JARs\ndependencyset(\n    name = \"deps_interface_impl_exclude_b_g\",\n    items = [\":lib_a\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_interface_impl_exclude_b_g\",\n    items = [\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"interface_impl_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_interface_impl_exclude_b_g\"],\n    runtime_deps = [\":runtime_deps_interface_impl_exclude_b_g\"],\n)\n\ninterface_implementation_jars_test(\n    name = \"deps_filter_interface_impl_test\",\n    test_lib = \":interface_impl_test_lib\",\n)\n\n# Test 6: Multiple exclusions with exclude_transitives=True\ndependencyset(\n    name = \"deps_multi_excl_transitives\",\n    items = [\":lib_a\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = True,\n)\n\ndependencyset(\n    name = \"runtime_deps_multi_excl_transitives\",\n    items = [\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"multiple_exclusions_with_transitive_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_multi_excl_transitives\"],\n    runtime_deps = [\":runtime_deps_multi_excl_transitives\"],\n)\n\nmultiple_exclusions_with_transitive_test(\n    name = \"multiple_exclusions_with_transitive_test\",\n    test_lib = \":multiple_exclusions_with_transitive_test_lib\",\n)\n\n# Test 7: Multiple exclusions with exclude_transitives=False\ndependencyset(\n    name = \"deps_multi_excl_no_transitives\",\n    items = [\":lib_a\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = False,\n)\n\ndependencyset(\n    name = \"runtime_deps_multi_excl_no_transitives\",\n    items = [\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"multiple_exclusions_without_transitive_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_multi_excl_no_transitives\"],\n    runtime_deps = [\":runtime_deps_multi_excl_no_transitives\"],\n)\n\nmultiple_exclusions_without_transitive_test(\n    name = \"multiple_exclusions_without_transitive_test\",\n    test_lib = \":multiple_exclusions_without_transitive_test_lib\",\n)\n\n# Test 8: Empty exclusion lists\ndependencyset(\n    name = \"deps_empty_exclusions\",\n    items = [\":lib_a\"],\n    deps_exclude_paths = [],\n    deps_exclude_labels = [],\n)\n\ndependencyset(\n    name = \"runtime_deps_empty_exclusions\",\n    items = [\":lib_i\"],\n    deps_exclude_paths = [],\n    deps_exclude_labels = [],\n)\n\njava_library(\n    name = \"empty_exclusion_lists_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_empty_exclusions\"],\n    runtime_deps = [\":runtime_deps_empty_exclusions\"],\n)\n\nempty_exclusion_lists_test(\n    name = \"deps_filter_empty_exclusions_test\",\n    test_lib = \":empty_exclusion_lists_test_lib\",\n)\n\n# Test 9: Multiple paths handling\ndependencyset(\n    name = \"deps_multiple_paths_exclude_b_g\",\n    items = [\":lib_a\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_multiple_paths_exclude_b_g\",\n    items = [\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"multiple_paths_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_multiple_paths_exclude_b_g\"],\n    runtime_deps = [\":runtime_deps_multiple_paths_exclude_b_g\"],\n)\n\nmultiple_paths_test(\n    name = \"deps_filter_multiple_paths_test\",\n    test_lib = \":multiple_paths_test_lib\",\n)\n\ntoolchain(\n    name = \"unittest_toolchain\",\n    toolchain_type = \"@bazel_skylib//toolchains/unittest:toolchain_type\",\n    toolchain = \"@bazel_skylib//toolchains/unittest:toolchain\",\n)\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/compile_and_runtime_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\",\n        \"update_jar_name\"\n)\n\n\ndef _test_no_filtering(ctx):\n    \"\"\"\n    Tests that deps_filter preserves all dependencies when no exclusions are applied.\n    \n    Dependency Graph: \n         test_lib       \n             |\n        dependencyset\n    (\"deps\")  (\"runtime_deps\")\n        /       \\\\  \n      A (c)    I (r)\n      /  \\\\       |\n     /    \\\\   G (r)\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)\n    \n    Expected: All JARs from java_library must match deps_filter:\n        - full_compile_jars: Implementation JARs (e.g., liblib_a.jar)\n        - compile_jars: Interface JARs (e.g., liblib_a-hjar.jar)\n        - transitive_compile_time_jars: Interface JARs from transitive deps\n        - transitive_runtime_jars: Implementation JARs from transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    java_lib_info = ctx.attr.java_library[JavaInfo]\n    deps_filter_info = ctx.attr.java_library_dependencyset[JavaInfo]\n    \n    # Verify all JAR fields match between java_library and deps_filter\n    jar_fields = [\n        \"full_compile_jars\",              # Implementation JARs\n        \"compile_jars\",                   # Interface JARs\n        \"transitive_compile_time_jars\",   # Transitive interface JARs\n        \"transitive_runtime_jars\"         # Transitive implementation JARs\n    ]\n\n    for jar_field in jar_fields:\n        java_lib_jars = getattr(java_lib_info, jar_field)\n        deps_filter_jars = getattr(deps_filter_info, jar_field)\n        asserts.equals(env, type(java_lib_jars), type(deps_filter_jars), \n            \"JAR type mismatch: {} vs deps_filter\".format(jar_field))\n        java_lib_jars_list = [jar.basename for jar in java_lib_jars.to_list()]\n        deps_filter_jars_list = [jar.basename for jar in deps_filter_jars.to_list()]\n        # Normalize output jar naming difference between dependencyset consumer and base_lib\n        update_jar_name(\"libno_filtering_test_lib\", \"libbase_lib\", deps_filter_jars_list)\n        asserts.equals(env, java_lib_jars_list, deps_filter_jars_list,\n            \"JAR contents mismatch: {} vs deps_filter\".format(jar_field))\n\n    return unittest.end(env)\n\nno_filtering_test = unittest.make(_test_no_filtering, attrs = {\n    \"java_library\": attr.label(providers = [JavaInfo]),\n    \"java_library_dependencyset\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps(ctx):\n    \"\"\"\n    Tests basic dependency filtering with label-based exclusions.\n    \n    Dependency Graph:\n         test_lib       \n             |\n        dependencyset\n    (\"deps\")  (\"runtime_deps\")\n        /       \\\\  \n      A (c)    I (r)\n      /  \\\\       |\n     /    \\\\   G (r)\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)\n\n    Deps Dependencyset Input:\n        items = [\":lib_a\"]\n\n    Runtime Dependencyset Input:\n        items = [\":lib_i\"]\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: test_lib, A, I, E, F, C, D\n        JARs excluded: B, G (by label, direct deps only, transitives preserved)\n        \n        Compile-time JARs: test_lib-hjar, A-hjar, C-hjar\n        Runtime JARs: test_lib, A, I, E, F, C, D (all preserved deps + transitives)\n        Reasoning: B,G excluded by label, but their transitives (C,D,F) are preserved\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n\n    expected_compile_jars = [\n        \"libexclude_b_g_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libexclude_b_g_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libexclude_b_g_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libexclude_b_g_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_test = unittest.make(_test_filtered_deps, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps_exclude_transitive(ctx):\n    \"\"\"\n    Tests dependency filtering with transitive exclusions.\n    \n    Dependency Graph:\n         test_lib       \n             |\n        dependencyset\n    (\"deps\")  (\"runtime_deps\")\n        /       \\\\  \n      A (c)    I (r)\n      /  \\\\       |\n     /    \\\\   G (r)\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)\n\n    Deps Dependencyset Input:\n        items = [\":lib_a\"]\n\n    Runtime Dependencyset Input:\n        items = [\":lib_i\"]\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved: test_lib, A, I, E\n        JARs excluded: B, G (by label) and all their transitives\n        \n        Compile-time JARs: test_lib-hjar, A-hjar\n        Runtime JARs: test_lib, A, I, E (only preserved deps, no transitives of excluded deps)\n        Reasoning: B,G excluded by label with exclude_transitives=True, so C,D,F also excluded\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libexclude_b_g_transitives_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libexclude_b_g_transitives_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libexclude_b_g_transitives_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libexclude_b_g_transitives_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_exclude_transitive_test = unittest.make(_test_filtered_deps_exclude_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_path_based_exclusions(ctx):\n    \"\"\"\n    Tests filtering based on path patterns in deps_exclude_paths.\n    \n    Dependency Graph:\n         test_lib       \n             |\n        dependencyset\n    (\"deps\")  (\"runtime_deps\")\n        /       \\\\  \n      A (c)    I (r)\n      /  \\\\       |\n     /    \\\\   G (r)\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)\n\n    Deps Dependencyset Input:\n        items = [\":lib_a\"]\n\n    Runtime Dependencyset Input:\n        items = [\":lib_i\"]\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = []\n        deps_exclude_paths = [\"lib_b\", \"lib_f\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: test_lib, A, I, E, C, D, G\n        JARs excluded: B, F (by path pattern match, transitives may be preserved)\n        \n        Compile-time JARs: test_lib-hjar, A-hjar, C-hjar\n        Runtime JARs: test_lib, A, I, E, C, D, G (all preserved deps + transitives not matching exclusion path patterns)\n        Reasoning: B,F excluded by path pattern, but their transitives are preserved as they didn't match the pattern. \n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libpath_based_exclusions_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libpath_based_exclusions_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libpath_based_exclusions_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libpath_based_exclusions_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\npath_based_exclusions_test = unittest.make(_test_path_based_exclusions, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_interface_implementation_jars(ctx):\n    \"\"\"\n    Tests proper handling of interface (-hjar) and implementation JARs.\n    \n    Dependency Graph:\n         test_lib       \n             |\n        dependencyset\n    (\"deps\")  (\"runtime_deps\")\n        /       \\\\  \n      A (c)    I (r)\n      /  \\\\       |\n     /    \\\\   G (r)\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)\n\n    Deps Dependencyset Input:\n        items = [\":lib_a\"]\n\n    Runtime Dependencyset Input:\n        items = [\":lib_i\"]\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        compile_jars: libinterface_impl_test_lib-hjar.jar\n        full_compile_jars: libinterface_impl_test_lib.jar\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    compile_jars = sorted([jar.basename for jar in javainfo_filtered.compile_jars.to_list()])\n    full_compile_jars = sorted([jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()])\n    \n    expected_compile_jars = [\"libinterface_impl_test_lib-hjar.jar\"]\n    expected_full_compile_jars = [\"libinterface_impl_test_lib.jar\"]\n    \n    asserts.equals(env, compile_jars, expected_compile_jars)\n    asserts.equals(env, full_compile_jars, expected_full_compile_jars)\n    return unittest.end(env)\n\ninterface_implementation_jars_test = unittest.make(_test_interface_implementation_jars, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_exclusions_with_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=True.\n    \n    Dependency Graph:\n         test_lib       \n             |\n        dependencyset\n    (\"deps\")  (\"runtime_deps\")\n        /       \\\\  \n      A (c)    I (r)\n      /  \\\\       |\n     /    \\\\   G (r)\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)\n\n    Deps Dependencyset Input:\n        items = [\":lib_a\"]\n\n    Runtime Dependencyset Input:\n        items = [\":lib_i\"]\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved: test_lib, A, I, E, F\n        JARs excluded: B and its transitives; G (not neccessarily its transitives as specified exclusion by path pattern is matched)\n        \n        Compile-time JARs: test_lib-hjar, A-hjar\n        Runtime JARs: test_lib, A, I, E, F\n        Reasoning: B excluded by label with exclude_transitives=True (C,D excluded); \n                   G excluded by exclusion path pattern (exclusion by path pattern doesn't exclude transitives) \n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libmultiple_exclusions_with_transitive_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libmultiple_exclusions_with_transitive_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libmultiple_exclusions_with_transitive_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libmultiple_exclusions_with_transitive_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\ndef _test_multiple_exclusions_without_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=False.\n    \n    Dependency Graph:\n         test_lib       \n             |\n        dependencyset\n    (\"deps\")  (\"runtime_deps\")\n        /       \\\\  \n      A (c)    I (r)\n      /  \\\\       |\n     /    \\\\   G (r)\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)\n\n    Deps Dependencyset Input:\n        items = [\":lib_a\"]\n\n    Runtime Dependencyset Input:\n        items = [\":lib_i\"]\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: test_lib, A, I, E, F, C, D\n        JARs excluded: B (by label, direct only); G (by path pattern match, direct only)\n        \n        Compile-time JARs: test_lib-hjar, A-hjar, C-hjar\n        Runtime JARs: test_lib, A, I, E, F, C, D\n        Reasoning: B excluded by label (direct only, and its transitives are preserved); \n                   G excluded by exclusion path pattern (exclusion by path pattern doesn't exclude transitives) \n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libmultiple_exclusions_without_transitive_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libmultiple_exclusions_without_transitive_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libmultiple_exclusions_without_transitive_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libmultiple_exclusions_without_transitive_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_exclusions_with_transitive_test = unittest.make(_test_multiple_exclusions_with_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\nmultiple_exclusions_without_transitive_test = unittest.make(_test_multiple_exclusions_without_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \n    Dependency Graph:\n         test_lib       \n             |\n        dependencyset\n    (\"deps\")  (\"runtime_deps\")\n        /       \\\\  \n      A (c)    I (r)\n      /  \\\\       |\n     /    \\\\   G (r)\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)\n\n    Deps Dependencyset Input:\n        items = [\":lib_a\"]\n\n    Runtime Dependencyset Input:\n        items = [\":lib_i\"]\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = []\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: test_lib, A, I, B, C, D, E, F, G\n        \n        Compile-time JARs: test_lib-hjar, A-hjar, B-hjar, C-hjar\n        Runtime JARs: test_lib, A, I, B, C, D, E, F, G\n        Reasoning: No exclusions applied, all dependencies preserved\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libempty_exclusion_lists_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libempty_exclusion_lists_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libempty_exclusion_lists_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_b.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libempty_exclusion_lists_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_b-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_paths(ctx):\n    \"\"\"\n    Tests handling of multiple paths to the same dependency.\n    \n    Dependency Graph:\n         test_lib       \n             |\n        dependencyset\n    (\"deps\")  (\"runtime_deps\")\n        /       \\\\  \n      A (c)    I (r)\n      /  \\\\       |\n     /    \\\\   G (r)\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)\n\n    Deps Dependencyset Input:\n        items = [\":lib_a\"]\n\n    Runtime Dependencyset Input:\n        items = [\":lib_i\"]\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: test_lib, A, I, E, F, C, D\n        JARs excluded: B, G (not duplicated if reachable via multiple paths)\n        \n        Compile-time JARs: test_lib-hjar, A-hjar, C-hjar\n        Runtime JARs: test_lib, A, I, E, F, C, D\n        Reasoning: B,G excluded by label, but transitives are preserved as exclude_transitives = False\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libmultiple_paths_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libmultiple_paths_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libmultiple_paths_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libmultiple_paths_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_paths_test = unittest.make(_test_multiple_paths, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/A.java",
    "content": "package com.depsfilter;\n\npublic class A {\n    int a;\n    private B b;\n    // E is a runtime dependency, so no compile-time reference here\n    public A() {\n        a = 1;\n        b = new B();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/B.java",
    "content": "package com.depsfilter;\n\npublic class B {\n    private C c;\n    public B() {\n        c = new C();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/C.java",
    "content": "package com.depsfilter;\n\npublic class C {\n    // D is a runtime dependency, so no compile-time reference here\n    public C() {\n        // No compile-time dependencies\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/D.java",
    "content": "package com.depsfilter;\n\npublic class D {\n    private int value;\n    public D() {\n        value = 4;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/E.java",
    "content": "package com.depsfilter;\n\npublic class E {\n    private F f;\n    public E() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/F.java",
    "content": "package com.depsfilter;\n\npublic class F {\n    private C c;\n    public F() {\n        c = new C();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/G.java",
    "content": "package com.depsfilter;\n\npublic class G {\n    private F f;\n    public G() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/H.java",
    "content": "package com.depsfilter;\n\npublic class H {\n    private A a;\n    // G is a runtime dependency, so no compile-time reference here\n    public H() {\n        a = new A();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/I.java",
    "content": "package com.depsfilter;\n\npublic class I {\n    public I() {\n        int i = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:dependencyset.bzl\", \"dependencyset\")\nload(\n    \"//springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2:compile_and_runtime_test.bzl\",\n    \"no_filtering_test\",\n    \"filtered_deps_test\",\n    \"filtered_deps_exclude_transitive_test\",\n    \"path_based_exclusions_test\",\n    \"interface_implementation_jars_test\",\n    \"multiple_exclusions_with_transitive_test\",\n    \"multiple_exclusions_without_transitive_test\",\n    \"empty_exclusion_lists_test\",\n    \"multiple_paths_test\",\n)\n\n# Dependency Graph Structure:\n#            test_lib       \n#               |\n#         dependencyset\n#         /          \\\n#    (\"deps\")     (\"runtime_deps\")\n#    /      \\         /      \\\n#  J(r)    A (c)     H (r)   I (c)  \n#    \\     /  \\        |      |   \n#     \\   /   \\      G (r)    |     \n#      \\ /     \\       |      /\n#       B (c)  E (r)  /     /\n#       |      |     /    /\n#       |      |    /   /\n#       |      |   /  /\n#       |      |  / /\n#       |     F (c)\n#        \\   /\n#        C (c)\n#         | \n#        D (r)   \n\njava_library(\n    name = \"lib_a\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\n        \":lib_b\",  # A -> B (c)\n    ],\n    runtime_deps = [\n        \":lib_e\",  # A -> E (r)\n    ],\n)\n\njava_library(\n    name = \"lib_b\",\n    srcs = [\"src/main/java/com/depsfilter/B.java\"],  \n    deps = [\":lib_c\"], # B -> C (c)\n)\n\njava_library(\n    name = \"lib_c\",\n    srcs = [\"src/main/java/com/depsfilter/C.java\"],\n    runtime_deps = [\":lib_d\"], # C -> D (r)\n)\n\njava_library(\n    name = \"lib_d\",\n    srcs = [\"src/main/java/com/depsfilter/D.java\"], \n)\n\njava_library(\n    name = \"lib_e\",\n    srcs = [\"src/main/java/com/depsfilter/E.java\"],\n    deps = [\":lib_f\"], # E -> F (c)\n)\n\njava_library(\n    name = \"lib_f\",\n    srcs = [\"src/main/java/com/depsfilter/F.java\"],\n    deps = [\":lib_c\"], # F -> C (c)\n)\n\njava_library(\n    name = \"lib_g\",\n    srcs = [\"src/main/java/com/depsfilter/G.java\"],\n    deps = [\":lib_f\"], # G -> F (c)\n)\n\njava_library(\n    name = \"lib_h\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":lib_g\"], # H -> G (r)\n)\n\njava_library(\n    name = \"lib_i\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":lib_f\"], # I -> F (c)\n)\n\njava_library(\n    name = \"lib_j\",\n    srcs = [\"src/main/java/com/depsfilter/J.java\"],\n    deps = [\":lib_b\"], # J -> B (c)\n)\n\ntest_deps = [\"@unmanaged_deps_filter//:junit_junit\",\n    \"@unmanaged_deps_filter//:org_assertj_assertj_core\",\n]\n\n# Test 1: No filtering\ndependencyset(\n    name = \"deps_no_filtering\",\n    items = [\":lib_a\", \":lib_i\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_no_filtering\",\n    items = [\":lib_h\", \":lib_j\"],\n)\n\njava_library(\n    name = \"base_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":lib_a\", \":lib_i\"],\n    runtime_deps = [\":lib_h\", \":lib_j\"],\n)\n\njava_library(\n    name = \"no_filtering_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_no_filtering\"],\n    runtime_deps = [\":runtime_deps_no_filtering\"],\n)\n\nno_filtering_test(\n    name = \"deps_filter_no_filtering_test\",\n    java_library = \":base_lib\",\n    java_library_dependencyset = \":no_filtering_test_lib\",\n)\n\n# Test 2: Exclude by labels and exclude_transitives = False\ndependencyset(\n    name = \"deps_exclude_b_g\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_exclude_b_g\",\n    items = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"exclude_b_g_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_exclude_b_g\"],\n    runtime_deps = [\":runtime_deps_exclude_b_g\"],\n)\n\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    test_lib = \":exclude_b_g_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterFilteredDepsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterFilteredDepsTest.java\"\n    ],\n    deps = [\":exclude_b_g_test_lib\"] + test_deps,\n)\n\n# Test 3: Exclude by labels and exclude_transitives = True\ndependencyset(\n    name = \"deps_exclude_b_g_transitives\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n    exclude_transitives = True,\n)\n\ndependencyset(\n    name = \"runtime_deps_exclude_b_g_transitives\",\n    items = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"exclude_b_g_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_exclude_b_g_transitives\"],\n    runtime_deps = [\":runtime_deps_exclude_b_g_transitives\"],\n)\n\nfiltered_deps_exclude_transitive_test(\n    name = \"deps_filter_exclude_b_g_exclude_transitive_test\",\n    test_lib = \":exclude_b_g_transitives_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterExcludeTransitiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterExcludeTransitiveTest.java\"\n    ],\n    deps = [\":exclude_b_g_transitives_test_lib\"] + test_deps,\n)\n\n# Test 4: Test for path-based exclusions\ndependencyset(\n    name = \"deps_exclude_paths\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_paths = [\"lib_b\", \"lib_f\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_exclude_paths\",\n    items = [\":lib_h\", \":lib_j\"],\n    deps_exclude_paths = [\"lib_b\", \"lib_f\"],\n)\n\njava_library(\n    name = \"path_based_exclusions_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_exclude_paths\"],\n    runtime_deps = [\":runtime_deps_exclude_paths\"],\n)\n\npath_based_exclusions_test(\n    name = \"deps_filter_path_based_exclusions_test\",\n    test_lib = \":path_based_exclusions_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterPathBasedExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterPathBasedExclusionsTest.java\"\n    ],\n    deps = [\":path_based_exclusions_test_lib\"] + test_deps,\n)\n\n# Test 5: Interface vs Implementation JARs\ndependencyset(\n    name = \"deps_interface_impl_exclude_b_g\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_interface_impl_exclude_b_g\",\n    items = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"interface_impl_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_interface_impl_exclude_b_g\"],\n    runtime_deps = [\":runtime_deps_interface_impl_exclude_b_g\"],\n)\n\ninterface_implementation_jars_test(\n    name = \"deps_filter_interface_impl_test\",\n    test_lib = \":interface_impl_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterInterfaceImplementationTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterInterfaceImplementationTest.java\"\n    ],\n    deps = [\":interface_impl_test_lib\"] + test_deps,\n)\n\n# Test 6: Multiple exclusions with exclude_transitives=True\ndependencyset(\n    name = \"deps_multi_excl_transitives\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = True,\n)\n\ndependencyset(\n    name = \"runtime_deps_multi_excl_transitives\",\n    items = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"multiple_exclusions_with_transitive_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_multi_excl_transitives\"],\n    runtime_deps = [\":runtime_deps_multi_excl_transitives\"],\n)\n\nmultiple_exclusions_with_transitive_test(\n    name = \"multiple_exclusions_with_transitive_test\",\n    test_lib = \":multiple_exclusions_with_transitive_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterMultipleExclusionsWithTransitiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithTransitiveTest.java\"\n    ],\n    deps = [\":multiple_exclusions_with_transitive_test_lib\"] + test_deps,\n)\n\n# Test 7: Multiple exclusions with exclude_transitives=False\ndependencyset(\n    name = \"deps_multi_excl_no_transitives\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = False,\n)\n\ndependencyset(\n    name = \"runtime_deps_multi_excl_no_transitives\",\n    items = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"multiple_exclusions_without_transitive_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_multi_excl_no_transitives\"],\n    runtime_deps = [\":runtime_deps_multi_excl_no_transitives\"],\n)\n\nmultiple_exclusions_without_transitive_test(\n    name = \"multiple_exclusions_without_transitive_test\",\n    test_lib = \":multiple_exclusions_without_transitive_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterMultipleExclusionsWithoutTransitiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithoutTransitiveTest.java\"\n    ],\n    deps = [\":multiple_exclusions_without_transitive_test_lib\"] + test_deps,\n)\n\n# Test 8: Empty exclusion lists\ndependencyset(\n    name = \"deps_empty_exclusions\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_paths = [],\n    deps_exclude_labels = [],\n)\n\ndependencyset(\n    name = \"runtime_deps_empty_exclusions\",\n    items = [\":lib_h\", \":lib_j\"],\n    deps_exclude_paths = [],\n    deps_exclude_labels = [],\n)\n\njava_library(\n    name = \"empty_exclusion_lists_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_empty_exclusions\"],\n    runtime_deps = [\":runtime_deps_empty_exclusions\"],\n)\n\nempty_exclusion_lists_test(\n    name = \"deps_filter_empty_exclusions_test\",\n    test_lib = \":empty_exclusion_lists_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterEmptyExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterEmptyExclusionsTest.java\"\n        ],\n    deps = [\":empty_exclusion_lists_test_lib\"] + test_deps,\n)\n\n# Test 9: Multiple paths handling\ndependencyset(\n    name = \"deps_multiple_paths_exclude_b_g\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_multiple_paths_exclude_b_g\",\n    items = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"multiple_paths_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_multiple_paths_exclude_b_g\"],\n    runtime_deps = [\":runtime_deps_multiple_paths_exclude_b_g\"],\n)\n\nmultiple_paths_test(\n    name = \"deps_filter_multiple_paths_test\",\n    test_lib = \":multiple_paths_test_lib\",\n)\n\njava_test(\n    name = \"DepsFilterMultiplePathsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterMultiplePathsTest.java\"\n    ],\n    deps = [\":multiple_paths_test_lib\"] + test_deps,\n)\n\ntoolchain(\n    name = \"unittest_toolchain\",\n    toolchain_type = \"@bazel_skylib//toolchains/unittest:toolchain_type\",\n    toolchain = \"@bazel_skylib//toolchains/unittest:toolchain\",\n)\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/compile_and_runtime_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\",\n        \"update_jar_name\",\n)\n\n\ndef _test_no_filtering(ctx):\n    \"\"\"\n    Tests that deps_filter preserves all dependencies when no exclusions are applied.\n    \n    Dependency Graph: \n                test_lib       \n                    |\n              dependencyset\n              /          \\\\\n         (\"deps\")     (\"runtime_deps\")\n         /      \\\\         /      \\\\\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n    \n    Expected: All JARs from java_library must match deps_filter:\n        - full_compile_jars: Implementation JARs (e.g., liblib_a.jar)\n        - compile_jars: Interface JARs (e.g., liblib_a-hjar.jar)\n        - transitive_compile_time_jars: Interface JARs from transitive deps\n        - transitive_runtime_jars: Implementation JARs from transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    java_lib_info = ctx.attr.java_library[JavaInfo]\n    deps_filter_info = ctx.attr.java_library_dependencyset[JavaInfo]\n    \n    # Verify all JAR fields match between java_library and deps_filter\n    jar_fields = [\n        \"full_compile_jars\",              # Implementation JARs\n        \"compile_jars\",                   # Interface JARs\n        \"transitive_compile_time_jars\",   # Transitive interface JARs\n        \"transitive_runtime_jars\"         # Transitive implementation JARs\n    ]\n\n    for jar_field in jar_fields:\n        java_lib_jars = getattr(java_lib_info, jar_field)\n        deps_filter_jars = getattr(deps_filter_info, jar_field)\n        asserts.equals(env, type(java_lib_jars), type(deps_filter_jars), \n            \"JAR type mismatch: {} vs deps_filter\".format(jar_field))\n        java_lib_jars_list = [jar.basename for jar in java_lib_jars.to_list()]\n        deps_filter_jars_list = [jar.basename for jar in deps_filter_jars.to_list()]\n        # Normalize output jar naming difference between dependencyset consumer and base_lib\n        update_jar_name(\"libno_filtering_test_lib\", \"libbase_lib\", deps_filter_jars_list)\n        asserts.equals(env, java_lib_jars_list, deps_filter_jars_list,\n            \"JAR contents mismatch: {} vs deps_filter\".format(jar_field))\n\n    return unittest.end(env)\n\nno_filtering_test = unittest.make(_test_no_filtering, attrs = {\n    \"java_library\": attr.label(providers = [JavaInfo]),\n    \"java_library_dependencyset\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps(ctx):\n    \"\"\"\n    Tests basic dependency filtering with label-based exclusions.\n    \n    Dependency Graph: \n                test_lib       \n                    |\n              dependencyset\n              /          \\\\\n        (\"deps\")     (\"runtime_deps\")\n         /      \\\\         /      \\\\\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Deps Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"],\n\n    Runtime Dependencyset Input:\n        items = [\":lib_h\", \":lib_j\"],\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: A, I, C, D, E, F, H, J\n        JARs excluded: B, G (by label, direct deps only, transitives preserved)\n        \n        Compile-time JARs: A-hjar, I-hjar, C-hjar, F-hjar\n        Runtime JARs: A, I, C, D, E, F, H, J\n        Reasoning: B,G excluded by label, but their transitives (C,D,F) are preserved\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n\n    expected_compile_jars = [\n        \"libexclude_b_g_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libexclude_b_g_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libexclude_b_g_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libexclude_b_g_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_test = unittest.make(_test_filtered_deps, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps_exclude_transitive(ctx):\n    \"\"\"\n    Tests dependency filtering with transitive exclusions.\n    \n    Dependency Graph: \n                test_lib       \n                    |\n              dependencyset\n              /          \\\\\n        (\"deps\")     (\"runtime_deps\")\n         /      \\\\         /      \\\\\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r)  \n\n    Deps Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"],\n\n    Runtime Dependencyset Input:\n        items = [\":lib_h\", \":lib_j\"],\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved: A, I, E, H, J\n        JARs excluded: B, G (by label) and all their transitives\n        \n        Compile-time JARs: A-hjar, I-hjar\n        Runtime JARs: A, I, E, H, J (only preserved deps, no transitives of excluded deps)\n        Reasoning: B,G excluded by label with exclude_transitives=True, so C,D,F also excluded\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libexclude_b_g_transitives_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libexclude_b_g_transitives_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libexclude_b_g_transitives_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libexclude_b_g_transitives_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n\n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_exclude_transitive_test = unittest.make(_test_filtered_deps_exclude_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_path_based_exclusions(ctx):\n    \"\"\"\n    Tests filtering based on path patterns in deps_exclude_paths.\n    \n    Dependency Graph: \n                test_lib       \n                    |\n              dependencyset\n              /          \\\\\n        (\"deps\")     (\"runtime_deps\")\n         /      \\\\         /      \\\\\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Deps Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"],\n\n    Runtime Dependencyset Input:\n        items = [\":lib_h\", \":lib_j\"],\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = []\n        deps_exclude_paths = [\"lib_b\", \"lib_f\"]\n        exclude_transitives = False\n    ## IMPORTANT_FEATURE\n    Expected Output:\n        JARs preserved: A, I, C, D, E, G, H, J\n        JARs excluded: B, F (by path pattern match, transitives may be preserved)\n        \n        Compile-time JARs: A-hjar, I-hjar, C-hjar\n        Runtime JARs: A, I, C, D, E, G, H, J (all preserved deps + transitives not matching exclusion path patterns)\n        Reasoning: B,F excluded by path pattern, but their transitives are preserved as they didn't match the pattern\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libpath_based_exclusions_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libpath_based_exclusions_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libpath_based_exclusions_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_g.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libpath_based_exclusions_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\npath_based_exclusions_test = unittest.make(_test_path_based_exclusions, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_interface_implementation_jars(ctx):\n    \"\"\"\n    Tests proper handling of interface (-hjar) and implementation JARs.\n    \n    Dependency Graph: \n                test_lib       \n                    |\n              dependencyset\n              /          \\\\\n        (\"deps\")     (\"runtime_deps\")\n         /      \\\\         /      \\\\\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Deps Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"],\n\n    Runtime Dependencyset Input:\n        items = [\":lib_h\", \":lib_j\"],\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        compile_jars: liblib_a-hjar.jar, liblib_i-hjar.jar\n        full_compile_jars: liblib_a.jar, liblib_i.jar\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    compile_jars = sorted([jar.basename for jar in javainfo_filtered.compile_jars.to_list()])\n    full_compile_jars = sorted([jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()])\n    \n    expected_compile_jars = [\n        \"libinterface_impl_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libinterface_impl_test_lib.jar\",\n    ]\n    \n    asserts.equals(env, compile_jars, expected_compile_jars)\n    asserts.equals(env, full_compile_jars, expected_full_compile_jars)\n    return unittest.end(env)\n\ninterface_implementation_jars_test = unittest.make(_test_interface_implementation_jars, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_exclusions_with_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=True.\n    \n    Dependency Graph: \n                test_lib       \n                    |\n              dependencyset\n              /          \\\\\n        (\"deps\")     (\"runtime_deps\")\n         /      \\\\         /      \\\\\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Deps Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"],\n\n    Runtime Dependencyset Input:\n        items = [\":lib_h\", \":lib_j\"],\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved: A, I, E, F, H, J\n        JARs excluded: B and its transitives; G (not neccessarily its transitives as specified exclusion by path pattern is matched)\n        \n        Compile-time JARs: A-hjar, I-hjar, F-hjar\n        Runtime JARs: A, I, E, F, H, J\n        Reasoning: B excluded by label with exclude_transitives=True (C,D excluded); \n                   G excluded by exclusion path pattern (exclusion by path pattern doesn't exclude transitives)\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libmultiple_exclusions_with_transitive_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libmultiple_exclusions_with_transitive_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libmultiple_exclusions_with_transitive_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libmultiple_exclusions_with_transitive_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\ndef _test_multiple_exclusions_without_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=False.\n    \n    Dependency Graph: \n                test_lib       \n                    |\n              dependencyset\n              /          \\\\\n        (\"deps\")     (\"runtime_deps\")\n         /      \\\\         /      \\\\\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Deps Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"],\n\n    Runtime Dependencyset Input:\n        items = [\":lib_h\", \":lib_j\"],\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: A, I, C, D, E, F, H, J\n        JARs excluded: B (by label, direct only); G (by path pattern match, direct only)\n        \n        Compile-time JARs: A-hjar, I-hjar, C-hjar, F-hjar\n        Runtime JARs: A, I, C, D, E, F, H, J\n        Reasoning: B excluded by label (direct only, and its transitives are preserved); \n                   G excluded by exclusion path pattern (exclusion by path pattern doesn't exclude transitives)\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libmultiple_exclusions_without_transitive_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libmultiple_exclusions_without_transitive_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libmultiple_exclusions_without_transitive_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libmultiple_exclusions_without_transitive_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_exclusions_with_transitive_test = unittest.make(_test_multiple_exclusions_with_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\nmultiple_exclusions_without_transitive_test = unittest.make(_test_multiple_exclusions_without_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \n    Dependency Graph: \n                test_lib       \n                    |\n              dependencyset\n              /          \\\\\n        (\"deps\")     (\"runtime_deps\")\n         /      \\\\         /      \\\\\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Deps Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"],\n\n    Runtime Dependencyset Input:\n        items = [\":lib_h\", \":lib_j\"],\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = []\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: A, I, B, C, D, E, F, G, H, J\n        \n        Compile-time JARs: A-hjar, I-hjar, B-hjar, C-hjar, F-hjar\n        Runtime JARs: A, I, B, C, D, E, F, G, H, J\n        Reasoning: No exclusions applied, all dependencies preserved\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libempty_exclusion_lists_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libempty_exclusion_lists_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libempty_exclusion_lists_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_b.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_g.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libempty_exclusion_lists_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_b-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_paths(ctx):\n    \"\"\"\n    Tests handling of multiple paths to the same dependency.\n    \n    Dependency Graph: \n                test_lib       \n                    |\n              dependencyset\n              /          \\\\\n        (\"deps\")     (\"runtime_deps\")\n         /      \\\\         /      \\\\\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n    # IMPORTANT_FEATURE\n    Deps Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"],\n\n    Runtime Dependencyset Input:\n        items = [\":lib_h\", \":lib_j\"],\n\n    Dependencyset exclusions Input:\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: A, I, C, D, E, F, H, J\n        JARs excluded: B, G (not duplicated if reachable via multiple paths)\n        \n        Compile-time JARs: A-hjar, I-hjar, C-hjar, F-hjar\n        Runtime JARs: A, I, C, D, E, F, H, J\n        Reasoning: B,G excluded by label, but transitives are preserved as exclude_transitives = False\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libmultiple_paths_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libmultiple_paths_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libmultiple_paths_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libmultiple_paths_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_paths_test = unittest.make(_test_multiple_paths, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/A.java",
    "content": "package com.depsfilter;\n\npublic class A {\n    int a;\n    private B b;\n    // E is a runtime dependency, so no compile-time reference here\n    public A() {\n        a = 1;\n        b = new B();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/B.java",
    "content": "package com.depsfilter;\n\npublic class B {\n    private C c;\n    public B() {\n        c = new C();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/C.java",
    "content": "package com.depsfilter;\n\npublic class C {\n    // D is a runtime dependency, so no compile-time reference here\n    public C() {\n        // No compile-time dependencies\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/D.java",
    "content": "package com.depsfilter;\n\npublic class D {\n    private int value;\n    public D() {\n        value = 4;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/E.java",
    "content": "package com.depsfilter;\n\npublic class E {\n    private F f;\n    public E() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/F.java",
    "content": "package com.depsfilter;\n\npublic class F {\n    private C c;\n    public F() {\n        c = new C();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/G.java",
    "content": "package com.depsfilter;\n\npublic class G {\n    private F f;\n    public G() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/H.java",
    "content": "package com.depsfilter;\n\npublic class H {\n    public H() {\n        int h = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/I.java",
    "content": "package com.depsfilter;\n\npublic class I {\n    private F;\n    public I() {\n        F = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/J.java",
    "content": "package com.depsfilter;\n\npublic class J {\n    private B b;\n    public J() {\n        b = new B();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterEmptyExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterEmptyExclusionsTest {\n\n    @Test\n    public void testTransitivesExclusion() {\n        /*\n            Checkout _test_empty_exclusion_lists in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps\n        List<String> expectedRuntimeDeps = new ArrayList<>(DepsFilterTestHelper.getRuntimeDepsListBeforeExclusions());\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());        \n        // Add test-specific JAR file\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/DepsFilterEmptyExclusionsTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/libempty_exclusion_lists_test_lib.jar\");\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterExcludeTransitiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterExcludeTransitiveTest {\n\n    @Test\n    public void testTransitivesExclusion() {\n        /*\n            Checkout _test_filtered_deps_exclude_transitive in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/DepsFilterExcludeTransitiveTest.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/libexclude_b_g_transitives_test_lib.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterFilteredDepsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterFilteredDepsTest {\n\n    @Test\n    public void testFilteredDeps() {\n        /*\n            Checkout _test_filtered_deps in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/DepsFilterFilteredDepsTest.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/libexclude_b_g_test_lib.jar\");\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterInterfaceImplementationTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterInterfaceImplementationTest {\n\n    @Test\n    public void testInterfaceImplementationJars() {\n        /*\n            Checkout _test_interface_implementation_jars in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        // Note: This test uses the same configuration as filtered_deps test\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/DepsFilterInterfaceImplementationTest.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/libinterface_impl_test_lib.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithTransitiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterMultipleExclusionsWithTransitiveTest {\n\n    @Test\n    public void testMultipleExclusionsWithTransitive() {\n        /*\n            Checkout _test_multiple_exclusions_with_transitive in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/DepsFilterMultipleExclusionsWithTransitiveTest.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/libmultiple_exclusions_with_transitive_test_lib.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithoutTransitiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterMultipleExclusionsWithoutTransitiveTest {\n\n    @Test\n    public void testMultipleExclusionsWithoutTransitive() {\n        /*\n            Checkout _test_multiple_exclusions_without_transitive in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/DepsFilterMultipleExclusionsWithoutTransitiveTest.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/libmultiple_exclusions_without_transitive_test_lib.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterMultiplePathsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterMultiplePathsTest {\n\n    @Test\n    public void testMultiplePaths() {\n        /*\n            Checkout _test_multiple_paths in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/DepsFilterMultiplePathsTest.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/libmultiple_paths_test_lib.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterPathBasedExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterPathBasedExclusionsTest {\n\n    @Test\n    public void testPathBasedExclusions() {\n        /*\n            Checkout _test_path_based_exclusions in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_g.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/DepsFilterPathBasedExclusionsTest.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/libpath_based_exclusions_test_lib.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterTestHelper.java",
    "content": "package com.depsfilter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Helper class containing common functionality for deps filter tests.\n * Provides shared methods and data that can be used across multiple test classes.\n */\npublic class DepsFilterTestHelper {\n\n    /**\n     * Computes the available dependencies from the current classpath.\n     * @return List of available dependencies with \"../\" prefix removed\n     */\n    public static List<String> computeClasspathDependencies() {\n        String classpath = System.getProperty(\"java.class.path\");\n        String[] classpathEntries = classpath.split(System.getProperty(\"path.separator\"));\n        List<String> availableDeps = new ArrayList<>();\n        for (String entry : classpathEntries) {\n            availableDeps.add(entry.replace(\"../\", \"\"));\n        }\n        return availableDeps;\n    }\n\n    /**\n     * Returns the test dependencies required to run the tests.\n     * These are the dependencies specified in the test target.\n     * @return List of test dependencies\n     */\n    public static List<String> getTestDeps() {\n        return List.of(\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/junit/junit/4.13.2/processed_junit-4.13.2.jar\",\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/org/hamcrest/hamcrest-core/1.3/processed_hamcrest-core-1.3.jar\",\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/org/assertj/assertj-core/3.26.0/processed_assertj-core-3.26.0.jar\",\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/net/bytebuddy/byte-buddy/1.14.16/processed_byte-buddy-1.14.16.jar\",\n            \"rules_java~~toolchains~remote_java_tools/java_tools/Runner_deploy.jar\"\n        );\n    }\n\n    /**\n     * Returns the runtime dependencies before exclusions.\n     * These are the base runtime dependencies that would be available before any filtering.\n     * @return List of runtime dependencies before exclusions\n     */\n    public static List<String> getRuntimeDepsListBeforeExclusions() {\n        return new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_b.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_g.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_and_runtime_2/liblib_j.jar\"\n        ));\n    }\n\n    /**\n     * Creates a complete list of runtime dependencies including test dependencies.\n     * This combines the base runtime dependencies with test dependencies.\n     * @return Complete list of runtime dependencies including test dependencies\n     */\n    public static List<String> getCompleteRuntimeDepsList() {\n        List<String> completeList = new ArrayList<>(getRuntimeDepsListBeforeExclusions());\n        completeList.addAll(getTestDeps());\n        return completeList;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:deps_filter.bzl\", \"deps_filter\")\nload(\"//springboot/deps_filter_rules:dependencyset.bzl\", \"dependencyset\")\nload(\n    \"//springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only:compile_time_only_test.bzl\",\n    \"no_filtering_test\",\n    \"filtered_deps_test\",\n    \"filtered_deps_exclude_transitive_test\",\n    \"path_based_exclusions_test\",\n    \"interface_implementation_jars_test\",\n    \"multiple_exclusions_with_transitive_test\",\n    \"multiple_exclusions_without_transitive_test\",\n    \"empty_exclusion_lists_test\",\n    \"multiple_paths_test\",\n)\n\n# Dependency Graph Structure:\n\n#      base_lib      \n#         |\n#  dependencyset(\"deps\")\n#       /   \\  \n#     A      I\n#    / \\    /\n#   B   E  G\n#   |   | /\n#   |   F\n#    \\/\n#    C\n#    | \n#    D   \n#\n\njava_library(\n    name = \"lib_a\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\n        \":lib_b\",  # A -> B \n        \":lib_e\",  # A -> E \n    ],\n)\n\njava_library(\n    name = \"lib_b\",\n    srcs = [\"src/main/java/com/depsfilter/B.java\"],  \n    deps = [\":lib_c\"], # B -> C\n)\n\njava_library(\n    name = \"lib_c\",\n    srcs = [\"src/main/java/com/depsfilter/C.java\"],\n    deps = [\":lib_d\"], # B -> D\n)\n\njava_library(\n    name = \"lib_d\",\n    srcs = [\"src/main/java/com/depsfilter/D.java\"], \n)\n\njava_library(\n    name = \"lib_e\",\n    srcs = [\"src/main/java/com/depsfilter/E.java\"],\n    deps = [\":lib_f\"], # E -> F\n)\n\njava_library(\n    name = \"lib_f\",\n    srcs = [\"src/main/java/com/depsfilter/F.java\"],\n    deps = [\":lib_c\"], # F -> C\n)\n\njava_library(\n    name = \"lib_g\",\n    srcs = [\"src/main/java/com/depsfilter/G.java\"],\n    deps = [\":lib_f\"], # G -> F path\n)\n\njava_library(\n    name = \"lib_i\",\n    srcs = [\"src/main/java/com/depsfilter/I.java\"],\n    deps = [\":lib_g\"], # I -> G path\n)\n\n\n# Consumer library that uses the filtered dependencies\njava_library(\n    name = \"no_filtering_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":no_filtering_test_dependencyset\"],\n)\n\n# Test 1: No filtering\ndependencyset(\n    name = \"no_filtering_test_dependencyset\",\n    items = [\"lib_a\",\":lib_i\"],\n)\n\njava_library(\n    name = \"base_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":lib_a\", \":lib_i\"],\n)\n\nno_filtering_test(\n    name = \"no_filtering_test\",\n    java_library = \":base_lib\",\n    java_library_dependencyset = \":no_filtering_test_lib\",\n)\n\n# Test 2: Exclude by labels and exclude_transitives = False\ndependencyset(\n    name = \"deps_exclude_b_g\",\n    items = [\"lib_a\",\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"exclude_b_g_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_exclude_b_g\"],\n)\n\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    test_lib = \":exclude_b_g_test_lib\",\n)\n\n# Test 3: Exclude by labels and exclude_transitives = True\ndependencyset(\n    name = \"deps_exclude_b_g_transitives\",\n    items = [\"lib_a\",\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"exclude_b_g_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_exclude_b_g_transitives\"],\n)\n\nfiltered_deps_exclude_transitive_test(\n    name = \"deps_filter_exclude_b_g_exclude_transitive_test\",\n    test_lib = \":exclude_b_g_transitives_test_lib\",\n)\n\n\n# Test 4: Test for path-based exclusions\ndependencyset(\n    name = \"deps_exclude_paths\",\n    items = [\"lib_a\",\":lib_i\"],\n    deps_exclude_paths = [\"lib_b\", \"lib_f\"],\n)\n\njava_library(\n    name = \"exclude_paths_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_exclude_paths\"],\n)\n\npath_based_exclusions_test(\n    name = \"deps_filter_path_based_exclusions_test\",\n    test_lib = \":exclude_paths_test_lib\",\n)\n\n\n# Test 5: Interface vs Implementation JARs\ndependencyset(\n    name = \"deps_interface_impl_exclude_b_g\",\n    items = [\"lib_a\",\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"interface_impl_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_interface_impl_exclude_b_g\"],\n)\n\ninterface_implementation_jars_test(\n    name = \"deps_filter_interface_impl_test\",\n    test_lib = \":interface_impl_test_lib\",\n)\n\n\n# Test 6: Multiple exclusions with exclude_transitives=True\ndependencyset(\n    name = \"deps_multi_excl_transitives\",\n    items = [\"lib_a\",\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"multi_excl_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_multi_excl_transitives\"],\n)\n\nmultiple_exclusions_with_transitive_test(\n    name = \"multiple_exclusions_with_transitive_test\",\n    test_lib = \":multi_excl_transitives_test_lib\",\n)\n\n\n# Test 7: Multiple exclusions with exclude_transitives=False\ndependencyset(\n    name = \"deps_multi_excl_no_transitives\",\n    items = [\"lib_a\",\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"multi_excl_no_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_multi_excl_no_transitives\"],\n)\n\nmultiple_exclusions_without_transitive_test(\n    name = \"multiple_exclusions_without_transitive_test\",\n    test_lib = \":multi_excl_no_transitives_test_lib\",\n)\n\n# Test 8: Empty exclusion lists\ndependencyset(\n    name = \"deps_empty_exclusions\",\n    items = [\"lib_a\",\":lib_i\"],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n)\n\njava_library(\n    name = \"empty_exclusions_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_empty_exclusions\"],\n)\n\nempty_exclusion_lists_test(\n    name = \"deps_filter_empty_exclusions_test\",\n    test_lib = \":empty_exclusions_test_lib\",\n)\n\n# Test 9: Multiple paths handling\ndependencyset(\n    name = \"deps_multiple_paths_exclude_b_g\",\n    items = [\"lib_a\",\":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"multiple_paths_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_multiple_paths_exclude_b_g\"],\n)\n\nmultiple_paths_test(\n    name = \"deps_filter_multiple_paths_test\",\n    test_lib = \":multiple_paths_test_lib\",\n)\n\ntoolchain(\n    name = \"unittest_toolchain\",\n    toolchain_type = \"@bazel_skylib//toolchains/unittest:toolchain_type\",\n    toolchain = \"@bazel_skylib//toolchains/unittest:toolchain\",\n)\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/compile_time_only_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\",\n        \"update_jar_name\",\n)\n\n\ndef _test_no_filtering(ctx):\n    \"\"\"\n    Tests that deps_filter preserves all dependencies when no exclusions are applied.\n    \n    Dependency Graph: \n         test_lib      \n            |\n dependencyset(\"deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n    \n    Expected: All JARs from java_library must match deps_filter:\n        - full_compile_jars: Implementation JARs (e.g., liblib_a.jar)\n        - compile_jars: Interface JARs (e.g., liblib_a-hjar.jar)\n        - transitive_compile_time_jars: Interface JARs from transitive deps\n        - transitive_runtime_jars: Implementation JARs from transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    java_lib_info = ctx.attr.java_library[JavaInfo]\n    deps_filter_info = ctx.attr.java_library_dependencyset[JavaInfo]\n    \n    # Verify all JAR fields match between java_library and deps_filter\n    jar_fields = [\n        \"full_compile_jars\",              # Implementation JARs\n        \"compile_jars\",                   # Interface JARs\n        \"transitive_compile_time_jars\",   # Transitive interface JARs\n        \"transitive_runtime_jars\"         # Transitive implementation JARs\n    ]\n\n    for jar_field in jar_fields:\n        java_lib_jars = getattr(java_lib_info, jar_field)\n        deps_filter_jars = getattr(deps_filter_info, jar_field)\n        asserts.equals(env, type(java_lib_jars), type(deps_filter_jars), \n            \"JAR type mismatch: {} vs deps_filter\".format(jar_field))\n        java_lib_jars_list = [jar.basename for jar in java_lib_jars.to_list()]        \n        deps_filter_jars_list = [jar.basename for jar in deps_filter_jars.to_list()]\n        # Normalize output jar naming difference between dependencyset consumer and base_lib\n        update_jar_name(\"libno_filtering_test_lib\", \"libbase_lib\", deps_filter_jars_list)\n        asserts.equals(env, java_lib_jars_list, deps_filter_jars_list,\n            \"JAR contents mismatch: {} vs deps_filter\".format(jar_field))\n\n    return unittest.end(env)\n\nno_filtering_test = unittest.make(_test_no_filtering, attrs = {\n    \"java_library\": attr.label(providers = [JavaInfo]),\n    \"java_library_dependencyset\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps(ctx):\n    \"\"\"\n    Tests basic dependency filtering with label-based exclusions.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - test_lib, A, I, E, F, C, D (both runtime and compile-time)\n        JARs excluded:\n        - B, G and their transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n\n    expected_compile_jars = [\n        \"libexclude_b_g_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libexclude_b_g_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libexclude_b_g_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libexclude_b_g_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_d-hjar.jar\"\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_test = unittest.make(_test_filtered_deps, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps_exclude_transitive(ctx):\n    \"\"\"\n    Tests dependency filtering with transitive exclusions.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved:\n        - test_lib, A, I, E (both runtime and compile-time)\n        JARs excluded:\n        - B, G and all transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libexclude_b_g_transitives_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libexclude_b_g_transitives_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libexclude_b_g_transitives_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libexclude_b_g_transitives_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_exclude_transitive_test = unittest.make(_test_filtered_deps_exclude_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_path_based_exclusions(ctx):\n    \"\"\"\n    Tests filtering based on path patterns in deps_exclude_paths.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = [\"lib_b\", \"lib_f\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - All JARs not matching path patterns\n        JARs excluded:\n        - JARs matching paths \"lib_b\" and \"lib_f\"\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libexclude_paths_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libexclude_paths_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libexclude_paths_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libexclude_paths_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_d-hjar.jar\",\n        \"liblib_g-hjar.jar\"\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\npath_based_exclusions_test = unittest.make(_test_path_based_exclusions, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_interface_implementation_jars(ctx):\n    \"\"\"\n    Tests proper handling of interface (-hjar) and implementation JARs.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        Interface JARs (compile_jars):\n        - libinterface_impl_test_lib-hjar.jar\n\n        Implementation JARs (full_compile_jars):\n        - libinterface_impl_test_lib.jar\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    compile_jars = sorted([jar.basename for jar in javainfo_filtered.compile_jars.to_list()])\n    full_compile_jars = sorted([jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()])\n    \n    expected_compile_jars = [\"libinterface_impl_test_lib-hjar.jar\"]\n    expected_full_compile_jars = [\"libinterface_impl_test_lib.jar\"]\n    \n    asserts.equals(env, compile_jars, expected_compile_jars)\n    asserts.equals(env, full_compile_jars, expected_full_compile_jars)\n    return unittest.end(env)\n\ninterface_implementation_jars_test = unittest.make(_test_interface_implementation_jars, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_exclusions_with_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=True.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved:\n        - test_lib, A, I, E, F (both runtime and compile-time)\n        JARs excluded:\n        - B, G and all transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libmulti_excl_transitives_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libmulti_excl_transitives_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libmulti_excl_transitives_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libmulti_excl_transitives_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\ndef _test_multiple_exclusions_without_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=False.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - test_lib, A, I, E, F, C, D (both runtime and compile-time)\n        JARs excluded:\n        - B, G (direct deps only)\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libmulti_excl_no_transitives_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libmulti_excl_no_transitives_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libmulti_excl_no_transitives_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libmulti_excl_no_transitives_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_d-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_exclusions_with_transitive_test = unittest.make(_test_multiple_exclusions_with_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\nmultiple_exclusions_without_transitive_test = unittest.make(_test_multiple_exclusions_without_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        All JARs preserved:\n        - test_lib, A, I, B, C, D, E, F, G (both runtime and compile-time)\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libempty_exclusions_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libempty_exclusions_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libempty_exclusions_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_b.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libempty_exclusions_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n        \"liblib_b-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_d-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_g-hjar.jar\"\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_paths(ctx):\n    \"\"\"\n    Tests handling of multiple paths to the same dependency.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - test_lib, A, I, E, F, C, D (both runtime and compile-time)\n        JARs excluded:\n        - B, G\n        Note: Dependencies not duplicated when reachable through multiple paths\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libmultiple_paths_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libmultiple_paths_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libmultiple_paths_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libmultiple_paths_test_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_d-hjar.jar\"\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_paths_test = unittest.make(_test_multiple_paths, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/A.java",
    "content": "package com.depsfilter;\n\npublic class A {\n    int a;\n    private B b;\n    private E e;\n    public A() {\n        a = 1;\n        b = new B();\n        e = new E();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/B.java",
    "content": "package com.depsfilter;\n\npublic class B {\n    private C c;\n    public B() {\n        c = new C();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/C.java",
    "content": "package com.depsfilter;\n\npublic class C {\n    private D d;\n    public C() {\n        d = new D();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/D.java",
    "content": "package com.depsfilter;\n\npublic class D {\n    private int value;\n    public D() {\n        value = 4;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/E.java",
    "content": "package com.depsfilter;\n\npublic class E {\n    private F f;\n    public E() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/F.java",
    "content": "package com.depsfilter;\n\npublic class F {\n    private C c;\n    public F() {\n        c = new C();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/G.java",
    "content": "package com.depsfilter;\n\npublic class G {\n    private F f;\n    public G() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/H.java",
    "content": "package com.depsfilter;\n\npublic class H {\n    private A a;\n    private I i;\n    public H() {\n        a = new A();\n        i = new I();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/I.java",
    "content": "package com.depsfilter;\n\npublic class I {\n    private G g;\n    public I() {\n        g = new G();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:dependencyset.bzl\", \"dependencyset\")\nload(\n    \"//springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only:runtime_only_test.bzl\",\n    \"no_filtering_test\",\n    \"filtered_deps_test\",\n    \"filtered_deps_exclude_transitive_test\",\n    \"path_based_exclusions_test\",\n    \"interface_implementation_jars_test\",\n    \"multiple_exclusions_with_transitive_test\",\n    \"multiple_exclusions_without_transitive_test\",\n    \"empty_exclusion_lists_test\",\n    \"multiple_paths_test\",\n)\n\n# Dependency Graph Structure:\n\n#      base_lib      \n#         |\n#  dependencyset(\"runtime_deps\")\n#       /   \\  \n#     A      I\n#    / \\    /\n#   B   E  G\n#   |   | /\n#   |   F\n#    \\/\n#    C\n#    | \n#    D   \n#\n\njava_library(\n    name = \"lib_a\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    runtime_deps = [\n        \":lib_b\",  # A -> B \n        \":lib_e\",  # A -> E \n    ],\n)\n\njava_library(\n    name = \"lib_b\",\n    srcs = [\"src/main/java/com/depsfilter/B.java\"],  \n    runtime_deps = [\":lib_c\"], # B -> C\n)\n\njava_library(\n    name = \"lib_c\",\n    srcs = [\"src/main/java/com/depsfilter/C.java\"],\n    runtime_deps = [\":lib_d\"], # B -> D\n)\n\njava_library(\n    name = \"lib_d\",\n    srcs = [\"src/main/java/com/depsfilter/D.java\"], \n)\n\njava_library(\n    name = \"lib_e\",\n    srcs = [\"src/main/java/com/depsfilter/E.java\"],\n    runtime_deps = [\":lib_f\"], # E -> F\n)\n\njava_library(\n    name = \"lib_f\",\n    srcs = [\"src/main/java/com/depsfilter/F.java\"],\n    runtime_deps = [\":lib_c\"], # F -> C\n)\n\njava_library(\n    name = \"lib_g\",\n    srcs = [\"src/main/java/com/depsfilter/G.java\"],\n    runtime_deps = [\":lib_f\"], # G -> F path\n)\n\njava_library(\n    name = \"lib_i\",\n    srcs = [\"src/main/java/com/depsfilter/I.java\"],\n    runtime_deps = [\":lib_g\"], # I -> G path\n)\n\n# Consumer library that uses the filtered dependencies\njava_library(\n    name = \"base_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":lib_a\", \":lib_i\"],\n)\n\n# Test 1: No filtering\ndependencyset(\n    name = \"runtime_deps_no_filtering\",\n    items = [\":lib_a\", \":lib_i\"],\n)\n\njava_library(\n    name = \"runtime_no_filtering_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":runtime_deps_no_filtering\"],\n)\n\nno_filtering_test(\n    name = \"deps_filter_no_filtering_test\",\n    java_library = \":base_lib\",\n    java_library_dependencyset = \":runtime_no_filtering_test_lib\",\n)\n\n# Test 2: Exclude by labels and exclude_transitives = False\ndependencyset(\n    name = \"runtime_deps_exclude_b_g\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"runtime_exclude_b_g_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":runtime_deps_exclude_b_g\"],\n)\n\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    test_lib = \":runtime_exclude_b_g_test_lib\",\n)\n\n# Test 3: Exclude by labels and exclude_transitives = True\ndependencyset(\n    name = \"runtime_deps_exclude_b_g_transitives\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"runtime_exclude_b_g_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":runtime_deps_exclude_b_g_transitives\"],\n)\n\nfiltered_deps_exclude_transitive_test(\n    name = \"deps_filter_exclude_b_g_exclude_transitive_test\",\n    test_lib = \":runtime_exclude_b_g_transitives_test_lib\",\n)\n\n# Test 4: Test for path-based exclusions\ndependencyset(\n    name = \"runtime_deps_exclude_paths\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_paths = [\"lib_b\", \"lib_f\"],\n)\n\njava_library(\n    name = \"runtime_exclude_paths_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":runtime_deps_exclude_paths\"],\n)\n\npath_based_exclusions_test(\n    name = \"deps_filter_path_based_exclusions_test\",\n    test_lib = \":runtime_exclude_paths_test_lib\",\n)\n\n# Test 5: Interface vs Implementation JARs\ndependencyset(\n    name = \"runtime_deps_interface_impl_exclude_b_g\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"runtime_interface_impl_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":runtime_deps_interface_impl_exclude_b_g\"],\n)\n\ninterface_implementation_jars_test(\n    name = \"deps_filter_interface_impl_test\",\n    test_lib = \":runtime_interface_impl_test_lib\",\n)\n\n# Test 6: Multiple exclusions with exclude_transitives=True\ndependencyset(\n    name = \"runtime_deps_multi_excl_transitives\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"runtime_multi_excl_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":runtime_deps_multi_excl_transitives\"],\n)\n\nmultiple_exclusions_with_transitive_test(\n    name = \"multiple_exclusions_with_transitive_test\",\n    test_lib = \":runtime_multi_excl_transitives_test_lib\",\n)\n\n# Test 7: Multiple exclusions with exclude_transitives=False\ndependencyset(\n    name = \"runtime_deps_multi_excl_no_transitives\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = False,\n)\n\njava_library(\n    name = \"runtime_multi_excl_no_transitives_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":runtime_deps_multi_excl_no_transitives\"],\n)\n\nmultiple_exclusions_without_transitive_test(\n    name = \"multiple_exclusions_without_transitive_test\",\n    test_lib = \":runtime_multi_excl_no_transitives_test_lib\",\n)\n\n# Test 8: Empty exclusion lists\ndependencyset(\n    name = \"runtime_deps_empty_exclusions\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_paths = [],\n    deps_exclude_labels = [],\n)\n\njava_library(\n    name = \"runtime_empty_exclusions_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":runtime_deps_empty_exclusions\"],\n)\n\nempty_exclusion_lists_test(\n    name = \"deps_filter_empty_exclusions_test\",\n    test_lib = \":runtime_empty_exclusions_test_lib\",\n)\n\n# Test 9: Multiple paths handling\ndependencyset(\n    name = \"runtime_deps_multiple_paths_exclude_b_g\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\njava_library(\n    name = \"runtime_multiple_paths_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":runtime_deps_multiple_paths_exclude_b_g\"],\n)\n\nmultiple_paths_test(\n    name = \"deps_filter_multiple_paths_test\",\n    test_lib = \":runtime_multiple_paths_test_lib\",\n)\n\n\ntoolchain(\n    name = \"unittest_toolchain\",\n    toolchain_type = \"@bazel_skylib//toolchains/unittest:toolchain_type\",\n    toolchain = \"@bazel_skylib//toolchains/unittest:toolchain\",\n)\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/runtime_only_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\",\n        \"update_jar_name\",\n)\n\n\ndef _test_no_filtering(ctx):\n    \"\"\"\n    Tests that deps_filter preserves all dependencies when no exclusions are applied.\n    \n    Dependency Graph: \n        test_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n    \n    Expected: All JARs from java_library must match deps_filter:\n        - full_compile_jars: Implementation JARs (e.g., liblib_a.jar)\n        - compile_jars: Interface JARs (e.g., liblib_a-hjar.jar)\n        - transitive_compile_time_jars: Interface JARs from transitive deps\n        - transitive_runtime_jars: Implementation JARs from transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    java_lib_info = ctx.attr.java_library[JavaInfo]\n    deps_filter_info = ctx.attr.java_library_dependencyset[JavaInfo]\n    \n    # Verify all JAR fields match between java_library and deps_filter\n    jar_fields = [\n        \"full_compile_jars\",              # Implementation JARs\n        \"compile_jars\",                   # Interface JARs\n        \"transitive_compile_time_jars\",   # Transitive interface JARs\n        \"transitive_runtime_jars\"         # Transitive implementation JARs\n    ]\n\n    for jar_field in jar_fields:\n        java_lib_jars = getattr(java_lib_info, jar_field)\n        deps_filter_jars = getattr(deps_filter_info, jar_field)\n        asserts.equals(env, type(java_lib_jars), type(deps_filter_jars), \n            \"JAR type mismatch: {} vs deps_filter\".format(jar_field))\n        java_lib_jars_list = [jar.basename for jar in java_lib_jars.to_list()]        \n        deps_filter_jars_list = [jar.basename for jar in deps_filter_jars.to_list()]\n        # Normalize output jar naming difference between dependencyset consumer and base_lib\n        update_jar_name(\"libruntime_no_filtering_test_lib\", \"libbase_lib\", deps_filter_jars_list)\n        asserts.equals(env, java_lib_jars_list, deps_filter_jars_list,\n            \"JAR contents mismatch: {} vs deps_filter\".format(jar_field))\n\n    return unittest.end(env)\n\nno_filtering_test = unittest.make(_test_no_filtering, attrs = {\n    \"java_library\": attr.label(providers = [JavaInfo]),\n    \"java_library_dependencyset\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps(ctx):\n    \"\"\"\n    Tests basic dependency filtering with label-based exclusions.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"runtime_deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - test_lib, A, I, E, F, C, D (runtime)\n        - no compile-time jars present\n        JARs excluded:\n        - B, G and their transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n\n    expected_compile_jars = [\n        \"libruntime_exclude_b_g_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libruntime_exclude_b_g_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libruntime_exclude_b_g_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libruntime_exclude_b_g_test_lib-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_test = unittest.make(_test_filtered_deps, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps_exclude_transitive(ctx):\n    \"\"\"\n    Tests dependency filtering with transitive exclusions.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"runtime_deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved:\n        - test_lib, A, I, E (runtime)\n        - no compile-time jars present\n        JARs excluded:\n        - B, G and all transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libruntime_exclude_b_g_transitives_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libruntime_exclude_b_g_transitives_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libruntime_exclude_b_g_transitives_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libruntime_exclude_b_g_transitives_test_lib-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_exclude_transitive_test = unittest.make(_test_filtered_deps_exclude_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_path_based_exclusions(ctx):\n    \"\"\"\n    Tests filtering based on path patterns in deps_exclude_paths.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"runtime_deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = [\"lib_b\", \"lib_f\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - All JARs not matching path patterns\n        JARs excluded:\n        - JARs matching paths \"lib_b\" and \"lib_f\"\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libruntime_exclude_paths_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libruntime_exclude_paths_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libruntime_exclude_paths_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libruntime_exclude_paths_test_lib-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\npath_based_exclusions_test = unittest.make(_test_path_based_exclusions, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_interface_implementation_jars(ctx):\n    \"\"\"\n    Tests proper handling of interface (-hjar) and implementation JARs.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"runtime_deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        Interface JARs (compile_jars):\n        - []\n\n        Implementation JARs (full_compile_jars):\n        - libtest_lib.jar\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    compile_jars = sorted([jar.basename for jar in javainfo_filtered.compile_jars.to_list()])\n    full_compile_jars = sorted([jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()])\n    \n    expected_compile_jars = [\n        \"libruntime_interface_impl_test_lib-hjar.jar\",\n    ]\n    expected_full_compile_jars = [\n        \"libruntime_interface_impl_test_lib.jar\",\n    ]\n    \n    asserts.equals(env, compile_jars, expected_compile_jars)\n    asserts.equals(env, full_compile_jars, expected_full_compile_jars)\n    return unittest.end(env)\n\ninterface_implementation_jars_test = unittest.make(_test_interface_implementation_jars, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_exclusions_with_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=True.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"runtime_deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved:\n        - test_lib, A, I, E, F (runtime)\n        - no compile-time jars present\n        JARs excluded:\n        - B, G and all transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libruntime_multi_excl_transitives_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libruntime_multi_excl_transitives_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libruntime_multi_excl_transitives_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libruntime_multi_excl_transitives_test_lib-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\ndef _test_multiple_exclusions_without_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=False.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"runtime_deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - test_lib, A, I, E, F, C, D (runtime)\n        - no compile-time jars present\n        JARs excluded:\n        - B, G (direct deps only)\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libruntime_multi_excl_no_transitives_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libruntime_multi_excl_no_transitives_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libruntime_multi_excl_no_transitives_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libruntime_multi_excl_no_transitives_test_lib-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_exclusions_with_transitive_test = unittest.make(_test_multiple_exclusions_with_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\nmultiple_exclusions_without_transitive_test = unittest.make(_test_multiple_exclusions_without_transitive, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"runtime_deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        All JARs preserved:\n        - test_lib, A, I, B, C, D, E, F, G (runtime)\n        - no compile-time jars present\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libruntime_empty_exclusions_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libruntime_empty_exclusions_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libruntime_empty_exclusions_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_b.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libruntime_empty_exclusions_test_lib-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_paths(ctx):\n    \"\"\"\n    Tests handling of multiple paths to the same dependency.\n    \n    Dependency Graph:\n         test_lib      \n            |\n dependencyset(\"runtime_deps\")\n        /     \\\\\n       A       I\n      / \\\\    /\n     B   E   G\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Dependencyset Input:\n        items = [\":lib_a\", \":lib_i\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - test_lib, A, I, E, F, C, D (runtime)\n        - no compile-time jars present\n        JARs excluded:\n        - B, G\n        Note: Dependencies not duplicated when reachable through multiple paths\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.test_lib[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libruntime_multiple_paths_test_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libruntime_multiple_paths_test_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libruntime_multiple_paths_test_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libruntime_multiple_paths_test_lib-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_paths_test = unittest.make(_test_multiple_paths, attrs = {\n    \"test_lib\": attr.label(providers = [JavaInfo]),\n})\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/src/main/java/com/depsfilter/A.java",
    "content": "package com.depsfilter;\n\npublic class A {\n    public A() {\n        int a = 1;\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/src/main/java/com/depsfilter/B.java",
    "content": "package com.depsfilter;\n\npublic class B {\n    public B() {\n        int b = 1;\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/src/main/java/com/depsfilter/C.java",
    "content": "package com.depsfilter;\n\npublic class C {\n    public C() {\n        int c = 1;\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/src/main/java/com/depsfilter/D.java",
    "content": "package com.depsfilter;\n\npublic class D {\n    public D() {\n        int d = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/src/main/java/com/depsfilter/E.java",
    "content": "package com.depsfilter;\n\npublic class E {\n    public E() {\n        int e = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/src/main/java/com/depsfilter/F.java",
    "content": "package com.depsfilter;\n\npublic class F {\n    public F() {\n        int f = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/src/main/java/com/depsfilter/G.java",
    "content": "package com.depsfilter;\n\npublic class G {\n    public G() {\n        int g = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/src/main/java/com/depsfilter/H.java",
    "content": "package com.depsfilter;\n\npublic class H {\n    public H() {\n        int h = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/runtime_only/src/main/java/com/depsfilter/I.java",
    "content": "package com.depsfilter;\n\npublic class I {\n    public I() {\n        int i = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:deps_filter.bzl\", \"deps_filter\")\nload(\n    \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:compile_and_runtime_test.bzl\",\n    \"no_filtering_test\",\n    \"with_label_exclusions_test\",\n    \"with_label_exclusions_with_exclude_transitives_test\",\n    \"with_path_exclusions_test\",\n    \"with_path_exclusions_with_exclude_transitives_test\",\n    \"multiple_exclusions_with_exclude_transitives_test\",\n    \"multiple_exclusions_without_exclude_transitives_test\",\n    \"empty_exclusion_lists_test\",\n    \"path_based_exclusions_comprehensive_test\",\n    \"runtime_deps_only_test\",\n    \"compile_deps_only_test\",\n    \"single_dep_with_exclusions_test\",\n    \"single_runtime_dep_with_exclusions_test\",\n    \"one_compile_one_runtime_dep_test\",\n    \"path_patterns_with_special_characters_test\",\n    \"case_sensitive_pattern_matching_test\",\n)\n\ndeps = [\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\", \n    \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n    \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n    \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n]\n\nruntime_deps = [\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n]\n\ntest_deps = [\n    \"@unmanaged_deps_filter//:junit_junit\",\n    \"@unmanaged_deps_filter//:org_assertj_assertj_core\",\n]\n\n# Test 1: No filtering - baseline test\ndeps_filter(\n    name = \"no_filtering\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n)\n\nno_filtering_test(\n    name = \"no_filtering_test\",\n    filtered = \":no_filtering\",\n)\n\njava_test(\n    name = \"DepsFilterNoFilteringTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterNoFilteringTest.java\"\n    ],\n    deps = [\":no_filtering\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 2: Label-based exclusions without transitives\ndeps_filter(\n    name = \"with_label_exclusions\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n)\n\nwith_label_exclusions_test(\n    name = \"with_label_exclusions_test\",\n    filtered = \":with_label_exclusions\",\n)\n\njava_test(\n    name = \"DepsFilterLabelExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterLabelExclusionsTest.java\"\n    ],\n    deps = [\":with_label_exclusions\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 3: Label-based exclusions with exclude_transitives\ndeps_filter(\n    name = \"with_label_exclusions_with_exclude_transitives\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    exclude_transitives = True,\n)\n\nwith_label_exclusions_with_exclude_transitives_test(\n    name = \"with_label_exclusions_with_exclude_transitives_test\",\n    filtered = \":with_label_exclusions_with_exclude_transitives\",\n)\n\njava_test(\n    name = \"DepsFilterExcludeTransitiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterExcludeTransitiveTest.java\"\n    ],\n    deps = [\":with_label_exclusions_with_exclude_transitives\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 4: Path-based exclusions without transitives\ndeps_filter(\n    name = \"with_path_exclusions\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\"\n    ],\n)\n\nwith_path_exclusions_test(\n    name = \"with_path_exclusions_test\",\n    filtered = \":with_path_exclusions\",\n)\n\njava_test(\n    name = \"DepsFilterPathExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathExclusionsTest.java\"\n    ],\n    deps = [\":with_path_exclusions\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 5: Path-based exclusions with exclude_transitives\ndeps_filter(\n    name = \"with_path_exclusions_with_exclude_transitives\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\"\n    ],\n    exclude_transitives = True,\n)\n\nwith_path_exclusions_with_exclude_transitives_test(\n    name = \"with_path_exclusions_with_exclude_transitives_test\",\n    filtered = \":with_path_exclusions_with_exclude_transitives\",\n)\n\njava_test(\n    name = \"DepsFilterPathExclusionsWithTransitivesTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathExclusionsWithTransitivesTest.java\"\n    ],\n    deps = [\":with_path_exclusions_with_exclude_transitives\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 6: Multiple exclusions with exclude_transitives (labels + patterns)\ndeps_filter(\n    name = \"multiple_exclusions_with_exclude_transitives\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    deps_exclude_paths = [\n        \"slf4j\"\n    ],\n    exclude_transitives = True,\n)\n\nmultiple_exclusions_with_exclude_transitives_test(\n    name = \"multiple_exclusions_with_exclude_transitives_test\",\n    filtered = \":multiple_exclusions_with_exclude_transitives\",\n)\n\njava_test(\n    name = \"DepsFilterMultipleExclusionsWithTransitivesTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithTransitivesTest.java\"\n    ],\n    deps = [\":multiple_exclusions_with_exclude_transitives\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 7: Multiple exclusions without exclude_transitives (labels + patterns)\ndeps_filter(\n    name = \"multiple_exclusions_without_exclude_transitives\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    deps_exclude_paths = [\n        \"slf4j\",\n    ],\n    exclude_transitives = True,\n)\n\nmultiple_exclusions_without_exclude_transitives_test(\n    name = \"multiple_exclusions_without_exclude_transitives_test\",\n    filtered = \":multiple_exclusions_without_exclude_transitives\",\n)\n\njava_test(\n    name = \"DepsFilterMultipleExclusionsWithoutTransitivesTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithoutTransitivesTest.java\"\n    ],\n    deps = [\":multiple_exclusions_without_exclude_transitives\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 8: Empty exclusion lists\ndeps_filter(\n    name = \"empty_exclusion_lists\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\nempty_exclusion_lists_test(\n    name = \"empty_exclusion_lists_test\",\n    filtered = \":empty_exclusion_lists\",\n)\n\njava_test(\n    name = \"DepsFilterEmptyExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterEmptyExclusionsTest.java\"\n    ],\n    deps = [\":empty_exclusion_lists\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 9: Comprehensive path-based exclusions\ndeps_filter(\n    name = \"path_based_exclusions_comprehensive\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\",\n        \"logback\"\n    ],\n    exclude_transitives = False,\n)\n\npath_based_exclusions_comprehensive_test(\n    name = \"path_based_exclusions_comprehensive_test\",\n    filtered = \":path_based_exclusions_comprehensive\",\n)\n\njava_test(\n    name = \"DepsFilterPathBasedExclusionsComprehensiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathBasedExclusionsComprehensiveTest.java\"\n    ],\n    deps = [\":path_based_exclusions_comprehensive\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 10: Runtime deps only\ndeps_filter(\n    name = \"runtime_deps_only\",\n    runtime_deps = runtime_deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\nruntime_deps_only_test(\n    name = \"runtime_deps_only_test\",\n    filtered = \":runtime_deps_only\",\n)\n\njava_test(\n    name = \"DepsFilterRuntimeDepsOnlyTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterRuntimeDepsOnlyTest.java\"\n    ],\n    deps = [\":runtime_deps_only\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 11: Compile deps only\ndeps_filter(\n    name = \"compile_deps_only\",\n    deps = deps,\n    runtime_deps = [],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\ncompile_deps_only_test(\n    name = \"compile_deps_only_test\",\n    filtered = \":compile_deps_only\",\n)\n\njava_test(\n    name = \"DepsFilterCompileDepsOnlyTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterCompileDepsOnlyTest.java\"\n    ],\n    deps = [\":compile_deps_only\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 12: Single dependency with exclusions\ndeps_filter(\n    name = \"single_dep_with_exclusions\",\n    deps = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n    ],\n    runtime_deps = [],\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n    ],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\nsingle_dep_with_exclusions_test(\n    name = \"single_dep_with_exclusions_test\",\n    filtered = \":single_dep_with_exclusions\",\n)\n\njava_test(\n    name = \"DepsFilterSingleDepWithExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterSingleDepWithExclusionsTest.java\"\n    ],\n    deps = [\":single_dep_with_exclusions\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 13: Single runtime dependency with exclusions\ndeps_filter(\n    name = \"single_runtime_dep_with_exclusions\",\n    deps = [],\n    runtime_deps = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n    ],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"slf4j\",\n    ],\n    exclude_transitives = False,\n)\n\nsingle_runtime_dep_with_exclusions_test(\n    name = \"single_runtime_dep_with_exclusions_test\",\n    filtered = \":single_runtime_dep_with_exclusions\",\n)\n\njava_test(\n    name = \"DepsFilterSingleRuntimeDepWithExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterSingleRuntimeDepWithExclusionsTest.java\"\n    ],\n    deps = [\":single_runtime_dep_with_exclusions\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 14: One compile dep and one runtime dep\ndeps_filter(\n    name = \"one_compile_one_runtime_dep\",\n    deps = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n    ],\n    runtime_deps = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n    ],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\none_compile_one_runtime_dep_test(\n    name = \"one_compile_one_runtime_dep_test\",\n    filtered = \":one_compile_one_runtime_dep\",\n)\n\njava_test(\n    name = \"DepsFilterOneCompileOneRuntimeDepTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterOneCompileOneRuntimeDepTest.java\"\n    ],\n    deps = [\":one_compile_one_runtime_dep\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 15: Path patterns with special characters\ndeps_filter(\n    name = \"path_patterns_with_special_characters\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_paths = [\n        \"io.micrometer\",  \n        \"to-slf4j\", \n    ],\n    exclude_transitives = True,\n)\n\npath_patterns_with_special_characters_test(\n    name = \"path_patterns_with_special_characters_test\",\n    filtered = \":path_patterns_with_special_characters\",\n)\n\njava_test(\n    name = \"DepsFilterPathPatternsWithSpecialCharactersTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathPatternsWithSpecialCharactersTest.java\"\n    ],\n    deps = [\":path_patterns_with_special_characters\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 16: Case sensitive pattern matching\ndeps_filter(\n    name = \"case_sensitive_pattern_matching\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"SPRING\",  # Uppercase pattern\n        \"Jackson\", # Mixed case pattern\n        \"HIBERNATE\", # Uppercase pattern\n    ],\n    exclude_transitives = False,\n)\n\ncase_sensitive_pattern_matching_test(\n    name = \"case_sensitive_pattern_matching_test\",\n    filtered = \":case_sensitive_pattern_matching\",\n)\n\njava_test(\n    name = \"DepsFilterCaseSensitivePatternMatchingTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterCaseSensitivePatternMatchingTest.java\"\n    ],\n    deps = [\":case_sensitive_pattern_matching\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Toolchain for unittest\ntoolchain(\n    name = \"unittest_toolchain\",\n    toolchain_type = \"@bazel_skylib//toolchains/unittest:toolchain_type\",\n    toolchain = \"@bazel_skylib//toolchains/unittest:toolchain\",\n)\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/compile_and_runtime_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\",\n        \"compute_expected_jars\",\n)\n\n\ndef _test_no_filtering(ctx):\n    \"\"\"\n    Tests deps without any filtering - baseline test.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_jars_and_dropped_counts(env, expected, \n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n\n    return unittest.end(env)\n\nno_filtering_test = unittest.make(_test_no_filtering, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n})\n\n\ndef _test_with_label_exclusions(ctx):\n    \"\"\"\n    Tests deps with label-based exclusions (without transitives).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Verify dropped counts - label exclusions should drop direct JARs but not transitives when exclude_transitives=False\n    dropped_counts = {\n        \"compile_jars_dropped\": expected[\"compile_jars_dropped\"],\n        \"full_compile_jars_dropped\": expected[\"full_compile_jars_dropped\"],\n        \"transitive_compile_jars_dropped\": expected[\"transitive_compile_jars_dropped\"],\n        \"transitive_runtime_jars_dropped\": expected[\"transitive_runtime_jars_dropped\"],\n    }\n    verify_dropped_counts(env, expected, \n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n\n    return unittest.end(env)\n\nwith_label_exclusions_test = unittest.make(_test_with_label_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n            \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_with_label_exclusions_with_exclude_transitives(ctx):\n    \"\"\"\n    Tests deps with label-based exclusions including exclude_transitives.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_jars_and_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n\n    return unittest.end(env)\n\nwith_label_exclusions_with_exclude_transitives_test = unittest.make(_test_with_label_exclusions_with_exclude_transitives, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n            \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\n\ndef _test_with_path_exclusions(ctx):\n    \"\"\"\n    Tests deps with path-based exclusions (without transitives).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nwith_path_exclusions_test = unittest.make(_test_with_path_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [        \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"micrometer\",\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\n\ndef _test_with_path_exclusions_with_exclude_transitives(ctx):\n    \"\"\"\n    Tests deps with path-based exclusions including exclude_transitives.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n    \n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nwith_path_exclusions_with_exclude_transitives_test = unittest.make(_test_with_path_exclusions_with_exclude_transitives, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [        \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"micrometer\",\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\ndef _test_multiple_exclusions_with_exclude_transitives(ctx):\n    \"\"\"\n    Tests multiple exclusion types (labels + paths) with exclude_transitives=True.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nmultiple_exclusions_with_exclude_transitives_test = unittest.make(_test_multiple_exclusions_with_exclude_transitives, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\ndef _test_multiple_exclusions_without_exclude_transitives(ctx):\n    \"\"\"\n    Tests multiple exclusion types (labels + paths) with exclude_transitives=False.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nmultiple_exclusions_without_exclude_transitives_test = unittest.make(_test_multiple_exclusions_without_exclude_transitives, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_path_based_exclusions_comprehensive(ctx):\n    \"\"\"\n    Tests comprehensive path-based exclusions with various patterns.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Additional verification: ensure excluded patterns are not present\n    transitive_runtime_jars = [jar.basename for jar in javainfo_filtered.transitive_runtime_jars.to_list()]\n    for pattern in [\"micrometer\", \"slf4j\", \"logback\"]:\n        for jar in transitive_runtime_jars:\n            asserts.true(env, pattern not in jar, \n                \"Excluded pattern '{}' found in JAR: {}\".format(pattern, jar))\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    \n    return unittest.end(env)\n\npath_based_exclusions_comprehensive_test = unittest.make(_test_path_based_exclusions_comprehensive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"micrometer\",\n            \"slf4j\",\n            \"logback\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_runtime_deps_only(ctx):\n    \"\"\"\n    Tests behavior when only runtime_deps are provided (no deps).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    # Updating manually because the output_jar for 'runtime_deps' is a full_compile_jar if no 'deps' specified\n    expected_full_compile_jars = [\"processed_spring-boot-starter-oauth2-client-3.3.11.jar\"]\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected_full_compile_jars,\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Runtime deps should not contribute to compile-time JARs\n    compile_jars = [jar.basename for jar in javainfo_filtered.compile_jars.to_list()]\n    full_compile_jars = [jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()]\n    \n    asserts.equals(env, len(compile_jars), 0, \n        \"Expected no compile JARs when only runtime_deps provided, got: {}\".format(len(compile_jars)))\n\n    # Note: full_compile_jars is not empty because the output_jar is a full_compile_jar\n    asserts.equals(env, len(full_compile_jars), 1, \n        \"Expected no full compile JARs when only runtime_deps provided, got: {}\".format(len(full_compile_jars)))\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\nruntime_deps_only_test = unittest.make(_test_runtime_deps_only, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_compile_deps_only(ctx):\n    \"\"\"\n    Tests behavior when only deps are provided (no runtime_deps).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Compile deps should contribute to both compile and runtime JARs\n    compile_jars = [jar.basename for jar in javainfo_filtered.compile_jars.to_list()]\n    transitive_runtime_jars = [jar.basename for jar in javainfo_filtered.transitive_runtime_jars.to_list()]\n    \n    asserts.true(env, len(compile_jars) > 0, \n        \"Expected compile JARs when deps provided, got: {}\".format(len(compile_jars)))\n    asserts.true(env, len(transitive_runtime_jars) > 0, \n        \"Expected transitive runtime JARs when deps provided, got: {}\".format(len(transitive_runtime_jars)))\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\ncompile_deps_only_test = unittest.make(_test_compile_deps_only, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_single_dep_with_exclusions(ctx):\n    \"\"\"\n    Tests behavior with a single dependency and exclusions.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nsingle_dep_with_exclusions_test = unittest.make(_test_single_dep_with_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_single_runtime_dep_with_exclusions(ctx):\n    \"\"\"\n    Tests behavior with a single runtime dependency and exclusions.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    expected[\"full_compile_jars\"] = [\"processed_spring-boot-starter-oauth2-client-3.3.11.jar\"]\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nsingle_runtime_dep_with_exclusions_test = unittest.make(_test_single_runtime_dep_with_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"slf4j\",\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_one_compile_one_runtime_dep(ctx):\n    \"\"\"\n    Tests behavior with exactly one compile dep and one runtime dep.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\none_compile_one_runtime_dep_test = unittest.make(_test_one_compile_one_runtime_dep, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_path_patterns_with_special_characters(ctx):\n    \"\"\"\n    Tests behavior with path patterns containing special characters.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\npath_patterns_with_special_characters_test = unittest.make(_test_path_patterns_with_special_characters, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"io.micrometer\",  # Pattern with dot\n            \"to-slf4j\",  # Pattern with hyphen\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\ndef _test_case_sensitive_pattern_matching(ctx):\n    \"\"\"\n    Tests case sensitivity in path pattern matching.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected = compute_expected_jars(ctx)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\ncase_sensitive_pattern_matching_test = unittest.make(_test_case_sensitive_pattern_matching, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"SPRING\",  # Uppercase pattern\n            \"Jackson\", # Mixed case pattern\n            \"HIBERNATE\", # Uppercase pattern\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\n\n\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterCaseSensitivePatternMatchingTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterCaseSensitivePatternMatchingTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testCaseSensitivePatternMatching() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"SPRING\", \"Jackson\", \"HIBERNATE\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterCaseSensitivePatternMatchingTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterCompileDepsOnlyTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterCompileDepsOnlyTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testCompileDepsOnly() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of(\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\"\n        );\n        Set<String> runtimeDepsLabels = Set.of();\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterCompileDepsOnlyTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterEmptyExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterEmptyExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testTransitivesExclusion() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForNoFilteringFiltered();\n\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterEmptyExclusionsTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterExcludeTransitiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterExcludeTransitiveTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testTransitivesExclusion() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForLabelExclusionsFiltered(\n            excludedLabels, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterExcludeTransitiveTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterLabelExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport java.util.HashSet;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterLabelExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testLabelExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForLabelExclusionsFiltered(\n            excludedLabels, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterLabelExclusionsTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithTransitivesTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterMultipleExclusionsWithTransitivesTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testMultipleExclusionsWithTransitives() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        Set<String> excludedPatterns = Set.of(\"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForMultipleExclusionsFiltered(\n            excludedLabels, excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterMultipleExclusionsWithTransitivesTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithoutTransitivesTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterMultipleExclusionsWithoutTransitivesTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testMultipleExclusionsWithoutTransitives() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        Set<String> excludedPatterns = Set.of(\"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForMultipleExclusionsFiltered(\n            excludedLabels, excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterMultipleExclusionsWithoutTransitivesTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterNoFilteringTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterNoFilteringTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testNoFiltering() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForNoFilteringFiltered();\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterNoFilteringTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterOneCompileOneRuntimeDepTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterOneCompileOneRuntimeDepTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testOneCompileOneRuntimeDep() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of(\"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\");\n        Set<String> runtimeDepsLabels = Set.of(\"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\");\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterOneCompileOneRuntimeDepTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterPathBasedExclusionsComprehensiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathBasedExclusionsComprehensiveTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathBasedExclusionsComprehensive() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"micrometer\", \"slf4j\", \"logback\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterPathBasedExclusionsComprehensiveTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterPathExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"micrometer\", \"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterPathExclusionsTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterPathExclusionsWithTransitivesTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathExclusionsWithTransitivesTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathExclusionsWithTransitives() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"micrometer\", \"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterPathExclusionsWithTransitivesTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterPathPatternsWithSpecialCharactersTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathPatternsWithSpecialCharactersTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathPatternsWithSpecialCharacters() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"io.micrometer\", \"to-slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterPathPatternsWithSpecialCharactersTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterRuntimeDepsOnlyTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterRuntimeDepsOnlyTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testRuntimeDepsOnly() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of();\n        Set<String> runtimeDepsLabels = Set.of(\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\"\n        );\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterRuntimeDepsOnlyTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterSingleDepWithExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterSingleDepWithExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testSingleDepWithExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> depsLabels = Set.of(\"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\");\n        Set<String> runtimeDepsLabels = Set.of();\n        Set<String> excludedLabels = Set.of(\"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\");\n        Set<String> excludedPatterns = Set.of();\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterSingleDepWithExclusionsTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/src/test/java/com/depsfilter/DepsFilterSingleRuntimeDepWithExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterSingleRuntimeDepWithExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testSingleRuntimeDepWithExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of();\n        Set<String> runtimeDepsLabels = Set.of(\"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\");\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of(\"slf4j\");\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime/DepsFilterSingleRuntimeDepWithExclusionsTest.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:deps_filter.bzl\", \"deps_filter\")\nload(\n    \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library:compile_and_runtime_test.bzl\",\n    \"no_filtering_test\",\n    \"with_label_exclusions_test\",\n    \"with_label_exclusions_with_exclude_transitives_test\",\n    \"with_path_exclusions_test\",\n    \"with_path_exclusions_with_exclude_transitives_test\",\n    \"multiple_exclusions_with_exclude_transitives_test\",\n    \"multiple_exclusions_without_exclude_transitives_test\",\n    \"empty_exclusion_lists_test\",\n    \"path_based_exclusions_comprehensive_test\",\n    \"runtime_deps_only_A_test\",\n    \"runtime_deps_only_B_test\",\n    \"single_runtime_dep_with_exclusions_A_test\",\n    \"single_runtime_dep_with_exclusions_B_test\",\n    \"compile_deps_only_test\",\n    \"single_dep_with_exclusions_test\",\n    \"one_compile_one_runtime_dep_test\",\n    \"path_patterns_with_special_characters_test\",\n    \"case_sensitive_pattern_matching_test\",\n)\n\ndeps = [\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\", \n    \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n    \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n    \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n]\n\nruntime_deps = [\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n]\n\ntest_deps = [\n    \"@unmanaged_deps_filter//:junit_junit\",\n    \"@unmanaged_deps_filter//:org_assertj_assertj_core\",\n]\n\n# Setup libraries for testing\njava_library(\n    name = \"base_lib_with_deps_and_runtime_deps\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = deps,\n    runtime_deps = runtime_deps,\n)\n\njava_library(\n    name = \"base_lib_with_deps\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = deps,\n)\n\njava_library(\n    name = \"base_lib_with_runtime_deps\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    runtime_deps = runtime_deps,\n)\n\njava_library(\n    name = \"base_lib_with_single_dep_and_runtime_dep\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n    ],\n    runtime_deps = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n    ],\n)\n\njava_library(\n    name = \"base_lib_with_single_dep\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n    ],\n)\n\njava_library(\n    name = \"base_lib_with_single_runtime_dep\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    runtime_deps = [\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n    ],\n)\n\n# Test 1: No filtering - baseline test\ndeps_filter(\n    name = \"no_filtering\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n)\n\nno_filtering_test(\n    name = \"no_filtering_test\",\n    filtered = \":no_filtering\",\n)\n\njava_test(\n    name = \"DepsFilterNoFilteringTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterNoFilteringTest.java\"\n    ],\n    deps = [\":no_filtering\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 2: Label-based exclusions without transitives\ndeps_filter(\n    name = \"with_label_exclusions\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n)\n\nwith_label_exclusions_test(\n    name = \"with_label_exclusions_test\",\n    filtered = \":with_label_exclusions\",\n)\n\njava_test(\n    name = \"DepsFilterLabelExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterLabelExclusionsTest.java\"\n    ],\n    deps = [\":with_label_exclusions\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 3: Label-based exclusions with exclude_transitives\ndeps_filter(\n    name = \"with_label_exclusions_with_exclude_transitives\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    exclude_transitives = True,\n)\n\nwith_label_exclusions_with_exclude_transitives_test(\n    name = \"with_label_exclusions_with_exclude_transitives_test\",\n    filtered = \":with_label_exclusions_with_exclude_transitives\",\n)\n\njava_test(\n    name = \"DepsFilterExcludeTransitiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterExcludeTransitiveTest.java\"\n    ],\n    deps = [\":with_label_exclusions_with_exclude_transitives\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 4: Path-based exclusions without transitives\ndeps_filter(\n    name = \"with_path_exclusions\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\"\n    ],\n)\n\nwith_path_exclusions_test(\n    name = \"with_path_exclusions_test\",\n    filtered = \":with_path_exclusions\",\n)\n\njava_test(\n    name = \"DepsFilterPathExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathExclusionsTest.java\"\n    ],\n    deps = [\":with_path_exclusions\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 5: Path-based exclusions with exclude_transitives\ndeps_filter(\n    name = \"with_path_exclusions_with_exclude_transitives\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\"\n    ],\n    exclude_transitives = True,\n)\n\nwith_path_exclusions_with_exclude_transitives_test(\n    name = \"with_path_exclusions_with_exclude_transitives_test\",\n    filtered = \":with_path_exclusions_with_exclude_transitives\",\n)\n\njava_test(\n    name = \"DepsFilterPathExclusionsWithTransitivesTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathExclusionsWithTransitivesTest.java\"\n    ],\n    deps = [\":with_path_exclusions_with_exclude_transitives\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 6: Multiple exclusions with exclude_transitives (labels + patterns)\ndeps_filter(\n    name = \"multiple_exclusions_with_exclude_transitives\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    deps_exclude_paths = [\n        \"slf4j\"\n    ],\n    exclude_transitives = True,\n)\n\nmultiple_exclusions_with_exclude_transitives_test(\n    name = \"multiple_exclusions_with_exclude_transitives_test\",\n    filtered = \":multiple_exclusions_with_exclude_transitives\",\n)\n\njava_test(\n    name = \"DepsFilterMultipleExclusionsWithTransitivesTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithTransitivesTest.java\"\n    ],\n    deps = [\":multiple_exclusions_with_exclude_transitives\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 7: Multiple exclusions without exclude_transitives (labels + patterns)\ndeps_filter(\n    name = \"multiple_exclusions_without_exclude_transitives\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n    ],\n    deps_exclude_paths = [\n        \"slf4j\",\n    ],\n    exclude_transitives = True,\n)\n\nmultiple_exclusions_without_exclude_transitives_test(\n    name = \"multiple_exclusions_without_exclude_transitives_test\",\n    filtered = \":multiple_exclusions_without_exclude_transitives\",\n)\n\njava_test(\n    name = \"DepsFilterMultipleExclusionsWithoutTransitivesTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithoutTransitivesTest.java\"\n    ],\n    deps = [\":multiple_exclusions_without_exclude_transitives\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 8: Empty exclusion lists\ndeps_filter(\n    name = \"empty_exclusion_lists\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\nempty_exclusion_lists_test(\n    name = \"empty_exclusion_lists_test\",\n    filtered = \":empty_exclusion_lists\",\n)\n\njava_test(\n    name = \"DepsFilterEmptyExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterEmptyExclusionsTest.java\"\n    ],\n    deps = [\":empty_exclusion_lists\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 9: Comprehensive path-based exclusions\ndeps_filter(\n    name = \"path_based_exclusions_comprehensive\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"micrometer\",\n        \"slf4j\",\n        \"logback\"\n    ],\n    exclude_transitives = False,\n)\n\npath_based_exclusions_comprehensive_test(\n    name = \"path_based_exclusions_comprehensive_test\",\n    filtered = \":path_based_exclusions_comprehensive\",\n)\n\njava_test(\n    name = \"DepsFilterPathBasedExclusionsComprehensiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathBasedExclusionsComprehensiveTest.java\"\n    ],\n    deps = [\":path_based_exclusions_comprehensive\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 10.A: Runtime deps only\ndeps_filter(\n    name = \"runtime_deps_only_A\",\n    runtime_deps = [\":base_lib_with_runtime_deps\"],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\nruntime_deps_only_A_test(\n    name = \"runtime_deps_only_A_test\",\n    filtered = \":runtime_deps_only_A\",\n)\n\njava_test(\n    name = \"DepsFilterRuntimeDepsOnlyATest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterRuntimeDepsOnlyATest.java\"\n    ],\n    deps = [\":runtime_deps_only_A\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 10.B: Runtime deps only\ndeps_filter(\n    name = \"runtime_deps_only_B\",\n    deps = [\":base_lib_with_runtime_deps\"],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\nruntime_deps_only_B_test(\n    name = \"runtime_deps_only_B_test\",\n    filtered = \":runtime_deps_only_B\",\n)\n\njava_test(\n    name = \"DepsFilterRuntimeDepsOnlyBTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterRuntimeDepsOnlyBTest.java\"\n    ],\n    deps = [\":runtime_deps_only_B\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 11.A: Single runtime dependency with exclusions\ndeps_filter(\n    name = \"single_runtime_dep_with_exclusions_A\",\n    runtime_deps = [\":base_lib_with_single_runtime_dep\",], \n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"slf4j\",\n    ],\n    exclude_transitives = False,\n)\n\nsingle_runtime_dep_with_exclusions_A_test(\n    name = \"single_runtime_dep_with_exclusions_test_A\",\n    filtered = \":single_runtime_dep_with_exclusions_A\",\n)\n\njava_test(\n    name = \"DepsFilterSingleRuntimeDepWithExclusionsATest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterSingleRuntimeDepWithExclusionsATest.java\"\n    ],\n    deps = [\":single_runtime_dep_with_exclusions_A\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 11.B: Single runtime dependency with exclusions\ndeps_filter(\n    name = \"single_runtime_dep_with_exclusions_B\",\n    deps = [\":base_lib_with_single_runtime_dep\",], \n    # runtime_deps = [],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"slf4j\",\n    ],\n    exclude_transitives = False,\n)\n\nsingle_runtime_dep_with_exclusions_B_test(\n    name = \"single_runtime_dep_with_exclusions_test_B\",\n    filtered = \":single_runtime_dep_with_exclusions_B\",\n)\n\njava_test(\n    name = \"DepsFilterSingleRuntimeDepWithExclusionsBTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterSingleRuntimeDepWithExclusionsBTest.java\"\n    ],\n    deps = [\":single_runtime_dep_with_exclusions_B\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 12: Compile deps only\ndeps_filter(\n    name = \"compile_deps_only\",\n    deps = [\":base_lib_with_deps\"],\n    runtime_deps = [],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\ncompile_deps_only_test(\n    name = \"compile_deps_only_test\",\n    filtered = \":compile_deps_only\",\n)\n\njava_test(\n    name = \"DepsFilterCompileDepsOnlyTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterCompileDepsOnlyTest.java\"\n    ],\n    deps = [\":compile_deps_only\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 13: Single dependency with exclusions\ndeps_filter(\n    name = \"single_dep_with_exclusions\",\n    deps = [\":base_lib_with_single_dep\"],\n    runtime_deps = [],\n    deps_exclude_labels = [\n        \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n    ],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\nsingle_dep_with_exclusions_test(\n    name = \"single_dep_with_exclusions_test\",\n    filtered = \":single_dep_with_exclusions\",\n)\n\njava_test(\n    name = \"DepsFilterSingleDepWithExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterSingleDepWithExclusionsTest.java\"\n    ],\n    deps = [\":single_dep_with_exclusions\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 14: One compile dep and one runtime dep\ndeps_filter(\n    name = \"one_compile_one_runtime_dep\",\n    deps = [\":base_lib_with_single_dep_and_runtime_dep\"],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [],\n    exclude_transitives = False,\n)\n\none_compile_one_runtime_dep_test(\n    name = \"one_compile_one_runtime_dep_test\",\n    filtered = \":one_compile_one_runtime_dep\",\n)\n\njava_test(\n    name = \"DepsFilterOneCompileOneRuntimeDepTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterOneCompileOneRuntimeDepTest.java\"\n    ],\n    deps = [\":one_compile_one_runtime_dep\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 15: Path patterns with special characters\ndeps_filter(\n    name = \"path_patterns_with_special_characters\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n    deps_exclude_paths = [\n        \"io.micrometer\",  \n        \"to-slf4j\", \n    ],\n    exclude_transitives = True,\n)\n\npath_patterns_with_special_characters_test(\n    name = \"path_patterns_with_special_characters_test\",\n    filtered = \":path_patterns_with_special_characters\",\n)\n\njava_test(\n    name = \"DepsFilterPathPatternsWithSpecialCharactersTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterPathPatternsWithSpecialCharactersTest.java\"\n    ],\n    deps = [\":path_patterns_with_special_characters\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Test 16: Case sensitive pattern matching\ndeps_filter(\n    name = \"case_sensitive_pattern_matching\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n    deps_exclude_labels = [],\n    deps_exclude_paths = [\n        \"SPRING\",  # Uppercase pattern\n        \"Jackson\", # Mixed case pattern\n        \"HIBERNATE\", # Uppercase pattern\n    ],\n    exclude_transitives = False,\n)\n\ncase_sensitive_pattern_matching_test(\n    name = \"case_sensitive_pattern_matching_test\",\n    filtered = \":case_sensitive_pattern_matching\",\n)\n\njava_test(\n    name = \"DepsFilterCaseSensitivePatternMatchingTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterCaseSensitivePatternMatchingTest.java\"\n    ],\n    deps = [\":case_sensitive_pattern_matching\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n\n# Toolchain for unittest\ntoolchain(\n    name = \"unittest_toolchain\",\n    toolchain_type = \"@bazel_skylib//toolchains/unittest:toolchain_type\",\n    toolchain = \"@bazel_skylib//toolchains/unittest:toolchain\",\n)\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/compile_and_runtime_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\",\n        \"compute_expected_jars\",\n)\n\n\ndef _test_no_filtering(ctx):\n    \"\"\"\n    Tests deps without any filtering - baseline test.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_jars_and_dropped_counts(env, expected, \n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n\n    return unittest.end(env)\n\nno_filtering_test = unittest.make(_test_no_filtering, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n})\n\n\ndef _test_with_label_exclusions(ctx):\n    \"\"\"\n    Tests deps with label-based exclusions (without transitives).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Verify dropped counts - label exclusions should drop direct JARs but not transitives when exclude_transitives=False\n    dropped_counts = {\n        \"compile_jars_dropped\": expected[\"compile_jars_dropped\"],\n        \"full_compile_jars_dropped\": expected[\"full_compile_jars_dropped\"],\n        \"transitive_compile_jars_dropped\": expected[\"transitive_compile_jars_dropped\"],\n        \"transitive_runtime_jars_dropped\": expected[\"transitive_runtime_jars_dropped\"],\n    }\n    verify_dropped_counts(env, expected, \n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n\n    return unittest.end(env)\n\nwith_label_exclusions_test = unittest.make(_test_with_label_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n            \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_with_label_exclusions_with_exclude_transitives(ctx):\n    \"\"\"\n    Tests deps with label-based exclusions including exclude_transitives.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_jars_and_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n\n    return unittest.end(env)\n\nwith_label_exclusions_with_exclude_transitives_test = unittest.make(_test_with_label_exclusions_with_exclude_transitives, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n            \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\n\ndef _test_with_path_exclusions(ctx):\n    \"\"\"\n    Tests deps with path-based exclusions (without transitives).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nwith_path_exclusions_test = unittest.make(_test_with_path_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [        \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"micrometer\",\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\n\ndef _test_with_path_exclusions_with_exclude_transitives(ctx):\n    \"\"\"\n    Tests deps with path-based exclusions including exclude_transitives.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n    \n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nwith_path_exclusions_with_exclude_transitives_test = unittest.make(_test_with_path_exclusions_with_exclude_transitives, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [        \n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"micrometer\",\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\ndef _test_multiple_exclusions_with_exclude_transitives(ctx):\n    \"\"\"\n    Tests multiple exclusion types (labels + paths) with exclude_transitives=True.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nmultiple_exclusions_with_exclude_transitives_test = unittest.make(_test_multiple_exclusions_with_exclude_transitives, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\ndef _test_multiple_exclusions_without_exclude_transitives(ctx):\n    \"\"\"\n    Tests multiple exclusion types (labels + paths) with exclude_transitives=False.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nmultiple_exclusions_without_exclude_transitives_test = unittest.make(_test_multiple_exclusions_without_exclude_transitives, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\",\n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"slf4j\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_path_based_exclusions_comprehensive(ctx):\n    \"\"\"\n    Tests comprehensive path-based exclusions with various patterns.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Additional verification: ensure excluded patterns are not present\n    transitive_runtime_jars = [jar.basename for jar in javainfo_filtered.transitive_runtime_jars.to_list()]\n    for pattern in [\"micrometer\", \"slf4j\", \"logback\"]:\n        for jar in transitive_runtime_jars:\n            asserts.true(env, pattern not in jar, \n                \"Excluded pattern '{}' found in JAR: {}\".format(pattern, jar))\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    \n    return unittest.end(env)\n\npath_based_exclusions_comprehensive_test = unittest.make(_test_path_based_exclusions_comprehensive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"micrometer\",\n            \"slf4j\",\n            \"logback\"\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_runtime_deps_only_A(ctx):\n    \"\"\"\n    Tests behavior when only runtime_deps are provided (no deps).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = [],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = [],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Runtime deps should not contribute to compile-time JARs\n    compile_jars = [jar.basename for jar in javainfo_filtered.compile_jars.to_list()]\n    full_compile_jars = [jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()]\n    \n    asserts.equals(env, len(compile_jars), 0, \n        \"Expected no compile JARs when only runtime_deps provided, got: {}\".format(len(compile_jars)))\n\n    # Note: full_compile_jars is not empty because the output_jar is a full_compile_jar\n    asserts.equals(env, len(full_compile_jars), 1, \n        \"Expected no full compile JARs when only runtime_deps provided, got: {}\".format(len(full_compile_jars)))\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\nruntime_deps_only_A_test = unittest.make(_test_runtime_deps_only_A, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_runtime_deps_only_B(ctx):\n    \"\"\"\n    Tests behavior when only runtime_deps are provided (no deps).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\nruntime_deps_only_B_test = unittest.make(_test_runtime_deps_only_B, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_single_runtime_dep_with_exclusion_A(ctx):\n    \"\"\"\n    Tests behavior with a single runtime dependency and exclusions.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_single_runtime_dep\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = [],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = [],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n\n    # Runtime deps should not contribute to compile-time JARs\n    compile_jars = [jar.basename for jar in javainfo_filtered.compile_jars.to_list()]\n    full_compile_jars = [jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()]\n    \n    asserts.equals(env, len(compile_jars), 0, \n        \"Expected no compile JARs when only runtime_deps provided, got: {}\".format(len(compile_jars)))\n\n    # Note: full_compile_jars is not empty because the output_jar is a full_compile_jar\n    asserts.equals(env, len(full_compile_jars), 1, \n        \"Expected no full compile JARs when only runtime_deps provided, got: {}\".format(len(full_compile_jars)))\n    \n    \n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nsingle_runtime_dep_with_exclusions_A_test = unittest.make(_test_single_runtime_dep_with_exclusion_A, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"slf4j\",\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_single_runtime_dep_with_exclusions_B(ctx):\n    \"\"\"\n    Tests behavior with a single runtime dependency and exclusions.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_single_runtime_dep\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nsingle_runtime_dep_with_exclusions_B_test = unittest.make(_test_single_runtime_dep_with_exclusions_B, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"slf4j\",\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\n\ndef _test_compile_deps_only(ctx):\n    \"\"\"\n    Tests behavior when only deps are provided (no runtime_deps).\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    # Compile deps should contribute to both compile and runtime JARs\n    compile_jars = [jar.basename for jar in javainfo_filtered.compile_jars.to_list()]\n    transitive_runtime_jars = [jar.basename for jar in javainfo_filtered.transitive_runtime_jars.to_list()]\n    \n    asserts.true(env, len(compile_jars) > 0, \n        \"Expected compile JARs when deps provided, got: {}\".format(len(compile_jars)))\n    asserts.true(env, len(transitive_runtime_jars) > 0, \n        \"Expected transitive runtime JARs when deps provided, got: {}\".format(len(transitive_runtime_jars)))\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\ncompile_deps_only_test = unittest.make(_test_compile_deps_only, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_single_dep_with_exclusions(ctx):\n    \"\"\"\n    Tests behavior with a single dependency and exclusions.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_single_dep\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\nsingle_dep_with_exclusions_test = unittest.make(_test_single_dep_with_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n        ],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_one_compile_one_runtime_dep(ctx):\n    \"\"\"\n    Tests behavior with exactly one compile dep and one runtime dep.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_single_dep_and_runtime_dep\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\none_compile_one_runtime_dep_test = unittest.make(_test_one_compile_one_runtime_dep, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\ndef _test_path_patterns_with_special_characters(ctx):\n    \"\"\"\n    Tests behavior with path patterns containing special characters.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \">0\",\n                          expected_transitive_runtime_dropped = \">0\")\n    return unittest.end(env)\n\npath_patterns_with_special_characters_test = unittest.make(_test_path_patterns_with_special_characters, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"io.micrometer\",  # Pattern with dot\n            \"to-slf4j\",  # Pattern with hyphen\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = True,\n    ),\n})\n\ndef _test_case_sensitive_pattern_matching(ctx):\n    \"\"\"\n    Tests case sensitivity in path pattern matching.\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    test_lib_name = \"base_lib_with_deps_and_runtime_deps\"\n    expected = compute_expected_jars(ctx, test_lib_name)\n\n    verify_runtime_and_compile_jars(\n        ctx, env, javainfo_filtered,\n        expected_compile_jars = expected[\"compile_jars\"],\n        expected_full_compile_jars = expected[\"full_compile_jars\"],\n        expected_transitive_compile_jars = expected[\"transitive_compile_jars\"],\n        expected_transitive_runtime_jars = expected[\"transitive_runtime_jars\"],\n    )\n    \n    verify_dropped_counts(env, expected,\n                          expected_compile_dropped = \"0\",\n                          expected_full_compile_dropped = \"0\",\n                          expected_transitive_compile_dropped = \"0\",\n                          expected_transitive_runtime_dropped = \"0\")\n    return unittest.end(env)\n\ncase_sensitive_pattern_matching_test = unittest.make(_test_case_sensitive_pattern_matching, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n    \"deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"runtime_deps_labels\": attr.label_list(\n        default = [\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n        ],\n        providers = [JavaInfo],\n    ),\n    \"deps_exclude_labels\": attr.label_list(\n        default = [],\n    ),\n    \"deps_exclude_paths\": attr.string_list( \n        default = [\n            \"SPRING\",  # Uppercase pattern\n            \"Jackson\", # Mixed case pattern\n            \"HIBERNATE\", # Uppercase pattern\n        ],\n    ),\n    \"exclude_transitives\": attr.bool(\n        default = False,\n    ),\n})\n\n\n\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/main/java/com/depsfilter/A.java",
    "content": "package com.depsfilter;\n\npublic class A {\n    int a;\n    public A() {\n        a = 1;\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterCaseSensitivePatternMatchingTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterCaseSensitivePatternMatchingTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testCaseSensitivePatternMatching() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"SPRING\", \"Jackson\", \"HIBERNATE\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterCaseSensitivePatternMatchingTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterCompileDepsOnlyTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterCompileDepsOnlyTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testCompileDepsOnly() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of(\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n            \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n            \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n            \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\"\n        );\n        Set<String> runtimeDepsLabels = Set.of();\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterCompileDepsOnlyTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterEmptyExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterEmptyExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testEmptyExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForNoFilteringFiltered();\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterEmptyExclusionsTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterExcludeTransitiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterExcludeTransitiveTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testExcludeTransitive() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForLabelExclusionsFiltered(\n            excludedLabels, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterExcludeTransitiveTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterLabelExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport java.util.HashSet;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterLabelExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testLabelExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForLabelExclusionsFiltered(\n            excludedLabels, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterLabelExclusionsTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithTransitivesTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterMultipleExclusionsWithTransitivesTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testMultipleExclusionsWithTransitives() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        Set<String> excludedPatterns = Set.of(\"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForMultipleExclusionsFiltered(\n            excludedLabels, excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterMultipleExclusionsWithTransitivesTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithoutTransitivesTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterMultipleExclusionsWithoutTransitivesTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testMultipleExclusionsWithoutTransitives() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\",\n            \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n        );\n        Set<String> excludedPatterns = Set.of(\"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForMultipleExclusionsFiltered(\n            excludedLabels, excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterMultipleExclusionsWithoutTransitivesTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterNoFilteringTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterNoFilteringTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testNoFiltering() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForNoFilteringFiltered();\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterNoFilteringTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterOneCompileOneRuntimeDepTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterOneCompileOneRuntimeDepTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testOneCompileOneRuntimeDep() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> depsLabels = Set.of(\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\"\n        );\n        Set<String> runtimeDepsLabels = Set.of(\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\"\n        );\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterOneCompileOneRuntimeDepTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_single_dep_and_runtime_dep.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterPathBasedExclusionsComprehensiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathBasedExclusionsComprehensiveTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathBasedExclusionsComprehensive() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"micrometer\", \"slf4j\", \"logback\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterPathBasedExclusionsComprehensiveTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterPathExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"micrometer\", \"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, false);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterPathExclusionsTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterPathExclusionsWithTransitivesTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathExclusionsWithTransitivesTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathExclusionsWithTransitives() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"micrometer\", \"slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterPathExclusionsWithTransitivesTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterPathPatternsWithSpecialCharactersTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterPathPatternsWithSpecialCharactersTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testPathPatternsWithSpecialCharacters() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> excludedPatterns = Set.of(\"io.micrometer\", \"to-slf4j\");\n        \n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForPathExclusionsFiltered(\n            excludedPatterns, true);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterPathPatternsWithSpecialCharactersTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_deps_and_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterRuntimeDepsOnlyATest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterRuntimeDepsOnlyATest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testRuntimeDepsOnly() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of();\n        Set<String> runtimeDepsLabels = Set.of(\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\"\n        );\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterRuntimeDepsOnlyATest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_runtime_deps.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterRuntimeDepsOnlyBTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterRuntimeDepsOnlyBTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testRuntimeDepsOnly() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of();\n        Set<String> runtimeDepsLabels = Set.of(\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\"\n        );\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterRuntimeDepsOnlyBTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_runtime_deps.jar\");\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterSingleDepWithExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterSingleDepWithExclusionsTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testSingleDepWithExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n        \n        Set<String> depsLabels = Set.of(\n            \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\"\n        );\n        Set<String> runtimeDepsLabels = Set.of();\n        Set<String> excludedLabels = Set.of(\n            \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\"\n        );\n        Set<String> excludedPatterns = Set.of();\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterSingleDepWithExclusionsTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_single_dep.jar\");\n\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterSingleRuntimeDepWithExclusionsATest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterSingleRuntimeDepWithExclusionsATest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testSingleRuntimeDepWithExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of();\n        Set<String> runtimeDepsLabels = Set.of(\"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\");\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of(\"slf4j\");\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterSingleRuntimeDepWithExclusionsATest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_single_runtime_dep.jar\");\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/src/test/java/com/depsfilter/DepsFilterSingleRuntimeDepWithExclusionsBTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.Set;\nimport org.junit.BeforeClass;\nimport org.junit.Test;\n\npublic class DepsFilterSingleRuntimeDepWithExclusionsBTest {\n\n    @BeforeClass\n    public static void setUp() {\n        DependencyGraphTestConfig.initialize();\n    }\n\n    @Test\n    public void testSingleRuntimeDepWithExclusions() {\n        Set<String> availableDeps = Set.copyOf(DepsFilterTestHelper.computeClasspathDependencies());\n\n        Set<String> depsLabels = Set.of();\n        Set<String> runtimeDepsLabels = Set.of(\"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\");\n        Set<String> excludedLabels = Set.of();\n        Set<String> excludedPatterns = Set.of(\"slf4j\");\n        boolean excludeTransitives = false;\n\n        Set<String> expectedRuntimeDeps = DependencyGraphTestConfig.getExpectedJarsForCustomDepsFiltered(\n            depsLabels, runtimeDepsLabels, excludedLabels, excludedPatterns, excludeTransitives);\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/DepsFilterSingleRuntimeDepWithExclusionsBTest.jar\");\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime_through_java_library/libbase_lib_with_single_runtime_dep.jar\");\n        assertThat(availableDeps).isEqualTo(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:deps_filter.bzl\", \"deps_filter\")\nload(\n    \"//springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1:compile_and_runtime_test.bzl\",\n    \"no_filtering_test\",\n    \"filtered_deps_test\",\n    \"filtered_deps_exclude_transitive_test\",\n    \"path_based_exclusions_test\",\n    \"interface_implementation_jars_test\",\n    \"multiple_exclusions_with_transitive_test\",\n    \"multiple_exclusions_without_transitive_test\",\n    \"empty_exclusion_lists_test\",\n    \"multiple_paths_test\",\n)\n\n# Dependency Graph Structure:\n\n#        base_lib      \n#        /       \\  \n#      A (c)    G (r)\n#      /  \\        |\n#     /   \\        |\n#    /     \\       |\n#   B (c)  E (r)  /\n#   |      |     /\n#   |      |   /\n#   |    F (c)\n#    \\   /\n#    C (c)\n#     | \n#    D (r)   \n\njava_library(\n    name = \"lib_a\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\n        \":lib_b\",  # A -> B (c)\n    ],\n    runtime_deps = [\n        \":lib_e\",  # A -> E (r)\n    ],\n)\n\njava_library(\n    name = \"lib_b\",\n    srcs = [\"src/main/java/com/depsfilter/B.java\"],  \n    deps = [\":lib_c\"], # B -> C (c)\n)\n\njava_library(\n    name = \"lib_c\",\n    srcs = [\"src/main/java/com/depsfilter/C.java\"],\n    runtime_deps = [\":lib_d\"], # C -> D (r)\n)\n\njava_library(\n    name = \"lib_d\",\n    srcs = [\"src/main/java/com/depsfilter/D.java\"], \n)\n\njava_library(\n    name = \"lib_e\",\n    srcs = [\"src/main/java/com/depsfilter/E.java\"],\n    deps = [\":lib_f\"], # E -> F (c)\n)\n\njava_library(\n    name = \"lib_f\",\n    srcs = [\"src/main/java/com/depsfilter/F.java\"],\n    deps = [\":lib_c\"], # F -> C (c)\n)\n\njava_library(\n    name = \"lib_g\",\n    srcs = [\"src/main/java/com/depsfilter/G.java\"],\n    deps = [\":lib_f\"], # G -> F (c)\n)\n\n# Consumer library that uses the filtered dependencies\njava_library(\n    name = \"base_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":lib_a\"], # base_lib -> A (c)\n    runtime_deps = [\":lib_g\"], # base_lib -> G (r)\n)\n\n# Test 1: No filtering\ndeps_filter(\n    name = \"filtered_deps\",\n    deps = [\":base_lib\"],\n)\n\nno_filtering_test(\n    name = \"deps_filter_no_filtering_test\",\n    java_library = \":base_lib\",\n    deps_filter = \":filtered_deps\",\n)\n\n# Test 2: Exclude by labels and exclude_transitives = False\ndeps_filter(\n    name = \"filtered_deps_exclude_b_g\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    filtered = \":filtered_deps_exclude_b_g\",\n)\n\n# Test 3: Exclude by labels and exclude_transitives = True\ndeps_filter(\n    name = \"filtered_deps_exclude_b_g_exclude_transitive\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n    exclude_transitives = True,\n)\n\nfiltered_deps_exclude_transitive_test(\n    name = \"deps_filter_exclude_b_g_exclude_transitive_test\",\n    filtered = \":filtered_deps_exclude_b_g_exclude_transitive\",\n)\n\n# Test 4: Test for path-based exclusions\ndeps_filter(\n    name = \"path_based_filtered_deps\",\n    deps = [\":base_lib\"],\n    deps_exclude_paths = [\"lib_b\", \"lib_f\"],\n)\n\npath_based_exclusions_test(\n    name = \"deps_filter_path_based_exclusions_test\",\n    filtered = \":path_based_filtered_deps\",\n)\n\n# Test 5: Interface vs Implementation JARs\ndeps_filter(\n    name = \"interface_impl_filtered_deps\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ninterface_implementation_jars_test(\n    name = \"deps_filter_interface_impl_test\",\n    filtered = \":interface_impl_filtered_deps\",\n)\n\n# Test 6: Multiple exclusions with exclude_transitives=True\ndeps_filter(\n    name = \"multiple_exclusions_filtered_deps_1\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = True,\n)\n\nmultiple_exclusions_with_transitive_test(\n    name = \"multiple_exclusions_with_transitive_test\",\n    filtered = \":multiple_exclusions_filtered_deps_1\",\n)\n\n# Test 7: Multiple exclusions with exclude_transitives=False\ndeps_filter(\n    name = \"multiple_exclusions_filtered_deps_2\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = False,\n)\n\nmultiple_exclusions_without_transitive_test(\n    name = \"multiple_exclusions_without_transitive_test\",\n    filtered = \":multiple_exclusions_filtered_deps_2\",\n)\n\n# Test 8: Empty exclusion lists\ndeps_filter(\n    name = \"empty_exclusions_filtered_deps\",\n    deps = [\":base_lib\"],\n    deps_exclude_paths = [],\n    deps_exclude_labels = [],\n)\n\nempty_exclusion_lists_test(\n    name = \"deps_filter_empty_exclusions_test\",\n    filtered = \":empty_exclusions_filtered_deps\",\n)\n\n# Test 9: Multiple paths handling\ndeps_filter(\n    name = \"multiple_paths_filtered_deps\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\nmultiple_paths_test(\n    name = \"deps_filter_multiple_paths_test\",\n    filtered = \":multiple_paths_filtered_deps\",\n)\n\ntoolchain(\n    name = \"unittest_toolchain\",\n    toolchain_type = \"@bazel_skylib//toolchains/unittest:toolchain_type\",\n    toolchain = \"@bazel_skylib//toolchains/unittest:toolchain\",\n)\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1/compile_and_runtime_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\"\n)\n\n\ndef _test_no_filtering(ctx):\n    \"\"\"\n    Tests that deps_filter preserves all dependencies when no exclusions are applied.\n    \n    Dependency Graph: \n         base_lib      \n        /       \\\\  \n      A (c)    G (r)\n      /  \\\\       |\n     /    \\\\      |\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)   \n    \n    Expected: All JARs from java_library must match deps_filter:\n        - full_compile_jars: Implementation JARs (e.g., liblib_a.jar)\n        - compile_jars: Interface JARs (e.g., liblib_a-hjar.jar)\n        - transitive_compile_time_jars: Interface JARs from transitive deps\n        - transitive_runtime_jars: Implementation JARs from transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    java_lib_info = ctx.attr.java_library[JavaInfo]\n    deps_filter_info = ctx.attr.deps_filter[JavaInfo]\n    \n    # Verify all JAR fields match between java_library and deps_filter\n    jar_fields = [\n        \"full_compile_jars\",              # Implementation JARs\n        \"compile_jars\",                   # Interface JARs\n        \"transitive_compile_time_jars\",   # Transitive interface JARs\n        \"transitive_runtime_jars\"         # Transitive implementation JARs\n    ]\n\n    for jar_field in jar_fields:\n        java_lib_jars = getattr(java_lib_info, jar_field)\n        deps_filter_jars = getattr(deps_filter_info, jar_field)\n        asserts.equals(env, type(java_lib_jars), type(deps_filter_jars), \n            \"JAR type mismatch: {} vs deps_filter\".format(jar_field))\n        asserts.equals(env, java_lib_jars.to_list(), deps_filter_jars.to_list(),\n            \"JAR contents mismatch: {} vs deps_filter\".format(jar_field))\n\n    return unittest.end(env)\n\nno_filtering_test = unittest.make(_test_no_filtering, attrs = {\n    \"java_library\": attr.label(providers = [JavaInfo]),\n    \"deps_filter\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps(ctx):\n    \"\"\"\n    Tests basic dependency filtering with label-based exclusions.\n    \n    Dependency Graph:\n         base_lib      \n        /       \\\\  \n      A (c)    G (r)\n      /  \\\\       |\n     /    \\\\      |\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)   \n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: base_lib, A, E, F, C, D\n        JARs excluded: B, G (by label, direct deps only, transitives preserved)\n        \n        Compile-time JARs: base_lib-hjar, A-hjar, C-hjar\n        Runtime JARs: base_lib, A, E, F, C, D (all preserved deps + transitives)\n        Reasoning: B,G excluded by label, but their transitives (C,D,F) are preserved\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n\n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_test = unittest.make(_test_filtered_deps, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps_exclude_transitive(ctx):\n    \"\"\"\n    Tests dependency filtering with transitive exclusions.\n    \n    Dependency Graph:\n         base_lib      \n        /       \\\\  \n      A (c)    G (r)\n      /  \\\\       |\n     /    \\\\      |\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)   \n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved: base_lib, A, E\n        JARs excluded: B, G (by label) and all their transitives\n        \n        Compile-time JARs: base_lib-hjar, A-hjar\n        Runtime JARs: base_lib, A, E (only preserved deps, no transitives of excluded deps)\n        Reasoning: B,G excluded by label with exclude_transitives=True, so C,D,F also excluded\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_exclude_transitive_test = unittest.make(_test_filtered_deps_exclude_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_path_based_exclusions(ctx):\n    \"\"\"\n    Tests filtering based on path patterns in deps_exclude_paths.\n    \n    Dependency Graph:\n         base_lib      \n        /       \\\\  \n      A (c)    G (r)\n      /  \\\\       |\n     /    \\\\      |\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)   \n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = [\"lib_b\", \"lib_f\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: base_lib, A, E, C, D, G\n        JARs excluded: B, F (by path pattern match, transitives may be preserved)\n        \n        Compile-time JARs: base_lib-hjar, A-hjar, C-hjar\n        Runtime JARs: base_lib, A, E, C, D, G (all preserved deps + transitives not matching exclusion path patterns)\n        Reasoning: B,F excluded by path pattern, but their transitives are preserved as they didn't match the pattern. \n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\npath_based_exclusions_test = unittest.make(_test_path_based_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_interface_implementation_jars(ctx):\n    \"\"\"\n    Tests proper handling of interface (-hjar) and implementation JARs.\n    \n    Dependency Graph:\n         base_lib      \n        /       \\\\  \n      A (c)    G (r)\n      /  \\\\       |\n     /    \\\\      |\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)   \n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        compile_jars: libbase_lib-hjar.jar\n        full_compile_jars: libbase_lib.jar\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    compile_jars = sorted([jar.basename for jar in javainfo_filtered.compile_jars.to_list()])\n    full_compile_jars = sorted([jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()])\n    \n    expected_compile_jars = [\"libbase_lib-hjar.jar\"]\n    expected_full_compile_jars = [\"libbase_lib.jar\"]\n    \n    asserts.equals(env, compile_jars, expected_compile_jars)\n    asserts.equals(env, full_compile_jars, expected_full_compile_jars)\n    return unittest.end(env)\n\ninterface_implementation_jars_test = unittest.make(_test_interface_implementation_jars, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_exclusions_with_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=True.\n    \n    Dependency Graph:\n         base_lib      \n        /       \\\\  \n      A (c)    G (r)\n      /  \\\\       |\n     /    \\\\      |\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)   \n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved: base_lib, A, E, F\n        JARs excluded: B and its transitives; G (not neccessarily its transitives as specified exclusion by path pattern is matched)\n        \n        Compile-time JARs: base_lib-hjar, A-hjar\n        Runtime JARs: base_lib, A, E, F\n        Reasoning: B excluded by label with exclude_transitives=True (C,D excluded); \n                   G excluded by exclusion path pattern (exclusion by path pattern doesn't exclude transitives) \n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\ndef _test_multiple_exclusions_without_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=False.\n    \n    Dependency Graph:\n         base_lib      \n        /       \\\\  \n      A (c)    G (r)\n      /  \\\\       |\n     /    \\\\      |\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)   \n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: base_lib, A, E, F, C, D\n        JARs excluded: B (by label, direct only); G (by path pattern match, direct only)\n        \n        Compile-time JARs: base_lib-hjar, A-hjar, C-hjar\n        Runtime JARs: base_lib, A, E, F, C, D\n        Reasoning: B excluded by label (direct only, and its transitives are preserved); \n                   G excluded by exclusion path pattern (exclusion by path pattern doesn't exclude transitives) \n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_exclusions_with_transitive_test = unittest.make(_test_multiple_exclusions_with_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\nmultiple_exclusions_without_transitive_test = unittest.make(_test_multiple_exclusions_without_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \n    Dependency Graph:\n         base_lib      \n        /       \\\\  \n      A (c)    G (r)\n      /  \\\\       |\n     /    \\\\      |\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)   \n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: base_lib, A, B, C, D, E, F, G\n        \n        Compile-time JARs: base_lib-hjar, A-hjar, B-hjar, C-hjar\n        Runtime JARs: base_lib, A, B, C, D, E, F, G\n        Reasoning: No exclusions applied, all dependencies preserved\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_b.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_b-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_paths(ctx):\n    \"\"\"\n    Tests handling of multiple paths to the same dependency.\n    \n    Dependency Graph:\n         base_lib      \n        /       \\\\  \n      A (c)    G (r)\n      /  \\\\       |\n     /    \\\\      |\n    /      \\\\     |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n    \\\\   /\n    C (c)\n     | \n    D (r)   \n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: base_lib, A, E, F, C, D\n        JARs excluded: B, G (not duplicated if reachable via multiple paths)\n        \n        Compile-time JARs: base_lib-hjar, A-hjar, C-hjar\n        Runtime JARs: base_lib, A, E, F, C, D\n        Reasoning: B,G excluded by label, but transitives are preserved as exclude_transitives = False\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_paths_test = unittest.make(_test_multiple_paths, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/A.java",
    "content": "package com.depsfilter;\n\npublic class A {\n    int a;\n    private B b;\n    // E is a runtime dependency, so no compile-time reference here\n    public A() {\n        a = 1;\n        b = new B();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/B.java",
    "content": "package com.depsfilter;\n\npublic class B {\n    private C c;\n    public B() {\n        c = new C();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/C.java",
    "content": "package com.depsfilter;\n\npublic class C {\n    // D is a runtime dependency, so no compile-time reference here\n    public C() {\n        // No compile-time dependencies\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/D.java",
    "content": "package com.depsfilter;\n\npublic class D {\n    private int value;\n    public D() {\n        value = 4;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/E.java",
    "content": "package com.depsfilter;\n\npublic class E {\n    private F f;\n    public E() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/F.java",
    "content": "package com.depsfilter;\n\npublic class F {\n    private C c;\n    public F() {\n        c = new C();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/G.java",
    "content": "package com.depsfilter;\n\npublic class G {\n    private F f;\n    public G() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_1/src/main/java/com/depsfilter/H.java",
    "content": "package com.depsfilter;\n\npublic class H {\n    private A a;\n    // G is a runtime dependency, so no compile-time reference here\n    public H() {\n        a = new A();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:deps_filter.bzl\", \"deps_filter\")\nload(\n    \"//springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2:compile_and_runtime_test.bzl\",\n    \"filtered_deps_test\",\n    \"filtered_deps_exclude_transitive_test\",\n    \"path_based_exclusions_test\",\n    \"interface_implementation_jars_test\",\n    \"multiple_exclusions_with_transitive_test\",\n    \"multiple_exclusions_without_transitive_test\",\n    \"empty_exclusion_lists_test\",\n    \"multiple_paths_test\",\n)\n\n# Dependency Graph Structure:\n\n#  J(r)    A (c)     H (r)   I (c)  \n#    \\     /  \\        |      |   \n#     \\   /   \\      G (r)    |     \n#      \\ /     \\       |      /\n#       B (c)  E (r)  /     /\n#       |      |     /    /\n#       |      |    /   /\n#       |      |   /  /\n#       |      |  / /\n#       |     F (c)\n#        \\   /\n#        C (c)\n#         | \n#        D (r)   \n\njava_library(\n    name = \"lib_a\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\n        \":lib_b\",  # A -> B (c)\n    ],\n    runtime_deps = [\n        \":lib_e\",  # A -> E (r)\n    ],\n)\n\njava_library(\n    name = \"lib_b\",\n    srcs = [\"src/main/java/com/depsfilter/B.java\"],  \n    deps = [\":lib_c\"], # B -> C (c)\n)\n\njava_library(\n    name = \"lib_c\",\n    srcs = [\"src/main/java/com/depsfilter/C.java\"],\n    runtime_deps = [\":lib_d\"], # C -> D (r)\n)\n\njava_library(\n    name = \"lib_d\",\n    srcs = [\"src/main/java/com/depsfilter/D.java\"], \n)\n\njava_library(\n    name = \"lib_e\",\n    srcs = [\"src/main/java/com/depsfilter/E.java\"],\n    deps = [\":lib_f\"], # E -> F (c)\n)\n\njava_library(\n    name = \"lib_f\",\n    srcs = [\"src/main/java/com/depsfilter/F.java\"],\n    deps = [\":lib_c\"], # F -> C (c)\n)\n\njava_library(\n    name = \"lib_g\",\n    srcs = [\"src/main/java/com/depsfilter/G.java\"],\n    deps = [\":lib_f\"], # G -> F (c)\n)\n\njava_library(\n    name = \"lib_h\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":lib_g\"], # H -> G (r)\n)\n\njava_library(\n    name = \"lib_i\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":lib_f\"], # I -> F (c)\n)\n\njava_library(\n    name = \"lib_j\",\n    srcs = [\"src/main/java/com/depsfilter/J.java\"],\n    deps = [\":lib_b\"], # J -> B (c)\n)\n\n# Test 1: No filtering\n# deps_filter(\n#     name = \"filtered_deps\",\n#     deps = [\":lib_a\", \":lib_i\"],\n#     runtime_deps = [\":lib_h\", \":lib_j\"],\n# )\n#  We can't test this because we can't compare base_lib with deps_filter without base_lib as a dep \n\n# Test 2: Exclude by labels and exclude_transitives = False\ndeps_filter(\n    name = \"filtered_deps_exclude_b_g\",\n    deps = [\":lib_a\", \":lib_i\"],\n    runtime_deps = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    filtered = \":filtered_deps_exclude_b_g\",\n)\n\n# Test 3: Exclude by labels and exclude_transitives = True\ndeps_filter(\n    name = \"filtered_deps_exclude_b_g_exclude_transitive\",\n    deps = [\":lib_a\", \":lib_i\"],\n    runtime_deps = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n    exclude_transitives = True,\n)\n\nfiltered_deps_exclude_transitive_test(\n    name = \"deps_filter_exclude_b_g_exclude_transitive_test\",\n    filtered = \":filtered_deps_exclude_b_g_exclude_transitive\",\n)\n\n# Test 4: Test for path-based exclusions\ndeps_filter(\n    name = \"path_based_filtered_deps\",\n    deps = [\":lib_a\", \":lib_i\"],\n    runtime_deps = [\":lib_h\", \":lib_j\"],\n    deps_exclude_paths = [\"lib_b\", \"lib_f\"],\n)\n\npath_based_exclusions_test(\n    name = \"deps_filter_path_based_exclusions_test\",\n    filtered = \":path_based_filtered_deps\",\n)\n\n# Test 5: Interface vs Implementation JARs\ndeps_filter(\n    name = \"interface_impl_filtered_deps\",\n    deps = [\":lib_a\", \":lib_i\"],\n    runtime_deps = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ninterface_implementation_jars_test(\n    name = \"deps_filter_interface_impl_test\",\n    filtered = \":interface_impl_filtered_deps\",\n)\n\n# Test 6: Multiple exclusions with exclude_transitives=True\ndeps_filter(\n    name = \"multiple_exclusions_filtered_deps_1\",\n    deps = [\":lib_a\", \":lib_i\"],\n    runtime_deps = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = True,\n)\n\nmultiple_exclusions_with_transitive_test(\n    name = \"multiple_exclusions_with_transitive_test\",\n    filtered = \":multiple_exclusions_filtered_deps_1\",\n)\n\n# Test 7: Multiple exclusions with exclude_transitives=False\ndeps_filter(\n    name = \"multiple_exclusions_filtered_deps_2\",\n    deps = [\":lib_a\", \":lib_i\"],\n    runtime_deps = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = False,\n)\n\nmultiple_exclusions_without_transitive_test(\n    name = \"multiple_exclusions_without_transitive_test\",\n    filtered = \":multiple_exclusions_filtered_deps_2\",\n)\n\n# Test 8: Empty exclusion lists\ndeps_filter(\n    name = \"empty_exclusions_filtered_deps\",\n    deps = [\":lib_a\", \":lib_i\"],\n    runtime_deps = [\":lib_h\", \":lib_j\"],\n    deps_exclude_paths = [],\n    deps_exclude_labels = [],\n)\n\nempty_exclusion_lists_test(\n    name = \"deps_filter_empty_exclusions_test\",\n    filtered = \":empty_exclusions_filtered_deps\",\n)\n\n# Test 9: Multiple paths handling\ndeps_filter(\n    name = \"multiple_paths_filtered_deps\",\n    deps = [\":lib_a\", \":lib_i\"],\n    runtime_deps = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\nmultiple_paths_test(\n    name = \"deps_filter_multiple_paths_test\",\n    filtered = \":multiple_paths_filtered_deps\",\n)\n\ntest_deps = [\"@unmanaged_deps_filter//:junit_junit\",\n    \"@unmanaged_deps_filter//:org_assertj_assertj_core\",\n]\n\n# Java test targets\njava_test(\n    name = \"DepsFilterEmptyExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterEmptyExclusionsTest.java\"\n        ],\n    deps = [\":empty_exclusions_filtered_deps\"] + test_deps,\n)\n\njava_test(\n    name = \"DepsFilterFilteredDepsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterFilteredDepsTest.java\"\n    ],\n    deps = [\":filtered_deps_exclude_b_g\"] + test_deps,\n)\n\njava_test(\n    name = \"DepsFilterExcludeTransitiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterExcludeTransitiveTest.java\"\n    ],\n    deps = [\":filtered_deps_exclude_b_g_exclude_transitive\"] + test_deps,\n)\n\njava_test(\n    name = \"DepsFilterPathBasedExclusionsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterPathBasedExclusionsTest.java\"\n    ],\n    deps = [\":path_based_filtered_deps\"] + test_deps,\n)\n\njava_test(\n    name = \"DepsFilterInterfaceImplementationTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterInterfaceImplementationTest.java\"\n    ],\n    deps = [\":interface_impl_filtered_deps\"] + test_deps,\n)\n\njava_test(\n    name = \"DepsFilterMultipleExclusionsWithTransitiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithTransitiveTest.java\"\n    ],\n    deps = [\":multiple_exclusions_filtered_deps_1\"] + test_deps,\n)\n\njava_test(\n    name = \"DepsFilterMultipleExclusionsWithoutTransitiveTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithoutTransitiveTest.java\"\n    ],\n    deps = [\":multiple_exclusions_filtered_deps_2\"] + test_deps,\n)\n\njava_test(\n    name = \"DepsFilterMultiplePathsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterMultiplePathsTest.java\"\n    ],\n    deps = [\":multiple_paths_filtered_deps\"] + test_deps,\n)\n\n\n# load(\"//tools/common/bazel/deps_filter:deps_filter.bzl\", \"deps_filter\")\n# deps_filter(\n#     name = \"flattened_filtered_deps\",\n#     deps = [\":filtered_deps\"],\n# )\n\n# deps_filter(\n#     name = \"flattened_java_libary\",\n#     deps = [\":lib_a\"],\n    # runtime_deps = [\":lib_g\"],\n# )\n\n\ntoolchain(\n    name = \"unittest_toolchain\",\n    toolchain_type = \"@bazel_skylib//toolchains/unittest:toolchain_type\",\n    toolchain = \"@bazel_skylib//toolchains/unittest:toolchain\",\n)\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/compile_and_runtime_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\"\n)\n\n\n# def _test_no_filtering(ctx):\n    # We can't test this because we can't compare base_lib with deps_filter without base_lib as a dep \n\ndef _test_filtered_deps(ctx):\n    \"\"\"\n    Tests basic dependency filtering with label-based exclusions.\n    \n    Dependency Graph:\n\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Input:\n        deps = [\":lib_a\", \":lib_i]\n        runtime_deps = [\":lib_h\", \":lib_j\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: A, I, C, D, E, F, H, J\n        JARs excluded: B, G (by label, direct deps only, transitives preserved)\n        \n        Compile-time JARs: A-hjar, I-hjar, C-hjar, F-hjar\n        Runtime JARs: A, I, C, D, E, F, H, J\n        Reasoning: B,G excluded by label, but their transitives (C,D,F) are preserved\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n\n    expected_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"liblib_a.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_test = unittest.make(_test_filtered_deps, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps_exclude_transitive(ctx):\n    \"\"\"\n    Tests dependency filtering with transitive exclusions.\n    \n    Dependency Graph:\n\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)   E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r)   \n\n    Input:\n        deps = [\":lib_a\", \":lib_i]\n        runtime_deps = [\":lib_h\", \":lib_j\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved: A, I, E, H, J\n        JARs excluded: B, G (by label) and all their transitives\n        \n        Compile-time JARs: A-hjar, I-hjar\n        Runtime JARs: A, I, E, H, J (only preserved deps, no transitives of excluded deps)\n        Reasoning: B,G excluded by label with exclude_transitives=True, so C,D,F also excluded\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n\n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_exclude_transitive_test = unittest.make(_test_filtered_deps_exclude_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_path_based_exclusions(ctx):\n    \"\"\"\n    Tests filtering based on path patterns in deps_exclude_paths.\n    \n    Dependency Graph:\n\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Input:\n        deps = [\":lib_a\", \":lib_i]\n        runtime_deps = [\":lib_h\", \":lib_j\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = [\"lib_b\", \"lib_f\"]\n        exclude_transitives = False\n    ## IMPORTANT_FEATURE\n    Expected Output:\n        JARs preserved: A, I, C, D, E, G, H, J\n        JARs excluded: B, F (by path pattern match, transitives may be preserved)\n        \n        Compile-time JARs: A-hjar, I-hjar, C-hjar\n        Runtime JARs: A, I, C, D, E, G, H, J (all preserved deps + transitives not matching exclusion path patterns)\n        Reasoning: B,F excluded by path pattern, but their transitives are preserved as they didn't match the pattern\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"liblib_a.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_g.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\npath_based_exclusions_test = unittest.make(_test_path_based_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_interface_implementation_jars(ctx):\n    \"\"\"\n    Tests proper handling of interface (-hjar) and implementation JARs.\n    \n    Dependency Graph:\n\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Input:\n        deps = [\":lib_a\", \":lib_i]\n        runtime_deps = [\":lib_h\", \":lib_j\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        compile_jars: liblib_a-hjar.jar, liblib_i-hjar.jar\n        full_compile_jars: liblib_a.jar, liblib_i.jar\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    compile_jars = sorted([jar.basename for jar in javainfo_filtered.compile_jars.to_list()])\n    full_compile_jars = sorted([jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()])\n    \n    expected_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n    ]\n    \n    asserts.equals(env, compile_jars, expected_compile_jars)\n    asserts.equals(env, full_compile_jars, expected_full_compile_jars)\n    return unittest.end(env)\n\ninterface_implementation_jars_test = unittest.make(_test_interface_implementation_jars, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_exclusions_with_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=True.\n    \n    Dependency Graph:\n\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Input:\n        deps = [\":lib_a\", \":lib_i]\n        runtime_deps = [\":lib_h\", \":lib_j\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved: A, I, E, F, H, J\n        JARs excluded: B and its transitives; G (not neccessarily its transitives as specified exclusion by path pattern is matched)\n        \n        Compile-time JARs: A-hjar, I-hjar, F-hjar\n        Runtime JARs: A, I, E, F, H, J\n        Reasoning: B excluded by label with exclude_transitives=True (C,D excluded); \n                   G excluded by exclusion path pattern (exclusion by path pattern doesn't exclude transitives)\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\ndef _test_multiple_exclusions_without_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=False.\n    \n    Dependency Graph:\n\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Input:\n        deps = [\":lib_a\", \":lib_i]\n        runtime_deps = [\":lib_h\", \":lib_j\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: A, I, C, D, E, F, H, J\n        JARs excluded: B (by label, direct only); G (by path pattern match, direct only)\n        \n        Compile-time JARs: A-hjar, I-hjar, C-hjar, F-hjar\n        Runtime JARs: A, I, C, D, E, F, H, J\n        Reasoning: B excluded by label (direct only, and its transitives are preserved); \n                   G excluded by exclusion path pattern (exclusion by path pattern doesn't exclude transitives)\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"liblib_a.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_exclusions_with_transitive_test = unittest.make(_test_multiple_exclusions_with_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\nmultiple_exclusions_without_transitive_test = unittest.make(_test_multiple_exclusions_without_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \n    Dependency Graph:\n\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n\n    Input:\n        deps = [\":lib_a\", \":lib_i]\n        runtime_deps = [\":lib_h\", \":lib_j\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: A, I, B, C, D, E, F, G, H, J\n        \n        Compile-time JARs: A-hjar, I-hjar, B-hjar, C-hjar, F-hjar\n        Runtime JARs: A, I, B, C, D, E, F, G, H, J\n        Reasoning: No exclusions applied, all dependencies preserved\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"liblib_a.jar\",\n        \"liblib_b.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_g.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_b-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_paths(ctx):\n    \"\"\"\n    Tests handling of multiple paths to the same dependency.\n    \n    Dependency Graph:\n\n      J(r)      A (c)     H (r)   I (c)  \n        \\\\      /  \\\\      |       |\n         \\\\    /    \\\\    G (r)    |\n          \\\\  /     \\\\     |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n            \\\\   /\n            C (c)\n             | \n            D (r) \n    # IMPORTANT_FEATURE\n    Input:\n        deps = [\":lib_a\", \":lib_i]\n        runtime_deps = [\":lib_h\", \":lib_j\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved: A, I, C, D, E, F, H, J\n        JARs excluded: B, G (not duplicated if reachable via multiple paths)\n        \n        Compile-time JARs: A-hjar, I-hjar, C-hjar, F-hjar\n        Runtime JARs: A, I, C, D, E, F, H, J\n        Reasoning: B,G excluded by label, but transitives are preserved as exclude_transitives = False\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"liblib_a.jar\",\n        \"liblib_i.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"liblib_a.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_h.jar\",\n        \"liblib_i.jar\",\n        \"liblib_j.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"liblib_a-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_i-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_paths_test = unittest.make(_test_multiple_paths, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/A.java",
    "content": "package com.depsfilter;\n\npublic class A {\n    int a;\n    private B b;\n    // E is a runtime dependency, so no compile-time reference here\n    public A() {\n        a = 1;\n        b = new B();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/B.java",
    "content": "package com.depsfilter;\n\npublic class B {\n    private C c;\n    public B() {\n        c = new C();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/C.java",
    "content": "package com.depsfilter;\n\npublic class C {\n    // D is a runtime dependency, so no compile-time reference here\n    public C() {\n        // No compile-time dependencies\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/D.java",
    "content": "package com.depsfilter;\n\npublic class D {\n    private int value;\n    public D() {\n        value = 4;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/E.java",
    "content": "package com.depsfilter;\n\npublic class E {\n    private F f;\n    public E() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/F.java",
    "content": "package com.depsfilter;\n\npublic class F {\n    private C c;\n    public F() {\n        c = new C();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/G.java",
    "content": "package com.depsfilter;\n\npublic class G {\n    private F f;\n    public G() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/H.java",
    "content": "package com.depsfilter;\n\npublic class H {\n    public H() {\n        int h = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/I.java",
    "content": "package com.depsfilter;\n\npublic class I {\n    private F;\n    public I() {\n        F = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/main/java/com/depsfilter/J.java",
    "content": "package com.depsfilter;\n\npublic class J {\n    private B b;\n    public J() {\n        b = new B();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterEmptyExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterEmptyExclusionsTest {\n\n    @Test\n    public void testTransitivesExclusion() {\n        /*\n            Checkout _test_empty_exclusion_lists in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps\n        List<String> expectedRuntimeDeps = new ArrayList<>(DepsFilterTestHelper.getRuntimeDepsListBeforeExclusions());\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());        \n        // Add test-specific JAR file\n        expectedRuntimeDeps.add(\"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/DepsFilterEmptyExclusionsTest.jar\");\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterExcludeTransitiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterExcludeTransitiveTest {\n\n    @Test\n    public void testTransitivesExclusion() {\n        /*\n            Checkout _test_filtered_deps_exclude_transitive in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/DepsFilterExcludeTransitiveTest.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterFilteredDepsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterFilteredDepsTest {\n\n    @Test\n    public void testFilteredDeps() {\n        /*\n            Checkout _test_filtered_deps in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/DepsFilterFilteredDepsTest.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterInterfaceImplementationTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterInterfaceImplementationTest {\n\n    @Test\n    public void testInterfaceImplementationJars() {\n        /*\n            Checkout _test_interface_implementation_jars in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        // Note: This test uses the same configuration as filtered_deps test\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/DepsFilterInterfaceImplementationTest.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithTransitiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterMultipleExclusionsWithTransitiveTest {\n\n    @Test\n    public void testMultipleExclusionsWithTransitive() {\n        /*\n            Checkout _test_multiple_exclusions_with_transitive in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/DepsFilterMultipleExclusionsWithTransitiveTest.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterMultipleExclusionsWithoutTransitiveTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterMultipleExclusionsWithoutTransitiveTest {\n\n    @Test\n    public void testMultipleExclusionsWithoutTransitive() {\n        /*\n            Checkout _test_multiple_exclusions_without_transitive in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/DepsFilterMultipleExclusionsWithoutTransitiveTest.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterMultiplePathsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterMultiplePathsTest {\n\n    @Test\n    public void testMultiplePaths() {\n        /*\n            Checkout _test_multiple_paths in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/DepsFilterMultiplePathsTest.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterPathBasedExclusionsTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterPathBasedExclusionsTest {\n\n    @Test\n    public void testPathBasedExclusions() {\n        /*\n            Checkout _test_path_based_exclusions in compile_and_runtime_2/compile_and_runtime_test.bzl\n        */\n        // available deps at the runtime\n        List<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n        \n        // expected runtime deps based on bzl file expected_transitive_runtime_jars\n        List<String> expectedRuntimeDeps = new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_g.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_j.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/DepsFilterPathBasedExclusionsTest.jar\"\n        ));\n        \n        // Add test dependencies\n        expectedRuntimeDeps.addAll(DepsFilterTestHelper.getTestDeps());\n\n        // Verify that availableDeps contains exactly the same elements as expectedRuntimeDeps in any order\n        assertThat(availableDeps).containsExactlyInAnyOrderElementsOf(expectedRuntimeDeps);\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/src/test/java/com/depsfilter/DepsFilterTestHelper.java",
    "content": "package com.depsfilter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * Helper class containing common functionality for deps filter tests.\n * Provides shared methods and data that can be used across multiple test classes.\n */\npublic class DepsFilterTestHelper {\n\n    /**\n     * Computes the available dependencies from the current classpath.\n     * @return List of available dependencies with \"../\" prefix removed\n     */\n    public static List<String> computeClasspathDependencies() {\n        String classpath = System.getProperty(\"java.class.path\");\n        String[] classpathEntries = classpath.split(System.getProperty(\"path.separator\"));\n        List<String> availableDeps = new ArrayList<>();\n        for (String entry : classpathEntries) {\n            availableDeps.add(entry.replace(\"../\", \"\"));\n        }\n        return availableDeps;\n    }\n\n    /**\n     * Returns the test dependencies required to run the tests.\n     * These are the dependencies specified in the test target.\n     * @return List of test dependencies\n     */\n    public static List<String> getTestDeps() {\n        return List.of(\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/junit/junit/4.13.2/processed_junit-4.13.2.jar\",\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/org/hamcrest/hamcrest-core/1.3/processed_hamcrest-core-1.3.jar\",\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/org/assertj/assertj-core/3.26.0/processed_assertj-core-3.26.0.jar\",\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/net/bytebuddy/byte-buddy/1.14.16/processed_byte-buddy-1.14.16.jar\",\n            \"rules_java~~toolchains~remote_java_tools/java_tools/Runner_deploy.jar\"\n        );\n    }\n\n    /**\n     * Returns the runtime dependencies before exclusions.\n     * These are the base runtime dependencies that would be available before any filtering.\n     * @return List of runtime dependencies before exclusions\n     */\n    public static List<String> getRuntimeDepsListBeforeExclusions() {\n        return new ArrayList<>(List.of(\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_a.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_b.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_c.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_d.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_e.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_f.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_g.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_h.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_i.jar\",\n            \"springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_and_runtime_2/liblib_j.jar\"\n        ));\n    }\n\n    /**\n     * Creates a complete list of runtime dependencies including test dependencies.\n     * This combines the base runtime dependencies with test dependencies.\n     * @return Complete list of runtime dependencies including test dependencies\n     */\n    public static List<String> getCompleteRuntimeDepsList() {\n        List<String> completeList = new ArrayList<>(getRuntimeDepsListBeforeExclusions());\n        completeList.addAll(getTestDeps());\n        return completeList;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:deps_filter.bzl\", \"deps_filter\")\nload(\n    \"//springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only:compile_time_only_test.bzl\",\n    \"no_filtering_test\",\n    \"filtered_deps_test\",\n    \"filtered_deps_exclude_transitive_test\",\n    \"path_based_exclusions_test\",\n    \"interface_implementation_jars_test\",\n    \"multiple_exclusions_with_transitive_test\",\n    \"multiple_exclusions_without_transitive_test\",\n    \"empty_exclusion_lists_test\",\n    \"multiple_paths_test\",\n)\n\n# Dependency Graph Structure:\n\n#      base_lib      \n#       /   \\  \n#     A      G\n#    / \\    /\n#   B   E  /\n#   |   | /\n#   |   F\n#    \\/\n#    C\n#    | \n#    D   \n#\n\njava_library(\n    name = \"lib_a\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\n        \":lib_b\",  # A -> B \n        \":lib_e\",  # A -> E \n    ],\n)\n\njava_library(\n    name = \"lib_b\",\n    srcs = [\"src/main/java/com/depsfilter/B.java\"],  \n    deps = [\":lib_c\"], # B -> C\n)\n\njava_library(\n    name = \"lib_c\",\n    srcs = [\"src/main/java/com/depsfilter/C.java\"],\n    deps = [\":lib_d\"], # B -> D\n)\n\njava_library(\n    name = \"lib_d\",\n    srcs = [\"src/main/java/com/depsfilter/D.java\"], \n)\n\njava_library(\n    name = \"lib_e\",\n    srcs = [\"src/main/java/com/depsfilter/E.java\"],\n    deps = [\":lib_f\"], # E -> F\n)\n\njava_library(\n    name = \"lib_f\",\n    srcs = [\"src/main/java/com/depsfilter/F.java\"],\n    deps = [\":lib_c\"], # F -> C\n)\n\njava_library(\n    name = \"lib_g\",\n    srcs = [\"src/main/java/com/depsfilter/G.java\"],\n    deps = [\":lib_f\"], # G -> F path\n)\n\n# Consumer library that uses the filtered dependencies\njava_library(\n    name = \"base_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":lib_a\", \":lib_g\"],\n)\n\n# Test 1: No filtering\ndeps_filter(\n    name = \"filtered_deps\",\n    deps = [\":base_lib\"],\n)\n\nno_filtering_test(\n    name = \"deps_filter_no_filtering_test\",\n    java_library = \":base_lib\",\n    deps_filter = \":filtered_deps\",  # deps_filter with no exclusions\n)\n\n# Test 2: Exclude by labels and exclude_transitives = False\ndeps_filter(\n    name = \"filtered_deps_exclude_b_g\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    filtered = \":filtered_deps_exclude_b_g\",\n)\n\n# Test 3: Exclude by labels and exclude_transitives = True\ndeps_filter(\n    name = \"filtered_deps_exclude_b_g_exclude_transitive\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n    exclude_transitives = True,\n)\n\nfiltered_deps_exclude_transitive_test(\n    name = \"deps_filter_exclude_b_g_exclude_transitive_test\",\n    filtered = \":filtered_deps_exclude_b_g_exclude_transitive\",\n)\n\n# Test 4: Test for path-based exclusions\ndeps_filter(\n    name = \"path_based_filtered_deps\",\n    deps = [\":base_lib\"],\n    deps_exclude_paths = [\"lib_b\", \"lib_f\"],\n)\n\npath_based_exclusions_test(\n    name = \"deps_filter_path_based_exclusions_test\",\n    filtered = \":path_based_filtered_deps\",\n)\n\n# Test 5: Interface vs Implementation JARs\ndeps_filter(\n    name = \"interface_impl_filtered_deps\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ninterface_implementation_jars_test(\n    name = \"deps_filter_interface_impl_test\",\n    filtered = \":interface_impl_filtered_deps\",\n)\n\n# Test 6: Multiple exclusions with exclude_transitives=True\ndeps_filter(\n    name = \"multiple_exclusions_filtered_deps_1\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = True,\n)\n\nmultiple_exclusions_with_transitive_test(\n    name = \"multiple_exclusions_with_transitive_test\",\n    filtered = \":multiple_exclusions_filtered_deps_1\",\n)\n\n# Test 7: Multiple exclusions with exclude_transitives=False\ndeps_filter(\n    name = \"multiple_exclusions_filtered_deps_2\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = False,\n)\n\nmultiple_exclusions_without_transitive_test(\n    name = \"multiple_exclusions_without_transitive_test\",\n    filtered = \":multiple_exclusions_filtered_deps_2\",\n)\n\n# Test 8: Empty exclusion lists\ndeps_filter(\n    name = \"empty_exclusions_filtered_deps\",\n    deps = [\":base_lib\"],\n    deps_exclude_paths = [],\n    deps_exclude_labels = [],\n)\n\nempty_exclusion_lists_test(\n    name = \"deps_filter_empty_exclusions_test\",\n    filtered = \":empty_exclusions_filtered_deps\",\n)\n\n# Test 9: Multiple paths handling\ndeps_filter(\n    name = \"multiple_paths_filtered_deps\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\nmultiple_paths_test(\n    name = \"deps_filter_multiple_paths_test\",\n    filtered = \":multiple_paths_filtered_deps\",\n)\n\n# load(\"//tools/common/bazel/deps_filter:deps_filter.bzl\", \"deps_filter\")\n# deps_filter(\n#     name = \"flattened_filtered_deps\",\n#     deps = [\":filtered_deps\"],\n# )\n\n# deps_filter(\n#     name = \"flattened_java_libary\",\n#     deps = [\":base_lib\"],\n# )\n\n\ntoolchain(\n    name = \"unittest_toolchain\",\n    toolchain_type = \"@bazel_skylib//toolchains/unittest:toolchain_type\",\n    toolchain = \"@bazel_skylib//toolchains/unittest:toolchain\",\n)\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only/compile_time_only_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\"\n)\n\n\ndef _test_no_filtering(ctx):\n    \"\"\"\n    Tests that deps_filter preserves all dependencies when no exclusions are applied.\n    \n    Dependency Graph: \n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n    \n    Expected: All JARs from java_library must match deps_filter:\n        - full_compile_jars: Implementation JARs (e.g., liblib_a.jar)\n        - compile_jars: Interface JARs (e.g., liblib_a-hjar.jar)\n        - transitive_compile_time_jars: Interface JARs from transitive deps\n        - transitive_runtime_jars: Implementation JARs from transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    java_lib_info = ctx.attr.java_library[JavaInfo]\n    deps_filter_info = ctx.attr.deps_filter[JavaInfo]\n    \n    # Verify all JAR fields match between java_library and deps_filter\n    jar_fields = [\n        \"full_compile_jars\",              # Implementation JARs\n        \"compile_jars\",                   # Interface JARs\n        \"transitive_compile_time_jars\",   # Transitive interface JARs\n        \"transitive_runtime_jars\"         # Transitive implementation JARs\n    ]\n\n    for jar_field in jar_fields:\n        java_lib_jars = getattr(java_lib_info, jar_field)\n        deps_filter_jars = getattr(deps_filter_info, jar_field)\n        asserts.equals(env, type(java_lib_jars), type(deps_filter_jars), \n            \"JAR type mismatch: {} vs deps_filter\".format(jar_field))\n        asserts.equals(env, java_lib_jars.to_list(), deps_filter_jars.to_list(),\n            \"JAR contents mismatch: {} vs deps_filter\".format(jar_field))\n\n    return unittest.end(env)\n\nno_filtering_test = unittest.make(_test_no_filtering, attrs = {\n    \"java_library\": attr.label(providers = [JavaInfo]),\n    \"deps_filter\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps(ctx):\n    \"\"\"\n    Tests basic dependency filtering with label-based exclusions.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - base_lib, A, E, F, C, D (both runtime and compile-time)\n        JARs excluded:\n        - B, G and their transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n\n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_d-hjar.jar\"\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_test = unittest.make(_test_filtered_deps, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps_exclude_transitive(ctx):\n    \"\"\"\n    Tests dependency filtering with transitive exclusions.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved:\n        - base_lib, A, E (both runtime and compile-time)\n        JARs excluded:\n        - B, G and all transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_exclude_transitive_test = unittest.make(_test_filtered_deps_exclude_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_path_based_exclusions(ctx):\n    \"\"\"\n    Tests filtering based on path patterns in deps_exclude_paths.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = [\"lib_b\", \"lib_f\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - All JARs not matching path patterns\n        JARs excluded:\n        - JARs matching paths \"lib_b\" and \"lib_f\"\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_d-hjar.jar\",\n        \"liblib_g-hjar.jar\"\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\npath_based_exclusions_test = unittest.make(_test_path_based_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_interface_implementation_jars(ctx):\n    \"\"\"\n    Tests proper handling of interface (-hjar) and implementation JARs.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        Interface JARs (compile_jars):\n        - libbase_lib-hjar.jar\n\n        Implementation JARs (full_compile_jars):\n        - libbase_lib.jar\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    compile_jars = sorted([jar.basename for jar in javainfo_filtered.compile_jars.to_list()])\n    full_compile_jars = sorted([jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()])\n    \n    expected_compile_jars = [\"libbase_lib-hjar.jar\"]\n    expected_full_compile_jars = [\"libbase_lib.jar\"]\n    \n    asserts.equals(env, compile_jars, expected_compile_jars)\n    asserts.equals(env, full_compile_jars, expected_full_compile_jars)\n    return unittest.end(env)\n\ninterface_implementation_jars_test = unittest.make(_test_interface_implementation_jars, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_exclusions_with_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=True.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved:\n        - base_lib, A, E, F (both runtime and compile-time)\n        JARs excluded:\n        - B, G and all transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\ndef _test_multiple_exclusions_without_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=False.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - base_lib, A, E, F, C, D (both runtime and compile-time)\n        JARs excluded:\n        - B, G (direct deps only)\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_d-hjar.jar\",\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_exclusions_with_transitive_test = unittest.make(_test_multiple_exclusions_with_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\nmultiple_exclusions_without_transitive_test = unittest.make(_test_multiple_exclusions_without_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        All JARs preserved:\n        - base_lib, A, B, C, D, E, F, G (both runtime and compile-time)\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_b.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_b-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_d-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_g-hjar.jar\"\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_paths(ctx):\n    \"\"\"\n    Tests handling of multiple paths to the same dependency.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - base_lib, A, E, F, C, D (both runtime and compile-time)\n        JARs excluded:\n        - B, G\n        Note: Dependencies not duplicated when reachable through multiple paths\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n    ]\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = [\n        \"libbase_lib-hjar.jar\",\n        \"liblib_a-hjar.jar\",\n        \"liblib_e-hjar.jar\",\n        \"liblib_f-hjar.jar\",\n        \"liblib_c-hjar.jar\",\n        \"liblib_d-hjar.jar\"\n    ]\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_paths_test = unittest.make(_test_multiple_paths, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/A.java",
    "content": "package com.depsfilter;\n\npublic class A {\n    int a;\n    private B b;\n    private E e;\n    public A() {\n        a = 1;\n        b = new B();\n        e = new E();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/B.java",
    "content": "package com.depsfilter;\n\npublic class B {\n    private C c;\n    public B() {\n        c = new C();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/C.java",
    "content": "package com.depsfilter;\n\npublic class C {\n    private D d;\n    public C() {\n        d = new D();\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/D.java",
    "content": "package com.depsfilter;\n\npublic class D {\n    private int value;\n    public D() {\n        value = 4;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/E.java",
    "content": "package com.depsfilter;\n\npublic class E {\n    private F f;\n    public E() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/F.java",
    "content": "package com.depsfilter;\n\npublic class F {\n    private C c;\n    public F() {\n        c = new C();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/G.java",
    "content": "package com.depsfilter;\n\npublic class G {\n    private F f;\n    public G() {\n        f = new F();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/compile_time_only/src/main/java/com/depsfilter/H.java",
    "content": "package com.depsfilter;\n\npublic class H {\n    private A a;\n    private G g;\n    public H() {\n        a = new A();\n        g = new G();\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only/BUILD",
    "content": "load(\"//springboot/deps_filter_rules:deps_filter.bzl\", \"deps_filter\")\nload(\n    \"//springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only:runtime_only_test.bzl\",\n    \"no_filtering_test\",\n    \"filtered_deps_test\",\n    \"filtered_deps_exclude_transitive_test\",\n    \"path_based_exclusions_test\",\n    \"interface_implementation_jars_test\",\n    \"multiple_exclusions_with_transitive_test\",\n    \"multiple_exclusions_without_transitive_test\",\n    \"empty_exclusion_lists_test\",\n    \"multiple_paths_test\",\n)\n\n# Dependency Graph Structure:\n\n#      base_lib      \n#       /   \\  \n#     A      G\n#    / \\    /\n#   B   E  /\n#   |   | /\n#   |   F\n#    \\/\n#    C\n#    | \n#    D   \n#\n\njava_library(\n    name = \"lib_a\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    runtime_deps = [\n        \":lib_b\",  # A -> B \n        \":lib_e\",  # A -> E \n    ],\n)\n\njava_library(\n    name = \"lib_b\",\n    srcs = [\"src/main/java/com/depsfilter/B.java\"],  \n    runtime_deps = [\":lib_c\"], # B -> C\n)\n\njava_library(\n    name = \"lib_c\",\n    srcs = [\"src/main/java/com/depsfilter/C.java\"],\n    runtime_deps = [\":lib_d\"], # B -> D\n)\n\njava_library(\n    name = \"lib_d\",\n    srcs = [\"src/main/java/com/depsfilter/D.java\"], \n)\n\njava_library(\n    name = \"lib_e\",\n    srcs = [\"src/main/java/com/depsfilter/E.java\"],\n    runtime_deps = [\":lib_f\"], # E -> F\n)\n\njava_library(\n    name = \"lib_f\",\n    srcs = [\"src/main/java/com/depsfilter/F.java\"],\n    runtime_deps = [\":lib_c\"], # F -> C\n)\n\njava_library(\n    name = \"lib_g\",\n    srcs = [\"src/main/java/com/depsfilter/G.java\"],\n    runtime_deps = [\":lib_f\"], # G -> F path\n)\n\n# Consumer library that uses the filtered dependencies\njava_library(\n    name = \"base_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    runtime_deps = [\":lib_a\", \":lib_g\"],\n)\n\n# Test 1: No filtering\ndeps_filter(\n    name = \"filtered_deps\",\n    deps = [\":base_lib\"],\n)\n\nno_filtering_test(\n    name = \"deps_filter_no_filtering_test\",\n    java_library = \":base_lib\",\n    deps_filter = \":filtered_deps\",  # deps_filter with no exclusions\n)\n\n# Test 2: Exclude by labels and exclude_transitives = False\ndeps_filter(\n    name = \"filtered_deps_exclude_b_g\",\n    runtime_deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    filtered = \":filtered_deps_exclude_b_g\",\n)\n\n# Test 3: Exclude by labels and exclude_transitives = True\ndeps_filter(\n    name = \"filtered_deps_exclude_b_g_exclude_transitive\",\n    runtime_deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n    exclude_transitives = True,\n)\n\nfiltered_deps_exclude_transitive_test(\n    name = \"deps_filter_exclude_b_g_exclude_transitive_test\",\n    filtered = \":filtered_deps_exclude_b_g_exclude_transitive\",\n)\n\n# Test 4: Test for path-based exclusions\ndeps_filter(\n    name = \"path_based_filtered_deps\",\n    runtime_deps = [\":base_lib\"],\n    deps_exclude_paths = [\"lib_b\", \"lib_f\"],\n)\n\npath_based_exclusions_test(\n    name = \"deps_filter_path_based_exclusions_test\",\n    filtered = \":path_based_filtered_deps\",\n)\n\n# Test 5: Interface vs Implementation JARs\ndeps_filter(\n    name = \"interface_impl_filtered_deps\",\n    runtime_deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ninterface_implementation_jars_test(\n    name = \"deps_filter_interface_impl_test\",\n    filtered = \":interface_impl_filtered_deps\",\n)\n\n# Test 6: Multiple exclusions with exclude_transitives=True\ndeps_filter(\n    name = \"multiple_exclusions_filtered_deps_1\",\n    runtime_deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = True,\n)\n\nmultiple_exclusions_with_transitive_test(\n    name = \"multiple_exclusions_with_transitive_test\",\n    filtered = \":multiple_exclusions_filtered_deps_1\",\n)\n\n# Test 7: Multiple exclusions with exclude_transitives=False\ndeps_filter(\n    name = \"multiple_exclusions_filtered_deps_2\",\n    runtime_deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\"],\n    deps_exclude_paths = [\"lib_g\"],\n    exclude_transitives = False,\n)\n\nmultiple_exclusions_without_transitive_test(\n    name = \"multiple_exclusions_without_transitive_test\",\n    filtered = \":multiple_exclusions_filtered_deps_2\",\n)\n\n# Test 8: Empty exclusion lists\ndeps_filter(\n    name = \"empty_exclusions_filtered_deps\",\n    runtime_deps = [\":base_lib\"],\n    deps_exclude_paths = [],\n    deps_exclude_labels = [],\n)\n\nempty_exclusion_lists_test(\n    name = \"deps_filter_empty_exclusions_test\",\n    filtered = \":empty_exclusions_filtered_deps\",\n)\n\n# Test 9: Multiple paths handling\ndeps_filter(\n    name = \"multiple_paths_filtered_deps\",\n    runtime_deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\nmultiple_paths_test(\n    name = \"deps_filter_multiple_paths_test\",\n    filtered = \":multiple_paths_filtered_deps\",\n)\n\ntoolchain(\n    name = \"unittest_toolchain\",\n    toolchain_type = \"@bazel_skylib//toolchains/unittest:toolchain_type\",\n    toolchain = \"@bazel_skylib//toolchains/unittest:toolchain\",\n)\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only/runtime_only_test.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\", \"unittest\")\nload(\"//springboot/deps_filter_rules/tests/test_utils:verification_utils.bzl\",\n        \"verify_jars\", \n        \"verify_runtime_and_compile_jars\",\n        \"verify_jars_and_dropped_counts\", \n        \"verify_dropped_counts\"\n)\n\n\ndef _test_no_filtering(ctx):\n    \"\"\"\n    Tests that deps_filter preserves all dependencies when no exclusions are applied.\n    \n    Dependency Graph: \n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n    \n    Expected: All JARs from java_library must match deps_filter:\n        - full_compile_jars: Implementation JARs (e.g., liblib_a.jar)\n        - compile_jars: Interface JARs (e.g., liblib_a-hjar.jar)\n        - transitive_compile_time_jars: Interface JARs from transitive deps\n        - transitive_runtime_jars: Implementation JARs from transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    java_lib_info = ctx.attr.java_library[JavaInfo]\n    deps_filter_info = ctx.attr.deps_filter[JavaInfo]\n    \n    # Verify all JAR fields match between java_library and deps_filter\n    jar_fields = [\n        \"full_compile_jars\",              # Implementation JARs\n        \"compile_jars\",                   # Interface JARs\n        \"transitive_compile_time_jars\",   # Transitive interface JARs\n        \"transitive_runtime_jars\"         # Transitive implementation JARs\n    ]\n\n    for jar_field in jar_fields:\n        java_lib_jars = getattr(java_lib_info, jar_field)\n        deps_filter_jars = getattr(deps_filter_info, jar_field)\n        asserts.equals(env, type(java_lib_jars), type(deps_filter_jars), \n            \"JAR type mismatch: {} vs deps_filter\".format(jar_field))\n        asserts.equals(env, java_lib_jars.to_list(), deps_filter_jars.to_list(),\n            \"JAR contents mismatch: {} vs deps_filter\".format(jar_field))\n\n    return unittest.end(env)\n\nno_filtering_test = unittest.make(_test_no_filtering, attrs = {\n    \"java_library\": attr.label(providers = [JavaInfo]),\n    \"deps_filter\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps(ctx):\n    \"\"\"\n    Tests basic dependency filtering with label-based exclusions.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - base_lib, A, E, F, C, D (runtime)\n        - no compile-time jars present\n        JARs excluded:\n        - B, G and their transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n\n    expected_compile_jars = []\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = []\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_test = unittest.make(_test_filtered_deps, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_filtered_deps_exclude_transitive(ctx):\n    \"\"\"\n    Tests dependency filtering with transitive exclusions.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved:\n        - base_lib, A, E (runtime)\n        - no compile-time jars present\n        JARs excluded:\n        - B, G and all transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = []\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n    ]\n    \n    expected_transitive_compile_jars = []\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nfiltered_deps_exclude_transitive_test = unittest.make(_test_filtered_deps_exclude_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_path_based_exclusions(ctx):\n    \"\"\"\n    Tests filtering based on path patterns in deps_exclude_paths.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = [\"lib_b\", \"lib_f\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - All JARs not matching path patterns\n        JARs excluded:\n        - JARs matching paths \"lib_b\" and \"lib_f\"\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = []\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = []\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\npath_based_exclusions_test = unittest.make(_test_path_based_exclusions, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_interface_implementation_jars(ctx):\n    \"\"\"\n    Tests proper handling of interface (-hjar) and implementation JARs.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        Interface JARs (compile_jars):\n        - []\n\n        Implementation JARs (full_compile_jars):\n        - libbase_lib.jar\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    compile_jars = sorted([jar.basename for jar in javainfo_filtered.compile_jars.to_list()])\n    full_compile_jars = sorted([jar.basename for jar in javainfo_filtered.full_compile_jars.to_list()])\n    \n    expected_compile_jars = []\n    expected_full_compile_jars = [\"libbase_lib.jar\"]\n    \n    asserts.equals(env, compile_jars, expected_compile_jars)\n    asserts.equals(env, full_compile_jars, expected_full_compile_jars)\n    return unittest.end(env)\n\ninterface_implementation_jars_test = unittest.make(_test_interface_implementation_jars, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_exclusions_with_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=True.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = True\n\n    Expected Output:\n        JARs preserved:\n        - base_lib, A, E, F (runtime)\n        - no compile-time jars present\n        JARs excluded:\n        - B, G and all transitive deps\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = []\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n    ]\n    \n    expected_transitive_compile_jars = []\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\ndef _test_multiple_exclusions_without_transitive(ctx):\n    \"\"\"\n    Tests multiple exclusion levels with exclude_transitives=False.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\"]\n        deps_exclude_paths = [\"lib_g\"]\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - base_lib, A, E, F, C, D (runtime)\n        - no compile-time jars present\n        JARs excluded:\n        - B, G (direct deps only)\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = []\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n    ]\n    \n    expected_transitive_compile_jars = []\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_exclusions_with_transitive_test = unittest.make(_test_multiple_exclusions_with_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\nmultiple_exclusions_without_transitive_test = unittest.make(_test_multiple_exclusions_without_transitive, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_empty_exclusion_lists(ctx):\n    \"\"\"\n    Tests behavior when exclusion lists are empty.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = []\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        All JARs preserved:\n        - base_lib, A, B, C, D, E, F, G (runtime)\n        - no compile-time jars present\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = []\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_b.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_g.jar\"\n    ]\n    \n    expected_transitive_compile_jars = []\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nempty_exclusion_lists_test = unittest.make(_test_empty_exclusion_lists, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\ndef _test_multiple_paths(ctx):\n    \"\"\"\n    Tests handling of multiple paths to the same dependency.\n    \n    Dependency Graph:\n        base_lib\n        /     \\\\\n       A       G\n      / \\\\    /\n     B   E   /\n     |   | /\n     |   F \n      \\\\  \n       C\n       |\n       D\n\n    Input:\n        deps = [\":base_lib\"]\n        deps_exclude_labels = [\":lib_b\", \":lib_g\"]\n        deps_exclude_paths = []\n        exclude_transitives = False\n\n    Expected Output:\n        JARs preserved:\n        - base_lib, A, E, F, C, D (runtime)\n        - no compile-time jars present\n        JARs excluded:\n        - B, G\n        Note: Dependencies not duplicated when reachable through multiple paths\n    \"\"\"\n    env = unittest.begin(ctx)\n    javainfo_filtered = ctx.attr.filtered[JavaInfo]\n    \n    expected_compile_jars = []\n\n    expected_full_compile_jars = [\n        \"libbase_lib.jar\",\n    ]\n    \n    expected_transitive_runtime_jars = [\n        \"libbase_lib.jar\",\n        \"liblib_a.jar\",\n        \"liblib_e.jar\",\n        \"liblib_f.jar\",\n        \"liblib_c.jar\",\n        \"liblib_d.jar\"\n    ]\n    \n    expected_transitive_compile_jars = []\n    \n    verify_runtime_and_compile_jars(ctx, env, javainfo_filtered, \n        expected_compile_jars = expected_compile_jars, \n        expected_full_compile_jars = expected_full_compile_jars, \n        expected_transitive_compile_jars = expected_transitive_compile_jars, \n        expected_transitive_runtime_jars = expected_transitive_runtime_jars)\n    return unittest.end(env)\n\nmultiple_paths_test = unittest.make(_test_multiple_paths, attrs = {\n    \"filtered\": attr.label(providers = [JavaInfo]),\n})\n\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only/src/main/java/com/depsfilter/A.java",
    "content": "package com.depsfilter;\n\npublic class A {\n    public A() {\n        int a = 1;\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only/src/main/java/com/depsfilter/B.java",
    "content": "package com.depsfilter;\n\npublic class B {\n    public B() {\n        int b = 1;\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only/src/main/java/com/depsfilter/C.java",
    "content": "package com.depsfilter;\n\npublic class C {\n    public C() {\n        int c = 1;\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only/src/main/java/com/depsfilter/D.java",
    "content": "package com.depsfilter;\n\npublic class D {\n    public D() {\n        int d = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only/src/main/java/com/depsfilter/E.java",
    "content": "package com.depsfilter;\n\npublic class E {\n    public E() {\n        int e = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only/src/main/java/com/depsfilter/F.java",
    "content": "package com.depsfilter;\n\npublic class F {\n    public F() {\n        int f = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only/src/main/java/com/depsfilter/G.java",
    "content": "package com.depsfilter;\n\npublic class G {\n    public G() {\n        int g = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/runtime_only/src/main/java/com/depsfilter/H.java",
    "content": "package com.depsfilter;\n\npublic class H {\n    public H() {\n        int h = 1;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/external_dependencies_testing.md",
    "content": "# External Dependencies Testing\n\n`external_dependencies` under both `depsfilter` and `dependencyset` contain comprehensive tests for the `deps_filter` rule and `dependencyset` macro using real external deps (Spring Boot, Jakarta libraries) to ensure correct filtering in complex dependency graphs.\n\n## Purpose\n\n- Validate `deps_filter` and `dependencyset` with real-world, complex external deps\n- Dynamically verify results using bazel's dependency graph\n- Cover all exclusion mechanisms and multiple edge cases\n\n## Directory Structure\n\n```\ntests/\n├── depsfilter/\n│   └── external_dependencies/\n│       ├── compile_and_runtime/\n│       └── compile_and_runtime_through_java_library/\n└── dependencyset/\n    └── external_dependencies/\n        └── compile_and_runtime/\n```\n\n## Testing Approach\n\nSimilar testing scenarios are implemented using two different approaches:\n\n### 1. Deps Filter Rule Testing\n\n**Pattern**: `external deps -> deps_filter() -> bazel starlark/java tests`\n\n**Example from compile_and_runtime**:\n```bazel\n# Direct external deps in deps_filter\ndeps_filter(\n    name = \"no_filtering\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n)\n\nno_filtering_test(\n    name = \"no_filtering_test\",\n    filtered = \":no_filtering\",\n)\n\njava_test(\n    name = \"DepsFilterNoFilteringTest\",\n    size = \"small\",\n    srcs = [\"src/test/java/com/depsfilter/DepsFilterNoFilteringTest.java\"],\n    deps = [\":no_filtering\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n```\n\n**Example from compile_and_runtime_through_java_library**:\n```bazel\n# External deps wrapped in java_library first\njava_library(\n    name = \"base_lib_with_deps_and_runtime_deps\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = deps,\n    runtime_deps = runtime_deps,\n)\n\n# Then filtered through deps_filter\ndeps_filter(\n    name = \"no_filtering\",\n    deps = [\":base_lib_with_deps_and_runtime_deps\"],\n)\n\nno_filtering_test(\n    name = \"no_filtering_test\",\n    filtered = \":no_filtering\",\n)\n\njava_test(\n    name = \"DepsFilterNoFilteringTest\",\n    size = \"small\",\n    srcs = [\"src/test/java/com/depsfilter/DepsFilterNoFilteringTest.java\"],\n    deps = [\":no_filtering\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n```\n\n### 2. Dependencyset Macro Testing\n\n**Pattern**: `dependencyset(\"deps\"), dependencyset(\"runtime_deps\") -> java_library -> bazel starlark/java tests`\n\n**Consistent approach across all test scenarios**:\n```bazel\n# Create filtered dependency sets\ndependencyset(\n    name = \"deps_no_filtering\",\n    items = deps,\n)\n\ndependencyset(\n    name = \"runtime_deps_no_filtering\",\n    items = runtime_deps,\n)\n\n# Create test library using filtered sets\njava_library(\n    name = \"no_filtering_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/A.java\"],\n    deps = [\":deps_no_filtering\"],\n    runtime_deps = [\":runtime_deps_no_filtering\"],\n)\n\n# Test the filtered result\nno_filtering_test(\n    name = \"no_filtering_test\",\n    test_lib = \":no_filtering_test_lib\",\n)\n\n# Java test for runtime verification\njava_test(\n    name = \"DepsFilterNoFilteringTest\",\n    size = \"small\",\n    srcs = [\"src/test/java/com/depsfilter/DepsFilterNoFilteringTest.java\"],\n    deps = [\":no_filtering_test_lib\", \"//springboot/deps_filter_rules/tests/test_utils:test_utils\"] + test_deps,\n)\n```\n\n## Test Structure\n\nThe testing is organized into two comprehensive test suites that focus on real external deps:\n\n### `depsfilter/external_dependencies/`\n\n**Key Characteristics:**\n- Tests the `deps_filter` rule directly\n- Uses actual external libraries directly in deps_filter targets\n- Complex dependency graph with 100+ transitive deps\n- Tests both compile-time and runtime deps\n\n#### `compile_and_runtime/`\n- Uses actual external libraries directly in deps_filter targets\n- Tests both compile-time and runtime deps\n\n#### `compile_and_runtime_through_java_library/`\n- Uses actual external libraries wrapped in java_library targets\n- External deps are passed through java_library targets before testing\n- Tests the same scenarios but with an additional layer of indirection\n- More realistic testing scenario where external deps are consumed through internal libraries\n\n### `dependencyset/external_dependencies/`\n\n**Key Characteristics:**\n- Tests the `dependencyset` macro\n- Uses actual external libraries through dependencyset targets\n- Tests the same scenarios as depsfilter but using the macro approach\n- Validates that dependencyset provides the same filtering capabilities\n\n#### `compile_and_runtime/`\n- Uses dependencyset macro to manage external deps\n- Tests both compile-time and runtime deps through dependencyset\n- Validates macro-level filtering behavior\n\n**Deps Used (for both approaches):**\n```python\n# Compile-time Deps\ndeps = [\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\", \n    \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n    \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n    \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\",\n]\n# Runtime Deps\nruntime_deps = [\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n    \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\",\n]\n```\n\n## Test Coverage\n\nBoth test suites cover:\n- **No filtering**: Baseline test with all deps included\n- **Label-based exclusions**: Exclude specific deps by label (with and without transitives)\n- **Path-based exclusions**: Exclude deps by path patterns (with and without transitives)\n- **Multiple exclusions**: Combined label and path exclusions (with and without transitives)\n- **Empty exclusions**: Behavior with empty exclusion lists\n- **Comprehensive path-based exclusions**: Multiple path patterns, including common libraries (micrometer, slf4j, logback)\n- **Runtime deps only**: Only runtime deps, no compile-time deps\n- **Compile deps only**: Only compile-time deps, no runtime deps\n- **Single dependency with exclusions**: One dep with label/path exclusions\n- **Single runtime dependency with exclusions**: One runtime dep with exclusions\n- **One compile dep and one runtime dep**\n- **Path patterns with special characters**: Patterns with dots, hyphens, etc.\n- **Case sensitive pattern matching**: Patterns with different cases (upper, lower, mixed)\n\n## Verification Approach\n\nWe use two complementary testing strategies to ensure comprehensive validation:\n\n### Java Testing - Runtime Classpath Verification\n\nJava tests verify that the correct JARs are available at runtime by:\n\n1. **Computing Expected Deps**: \n   - Parse `dependency_graph.txt` generated by bazel's `deps()` query\n   - Build complete dependency graph using `DependencyGraphAnalyzer`\n   - Apply exclusion logic (labels, paths, transitives) to simulate `deps_filter`/`dependencyset` behavior\n   - Generate expected runtime classpath from filtered graph\n\n2. **Obtaining Available Deps**:\n   - Read actual runtime classpath using `System.getProperty(\"java.class.path\")`\n   - Parse and normalize classpath entries to JAR names\n\n3. **Comparison**:\n   - Compare expected runtime JARs vs actual available runtime JARs\n   - Verify excluded deps are absent and required deps are present\n\n```java\n// Compute expected runtime JARs\nSet<String> expectedJars = DependencyGraphTestConfig\n    .getExpectedJarsForLabelExclusionsFiltered(excludedLabels, excludeTransitives);\n\n// Get actual runtime classpath\nList<String> availableDeps = DepsFilterTestHelper.computeClasspathDependencies();\n\n// Compare expected vs available\nassertEquals(expectedJars, new HashSet<>(availableDeps));\n```\n\n### Starlark Testing - Rule/Macro Output Verification\n\nStarlark tests verify the `deps_filter` rule's and `dependencyset` macro's output by:\n\n1. **Computing Expected Deps**:\n   - Iterate through all `deps` and `runtime_deps`\n   - Apply exclusion logic (label matching, path patterns, transitive handling)\n   - Generate expected JAR lists for each of the four JAR types: `compile_jars`, `full_compile_jars`, `transitive_compile_jars`, `transitive_runtime_jars`\n\n2. **Obtaining Available Deps**:\n   - Extract JAR collections from the `deps_filter` rule's `JavaInfo` or `dependencyset` macro's output\n   - Get all four JAR types: `compile_jars`, `full_compile_jars`, `transitive_compile_jars`, `transitive_runtime_jars`\n\n3. **Comparison**:\n   - Compare expected vs actual JARs for all four JAR types\n   - Verify exclusion counts (number of jars excluded) and JAR contents match\n\n```python\n# Verify all four JAR types\ndef verify_jars(env, actual_jars, expected_jars, jar_field):\n    asserts.equals(env, expected_jars, actual_jars,\n        \"JAR contents mismatch: {} vs deps_filter/dependencyset\".format(jar_field))\n```\n\n## Test Verification\n\nEach Starlark test verifies the following JAR fields:\n\n- **`compile_jars`**: Interface JARs (e.g., `header_spring-boot-starter-data-jpa-3.3.11.jar`)\n- **`full_compile_jars`**: Implementation JARs (e.g., `processed_spring-boot-starter-data-jpa-3.3.11.jar`)\n- **`transitive_compile_time_jars`**: Transitive interface JARs\n- **`transitive_runtime_jars`**: Transitive implementation JARs\n\n## Java Test Files\n\nEach test scenario includes corresponding java test files that:\n- Verify the jars available at runtime\n- Use centralized test helper (`DepsFilterTestHelper`)\n- Compute expected results from dependency graph\n\n## Key Testing Concepts\n\n### 1. Label-based Exclusions\n- Excludes deps by their label\n- Can optionally exclude transitive deps\n\n### 2. Path-based Exclusions\n- Excludes deps matching path patterns in JAR names\n- Does not exclude transitives (`exclude_transitives = true` doesn't work)\n\n### 3. Transitive Exclusion Behavior\n- `exclude_transitives=False`: Only excludes deps specified in `deps_exclude_labels`, preserves their transitives\n- `exclude_transitives=True`: Excludes both direct and transitive deps specified in `deps_exclude_labels`\n\n### 4. Runtime Classpath Verification\n- Compare expected vs actual runtime classpath\n- Verify excluded deps are absent\n- Verify required deps are present\n- Handle complex transitive dependency scenarios\n\n### 5. Rule vs Macro Testing\n- **deps_filter rule**: Tests direct rule usage with external deps\n- **dependencyset macro**: Tests macro-level dependency management\n- Both approaches should produce equivalent results for the same filtering criteria\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/external_deps/BUILD",
    "content": ""
  },
  {
    "path": "springboot/deps_filter_rules/tests/external_deps/unmanaged_deps_filter_install.json",
    "content": "{\n  \"__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY\": \"THERE_IS_NO_DATA_ONLY_ZUUL\",\n  \"__INPUT_ARTIFACTS_HASH\": -1525867914,\n  \"__RESOLVED_ARTIFACTS_HASH\": -640651985,\n  \"conflict_resolution\": {\n    \"com.fasterxml.jackson.core:jackson-databind:2.17.2\": \"com.fasterxml.jackson.core:jackson-databind:2.17.3\",\n    \"org.hibernate.orm:hibernate-core:6.4.4.Final\": \"org.hibernate.orm:hibernate-core:6.5.3.Final\"\n  },\n  \"artifacts\": {\n    \"ch.qos.logback:logback-classic\": {\n      \"shasums\": {\n        \"jar\": \"3e1533d0321f8815eef46750aee0111b41554f9a4644c3c4d2d404744b09f60f\"\n      },\n      \"version\": \"1.5.18\"\n    },\n    \"ch.qos.logback:logback-core\": {\n      \"shasums\": {\n        \"jar\": \"85139e7b57b464f8e5e36326dd81317648bed199ccc4f98cd42585f8d7571027\"\n      },\n      \"version\": \"1.5.18\"\n    },\n    \"com.fasterxml.jackson.core:jackson-annotations\": {\n      \"shasums\": {\n        \"jar\": \"2747f60343783a6ec8a68405c7c839fa0bbe30ee4e2459d21a1ac3b7365e1ed5\"\n      },\n      \"version\": \"2.17.3\"\n    },\n    \"com.fasterxml.jackson.core:jackson-core\": {\n      \"shasums\": {\n        \"jar\": \"19e03ee71f00a86255fa3c980560b231e1305486f6482c905601209014f5870c\"\n      },\n      \"version\": \"2.17.3\"\n    },\n    \"com.fasterxml.jackson.core:jackson-databind\": {\n      \"shasums\": {\n        \"jar\": \"93b13e709a0b620de42019180a75bc1fc4885c81fe5b6087a4aa248f91fb9a95\"\n      },\n      \"version\": \"2.17.3\"\n    },\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\": {\n      \"shasums\": {\n        \"jar\": \"b7207c1df9d89e95efd23793d3a13b1295bec0d9be58b3582ea0dff6cb096fa2\"\n      },\n      \"version\": \"2.17.3\"\n    },\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\": {\n      \"shasums\": {\n        \"jar\": \"b1e3e4be52f69ecf6442d8a07e96ddd200bacb1867cb47460ade87710552a9ee\"\n      },\n      \"version\": \"2.17.3\"\n    },\n    \"com.fasterxml.jackson.module:jackson-module-parameter-names\": {\n      \"shasums\": {\n        \"jar\": \"f736404f3a4dc554e7ec816caccfebc68e65d402c2de7ec3c4438f6895179467\"\n      },\n      \"version\": \"2.17.3\"\n    },\n    \"com.fasterxml:classmate\": {\n      \"shasums\": {\n        \"jar\": \"aab4de3006808c09d25dd4ff4a3611cfb63c95463cfd99e73d2e1680d229a33b\"\n      },\n      \"version\": \"1.5.1\"\n    },\n    \"com.github.stephenc.jcip:jcip-annotations\": {\n      \"shasums\": {\n        \"jar\": \"4fccff8382aafc589962c4edb262f6aa595e34f1e11e61057d1c6a96e8fc7323\"\n      },\n      \"version\": \"1.0-1\"\n    },\n    \"com.nimbusds:content-type\": {\n      \"shasums\": {\n        \"jar\": \"730f1816196145e88275093c147f2e6da3c3e541207acd3503a1b06129b9bea9\"\n      },\n      \"version\": \"2.2\"\n    },\n    \"com.nimbusds:lang-tag\": {\n      \"shasums\": {\n        \"jar\": \"e8c1c594e2425bdbea2d860de55c69b69fc5d59454452449a0f0913c2a5b8a31\"\n      },\n      \"version\": \"1.7\"\n    },\n    \"com.nimbusds:nimbus-jose-jwt\": {\n      \"shasums\": {\n        \"jar\": \"12ae4a3a260095d7aeba2adea7ae396e8b9570db8b7b409e09a824c219cc0444\"\n      },\n      \"version\": \"9.37.3\"\n    },\n    \"com.nimbusds:oauth2-oidc-sdk\": {\n      \"shasums\": {\n        \"jar\": \"fee94eae5c4388e1de7fba84e3ada2b92d17bbbb28c630d4258a6f0615c1f303\"\n      },\n      \"version\": \"9.43.6\"\n    },\n    \"com.sun.istack:istack-commons-runtime\": {\n      \"shasums\": {\n        \"jar\": \"7e8148c5bf5d5ae6f8c4534c1873f82e80bf7f9164fd09ee573df0013918dcd3\"\n      },\n      \"version\": \"4.1.1\"\n    },\n    \"com.zaxxer:HikariCP\": {\n      \"shasums\": {\n        \"jar\": \"a47a6ee62379694ee52c30036f0931b72f9aee2a801d590341ed82bd839e2134\"\n      },\n      \"version\": \"5.1.0\"\n    },\n    \"io.micrometer:micrometer-commons\": {\n      \"shasums\": {\n        \"jar\": \"8613395fb4914819610d0b24ccf7345b30ee40e7bc08699cfcfb746bb2cb881d\"\n      },\n      \"version\": \"1.13.13\"\n    },\n    \"io.micrometer:micrometer-core\": {\n      \"shasums\": {\n        \"jar\": \"fac100f175ac8e123b87a8dad897717eb81356f086ff1b75aa7a31e8742ca800\"\n      },\n      \"version\": \"1.13.13\"\n    },\n    \"io.micrometer:micrometer-jakarta9\": {\n      \"shasums\": {\n        \"jar\": \"5a7f576795be64a1e73b2cacf7ff33afb480b466c4fa9e05c3f447684143473d\"\n      },\n      \"version\": \"1.13.13\"\n    },\n    \"io.micrometer:micrometer-observation\": {\n      \"shasums\": {\n        \"jar\": \"35b40b485eb0514ff57fa15cbcd3c0cc850a1c72421cb7090e97e8e191167b99\"\n      },\n      \"version\": \"1.13.13\"\n    },\n    \"io.netty:netty-buffer\": {\n      \"shasums\": {\n        \"jar\": \"32226218d854c2e51d4935a7ebe4663b72ecb9af4da881b86bf518e61aed48d3\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-codec\": {\n      \"shasums\": {\n        \"jar\": \"c497934a057444b126a86e06f2b509188e48ca6c5a5e14c182a02f1e8c8d5fdb\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-codec-dns\": {\n      \"shasums\": {\n        \"jar\": \"8893bb399849629eecaa1fa12d48aad73161721b7ce75fdeb72e6e40c549ad55\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-codec-http\": {\n      \"shasums\": {\n        \"jar\": \"ff48db63e44e273e677832e52cc2a1ce2670da796f22af129a8bd4c3786a2d34\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-codec-http2\": {\n      \"shasums\": {\n        \"jar\": \"5ea89af402b6f59715a84780c4cd0388f4e602e339a5b7b888c17ce9f5537d1a\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-codec-socks\": {\n      \"shasums\": {\n        \"jar\": \"a85103bb1a32cf56b8d77e57f6647a859751cab6be189085df76eed18bb54c9a\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-common\": {\n      \"shasums\": {\n        \"jar\": \"991a69b1594dcad9926e268e7e94530cfdaa89feef42af26922a302d3e2e9212\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-handler\": {\n      \"shasums\": {\n        \"jar\": \"9b49be98e36bb79a2025ffb5159aec87da2720cfa545f56de39c3bc108587b1b\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-handler-proxy\": {\n      \"shasums\": {\n        \"jar\": \"7a35e62259a43e5dbdc2e402934b1f64084ce73aecf7b42ce647c918a6e5f617\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-resolver\": {\n      \"shasums\": {\n        \"jar\": \"3b6c9f9f6f360747213d154971dec1fc8852820dc1a98d055ff09d09676f8836\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-resolver-dns\": {\n      \"shasums\": {\n        \"jar\": \"119e1dae4b207197ec6a4b434894894930b0b089a2459a88706d1407cf975b09\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-resolver-dns-classes-macos\": {\n      \"shasums\": {\n        \"jar\": \"c707e72bb03de399a0594c2ed0b017b5eaa2b7ae31892d1944d835deb61a3c1f\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-resolver-dns-native-macos\": {\n      \"shasums\": {\n        \"osx-x86_64\": \"7a1be00ce8dbce562cdb5b59f977aabfd003a62e1b0861eb1b48c0634ec5e8b0\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-transport\": {\n      \"shasums\": {\n        \"jar\": \"c0921ea0e79c3b936daabe08a26e926642a4ad24951d6115fb43362c21dfeb10\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-transport-classes-epoll\": {\n      \"shasums\": {\n        \"jar\": \"38edbceb4d0f3c1c87bc8db9f812d317342c9c8e95a4a052fb796a2f78ad098e\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-transport-native-epoll\": {\n      \"shasums\": {\n        \"linux-x86_64\": \"12557923a5069e736a9305c73a87b303ba9e89b32da3ec95dea6a856f3fd6397\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.netty:netty-transport-native-unix-common\": {\n      \"shasums\": {\n        \"jar\": \"8ae5618f69326e6d17b77b0140f9d277118dbd23906ca07638bc01365728c650\"\n      },\n      \"version\": \"4.1.119.Final\"\n    },\n    \"io.projectreactor.netty:reactor-netty-core\": {\n      \"shasums\": {\n        \"jar\": \"d4d7d3519945d869ce352a3642d32f433425efe499a7efe54735c4cf36074091\"\n      },\n      \"version\": \"1.1.29\"\n    },\n    \"io.projectreactor.netty:reactor-netty-http\": {\n      \"shasums\": {\n        \"jar\": \"bd1740369bfb4b462db5f46452fed326659094fa6dd7172cb4a5a3dc8300f281\"\n      },\n      \"version\": \"1.1.29\"\n    },\n    \"io.projectreactor:reactor-core\": {\n      \"shasums\": {\n        \"jar\": \"0fcbd5f71537c7256c876ffd54fd6f2528ca1bee88544d29d2cc591e1c471b0d\"\n      },\n      \"version\": \"3.6.15\"\n    },\n    \"io.smallrye:jandex\": {\n      \"shasums\": {\n        \"jar\": \"dee12fa1787d5523ed1a02d6c63b19e7aef6ac560f7c6d70595db01aa37e041e\"\n      },\n      \"version\": \"3.1.2\"\n    },\n    \"jakarta.activation:jakarta.activation-api\": {\n      \"shasums\": {\n        \"jar\": \"33bae3f0f12dbb5a7afc81d802a130359cdb44bbc7fb4b213f49b349d0491a04\"\n      },\n      \"version\": \"2.1.1\"\n    },\n    \"jakarta.annotation:jakarta.annotation-api\": {\n      \"shasums\": {\n        \"jar\": \"5f65fdaf424eee2b55e1d882ba9bb376be93fb09b37b808be6e22e8851c909fe\"\n      },\n      \"version\": \"2.1.1\"\n    },\n    \"jakarta.inject:jakarta.inject-api\": {\n      \"shasums\": {\n        \"jar\": \"f7dc98062fccf14126abb751b64fab12c312566e8cbdc8483598bffcea93af7c\"\n      },\n      \"version\": \"2.0.1\"\n    },\n    \"jakarta.persistence:jakarta.persistence-api\": {\n      \"shasums\": {\n        \"jar\": \"475389446d35c6f46c565728b756dc508c284644ea2690644e0d8e7e339d42fd\"\n      },\n      \"version\": \"3.1.0\"\n    },\n    \"jakarta.servlet.jsp:jakarta.servlet.jsp-api\": {\n      \"shasums\": {\n        \"jar\": \"429b24f0049baaad272f4e719fec564739ff33798741f4c94bcb3510944cc5e5\"\n      },\n      \"version\": \"3.1.1\"\n    },\n    \"jakarta.transaction:jakarta.transaction-api\": {\n      \"shasums\": {\n        \"jar\": \"50c0a7c760c13ae6c042acf182b28f0047413db95b4636fb8879bcffab5ba875\"\n      },\n      \"version\": \"2.0.1\"\n    },\n    \"jakarta.xml.bind:jakarta.xml.bind-api\": {\n      \"shasums\": {\n        \"jar\": \"57e3796ad5753640088f5f9d3c53c183f2c250b7dad90529ea3e19a5515aa122\"\n      },\n      \"version\": \"4.0.0\"\n    },\n    \"junit:junit\": {\n      \"shasums\": {\n        \"jar\": \"8e495b634469d64fb8acfa3495a065cbacc8a0fff55ce1e31007be4c16dc57d3\"\n      },\n      \"version\": \"4.13.2\"\n    },\n    \"net.bytebuddy:byte-buddy\": {\n      \"shasums\": {\n        \"jar\": \"5add6c7b294b2b2ac60c9a4b54f924cd65e4f10ccfed75d2a99d621d6c5f0a8d\"\n      },\n      \"version\": \"1.14.16\"\n    },\n    \"net.minidev:accessors-smart\": {\n      \"shasums\": {\n        \"jar\": \"9b8a7bc43861d6156c021166d941fb7dddbe4463e2fa5ee88077e4b01452a836\"\n      },\n      \"version\": \"2.5.2\"\n    },\n    \"net.minidev:json-smart\": {\n      \"shasums\": {\n        \"jar\": \"4fbdedb0105cedc7f766b95c297d2e88fb6a560da48f3bbaa0cc538ea8b7bf71\"\n      },\n      \"version\": \"2.5.2\"\n    },\n    \"org.antlr:antlr4-runtime\": {\n      \"shasums\": {\n        \"jar\": \"bd7f7b5d07bc0b047f10915b32ca4bb1de9e57d8049098882e4453c88c076a5d\"\n      },\n      \"version\": \"4.13.0\"\n    },\n    \"org.apache.logging.log4j:log4j-api\": {\n      \"shasums\": {\n        \"jar\": \"92ec1fd36ab3bc09de6198d2d7c0914685c0f7127ea931acc32fd2ecdd82ea89\"\n      },\n      \"version\": \"2.23.1\"\n    },\n    \"org.apache.logging.log4j:log4j-to-slf4j\": {\n      \"shasums\": {\n        \"jar\": \"7937a84055156910234e3b42868f55e68ff4b7becbb6ffd10146f72f5bf54dd5\"\n      },\n      \"version\": \"2.23.1\"\n    },\n    \"org.aspectj:aspectjweaver\": {\n      \"shasums\": {\n        \"jar\": \"75e4227fb7dc5f97c3d4689cd1c2439f4db0bd18cea2fa242c4656cd93c599aa\"\n      },\n      \"version\": \"1.9.24\"\n    },\n    \"org.assertj:assertj-core\": {\n      \"shasums\": {\n        \"jar\": \"b0f1b425899001fb6cc856f35318d133b3c4902d6ecdecb0834791268567094f\"\n      },\n      \"version\": \"3.26.0\"\n    },\n    \"org.eclipse.angus:angus-activation\": {\n      \"shasums\": {\n        \"jar\": \"3a12d321a0f35aa9458ff9b6ee93a3de76b78e3f18b077c81721473d83079147\"\n      },\n      \"version\": \"2.0.0\"\n    },\n    \"org.glassfish.jaxb:jaxb-core\": {\n      \"shasums\": {\n        \"jar\": \"d7ff2954ad78480bbab9391cccff3a22f42a82b6e09aeca1c7d502411c470ccd\"\n      },\n      \"version\": \"4.0.2\"\n    },\n    \"org.glassfish.jaxb:jaxb-runtime\": {\n      \"shasums\": {\n        \"jar\": \"1bc271e61b71ca4bd89eb053f3d2c91d478211b02a8982cb520f216fe0e9a939\"\n      },\n      \"version\": \"4.0.2\"\n    },\n    \"org.glassfish.jaxb:txw2\": {\n      \"shasums\": {\n        \"jar\": \"ea71912e4f0a42530f77c9840ae90019c46402dedfdf007cff03797429a0cf0c\"\n      },\n      \"version\": \"4.0.2\"\n    },\n    \"org.hamcrest:hamcrest-core\": {\n      \"shasums\": {\n        \"jar\": \"66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9\"\n      },\n      \"version\": \"1.3\"\n    },\n    \"org.hdrhistogram:HdrHistogram\": {\n      \"shasums\": {\n        \"jar\": \"22d1d4316c4ec13a68b559e98c8256d69071593731da96136640f864fa14fad8\"\n      },\n      \"version\": \"2.2.2\"\n    },\n    \"org.hibernate.common:hibernate-commons-annotations\": {\n      \"shasums\": {\n        \"jar\": \"cd974e0a8481fafdbaf9b4a0f08bb5a6c969b0365482763eedf77e6fd7f493b7\"\n      },\n      \"version\": \"6.0.6.Final\"\n    },\n    \"org.hibernate.orm:hibernate-core\": {\n      \"shasums\": {\n        \"jar\": \"f79b5e5029a72e2f0ba7542591fba8305c9edbc0dbdc974541f2376ff1203422\"\n      },\n      \"version\": \"6.5.3.Final\"\n    },\n    \"org.jboss.logging:jboss-logging\": {\n      \"shasums\": {\n        \"jar\": \"7bb135b081952f6d32d83374619ae5201b05ca3bf862a28dd111016ce19b2c07\"\n      },\n      \"version\": \"3.5.0.Final\"\n    },\n    \"org.latencyutils:LatencyUtils\": {\n      \"shasums\": {\n        \"jar\": \"a32a9ffa06b2f4e01c5360f8f9df7bc5d9454a5d373cd8f361347fa5a57165ec\"\n      },\n      \"version\": \"2.0.3\"\n    },\n    \"org.ow2.asm:asm\": {\n      \"shasums\": {\n        \"jar\": \"8cadd43ac5eb6d09de05faecca38b917a040bb9139c7edeb4cc81c740b713281\"\n      },\n      \"version\": \"9.7.1\"\n    },\n    \"org.reactivestreams:reactive-streams\": {\n      \"shasums\": {\n        \"jar\": \"f75ca597789b3dac58f61857b9ac2e1034a68fa672db35055a8fb4509e325f28\"\n      },\n      \"version\": \"1.0.4\"\n    },\n    \"org.slf4j:jul-to-slf4j\": {\n      \"shasums\": {\n        \"jar\": \"a7afcd23b9cfd1475e55c94f943b808c5922035e7e2c2a5c65a487a4106bc538\"\n      },\n      \"version\": \"2.0.17\"\n    },\n    \"org.springframework.boot:spring-boot\": {\n      \"shasums\": {\n        \"jar\": \"272efd80096c864ad93edb9c08f450cc37f7f997505a1b0c458587b71a3e6268\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-actuator\": {\n      \"shasums\": {\n        \"jar\": \"71e5276161f7c12762db6ab300f58d2245c9b08bfb1812575c4b002b332ebceb\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-actuator-autoconfigure\": {\n      \"shasums\": {\n        \"jar\": \"93890fa4ef7910a898a9e232b4ea1cc4bd8eb6ab4142223ae8d51fca6d6e1f74\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-autoconfigure\": {\n      \"shasums\": {\n        \"jar\": \"1208dc518180e167fa88ec446b884c83e34dd725710d99a74f641b9365a18c06\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter\": {\n      \"shasums\": {\n        \"jar\": \"b291bc2f379336f694dffed5ce336e8edce9da8a15219db06a11f09320c5dc55\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter-actuator\": {\n      \"shasums\": {\n        \"jar\": \"5c1dfa56fcb647787bcd6a4fe366088f1e5ad17c64d305037b79992e04b1a228\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter-aop\": {\n      \"shasums\": {\n        \"jar\": \"1cf976b4b25c6b760aee40f0ebd124cc204ccc0e7552611caa72c071d6111498\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter-data-jpa\": {\n      \"shasums\": {\n        \"jar\": \"5d7c8a837febe81036be3fdd1e6c3a6c2a23f40bdea49cd32b3f1eae7082288f\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter-jdbc\": {\n      \"shasums\": {\n        \"jar\": \"5ac7ad87c798228c3fe49b795fecc51157c34f491da3955231ff2297796e7c7d\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter-json\": {\n      \"shasums\": {\n        \"jar\": \"92ba33d0391aa614374908b20d1f36d6f1c0f4f826653f3ee3a2aacfbe9f49f1\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter-logging\": {\n      \"shasums\": {\n        \"jar\": \"a1d67dff13759a3026a2b4553a31f6a7ce36b023a64c089d8fb5f8c0b57ef845\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter-oauth2-client\": {\n      \"shasums\": {\n        \"jar\": \"3c6a465d3c50ca0ecca27aeb855337f57f874b169e6016257b85cf3caa071af4\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter-reactor-netty\": {\n      \"shasums\": {\n        \"jar\": \"e74d7a7b7c4f27228aaf8c11b44cb16a70625872d6d289e37b6fdae35aa01667\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter-security\": {\n      \"shasums\": {\n        \"jar\": \"5bf38ff034ab0ba4bc0dbd283b179d891d5474de589023fa4353573bde7465a1\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.boot:spring-boot-starter-webflux\": {\n      \"shasums\": {\n        \"jar\": \"b94a72c52df6de912200da66a3428db2704bdd65906cf33076fba4b69c878e99\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.data:spring-data-commons\": {\n      \"shasums\": {\n        \"jar\": \"9b83476c0317eff9efb322147822a80f1d5856d12d854526354d93755c440efd\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.data:spring-data-jpa\": {\n      \"shasums\": {\n        \"jar\": \"fe1585a655384ae6ccc7772cebf2d55f1b2156cff574be0a313f959387bee6ef\"\n      },\n      \"version\": \"3.3.11\"\n    },\n    \"org.springframework.security:spring-security-config\": {\n      \"shasums\": {\n        \"jar\": \"c2b2eb838107c4f6f06a26ae4d6bf895d8661b82299bf382d7fa8aeb23540c88\"\n      },\n      \"version\": \"6.3.9\"\n    },\n    \"org.springframework.security:spring-security-core\": {\n      \"shasums\": {\n        \"jar\": \"c3b06c4c7e4cc437363785b94d5ac57af5a08ff54046bfecf4c387220660be06\"\n      },\n      \"version\": \"6.3.9\"\n    },\n    \"org.springframework.security:spring-security-crypto\": {\n      \"shasums\": {\n        \"jar\": \"73487877b5a8254800e659a42c0311fe5c26fe9cb780d8ff9d4bca04fd10c1e8\"\n      },\n      \"version\": \"6.3.9\"\n    },\n    \"org.springframework.security:spring-security-oauth2-client\": {\n      \"shasums\": {\n        \"jar\": \"d838f0f7e32a6fe61bdc115d01cafa3e34a9264a55f1a45454127ffad3ddf38f\"\n      },\n      \"version\": \"6.3.9\"\n    },\n    \"org.springframework.security:spring-security-oauth2-core\": {\n      \"shasums\": {\n        \"jar\": \"01ea819beeea787b7811b219044a4267bf68752661b3d5342714ff2fab01b4a2\"\n      },\n      \"version\": \"6.3.9\"\n    },\n    \"org.springframework.security:spring-security-oauth2-jose\": {\n      \"shasums\": {\n        \"jar\": \"c907f67c092fda877a6293201b46f8a324fcb3ed0e1c27de7035622e12f99303\"\n      },\n      \"version\": \"6.3.9\"\n    },\n    \"org.springframework.security:spring-security-web\": {\n      \"shasums\": {\n        \"jar\": \"0d452463f5a860da963873842e72dbb96c0198513d19d186cd15fadb111344ab\"\n      },\n      \"version\": \"6.3.9\"\n    },\n    \"org.springframework:spring-aop\": {\n      \"shasums\": {\n        \"jar\": \"82bf739839ef60d10562958d7dc087380429845eeeef054315c2efe7b54f2483\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-aspects\": {\n      \"shasums\": {\n        \"jar\": \"d08965039bedb8f8fdd8a53030d295ea521e36ac6dc3f63af9f53496389213af\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-beans\": {\n      \"shasums\": {\n        \"jar\": \"84150f8f35ddbf8369a64b657657778486bdae3286557be54b8b3d9f010fad06\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-context\": {\n      \"shasums\": {\n        \"jar\": \"656af67029d5ba799cfe30b24446645e91c8cf13b5ca726f12c184c5fe78bf74\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-core\": {\n      \"shasums\": {\n        \"jar\": \"a46e9b693d6be2cce3bc3f2b6ed144c4a7198dcc5c355ca3c63b383d8e911800\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-expression\": {\n      \"shasums\": {\n        \"jar\": \"b7e3261e447920172dbfa6e9d82f69be084ebed7e156274564b729a0fa2e61ae\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-jcl\": {\n      \"shasums\": {\n        \"jar\": \"076ebc259dd90ee15bf5f971dc97a04d0432a134178bd7c9d6cf5f15b6085291\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-jdbc\": {\n      \"shasums\": {\n        \"jar\": \"67bb0c275ac3a9b32e156e2ae637cd0831e37f794c62dc2e271ec6a66c9fa35b\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-orm\": {\n      \"shasums\": {\n        \"jar\": \"278fea298e0614f4d4a87f732e678a8893b9cf2b5a08ac725127eb793ab814bc\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-tx\": {\n      \"shasums\": {\n        \"jar\": \"1885574985d8c15c87dbdeb1fc75216dc57e648cc803ac576a53dc8d614a2c2d\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-web\": {\n      \"shasums\": {\n        \"jar\": \"163d2155b9ac25eb56b26fd5bf667192c4290992bc0444f90033a81f5f6e887e\"\n      },\n      \"version\": \"6.1.19\"\n    },\n    \"org.springframework:spring-webflux\": {\n      \"shasums\": {\n        \"jar\": \"5b36df8cb148e5003df7f2bf2fc713c002c883108f27d92a89461c3909d09346\"\n      },\n      \"version\": \"6.1.19\"\n    }\n  },\n  \"dependencies\": {\n    \"ch.qos.logback:logback-classic\": [\n      \"ch.qos.logback:logback-core\"\n    ],\n    \"com.fasterxml.jackson.core:jackson-databind\": [\n      \"com.fasterxml.jackson.core:jackson-annotations\",\n      \"com.fasterxml.jackson.core:jackson-core\"\n    ],\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\": [\n      \"com.fasterxml.jackson.core:jackson-core\",\n      \"com.fasterxml.jackson.core:jackson-databind\"\n    ],\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\": [\n      \"com.fasterxml.jackson.core:jackson-annotations\",\n      \"com.fasterxml.jackson.core:jackson-core\",\n      \"com.fasterxml.jackson.core:jackson-databind\"\n    ],\n    \"com.fasterxml.jackson.module:jackson-module-parameter-names\": [\n      \"com.fasterxml.jackson.core:jackson-core\",\n      \"com.fasterxml.jackson.core:jackson-databind\"\n    ],\n    \"com.nimbusds:nimbus-jose-jwt\": [\n      \"com.github.stephenc.jcip:jcip-annotations\"\n    ],\n    \"com.nimbusds:oauth2-oidc-sdk\": [\n      \"com.github.stephenc.jcip:jcip-annotations\",\n      \"com.nimbusds:content-type\",\n      \"com.nimbusds:lang-tag\",\n      \"com.nimbusds:nimbus-jose-jwt\",\n      \"net.minidev:json-smart\"\n    ],\n    \"io.micrometer:micrometer-core\": [\n      \"io.micrometer:micrometer-commons\",\n      \"io.micrometer:micrometer-observation\",\n      \"org.hdrhistogram:HdrHistogram\",\n      \"org.latencyutils:LatencyUtils\"\n    ],\n    \"io.micrometer:micrometer-jakarta9\": [\n      \"io.micrometer:micrometer-commons\",\n      \"io.micrometer:micrometer-core\",\n      \"io.micrometer:micrometer-observation\"\n    ],\n    \"io.micrometer:micrometer-observation\": [\n      \"io.micrometer:micrometer-commons\"\n    ],\n    \"io.netty:netty-buffer\": [\n      \"io.netty:netty-common\"\n    ],\n    \"io.netty:netty-codec\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-transport\"\n    ],\n    \"io.netty:netty-codec-dns\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-codec\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-transport\"\n    ],\n    \"io.netty:netty-codec-http\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-codec\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-handler\",\n      \"io.netty:netty-transport\"\n    ],\n    \"io.netty:netty-codec-http2\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-codec\",\n      \"io.netty:netty-codec-http\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-handler\",\n      \"io.netty:netty-transport\"\n    ],\n    \"io.netty:netty-codec-socks\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-codec\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-transport\"\n    ],\n    \"io.netty:netty-handler\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-codec\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-resolver\",\n      \"io.netty:netty-transport\",\n      \"io.netty:netty-transport-native-unix-common\"\n    ],\n    \"io.netty:netty-handler-proxy\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-codec\",\n      \"io.netty:netty-codec-http\",\n      \"io.netty:netty-codec-socks\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-transport\"\n    ],\n    \"io.netty:netty-resolver\": [\n      \"io.netty:netty-common\"\n    ],\n    \"io.netty:netty-resolver-dns\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-codec\",\n      \"io.netty:netty-codec-dns\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-handler\",\n      \"io.netty:netty-resolver\",\n      \"io.netty:netty-transport\"\n    ],\n    \"io.netty:netty-resolver-dns-classes-macos\": [\n      \"io.netty:netty-common\",\n      \"io.netty:netty-resolver-dns\",\n      \"io.netty:netty-transport-native-unix-common\"\n    ],\n    \"io.netty:netty-resolver-dns-native-macos:jar:osx-x86_64\": [\n      \"io.netty:netty-resolver-dns-classes-macos\"\n    ],\n    \"io.netty:netty-transport\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-resolver\"\n    ],\n    \"io.netty:netty-transport-classes-epoll\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-transport\",\n      \"io.netty:netty-transport-native-unix-common\"\n    ],\n    \"io.netty:netty-transport-native-epoll:jar:linux-x86_64\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-transport\",\n      \"io.netty:netty-transport-classes-epoll\",\n      \"io.netty:netty-transport-native-unix-common\"\n    ],\n    \"io.netty:netty-transport-native-unix-common\": [\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-transport\"\n    ],\n    \"io.projectreactor.netty:reactor-netty-core\": [\n      \"io.netty:netty-handler\",\n      \"io.netty:netty-handler-proxy\",\n      \"io.netty:netty-resolver-dns\",\n      \"io.netty:netty-resolver-dns-native-macos:jar:osx-x86_64\",\n      \"io.netty:netty-transport-native-epoll:jar:linux-x86_64\",\n      \"io.projectreactor:reactor-core\"\n    ],\n    \"io.projectreactor.netty:reactor-netty-http\": [\n      \"io.netty:netty-codec-http\",\n      \"io.netty:netty-codec-http2\",\n      \"io.netty:netty-resolver-dns\",\n      \"io.netty:netty-resolver-dns-native-macos:jar:osx-x86_64\",\n      \"io.netty:netty-transport-native-epoll:jar:linux-x86_64\",\n      \"io.projectreactor.netty:reactor-netty-core\",\n      \"io.projectreactor:reactor-core\"\n    ],\n    \"io.projectreactor:reactor-core\": [\n      \"org.reactivestreams:reactive-streams\"\n    ],\n    \"jakarta.xml.bind:jakarta.xml.bind-api\": [\n      \"jakarta.activation:jakarta.activation-api\"\n    ],\n    \"junit:junit\": [\n      \"org.hamcrest:hamcrest-core\"\n    ],\n    \"net.minidev:accessors-smart\": [\n      \"org.ow2.asm:asm\"\n    ],\n    \"net.minidev:json-smart\": [\n      \"net.minidev:accessors-smart\"\n    ],\n    \"org.apache.logging.log4j:log4j-to-slf4j\": [\n      \"org.apache.logging.log4j:log4j-api\"\n    ],\n    \"org.assertj:assertj-core\": [\n      \"net.bytebuddy:byte-buddy\"\n    ],\n    \"org.eclipse.angus:angus-activation\": [\n      \"jakarta.activation:jakarta.activation-api\"\n    ],\n    \"org.glassfish.jaxb:jaxb-core\": [\n      \"com.sun.istack:istack-commons-runtime\",\n      \"jakarta.activation:jakarta.activation-api\",\n      \"jakarta.xml.bind:jakarta.xml.bind-api\",\n      \"org.eclipse.angus:angus-activation\",\n      \"org.glassfish.jaxb:txw2\"\n    ],\n    \"org.glassfish.jaxb:jaxb-runtime\": [\n      \"org.glassfish.jaxb:jaxb-core\"\n    ],\n    \"org.hibernate.orm:hibernate-core\": [\n      \"com.fasterxml:classmate\",\n      \"io.smallrye:jandex\",\n      \"jakarta.inject:jakarta.inject-api\",\n      \"jakarta.persistence:jakarta.persistence-api\",\n      \"jakarta.transaction:jakarta.transaction-api\",\n      \"jakarta.xml.bind:jakarta.xml.bind-api\",\n      \"net.bytebuddy:byte-buddy\",\n      \"org.antlr:antlr4-runtime\",\n      \"org.glassfish.jaxb:jaxb-runtime\",\n      \"org.hibernate.common:hibernate-commons-annotations\",\n      \"org.jboss.logging:jboss-logging\"\n    ],\n    \"org.springframework.boot:spring-boot\": [\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework.boot:spring-boot-actuator\": [\n      \"org.springframework.boot:spring-boot\"\n    ],\n    \"org.springframework.boot:spring-boot-actuator-autoconfigure\": [\n      \"com.fasterxml.jackson.core:jackson-databind\",\n      \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\",\n      \"org.springframework.boot:spring-boot\",\n      \"org.springframework.boot:spring-boot-actuator\",\n      \"org.springframework.boot:spring-boot-autoconfigure\"\n    ],\n    \"org.springframework.boot:spring-boot-autoconfigure\": [\n      \"org.springframework.boot:spring-boot\"\n    ],\n    \"org.springframework.boot:spring-boot-starter\": [\n      \"jakarta.annotation:jakarta.annotation-api\",\n      \"org.springframework.boot:spring-boot\",\n      \"org.springframework.boot:spring-boot-autoconfigure\",\n      \"org.springframework.boot:spring-boot-starter-logging\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-actuator\": [\n      \"io.micrometer:micrometer-jakarta9\",\n      \"io.micrometer:micrometer-observation\",\n      \"org.springframework.boot:spring-boot-actuator-autoconfigure\",\n      \"org.springframework.boot:spring-boot-starter\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-aop\": [\n      \"org.aspectj:aspectjweaver\",\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework:spring-aop\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-data-jpa\": [\n      \"org.hibernate.orm:hibernate-core\",\n      \"org.springframework.boot:spring-boot-starter-aop\",\n      \"org.springframework.boot:spring-boot-starter-jdbc\",\n      \"org.springframework.data:spring-data-jpa\",\n      \"org.springframework:spring-aspects\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-jdbc\": [\n      \"com.zaxxer:HikariCP\",\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework:spring-jdbc\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-json\": [\n      \"com.fasterxml.jackson.core:jackson-databind\",\n      \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\",\n      \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\",\n      \"com.fasterxml.jackson.module:jackson-module-parameter-names\",\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework:spring-web\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-logging\": [\n      \"ch.qos.logback:logback-classic\",\n      \"org.apache.logging.log4j:log4j-to-slf4j\",\n      \"org.slf4j:jul-to-slf4j\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-oauth2-client\": [\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework.security:spring-security-config\",\n      \"org.springframework.security:spring-security-core\",\n      \"org.springframework.security:spring-security-oauth2-client\",\n      \"org.springframework.security:spring-security-oauth2-jose\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-reactor-netty\": [\n      \"io.projectreactor.netty:reactor-netty-http\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-security\": [\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework.security:spring-security-config\",\n      \"org.springframework.security:spring-security-web\",\n      \"org.springframework:spring-aop\"\n    ],\n    \"org.springframework.boot:spring-boot-starter-webflux\": [\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework.boot:spring-boot-starter-json\",\n      \"org.springframework.boot:spring-boot-starter-reactor-netty\",\n      \"org.springframework:spring-web\",\n      \"org.springframework:spring-webflux\"\n    ],\n    \"org.springframework.data:spring-data-commons\": [\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework.data:spring-data-jpa\": [\n      \"jakarta.annotation:jakarta.annotation-api\",\n      \"org.antlr:antlr4-runtime\",\n      \"org.springframework.data:spring-data-commons\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-orm\",\n      \"org.springframework:spring-tx\"\n    ],\n    \"org.springframework.security:spring-security-config\": [\n      \"org.springframework.security:spring-security-core\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework.security:spring-security-core\": [\n      \"io.micrometer:micrometer-observation\",\n      \"org.springframework.security:spring-security-crypto\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-expression\"\n    ],\n    \"org.springframework.security:spring-security-oauth2-client\": [\n      \"com.nimbusds:oauth2-oidc-sdk\",\n      \"org.springframework.security:spring-security-core\",\n      \"org.springframework.security:spring-security-oauth2-core\",\n      \"org.springframework.security:spring-security-web\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework.security:spring-security-oauth2-core\": [\n      \"org.springframework.security:spring-security-core\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-web\"\n    ],\n    \"org.springframework.security:spring-security-oauth2-jose\": [\n      \"com.nimbusds:nimbus-jose-jwt\",\n      \"org.springframework.security:spring-security-core\",\n      \"org.springframework.security:spring-security-oauth2-core\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework.security:spring-security-web\": [\n      \"org.springframework.security:spring-security-core\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-expression\",\n      \"org.springframework:spring-web\"\n    ],\n    \"org.springframework:spring-aop\": [\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-aspects\": [\n      \"org.aspectj:aspectjweaver\"\n    ],\n    \"org.springframework:spring-beans\": [\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-context\": [\n      \"io.micrometer:micrometer-observation\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-expression\"\n    ],\n    \"org.springframework:spring-core\": [\n      \"org.springframework:spring-jcl\"\n    ],\n    \"org.springframework:spring-expression\": [\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-jdbc\": [\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-tx\"\n    ],\n    \"org.springframework:spring-orm\": [\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-jdbc\",\n      \"org.springframework:spring-tx\"\n    ],\n    \"org.springframework:spring-tx\": [\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-web\": [\n      \"io.micrometer:micrometer-observation\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\"\n    ],\n    \"org.springframework:spring-webflux\": [\n      \"io.projectreactor:reactor-core\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-web\"\n    ]\n  },\n  \"packages\": {\n    \"ch.qos.logback:logback-classic\": [\n      \"ch.qos.logback.classic\",\n      \"ch.qos.logback.classic.boolex\",\n      \"ch.qos.logback.classic.encoder\",\n      \"ch.qos.logback.classic.filter\",\n      \"ch.qos.logback.classic.helpers\",\n      \"ch.qos.logback.classic.html\",\n      \"ch.qos.logback.classic.joran\",\n      \"ch.qos.logback.classic.joran.action\",\n      \"ch.qos.logback.classic.joran.sanity\",\n      \"ch.qos.logback.classic.joran.serializedModel\",\n      \"ch.qos.logback.classic.jul\",\n      \"ch.qos.logback.classic.layout\",\n      \"ch.qos.logback.classic.log4j\",\n      \"ch.qos.logback.classic.model\",\n      \"ch.qos.logback.classic.model.processor\",\n      \"ch.qos.logback.classic.model.util\",\n      \"ch.qos.logback.classic.net\",\n      \"ch.qos.logback.classic.net.server\",\n      \"ch.qos.logback.classic.pattern\",\n      \"ch.qos.logback.classic.pattern.color\",\n      \"ch.qos.logback.classic.selector\",\n      \"ch.qos.logback.classic.selector.servlet\",\n      \"ch.qos.logback.classic.servlet\",\n      \"ch.qos.logback.classic.sift\",\n      \"ch.qos.logback.classic.spi\",\n      \"ch.qos.logback.classic.turbo\",\n      \"ch.qos.logback.classic.tyler\",\n      \"ch.qos.logback.classic.util\"\n    ],\n    \"ch.qos.logback:logback-core\": [\n      \"ch.qos.logback.core\",\n      \"ch.qos.logback.core.boolex\",\n      \"ch.qos.logback.core.encoder\",\n      \"ch.qos.logback.core.filter\",\n      \"ch.qos.logback.core.helpers\",\n      \"ch.qos.logback.core.hook\",\n      \"ch.qos.logback.core.html\",\n      \"ch.qos.logback.core.joran\",\n      \"ch.qos.logback.core.joran.action\",\n      \"ch.qos.logback.core.joran.conditional\",\n      \"ch.qos.logback.core.joran.event\",\n      \"ch.qos.logback.core.joran.node\",\n      \"ch.qos.logback.core.joran.sanity\",\n      \"ch.qos.logback.core.joran.spi\",\n      \"ch.qos.logback.core.joran.util\",\n      \"ch.qos.logback.core.joran.util.beans\",\n      \"ch.qos.logback.core.layout\",\n      \"ch.qos.logback.core.model\",\n      \"ch.qos.logback.core.model.conditional\",\n      \"ch.qos.logback.core.model.processor\",\n      \"ch.qos.logback.core.model.processor.conditional\",\n      \"ch.qos.logback.core.model.util\",\n      \"ch.qos.logback.core.net\",\n      \"ch.qos.logback.core.net.server\",\n      \"ch.qos.logback.core.net.ssl\",\n      \"ch.qos.logback.core.pattern\",\n      \"ch.qos.logback.core.pattern.color\",\n      \"ch.qos.logback.core.pattern.parser\",\n      \"ch.qos.logback.core.pattern.util\",\n      \"ch.qos.logback.core.property\",\n      \"ch.qos.logback.core.read\",\n      \"ch.qos.logback.core.recovery\",\n      \"ch.qos.logback.core.rolling\",\n      \"ch.qos.logback.core.rolling.helper\",\n      \"ch.qos.logback.core.sift\",\n      \"ch.qos.logback.core.spi\",\n      \"ch.qos.logback.core.status\",\n      \"ch.qos.logback.core.subst\",\n      \"ch.qos.logback.core.testUtil\",\n      \"ch.qos.logback.core.util\"\n    ],\n    \"com.fasterxml.jackson.core:jackson-annotations\": [\n      \"com.fasterxml.jackson.annotation\"\n    ],\n    \"com.fasterxml.jackson.core:jackson-core\": [\n      \"com.fasterxml.jackson.core\",\n      \"com.fasterxml.jackson.core.async\",\n      \"com.fasterxml.jackson.core.base\",\n      \"com.fasterxml.jackson.core.exc\",\n      \"com.fasterxml.jackson.core.filter\",\n      \"com.fasterxml.jackson.core.format\",\n      \"com.fasterxml.jackson.core.io\",\n      \"com.fasterxml.jackson.core.io.doubleparser\",\n      \"com.fasterxml.jackson.core.io.schubfach\",\n      \"com.fasterxml.jackson.core.json\",\n      \"com.fasterxml.jackson.core.json.async\",\n      \"com.fasterxml.jackson.core.sym\",\n      \"com.fasterxml.jackson.core.type\",\n      \"com.fasterxml.jackson.core.util\"\n    ],\n    \"com.fasterxml.jackson.core:jackson-databind\": [\n      \"com.fasterxml.jackson.databind\",\n      \"com.fasterxml.jackson.databind.annotation\",\n      \"com.fasterxml.jackson.databind.cfg\",\n      \"com.fasterxml.jackson.databind.deser\",\n      \"com.fasterxml.jackson.databind.deser.impl\",\n      \"com.fasterxml.jackson.databind.deser.std\",\n      \"com.fasterxml.jackson.databind.exc\",\n      \"com.fasterxml.jackson.databind.ext\",\n      \"com.fasterxml.jackson.databind.introspect\",\n      \"com.fasterxml.jackson.databind.jdk14\",\n      \"com.fasterxml.jackson.databind.json\",\n      \"com.fasterxml.jackson.databind.jsonFormatVisitors\",\n      \"com.fasterxml.jackson.databind.jsonschema\",\n      \"com.fasterxml.jackson.databind.jsontype\",\n      \"com.fasterxml.jackson.databind.jsontype.impl\",\n      \"com.fasterxml.jackson.databind.module\",\n      \"com.fasterxml.jackson.databind.node\",\n      \"com.fasterxml.jackson.databind.ser\",\n      \"com.fasterxml.jackson.databind.ser.impl\",\n      \"com.fasterxml.jackson.databind.ser.std\",\n      \"com.fasterxml.jackson.databind.type\",\n      \"com.fasterxml.jackson.databind.util\",\n      \"com.fasterxml.jackson.databind.util.internal\"\n    ],\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\": [\n      \"com.fasterxml.jackson.datatype.jdk8\"\n    ],\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\": [\n      \"com.fasterxml.jackson.datatype.jsr310\",\n      \"com.fasterxml.jackson.datatype.jsr310.deser\",\n      \"com.fasterxml.jackson.datatype.jsr310.deser.key\",\n      \"com.fasterxml.jackson.datatype.jsr310.ser\",\n      \"com.fasterxml.jackson.datatype.jsr310.ser.key\",\n      \"com.fasterxml.jackson.datatype.jsr310.util\"\n    ],\n    \"com.fasterxml.jackson.module:jackson-module-parameter-names\": [\n      \"com.fasterxml.jackson.module.paramnames\"\n    ],\n    \"com.fasterxml:classmate\": [\n      \"com.fasterxml.classmate\",\n      \"com.fasterxml.classmate.members\",\n      \"com.fasterxml.classmate.types\",\n      \"com.fasterxml.classmate.util\"\n    ],\n    \"com.github.stephenc.jcip:jcip-annotations\": [\n      \"net.jcip.annotations\"\n    ],\n    \"com.nimbusds:content-type\": [\n      \"com.nimbusds.common.contenttype\"\n    ],\n    \"com.nimbusds:lang-tag\": [\n      \"com.nimbusds.langtag\"\n    ],\n    \"com.nimbusds:nimbus-jose-jwt\": [\n      \"com.nimbusds.jose\",\n      \"com.nimbusds.jose.crypto\",\n      \"com.nimbusds.jose.crypto.bc\",\n      \"com.nimbusds.jose.crypto.factories\",\n      \"com.nimbusds.jose.crypto.impl\",\n      \"com.nimbusds.jose.crypto.opts\",\n      \"com.nimbusds.jose.crypto.utils\",\n      \"com.nimbusds.jose.jca\",\n      \"com.nimbusds.jose.jwk\",\n      \"com.nimbusds.jose.jwk.gen\",\n      \"com.nimbusds.jose.jwk.source\",\n      \"com.nimbusds.jose.mint\",\n      \"com.nimbusds.jose.proc\",\n      \"com.nimbusds.jose.produce\",\n      \"com.nimbusds.jose.shaded.gson\",\n      \"com.nimbusds.jose.shaded.gson.annotations\",\n      \"com.nimbusds.jose.shaded.gson.internal\",\n      \"com.nimbusds.jose.shaded.gson.internal.bind\",\n      \"com.nimbusds.jose.shaded.gson.internal.bind.util\",\n      \"com.nimbusds.jose.shaded.gson.internal.reflect\",\n      \"com.nimbusds.jose.shaded.gson.internal.sql\",\n      \"com.nimbusds.jose.shaded.gson.reflect\",\n      \"com.nimbusds.jose.shaded.gson.stream\",\n      \"com.nimbusds.jose.util\",\n      \"com.nimbusds.jose.util.cache\",\n      \"com.nimbusds.jose.util.events\",\n      \"com.nimbusds.jose.util.health\",\n      \"com.nimbusds.jwt\",\n      \"com.nimbusds.jwt.proc\",\n      \"com.nimbusds.jwt.util\"\n    ],\n    \"com.nimbusds:oauth2-oidc-sdk\": [\n      \"com.nimbusds.oauth2.sdk\",\n      \"com.nimbusds.oauth2.sdk.as\",\n      \"com.nimbusds.oauth2.sdk.assertions\",\n      \"com.nimbusds.oauth2.sdk.assertions.jwt\",\n      \"com.nimbusds.oauth2.sdk.assertions.saml2\",\n      \"com.nimbusds.oauth2.sdk.auth\",\n      \"com.nimbusds.oauth2.sdk.auth.verifier\",\n      \"com.nimbusds.oauth2.sdk.ciba\",\n      \"com.nimbusds.oauth2.sdk.client\",\n      \"com.nimbusds.oauth2.sdk.device\",\n      \"com.nimbusds.oauth2.sdk.dpop\",\n      \"com.nimbusds.oauth2.sdk.dpop.verifiers\",\n      \"com.nimbusds.oauth2.sdk.http\",\n      \"com.nimbusds.oauth2.sdk.id\",\n      \"com.nimbusds.oauth2.sdk.jarm\",\n      \"com.nimbusds.oauth2.sdk.jose\",\n      \"com.nimbusds.oauth2.sdk.pkce\",\n      \"com.nimbusds.oauth2.sdk.token\",\n      \"com.nimbusds.oauth2.sdk.tokenexchange\",\n      \"com.nimbusds.oauth2.sdk.util\",\n      \"com.nimbusds.oauth2.sdk.util.date\",\n      \"com.nimbusds.oauth2.sdk.util.singleuse\",\n      \"com.nimbusds.oauth2.sdk.util.tls\",\n      \"com.nimbusds.openid.connect.sdk\",\n      \"com.nimbusds.openid.connect.sdk.assurance\",\n      \"com.nimbusds.openid.connect.sdk.assurance.claims\",\n      \"com.nimbusds.openid.connect.sdk.assurance.evidences\",\n      \"com.nimbusds.openid.connect.sdk.assurance.evidences.attachment\",\n      \"com.nimbusds.openid.connect.sdk.assurance.request\",\n      \"com.nimbusds.openid.connect.sdk.claims\",\n      \"com.nimbusds.openid.connect.sdk.federation\",\n      \"com.nimbusds.openid.connect.sdk.federation.api\",\n      \"com.nimbusds.openid.connect.sdk.federation.config\",\n      \"com.nimbusds.openid.connect.sdk.federation.entities\",\n      \"com.nimbusds.openid.connect.sdk.federation.policy\",\n      \"com.nimbusds.openid.connect.sdk.federation.policy.factories\",\n      \"com.nimbusds.openid.connect.sdk.federation.policy.language\",\n      \"com.nimbusds.openid.connect.sdk.federation.policy.operations\",\n      \"com.nimbusds.openid.connect.sdk.federation.registration\",\n      \"com.nimbusds.openid.connect.sdk.federation.trust\",\n      \"com.nimbusds.openid.connect.sdk.federation.trust.constraints\",\n      \"com.nimbusds.openid.connect.sdk.federation.trust.marks\",\n      \"com.nimbusds.openid.connect.sdk.id\",\n      \"com.nimbusds.openid.connect.sdk.op\",\n      \"com.nimbusds.openid.connect.sdk.rp\",\n      \"com.nimbusds.openid.connect.sdk.rp.statement\",\n      \"com.nimbusds.openid.connect.sdk.token\",\n      \"com.nimbusds.openid.connect.sdk.validators\",\n      \"com.nimbusds.secevent.sdk.claims\"\n    ],\n    \"com.sun.istack:istack-commons-runtime\": [\n      \"com.sun.istack\",\n      \"com.sun.istack.localization\",\n      \"com.sun.istack.logging\"\n    ],\n    \"com.zaxxer:HikariCP\": [\n      \"com.zaxxer.hikari\",\n      \"com.zaxxer.hikari.hibernate\",\n      \"com.zaxxer.hikari.metrics\",\n      \"com.zaxxer.hikari.metrics.dropwizard\",\n      \"com.zaxxer.hikari.metrics.micrometer\",\n      \"com.zaxxer.hikari.metrics.prometheus\",\n      \"com.zaxxer.hikari.pool\",\n      \"com.zaxxer.hikari.util\"\n    ],\n    \"io.micrometer:micrometer-commons\": [\n      \"io.micrometer.common\",\n      \"io.micrometer.common.annotation\",\n      \"io.micrometer.common.docs\",\n      \"io.micrometer.common.lang\",\n      \"io.micrometer.common.util\",\n      \"io.micrometer.common.util.internal.logging\"\n    ],\n    \"io.micrometer:micrometer-core\": [\n      \"io.micrometer.core.annotation\",\n      \"io.micrometer.core.aop\",\n      \"io.micrometer.core.instrument\",\n      \"io.micrometer.core.instrument.binder\",\n      \"io.micrometer.core.instrument.binder.cache\",\n      \"io.micrometer.core.instrument.binder.commonspool2\",\n      \"io.micrometer.core.instrument.binder.db\",\n      \"io.micrometer.core.instrument.binder.grpc\",\n      \"io.micrometer.core.instrument.binder.http\",\n      \"io.micrometer.core.instrument.binder.httpcomponents\",\n      \"io.micrometer.core.instrument.binder.httpcomponents.hc5\",\n      \"io.micrometer.core.instrument.binder.hystrix\",\n      \"io.micrometer.core.instrument.binder.jdk\",\n      \"io.micrometer.core.instrument.binder.jersey.server\",\n      \"io.micrometer.core.instrument.binder.jetty\",\n      \"io.micrometer.core.instrument.binder.jpa\",\n      \"io.micrometer.core.instrument.binder.jvm\",\n      \"io.micrometer.core.instrument.binder.kafka\",\n      \"io.micrometer.core.instrument.binder.logging\",\n      \"io.micrometer.core.instrument.binder.mongodb\",\n      \"io.micrometer.core.instrument.binder.netty4\",\n      \"io.micrometer.core.instrument.binder.okhttp3\",\n      \"io.micrometer.core.instrument.binder.system\",\n      \"io.micrometer.core.instrument.binder.tomcat\",\n      \"io.micrometer.core.instrument.composite\",\n      \"io.micrometer.core.instrument.config\",\n      \"io.micrometer.core.instrument.config.validate\",\n      \"io.micrometer.core.instrument.cumulative\",\n      \"io.micrometer.core.instrument.distribution\",\n      \"io.micrometer.core.instrument.distribution.pause\",\n      \"io.micrometer.core.instrument.docs\",\n      \"io.micrometer.core.instrument.dropwizard\",\n      \"io.micrometer.core.instrument.internal\",\n      \"io.micrometer.core.instrument.kotlin\",\n      \"io.micrometer.core.instrument.logging\",\n      \"io.micrometer.core.instrument.noop\",\n      \"io.micrometer.core.instrument.observation\",\n      \"io.micrometer.core.instrument.push\",\n      \"io.micrometer.core.instrument.search\",\n      \"io.micrometer.core.instrument.simple\",\n      \"io.micrometer.core.instrument.step\",\n      \"io.micrometer.core.instrument.util\",\n      \"io.micrometer.core.ipc.http\",\n      \"io.micrometer.core.lang\",\n      \"io.micrometer.core.util.internal.logging\"\n    ],\n    \"io.micrometer:micrometer-jakarta9\": [\n      \"io.micrometer.jakarta9.instrument.jms\"\n    ],\n    \"io.micrometer:micrometer-observation\": [\n      \"io.micrometer.observation\",\n      \"io.micrometer.observation.annotation\",\n      \"io.micrometer.observation.aop\",\n      \"io.micrometer.observation.contextpropagation\",\n      \"io.micrometer.observation.docs\",\n      \"io.micrometer.observation.transport\"\n    ],\n    \"io.netty:netty-buffer\": [\n      \"io.netty.buffer\",\n      \"io.netty.buffer.search\"\n    ],\n    \"io.netty:netty-codec\": [\n      \"io.netty.handler.codec\",\n      \"io.netty.handler.codec.base64\",\n      \"io.netty.handler.codec.bytes\",\n      \"io.netty.handler.codec.compression\",\n      \"io.netty.handler.codec.json\",\n      \"io.netty.handler.codec.marshalling\",\n      \"io.netty.handler.codec.protobuf\",\n      \"io.netty.handler.codec.serialization\",\n      \"io.netty.handler.codec.string\",\n      \"io.netty.handler.codec.xml\"\n    ],\n    \"io.netty:netty-codec-dns\": [\n      \"io.netty.handler.codec.dns\"\n    ],\n    \"io.netty:netty-codec-http\": [\n      \"io.netty.handler.codec.http\",\n      \"io.netty.handler.codec.http.cookie\",\n      \"io.netty.handler.codec.http.cors\",\n      \"io.netty.handler.codec.http.multipart\",\n      \"io.netty.handler.codec.http.websocketx\",\n      \"io.netty.handler.codec.http.websocketx.extensions\",\n      \"io.netty.handler.codec.http.websocketx.extensions.compression\",\n      \"io.netty.handler.codec.rtsp\",\n      \"io.netty.handler.codec.spdy\"\n    ],\n    \"io.netty:netty-codec-http2\": [\n      \"io.netty.handler.codec.http2\"\n    ],\n    \"io.netty:netty-codec-socks\": [\n      \"io.netty.handler.codec.socks\",\n      \"io.netty.handler.codec.socksx\",\n      \"io.netty.handler.codec.socksx.v4\",\n      \"io.netty.handler.codec.socksx.v5\"\n    ],\n    \"io.netty:netty-common\": [\n      \"io.netty.util\",\n      \"io.netty.util.collection\",\n      \"io.netty.util.concurrent\",\n      \"io.netty.util.internal\",\n      \"io.netty.util.internal.logging\",\n      \"io.netty.util.internal.shaded.org.jctools.counters\",\n      \"io.netty.util.internal.shaded.org.jctools.maps\",\n      \"io.netty.util.internal.shaded.org.jctools.queues\",\n      \"io.netty.util.internal.shaded.org.jctools.queues.atomic\",\n      \"io.netty.util.internal.shaded.org.jctools.queues.atomic.unpadded\",\n      \"io.netty.util.internal.shaded.org.jctools.queues.unpadded\",\n      \"io.netty.util.internal.shaded.org.jctools.util\",\n      \"io.netty.util.internal.svm\"\n    ],\n    \"io.netty:netty-handler\": [\n      \"io.netty.handler.address\",\n      \"io.netty.handler.flow\",\n      \"io.netty.handler.flush\",\n      \"io.netty.handler.ipfilter\",\n      \"io.netty.handler.logging\",\n      \"io.netty.handler.pcap\",\n      \"io.netty.handler.ssl\",\n      \"io.netty.handler.ssl.ocsp\",\n      \"io.netty.handler.ssl.util\",\n      \"io.netty.handler.stream\",\n      \"io.netty.handler.timeout\",\n      \"io.netty.handler.traffic\"\n    ],\n    \"io.netty:netty-handler-proxy\": [\n      \"io.netty.handler.proxy\"\n    ],\n    \"io.netty:netty-resolver\": [\n      \"io.netty.resolver\"\n    ],\n    \"io.netty:netty-resolver-dns\": [\n      \"io.netty.resolver.dns\"\n    ],\n    \"io.netty:netty-resolver-dns-classes-macos\": [\n      \"io.netty.resolver.dns.macos\"\n    ],\n    \"io.netty:netty-transport\": [\n      \"io.netty.bootstrap\",\n      \"io.netty.channel\",\n      \"io.netty.channel.embedded\",\n      \"io.netty.channel.group\",\n      \"io.netty.channel.internal\",\n      \"io.netty.channel.local\",\n      \"io.netty.channel.nio\",\n      \"io.netty.channel.oio\",\n      \"io.netty.channel.pool\",\n      \"io.netty.channel.socket\",\n      \"io.netty.channel.socket.nio\",\n      \"io.netty.channel.socket.oio\"\n    ],\n    \"io.netty:netty-transport-classes-epoll\": [\n      \"io.netty.channel.epoll\"\n    ],\n    \"io.netty:netty-transport-native-unix-common\": [\n      \"io.netty.channel.unix\"\n    ],\n    \"io.projectreactor.netty:reactor-netty-core\": [\n      \"reactor.netty\",\n      \"reactor.netty.channel\",\n      \"reactor.netty.contextpropagation\",\n      \"reactor.netty.internal.shaded.reactor.pool\",\n      \"reactor.netty.internal.shaded.reactor.pool.decorators\",\n      \"reactor.netty.internal.shaded.reactor.pool.introspection\",\n      \"reactor.netty.internal.util\",\n      \"reactor.netty.observability\",\n      \"reactor.netty.resources\",\n      \"reactor.netty.tcp\",\n      \"reactor.netty.transport\",\n      \"reactor.netty.transport.logging\",\n      \"reactor.netty.udp\"\n    ],\n    \"io.projectreactor.netty:reactor-netty-http\": [\n      \"reactor.netty.http\",\n      \"reactor.netty.http.client\",\n      \"reactor.netty.http.logging\",\n      \"reactor.netty.http.observability\",\n      \"reactor.netty.http.server\",\n      \"reactor.netty.http.server.logging\",\n      \"reactor.netty.http.websocket\"\n    ],\n    \"io.projectreactor:reactor-core\": [\n      \"reactor.adapter\",\n      \"reactor.core\",\n      \"reactor.core.observability\",\n      \"reactor.core.publisher\",\n      \"reactor.core.scheduler\",\n      \"reactor.util\",\n      \"reactor.util.annotation\",\n      \"reactor.util.concurrent\",\n      \"reactor.util.context\",\n      \"reactor.util.function\",\n      \"reactor.util.retry\"\n    ],\n    \"io.smallrye:jandex\": [\n      \"org.jboss.jandex\"\n    ],\n    \"jakarta.activation:jakarta.activation-api\": [\n      \"jakarta.activation\",\n      \"jakarta.activation.spi\"\n    ],\n    \"jakarta.annotation:jakarta.annotation-api\": [\n      \"jakarta.annotation\",\n      \"jakarta.annotation.security\",\n      \"jakarta.annotation.sql\"\n    ],\n    \"jakarta.inject:jakarta.inject-api\": [\n      \"jakarta.inject\"\n    ],\n    \"jakarta.persistence:jakarta.persistence-api\": [\n      \"jakarta.persistence\",\n      \"jakarta.persistence.criteria\",\n      \"jakarta.persistence.metamodel\",\n      \"jakarta.persistence.spi\"\n    ],\n    \"jakarta.servlet.jsp:jakarta.servlet.jsp-api\": [\n      \"jakarta.servlet.jsp\",\n      \"jakarta.servlet.jsp.el\",\n      \"jakarta.servlet.jsp.tagext\"\n    ],\n    \"jakarta.transaction:jakarta.transaction-api\": [\n      \"jakarta.transaction\"\n    ],\n    \"jakarta.xml.bind:jakarta.xml.bind-api\": [\n      \"jakarta.xml.bind\",\n      \"jakarta.xml.bind.annotation\",\n      \"jakarta.xml.bind.annotation.adapters\",\n      \"jakarta.xml.bind.attachment\",\n      \"jakarta.xml.bind.helpers\",\n      \"jakarta.xml.bind.util\"\n    ],\n    \"junit:junit\": [\n      \"junit.extensions\",\n      \"junit.framework\",\n      \"junit.runner\",\n      \"junit.textui\",\n      \"org.junit\",\n      \"org.junit.experimental\",\n      \"org.junit.experimental.categories\",\n      \"org.junit.experimental.max\",\n      \"org.junit.experimental.results\",\n      \"org.junit.experimental.runners\",\n      \"org.junit.experimental.theories\",\n      \"org.junit.experimental.theories.internal\",\n      \"org.junit.experimental.theories.suppliers\",\n      \"org.junit.function\",\n      \"org.junit.internal\",\n      \"org.junit.internal.builders\",\n      \"org.junit.internal.management\",\n      \"org.junit.internal.matchers\",\n      \"org.junit.internal.requests\",\n      \"org.junit.internal.runners\",\n      \"org.junit.internal.runners.model\",\n      \"org.junit.internal.runners.rules\",\n      \"org.junit.internal.runners.statements\",\n      \"org.junit.matchers\",\n      \"org.junit.rules\",\n      \"org.junit.runner\",\n      \"org.junit.runner.manipulation\",\n      \"org.junit.runner.notification\",\n      \"org.junit.runners\",\n      \"org.junit.runners.model\",\n      \"org.junit.runners.parameterized\",\n      \"org.junit.validator\"\n    ],\n    \"net.bytebuddy:byte-buddy\": [\n      \"net.bytebuddy\",\n      \"net.bytebuddy.agent.builder\",\n      \"net.bytebuddy.asm\",\n      \"net.bytebuddy.build\",\n      \"net.bytebuddy.description\",\n      \"net.bytebuddy.description.annotation\",\n      \"net.bytebuddy.description.enumeration\",\n      \"net.bytebuddy.description.field\",\n      \"net.bytebuddy.description.method\",\n      \"net.bytebuddy.description.modifier\",\n      \"net.bytebuddy.description.type\",\n      \"net.bytebuddy.dynamic\",\n      \"net.bytebuddy.dynamic.loading\",\n      \"net.bytebuddy.dynamic.scaffold\",\n      \"net.bytebuddy.dynamic.scaffold.inline\",\n      \"net.bytebuddy.dynamic.scaffold.subclass\",\n      \"net.bytebuddy.implementation\",\n      \"net.bytebuddy.implementation.attribute\",\n      \"net.bytebuddy.implementation.auxiliary\",\n      \"net.bytebuddy.implementation.bind\",\n      \"net.bytebuddy.implementation.bind.annotation\",\n      \"net.bytebuddy.implementation.bytecode\",\n      \"net.bytebuddy.implementation.bytecode.assign\",\n      \"net.bytebuddy.implementation.bytecode.assign.primitive\",\n      \"net.bytebuddy.implementation.bytecode.assign.reference\",\n      \"net.bytebuddy.implementation.bytecode.collection\",\n      \"net.bytebuddy.implementation.bytecode.constant\",\n      \"net.bytebuddy.implementation.bytecode.member\",\n      \"net.bytebuddy.jar.asm\",\n      \"net.bytebuddy.jar.asm.commons\",\n      \"net.bytebuddy.jar.asm.signature\",\n      \"net.bytebuddy.matcher\",\n      \"net.bytebuddy.pool\",\n      \"net.bytebuddy.utility\",\n      \"net.bytebuddy.utility.dispatcher\",\n      \"net.bytebuddy.utility.nullability\",\n      \"net.bytebuddy.utility.privilege\",\n      \"net.bytebuddy.utility.visitor\"\n    ],\n    \"net.minidev:accessors-smart\": [\n      \"net.minidev.asm\",\n      \"net.minidev.asm.ex\"\n    ],\n    \"net.minidev:json-smart\": [\n      \"net.minidev.json\",\n      \"net.minidev.json.annotate\",\n      \"net.minidev.json.parser\",\n      \"net.minidev.json.reader\",\n      \"net.minidev.json.writer\"\n    ],\n    \"org.antlr:antlr4-runtime\": [\n      \"org.antlr.v4.runtime\",\n      \"org.antlr.v4.runtime.atn\",\n      \"org.antlr.v4.runtime.dfa\",\n      \"org.antlr.v4.runtime.misc\",\n      \"org.antlr.v4.runtime.tree\",\n      \"org.antlr.v4.runtime.tree.pattern\",\n      \"org.antlr.v4.runtime.tree.xpath\"\n    ],\n    \"org.apache.logging.log4j:log4j-api\": [\n      \"org.apache.logging.log4j\",\n      \"org.apache.logging.log4j.internal\",\n      \"org.apache.logging.log4j.message\",\n      \"org.apache.logging.log4j.simple\",\n      \"org.apache.logging.log4j.spi\",\n      \"org.apache.logging.log4j.status\",\n      \"org.apache.logging.log4j.util\",\n      \"org.apache.logging.log4j.util.internal\"\n    ],\n    \"org.apache.logging.log4j:log4j-to-slf4j\": [\n      \"org.apache.logging.slf4j\"\n    ],\n    \"org.aspectj:aspectjweaver\": [\n      \"aj.org.objectweb.asm\",\n      \"aj.org.objectweb.asm.commons\",\n      \"aj.org.objectweb.asm.signature\",\n      \"org.aspectj.apache.bcel\",\n      \"org.aspectj.apache.bcel.classfile\",\n      \"org.aspectj.apache.bcel.classfile.annotation\",\n      \"org.aspectj.apache.bcel.generic\",\n      \"org.aspectj.apache.bcel.util\",\n      \"org.aspectj.asm\",\n      \"org.aspectj.asm.internal\",\n      \"org.aspectj.bridge\",\n      \"org.aspectj.bridge.context\",\n      \"org.aspectj.internal.lang.annotation\",\n      \"org.aspectj.internal.lang.reflect\",\n      \"org.aspectj.lang\",\n      \"org.aspectj.lang.annotation\",\n      \"org.aspectj.lang.annotation.control\",\n      \"org.aspectj.lang.internal.lang\",\n      \"org.aspectj.lang.reflect\",\n      \"org.aspectj.runtime\",\n      \"org.aspectj.runtime.internal\",\n      \"org.aspectj.runtime.internal.cflowstack\",\n      \"org.aspectj.runtime.reflect\",\n      \"org.aspectj.util\",\n      \"org.aspectj.weaver\",\n      \"org.aspectj.weaver.ast\",\n      \"org.aspectj.weaver.bcel\",\n      \"org.aspectj.weaver.bcel.asm\",\n      \"org.aspectj.weaver.internal.tools\",\n      \"org.aspectj.weaver.loadtime\",\n      \"org.aspectj.weaver.loadtime.definition\",\n      \"org.aspectj.weaver.ltw\",\n      \"org.aspectj.weaver.model\",\n      \"org.aspectj.weaver.patterns\",\n      \"org.aspectj.weaver.reflect\",\n      \"org.aspectj.weaver.tools\",\n      \"org.aspectj.weaver.tools.cache\"\n    ],\n    \"org.assertj:assertj-core\": [\n      \"org.assertj.core.annotations\",\n      \"org.assertj.core.api\",\n      \"org.assertj.core.api.exception\",\n      \"org.assertj.core.api.filter\",\n      \"org.assertj.core.api.iterable\",\n      \"org.assertj.core.api.junit.jupiter\",\n      \"org.assertj.core.api.recursive\",\n      \"org.assertj.core.api.recursive.assertion\",\n      \"org.assertj.core.api.recursive.comparison\",\n      \"org.assertj.core.condition\",\n      \"org.assertj.core.configuration\",\n      \"org.assertj.core.data\",\n      \"org.assertj.core.description\",\n      \"org.assertj.core.error\",\n      \"org.assertj.core.error.array2d\",\n      \"org.assertj.core.error.future\",\n      \"org.assertj.core.error.uri\",\n      \"org.assertj.core.extractor\",\n      \"org.assertj.core.groups\",\n      \"org.assertj.core.internal\",\n      \"org.assertj.core.matcher\",\n      \"org.assertj.core.presentation\",\n      \"org.assertj.core.util\",\n      \"org.assertj.core.util.diff\",\n      \"org.assertj.core.util.diff.myers\",\n      \"org.assertj.core.util.introspection\",\n      \"org.assertj.core.util.xml\"\n    ],\n    \"org.eclipse.angus:angus-activation\": [\n      \"org.eclipse.angus.activation\",\n      \"org.eclipse.angus.activation.nativeimage\"\n    ],\n    \"org.glassfish.jaxb:jaxb-core\": [\n      \"org.glassfish.jaxb.core\",\n      \"org.glassfish.jaxb.core.annotation\",\n      \"org.glassfish.jaxb.core.api\",\n      \"org.glassfish.jaxb.core.api.impl\",\n      \"org.glassfish.jaxb.core.marshaller\",\n      \"org.glassfish.jaxb.core.unmarshaller\",\n      \"org.glassfish.jaxb.core.util\",\n      \"org.glassfish.jaxb.core.v2\",\n      \"org.glassfish.jaxb.core.v2.model.annotation\",\n      \"org.glassfish.jaxb.core.v2.model.core\",\n      \"org.glassfish.jaxb.core.v2.model.impl\",\n      \"org.glassfish.jaxb.core.v2.model.nav\",\n      \"org.glassfish.jaxb.core.v2.model.util\",\n      \"org.glassfish.jaxb.core.v2.runtime\",\n      \"org.glassfish.jaxb.core.v2.runtime.unmarshaller\",\n      \"org.glassfish.jaxb.core.v2.schemagen.episode\",\n      \"org.glassfish.jaxb.core.v2.util\"\n    ],\n    \"org.glassfish.jaxb:jaxb-runtime\": [\n      \"org.glassfish.jaxb.runtime\",\n      \"org.glassfish.jaxb.runtime.api\",\n      \"org.glassfish.jaxb.runtime.marshaller\",\n      \"org.glassfish.jaxb.runtime.unmarshaller\",\n      \"org.glassfish.jaxb.runtime.util\",\n      \"org.glassfish.jaxb.runtime.v2\",\n      \"org.glassfish.jaxb.runtime.v2.model.annotation\",\n      \"org.glassfish.jaxb.runtime.v2.model.impl\",\n      \"org.glassfish.jaxb.runtime.v2.model.runtime\",\n      \"org.glassfish.jaxb.runtime.v2.runtime\",\n      \"org.glassfish.jaxb.runtime.v2.runtime.output\",\n      \"org.glassfish.jaxb.runtime.v2.runtime.property\",\n      \"org.glassfish.jaxb.runtime.v2.runtime.reflect\",\n      \"org.glassfish.jaxb.runtime.v2.runtime.reflect.opt\",\n      \"org.glassfish.jaxb.runtime.v2.runtime.unmarshaller\",\n      \"org.glassfish.jaxb.runtime.v2.schemagen\",\n      \"org.glassfish.jaxb.runtime.v2.schemagen.xmlschema\",\n      \"org.glassfish.jaxb.runtime.v2.util\"\n    ],\n    \"org.glassfish.jaxb:txw2\": [\n      \"com.sun.xml.txw2\",\n      \"com.sun.xml.txw2.annotation\",\n      \"com.sun.xml.txw2.output\"\n    ],\n    \"org.hamcrest:hamcrest-core\": [\n      \"org.hamcrest\",\n      \"org.hamcrest.core\",\n      \"org.hamcrest.internal\"\n    ],\n    \"org.hdrhistogram:HdrHistogram\": [\n      \"org.HdrHistogram\",\n      \"org.HdrHistogram.packedarray\"\n    ],\n    \"org.hibernate.common:hibernate-commons-annotations\": [\n      \"org.hibernate.annotations.common.annotationfactory\",\n      \"org.hibernate.annotations.common.reflection\",\n      \"org.hibernate.annotations.common.reflection.java\",\n      \"org.hibernate.annotations.common.reflection.java.generics\"\n    ],\n    \"org.hibernate.orm:hibernate-core\": [\n      \"org.hibernate\",\n      \"org.hibernate.action.internal\",\n      \"org.hibernate.action.spi\",\n      \"org.hibernate.annotations\",\n      \"org.hibernate.annotations.processing\",\n      \"org.hibernate.binder\",\n      \"org.hibernate.binder.internal\",\n      \"org.hibernate.boot\",\n      \"org.hibernate.boot.archive.internal\",\n      \"org.hibernate.boot.archive.scan.internal\",\n      \"org.hibernate.boot.archive.scan.spi\",\n      \"org.hibernate.boot.archive.spi\",\n      \"org.hibernate.boot.beanvalidation\",\n      \"org.hibernate.boot.cfgxml.internal\",\n      \"org.hibernate.boot.cfgxml.spi\",\n      \"org.hibernate.boot.internal\",\n      \"org.hibernate.boot.jaxb\",\n      \"org.hibernate.boot.jaxb.cfg.spi\",\n      \"org.hibernate.boot.jaxb.hbm.internal\",\n      \"org.hibernate.boot.jaxb.hbm.spi\",\n      \"org.hibernate.boot.jaxb.hbm.transform\",\n      \"org.hibernate.boot.jaxb.internal\",\n      \"org.hibernate.boot.jaxb.internal.stax\",\n      \"org.hibernate.boot.jaxb.mapping\",\n      \"org.hibernate.boot.jaxb.mapping.marshall\",\n      \"org.hibernate.boot.jaxb.spi\",\n      \"org.hibernate.boot.model\",\n      \"org.hibernate.boot.model.convert.internal\",\n      \"org.hibernate.boot.model.convert.spi\",\n      \"org.hibernate.boot.model.internal\",\n      \"org.hibernate.boot.model.naming\",\n      \"org.hibernate.boot.model.process.internal\",\n      \"org.hibernate.boot.model.process.spi\",\n      \"org.hibernate.boot.model.relational\",\n      \"org.hibernate.boot.model.relational.internal\",\n      \"org.hibernate.boot.model.source.internal\",\n      \"org.hibernate.boot.model.source.internal.annotations\",\n      \"org.hibernate.boot.model.source.internal.hbm\",\n      \"org.hibernate.boot.model.source.spi\",\n      \"org.hibernate.boot.query\",\n      \"org.hibernate.boot.registry\",\n      \"org.hibernate.boot.registry.classloading.internal\",\n      \"org.hibernate.boot.registry.classloading.spi\",\n      \"org.hibernate.boot.registry.internal\",\n      \"org.hibernate.boot.registry.selector\",\n      \"org.hibernate.boot.registry.selector.internal\",\n      \"org.hibernate.boot.registry.selector.spi\",\n      \"org.hibernate.boot.spi\",\n      \"org.hibernate.boot.xsd\",\n      \"org.hibernate.bytecode\",\n      \"org.hibernate.bytecode.enhance\",\n      \"org.hibernate.bytecode.enhance.internal.bytebuddy\",\n      \"org.hibernate.bytecode.enhance.internal.tracker\",\n      \"org.hibernate.bytecode.enhance.spi\",\n      \"org.hibernate.bytecode.enhance.spi.interceptor\",\n      \"org.hibernate.bytecode.internal\",\n      \"org.hibernate.bytecode.internal.bytebuddy\",\n      \"org.hibernate.bytecode.internal.none\",\n      \"org.hibernate.bytecode.spi\",\n      \"org.hibernate.cache\",\n      \"org.hibernate.cache.cfg.internal\",\n      \"org.hibernate.cache.cfg.spi\",\n      \"org.hibernate.cache.internal\",\n      \"org.hibernate.cache.spi\",\n      \"org.hibernate.cache.spi.access\",\n      \"org.hibernate.cache.spi.entry\",\n      \"org.hibernate.cache.spi.support\",\n      \"org.hibernate.cfg\",\n      \"org.hibernate.classic\",\n      \"org.hibernate.collection.internal\",\n      \"org.hibernate.collection.spi\",\n      \"org.hibernate.context\",\n      \"org.hibernate.context.internal\",\n      \"org.hibernate.context.spi\",\n      \"org.hibernate.dialect\",\n      \"org.hibernate.dialect.aggregate\",\n      \"org.hibernate.dialect.function\",\n      \"org.hibernate.dialect.function.array\",\n      \"org.hibernate.dialect.hint\",\n      \"org.hibernate.dialect.identity\",\n      \"org.hibernate.dialect.lock\",\n      \"org.hibernate.dialect.pagination\",\n      \"org.hibernate.dialect.sequence\",\n      \"org.hibernate.dialect.temptable\",\n      \"org.hibernate.dialect.unique\",\n      \"org.hibernate.engine\",\n      \"org.hibernate.engine.config.internal\",\n      \"org.hibernate.engine.config.spi\",\n      \"org.hibernate.engine.internal\",\n      \"org.hibernate.engine.jdbc\",\n      \"org.hibernate.engine.jdbc.batch\",\n      \"org.hibernate.engine.jdbc.batch.internal\",\n      \"org.hibernate.engine.jdbc.batch.spi\",\n      \"org.hibernate.engine.jdbc.connections.internal\",\n      \"org.hibernate.engine.jdbc.connections.spi\",\n      \"org.hibernate.engine.jdbc.cursor.internal\",\n      \"org.hibernate.engine.jdbc.cursor.spi\",\n      \"org.hibernate.engine.jdbc.dialect.internal\",\n      \"org.hibernate.engine.jdbc.dialect.spi\",\n      \"org.hibernate.engine.jdbc.env.internal\",\n      \"org.hibernate.engine.jdbc.env.spi\",\n      \"org.hibernate.engine.jdbc.internal\",\n      \"org.hibernate.engine.jdbc.mutation\",\n      \"org.hibernate.engine.jdbc.mutation.group\",\n      \"org.hibernate.engine.jdbc.mutation.internal\",\n      \"org.hibernate.engine.jdbc.mutation.spi\",\n      \"org.hibernate.engine.jdbc.spi\",\n      \"org.hibernate.engine.jndi\",\n      \"org.hibernate.engine.jndi.internal\",\n      \"org.hibernate.engine.jndi.spi\",\n      \"org.hibernate.engine.profile\",\n      \"org.hibernate.engine.profile.internal\",\n      \"org.hibernate.engine.query\",\n      \"org.hibernate.engine.query.internal\",\n      \"org.hibernate.engine.query.spi\",\n      \"org.hibernate.engine.spi\",\n      \"org.hibernate.engine.transaction.internal\",\n      \"org.hibernate.engine.transaction.internal.jta\",\n      \"org.hibernate.engine.transaction.jta.platform.internal\",\n      \"org.hibernate.engine.transaction.jta.platform.spi\",\n      \"org.hibernate.engine.transaction.spi\",\n      \"org.hibernate.event.internal\",\n      \"org.hibernate.event.service.internal\",\n      \"org.hibernate.event.service.spi\",\n      \"org.hibernate.event.spi\",\n      \"org.hibernate.exception\",\n      \"org.hibernate.exception.internal\",\n      \"org.hibernate.exception.spi\",\n      \"org.hibernate.generator\",\n      \"org.hibernate.generator.internal\",\n      \"org.hibernate.generator.values\",\n      \"org.hibernate.generator.values.internal\",\n      \"org.hibernate.grammars.graph\",\n      \"org.hibernate.grammars.hql\",\n      \"org.hibernate.grammars.importsql\",\n      \"org.hibernate.grammars.ordering\",\n      \"org.hibernate.graph\",\n      \"org.hibernate.graph.internal\",\n      \"org.hibernate.graph.internal.parse\",\n      \"org.hibernate.graph.spi\",\n      \"org.hibernate.id\",\n      \"org.hibernate.id.enhanced\",\n      \"org.hibernate.id.factory\",\n      \"org.hibernate.id.factory.internal\",\n      \"org.hibernate.id.factory.spi\",\n      \"org.hibernate.id.insert\",\n      \"org.hibernate.id.uuid\",\n      \"org.hibernate.integrator.internal\",\n      \"org.hibernate.integrator.spi\",\n      \"org.hibernate.internal\",\n      \"org.hibernate.internal.build\",\n      \"org.hibernate.internal.log\",\n      \"org.hibernate.internal.util\",\n      \"org.hibernate.internal.util.beans\",\n      \"org.hibernate.internal.util.collections\",\n      \"org.hibernate.internal.util.compare\",\n      \"org.hibernate.internal.util.config\",\n      \"org.hibernate.internal.util.securitymanager\",\n      \"org.hibernate.internal.util.type\",\n      \"org.hibernate.internal.util.xml\",\n      \"org.hibernate.jdbc\",\n      \"org.hibernate.jpa\",\n      \"org.hibernate.jpa.boot.internal\",\n      \"org.hibernate.jpa.boot.spi\",\n      \"org.hibernate.jpa.event.internal\",\n      \"org.hibernate.jpa.event.spi\",\n      \"org.hibernate.jpa.internal\",\n      \"org.hibernate.jpa.internal.enhance\",\n      \"org.hibernate.jpa.internal.util\",\n      \"org.hibernate.jpa.spi\",\n      \"org.hibernate.loader\",\n      \"org.hibernate.loader.ast.internal\",\n      \"org.hibernate.loader.ast.spi\",\n      \"org.hibernate.loader.internal\",\n      \"org.hibernate.mapping\",\n      \"org.hibernate.metadata\",\n      \"org.hibernate.metamodel\",\n      \"org.hibernate.metamodel.internal\",\n      \"org.hibernate.metamodel.mapping\",\n      \"org.hibernate.metamodel.mapping.internal\",\n      \"org.hibernate.metamodel.mapping.ordering\",\n      \"org.hibernate.metamodel.mapping.ordering.ast\",\n      \"org.hibernate.metamodel.model.domain\",\n      \"org.hibernate.metamodel.model.domain.internal\",\n      \"org.hibernate.metamodel.model.domain.spi\",\n      \"org.hibernate.metamodel.spi\",\n      \"org.hibernate.persister.collection\",\n      \"org.hibernate.persister.collection.mutation\",\n      \"org.hibernate.persister.entity\",\n      \"org.hibernate.persister.entity.mutation\",\n      \"org.hibernate.persister.internal\",\n      \"org.hibernate.persister.spi\",\n      \"org.hibernate.persister.walking.spi\",\n      \"org.hibernate.pretty\",\n      \"org.hibernate.procedure\",\n      \"org.hibernate.procedure.internal\",\n      \"org.hibernate.procedure.spi\",\n      \"org.hibernate.property.access.internal\",\n      \"org.hibernate.property.access.spi\",\n      \"org.hibernate.proxy\",\n      \"org.hibernate.proxy.map\",\n      \"org.hibernate.proxy.pojo\",\n      \"org.hibernate.proxy.pojo.bytebuddy\",\n      \"org.hibernate.query\",\n      \"org.hibernate.query.criteria\",\n      \"org.hibernate.query.criteria.internal\",\n      \"org.hibernate.query.criteria.spi\",\n      \"org.hibernate.query.derived\",\n      \"org.hibernate.query.hql\",\n      \"org.hibernate.query.hql.internal\",\n      \"org.hibernate.query.hql.spi\",\n      \"org.hibernate.query.internal\",\n      \"org.hibernate.query.named\",\n      \"org.hibernate.query.procedure\",\n      \"org.hibernate.query.results\",\n      \"org.hibernate.query.results.complete\",\n      \"org.hibernate.query.results.dynamic\",\n      \"org.hibernate.query.results.implicit\",\n      \"org.hibernate.query.spi\",\n      \"org.hibernate.query.sql\",\n      \"org.hibernate.query.sql.internal\",\n      \"org.hibernate.query.sql.spi\",\n      \"org.hibernate.query.sqm\",\n      \"org.hibernate.query.sqm.function\",\n      \"org.hibernate.query.sqm.internal\",\n      \"org.hibernate.query.sqm.mutation.internal\",\n      \"org.hibernate.query.sqm.mutation.internal.cte\",\n      \"org.hibernate.query.sqm.mutation.internal.inline\",\n      \"org.hibernate.query.sqm.mutation.internal.temptable\",\n      \"org.hibernate.query.sqm.mutation.spi\",\n      \"org.hibernate.query.sqm.produce.function\",\n      \"org.hibernate.query.sqm.produce.function.internal\",\n      \"org.hibernate.query.sqm.spi\",\n      \"org.hibernate.query.sqm.sql\",\n      \"org.hibernate.query.sqm.sql.internal\",\n      \"org.hibernate.query.sqm.tree\",\n      \"org.hibernate.query.sqm.tree.cte\",\n      \"org.hibernate.query.sqm.tree.delete\",\n      \"org.hibernate.query.sqm.tree.domain\",\n      \"org.hibernate.query.sqm.tree.expression\",\n      \"org.hibernate.query.sqm.tree.from\",\n      \"org.hibernate.query.sqm.tree.insert\",\n      \"org.hibernate.query.sqm.tree.jpa\",\n      \"org.hibernate.query.sqm.tree.predicate\",\n      \"org.hibernate.query.sqm.tree.select\",\n      \"org.hibernate.query.sqm.tree.update\",\n      \"org.hibernate.relational\",\n      \"org.hibernate.relational.internal\",\n      \"org.hibernate.resource.beans.container.internal\",\n      \"org.hibernate.resource.beans.container.spi\",\n      \"org.hibernate.resource.beans.internal\",\n      \"org.hibernate.resource.beans.spi\",\n      \"org.hibernate.resource.jdbc\",\n      \"org.hibernate.resource.jdbc.internal\",\n      \"org.hibernate.resource.jdbc.spi\",\n      \"org.hibernate.resource.transaction\",\n      \"org.hibernate.resource.transaction.backend.jdbc.internal\",\n      \"org.hibernate.resource.transaction.backend.jdbc.spi\",\n      \"org.hibernate.resource.transaction.backend.jta.internal\",\n      \"org.hibernate.resource.transaction.backend.jta.internal.synchronization\",\n      \"org.hibernate.resource.transaction.internal\",\n      \"org.hibernate.resource.transaction.spi\",\n      \"org.hibernate.result\",\n      \"org.hibernate.result.internal\",\n      \"org.hibernate.result.spi\",\n      \"org.hibernate.service\",\n      \"org.hibernate.service.internal\",\n      \"org.hibernate.service.spi\",\n      \"org.hibernate.spi\",\n      \"org.hibernate.sql\",\n      \"org.hibernate.sql.ast\",\n      \"org.hibernate.sql.ast.internal\",\n      \"org.hibernate.sql.ast.spi\",\n      \"org.hibernate.sql.ast.tree\",\n      \"org.hibernate.sql.ast.tree.cte\",\n      \"org.hibernate.sql.ast.tree.delete\",\n      \"org.hibernate.sql.ast.tree.expression\",\n      \"org.hibernate.sql.ast.tree.from\",\n      \"org.hibernate.sql.ast.tree.insert\",\n      \"org.hibernate.sql.ast.tree.predicate\",\n      \"org.hibernate.sql.ast.tree.select\",\n      \"org.hibernate.sql.ast.tree.update\",\n      \"org.hibernate.sql.exec\",\n      \"org.hibernate.sql.exec.internal\",\n      \"org.hibernate.sql.exec.spi\",\n      \"org.hibernate.sql.model\",\n      \"org.hibernate.sql.model.ast\",\n      \"org.hibernate.sql.model.ast.builder\",\n      \"org.hibernate.sql.model.internal\",\n      \"org.hibernate.sql.model.jdbc\",\n      \"org.hibernate.sql.results\",\n      \"org.hibernate.sql.results.caching\",\n      \"org.hibernate.sql.results.caching.internal\",\n      \"org.hibernate.sql.results.graph\",\n      \"org.hibernate.sql.results.graph.basic\",\n      \"org.hibernate.sql.results.graph.collection\",\n      \"org.hibernate.sql.results.graph.collection.internal\",\n      \"org.hibernate.sql.results.graph.embeddable\",\n      \"org.hibernate.sql.results.graph.embeddable.internal\",\n      \"org.hibernate.sql.results.graph.entity\",\n      \"org.hibernate.sql.results.graph.entity.internal\",\n      \"org.hibernate.sql.results.graph.instantiation\",\n      \"org.hibernate.sql.results.graph.instantiation.internal\",\n      \"org.hibernate.sql.results.graph.internal\",\n      \"org.hibernate.sql.results.graph.tuple\",\n      \"org.hibernate.sql.results.internal\",\n      \"org.hibernate.sql.results.internal.domain\",\n      \"org.hibernate.sql.results.jdbc.internal\",\n      \"org.hibernate.sql.results.jdbc.spi\",\n      \"org.hibernate.sql.results.spi\",\n      \"org.hibernate.stat\",\n      \"org.hibernate.stat.internal\",\n      \"org.hibernate.stat.spi\",\n      \"org.hibernate.tool.schema\",\n      \"org.hibernate.tool.schema.extract.internal\",\n      \"org.hibernate.tool.schema.extract.spi\",\n      \"org.hibernate.tool.schema.internal\",\n      \"org.hibernate.tool.schema.internal.exec\",\n      \"org.hibernate.tool.schema.internal.script\",\n      \"org.hibernate.tool.schema.spi\",\n      \"org.hibernate.transform\",\n      \"org.hibernate.tuple\",\n      \"org.hibernate.tuple.component\",\n      \"org.hibernate.tuple.entity\",\n      \"org.hibernate.type\",\n      \"org.hibernate.type.descriptor\",\n      \"org.hibernate.type.descriptor.converter\",\n      \"org.hibernate.type.descriptor.converter.internal\",\n      \"org.hibernate.type.descriptor.converter.spi\",\n      \"org.hibernate.type.descriptor.java\",\n      \"org.hibernate.type.descriptor.java.spi\",\n      \"org.hibernate.type.descriptor.jdbc\",\n      \"org.hibernate.type.descriptor.jdbc.internal\",\n      \"org.hibernate.type.descriptor.jdbc.spi\",\n      \"org.hibernate.type.descriptor.sql\",\n      \"org.hibernate.type.descriptor.sql.internal\",\n      \"org.hibernate.type.descriptor.sql.spi\",\n      \"org.hibernate.type.format\",\n      \"org.hibernate.type.format.jackson\",\n      \"org.hibernate.type.format.jakartajson\",\n      \"org.hibernate.type.format.jaxb\",\n      \"org.hibernate.type.internal\",\n      \"org.hibernate.type.spi\",\n      \"org.hibernate.usertype\",\n      \"org.hibernate.usertype.internal\"\n    ],\n    \"org.jboss.logging:jboss-logging\": [\n      \"org.jboss.logging\"\n    ],\n    \"org.latencyutils:LatencyUtils\": [\n      \"org.LatencyUtils\"\n    ],\n    \"org.ow2.asm:asm\": [\n      \"org.objectweb.asm\",\n      \"org.objectweb.asm.signature\"\n    ],\n    \"org.reactivestreams:reactive-streams\": [\n      \"org.reactivestreams\"\n    ],\n    \"org.slf4j:jul-to-slf4j\": [\n      \"org.slf4j.bridge\"\n    ],\n    \"org.springframework.boot:spring-boot\": [\n      \"org.springframework.boot\",\n      \"org.springframework.boot.admin\",\n      \"org.springframework.boot.ansi\",\n      \"org.springframework.boot.availability\",\n      \"org.springframework.boot.builder\",\n      \"org.springframework.boot.cloud\",\n      \"org.springframework.boot.context\",\n      \"org.springframework.boot.context.annotation\",\n      \"org.springframework.boot.context.config\",\n      \"org.springframework.boot.context.event\",\n      \"org.springframework.boot.context.logging\",\n      \"org.springframework.boot.context.metrics.buffering\",\n      \"org.springframework.boot.context.properties\",\n      \"org.springframework.boot.context.properties.bind\",\n      \"org.springframework.boot.context.properties.bind.handler\",\n      \"org.springframework.boot.context.properties.bind.validation\",\n      \"org.springframework.boot.context.properties.source\",\n      \"org.springframework.boot.convert\",\n      \"org.springframework.boot.diagnostics\",\n      \"org.springframework.boot.diagnostics.analyzer\",\n      \"org.springframework.boot.env\",\n      \"org.springframework.boot.flyway\",\n      \"org.springframework.boot.info\",\n      \"org.springframework.boot.io\",\n      \"org.springframework.boot.jackson\",\n      \"org.springframework.boot.jdbc\",\n      \"org.springframework.boot.jdbc.init\",\n      \"org.springframework.boot.jdbc.metadata\",\n      \"org.springframework.boot.jms\",\n      \"org.springframework.boot.jooq\",\n      \"org.springframework.boot.json\",\n      \"org.springframework.boot.liquibase\",\n      \"org.springframework.boot.logging\",\n      \"org.springframework.boot.logging.java\",\n      \"org.springframework.boot.logging.log4j2\",\n      \"org.springframework.boot.logging.logback\",\n      \"org.springframework.boot.origin\",\n      \"org.springframework.boot.orm.jpa\",\n      \"org.springframework.boot.orm.jpa.hibernate\",\n      \"org.springframework.boot.r2dbc\",\n      \"org.springframework.boot.r2dbc.init\",\n      \"org.springframework.boot.reactor\",\n      \"org.springframework.boot.rsocket.context\",\n      \"org.springframework.boot.rsocket.messaging\",\n      \"org.springframework.boot.rsocket.netty\",\n      \"org.springframework.boot.rsocket.server\",\n      \"org.springframework.boot.security.reactive\",\n      \"org.springframework.boot.security.servlet\",\n      \"org.springframework.boot.sql.init\",\n      \"org.springframework.boot.sql.init.dependency\",\n      \"org.springframework.boot.ssl\",\n      \"org.springframework.boot.ssl.jks\",\n      \"org.springframework.boot.ssl.pem\",\n      \"org.springframework.boot.system\",\n      \"org.springframework.boot.task\",\n      \"org.springframework.boot.type.classreading\",\n      \"org.springframework.boot.util\",\n      \"org.springframework.boot.validation\",\n      \"org.springframework.boot.validation.beanvalidation\",\n      \"org.springframework.boot.web.client\",\n      \"org.springframework.boot.web.codec\",\n      \"org.springframework.boot.web.context\",\n      \"org.springframework.boot.web.embedded.jetty\",\n      \"org.springframework.boot.web.embedded.netty\",\n      \"org.springframework.boot.web.embedded.tomcat\",\n      \"org.springframework.boot.web.embedded.undertow\",\n      \"org.springframework.boot.web.error\",\n      \"org.springframework.boot.web.reactive.context\",\n      \"org.springframework.boot.web.reactive.error\",\n      \"org.springframework.boot.web.reactive.filter\",\n      \"org.springframework.boot.web.reactive.function.client\",\n      \"org.springframework.boot.web.reactive.result.view\",\n      \"org.springframework.boot.web.reactive.server\",\n      \"org.springframework.boot.web.server\",\n      \"org.springframework.boot.web.servlet\",\n      \"org.springframework.boot.web.servlet.context\",\n      \"org.springframework.boot.web.servlet.error\",\n      \"org.springframework.boot.web.servlet.filter\",\n      \"org.springframework.boot.web.servlet.server\",\n      \"org.springframework.boot.web.servlet.support\",\n      \"org.springframework.boot.web.servlet.view\",\n      \"org.springframework.boot.webservices.client\"\n    ],\n    \"org.springframework.boot:spring-boot-actuator\": [\n      \"org.springframework.boot.actuate.amqp\",\n      \"org.springframework.boot.actuate.audit\",\n      \"org.springframework.boot.actuate.audit.listener\",\n      \"org.springframework.boot.actuate.availability\",\n      \"org.springframework.boot.actuate.beans\",\n      \"org.springframework.boot.actuate.cache\",\n      \"org.springframework.boot.actuate.cassandra\",\n      \"org.springframework.boot.actuate.context\",\n      \"org.springframework.boot.actuate.context.properties\",\n      \"org.springframework.boot.actuate.couchbase\",\n      \"org.springframework.boot.actuate.data.elasticsearch\",\n      \"org.springframework.boot.actuate.data.mongo\",\n      \"org.springframework.boot.actuate.data.redis\",\n      \"org.springframework.boot.actuate.elasticsearch\",\n      \"org.springframework.boot.actuate.endpoint\",\n      \"org.springframework.boot.actuate.endpoint.annotation\",\n      \"org.springframework.boot.actuate.endpoint.invoke\",\n      \"org.springframework.boot.actuate.endpoint.invoke.convert\",\n      \"org.springframework.boot.actuate.endpoint.invoke.reflect\",\n      \"org.springframework.boot.actuate.endpoint.invoker.cache\",\n      \"org.springframework.boot.actuate.endpoint.jackson\",\n      \"org.springframework.boot.actuate.endpoint.jmx\",\n      \"org.springframework.boot.actuate.endpoint.jmx.annotation\",\n      \"org.springframework.boot.actuate.endpoint.web\",\n      \"org.springframework.boot.actuate.endpoint.web.annotation\",\n      \"org.springframework.boot.actuate.endpoint.web.jersey\",\n      \"org.springframework.boot.actuate.endpoint.web.reactive\",\n      \"org.springframework.boot.actuate.endpoint.web.servlet\",\n      \"org.springframework.boot.actuate.env\",\n      \"org.springframework.boot.actuate.flyway\",\n      \"org.springframework.boot.actuate.hazelcast\",\n      \"org.springframework.boot.actuate.health\",\n      \"org.springframework.boot.actuate.influx\",\n      \"org.springframework.boot.actuate.info\",\n      \"org.springframework.boot.actuate.integration\",\n      \"org.springframework.boot.actuate.jdbc\",\n      \"org.springframework.boot.actuate.jms\",\n      \"org.springframework.boot.actuate.ldap\",\n      \"org.springframework.boot.actuate.liquibase\",\n      \"org.springframework.boot.actuate.logging\",\n      \"org.springframework.boot.actuate.mail\",\n      \"org.springframework.boot.actuate.management\",\n      \"org.springframework.boot.actuate.metrics\",\n      \"org.springframework.boot.actuate.metrics.amqp\",\n      \"org.springframework.boot.actuate.metrics.annotation\",\n      \"org.springframework.boot.actuate.metrics.cache\",\n      \"org.springframework.boot.actuate.metrics.data\",\n      \"org.springframework.boot.actuate.metrics.export.prometheus\",\n      \"org.springframework.boot.actuate.metrics.http\",\n      \"org.springframework.boot.actuate.metrics.jdbc\",\n      \"org.springframework.boot.actuate.metrics.r2dbc\",\n      \"org.springframework.boot.actuate.metrics.startup\",\n      \"org.springframework.boot.actuate.metrics.system\",\n      \"org.springframework.boot.actuate.metrics.web.client\",\n      \"org.springframework.boot.actuate.metrics.web.jetty\",\n      \"org.springframework.boot.actuate.metrics.web.reactive.client\",\n      \"org.springframework.boot.actuate.metrics.web.tomcat\",\n      \"org.springframework.boot.actuate.neo4j\",\n      \"org.springframework.boot.actuate.quartz\",\n      \"org.springframework.boot.actuate.r2dbc\",\n      \"org.springframework.boot.actuate.sbom\",\n      \"org.springframework.boot.actuate.scheduling\",\n      \"org.springframework.boot.actuate.security\",\n      \"org.springframework.boot.actuate.session\",\n      \"org.springframework.boot.actuate.startup\",\n      \"org.springframework.boot.actuate.system\",\n      \"org.springframework.boot.actuate.web.exchanges\",\n      \"org.springframework.boot.actuate.web.exchanges.reactive\",\n      \"org.springframework.boot.actuate.web.exchanges.servlet\",\n      \"org.springframework.boot.actuate.web.mappings\",\n      \"org.springframework.boot.actuate.web.mappings.reactive\",\n      \"org.springframework.boot.actuate.web.mappings.servlet\"\n    ],\n    \"org.springframework.boot:spring-boot-actuator-autoconfigure\": [\n      \"org.springframework.boot.actuate.autoconfigure\",\n      \"org.springframework.boot.actuate.autoconfigure.amqp\",\n      \"org.springframework.boot.actuate.autoconfigure.audit\",\n      \"org.springframework.boot.actuate.autoconfigure.availability\",\n      \"org.springframework.boot.actuate.autoconfigure.beans\",\n      \"org.springframework.boot.actuate.autoconfigure.cache\",\n      \"org.springframework.boot.actuate.autoconfigure.cassandra\",\n      \"org.springframework.boot.actuate.autoconfigure.cloudfoundry\",\n      \"org.springframework.boot.actuate.autoconfigure.cloudfoundry.reactive\",\n      \"org.springframework.boot.actuate.autoconfigure.cloudfoundry.servlet\",\n      \"org.springframework.boot.actuate.autoconfigure.condition\",\n      \"org.springframework.boot.actuate.autoconfigure.context\",\n      \"org.springframework.boot.actuate.autoconfigure.context.properties\",\n      \"org.springframework.boot.actuate.autoconfigure.couchbase\",\n      \"org.springframework.boot.actuate.autoconfigure.data.elasticsearch\",\n      \"org.springframework.boot.actuate.autoconfigure.data.mongo\",\n      \"org.springframework.boot.actuate.autoconfigure.data.redis\",\n      \"org.springframework.boot.actuate.autoconfigure.elasticsearch\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.condition\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.expose\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.jackson\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.jmx\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.web\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.web.jersey\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.web.reactive\",\n      \"org.springframework.boot.actuate.autoconfigure.endpoint.web.servlet\",\n      \"org.springframework.boot.actuate.autoconfigure.env\",\n      \"org.springframework.boot.actuate.autoconfigure.flyway\",\n      \"org.springframework.boot.actuate.autoconfigure.hazelcast\",\n      \"org.springframework.boot.actuate.autoconfigure.health\",\n      \"org.springframework.boot.actuate.autoconfigure.influx\",\n      \"org.springframework.boot.actuate.autoconfigure.info\",\n      \"org.springframework.boot.actuate.autoconfigure.integration\",\n      \"org.springframework.boot.actuate.autoconfigure.jdbc\",\n      \"org.springframework.boot.actuate.autoconfigure.jms\",\n      \"org.springframework.boot.actuate.autoconfigure.ldap\",\n      \"org.springframework.boot.actuate.autoconfigure.liquibase\",\n      \"org.springframework.boot.actuate.autoconfigure.logging\",\n      \"org.springframework.boot.actuate.autoconfigure.mail\",\n      \"org.springframework.boot.actuate.autoconfigure.management\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.amqp\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.cache\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.data\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.appoptics\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.atlas\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.datadog\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.dynatrace\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.elastic\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.ganglia\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.graphite\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.humio\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.influx\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.jmx\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.kairos\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.newrelic\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.otlp\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.prometheus\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.properties\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.signalfx\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.simple\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.stackdriver\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.statsd\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.export.wavefront\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.integration\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.jdbc\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.jersey\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.mongo\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.orm.jpa\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.r2dbc\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.redis\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.startup\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.task\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.web.jetty\",\n      \"org.springframework.boot.actuate.autoconfigure.metrics.web.tomcat\",\n      \"org.springframework.boot.actuate.autoconfigure.neo4j\",\n      \"org.springframework.boot.actuate.autoconfigure.observation\",\n      \"org.springframework.boot.actuate.autoconfigure.observation.batch\",\n      \"org.springframework.boot.actuate.autoconfigure.observation.graphql\",\n      \"org.springframework.boot.actuate.autoconfigure.observation.web.client\",\n      \"org.springframework.boot.actuate.autoconfigure.observation.web.reactive\",\n      \"org.springframework.boot.actuate.autoconfigure.observation.web.servlet\",\n      \"org.springframework.boot.actuate.autoconfigure.opentelemetry\",\n      \"org.springframework.boot.actuate.autoconfigure.quartz\",\n      \"org.springframework.boot.actuate.autoconfigure.r2dbc\",\n      \"org.springframework.boot.actuate.autoconfigure.sbom\",\n      \"org.springframework.boot.actuate.autoconfigure.scheduling\",\n      \"org.springframework.boot.actuate.autoconfigure.security.reactive\",\n      \"org.springframework.boot.actuate.autoconfigure.security.servlet\",\n      \"org.springframework.boot.actuate.autoconfigure.session\",\n      \"org.springframework.boot.actuate.autoconfigure.startup\",\n      \"org.springframework.boot.actuate.autoconfigure.system\",\n      \"org.springframework.boot.actuate.autoconfigure.tracing\",\n      \"org.springframework.boot.actuate.autoconfigure.tracing.otlp\",\n      \"org.springframework.boot.actuate.autoconfigure.tracing.prometheus\",\n      \"org.springframework.boot.actuate.autoconfigure.tracing.wavefront\",\n      \"org.springframework.boot.actuate.autoconfigure.tracing.zipkin\",\n      \"org.springframework.boot.actuate.autoconfigure.wavefront\",\n      \"org.springframework.boot.actuate.autoconfigure.web\",\n      \"org.springframework.boot.actuate.autoconfigure.web.exchanges\",\n      \"org.springframework.boot.actuate.autoconfigure.web.jersey\",\n      \"org.springframework.boot.actuate.autoconfigure.web.mappings\",\n      \"org.springframework.boot.actuate.autoconfigure.web.reactive\",\n      \"org.springframework.boot.actuate.autoconfigure.web.server\",\n      \"org.springframework.boot.actuate.autoconfigure.web.servlet\"\n    ],\n    \"org.springframework.boot:spring-boot-autoconfigure\": [\n      \"org.springframework.boot.autoconfigure\",\n      \"org.springframework.boot.autoconfigure.admin\",\n      \"org.springframework.boot.autoconfigure.amqp\",\n      \"org.springframework.boot.autoconfigure.aop\",\n      \"org.springframework.boot.autoconfigure.availability\",\n      \"org.springframework.boot.autoconfigure.batch\",\n      \"org.springframework.boot.autoconfigure.cache\",\n      \"org.springframework.boot.autoconfigure.cassandra\",\n      \"org.springframework.boot.autoconfigure.codec\",\n      \"org.springframework.boot.autoconfigure.condition\",\n      \"org.springframework.boot.autoconfigure.context\",\n      \"org.springframework.boot.autoconfigure.couchbase\",\n      \"org.springframework.boot.autoconfigure.dao\",\n      \"org.springframework.boot.autoconfigure.data\",\n      \"org.springframework.boot.autoconfigure.data.cassandra\",\n      \"org.springframework.boot.autoconfigure.data.couchbase\",\n      \"org.springframework.boot.autoconfigure.data.elasticsearch\",\n      \"org.springframework.boot.autoconfigure.data.jdbc\",\n      \"org.springframework.boot.autoconfigure.data.jpa\",\n      \"org.springframework.boot.autoconfigure.data.ldap\",\n      \"org.springframework.boot.autoconfigure.data.mongo\",\n      \"org.springframework.boot.autoconfigure.data.neo4j\",\n      \"org.springframework.boot.autoconfigure.data.r2dbc\",\n      \"org.springframework.boot.autoconfigure.data.redis\",\n      \"org.springframework.boot.autoconfigure.data.rest\",\n      \"org.springframework.boot.autoconfigure.data.web\",\n      \"org.springframework.boot.autoconfigure.diagnostics.analyzer\",\n      \"org.springframework.boot.autoconfigure.domain\",\n      \"org.springframework.boot.autoconfigure.elasticsearch\",\n      \"org.springframework.boot.autoconfigure.flyway\",\n      \"org.springframework.boot.autoconfigure.freemarker\",\n      \"org.springframework.boot.autoconfigure.graphql\",\n      \"org.springframework.boot.autoconfigure.graphql.data\",\n      \"org.springframework.boot.autoconfigure.graphql.reactive\",\n      \"org.springframework.boot.autoconfigure.graphql.rsocket\",\n      \"org.springframework.boot.autoconfigure.graphql.security\",\n      \"org.springframework.boot.autoconfigure.graphql.servlet\",\n      \"org.springframework.boot.autoconfigure.groovy.template\",\n      \"org.springframework.boot.autoconfigure.gson\",\n      \"org.springframework.boot.autoconfigure.h2\",\n      \"org.springframework.boot.autoconfigure.hateoas\",\n      \"org.springframework.boot.autoconfigure.hazelcast\",\n      \"org.springframework.boot.autoconfigure.http\",\n      \"org.springframework.boot.autoconfigure.http.codec\",\n      \"org.springframework.boot.autoconfigure.influx\",\n      \"org.springframework.boot.autoconfigure.info\",\n      \"org.springframework.boot.autoconfigure.integration\",\n      \"org.springframework.boot.autoconfigure.jackson\",\n      \"org.springframework.boot.autoconfigure.jdbc\",\n      \"org.springframework.boot.autoconfigure.jdbc.metadata\",\n      \"org.springframework.boot.autoconfigure.jersey\",\n      \"org.springframework.boot.autoconfigure.jms\",\n      \"org.springframework.boot.autoconfigure.jms.activemq\",\n      \"org.springframework.boot.autoconfigure.jms.artemis\",\n      \"org.springframework.boot.autoconfigure.jmx\",\n      \"org.springframework.boot.autoconfigure.jooq\",\n      \"org.springframework.boot.autoconfigure.jsonb\",\n      \"org.springframework.boot.autoconfigure.kafka\",\n      \"org.springframework.boot.autoconfigure.ldap\",\n      \"org.springframework.boot.autoconfigure.ldap.embedded\",\n      \"org.springframework.boot.autoconfigure.liquibase\",\n      \"org.springframework.boot.autoconfigure.logging\",\n      \"org.springframework.boot.autoconfigure.mail\",\n      \"org.springframework.boot.autoconfigure.mongo\",\n      \"org.springframework.boot.autoconfigure.mustache\",\n      \"org.springframework.boot.autoconfigure.neo4j\",\n      \"org.springframework.boot.autoconfigure.netty\",\n      \"org.springframework.boot.autoconfigure.orm.jpa\",\n      \"org.springframework.boot.autoconfigure.pulsar\",\n      \"org.springframework.boot.autoconfigure.quartz\",\n      \"org.springframework.boot.autoconfigure.r2dbc\",\n      \"org.springframework.boot.autoconfigure.reactor\",\n      \"org.springframework.boot.autoconfigure.reactor.netty\",\n      \"org.springframework.boot.autoconfigure.rsocket\",\n      \"org.springframework.boot.autoconfigure.security\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.client\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.client.reactive\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.client.servlet\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.resource\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.resource.reactive\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.resource.servlet\",\n      \"org.springframework.boot.autoconfigure.security.oauth2.server.servlet\",\n      \"org.springframework.boot.autoconfigure.security.reactive\",\n      \"org.springframework.boot.autoconfigure.security.rsocket\",\n      \"org.springframework.boot.autoconfigure.security.saml2\",\n      \"org.springframework.boot.autoconfigure.security.servlet\",\n      \"org.springframework.boot.autoconfigure.sendgrid\",\n      \"org.springframework.boot.autoconfigure.service.connection\",\n      \"org.springframework.boot.autoconfigure.session\",\n      \"org.springframework.boot.autoconfigure.sql.init\",\n      \"org.springframework.boot.autoconfigure.ssl\",\n      \"org.springframework.boot.autoconfigure.task\",\n      \"org.springframework.boot.autoconfigure.template\",\n      \"org.springframework.boot.autoconfigure.thread\",\n      \"org.springframework.boot.autoconfigure.thymeleaf\",\n      \"org.springframework.boot.autoconfigure.transaction\",\n      \"org.springframework.boot.autoconfigure.transaction.jta\",\n      \"org.springframework.boot.autoconfigure.validation\",\n      \"org.springframework.boot.autoconfigure.web\",\n      \"org.springframework.boot.autoconfigure.web.client\",\n      \"org.springframework.boot.autoconfigure.web.embedded\",\n      \"org.springframework.boot.autoconfigure.web.format\",\n      \"org.springframework.boot.autoconfigure.web.reactive\",\n      \"org.springframework.boot.autoconfigure.web.reactive.error\",\n      \"org.springframework.boot.autoconfigure.web.reactive.function.client\",\n      \"org.springframework.boot.autoconfigure.web.servlet\",\n      \"org.springframework.boot.autoconfigure.web.servlet.error\",\n      \"org.springframework.boot.autoconfigure.webservices\",\n      \"org.springframework.boot.autoconfigure.webservices.client\",\n      \"org.springframework.boot.autoconfigure.websocket.reactive\",\n      \"org.springframework.boot.autoconfigure.websocket.servlet\"\n    ],\n    \"org.springframework.data:spring-data-commons\": [\n      \"org.springframework.data.annotation\",\n      \"org.springframework.data.aot\",\n      \"org.springframework.data.auditing\",\n      \"org.springframework.data.auditing.config\",\n      \"org.springframework.data.config\",\n      \"org.springframework.data.convert\",\n      \"org.springframework.data.crossstore\",\n      \"org.springframework.data.domain\",\n      \"org.springframework.data.domain.jaxb\",\n      \"org.springframework.data.expression\",\n      \"org.springframework.data.geo\",\n      \"org.springframework.data.geo.format\",\n      \"org.springframework.data.history\",\n      \"org.springframework.data.mapping\",\n      \"org.springframework.data.mapping.callback\",\n      \"org.springframework.data.mapping.context\",\n      \"org.springframework.data.mapping.model\",\n      \"org.springframework.data.projection\",\n      \"org.springframework.data.querydsl\",\n      \"org.springframework.data.querydsl.aot\",\n      \"org.springframework.data.querydsl.binding\",\n      \"org.springframework.data.repository\",\n      \"org.springframework.data.repository.aot.hint\",\n      \"org.springframework.data.repository.cdi\",\n      \"org.springframework.data.repository.config\",\n      \"org.springframework.data.repository.core\",\n      \"org.springframework.data.repository.core.support\",\n      \"org.springframework.data.repository.history\",\n      \"org.springframework.data.repository.history.support\",\n      \"org.springframework.data.repository.init\",\n      \"org.springframework.data.repository.kotlin\",\n      \"org.springframework.data.repository.query\",\n      \"org.springframework.data.repository.query.parser\",\n      \"org.springframework.data.repository.reactive\",\n      \"org.springframework.data.repository.support\",\n      \"org.springframework.data.repository.util\",\n      \"org.springframework.data.spel\",\n      \"org.springframework.data.spel.spi\",\n      \"org.springframework.data.support\",\n      \"org.springframework.data.transaction\",\n      \"org.springframework.data.type\",\n      \"org.springframework.data.type.classreading\",\n      \"org.springframework.data.util\",\n      \"org.springframework.data.web\",\n      \"org.springframework.data.web.aot\",\n      \"org.springframework.data.web.config\",\n      \"org.springframework.data.web.querydsl\"\n    ],\n    \"org.springframework.data:spring-data-jpa\": [\n      \"org.springframework.data.jpa.convert\",\n      \"org.springframework.data.jpa.convert.threeten\",\n      \"org.springframework.data.jpa.domain\",\n      \"org.springframework.data.jpa.domain.support\",\n      \"org.springframework.data.jpa.mapping\",\n      \"org.springframework.data.jpa.projection\",\n      \"org.springframework.data.jpa.provider\",\n      \"org.springframework.data.jpa.repository\",\n      \"org.springframework.data.jpa.repository.aot\",\n      \"org.springframework.data.jpa.repository.cdi\",\n      \"org.springframework.data.jpa.repository.config\",\n      \"org.springframework.data.jpa.repository.query\",\n      \"org.springframework.data.jpa.repository.support\",\n      \"org.springframework.data.jpa.support\",\n      \"org.springframework.data.jpa.util\"\n    ],\n    \"org.springframework.security:spring-security-config\": [\n      \"org.springframework.security.config\",\n      \"org.springframework.security.config.annotation\",\n      \"org.springframework.security.config.annotation.authentication\",\n      \"org.springframework.security.config.annotation.authentication.builders\",\n      \"org.springframework.security.config.annotation.authentication.configuration\",\n      \"org.springframework.security.config.annotation.authentication.configurers.ldap\",\n      \"org.springframework.security.config.annotation.authentication.configurers.provisioning\",\n      \"org.springframework.security.config.annotation.authentication.configurers.userdetails\",\n      \"org.springframework.security.config.annotation.configuration\",\n      \"org.springframework.security.config.annotation.method.configuration\",\n      \"org.springframework.security.config.annotation.rsocket\",\n      \"org.springframework.security.config.annotation.web\",\n      \"org.springframework.security.config.annotation.web.builders\",\n      \"org.springframework.security.config.annotation.web.configuration\",\n      \"org.springframework.security.config.annotation.web.configurers\",\n      \"org.springframework.security.config.annotation.web.configurers.oauth2.client\",\n      \"org.springframework.security.config.annotation.web.configurers.oauth2.server.resource\",\n      \"org.springframework.security.config.annotation.web.configurers.saml2\",\n      \"org.springframework.security.config.annotation.web.headers\",\n      \"org.springframework.security.config.annotation.web.messaging\",\n      \"org.springframework.security.config.annotation.web.oauth2.client\",\n      \"org.springframework.security.config.annotation.web.oauth2.login\",\n      \"org.springframework.security.config.annotation.web.oauth2.resourceserver\",\n      \"org.springframework.security.config.annotation.web.reactive\",\n      \"org.springframework.security.config.annotation.web.saml2\",\n      \"org.springframework.security.config.annotation.web.servlet.configuration\",\n      \"org.springframework.security.config.annotation.web.session\",\n      \"org.springframework.security.config.annotation.web.socket\",\n      \"org.springframework.security.config.aot.hint\",\n      \"org.springframework.security.config.authentication\",\n      \"org.springframework.security.config.core\",\n      \"org.springframework.security.config.core.userdetails\",\n      \"org.springframework.security.config.crypto\",\n      \"org.springframework.security.config.debug\",\n      \"org.springframework.security.config.http\",\n      \"org.springframework.security.config.ldap\",\n      \"org.springframework.security.config.method\",\n      \"org.springframework.security.config.oauth2.client\",\n      \"org.springframework.security.config.provisioning\",\n      \"org.springframework.security.config.saml2\",\n      \"org.springframework.security.config.web.server\",\n      \"org.springframework.security.config.websocket\"\n    ],\n    \"org.springframework.security:spring-security-core\": [\n      \"org.springframework.security.access\",\n      \"org.springframework.security.access.annotation\",\n      \"org.springframework.security.access.event\",\n      \"org.springframework.security.access.expression\",\n      \"org.springframework.security.access.expression.method\",\n      \"org.springframework.security.access.hierarchicalroles\",\n      \"org.springframework.security.access.intercept\",\n      \"org.springframework.security.access.intercept.aopalliance\",\n      \"org.springframework.security.access.intercept.aspectj\",\n      \"org.springframework.security.access.method\",\n      \"org.springframework.security.access.prepost\",\n      \"org.springframework.security.access.vote\",\n      \"org.springframework.security.aot.hint\",\n      \"org.springframework.security.authentication\",\n      \"org.springframework.security.authentication.dao\",\n      \"org.springframework.security.authentication.event\",\n      \"org.springframework.security.authentication.jaas\",\n      \"org.springframework.security.authentication.jaas.event\",\n      \"org.springframework.security.authentication.jaas.memory\",\n      \"org.springframework.security.authentication.password\",\n      \"org.springframework.security.authorization\",\n      \"org.springframework.security.authorization.event\",\n      \"org.springframework.security.authorization.method\",\n      \"org.springframework.security.concurrent\",\n      \"org.springframework.security.context\",\n      \"org.springframework.security.converter\",\n      \"org.springframework.security.core\",\n      \"org.springframework.security.core.annotation\",\n      \"org.springframework.security.core.authority\",\n      \"org.springframework.security.core.authority.mapping\",\n      \"org.springframework.security.core.context\",\n      \"org.springframework.security.core.parameters\",\n      \"org.springframework.security.core.session\",\n      \"org.springframework.security.core.token\",\n      \"org.springframework.security.core.userdetails\",\n      \"org.springframework.security.core.userdetails.cache\",\n      \"org.springframework.security.core.userdetails.jdbc\",\n      \"org.springframework.security.core.userdetails.memory\",\n      \"org.springframework.security.jackson2\",\n      \"org.springframework.security.provisioning\",\n      \"org.springframework.security.scheduling\",\n      \"org.springframework.security.task\",\n      \"org.springframework.security.util\"\n    ],\n    \"org.springframework.security:spring-security-crypto\": [\n      \"org.springframework.security.crypto.argon2\",\n      \"org.springframework.security.crypto.bcrypt\",\n      \"org.springframework.security.crypto.codec\",\n      \"org.springframework.security.crypto.encrypt\",\n      \"org.springframework.security.crypto.factory\",\n      \"org.springframework.security.crypto.keygen\",\n      \"org.springframework.security.crypto.password\",\n      \"org.springframework.security.crypto.scrypt\",\n      \"org.springframework.security.crypto.util\"\n    ],\n    \"org.springframework.security:spring-security-oauth2-client\": [\n      \"org.springframework.security.oauth2.client\",\n      \"org.springframework.security.oauth2.client.annotation\",\n      \"org.springframework.security.oauth2.client.aot.hint\",\n      \"org.springframework.security.oauth2.client.authentication\",\n      \"org.springframework.security.oauth2.client.endpoint\",\n      \"org.springframework.security.oauth2.client.http\",\n      \"org.springframework.security.oauth2.client.jackson2\",\n      \"org.springframework.security.oauth2.client.oidc.authentication\",\n      \"org.springframework.security.oauth2.client.oidc.authentication.logout\",\n      \"org.springframework.security.oauth2.client.oidc.server.session\",\n      \"org.springframework.security.oauth2.client.oidc.session\",\n      \"org.springframework.security.oauth2.client.oidc.userinfo\",\n      \"org.springframework.security.oauth2.client.oidc.web.logout\",\n      \"org.springframework.security.oauth2.client.oidc.web.server.logout\",\n      \"org.springframework.security.oauth2.client.registration\",\n      \"org.springframework.security.oauth2.client.userinfo\",\n      \"org.springframework.security.oauth2.client.web\",\n      \"org.springframework.security.oauth2.client.web.method.annotation\",\n      \"org.springframework.security.oauth2.client.web.reactive.function.client\",\n      \"org.springframework.security.oauth2.client.web.reactive.result.method.annotation\",\n      \"org.springframework.security.oauth2.client.web.server\",\n      \"org.springframework.security.oauth2.client.web.server.authentication\"\n    ],\n    \"org.springframework.security:spring-security-oauth2-core\": [\n      \"org.springframework.security.oauth2.core\",\n      \"org.springframework.security.oauth2.core.authorization\",\n      \"org.springframework.security.oauth2.core.converter\",\n      \"org.springframework.security.oauth2.core.endpoint\",\n      \"org.springframework.security.oauth2.core.http.converter\",\n      \"org.springframework.security.oauth2.core.oidc\",\n      \"org.springframework.security.oauth2.core.oidc.endpoint\",\n      \"org.springframework.security.oauth2.core.oidc.user\",\n      \"org.springframework.security.oauth2.core.user\",\n      \"org.springframework.security.oauth2.core.web.reactive.function\"\n    ],\n    \"org.springframework.security:spring-security-oauth2-jose\": [\n      \"org.springframework.security.oauth2.jose\",\n      \"org.springframework.security.oauth2.jose.jws\",\n      \"org.springframework.security.oauth2.jwt\"\n    ],\n    \"org.springframework.security:spring-security-web\": [\n      \"org.springframework.security.web\",\n      \"org.springframework.security.web.access\",\n      \"org.springframework.security.web.access.channel\",\n      \"org.springframework.security.web.access.expression\",\n      \"org.springframework.security.web.access.intercept\",\n      \"org.springframework.security.web.aot.hint\",\n      \"org.springframework.security.web.authentication\",\n      \"org.springframework.security.web.authentication.logout\",\n      \"org.springframework.security.web.authentication.password\",\n      \"org.springframework.security.web.authentication.preauth\",\n      \"org.springframework.security.web.authentication.preauth.j2ee\",\n      \"org.springframework.security.web.authentication.preauth.websphere\",\n      \"org.springframework.security.web.authentication.preauth.x509\",\n      \"org.springframework.security.web.authentication.rememberme\",\n      \"org.springframework.security.web.authentication.session\",\n      \"org.springframework.security.web.authentication.switchuser\",\n      \"org.springframework.security.web.authentication.ui\",\n      \"org.springframework.security.web.authentication.www\",\n      \"org.springframework.security.web.bind.annotation\",\n      \"org.springframework.security.web.bind.support\",\n      \"org.springframework.security.web.context\",\n      \"org.springframework.security.web.context.request.async\",\n      \"org.springframework.security.web.context.support\",\n      \"org.springframework.security.web.csrf\",\n      \"org.springframework.security.web.debug\",\n      \"org.springframework.security.web.firewall\",\n      \"org.springframework.security.web.header\",\n      \"org.springframework.security.web.header.writers\",\n      \"org.springframework.security.web.header.writers.frameoptions\",\n      \"org.springframework.security.web.http\",\n      \"org.springframework.security.web.jaasapi\",\n      \"org.springframework.security.web.jackson2\",\n      \"org.springframework.security.web.method.annotation\",\n      \"org.springframework.security.web.reactive.result.method.annotation\",\n      \"org.springframework.security.web.reactive.result.view\",\n      \"org.springframework.security.web.savedrequest\",\n      \"org.springframework.security.web.server\",\n      \"org.springframework.security.web.server.authentication\",\n      \"org.springframework.security.web.server.authentication.logout\",\n      \"org.springframework.security.web.server.authorization\",\n      \"org.springframework.security.web.server.context\",\n      \"org.springframework.security.web.server.csrf\",\n      \"org.springframework.security.web.server.firewall\",\n      \"org.springframework.security.web.server.header\",\n      \"org.springframework.security.web.server.jackson2\",\n      \"org.springframework.security.web.server.savedrequest\",\n      \"org.springframework.security.web.server.transport\",\n      \"org.springframework.security.web.server.ui\",\n      \"org.springframework.security.web.server.util.matcher\",\n      \"org.springframework.security.web.servlet.support.csrf\",\n      \"org.springframework.security.web.servlet.util.matcher\",\n      \"org.springframework.security.web.servletapi\",\n      \"org.springframework.security.web.session\",\n      \"org.springframework.security.web.util\",\n      \"org.springframework.security.web.util.matcher\"\n    ],\n    \"org.springframework:spring-aop\": [\n      \"org.aopalliance.aop\",\n      \"org.aopalliance.intercept\",\n      \"org.springframework.aop\",\n      \"org.springframework.aop.aspectj\",\n      \"org.springframework.aop.aspectj.annotation\",\n      \"org.springframework.aop.aspectj.autoproxy\",\n      \"org.springframework.aop.config\",\n      \"org.springframework.aop.framework\",\n      \"org.springframework.aop.framework.adapter\",\n      \"org.springframework.aop.framework.autoproxy\",\n      \"org.springframework.aop.framework.autoproxy.target\",\n      \"org.springframework.aop.interceptor\",\n      \"org.springframework.aop.scope\",\n      \"org.springframework.aop.support\",\n      \"org.springframework.aop.support.annotation\",\n      \"org.springframework.aop.target\",\n      \"org.springframework.aop.target.dynamic\"\n    ],\n    \"org.springframework:spring-aspects\": [\n      \"org.springframework.beans.factory.aspectj\",\n      \"org.springframework.cache.aspectj\",\n      \"org.springframework.context.annotation.aspectj\",\n      \"org.springframework.scheduling.aspectj\",\n      \"org.springframework.transaction.aspectj\"\n    ],\n    \"org.springframework:spring-beans\": [\n      \"org.springframework.beans\",\n      \"org.springframework.beans.factory\",\n      \"org.springframework.beans.factory.annotation\",\n      \"org.springframework.beans.factory.aot\",\n      \"org.springframework.beans.factory.config\",\n      \"org.springframework.beans.factory.groovy\",\n      \"org.springframework.beans.factory.parsing\",\n      \"org.springframework.beans.factory.serviceloader\",\n      \"org.springframework.beans.factory.support\",\n      \"org.springframework.beans.factory.wiring\",\n      \"org.springframework.beans.factory.xml\",\n      \"org.springframework.beans.propertyeditors\",\n      \"org.springframework.beans.support\"\n    ],\n    \"org.springframework:spring-context\": [\n      \"org.springframework.cache\",\n      \"org.springframework.cache.annotation\",\n      \"org.springframework.cache.concurrent\",\n      \"org.springframework.cache.config\",\n      \"org.springframework.cache.interceptor\",\n      \"org.springframework.cache.support\",\n      \"org.springframework.context\",\n      \"org.springframework.context.annotation\",\n      \"org.springframework.context.aot\",\n      \"org.springframework.context.config\",\n      \"org.springframework.context.event\",\n      \"org.springframework.context.expression\",\n      \"org.springframework.context.i18n\",\n      \"org.springframework.context.index\",\n      \"org.springframework.context.support\",\n      \"org.springframework.context.weaving\",\n      \"org.springframework.ejb.config\",\n      \"org.springframework.format\",\n      \"org.springframework.format.annotation\",\n      \"org.springframework.format.datetime\",\n      \"org.springframework.format.datetime.standard\",\n      \"org.springframework.format.number\",\n      \"org.springframework.format.number.money\",\n      \"org.springframework.format.support\",\n      \"org.springframework.instrument.classloading\",\n      \"org.springframework.instrument.classloading.glassfish\",\n      \"org.springframework.instrument.classloading.jboss\",\n      \"org.springframework.instrument.classloading.tomcat\",\n      \"org.springframework.jmx\",\n      \"org.springframework.jmx.access\",\n      \"org.springframework.jmx.export\",\n      \"org.springframework.jmx.export.annotation\",\n      \"org.springframework.jmx.export.assembler\",\n      \"org.springframework.jmx.export.metadata\",\n      \"org.springframework.jmx.export.naming\",\n      \"org.springframework.jmx.export.notification\",\n      \"org.springframework.jmx.support\",\n      \"org.springframework.jndi\",\n      \"org.springframework.jndi.support\",\n      \"org.springframework.scheduling\",\n      \"org.springframework.scheduling.annotation\",\n      \"org.springframework.scheduling.concurrent\",\n      \"org.springframework.scheduling.config\",\n      \"org.springframework.scheduling.support\",\n      \"org.springframework.scripting\",\n      \"org.springframework.scripting.bsh\",\n      \"org.springframework.scripting.config\",\n      \"org.springframework.scripting.groovy\",\n      \"org.springframework.scripting.support\",\n      \"org.springframework.stereotype\",\n      \"org.springframework.ui\",\n      \"org.springframework.ui.context\",\n      \"org.springframework.ui.context.support\",\n      \"org.springframework.validation\",\n      \"org.springframework.validation.annotation\",\n      \"org.springframework.validation.beanvalidation\",\n      \"org.springframework.validation.method\",\n      \"org.springframework.validation.support\"\n    ],\n    \"org.springframework:spring-core\": [\n      \"org.springframework.aot\",\n      \"org.springframework.aot.generate\",\n      \"org.springframework.aot.hint\",\n      \"org.springframework.aot.hint.annotation\",\n      \"org.springframework.aot.hint.predicate\",\n      \"org.springframework.aot.hint.support\",\n      \"org.springframework.aot.nativex\",\n      \"org.springframework.aot.nativex.feature\",\n      \"org.springframework.aot.nativex.substitution\",\n      \"org.springframework.asm\",\n      \"org.springframework.cglib\",\n      \"org.springframework.cglib.beans\",\n      \"org.springframework.cglib.core\",\n      \"org.springframework.cglib.core.internal\",\n      \"org.springframework.cglib.proxy\",\n      \"org.springframework.cglib.reflect\",\n      \"org.springframework.cglib.transform\",\n      \"org.springframework.cglib.transform.impl\",\n      \"org.springframework.cglib.util\",\n      \"org.springframework.core\",\n      \"org.springframework.core.annotation\",\n      \"org.springframework.core.codec\",\n      \"org.springframework.core.convert\",\n      \"org.springframework.core.convert.converter\",\n      \"org.springframework.core.convert.support\",\n      \"org.springframework.core.env\",\n      \"org.springframework.core.io\",\n      \"org.springframework.core.io.buffer\",\n      \"org.springframework.core.io.support\",\n      \"org.springframework.core.log\",\n      \"org.springframework.core.metrics\",\n      \"org.springframework.core.metrics.jfr\",\n      \"org.springframework.core.serializer\",\n      \"org.springframework.core.serializer.support\",\n      \"org.springframework.core.style\",\n      \"org.springframework.core.task\",\n      \"org.springframework.core.task.support\",\n      \"org.springframework.core.type\",\n      \"org.springframework.core.type.classreading\",\n      \"org.springframework.core.type.filter\",\n      \"org.springframework.javapoet\",\n      \"org.springframework.lang\",\n      \"org.springframework.objenesis\",\n      \"org.springframework.objenesis.instantiator\",\n      \"org.springframework.objenesis.instantiator.android\",\n      \"org.springframework.objenesis.instantiator.annotations\",\n      \"org.springframework.objenesis.instantiator.basic\",\n      \"org.springframework.objenesis.instantiator.gcj\",\n      \"org.springframework.objenesis.instantiator.perc\",\n      \"org.springframework.objenesis.instantiator.sun\",\n      \"org.springframework.objenesis.instantiator.util\",\n      \"org.springframework.objenesis.strategy\",\n      \"org.springframework.util\",\n      \"org.springframework.util.backoff\",\n      \"org.springframework.util.comparator\",\n      \"org.springframework.util.concurrent\",\n      \"org.springframework.util.function\",\n      \"org.springframework.util.unit\",\n      \"org.springframework.util.xml\"\n    ],\n    \"org.springframework:spring-expression\": [\n      \"org.springframework.expression\",\n      \"org.springframework.expression.common\",\n      \"org.springframework.expression.spel\",\n      \"org.springframework.expression.spel.ast\",\n      \"org.springframework.expression.spel.standard\",\n      \"org.springframework.expression.spel.support\"\n    ],\n    \"org.springframework:spring-jcl\": [\n      \"org.apache.commons.logging\",\n      \"org.apache.commons.logging.impl\"\n    ],\n    \"org.springframework:spring-jdbc\": [\n      \"org.springframework.jdbc\",\n      \"org.springframework.jdbc.config\",\n      \"org.springframework.jdbc.core\",\n      \"org.springframework.jdbc.core.metadata\",\n      \"org.springframework.jdbc.core.namedparam\",\n      \"org.springframework.jdbc.core.simple\",\n      \"org.springframework.jdbc.core.support\",\n      \"org.springframework.jdbc.datasource\",\n      \"org.springframework.jdbc.datasource.embedded\",\n      \"org.springframework.jdbc.datasource.init\",\n      \"org.springframework.jdbc.datasource.lookup\",\n      \"org.springframework.jdbc.object\",\n      \"org.springframework.jdbc.support\",\n      \"org.springframework.jdbc.support.incrementer\",\n      \"org.springframework.jdbc.support.lob\",\n      \"org.springframework.jdbc.support.rowset\",\n      \"org.springframework.jdbc.support.xml\"\n    ],\n    \"org.springframework:spring-orm\": [\n      \"org.springframework.orm\",\n      \"org.springframework.orm.hibernate5\",\n      \"org.springframework.orm.hibernate5.support\",\n      \"org.springframework.orm.jpa\",\n      \"org.springframework.orm.jpa.persistenceunit\",\n      \"org.springframework.orm.jpa.support\",\n      \"org.springframework.orm.jpa.vendor\"\n    ],\n    \"org.springframework:spring-tx\": [\n      \"org.springframework.dao\",\n      \"org.springframework.dao.annotation\",\n      \"org.springframework.dao.support\",\n      \"org.springframework.jca.endpoint\",\n      \"org.springframework.jca.support\",\n      \"org.springframework.transaction\",\n      \"org.springframework.transaction.annotation\",\n      \"org.springframework.transaction.config\",\n      \"org.springframework.transaction.event\",\n      \"org.springframework.transaction.interceptor\",\n      \"org.springframework.transaction.jta\",\n      \"org.springframework.transaction.reactive\",\n      \"org.springframework.transaction.support\"\n    ],\n    \"org.springframework:spring-web\": [\n      \"org.springframework.http\",\n      \"org.springframework.http.client\",\n      \"org.springframework.http.client.observation\",\n      \"org.springframework.http.client.reactive\",\n      \"org.springframework.http.client.support\",\n      \"org.springframework.http.codec\",\n      \"org.springframework.http.codec.cbor\",\n      \"org.springframework.http.codec.json\",\n      \"org.springframework.http.codec.multipart\",\n      \"org.springframework.http.codec.protobuf\",\n      \"org.springframework.http.codec.support\",\n      \"org.springframework.http.codec.xml\",\n      \"org.springframework.http.converter\",\n      \"org.springframework.http.converter.cbor\",\n      \"org.springframework.http.converter.feed\",\n      \"org.springframework.http.converter.json\",\n      \"org.springframework.http.converter.protobuf\",\n      \"org.springframework.http.converter.smile\",\n      \"org.springframework.http.converter.support\",\n      \"org.springframework.http.converter.xml\",\n      \"org.springframework.http.server\",\n      \"org.springframework.http.server.observation\",\n      \"org.springframework.http.server.reactive\",\n      \"org.springframework.http.server.reactive.observation\",\n      \"org.springframework.http.support\",\n      \"org.springframework.web\",\n      \"org.springframework.web.accept\",\n      \"org.springframework.web.bind\",\n      \"org.springframework.web.bind.annotation\",\n      \"org.springframework.web.bind.support\",\n      \"org.springframework.web.client\",\n      \"org.springframework.web.client.support\",\n      \"org.springframework.web.context\",\n      \"org.springframework.web.context.annotation\",\n      \"org.springframework.web.context.request\",\n      \"org.springframework.web.context.request.async\",\n      \"org.springframework.web.context.support\",\n      \"org.springframework.web.cors\",\n      \"org.springframework.web.cors.reactive\",\n      \"org.springframework.web.filter\",\n      \"org.springframework.web.filter.reactive\",\n      \"org.springframework.web.jsf\",\n      \"org.springframework.web.jsf.el\",\n      \"org.springframework.web.method\",\n      \"org.springframework.web.method.annotation\",\n      \"org.springframework.web.method.support\",\n      \"org.springframework.web.multipart\",\n      \"org.springframework.web.multipart.support\",\n      \"org.springframework.web.server\",\n      \"org.springframework.web.server.adapter\",\n      \"org.springframework.web.server.handler\",\n      \"org.springframework.web.server.i18n\",\n      \"org.springframework.web.server.session\",\n      \"org.springframework.web.service\",\n      \"org.springframework.web.service.annotation\",\n      \"org.springframework.web.service.invoker\",\n      \"org.springframework.web.util\",\n      \"org.springframework.web.util.pattern\"\n    ],\n    \"org.springframework:spring-webflux\": [\n      \"org.springframework.web.reactive\",\n      \"org.springframework.web.reactive.accept\",\n      \"org.springframework.web.reactive.config\",\n      \"org.springframework.web.reactive.function\",\n      \"org.springframework.web.reactive.function.client\",\n      \"org.springframework.web.reactive.function.client.support\",\n      \"org.springframework.web.reactive.function.server\",\n      \"org.springframework.web.reactive.function.server.support\",\n      \"org.springframework.web.reactive.handler\",\n      \"org.springframework.web.reactive.resource\",\n      \"org.springframework.web.reactive.result\",\n      \"org.springframework.web.reactive.result.condition\",\n      \"org.springframework.web.reactive.result.method\",\n      \"org.springframework.web.reactive.result.method.annotation\",\n      \"org.springframework.web.reactive.result.view\",\n      \"org.springframework.web.reactive.result.view.freemarker\",\n      \"org.springframework.web.reactive.result.view.script\",\n      \"org.springframework.web.reactive.server\",\n      \"org.springframework.web.reactive.socket\",\n      \"org.springframework.web.reactive.socket.adapter\",\n      \"org.springframework.web.reactive.socket.client\",\n      \"org.springframework.web.reactive.socket.server\",\n      \"org.springframework.web.reactive.socket.server.support\",\n      \"org.springframework.web.reactive.socket.server.upgrade\"\n    ]\n  },\n  \"repositories\": {\n    \"https://repo1.maven.org/maven2/\": [\n      \"ch.qos.logback:logback-classic\",\n      \"ch.qos.logback:logback-core\",\n      \"com.fasterxml.jackson.core:jackson-annotations\",\n      \"com.fasterxml.jackson.core:jackson-core\",\n      \"com.fasterxml.jackson.core:jackson-databind\",\n      \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\",\n      \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\",\n      \"com.fasterxml.jackson.module:jackson-module-parameter-names\",\n      \"com.fasterxml:classmate\",\n      \"com.github.stephenc.jcip:jcip-annotations\",\n      \"com.nimbusds:content-type\",\n      \"com.nimbusds:lang-tag\",\n      \"com.nimbusds:nimbus-jose-jwt\",\n      \"com.nimbusds:oauth2-oidc-sdk\",\n      \"com.sun.istack:istack-commons-runtime\",\n      \"com.zaxxer:HikariCP\",\n      \"io.micrometer:micrometer-commons\",\n      \"io.micrometer:micrometer-core\",\n      \"io.micrometer:micrometer-jakarta9\",\n      \"io.micrometer:micrometer-observation\",\n      \"io.netty:netty-buffer\",\n      \"io.netty:netty-codec\",\n      \"io.netty:netty-codec-dns\",\n      \"io.netty:netty-codec-http\",\n      \"io.netty:netty-codec-http2\",\n      \"io.netty:netty-codec-socks\",\n      \"io.netty:netty-common\",\n      \"io.netty:netty-handler\",\n      \"io.netty:netty-handler-proxy\",\n      \"io.netty:netty-resolver\",\n      \"io.netty:netty-resolver-dns\",\n      \"io.netty:netty-resolver-dns-classes-macos\",\n      \"io.netty:netty-resolver-dns-native-macos:jar:osx-x86_64\",\n      \"io.netty:netty-transport\",\n      \"io.netty:netty-transport-classes-epoll\",\n      \"io.netty:netty-transport-native-epoll:jar:linux-x86_64\",\n      \"io.netty:netty-transport-native-unix-common\",\n      \"io.projectreactor.netty:reactor-netty-core\",\n      \"io.projectreactor.netty:reactor-netty-http\",\n      \"io.projectreactor:reactor-core\",\n      \"io.smallrye:jandex\",\n      \"jakarta.activation:jakarta.activation-api\",\n      \"jakarta.annotation:jakarta.annotation-api\",\n      \"jakarta.inject:jakarta.inject-api\",\n      \"jakarta.persistence:jakarta.persistence-api\",\n      \"jakarta.servlet.jsp:jakarta.servlet.jsp-api\",\n      \"jakarta.transaction:jakarta.transaction-api\",\n      \"jakarta.xml.bind:jakarta.xml.bind-api\",\n      \"junit:junit\",\n      \"net.bytebuddy:byte-buddy\",\n      \"net.minidev:accessors-smart\",\n      \"net.minidev:json-smart\",\n      \"org.antlr:antlr4-runtime\",\n      \"org.apache.logging.log4j:log4j-api\",\n      \"org.apache.logging.log4j:log4j-to-slf4j\",\n      \"org.aspectj:aspectjweaver\",\n      \"org.assertj:assertj-core\",\n      \"org.eclipse.angus:angus-activation\",\n      \"org.glassfish.jaxb:jaxb-core\",\n      \"org.glassfish.jaxb:jaxb-runtime\",\n      \"org.glassfish.jaxb:txw2\",\n      \"org.hamcrest:hamcrest-core\",\n      \"org.hdrhistogram:HdrHistogram\",\n      \"org.hibernate.common:hibernate-commons-annotations\",\n      \"org.hibernate.orm:hibernate-core\",\n      \"org.jboss.logging:jboss-logging\",\n      \"org.latencyutils:LatencyUtils\",\n      \"org.ow2.asm:asm\",\n      \"org.reactivestreams:reactive-streams\",\n      \"org.slf4j:jul-to-slf4j\",\n      \"org.springframework.boot:spring-boot\",\n      \"org.springframework.boot:spring-boot-actuator\",\n      \"org.springframework.boot:spring-boot-actuator-autoconfigure\",\n      \"org.springframework.boot:spring-boot-autoconfigure\",\n      \"org.springframework.boot:spring-boot-starter\",\n      \"org.springframework.boot:spring-boot-starter-actuator\",\n      \"org.springframework.boot:spring-boot-starter-aop\",\n      \"org.springframework.boot:spring-boot-starter-data-jpa\",\n      \"org.springframework.boot:spring-boot-starter-jdbc\",\n      \"org.springframework.boot:spring-boot-starter-json\",\n      \"org.springframework.boot:spring-boot-starter-logging\",\n      \"org.springframework.boot:spring-boot-starter-oauth2-client\",\n      \"org.springframework.boot:spring-boot-starter-reactor-netty\",\n      \"org.springframework.boot:spring-boot-starter-security\",\n      \"org.springframework.boot:spring-boot-starter-webflux\",\n      \"org.springframework.data:spring-data-commons\",\n      \"org.springframework.data:spring-data-jpa\",\n      \"org.springframework.security:spring-security-config\",\n      \"org.springframework.security:spring-security-core\",\n      \"org.springframework.security:spring-security-crypto\",\n      \"org.springframework.security:spring-security-oauth2-client\",\n      \"org.springframework.security:spring-security-oauth2-core\",\n      \"org.springframework.security:spring-security-oauth2-jose\",\n      \"org.springframework.security:spring-security-web\",\n      \"org.springframework:spring-aop\",\n      \"org.springframework:spring-aspects\",\n      \"org.springframework:spring-beans\",\n      \"org.springframework:spring-context\",\n      \"org.springframework:spring-core\",\n      \"org.springframework:spring-expression\",\n      \"org.springframework:spring-jcl\",\n      \"org.springframework:spring-jdbc\",\n      \"org.springframework:spring-orm\",\n      \"org.springframework:spring-tx\",\n      \"org.springframework:spring-web\",\n      \"org.springframework:spring-webflux\"\n    ]\n  },\n  \"services\": {\n    \"ch.qos.logback:logback-classic\": {\n      \"jakarta.servlet.ServletContainerInitializer\": [\n        \"ch.qos.logback.classic.servlet.LogbackServletContainerInitializer\"\n      ],\n      \"org.slf4j.spi.SLF4JServiceProvider\": [\n        \"ch.qos.logback.classic.spi.LogbackServiceProvider\"\n      ]\n    },\n    \"com.fasterxml.jackson.core:jackson-core\": {\n      \"com.fasterxml.jackson.core.JsonFactory\": [\n        \"com.fasterxml.jackson.core.JsonFactory\"\n      ]\n    },\n    \"com.fasterxml.jackson.core:jackson-databind\": {\n      \"com.fasterxml.jackson.core.ObjectCodec\": [\n        \"com.fasterxml.jackson.databind.ObjectMapper\"\n      ]\n    },\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jdk8\": {\n      \"com.fasterxml.jackson.databind.Module\": [\n        \"com.fasterxml.jackson.datatype.jdk8.Jdk8Module\"\n      ]\n    },\n    \"com.fasterxml.jackson.datatype:jackson-datatype-jsr310\": {\n      \"com.fasterxml.jackson.databind.Module\": [\n        \"com.fasterxml.jackson.datatype.jsr310.JavaTimeModule\"\n      ]\n    },\n    \"com.fasterxml.jackson.module:jackson-module-parameter-names\": {\n      \"com.fasterxml.jackson.databind.Module\": [\n        \"com.fasterxml.jackson.module.paramnames.ParameterNamesModule\"\n      ]\n    },\n    \"io.micrometer:micrometer-observation\": {\n      \"io.micrometer.context.ThreadLocalAccessor\": [\n        \"io.micrometer.observation.contextpropagation.ObservationThreadLocalAccessor\"\n      ]\n    },\n    \"io.netty:netty-common\": {\n      \"reactor.blockhound.integration.BlockHoundIntegration\": [\n        \"io.netty.util.internal.Hidden$NettyBlockHoundIntegration\"\n      ]\n    },\n    \"io.projectreactor.netty:reactor-netty-core\": {\n      \"io.micrometer.context.ContextAccessor\": [\n        \"reactor.netty.contextpropagation.ChannelContextAccessor\"\n      ]\n    },\n    \"io.projectreactor:reactor-core\": {\n      \"io.micrometer.context.ContextAccessor\": [\n        \"reactor.util.context.ReactorContextAccessor\"\n      ],\n      \"reactor.blockhound.integration.BlockHoundIntegration\": [\n        \"reactor.core.scheduler.ReactorBlockHoundIntegration\"\n      ]\n    },\n    \"org.apache.logging.log4j:log4j-api\": {\n      \"org.apache.logging.log4j.util.PropertySource\": [\n        \"org.apache.logging.log4j.util.EnvironmentPropertySource\",\n        \"org.apache.logging.log4j.util.SystemPropertiesPropertySource\"\n      ]\n    },\n    \"org.apache.logging.log4j:log4j-to-slf4j\": {\n      \"org.apache.logging.log4j.spi.Provider\": [\n        \"org.apache.logging.slf4j.SLF4JProvider\"\n      ]\n    },\n    \"org.eclipse.angus:angus-activation\": {\n      \"jakarta.activation.spi.MailcapRegistryProvider\": [\n        \"org.eclipse.angus.activation.MailcapRegistryProviderImpl\"\n      ],\n      \"jakarta.activation.spi.MimeTypeRegistryProvider\": [\n        \"org.eclipse.angus.activation.MimeTypeRegistryProviderImpl\"\n      ]\n    },\n    \"org.glassfish.jaxb:jaxb-runtime\": {\n      \"jakarta.xml.bind.JAXBContextFactory\": [\n        \"org.glassfish.jaxb.runtime.v2.JAXBContextFactory\"\n      ]\n    },\n    \"org.hibernate.orm:hibernate-core\": {\n      \"jakarta.persistence.spi.PersistenceProvider\": [\n        \"org.hibernate.jpa.HibernatePersistenceProvider\"\n      ],\n      \"org.hibernate.bytecode.spi.BytecodeProvider\": [\n        \"org.hibernate.bytecode.internal.bytebuddy.BytecodeProviderImpl\"\n      ]\n    },\n    \"org.springframework.boot:spring-boot\": {\n      \"ch.qos.logback.classic.spi.Configurator\": [\n        \"org.springframework.boot.logging.logback.RootLogLevelConfigurator\"\n      ],\n      \"org.apache.logging.log4j.util.PropertySource\": [\n        \"org.springframework.boot.logging.log4j2.SpringBootPropertySource\"\n      ]\n    },\n    \"org.springframework.data:spring-data-jpa\": {\n      \"jakarta.enterprise.inject.spi.Extension\": [\n        \"org.springframework.data.jpa.repository.cdi.JpaRepositoryExtension\"\n      ]\n    },\n    \"org.springframework:spring-core\": {\n      \"reactor.blockhound.integration.BlockHoundIntegration\": [\n        \"org.springframework.core.ReactiveAdapterRegistry$SpringCoreBlockHoundIntegration\"\n      ]\n    },\n    \"org.springframework:spring-jcl\": {\n      \"org.apache.commons.logging.LogFactory\": [\n        \"org.apache.commons.logging.LogFactoryService\"\n      ]\n    },\n    \"org.springframework:spring-web\": {\n      \"jakarta.servlet.ServletContainerInitializer\": [\n        \"org.springframework.web.SpringServletContainerInitializer\"\n      ],\n      \"reactor.blockhound.integration.BlockHoundIntegration\": [\n        \"org.springframework.web.server.adapter.WebHttpHandlerBuilder$SpringWebBlockHoundIntegration\"\n      ]\n    }\n  },\n  \"version\": \"2\"\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/internal_dependencies_testing.md",
    "content": "# Internal Dependencies Testing\n\n`internal_dependencies` under both `depsfilter` and `dependencyset` contain comprehensive tests for the `deps_filter` rule and `dependencyset` macro, which filters compile-time and runtime dependencies in Java projects. The tests cover various dependency scenarios and filtering mechanisms to ensure the rule works correctly across different use cases.\n\n## Directory Structure\n\n```\ntests/\n├── depsfilter/\n│   └── internal_dependencies/\n│       ├── compile_time_only/\n│       ├── runtime_only/\n│       ├── compile_and_runtime_1/\n│       └── compile_and_runtime_2/\n└── dependencyset/\n    └── internal_dependencies/\n        ├── compile_time_only/\n        ├── runtime_only/\n        ├── compile_and_runtime_1/\n        └── compile_and_runtime_2/\n```\n\n## Testing Approach\n\nSimilar testing scenarios are implemented using two different approaches:\n\n### 1. Deps Filter Rule Testing\n\n**Pattern**: `base_lib -> deps_filter() -> bazel starlark/java tests`\n\n**Example from compile_and_runtime_1**:\n```bazel\n# Base library with dependencies\njava_library(\n    name = \"base_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":lib_a\"],\n    runtime_deps = [\":lib_g\"],\n)\n\n# Apply filtering\ndeps_filter(\n    name = \"filtered_deps_exclude_b_g\",\n    deps = [\":base_lib\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\n# Test the filtered result\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    filtered = \":filtered_deps_exclude_b_g\",\n)\n```\n\n**Exception in compile_and_runtime_2**: No base_lib, direct `deps` and `runtime_deps` specified in `deps_filter` rule:\n```bazel\ndeps_filter(\n    name = \"filtered_deps_exclude_b_g\",\n    deps = [\":lib_a\", \":lib_i\"],\n    runtime_deps = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    filtered = \":filtered_deps_exclude_b_g\",\n)\n```\n\n### 2. Dependencyset Macro Testing\n\n**Pattern**: `dependencyset(\"deps), dependencyset(\"runtime_deps\") -> java_library -> bazel starlark/java tests`\n\n**Consistent approach across all test categories**:\n```bazel\n# Create filtered dependency sets\ndependencyset(\n    name = \"deps_exclude_b_g\",\n    items = [\":lib_a\", \":lib_i\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\ndependencyset(\n    name = \"runtime_deps_exclude_b_g\",\n    items = [\":lib_h\", \":lib_j\"],\n    deps_exclude_labels = [\":lib_b\", \":lib_g\"],\n)\n\n# Create test library using filtered sets\njava_library(\n    name = \"exclude_b_g_test_lib\",\n    srcs = [\"src/main/java/com/depsfilter/H.java\"],\n    deps = [\":deps_exclude_b_g\"],\n    runtime_deps = [\":runtime_deps_exclude_b_g\"],\n)\n\n# Test the filtered result\nfiltered_deps_test(\n    name = \"deps_filter_exclude_b_g_test\",\n    test_lib = \":exclude_b_g_test_lib\",\n)\n\n# Java test for runtime verification\njava_test(\n    name = \"DepsFilterFilteredDepsTest\",\n    size = \"small\",\n    srcs = [\n        \"src/test/java/com/depsfilter/DepsFilterTestHelper.java\",\n        \"src/test/java/com/depsfilter/DepsFilterFilteredDepsTest.java\"\n    ],\n    deps = [\":exclude_b_g_test_lib\"] + test_deps,\n)\n```\n\n## Test Structure\n\nThe testing is organized into four main categories, each focusing on different aspects of dependency filtering:\n\n### 1. `compile_time_only/`\n**Purpose**: Tests dependency filtering when only compile-time dependencies are present.\n\n**Key Characteristics**:\n- All dependencies are compile-time (`deps` attribute)\n- No runtime dependencies (`runtime_deps` attribute)\n- Tests both interface JARs (`-hjar`) and implementation JARs\n\n**Test Scenarios**:\n- **No Filtering**: Verifies that `deps_filter`/`dependencyset` preserves all dependencies when no exclusions are applied\n- **Basic Filtering**: Tests label-based exclusions with `exclude_transitives=False`\n- **Transitive Exclusions**: Tests label-based exclusions with `exclude_transitives=True`\n- **Path-based Exclusions**: Tests filtering based on path patterns\n\n**Dependency Graph for depsfilter**:\n```\n        base_lib\n        /     \\\n       A       G\n      / \\     /\n     B   E   /\n     |   | /\n     |   F \n      \\ / \n       C\n       |\n       D\n```\n\n**Dependency Graph for dependencyset**:\n```\n        base_lib\n           |\n     dependencyset()\n        /     \\\n       A       I\n      / \\     /\n     B   E   G\n     |   | /\n     |   F \n      \\ / \n       C\n       |\n       D\n```\n\n### 2. `runtime_only/`\n**Purpose**: Tests dependency filtering when only runtime dependencies are present.\n\n**Key Characteristics**:\n- All dependencies are runtime (`runtime_deps` attribute)\n- No compile-time dependencies (`deps` attribute)\n- Focuses on runtime JARs only\n\n**Test Scenarios**:\n- **No Filtering**: Verifies preservation of all runtime dependencies\n- **Basic Filtering**: Tests label-based exclusions for runtime deps\n- **Transitive Exclusions**: Tests transitive exclusion behavior for runtime deps\n- **Path-based Exclusions**: Tests path pattern filtering for runtime deps\n\n**Dependency Graph**: Same as compile_time_only, but all edges represent runtime dependencies.\n\n### 3. `compile_and_runtime_1/`\n**Purpose**: Tests mixed compile-time and runtime dependencies with a single direct dep.\n\n**Key Characteristics**:\n- Mixed compile-time and runtime dependencies\n- Single root dependency (`base_lib`)\n- Tests interface vs implementation JAR distinction\n\n**Test Scenarios**:\n- **No Filtering**: Verifies preservation of both compile and runtime JARs\n- **Basic Filtering**: Tests label-based exclusions preserving transitives\n- **Transitive Exclusions**: Tests label-based exclusions with transitives removal\n- **Path-based Exclusions**: Tests path pattern filtering\n\n**Dependency Graph for depsfilter**:\n```\n         base_lib      \n        /       \\  \n      A (c)    G (r)\n      /  \\        |\n     /    \\       |\n    /      \\      |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n     \\   /\n    C (c)\n     | \n    D (r)   \n```\n\n**Dependency Graph for dependencyset**:\n```\n         base_lib     \n            |\n      dependencyset() \n        /       \\  \n      A (c)    I (r)\n      /  \\        |\n     /    \\    G (r)\n    /      \\      |\n   B (c)  E (r)   /\n    |      |     /\n    |      |   /\n    |    F (c)\n     \\   /\n    C (c)\n     | \n    D (r)   \n```\n\n**Legend**: (c) = compile-time dependency, (r) = runtime dependency\n\n### 4. `compile_and_runtime_2/`\n**Purpose**: Tests complex mixed dependencies with multiple deps and runtime deps, and cross-branch connections.\n\n**Key Characteristics**:\n- More than one deps and runtime deps (A, I for compile; H, J for runtime)\n- Cross-branch dependencies\n- More complex dependency graph\n- Tests interface/implementation JAR handling\n\n**Test Scenarios**:\n- **Filtered Dependencies**: Basic label-based exclusions\n- **Transitive Exclusions**: Label-based exclusions with transitives removal\n- **Path-based Exclusions**: Path pattern filtering\n- **Interface/Implementation JARs**: Tests proper handling of -hjar vs full JARs\n- **Multiple Exclusions**: Combined label and path exclusions\n- **Empty Exclusions**: Behavior with no exclusions\n- **Multiple Paths**: Handling of multiple paths to same dependency\n\n**Dependency Graph for depsfilter**:\n```\n      J(r)      A (c)     H (r)   I (c)  \n        \\      /  \\       |       |\n         \\    /    \\    G (r)     |\n          \\  /     \\      |      /\n           B (c)  E (r)   /     /\n            |      |     /    /\n            |      |    /   /\n            |      |   /  /\n            |      |  / /\n            |     F (c)\n             \\   /\n            C (c)\n              | \n            D (r) \n```\n\n**Dependency Graph for dependencyset**:\n```\n                   test_lib\n                      |\n                 dependencyset\n                 /           \\\n          (\"deps\")      (\"runtime_deps\")  \n          /      \\          /      \\ \n        J(r)      A (c)     H (r)   I (c)  \n          \\      /  \\       |       |\n           \\    /    \\    G (r)     |\n            \\  /     \\      |      /\n             B (c)  E (r)   /     /\n              |      |     /    /\n              |      |    /   /\n              |      |   /  /\n              |      |  / /\n              |     F (c)\n               \\   /\n              C (c)\n                | \n              D (r) \n```\n\n## Test Verification\n\nEach test verifies the following JAR fields:\n\n- **`compile_jars`**: Interface JARs (e.g., `liblib_a-hjar.jar`)\n- **`full_compile_jars`**: Implementation JARs (e.g., `liblib_a.jar`)\n- **`transitive_compile_time_jars`**: Transitive interface JARs\n- **`transitive_runtime_jars`**: Transitive implementation JARs\n\n## Java Test Files\n\nEach test scenario includes corresponding Java test files that:\n- Verify the jars available at runtime\n- Use centralized test helper (`DepsFilterTestHelper`)\n\n## Key Testing Concepts\n\n### 1. Label-based Exclusions\n- Excludes dependencies by their Bazel label\n- Can optionally exclude transitive dependencies\n- More precise than path-based exclusions\n\n### 2. Path-based Exclusions\n- Excludes dependencies matching path patterns\n- Less precise but more flexible\n- Does not exclude transitives (exclude_transitives = true doesn't work)\n\n### 3. Transitive Exclusion Behavior\n- `exclude_transitives=False`: Only excludes direct dependencies, preserves transitives\n- `exclude_transitives=True`: Excludes both direct and transitive dependencies\n\n### 4. Interface vs Implementation JARs\n- Interface JARs (`-hjar`) contain only public APIs\n- Implementation JARs contain full class implementations\n- Both are verified in tests to ensure proper filtering\n\n### 5. Compile-time vs Runtime Dependencies\n- Compile-time dependencies are needed during compilation\n- Runtime dependencies are needed during execution\n- Tests verify proper handling of both types\n\n### 6. Rule vs Macro Testing\n- **deps_filter rule**: Tests direct rule usage with synthetic dependency graphs\n- **dependencyset macro**: Tests macro-level dependency management\n- Both approaches should produce equivalent results for the same filtering criteria\n\n## Test Coverage\n\nThe test suite covers:\n\n- Basic dependency filtering functionality\n- Label-based exclusion mechanisms\n- Path-based exclusion mechanisms\n- Transitive dependency handling\n- Interface vs implementation JAR distinction\n- Mixed compile-time and runtime dependencies\n- Multiple deps and runtime deps\n- Cross-branch dependency relationships\n- Empty exclusion list behavior\n- Multiple path handling to same dependency\n- Complex dependency graph scenarios\n\n## Running Tests\n\n```bash\n# Run all internal dependency tests\nbazel test //springboot/deps_filter_rules/tests/depsfilter/internal_dependencies/...\nbazel test //springboot/deps_filter_rules/tests/dependencyset/internal_dependencies/...\n```\n\nThis comprehensive test suite ensures the `deps_filter` rule and `dependencyset` macro work correctly across all expected use cases and edge cases. "
  },
  {
    "path": "springboot/deps_filter_rules/tests/test_utils/BUILD",
    "content": "package(default_visibility = [\"//visibility:public\"])\n\njava_library(\n    name = \"test_utils\",\n    srcs = glob([\"src/test/java/**/*.java\"]),\n    data = [\":dependency_graph.txt\"],\n    deps = [],\n)\n\n# Export the dependency graph file for tests\nexports_files([\"dependency_graph.txt\"]) "
  },
  {
    "path": "springboot/deps_filter_rules/tests/test_utils/dependency_graph.txt",
    "content": "digraph mygraph {\n  node [shape=box];\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\"\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\" -> \"//:license\"\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\"\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\" -> \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\"\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\"\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\"\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\"\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\" -> \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\"\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\"\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\"\n  \"//springboot/deps_filter_rules/tests/depsfilter/external_dependencies/compile_and_runtime:no_filtering\" -> \"@bazel_tools//tools/jdk:current_java_toolchain\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-actuator/3.3.11/spring-boot-starter-actuator-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\"\n  \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\" -> \"@unmanaged_deps_filter//:jakarta/servlet/jsp/jakarta.servlet.jsp-api/3.1.1/jakarta.servlet.jsp-api-3.1.1.jar\"\n  \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-oauth2-client/3.3.11/spring-boot-starter-oauth2-client-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"//:license\"\n  \"//:license\" -> \"//:LICENSE.txt\\n@rules_license//licenses/spdx:Apache-2.0\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client\" -> \"@unmanaged_deps_filter//:org/springframework/security/spring-security-oauth2-client/6.3.9/spring-security-oauth2-client-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client\" -> \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-oauth2-client/6.3.9/spring-security-oauth2-client-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-oauth2-client/6.3.9/spring-security-oauth2-client-6.3.9.jar\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client_6_3_9_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_client_6_3_9//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_client_6_3_9_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-oauth2-client/3.3.11/spring-boot-starter-oauth2-client-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-oauth2-client/3.3.11/spring-boot-starter-oauth2-client-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-data-jpa/3.3.11/spring-boot-starter-data-jpa-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\" -> \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_spring_aspects\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_oauth2_client_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:org/hibernate/orm/hibernate-core/6.5.3.Final/hibernate-core-6.5.3.Final.jar\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:com_fasterxml_classmate\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:io_smallrye_jandex\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:jakarta_inject_jakarta_inject_api\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:jakarta_persistence_jakarta_persistence_api\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:jakarta_transaction_jakarta_transaction_api\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:net_bytebuddy_byte_buddy\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:org_antlr_antlr4_runtime\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_runtime\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:org_hibernate_common_hibernate_commons_annotations\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@unmanaged_deps_filter//:org_jboss_logging_jboss_logging\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_jboss_logging_jboss_logging\"\n  \"@unmanaged_deps_filter//:org_jboss_logging_jboss_logging\" -> \"@unmanaged_deps_filter//:org/jboss/logging/jboss-logging/3.5.0.Final/jboss-logging-3.5.0.Final.jar\"\n  \"@unmanaged_deps_filter//:org_jboss_logging_jboss_logging\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_jboss_logging_jboss_logging\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_runtime\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_runtime\" -> \"@unmanaged_deps_filter//:org/glassfish/jaxb/jaxb-runtime/4.0.2/jaxb-runtime-4.0.2.jar\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_runtime\" -> \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_runtime\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_runtime\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core\" -> \"@unmanaged_deps_filter//:org/glassfish/jaxb/jaxb-core/4.0.2/jaxb-core-4.0.2.jar\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core\" -> \"@unmanaged_deps_filter//:com_sun_istack_istack_commons_runtime\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core\" -> \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core\" -> \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core\" -> \"@unmanaged_deps_filter//:org_eclipse_angus_angus_activation\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core\" -> \"@unmanaged_deps_filter//:org_glassfish_jaxb_txw2\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_eclipse_angus_angus_activation\"\n  \"@unmanaged_deps_filter//:org_eclipse_angus_angus_activation\" -> \"@unmanaged_deps_filter//:org/eclipse/angus/angus-activation/2.0.0/angus-activation-2.0.0.jar\"\n  \"@unmanaged_deps_filter//:org_eclipse_angus_angus_activation\" -> \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api\"\n  \"@unmanaged_deps_filter//:org_eclipse_angus_angus_activation\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_eclipse_angus_angus_activation\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/eclipse/angus/angus-activation/2.0.0/angus-activation-2.0.0.jar\"\n  \"@unmanaged_deps_filter//:org/eclipse/angus/angus-activation/2.0.0/angus-activation-2.0.0.jar\" -> \"@unmanaged_deps_filter//:org_eclipse_angus_angus_activation_2_0_0_extension\"\n  \"@unmanaged_deps_filter//:org_eclipse_angus_angus_activation_2_0_0_extension\"\n  \"@unmanaged_deps_filter//:org_eclipse_angus_angus_activation_2_0_0_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_eclipse_angus_angus_activation_2_0_0_extension\" -> \"@@rules_jvm_external~~maven~org_eclipse_angus_angus_activation_2_0_0//file:file\"\n  \"@unmanaged_deps_filter//:org/glassfish/jaxb/jaxb-core/4.0.2/jaxb-core-4.0.2.jar\"\n  \"@unmanaged_deps_filter//:org/glassfish/jaxb/jaxb-core/4.0.2/jaxb-core-4.0.2.jar\" -> \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core_4_0_2_extension\"\n  \"@unmanaged_deps_filter//:org/glassfish/jaxb/jaxb-runtime/4.0.2/jaxb-runtime-4.0.2.jar\"\n  \"@unmanaged_deps_filter//:org/glassfish/jaxb/jaxb-runtime/4.0.2/jaxb-runtime-4.0.2.jar\" -> \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_runtime_4_0_2_extension\"\n  \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api\"\n  \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api\" -> \"@unmanaged_deps_filter//:jakarta/xml/bind/jakarta.xml.bind-api/4.0.0/jakarta.xml.bind-api-4.0.0.jar\"\n  \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api\" -> \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api\"\n  \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:jakarta_transaction_jakarta_transaction_api\"\n  \"@unmanaged_deps_filter//:jakarta_transaction_jakarta_transaction_api\" -> \"@unmanaged_deps_filter//:jakarta/transaction/jakarta.transaction-api/2.0.1/jakarta.transaction-api-2.0.1.jar\"\n  \"@unmanaged_deps_filter//:jakarta_transaction_jakarta_transaction_api\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:jakarta_transaction_jakarta_transaction_api\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:jakarta_inject_jakarta_inject_api\"\n  \"@unmanaged_deps_filter//:jakarta_inject_jakarta_inject_api\" -> \"@unmanaged_deps_filter//:jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar\"\n  \"@unmanaged_deps_filter//:jakarta_inject_jakarta_inject_api\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:jakarta_inject_jakarta_inject_api\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_fasterxml_classmate\"\n  \"@unmanaged_deps_filter//:com_fasterxml_classmate\" -> \"@unmanaged_deps_filter//:com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_classmate\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_fasterxml_classmate\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/jboss/logging/jboss-logging/3.5.0.Final/jboss-logging-3.5.0.Final.jar\"\n  \"@unmanaged_deps_filter//:org/jboss/logging/jboss-logging/3.5.0.Final/jboss-logging-3.5.0.Final.jar\" -> \"@unmanaged_deps_filter//:org_jboss_logging_jboss_logging_3_5_0_Final_extension\"\n  \"@unmanaged_deps_filter//:org_jboss_logging_jboss_logging_3_5_0_Final_extension\"\n  \"@unmanaged_deps_filter//:org_jboss_logging_jboss_logging_3_5_0_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_jboss_logging_jboss_logging_3_5_0_Final_extension\" -> \"@@rules_jvm_external~~maven~org_jboss_logging_jboss_logging_3_5_0_Final//file:file\"\n  \"@@rules_jvm_external~~maven~org_jboss_logging_jboss_logging_3_5_0_Final//file:file\"\n  \"@@rules_jvm_external~~maven~org_jboss_logging_jboss_logging_3_5_0_Final//file:file\" -> \"@@rules_jvm_external~~maven~org_jboss_logging_jboss_logging_3_5_0_Final//file:v1/org/jboss/logging/jboss-logging/3.5.0.Final/jboss-logging-3.5.0.Final.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@unmanaged_deps_filter//:org/springframework/data/spring-data-jpa/3.3.11/spring-data-jpa-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@unmanaged_deps_filter//:jakarta_annotation_jakarta_annotation_api\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@unmanaged_deps_filter//:org_antlr_antlr4_runtime\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_spring_aop\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_spring_context\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_spring_orm\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@unmanaged_deps_filter//:org_springframework_spring_tx\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/springframework/data/spring-data-jpa/3.3.11/spring-data-jpa-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/data/spring-data-jpa/3.3.11/spring-data-jpa-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa_3_3_11_extension\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_client_6_3_9//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_client_6_3_9//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_client_6_3_9//file:v1/org/springframework/security/spring-security-oauth2-client/6.3.9/spring-security-oauth2-client-6.3.9.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_client_6_3_9//file:v1/org/springframework/security/spring-security-oauth2-client/6.3.9/spring-security-oauth2-client-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org_hibernate_common_hibernate_commons_annotations\"\n  \"@unmanaged_deps_filter//:org_hibernate_common_hibernate_commons_annotations\" -> \"@unmanaged_deps_filter//:org/hibernate/common/hibernate-commons-annotations/6.0.6.Final/hibernate-commons-annotations-6.0.6.Final.jar\"\n  \"@unmanaged_deps_filter//:org_hibernate_common_hibernate_commons_annotations\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_hibernate_common_hibernate_commons_annotations\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-security/3.3.11/spring-boot-starter-security-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\" -> \"@unmanaged_deps_filter//:org_springframework_spring_aop\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\" -> \"@unmanaged_deps_filter//:org/springframework/security/spring-security-web/6.3.9/spring-security-web-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\" -> \"@unmanaged_deps_filter//:org_springframework_spring_aop\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\" -> \"@unmanaged_deps_filter//:org_springframework_spring_context\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\" -> \"@unmanaged_deps_filter//:org_springframework_spring_expression\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\" -> \"@unmanaged_deps_filter//:org_springframework_spring_web\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\" -> \"@unmanaged_deps_filter//:org/springframework/security/spring-security-config/6.3.9/spring-security-config-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\" -> \"@unmanaged_deps_filter//:org_springframework_spring_aop\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\" -> \"@unmanaged_deps_filter//:org_springframework_spring_context\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-config/6.3.9/spring-security-config-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-config/6.3.9/spring-security-config-6.3.9.jar\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config_6_3_9_extension\"\n  \"@@rules_jvm_external~~maven~org_eclipse_angus_angus_activation_2_0_0//file:file\"\n  \"@@rules_jvm_external~~maven~org_eclipse_angus_angus_activation_2_0_0//file:file\" -> \"@@rules_jvm_external~~maven~org_eclipse_angus_angus_activation_2_0_0//file:v1/org/eclipse/angus/angus-activation/2.0.0/angus-activation-2.0.0.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose\" -> \"@unmanaged_deps_filter//:org/springframework/security/spring-security-oauth2-jose/6.3.9/spring-security-oauth2-jose-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose\" -> \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core\" -> \"@unmanaged_deps_filter//:org/springframework/security/spring-security-oauth2-core/6.3.9/spring-security-oauth2-core-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core\" -> \"@unmanaged_deps_filter//:org_springframework_spring_web\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-oauth2-core/6.3.9/spring-security-oauth2-core-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-oauth2-core/6.3.9/spring-security-oauth2-core-6.3.9.jar\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core_6_3_9_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_core_6_3_9_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_core_6_3_9//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_core_6_3_9//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_core_6_3_9//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_core_6_3_9//file:v1/org/springframework/security/spring-security-oauth2-core/6.3.9/spring-security-oauth2-core-6.3.9.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_core_6_3_9//file:v1/org/springframework/security/spring-security-oauth2-core/6.3.9/spring-security-oauth2-core-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config_6_3_9_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_config_6_3_9//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_config_6_3_9_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_config_6_3_9//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_config_6_3_9//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_config_6_3_9//file:v1/org/springframework/security/spring-security-config/6.3.9/spring-security-config-6.3.9.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_config_6_3_9//file:v1/org/springframework/security/spring-security-config/6.3.9/spring-security-config-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9\" -> \"@unmanaged_deps_filter//:io/micrometer/micrometer-jakarta9/1.13.13/micrometer-jakarta9-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_core\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io/micrometer/micrometer-jakarta9/1.13.13/micrometer-jakarta9-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:io/micrometer/micrometer-jakarta9/1.13.13/micrometer-jakarta9-1.13.13.jar\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9_1_13_13_extension\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9_1_13_13_extension\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9_1_13_13_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_jakarta9_1_13_13_extension\" -> \"@@rules_jvm_external~~maven~io_micrometer_micrometer_jakarta9_1_13_13//file:file\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk\" -> \"@unmanaged_deps_filter//:com/nimbusds/oauth2-oidc-sdk/9.43.6/oauth2-oidc-sdk-9.43.6.jar\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk\" -> \"@unmanaged_deps_filter//:com_github_stephenc_jcip_jcip_annotations\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk\" -> \"@unmanaged_deps_filter//:com_nimbusds_content_type\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk\" -> \"@unmanaged_deps_filter//:com_nimbusds_lang_tag\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk\" -> \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk\" -> \"@unmanaged_deps_filter//:net_minidev_json_smart\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:net_minidev_json_smart\"\n  \"@unmanaged_deps_filter//:net_minidev_json_smart\" -> \"@unmanaged_deps_filter//:net/minidev/json-smart/2.5.2/json-smart-2.5.2.jar\"\n  \"@unmanaged_deps_filter//:net_minidev_json_smart\" -> \"@unmanaged_deps_filter//:net_minidev_accessors_smart\"\n  \"@unmanaged_deps_filter//:net_minidev_json_smart\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:net_minidev_json_smart\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:net_minidev_accessors_smart\"\n  \"@unmanaged_deps_filter//:net_minidev_accessors_smart\" -> \"@unmanaged_deps_filter//:net/minidev/accessors-smart/2.5.2/accessors-smart-2.5.2.jar\"\n  \"@unmanaged_deps_filter//:net_minidev_accessors_smart\" -> \"@unmanaged_deps_filter//:org_ow2_asm_asm\"\n  \"@unmanaged_deps_filter//:net_minidev_accessors_smart\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:net_minidev_accessors_smart\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:net/minidev/accessors-smart/2.5.2/accessors-smart-2.5.2.jar\"\n  \"@unmanaged_deps_filter//:net/minidev/accessors-smart/2.5.2/accessors-smart-2.5.2.jar\" -> \"@unmanaged_deps_filter//:net_minidev_accessors_smart_2_5_2_extension\"\n  \"@unmanaged_deps_filter//:net_minidev_accessors_smart_2_5_2_extension\"\n  \"@unmanaged_deps_filter//:net_minidev_accessors_smart_2_5_2_extension\" -> \"@@rules_jvm_external~~maven~net_minidev_accessors_smart_2_5_2//file:file\"\n  \"@unmanaged_deps_filter//:net_minidev_accessors_smart_2_5_2_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~net_minidev_accessors_smart_2_5_2//file:file\"\n  \"@@rules_jvm_external~~maven~net_minidev_accessors_smart_2_5_2//file:file\" -> \"@@rules_jvm_external~~maven~net_minidev_accessors_smart_2_5_2//file:v1/net/minidev/accessors-smart/2.5.2/accessors-smart-2.5.2.jar\"\n  \"@unmanaged_deps_filter//:net/minidev/json-smart/2.5.2/json-smart-2.5.2.jar\"\n  \"@unmanaged_deps_filter//:net/minidev/json-smart/2.5.2/json-smart-2.5.2.jar\" -> \"@unmanaged_deps_filter//:net_minidev_json_smart_2_5_2_extension\"\n  \"@unmanaged_deps_filter//:com_nimbusds_lang_tag\"\n  \"@unmanaged_deps_filter//:com_nimbusds_lang_tag\" -> \"@unmanaged_deps_filter//:com/nimbusds/lang-tag/1.7/lang-tag-1.7.jar\"\n  \"@unmanaged_deps_filter//:com_nimbusds_lang_tag\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_nimbusds_lang_tag\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com/nimbusds/lang-tag/1.7/lang-tag-1.7.jar\"\n  \"@unmanaged_deps_filter//:com/nimbusds/lang-tag/1.7/lang-tag-1.7.jar\" -> \"@unmanaged_deps_filter//:com_nimbusds_lang_tag_1_7_extension\"\n  \"@unmanaged_deps_filter//:com/nimbusds/oauth2-oidc-sdk/9.43.6/oauth2-oidc-sdk-9.43.6.jar\"\n  \"@unmanaged_deps_filter//:com/nimbusds/oauth2-oidc-sdk/9.43.6/oauth2-oidc-sdk-9.43.6.jar\" -> \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk_9_43_6_extension\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk_9_43_6_extension\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk_9_43_6_extension\" -> \"@@rules_jvm_external~~maven~com_nimbusds_oauth2_oidc_sdk_9_43_6//file:file\"\n  \"@unmanaged_deps_filter//:com_nimbusds_oauth2_oidc_sdk_9_43_6_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api\"\n  \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api\" -> \"@unmanaged_deps_filter//:jakarta/activation/jakarta.activation-api/2.1.1/jakarta.activation-api-2.1.1.jar\"\n  \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:jakarta/activation/jakarta.activation-api/2.1.1/jakarta.activation-api-2.1.1.jar\"\n  \"@unmanaged_deps_filter//:jakarta/activation/jakarta.activation-api/2.1.1/jakarta.activation-api-2.1.1.jar\" -> \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api_2_1_1_extension\"\n  \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api_2_1_1_extension\"\n  \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api_2_1_1_extension\" -> \"@@rules_jvm_external~~maven~jakarta_activation_jakarta_activation_api_2_1_1//file:file\"\n  \"@unmanaged_deps_filter//:jakarta_activation_jakarta_activation_api_2_1_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~jakarta_activation_jakarta_activation_api_2_1_1//file:file\"\n  \"@@rules_jvm_external~~maven~jakarta_activation_jakarta_activation_api_2_1_1//file:file\" -> \"@@rules_jvm_external~~maven~jakarta_activation_jakarta_activation_api_2_1_1//file:v1/jakarta/activation/jakarta.activation-api/2.1.1/jakarta.activation-api-2.1.1.jar\"\n  \"@@rules_jvm_external~~maven~jakarta_activation_jakarta_activation_api_2_1_1//file:v1/jakarta/activation/jakarta.activation-api/2.1.1/jakarta.activation-api-2.1.1.jar\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core_4_0_2_extension\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core_4_0_2_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_core_4_0_2_extension\" -> \"@@rules_jvm_external~~maven~org_glassfish_jaxb_jaxb_core_4_0_2//file:file\"\n  \"@@rules_jvm_external~~maven~org_glassfish_jaxb_jaxb_core_4_0_2//file:file\"\n  \"@@rules_jvm_external~~maven~org_glassfish_jaxb_jaxb_core_4_0_2//file:file\" -> \"@@rules_jvm_external~~maven~org_glassfish_jaxb_jaxb_core_4_0_2//file:v1/org/glassfish/jaxb/jaxb-core/4.0.2/jaxb-core-4.0.2.jar\"\n  \"@@rules_jvm_external~~maven~org_glassfish_jaxb_jaxb_core_4_0_2//file:v1/org/glassfish/jaxb/jaxb-core/4.0.2/jaxb-core-4.0.2.jar\"\n  \"@unmanaged_deps_filter//:net_minidev_json_smart_2_5_2_extension\"\n  \"@unmanaged_deps_filter//:net_minidev_json_smart_2_5_2_extension\" -> \"@@rules_jvm_external~~maven~net_minidev_json_smart_2_5_2//file:file\"\n  \"@unmanaged_deps_filter//:net_minidev_json_smart_2_5_2_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~net_minidev_json_smart_2_5_2//file:file\"\n  \"@@rules_jvm_external~~maven~net_minidev_json_smart_2_5_2//file:file\" -> \"@@rules_jvm_external~~maven~net_minidev_json_smart_2_5_2//file:v1/net/minidev/json-smart/2.5.2/json-smart-2.5.2.jar\"\n  \"@@rules_jvm_external~~maven~net_minidev_json_smart_2_5_2//file:v1/net/minidev/json-smart/2.5.2/json-smart-2.5.2.jar\"\n  \"@unmanaged_deps_filter//:org_antlr_antlr4_runtime\"\n  \"@unmanaged_deps_filter//:org_antlr_antlr4_runtime\" -> \"@unmanaged_deps_filter//:org/antlr/antlr4-runtime/4.13.0/antlr4-runtime-4.13.0.jar\"\n  \"@unmanaged_deps_filter//:org_antlr_antlr4_runtime\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_antlr_antlr4_runtime\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/antlr/antlr4-runtime/4.13.0/antlr4-runtime-4.13.0.jar\"\n  \"@unmanaged_deps_filter//:org/antlr/antlr4-runtime/4.13.0/antlr4-runtime-4.13.0.jar\" -> \"@unmanaged_deps_filter//:org_antlr_antlr4_runtime_4_13_0_extension\"\n  \"@unmanaged_deps_filter//:org_antlr_antlr4_runtime_4_13_0_extension\"\n  \"@unmanaged_deps_filter//:org_antlr_antlr4_runtime_4_13_0_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_antlr_antlr4_runtime_4_13_0_extension\" -> \"@@rules_jvm_external~~maven~org_antlr_antlr4_runtime_4_13_0//file:file\"\n  \"@@rules_jvm_external~~maven~org_antlr_antlr4_runtime_4_13_0//file:file\"\n  \"@@rules_jvm_external~~maven~org_antlr_antlr4_runtime_4_13_0//file:file\" -> \"@@rules_jvm_external~~maven~org_antlr_antlr4_runtime_4_13_0//file:v1/org/antlr/antlr4-runtime/4.13.0/antlr4-runtime-4.13.0.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-security/3.3.11/spring-boot-starter-security-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-security/3.3.11/spring-boot-starter-security-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_security_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_security_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_security_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_security_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-security/3.3.11/spring-boot-starter-security-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:jakarta/xml/bind/jakarta.xml.bind-api/4.0.0/jakarta.xml.bind-api-4.0.0.jar\"\n  \"@unmanaged_deps_filter//:jakarta/xml/bind/jakarta.xml.bind-api/4.0.0/jakarta.xml.bind-api-4.0.0.jar\" -> \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api_4_0_0_extension\"\n  \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api_4_0_0_extension\"\n  \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api_4_0_0_extension\" -> \"@@rules_jvm_external~~maven~jakarta_xml_bind_jakarta_xml_bind_api_4_0_0//file:file\"\n  \"@unmanaged_deps_filter//:jakarta_xml_bind_jakarta_xml_bind_api_4_0_0_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_eclipse_angus_angus_activation_2_0_0//file:v1/org/eclipse/angus/angus-activation/2.0.0/angus-activation-2.0.0.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aspects\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aspects\" -> \"@unmanaged_deps_filter//:org/springframework/spring-aspects/6.1.19/spring-aspects-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aspects\" -> \"@unmanaged_deps_filter//:org_aspectj_aspectjweaver\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aspects\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aspects\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-aspects/6.1.19/spring-aspects-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-aspects/6.1.19/spring-aspects-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_aspects_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aspects_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aspects_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aspects_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_aspects_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_aspects_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_aspects_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_aspects_6_1_19//file:v1/org/springframework/spring-aspects/6.1.19/spring-aspects-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_aspects_6_1_19//file:v1/org/springframework/spring-aspects/6.1.19/spring-aspects-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-jdbc/3.3.11/spring-boot-starter-jdbc-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc\" -> \"@unmanaged_deps_filter//:com_zaxxer_HikariCP\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc\" -> \"@unmanaged_deps_filter//:org_springframework_spring_jdbc\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_zaxxer_HikariCP\"\n  \"@unmanaged_deps_filter//:com_zaxxer_HikariCP\" -> \"@unmanaged_deps_filter//:com/zaxxer/HikariCP/5.1.0/HikariCP-5.1.0.jar\"\n  \"@unmanaged_deps_filter//:com_zaxxer_HikariCP\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_zaxxer_HikariCP\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com/zaxxer/HikariCP/5.1.0/HikariCP-5.1.0.jar\"\n  \"@unmanaged_deps_filter//:com/zaxxer/HikariCP/5.1.0/HikariCP-5.1.0.jar\" -> \"@unmanaged_deps_filter//:com_zaxxer_HikariCP_5_1_0_extension\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_oauth2_oidc_sdk_9_43_6//file:file\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_oauth2_oidc_sdk_9_43_6//file:file\" -> \"@@rules_jvm_external~~maven~com_nimbusds_oauth2_oidc_sdk_9_43_6//file:v1/com/nimbusds/oauth2-oidc-sdk/9.43.6/oauth2-oidc-sdk-9.43.6.jar\"\n  \"@@rules_jvm_external~~maven~org_jboss_logging_jboss_logging_3_5_0_Final//file:v1/org/jboss/logging/jboss-logging/3.5.0.Final/jboss-logging-3.5.0.Final.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_data_spring_data_jpa_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_jpa_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_data_spring_data_jpa_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_data_spring_data_jpa_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_data_spring_data_jpa_3_3_11//file:v1/org/springframework/data/spring-data-jpa/3.3.11/spring-data-jpa-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-actuator-autoconfigure/3.3.11/spring-boot-actuator-autoconfigure-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-actuator/3.3.11/spring-boot-actuator-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-actuator/3.3.11/spring-boot-actuator-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-actuator/3.3.11/spring-boot-actuator-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-webflux/3.3.11/spring-boot-starter-webflux-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_reactor_netty\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\" -> \"@unmanaged_deps_filter//:org_springframework_spring_web\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\" -> \"@unmanaged_deps_filter//:org_springframework_spring_webflux\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux\" -> \"@unmanaged_deps_filter//:org/springframework/spring-webflux/6.1.19/spring-webflux-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux\" -> \"@unmanaged_deps_filter//:io_projectreactor_reactor_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux\" -> \"@unmanaged_deps_filter//:org_springframework_spring_web\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-webflux/6.1.19/spring-webflux-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-webflux/6.1.19/spring-webflux-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_webflux_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_webflux_6_1_19//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_webflux_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_webflux_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_webflux_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_webflux_6_1_19//file:v1/org/springframework/spring-webflux/6.1.19/spring-webflux-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_webflux_6_1_19//file:v1/org/springframework/spring-webflux/6.1.19/spring-webflux-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_reactor_netty\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_reactor_netty\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-reactor-netty/3.3.11/spring-boot-starter-reactor-netty-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_reactor_netty\" -> \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_reactor_netty\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_reactor_netty\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\" -> \"@unmanaged_deps_filter//:io/projectreactor/netty/reactor-netty-http/1.1.29/reactor-netty-http-1.1.29.jar\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_http\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_osx_x86_64\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\" -> \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\" -> \"@unmanaged_deps_filter//:io_projectreactor_reactor_core\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\" -> \"@unmanaged_deps_filter//:io/netty/netty-codec-http2/4.1.119.Final/netty-codec-http2-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_http\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\" -> \"@unmanaged_deps_filter//:io_netty_netty_handler\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io/projectreactor/netty/reactor-netty-http/1.1.29/reactor-netty-http-1.1.29.jar\"\n  \"@unmanaged_deps_filter//:io/projectreactor/netty/reactor-netty-http/1.1.29/reactor-netty-http-1.1.29.jar\" -> \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http_1_1_29_extension\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http_1_1_29_extension\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http_1_1_29_extension\" -> \"@@rules_jvm_external~~maven~io_projectreactor_netty_reactor_netty_http_1_1_29//file:file\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_http_1_1_29_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_projectreactor_netty_reactor_netty_http_1_1_29//file:file\"\n  \"@@rules_jvm_external~~maven~io_projectreactor_netty_reactor_netty_http_1_1_29//file:file\" -> \"@@rules_jvm_external~~maven~io_projectreactor_netty_reactor_netty_http_1_1_29//file:v1/io/projectreactor/netty/reactor-netty-http/1.1.29/reactor-netty-http-1.1.29.jar\"\n  \"@@rules_jvm_external~~maven~io_projectreactor_netty_reactor_netty_http_1_1_29//file:v1/io/projectreactor/netty/reactor-netty-http/1.1.29/reactor-netty-http-1.1.29.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-reactor-netty/3.3.11/spring-boot-starter-reactor-netty-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-reactor-netty/3.3.11/spring-boot-starter-reactor-netty-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_reactor_netty_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_reactor_netty_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_reactor_netty_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_reactor_netty_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_reactor_netty_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_reactor_netty_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_reactor_netty_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_reactor_netty_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-reactor-netty/3.3.11/spring-boot-starter-reactor-netty-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_reactor_netty_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-reactor-netty/3.3.11/spring-boot-starter-reactor-netty-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-json/3.3.11/spring-boot-starter-json-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\" -> \"@unmanaged_deps_filter//:org_springframework_spring_web\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_web\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_web\" -> \"@unmanaged_deps_filter//:org/springframework/spring-web/6.1.19/spring-web-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_web\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_web\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_web\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_web\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_web\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-web/6.1.19/spring-web-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-web/6.1.19/spring-web-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_web_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_web_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_web_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_web_6_1_19//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_web_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_web_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_web_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_web_6_1_19//file:v1/org/springframework/spring-web/6.1.19/spring-web-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_web_6_1_19//file:v1/org/springframework/spring-web/6.1.19/spring-web-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names\" -> \"@unmanaged_deps_filter//:com/fasterxml/jackson/module/jackson-module-parameter-names/2.17.3/jackson-module-parameter-names-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/module/jackson-module-parameter-names/2.17.3/jackson-module-parameter-names-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/module/jackson-module-parameter-names/2.17.3/jackson-module-parameter-names-2.17.3.jar\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310\" -> \"@unmanaged_deps_filter//:com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.17.3/jackson-datatype-jsr310-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_annotations\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.17.3/jackson-datatype-jsr310-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.17.3/jackson-datatype-jsr310-2.17.3.jar\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8\" -> \"@unmanaged_deps_filter//:com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.17.3/jackson-datatype-jdk8-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.17.3/jackson-datatype-jdk8-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.17.3/jackson-datatype-jdk8-2.17.3.jar\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\" -> \"@unmanaged_deps_filter//:com/fasterxml/jackson/core/jackson-databind/2.17.3/jackson-databind-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_annotations\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core\" -> \"@unmanaged_deps_filter//:com/fasterxml/jackson/core/jackson-core/2.17.3/jackson-core-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/core/jackson-core/2.17.3/jackson-core-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/core/jackson-core/2.17.3/jackson-core-2.17.3.jar\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core_2_17_3_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_core_2_17_3_extension\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_core_2_17_3//file:file\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_core_2_17_3//file:file\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_core_2_17_3//file:file\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_core_2_17_3//file:v1/com/fasterxml/jackson/core/jackson-core/2.17.3/jackson-core-2.17.3.jar\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_core_2_17_3//file:v1/com/fasterxml/jackson/core/jackson-core/2.17.3/jackson-core-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_annotations\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_annotations\" -> \"@unmanaged_deps_filter//:com/fasterxml/jackson/core/jackson-annotations/2.17.3/jackson-annotations-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_annotations\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_annotations\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/core/jackson-annotations/2.17.3/jackson-annotations-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/core/jackson-annotations/2.17.3/jackson-annotations-2.17.3.jar\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_annotations_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-json/3.3.11/spring-boot-starter-json-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-json/3.3.11/spring-boot-starter-json-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_json_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_json_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_json_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_json_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_json_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-json/3.3.11/spring-boot-starter-json-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_json_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-json/3.3.11/spring-boot-starter-json-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-webflux/3.3.11/spring-boot-starter-webflux-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-webflux/3.3.11/spring-boot-starter-webflux-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_webflux_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-aop/3.3.11/spring-boot-starter-aop-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop\" -> \"@unmanaged_deps_filter//:org_aspectj_aspectjweaver\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop\" -> \"@unmanaged_deps_filter//:org_springframework_spring_aop\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_aspectj_aspectjweaver\"\n  \"@unmanaged_deps_filter//:org_aspectj_aspectjweaver\" -> \"@unmanaged_deps_filter//:org/aspectj/aspectjweaver/1.9.24/aspectjweaver-1.9.24.jar\"\n  \"@unmanaged_deps_filter//:org_aspectj_aspectjweaver\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_aspectj_aspectjweaver\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-aop/3.3.11/spring-boot-starter-aop-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-aop/3.3.11/spring-boot-starter-aop-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_aop_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_aop_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_aop_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_aop_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_aop_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-aop/3.3.11/spring-boot-starter-aop-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_aop_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-aop/3.3.11/spring-boot-starter-aop-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_17_3_extension\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_17_3//file:file\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_17_3_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-actuator/3.3.11/spring-boot-starter-actuator-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-actuator/3.3.11/spring-boot-starter-actuator-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator_3_3_11_extension\"\n  \"@@rules_jvm_external~~maven~jakarta_xml_bind_jakarta_xml_bind_api_4_0_0//file:file\"\n  \"@@rules_jvm_external~~maven~jakarta_xml_bind_jakarta_xml_bind_api_4_0_0//file:file\" -> \"@@rules_jvm_external~~maven~jakarta_xml_bind_jakarta_xml_bind_api_4_0_0//file:v1/jakarta/xml/bind/jakarta.xml.bind-api/4.0.0/jakarta.xml.bind-api-4.0.0.jar\"\n  \"@@rules_jvm_external~~maven~jakarta_xml_bind_jakarta_xml_bind_api_4_0_0//file:v1/jakarta/xml/bind/jakarta.xml.bind-api/4.0.0/jakarta.xml.bind-api-4.0.0.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_actuator_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_actuator_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_actuator_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_actuator_3_3_11//file:v1/org/springframework/boot/spring-boot-actuator/3.3.11/spring-boot-actuator-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_actuator_3_3_11//file:v1/org/springframework/boot/spring-boot-actuator/3.3.11/spring-boot-actuator-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-oauth2-jose/6.3.9/spring-security-oauth2-jose-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-oauth2-jose/6.3.9/spring-security-oauth2-jose-6.3.9.jar\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose_6_3_9_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_oauth2_jose_6_3_9_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_jose_6_3_9//file:file\"\n  \"@@rules_jvm_external~~maven~org_antlr_antlr4_runtime_4_13_0//file:v1/org/antlr/antlr4-runtime/4.13.0/antlr4-runtime-4.13.0.jar\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_txw2\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_txw2\" -> \"@unmanaged_deps_filter//:org/glassfish/jaxb/txw2/4.0.2/txw2-4.0.2.jar\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_txw2\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_txw2\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/glassfish/jaxb/txw2/4.0.2/txw2-4.0.2.jar\"\n  \"@unmanaged_deps_filter//:org/glassfish/jaxb/txw2/4.0.2/txw2-4.0.2.jar\" -> \"@unmanaged_deps_filter//:org_glassfish_jaxb_txw2_4_0_2_extension\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_txw2_4_0_2_extension\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_txw2_4_0_2_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_txw2_4_0_2_extension\" -> \"@@rules_jvm_external~~maven~org_glassfish_jaxb_txw2_4_0_2//file:file\"\n  \"@@rules_jvm_external~~maven~org_glassfish_jaxb_txw2_4_0_2//file:file\"\n  \"@@rules_jvm_external~~maven~org_glassfish_jaxb_txw2_4_0_2//file:file\" -> \"@@rules_jvm_external~~maven~org_glassfish_jaxb_txw2_4_0_2//file:v1/org/glassfish/jaxb/txw2/4.0.2/txw2-4.0.2.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_17_3_extension\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_17_3//file:file\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_17_3_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_17_3//file:file\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_17_3//file:file\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_17_3//file:v1/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.17.3/jackson-datatype-jdk8-2.17.3.jar\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_17_3//file:v1/com/fasterxml/jackson/datatype/jackson-datatype-jdk8/2.17.3/jackson-datatype-jdk8-2.17.3.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_security_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-security/3.3.11/spring-boot-starter-security-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-web/6.3.9/spring-security-web-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-web/6.3.9/spring-security-web-6.3.9.jar\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web_6_3_9_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_web_6_3_9_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_web_6_3_9//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_web_6_3_9//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_web_6_3_9//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_web_6_3_9//file:v1/org/springframework/security/spring-security-web/6.3.9/spring-security-web-6.3.9.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_web_6_3_9//file:v1/org/springframework/security/spring-security-web/6.3.9/spring-security-web-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt\"\n  \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt\" -> \"@unmanaged_deps_filter//:com/nimbusds/nimbus-jose-jwt/9.37.3/nimbus-jose-jwt-9.37.3.jar\"\n  \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt\" -> \"@unmanaged_deps_filter//:com_github_stephenc_jcip_jcip_annotations\"\n  \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com_github_stephenc_jcip_jcip_annotations\"\n  \"@unmanaged_deps_filter//:com_github_stephenc_jcip_jcip_annotations\" -> \"@unmanaged_deps_filter//:com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar\"\n  \"@unmanaged_deps_filter//:com_github_stephenc_jcip_jcip_annotations\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_github_stephenc_jcip_jcip_annotations\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar\"\n  \"@unmanaged_deps_filter//:com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar\" -> \"@unmanaged_deps_filter//:com_github_stephenc_jcip_jcip_annotations_1_0_1_extension\"\n  \"@unmanaged_deps_filter//:com/nimbusds/nimbus-jose-jwt/9.37.3/nimbus-jose-jwt-9.37.3.jar\"\n  \"@unmanaged_deps_filter//:com/nimbusds/nimbus-jose-jwt/9.37.3/nimbus-jose-jwt-9.37.3.jar\" -> \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt_9_37_3_extension\"\n  \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt_9_37_3_extension\"\n  \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt_9_37_3_extension\" -> \"@@rules_jvm_external~~maven~com_nimbusds_nimbus_jose_jwt_9_37_3//file:file\"\n  \"@unmanaged_deps_filter//:com_nimbusds_nimbus_jose_jwt_9_37_3_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_ow2_asm_asm\"\n  \"@unmanaged_deps_filter//:org_ow2_asm_asm\" -> \"@unmanaged_deps_filter//:org/ow2/asm/asm/9.7.1/asm-9.7.1.jar\"\n  \"@unmanaged_deps_filter//:org_ow2_asm_asm\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_ow2_asm_asm\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_nimbus_jose_jwt_9_37_3//file:file\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_nimbus_jose_jwt_9_37_3//file:file\" -> \"@@rules_jvm_external~~maven~com_nimbusds_nimbus_jose_jwt_9_37_3//file:v1/com/nimbusds/nimbus-jose-jwt/9.37.3/nimbus-jose-jwt-9.37.3.jar\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_nimbus_jose_jwt_9_37_3//file:v1/com/nimbusds/nimbus-jose-jwt/9.37.3/nimbus-jose-jwt-9.37.3.jar\"\n  \"@unmanaged_deps_filter//:jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar\"\n  \"@unmanaged_deps_filter//:jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar\" -> \"@unmanaged_deps_filter//:jakarta_inject_jakarta_inject_api_2_0_1_extension\"\n  \"@unmanaged_deps_filter//:jakarta_inject_jakarta_inject_api_2_0_1_extension\"\n  \"@unmanaged_deps_filter//:jakarta_inject_jakarta_inject_api_2_0_1_extension\" -> \"@@rules_jvm_external~~maven~jakarta_inject_jakarta_inject_api_2_0_1//file:file\"\n  \"@unmanaged_deps_filter//:jakarta_inject_jakarta_inject_api_2_0_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons\" -> \"@unmanaged_deps_filter//:org/springframework/data/spring-data-commons/3.3.11/spring-data-commons-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/springframework/data/spring-data-commons/3.3.11/spring-data-commons-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/data/spring-data-commons/3.3.11/spring-data-commons-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_data_spring_data_commons_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_data_spring_data_commons_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_data_spring_data_commons_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_data_spring_data_commons_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_data_spring_data_commons_3_3_11//file:v1/org/springframework/data/spring-data-commons/3.3.11/spring-data-commons-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_data_spring_data_commons_3_3_11//file:v1/org/springframework/data/spring-data-commons/3.3.11/spring-data-commons-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~net_minidev_accessors_smart_2_5_2//file:v1/net/minidev/accessors-smart/2.5.2/accessors-smart-2.5.2.jar\"\n  \"@@rules_jvm_external~~maven~org_glassfish_jaxb_txw2_4_0_2//file:v1/org/glassfish/jaxb/txw2/4.0.2/txw2-4.0.2.jar\"\n  \"@unmanaged_deps_filter//:org/hibernate/orm/hibernate-core/6.5.3.Final/hibernate-core-6.5.3.Final.jar\"\n  \"@unmanaged_deps_filter//:org/hibernate/orm/hibernate-core/6.5.3.Final/hibernate-core-6.5.3.Final.jar\" -> \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core_6_5_3_Final_extension\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core_6_5_3_Final_extension\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core_6_5_3_Final_extension\" -> \"@@rules_jvm_external~~maven~org_hibernate_orm_hibernate_core_6_5_3_Final//file:file\"\n  \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core_6_5_3_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_hibernate_orm_hibernate_core_6_5_3_Final//file:file\"\n  \"@@rules_jvm_external~~maven~org_hibernate_orm_hibernate_core_6_5_3_Final//file:file\" -> \"@@rules_jvm_external~~maven~org_hibernate_orm_hibernate_core_6_5_3_Final//file:v1/org/hibernate/orm/hibernate-core/6.5.3.Final/hibernate-core-6.5.3.Final.jar\"\n  \"@@rules_jvm_external~~maven~org_hibernate_orm_hibernate_core_6_5_3_Final//file:v1/org/hibernate/orm/hibernate-core/6.5.3.Final/hibernate-core-6.5.3.Final.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm\" -> \"@unmanaged_deps_filter//:org/springframework/spring-orm/6.1.19/spring-orm-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm\" -> \"@unmanaged_deps_filter//:org_springframework_spring_jdbc\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm\" -> \"@unmanaged_deps_filter//:org_springframework_spring_tx\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jdbc\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jdbc\" -> \"@unmanaged_deps_filter//:org/springframework/spring-jdbc/6.1.19/spring-jdbc-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jdbc\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jdbc\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jdbc\" -> \"@unmanaged_deps_filter//:org_springframework_spring_tx\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jdbc\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jdbc\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_tx\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_tx\" -> \"@unmanaged_deps_filter//:org/springframework/spring-tx/6.1.19/spring-tx-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_tx\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_tx\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_tx\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_tx\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-tx/6.1.19/spring-tx-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-tx/6.1.19/spring-tx-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_tx_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_tx_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_tx_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_tx_6_1_19//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_tx_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-jdbc/6.1.19/spring-jdbc-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-jdbc/6.1.19/spring-jdbc-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_jdbc_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jdbc_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jdbc_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_jdbc_6_1_19//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jdbc_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_jdbc_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_jdbc_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_jdbc_6_1_19//file:v1/org/springframework/spring-jdbc/6.1.19/spring-jdbc-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_jdbc_6_1_19//file:v1/org/springframework/spring-jdbc/6.1.19/spring-jdbc-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:jakarta/transaction/jakarta.transaction-api/2.0.1/jakarta.transaction-api-2.0.1.jar\"\n  \"@unmanaged_deps_filter//:jakarta/transaction/jakarta.transaction-api/2.0.1/jakarta.transaction-api-2.0.1.jar\" -> \"@unmanaged_deps_filter//:jakarta_transaction_jakarta_transaction_api_2_0_1_extension\"\n  \"@unmanaged_deps_filter//:jakarta_transaction_jakarta_transaction_api_2_0_1_extension\"\n  \"@unmanaged_deps_filter//:jakarta_transaction_jakarta_transaction_api_2_0_1_extension\" -> \"@@rules_jvm_external~~maven~jakarta_transaction_jakarta_transaction_api_2_0_1//file:file\"\n  \"@unmanaged_deps_filter//:jakarta_transaction_jakarta_transaction_api_2_0_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~jakarta_transaction_jakarta_transaction_api_2_0_1//file:file\"\n  \"@@rules_jvm_external~~maven~jakarta_transaction_jakarta_transaction_api_2_0_1//file:file\" -> \"@@rules_jvm_external~~maven~jakarta_transaction_jakarta_transaction_api_2_0_1//file:v1/jakarta/transaction/jakarta.transaction-api/2.0.1/jakarta.transaction-api-2.0.1.jar\"\n  \"@@rules_jvm_external~~maven~jakarta_transaction_jakarta_transaction_api_2_0_1//file:v1/jakarta/transaction/jakarta.transaction-api/2.0.1/jakarta.transaction-api-2.0.1.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_oauth2_client_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_oauth2_client_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_oauth2_client_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-oauth2-client/3.3.11/spring-boot-starter-oauth2-client-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_oauth2_client_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-oauth2-client/3.3.11/spring-boot-starter-oauth2-client-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/aspectj/aspectjweaver/1.9.24/aspectjweaver-1.9.24.jar\"\n  \"@unmanaged_deps_filter//:org/aspectj/aspectjweaver/1.9.24/aspectjweaver-1.9.24.jar\" -> \"@unmanaged_deps_filter//:org_aspectj_aspectjweaver_1_9_24_extension\"\n  \"@unmanaged_deps_filter//:org_aspectj_aspectjweaver_1_9_24_extension\"\n  \"@unmanaged_deps_filter//:org_aspectj_aspectjweaver_1_9_24_extension\" -> \"@@rules_jvm_external~~maven~org_aspectj_aspectjweaver_1_9_24//file:file\"\n  \"@unmanaged_deps_filter//:org_aspectj_aspectjweaver_1_9_24_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_aspectj_aspectjweaver_1_9_24//file:file\"\n  \"@@rules_jvm_external~~maven~org_aspectj_aspectjweaver_1_9_24//file:file\" -> \"@@rules_jvm_external~~maven~org_aspectj_aspectjweaver_1_9_24//file:v1/org/aspectj/aspectjweaver/1.9.24/aspectjweaver-1.9.24.jar\"\n  \"@@rules_jvm_external~~maven~org_aspectj_aspectjweaver_1_9_24//file:v1/org/aspectj/aspectjweaver/1.9.24/aspectjweaver-1.9.24.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names_2_17_3_extension\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_module_jackson_module_parameter_names_2_17_3//file:file\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_module_jackson_module_parameter_names_2_17_3_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_module_jackson_module_parameter_names_2_17_3//file:file\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_module_jackson_module_parameter_names_2_17_3//file:file\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_module_jackson_module_parameter_names_2_17_3//file:v1/com/fasterxml/jackson/module/jackson-module-parameter-names/2.17.3/jackson-module-parameter-names-2.17.3.jar\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_module_jackson_module_parameter_names_2_17_3//file:v1/com/fasterxml/jackson/module/jackson-module-parameter-names/2.17.3/jackson-module-parameter-names-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\" -> \"@unmanaged_deps_filter//:io/projectreactor/netty/reactor-netty-core/1.1.29/reactor-netty-core-1.1.29.jar\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\" -> \"@unmanaged_deps_filter//:io_netty_netty_handler\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\" -> \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_osx_x86_64\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\" -> \"@unmanaged_deps_filter//:io_projectreactor_reactor_core\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_projectreactor_reactor_core\"\n  \"@unmanaged_deps_filter//:io_projectreactor_reactor_core\" -> \"@unmanaged_deps_filter//:io/projectreactor/reactor-core/3.6.15/reactor-core-3.6.15.jar\"\n  \"@unmanaged_deps_filter//:io_projectreactor_reactor_core\" -> \"@unmanaged_deps_filter//:org_reactivestreams_reactive_streams\"\n  \"@unmanaged_deps_filter//:io_projectreactor_reactor_core\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_projectreactor_reactor_core\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_reactivestreams_reactive_streams\"\n  \"@unmanaged_deps_filter//:org_reactivestreams_reactive_streams\" -> \"@unmanaged_deps_filter//:org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar\"\n  \"@unmanaged_deps_filter//:org_reactivestreams_reactive_streams\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_reactivestreams_reactive_streams\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar\"\n  \"@unmanaged_deps_filter//:org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar\" -> \"@unmanaged_deps_filter//:org_reactivestreams_reactive_streams_1_0_4_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\" -> \"@unmanaged_deps_filter//:io/netty/netty-transport-native-epoll/4.1.119.Final/netty-transport-native-epoll-4.1.119.Final-linux-x86_64.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_linux_x86_64\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll\" -> \"@unmanaged_deps_filter//:io/netty/netty-transport-classes-epoll/4.1.119.Final/netty-transport-classes-epoll-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io/netty/netty-transport-classes-epoll/4.1.119.Final/netty-transport-classes-epoll-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-transport-classes-epoll/4.1.119.Final/netty-transport-classes-epoll-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_transport_classes_epoll_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_classes_epoll_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_classes_epoll_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_classes_epoll_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_transport_classes_epoll_4_1_119_Final//file:v1/io/netty/netty-transport-classes-epoll/4.1.119.Final/netty-transport-classes-epoll-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_classes_epoll_4_1_119_Final//file:v1/io/netty/netty-transport-classes-epoll/4.1.119.Final/netty-transport-classes-epoll-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-transport-native-epoll/4.1.119.Final/netty-transport-native-epoll-4.1.119.Final-linux-x86_64.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-transport-native-epoll/4.1.119.Final/netty-transport-native-epoll-4.1.119.Final-linux-x86_64.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_jar_linux_x86_64_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_jar_linux_x86_64_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_jar_linux_x86_64_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_transport_native_epoll_jar_linux_x86_64_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_epoll_jar_linux_x86_64_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_native_epoll_jar_linux_x86_64_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_native_epoll_jar_linux_x86_64_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_transport_native_epoll_jar_linux_x86_64_4_1_119_Final//file:v1/io/netty/netty-transport-native-epoll/4.1.119.Final/netty-transport-native-epoll-4.1.119.Final-linux-x86_64.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_native_epoll_jar_linux_x86_64_4_1_119_Final//file:v1/io/netty/netty-transport-native-epoll/4.1.119.Final/netty-transport-native-epoll-4.1.119.Final-linux-x86_64.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_osx_x86_64\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_osx_x86_64\" -> \"@unmanaged_deps_filter//:io/netty/netty-resolver-dns-native-macos/4.1.119.Final/netty-resolver-dns-native-macos-4.1.119.Final-osx-x86_64.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_osx_x86_64\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_osx_x86_64\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_osx_x86_64\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos\" -> \"@unmanaged_deps_filter//:io/netty/netty-resolver-dns-classes-macos/4.1.119.Final/netty-resolver-dns-classes-macos-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io/netty/netty-resolver-dns-classes-macos/4.1.119.Final/netty-resolver-dns-classes-macos-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-resolver-dns-classes-macos/4.1.119.Final/netty-resolver-dns-classes-macos-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_classes_macos_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_classes_macos_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_classes_macos_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_classes_macos_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_classes_macos_4_1_119_Final//file:v1/io/netty/netty-resolver-dns-classes-macos/4.1.119.Final/netty-resolver-dns-classes-macos-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_classes_macos_4_1_119_Final//file:v1/io/netty/netty-resolver-dns-classes-macos/4.1.119.Final/netty-resolver-dns-classes-macos-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-resolver-dns-native-macos/4.1.119.Final/netty-resolver-dns-native-macos-4.1.119.Final-osx-x86_64.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-resolver-dns-native-macos/4.1.119.Final/netty-resolver-dns-native-macos-4.1.119.Final-osx-x86_64.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_jar_osx_x86_64_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_jar_osx_x86_64_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_jar_osx_x86_64_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_native_macos_jar_osx_x86_64_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_native_macos_jar_osx_x86_64_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_native_macos_jar_osx_x86_64_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_native_macos_jar_osx_x86_64_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_native_macos_jar_osx_x86_64_4_1_119_Final//file:v1/io/netty/netty-resolver-dns-native-macos/4.1.119.Final/netty-resolver-dns-native-macos-4.1.119.Final-osx-x86_64.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_native_macos_jar_osx_x86_64_4_1_119_Final//file:v1/io/netty/netty-resolver-dns-native-macos/4.1.119.Final/netty-resolver-dns-native-macos-4.1.119.Final-osx-x86_64.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\" -> \"@unmanaged_deps_filter//:io/netty/netty-resolver-dns/4.1.119.Final/netty-resolver-dns-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_dns\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_handler\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns\" -> \"@unmanaged_deps_filter//:io/netty/netty-codec-dns/4.1.119.Final/netty-codec-dns-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io/netty/netty-codec-dns/4.1.119.Final/netty-codec-dns-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-codec-dns/4.1.119.Final/netty-codec-dns-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_dns_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_codec_dns_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_dns_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_dns_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_dns_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_codec_dns_4_1_119_Final//file:v1/io/netty/netty-codec-dns/4.1.119.Final/netty-codec-dns-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_dns_4_1_119_Final//file:v1/io/netty/netty-codec-dns/4.1.119.Final/netty-codec-dns-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-resolver-dns/4.1.119.Final/netty-resolver-dns-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-resolver-dns/4.1.119.Final/netty-resolver-dns-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_dns_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:io/projectreactor/netty/reactor-netty-core/1.1.29/reactor-netty-core-1.1.29.jar\"\n  \"@unmanaged_deps_filter//:io/projectreactor/netty/reactor-netty-core/1.1.29/reactor-netty-core-1.1.29.jar\" -> \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core_1_1_29_extension\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core_1_1_29_extension\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core_1_1_29_extension\" -> \"@@rules_jvm_external~~maven~io_projectreactor_netty_reactor_netty_core_1_1_29//file:file\"\n  \"@unmanaged_deps_filter//:io_projectreactor_netty_reactor_netty_core_1_1_29_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_projectreactor_netty_reactor_netty_core_1_1_29//file:file\"\n  \"@@rules_jvm_external~~maven~io_projectreactor_netty_reactor_netty_core_1_1_29//file:file\" -> \"@@rules_jvm_external~~maven~io_projectreactor_netty_reactor_netty_core_1_1_29//file:v1/io/projectreactor/netty/reactor-netty-core/1.1.29/reactor-netty-core-1.1.29.jar\"\n  \"@@rules_jvm_external~~maven~io_projectreactor_netty_reactor_netty_core_1_1_29//file:v1/io/projectreactor/netty/reactor-netty-core/1.1.29/reactor-netty-core-1.1.29.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-codec-http2/4.1.119.Final/netty-codec-http2-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-codec-http2/4.1.119.Final/netty-codec-http2-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_http2_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_codec_http2_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http2_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_http2_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_http2_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_codec_http2_4_1_119_Final//file:v1/io/netty/netty-codec-http2/4.1.119.Final/netty-codec-http2-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_http2_4_1_119_Final//file:v1/io/netty/netty-codec-http2/4.1.119.Final/netty-codec-http2-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_17_3//file:file\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_17_3//file:file\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_17_3//file:v1/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.17.3/jackson-datatype-jsr310-2.17.3.jar\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_17_3//file:v1/com/fasterxml/jackson/datatype/jackson-datatype-jsr310/2.17.3/jackson-datatype-jsr310-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_annotations_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_annotations_2_17_3_extension\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_annotations_2_17_3//file:file\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_annotations_2_17_3_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_annotations_2_17_3//file:file\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_annotations_2_17_3//file:file\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_annotations_2_17_3//file:v1/com/fasterxml/jackson/core/jackson-annotations/2.17.3/jackson-annotations-2.17.3.jar\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_annotations_2_17_3//file:v1/com/fasterxml/jackson/core/jackson-annotations/2.17.3/jackson-annotations-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:org/hibernate/common/hibernate-commons-annotations/6.0.6.Final/hibernate-commons-annotations-6.0.6.Final.jar\"\n  \"@unmanaged_deps_filter//:org/hibernate/common/hibernate-commons-annotations/6.0.6.Final/hibernate-commons-annotations-6.0.6.Final.jar\" -> \"@unmanaged_deps_filter//:org_hibernate_common_hibernate_commons_annotations_6_0_6_Final_extension\"\n  \"@unmanaged_deps_filter//:org_hibernate_common_hibernate_commons_annotations_6_0_6_Final_extension\"\n  \"@unmanaged_deps_filter//:org_hibernate_common_hibernate_commons_annotations_6_0_6_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_hibernate_common_hibernate_commons_annotations_6_0_6_Final_extension\" -> \"@@rules_jvm_external~~maven~org_hibernate_common_hibernate_commons_annotations_6_0_6_Final//file:file\"\n  \"@@rules_jvm_external~~maven~org_hibernate_common_hibernate_commons_annotations_6_0_6_Final//file:file\"\n  \"@@rules_jvm_external~~maven~org_hibernate_common_hibernate_commons_annotations_6_0_6_Final//file:file\" -> \"@@rules_jvm_external~~maven~org_hibernate_common_hibernate_commons_annotations_6_0_6_Final//file:v1/org/hibernate/common/hibernate-commons-annotations/6.0.6.Final/hibernate-commons-annotations-6.0.6.Final.jar\"\n  \"@@rules_jvm_external~~maven~org_hibernate_common_hibernate_commons_annotations_6_0_6_Final//file:v1/org/hibernate/common/hibernate-commons-annotations/6.0.6.Final/hibernate-commons-annotations-6.0.6.Final.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\" -> \"@unmanaged_deps_filter//:org/springframework/security/spring-security-core/6.3.9/spring-security-core-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_crypto\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\" -> \"@unmanaged_deps_filter//:org_springframework_spring_aop\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\" -> \"@unmanaged_deps_filter//:org_springframework_spring_context\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\" -> \"@unmanaged_deps_filter//:org_springframework_spring_expression\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_crypto\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_crypto\" -> \"@unmanaged_deps_filter//:org/springframework/security/spring-security-crypto/6.3.9/spring-security-crypto-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_crypto\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_crypto\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-core/6.3.9/spring-security-core-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-core/6.3.9/spring-security-core-6.3.9.jar\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core_6_3_9_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_core_6_3_9//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_core_6_3_9_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_core_6_3_9//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_core_6_3_9//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_core_6_3_9//file:v1/org/springframework/security/spring-security-core/6.3.9/spring-security-core-6.3.9.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_core_6_3_9//file:v1/org/springframework/security/spring-security-core/6.3.9/spring-security-core-6.3.9.jar\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_oauth2_oidc_sdk_9_43_6//file:v1/com/nimbusds/oauth2-oidc-sdk/9.43.6/oauth2-oidc-sdk-9.43.6.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_actuator_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_actuator_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_actuator_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_actuator_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-actuator/3.3.11/spring-boot-starter-actuator-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_actuator_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-actuator/3.3.11/spring-boot-starter-actuator-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_reactivestreams_reactive_streams_1_0_4_extension\"\n  \"@unmanaged_deps_filter//:org_reactivestreams_reactive_streams_1_0_4_extension\" -> \"@@rules_jvm_external~~maven~org_reactivestreams_reactive_streams_1_0_4//file:file\"\n  \"@unmanaged_deps_filter//:org_reactivestreams_reactive_streams_1_0_4_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-jdbc/3.3.11/spring-boot-starter-jdbc-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-jdbc/3.3.11/spring-boot-starter-jdbc-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:io_smallrye_jandex\"\n  \"@unmanaged_deps_filter//:io_smallrye_jandex\" -> \"@unmanaged_deps_filter//:io/smallrye/jandex/3.1.2/jandex-3.1.2.jar\"\n  \"@unmanaged_deps_filter//:io_smallrye_jandex\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_smallrye_jandex\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io/smallrye/jandex/3.1.2/jandex-3.1.2.jar\"\n  \"@unmanaged_deps_filter//:io/smallrye/jandex/3.1.2/jandex-3.1.2.jar\" -> \"@unmanaged_deps_filter//:io_smallrye_jandex_3_1_2_extension\"\n  \"@unmanaged_deps_filter//:io_smallrye_jandex_3_1_2_extension\"\n  \"@unmanaged_deps_filter//:io_smallrye_jandex_3_1_2_extension\" -> \"@@rules_jvm_external~~maven~io_smallrye_jandex_3_1_2//file:file\"\n  \"@unmanaged_deps_filter//:io_smallrye_jandex_3_1_2_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_smallrye_jandex_3_1_2//file:file\"\n  \"@@rules_jvm_external~~maven~io_smallrye_jandex_3_1_2//file:file\" -> \"@@rules_jvm_external~~maven~io_smallrye_jandex_3_1_2//file:v1/io/smallrye/jandex/3.1.2/jandex-3.1.2.jar\"\n  \"@@rules_jvm_external~~maven~io_smallrye_jandex_3_1_2//file:v1/io/smallrye/jandex/3.1.2/jandex-3.1.2.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_jose_6_3_9//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_jose_6_3_9//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_jose_6_3_9//file:v1/org/springframework/security/spring-security-oauth2-jose/6.3.9/spring-security-oauth2-jose-6.3.9.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_oauth2_jose_6_3_9//file:v1/org/springframework/security/spring-security-oauth2-jose/6.3.9/spring-security-oauth2-jose-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_jdbc_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_jdbc_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_jdbc_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_jdbc_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_jdbc_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-jdbc/3.3.11/spring-boot-starter-jdbc-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_jdbc_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-jdbc/3.3.11/spring-boot-starter-jdbc-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core\" -> \"@unmanaged_deps_filter//:io/micrometer/micrometer-core/1.13.13/micrometer-core-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core\" -> \"@unmanaged_deps_filter//:org_hdrhistogram_HdrHistogram\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core\" -> \"@unmanaged_deps_filter//:org_latencyutils_LatencyUtils\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_latencyutils_LatencyUtils\"\n  \"@unmanaged_deps_filter//:org_latencyutils_LatencyUtils\" -> \"@unmanaged_deps_filter//:org/latencyutils/LatencyUtils/2.0.3/LatencyUtils-2.0.3.jar\"\n  \"@unmanaged_deps_filter//:org_latencyutils_LatencyUtils\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_latencyutils_LatencyUtils\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/latencyutils/LatencyUtils/2.0.3/LatencyUtils-2.0.3.jar\"\n  \"@unmanaged_deps_filter//:org/latencyutils/LatencyUtils/2.0.3/LatencyUtils-2.0.3.jar\" -> \"@unmanaged_deps_filter//:org_latencyutils_LatencyUtils_2_0_3_extension\"\n  \"@unmanaged_deps_filter//:org_latencyutils_LatencyUtils_2_0_3_extension\"\n  \"@unmanaged_deps_filter//:org_latencyutils_LatencyUtils_2_0_3_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_latencyutils_LatencyUtils_2_0_3_extension\" -> \"@@rules_jvm_external~~maven~org_latencyutils_LatencyUtils_2_0_3//file:file\"\n  \"@@rules_jvm_external~~maven~org_latencyutils_LatencyUtils_2_0_3//file:file\"\n  \"@@rules_jvm_external~~maven~org_latencyutils_LatencyUtils_2_0_3//file:file\" -> \"@@rules_jvm_external~~maven~org_latencyutils_LatencyUtils_2_0_3//file:v1/org/latencyutils/LatencyUtils/2.0.3/LatencyUtils-2.0.3.jar\"\n  \"@@rules_jvm_external~~maven~org_latencyutils_LatencyUtils_2_0_3//file:v1/org/latencyutils/LatencyUtils/2.0.3/LatencyUtils-2.0.3.jar\"\n  \"@unmanaged_deps_filter//:org_hdrhistogram_HdrHistogram\"\n  \"@unmanaged_deps_filter//:org_hdrhistogram_HdrHistogram\" -> \"@unmanaged_deps_filter//:org/hdrhistogram/HdrHistogram/2.2.2/HdrHistogram-2.2.2.jar\"\n  \"@unmanaged_deps_filter//:org_hdrhistogram_HdrHistogram\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_hdrhistogram_HdrHistogram\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/hdrhistogram/HdrHistogram/2.2.2/HdrHistogram-2.2.2.jar\"\n  \"@unmanaged_deps_filter//:org/hdrhistogram/HdrHistogram/2.2.2/HdrHistogram-2.2.2.jar\" -> \"@unmanaged_deps_filter//:org_hdrhistogram_HdrHistogram_2_2_2_extension\"\n  \"@unmanaged_deps_filter//:org_hdrhistogram_HdrHistogram_2_2_2_extension\"\n  \"@unmanaged_deps_filter//:org_hdrhistogram_HdrHistogram_2_2_2_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_hdrhistogram_HdrHistogram_2_2_2_extension\" -> \"@@rules_jvm_external~~maven~org_hdrhistogram_HdrHistogram_2_2_2//file:file\"\n  \"@@rules_jvm_external~~maven~org_hdrhistogram_HdrHistogram_2_2_2//file:file\"\n  \"@@rules_jvm_external~~maven~org_hdrhistogram_HdrHistogram_2_2_2//file:file\" -> \"@@rules_jvm_external~~maven~org_hdrhistogram_HdrHistogram_2_2_2//file:v1/org/hdrhistogram/HdrHistogram/2.2.2/HdrHistogram-2.2.2.jar\"\n  \"@@rules_jvm_external~~maven~org_hdrhistogram_HdrHistogram_2_2_2//file:v1/org/hdrhistogram/HdrHistogram/2.2.2/HdrHistogram-2.2.2.jar\"\n  \"@unmanaged_deps_filter//:io/micrometer/micrometer-core/1.13.13/micrometer-core-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:io/micrometer/micrometer-core/1.13.13/micrometer-core-1.13.13.jar\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_core_1_13_13_extension\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core_1_13_13_extension\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core_1_13_13_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_core_1_13_13_extension\" -> \"@@rules_jvm_external~~maven~io_micrometer_micrometer_core_1_13_13//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_4_1_119_Final//file:v1/io/netty/netty-resolver-dns/4.1.119.Final/netty-resolver-dns-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_dns_4_1_119_Final//file:v1/io/netty/netty-resolver-dns/4.1.119.Final/netty-resolver-dns-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:com_sun_istack_istack_commons_runtime\"\n  \"@unmanaged_deps_filter//:com_sun_istack_istack_commons_runtime\" -> \"@unmanaged_deps_filter//:com/sun/istack/istack-commons-runtime/4.1.1/istack-commons-runtime-4.1.1.jar\"\n  \"@unmanaged_deps_filter//:com_sun_istack_istack_commons_runtime\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com_sun_istack_istack_commons_runtime\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com/sun/istack/istack-commons-runtime/4.1.1/istack-commons-runtime-4.1.1.jar\"\n  \"@unmanaged_deps_filter//:com/sun/istack/istack-commons-runtime/4.1.1/istack-commons-runtime-4.1.1.jar\" -> \"@unmanaged_deps_filter//:com_sun_istack_istack_commons_runtime_4_1_1_extension\"\n  \"@unmanaged_deps_filter//:com_sun_istack_istack_commons_runtime_4_1_1_extension\"\n  \"@unmanaged_deps_filter//:com_sun_istack_istack_commons_runtime_4_1_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:com_sun_istack_istack_commons_runtime_4_1_1_extension\" -> \"@@rules_jvm_external~~maven~com_sun_istack_istack_commons_runtime_4_1_1//file:file\"\n  \"@@rules_jvm_external~~maven~com_sun_istack_istack_commons_runtime_4_1_1//file:file\"\n  \"@@rules_jvm_external~~maven~com_sun_istack_istack_commons_runtime_4_1_1//file:file\" -> \"@@rules_jvm_external~~maven~com_sun_istack_istack_commons_runtime_4_1_1//file:v1/com/sun/istack/istack-commons-runtime/4.1.1/istack-commons-runtime-4.1.1.jar\"\n  \"@@rules_jvm_external~~maven~com_sun_istack_istack_commons_runtime_4_1_1//file:v1/com/sun/istack/istack-commons-runtime/4.1.1/istack-commons-runtime-4.1.1.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_data_spring_data_jpa_3_3_11//file:v1/org/springframework/data/spring-data-jpa/3.3.11/spring-data-jpa-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_reactivestreams_reactive_streams_1_0_4//file:file\"\n  \"@@rules_jvm_external~~maven~org_reactivestreams_reactive_streams_1_0_4//file:file\" -> \"@@rules_jvm_external~~maven~org_reactivestreams_reactive_streams_1_0_4//file:v1/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar\"\n  \"@@rules_jvm_external~~maven~org_reactivestreams_reactive_streams_1_0_4//file:v1/org/reactivestreams/reactive-streams/1.0.4/reactive-streams-1.0.4.jar\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/core/jackson-databind/2.17.3/jackson-databind-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:com/fasterxml/jackson/core/jackson-databind/2.17.3/jackson-databind-2.17.3.jar\" -> \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind_2_17_3_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind_2_17_3_extension\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_databind_2_17_3//file:file\"\n  \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind_2_17_3_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_databind_2_17_3//file:file\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_databind_2_17_3//file:file\" -> \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_databind_2_17_3//file:v1/com/fasterxml/jackson/core/jackson-databind/2.17.3/jackson-databind-2.17.3.jar\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_jackson_core_jackson_databind_2_17_3//file:v1/com/fasterxml/jackson/core/jackson-databind/2.17.3/jackson-databind-2.17.3.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\" -> \"@unmanaged_deps_filter//:io/netty/netty-handler-proxy/4.1.119.Final/netty-handler-proxy-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_http\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_socks\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks\" -> \"@unmanaged_deps_filter//:io/netty/netty-codec-socks/4.1.119.Final/netty-codec-socks-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io/netty/netty-codec-socks/4.1.119.Final/netty-codec-socks-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-codec-socks/4.1.119.Final/netty-codec-socks-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_socks_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_codec_socks_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_socks_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_socks_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_socks_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_codec_socks_4_1_119_Final//file:v1/io/netty/netty-codec-socks/4.1.119.Final/netty-codec-socks-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_socks_4_1_119_Final//file:v1/io/netty/netty-codec-socks/4.1.119.Final/netty-codec-socks-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http\" -> \"@unmanaged_deps_filter//:io/netty/netty-codec-http/4.1.119.Final/netty-codec-http-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http\" -> \"@unmanaged_deps_filter//:io_netty_netty_handler\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler\" -> \"@unmanaged_deps_filter//:io/netty/netty-handler/4.1.119.Final/netty-handler-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\" -> \"@unmanaged_deps_filter//:io/netty/netty-transport-native-unix-common/4.1.119.Final/netty-transport-native-unix-common-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io/netty/netty-transport-native-unix-common/4.1.119.Final/netty-transport-native-unix-common-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-transport-native-unix-common/4.1.119.Final/netty-transport-native-unix-common-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_transport_native_unix_common_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_native_unix_common_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_native_unix_common_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_native_unix_common_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_transport_native_unix_common_4_1_119_Final//file:v1/io/netty/netty-transport-native-unix-common/4.1.119.Final/netty-transport-native-unix-common-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_native_unix_common_4_1_119_Final//file:v1/io/netty/netty-transport-native-unix-common/4.1.119.Final/netty-transport-native-unix-common-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-handler/4.1.119.Final/netty-handler-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-handler/4.1.119.Final/netty-handler-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_handler_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_handler_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:io/netty/netty-codec-http/4.1.119.Final/netty-codec-http-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-codec-http/4.1.119.Final/netty-codec-http-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_http_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec\" -> \"@unmanaged_deps_filter//:io/netty/netty-codec/4.1.119.Final/netty-codec-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport\" -> \"@unmanaged_deps_filter//:io/netty/netty-transport/4.1.119.Final/netty-transport-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver\" -> \"@unmanaged_deps_filter//:io/netty/netty-resolver/4.1.119.Final/netty-resolver-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io/netty/netty-resolver/4.1.119.Final/netty-resolver-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-resolver/4.1.119.Final/netty-resolver-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_resolver_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_resolver_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_resolver_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_resolver_4_1_119_Final//file:v1/io/netty/netty-resolver/4.1.119.Final/netty-resolver-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_resolver_4_1_119_Final//file:v1/io/netty/netty-resolver/4.1.119.Final/netty-resolver-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-transport/4.1.119.Final/netty-transport-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-transport/4.1.119.Final/netty-transport-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_transport_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_transport_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_transport_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_transport_4_1_119_Final//file:v1/io/netty/netty-transport/4.1.119.Final/netty-transport-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_transport_4_1_119_Final//file:v1/io/netty/netty-transport/4.1.119.Final/netty-transport-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-codec/4.1.119.Final/netty-codec-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-codec/4.1.119.Final/netty-codec-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_codec_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_codec_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_codec_4_1_119_Final//file:v1/io/netty/netty-codec/4.1.119.Final/netty-codec-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_4_1_119_Final//file:v1/io/netty/netty-codec/4.1.119.Final/netty-codec-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_buffer\"\n  \"@unmanaged_deps_filter//:io_netty_netty_buffer\" -> \"@unmanaged_deps_filter//:io/netty/netty-buffer/4.1.119.Final/netty-buffer-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_buffer\" -> \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_buffer\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_buffer\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_netty_netty_common\"\n  \"@unmanaged_deps_filter//:io_netty_netty_common\" -> \"@unmanaged_deps_filter//:io/netty/netty-common/4.1.119.Final/netty-common-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_common\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_netty_netty_common\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io/netty/netty-common/4.1.119.Final/netty-common-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-common/4.1.119.Final/netty-common-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_common_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_common_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_common_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_common_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_common_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_common_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_common_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_common_4_1_119_Final//file:v1/io/netty/netty-common/4.1.119.Final/netty-common-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_common_4_1_119_Final//file:v1/io/netty/netty-common/4.1.119.Final/netty-common-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-buffer/4.1.119.Final/netty-buffer-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-buffer/4.1.119.Final/netty-buffer-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_buffer_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_buffer_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_buffer_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_buffer_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_buffer_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_buffer_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_buffer_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_buffer_4_1_119_Final//file:v1/io/netty/netty-buffer/4.1.119.Final/netty-buffer-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_buffer_4_1_119_Final//file:v1/io/netty/netty-buffer/4.1.119.Final/netty-buffer-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-handler-proxy/4.1.119.Final/netty-handler-proxy-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:io/netty/netty-handler-proxy/4.1.119.Final/netty-handler-proxy-4.1.119.Final.jar\" -> \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_handler_proxy_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_handler_proxy_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_handler_proxy_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_handler_proxy_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_handler_proxy_4_1_119_Final//file:v1/io/netty/netty-handler-proxy/4.1.119.Final/netty-handler-proxy-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_handler_proxy_4_1_119_Final//file:v1/io/netty/netty-handler-proxy/4.1.119.Final/netty-handler-proxy-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:com_nimbusds_content_type\"\n  \"@unmanaged_deps_filter//:com_nimbusds_content_type\" -> \"@unmanaged_deps_filter//:com/nimbusds/content-type/2.2/content-type-2.2.jar\"\n  \"@unmanaged_deps_filter//:com_nimbusds_content_type\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:com_nimbusds_content_type\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:com/nimbusds/content-type/2.2/content-type-2.2.jar\"\n  \"@unmanaged_deps_filter//:com/nimbusds/content-type/2.2/content-type-2.2.jar\" -> \"@unmanaged_deps_filter//:com_nimbusds_content_type_2_2_extension\"\n  \"@unmanaged_deps_filter//:com_nimbusds_content_type_2_2_extension\"\n  \"@unmanaged_deps_filter//:com_nimbusds_content_type_2_2_extension\" -> \"@@rules_jvm_external~~maven~com_nimbusds_content_type_2_2//file:file\"\n  \"@unmanaged_deps_filter//:com_nimbusds_content_type_2_2_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_content_type_2_2//file:file\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_content_type_2_2//file:file\" -> \"@@rules_jvm_external~~maven~com_nimbusds_content_type_2_2//file:v1/com/nimbusds/content-type/2.2/content-type-2.2.jar\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_content_type_2_2//file:v1/com/nimbusds/content-type/2.2/content-type-2.2.jar\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_runtime_4_0_2_extension\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_runtime_4_0_2_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_glassfish_jaxb_jaxb_runtime_4_0_2_extension\" -> \"@@rules_jvm_external~~maven~org_glassfish_jaxb_jaxb_runtime_4_0_2//file:file\"\n  \"@@rules_jvm_external~~maven~org_glassfish_jaxb_jaxb_runtime_4_0_2//file:file\"\n  \"@@rules_jvm_external~~maven~org_glassfish_jaxb_jaxb_runtime_4_0_2//file:file\" -> \"@@rules_jvm_external~~maven~org_glassfish_jaxb_jaxb_runtime_4_0_2//file:v1/org/glassfish/jaxb/jaxb-runtime/4.0.2/jaxb-runtime-4.0.2.jar\"\n  \"@@rules_jvm_external~~maven~org_glassfish_jaxb_jaxb_runtime_4_0_2//file:v1/org/glassfish/jaxb/jaxb-runtime/4.0.2/jaxb-runtime-4.0.2.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-crypto/6.3.9/spring-security-crypto-6.3.9.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/security/spring-security-crypto/6.3.9/spring-security-crypto-6.3.9.jar\" -> \"@unmanaged_deps_filter//:org_springframework_security_spring_security_crypto_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_crypto_6_3_9_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_crypto_6_3_9_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_crypto_6_3_9//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_security_spring_security_crypto_6_3_9_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_crypto_6_3_9//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_crypto_6_3_9//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_crypto_6_3_9//file:v1/org/springframework/security/spring-security-crypto/6.3.9/spring-security-crypto-6.3.9.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_security_spring_security_crypto_6_3_9//file:v1/org/springframework/security/spring-security-crypto/6.3.9/spring-security-crypto-6.3.9.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_webflux_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_webflux_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_webflux_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-webflux/3.3.11/spring-boot-starter-webflux-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_webflux_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-webflux/3.3.11/spring-boot-starter-webflux-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http_4_1_119_Final_extension\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http_4_1_119_Final_extension\" -> \"@@rules_jvm_external~~maven~io_netty_netty_codec_http_4_1_119_Final//file:file\"\n  \"@unmanaged_deps_filter//:io_netty_netty_codec_http_4_1_119_Final_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_http_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_http_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_codec_http_4_1_119_Final//file:v1/io/netty/netty-codec-http/4.1.119.Final/netty-codec-http-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_codec_http_4_1_119_Final//file:v1/io/netty/netty-codec-http/4.1.119.Final/netty-codec-http-4.1.119.Final.jar\"\n  \"@unmanaged_deps_filter//:jakarta_persistence_jakarta_persistence_api\"\n  \"@unmanaged_deps_filter//:jakarta_persistence_jakarta_persistence_api\" -> \"@unmanaged_deps_filter//:jakarta/persistence/jakarta.persistence-api/3.1.0/jakarta.persistence-api-3.1.0.jar\"\n  \"@unmanaged_deps_filter//:jakarta_persistence_jakarta_persistence_api\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:jakarta_persistence_jakarta_persistence_api\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:jakarta/persistence/jakarta.persistence-api/3.1.0/jakarta.persistence-api-3.1.0.jar\"\n  \"@unmanaged_deps_filter//:jakarta/persistence/jakarta.persistence-api/3.1.0/jakarta.persistence-api-3.1.0.jar\" -> \"@unmanaged_deps_filter//:jakarta_persistence_jakarta_persistence_api_3_1_0_extension\"\n  \"@unmanaged_deps_filter//:jakarta_persistence_jakarta_persistence_api_3_1_0_extension\"\n  \"@unmanaged_deps_filter//:jakarta_persistence_jakarta_persistence_api_3_1_0_extension\" -> \"@@rules_jvm_external~~maven~jakarta_persistence_jakarta_persistence_api_3_1_0//file:file\"\n  \"@unmanaged_deps_filter//:jakarta_persistence_jakarta_persistence_api_3_1_0_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~jakarta_persistence_jakarta_persistence_api_3_1_0//file:file\"\n  \"@@rules_jvm_external~~maven~jakarta_persistence_jakarta_persistence_api_3_1_0//file:file\" -> \"@@rules_jvm_external~~maven~jakarta_persistence_jakarta_persistence_api_3_1_0//file:v1/jakarta/persistence/jakarta.persistence-api/3.1.0/jakarta.persistence-api-3.1.0.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_handler_4_1_119_Final//file:file\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_handler_4_1_119_Final//file:file\" -> \"@@rules_jvm_external~~maven~io_netty_netty_handler_4_1_119_Final//file:v1/io/netty/netty-handler/4.1.119.Final/netty-handler-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~io_netty_netty_handler_4_1_119_Final//file:v1/io/netty/netty-handler/4.1.119.Final/netty-handler-4.1.119.Final.jar\"\n  \"@@rules_jvm_external~~maven~jakarta_inject_jakarta_inject_api_2_0_1//file:file\"\n  \"@@rules_jvm_external~~maven~jakarta_inject_jakarta_inject_api_2_0_1//file:file\" -> \"@@rules_jvm_external~~maven~jakarta_inject_jakarta_inject_api_2_0_1//file:v1/jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar\"\n  \"@@rules_jvm_external~~maven~jakarta_inject_jakarta_inject_api_2_0_1//file:v1/jakarta/inject/jakarta.inject-api/2.0.1/jakarta.inject-api-2.0.1.jar\"\n  \"@unmanaged_deps_filter//:com_zaxxer_HikariCP_5_1_0_extension\"\n  \"@unmanaged_deps_filter//:com_zaxxer_HikariCP_5_1_0_extension\" -> \"@@rules_jvm_external~~maven~com_zaxxer_HikariCP_5_1_0//file:file\"\n  \"@unmanaged_deps_filter//:com_zaxxer_HikariCP_5_1_0_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:com_nimbusds_lang_tag_1_7_extension\"\n  \"@unmanaged_deps_filter//:com_nimbusds_lang_tag_1_7_extension\" -> \"@@rules_jvm_external~~maven~com_nimbusds_lang_tag_1_7//file:file\"\n  \"@unmanaged_deps_filter//:com_nimbusds_lang_tag_1_7_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_lang_tag_1_7//file:file\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_lang_tag_1_7//file:file\" -> \"@@rules_jvm_external~~maven~com_nimbusds_lang_tag_1_7//file:v1/com/nimbusds/lang-tag/1.7/lang-tag-1.7.jar\"\n  \"@@rules_jvm_external~~maven~com_nimbusds_lang_tag_1_7//file:v1/com/nimbusds/lang-tag/1.7/lang-tag-1.7.jar\"\n  \"@@rules_jvm_external~~maven~jakarta_persistence_jakarta_persistence_api_3_1_0//file:v1/jakarta/persistence/jakarta.persistence-api/3.1.0/jakarta.persistence-api-3.1.0.jar\"\n  \"@unmanaged_deps_filter//:org/ow2/asm/asm/9.7.1/asm-9.7.1.jar\"\n  \"@unmanaged_deps_filter//:org/ow2/asm/asm/9.7.1/asm-9.7.1.jar\" -> \"@unmanaged_deps_filter//:org_ow2_asm_asm_9_7_1_extension\"\n  \"@unmanaged_deps_filter//:org_ow2_asm_asm_9_7_1_extension\"\n  \"@unmanaged_deps_filter//:org_ow2_asm_asm_9_7_1_extension\" -> \"@@rules_jvm_external~~maven~org_ow2_asm_asm_9_7_1//file:file\"\n  \"@unmanaged_deps_filter//:org_ow2_asm_asm_9_7_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_ow2_asm_asm_9_7_1//file:file\"\n  \"@@rules_jvm_external~~maven~org_ow2_asm_asm_9_7_1//file:file\" -> \"@@rules_jvm_external~~maven~org_ow2_asm_asm_9_7_1//file:v1/org/ow2/asm/asm/9.7.1/asm-9.7.1.jar\"\n  \"@@rules_jvm_external~~maven~org_ow2_asm_asm_9_7_1//file:v1/org/ow2/asm/asm/9.7.1/asm-9.7.1.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-data-jpa/3.3.11/spring-boot-starter-data-jpa-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-data-jpa/3.3.11/spring-boot-starter-data-jpa-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_data_jpa_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_data_jpa_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_data_jpa_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_data_jpa_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-data-jpa/3.3.11/spring-boot-starter-data-jpa-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_data_jpa_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-data-jpa/3.3.11/spring-boot-starter-data-jpa-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_jakarta9_1_13_13//file:file\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_jakarta9_1_13_13//file:file\" -> \"@@rules_jvm_external~~maven~io_micrometer_micrometer_jakarta9_1_13_13//file:v1/io/micrometer/micrometer-jakarta9/1.13.13/micrometer-jakarta9-1.13.13.jar\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_jakarta9_1_13_13//file:v1/io/micrometer/micrometer-jakarta9/1.13.13/micrometer-jakarta9-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:com_github_stephenc_jcip_jcip_annotations_1_0_1_extension\"\n  \"@unmanaged_deps_filter//:com_github_stephenc_jcip_jcip_annotations_1_0_1_extension\" -> \"@@rules_jvm_external~~maven~com_github_stephenc_jcip_jcip_annotations_1_0_1//file:file\"\n  \"@unmanaged_deps_filter//:com_github_stephenc_jcip_jcip_annotations_1_0_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~com_github_stephenc_jcip_jcip_annotations_1_0_1//file:file\"\n  \"@@rules_jvm_external~~maven~com_github_stephenc_jcip_jcip_annotations_1_0_1//file:file\" -> \"@@rules_jvm_external~~maven~com_github_stephenc_jcip_jcip_annotations_1_0_1//file:v1/com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar\"\n  \"@@rules_jvm_external~~maven~com_github_stephenc_jcip_jcip_annotations_1_0_1//file:v1/com/github/stephenc/jcip/jcip-annotations/1.0-1/jcip-annotations-1.0-1.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_tx_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_tx_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_tx_6_1_19//file:v1/org/springframework/spring-tx/6.1.19/spring-tx-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_tx_6_1_19//file:v1/org/springframework/spring-tx/6.1.19/spring-tx-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:io/projectreactor/reactor-core/3.6.15/reactor-core-3.6.15.jar\"\n  \"@unmanaged_deps_filter//:io/projectreactor/reactor-core/3.6.15/reactor-core-3.6.15.jar\" -> \"@unmanaged_deps_filter//:io_projectreactor_reactor_core_3_6_15_extension\"\n  \"@unmanaged_deps_filter//:io_projectreactor_reactor_core_3_6_15_extension\"\n  \"@unmanaged_deps_filter//:io_projectreactor_reactor_core_3_6_15_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:io_projectreactor_reactor_core_3_6_15_extension\" -> \"@@rules_jvm_external~~maven~io_projectreactor_reactor_core_3_6_15//file:file\"\n  \"@@rules_jvm_external~~maven~io_projectreactor_reactor_core_3_6_15//file:file\"\n  \"@@rules_jvm_external~~maven~io_projectreactor_reactor_core_3_6_15//file:file\" -> \"@@rules_jvm_external~~maven~io_projectreactor_reactor_core_3_6_15//file:v1/io/projectreactor/reactor-core/3.6.15/reactor-core-3.6.15.jar\"\n  \"@@rules_jvm_external~~maven~io_projectreactor_reactor_core_3_6_15//file:v1/io/projectreactor/reactor-core/3.6.15/reactor-core-3.6.15.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-actuator-autoconfigure/3.3.11/spring-boot-actuator-autoconfigure-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-actuator-autoconfigure/3.3.11/spring-boot-actuator-autoconfigure-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_actuator_autoconfigure_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_actuator_autoconfigure_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_actuator_autoconfigure_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_actuator_autoconfigure_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_actuator_autoconfigure_3_3_11//file:v1/org/springframework/boot/spring-boot-actuator-autoconfigure/3.3.11/spring-boot-actuator-autoconfigure-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_actuator_autoconfigure_3_3_11//file:v1/org/springframework/boot/spring-boot-actuator-autoconfigure/3.3.11/spring-boot-actuator-autoconfigure-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:jakarta/servlet/jsp/jakarta.servlet.jsp-api/3.1.1/jakarta.servlet.jsp-api-3.1.1.jar\"\n  \"@unmanaged_deps_filter//:jakarta/servlet/jsp/jakarta.servlet.jsp-api/3.1.1/jakarta.servlet.jsp-api-3.1.1.jar\" -> \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api_3_1_1_extension\"\n  \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api_3_1_1_extension\"\n  \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api_3_1_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api_3_1_1_extension\" -> \"@@rules_jvm_external~~maven~jakarta_servlet_jsp_jakarta_servlet_jsp_api_3_1_1//file:file\"\n  \"@@rules_jvm_external~~maven~jakarta_servlet_jsp_jakarta_servlet_jsp_api_3_1_1//file:file\"\n  \"@@rules_jvm_external~~maven~jakarta_servlet_jsp_jakarta_servlet_jsp_api_3_1_1//file:file\" -> \"@@rules_jvm_external~~maven~jakarta_servlet_jsp_jakarta_servlet_jsp_api_3_1_1//file:v1/jakarta/servlet/jsp/jakarta.servlet.jsp-api/3.1.1/jakarta.servlet.jsp-api-3.1.1.jar\"\n  \"@@rules_jvm_external~~maven~jakarta_servlet_jsp_jakarta_servlet_jsp_api_3_1_1//file:v1/jakarta/servlet/jsp/jakarta.servlet.jsp-api/3.1.1/jakarta.servlet.jsp-api-3.1.1.jar\"\n  \"@unmanaged_deps_filter//:com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar\"\n  \"@unmanaged_deps_filter//:com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar\" -> \"@unmanaged_deps_filter//:com_fasterxml_classmate_1_5_1_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_classmate_1_5_1_extension\"\n  \"@unmanaged_deps_filter//:com_fasterxml_classmate_1_5_1_extension\" -> \"@@rules_jvm_external~~maven~com_fasterxml_classmate_1_5_1//file:file\"\n  \"@unmanaged_deps_filter//:com_fasterxml_classmate_1_5_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_classmate_1_5_1//file:file\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_classmate_1_5_1//file:file\" -> \"@@rules_jvm_external~~maven~com_fasterxml_classmate_1_5_1//file:v1/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar\"\n  \"@@rules_jvm_external~~maven~com_fasterxml_classmate_1_5_1//file:v1/com/fasterxml/classmate/1.5.1/classmate-1.5.1.jar\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_core_1_13_13//file:file\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_core_1_13_13//file:file\" -> \"@@rules_jvm_external~~maven~io_micrometer_micrometer_core_1_13_13//file:v1/io/micrometer/micrometer-core/1.13.13/micrometer-core-1.13.13.jar\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_core_1_13_13//file:v1/io/micrometer/micrometer-core/1.13.13/micrometer-core-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-orm/6.1.19/spring-orm-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-orm/6.1.19/spring-orm-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_orm_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_orm_6_1_19//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_orm_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_orm_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_orm_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_orm_6_1_19//file:v1/org/springframework/spring-orm/6.1.19/spring-orm-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_orm_6_1_19//file:v1/org/springframework/spring-orm/6.1.19/spring-orm-6.1.19.jar\"\n  \"//:LICENSE.txt\\n@rules_license//licenses/spdx:Apache-2.0\"\n  \"@unmanaged_deps_filter//:net_bytebuddy_byte_buddy\"\n  \"@unmanaged_deps_filter//:net_bytebuddy_byte_buddy\" -> \"@unmanaged_deps_filter//:net/bytebuddy/byte-buddy/1.14.16/byte-buddy-1.14.16.jar\"\n  \"@unmanaged_deps_filter//:net_bytebuddy_byte_buddy\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:net_bytebuddy_byte_buddy\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:net/bytebuddy/byte-buddy/1.14.16/byte-buddy-1.14.16.jar\"\n  \"@unmanaged_deps_filter//:net/bytebuddy/byte-buddy/1.14.16/byte-buddy-1.14.16.jar\" -> \"@unmanaged_deps_filter//:net_bytebuddy_byte_buddy_1_14_16_extension\"\n  \"@unmanaged_deps_filter//:net_bytebuddy_byte_buddy_1_14_16_extension\"\n  \"@unmanaged_deps_filter//:net_bytebuddy_byte_buddy_1_14_16_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:net_bytebuddy_byte_buddy_1_14_16_extension\" -> \"@@rules_jvm_external~~maven~net_bytebuddy_byte_buddy_1_14_16//file:file\"\n  \"@@rules_jvm_external~~maven~net_bytebuddy_byte_buddy_1_14_16//file:file\"\n  \"@@rules_jvm_external~~maven~net_bytebuddy_byte_buddy_1_14_16//file:file\" -> \"@@rules_jvm_external~~maven~net_bytebuddy_byte_buddy_1_14_16//file:v1/net/bytebuddy/byte-buddy/1.14.16/byte-buddy-1.14.16.jar\"\n  \"@@rules_jvm_external~~maven~net_bytebuddy_byte_buddy_1_14_16//file:v1/net/bytebuddy/byte-buddy/1.14.16/byte-buddy-1.14.16.jar\"\n  \"@@rules_jvm_external~~maven~com_zaxxer_HikariCP_5_1_0//file:file\"\n  \"@@rules_jvm_external~~maven~com_zaxxer_HikariCP_5_1_0//file:file\" -> \"@@rules_jvm_external~~maven~com_zaxxer_HikariCP_5_1_0//file:v1/com/zaxxer/HikariCP/5.1.0/HikariCP-5.1.0.jar\"\n  \"@@rules_jvm_external~~maven~com_zaxxer_HikariCP_5_1_0//file:v1/com/zaxxer/HikariCP/5.1.0/HikariCP-5.1.0.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter/3.3.11/spring-boot-starter-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\" -> \"@unmanaged_deps_filter//:jakarta_annotation_jakarta_annotation_api\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-logging/3.3.11/spring-boot-starter-logging-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging\" -> \"@unmanaged_deps_filter//:ch_qos_logback_logback_classic\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging\" -> \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_to_slf4j\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging\" -> \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\"\n  \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\" -> \"@unmanaged_deps_filter//:org/slf4j/jul-to-slf4j/2.0.17/jul-to-slf4j-2.0.17.jar\"\n  \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/slf4j/jul-to-slf4j/2.0.17/jul-to-slf4j-2.0.17.jar\"\n  \"@unmanaged_deps_filter//:org/slf4j/jul-to-slf4j/2.0.17/jul-to-slf4j-2.0.17.jar\" -> \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j_2_0_17_extension\"\n  \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j_2_0_17_extension\"\n  \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j_2_0_17_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_slf4j_jul_to_slf4j_2_0_17_extension\" -> \"@@rules_jvm_external~~maven~org_slf4j_jul_to_slf4j_2_0_17//file:file\"\n  \"@@rules_jvm_external~~maven~org_slf4j_jul_to_slf4j_2_0_17//file:file\"\n  \"@@rules_jvm_external~~maven~org_slf4j_jul_to_slf4j_2_0_17//file:file\" -> \"@@rules_jvm_external~~maven~org_slf4j_jul_to_slf4j_2_0_17//file:v1/org/slf4j/jul-to-slf4j/2.0.17/jul-to-slf4j-2.0.17.jar\"\n  \"@@rules_jvm_external~~maven~org_slf4j_jul_to_slf4j_2_0_17//file:v1/org/slf4j/jul-to-slf4j/2.0.17/jul-to-slf4j-2.0.17.jar\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_to_slf4j\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_to_slf4j\" -> \"@unmanaged_deps_filter//:org/apache/logging/log4j/log4j-to-slf4j/2.23.1/log4j-to-slf4j-2.23.1.jar\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_to_slf4j\" -> \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_api\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_to_slf4j\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_to_slf4j\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_api\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_api\" -> \"@unmanaged_deps_filter//:org/apache/logging/log4j/log4j-api/2.23.1/log4j-api-2.23.1.jar\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_api\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_api\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org/apache/logging/log4j/log4j-api/2.23.1/log4j-api-2.23.1.jar\"\n  \"@unmanaged_deps_filter//:org/apache/logging/log4j/log4j-api/2.23.1/log4j-api-2.23.1.jar\" -> \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_api_2_23_1_extension\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_api_2_23_1_extension\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_api_2_23_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_api_2_23_1_extension\" -> \"@@rules_jvm_external~~maven~org_apache_logging_log4j_log4j_api_2_23_1//file:file\"\n  \"@@rules_jvm_external~~maven~org_apache_logging_log4j_log4j_api_2_23_1//file:file\"\n  \"@@rules_jvm_external~~maven~org_apache_logging_log4j_log4j_api_2_23_1//file:file\" -> \"@@rules_jvm_external~~maven~org_apache_logging_log4j_log4j_api_2_23_1//file:v1/org/apache/logging/log4j/log4j-api/2.23.1/log4j-api-2.23.1.jar\"\n  \"@@rules_jvm_external~~maven~org_apache_logging_log4j_log4j_api_2_23_1//file:v1/org/apache/logging/log4j/log4j-api/2.23.1/log4j-api-2.23.1.jar\"\n  \"@unmanaged_deps_filter//:org/apache/logging/log4j/log4j-to-slf4j/2.23.1/log4j-to-slf4j-2.23.1.jar\"\n  \"@unmanaged_deps_filter//:org/apache/logging/log4j/log4j-to-slf4j/2.23.1/log4j-to-slf4j-2.23.1.jar\" -> \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_to_slf4j_2_23_1_extension\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_to_slf4j_2_23_1_extension\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_to_slf4j_2_23_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_apache_logging_log4j_log4j_to_slf4j_2_23_1_extension\" -> \"@@rules_jvm_external~~maven~org_apache_logging_log4j_log4j_to_slf4j_2_23_1//file:file\"\n  \"@@rules_jvm_external~~maven~org_apache_logging_log4j_log4j_to_slf4j_2_23_1//file:file\"\n  \"@@rules_jvm_external~~maven~org_apache_logging_log4j_log4j_to_slf4j_2_23_1//file:file\" -> \"@@rules_jvm_external~~maven~org_apache_logging_log4j_log4j_to_slf4j_2_23_1//file:v1/org/apache/logging/log4j/log4j-to-slf4j/2.23.1/log4j-to-slf4j-2.23.1.jar\"\n  \"@@rules_jvm_external~~maven~org_apache_logging_log4j_log4j_to_slf4j_2_23_1//file:v1/org/apache/logging/log4j/log4j-to-slf4j/2.23.1/log4j-to-slf4j-2.23.1.jar\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_classic\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_classic\" -> \"@unmanaged_deps_filter//:ch/qos/logback/logback-classic/1.5.18/logback-classic-1.5.18.jar\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_classic\" -> \"@unmanaged_deps_filter//:ch_qos_logback_logback_core\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_classic\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_classic\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_core\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_core\" -> \"@unmanaged_deps_filter//:ch/qos/logback/logback-core/1.5.18/logback-core-1.5.18.jar\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_core\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_core\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:ch/qos/logback/logback-core/1.5.18/logback-core-1.5.18.jar\"\n  \"@unmanaged_deps_filter//:ch/qos/logback/logback-core/1.5.18/logback-core-1.5.18.jar\" -> \"@unmanaged_deps_filter//:ch_qos_logback_logback_core_1_5_18_extension\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_core_1_5_18_extension\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_core_1_5_18_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_core_1_5_18_extension\" -> \"@@rules_jvm_external~~maven~ch_qos_logback_logback_core_1_5_18//file:file\"\n  \"@@rules_jvm_external~~maven~ch_qos_logback_logback_core_1_5_18//file:file\"\n  \"@@rules_jvm_external~~maven~ch_qos_logback_logback_core_1_5_18//file:file\" -> \"@@rules_jvm_external~~maven~ch_qos_logback_logback_core_1_5_18//file:v1/ch/qos/logback/logback-core/1.5.18/logback-core-1.5.18.jar\"\n  \"@@rules_jvm_external~~maven~ch_qos_logback_logback_core_1_5_18//file:v1/ch/qos/logback/logback-core/1.5.18/logback-core-1.5.18.jar\"\n  \"@unmanaged_deps_filter//:ch/qos/logback/logback-classic/1.5.18/logback-classic-1.5.18.jar\"\n  \"@unmanaged_deps_filter//:ch/qos/logback/logback-classic/1.5.18/logback-classic-1.5.18.jar\" -> \"@unmanaged_deps_filter//:ch_qos_logback_logback_classic_1_5_18_extension\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_classic_1_5_18_extension\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_classic_1_5_18_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:ch_qos_logback_logback_classic_1_5_18_extension\" -> \"@@rules_jvm_external~~maven~ch_qos_logback_logback_classic_1_5_18//file:file\"\n  \"@@rules_jvm_external~~maven~ch_qos_logback_logback_classic_1_5_18//file:file\"\n  \"@@rules_jvm_external~~maven~ch_qos_logback_logback_classic_1_5_18//file:file\" -> \"@@rules_jvm_external~~maven~ch_qos_logback_logback_classic_1_5_18//file:v1/ch/qos/logback/logback-classic/1.5.18/logback-classic-1.5.18.jar\"\n  \"@@rules_jvm_external~~maven~ch_qos_logback_logback_classic_1_5_18//file:v1/ch/qos/logback/logback-classic/1.5.18/logback-classic-1.5.18.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-logging/3.3.11/spring-boot-starter-logging-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter-logging/3.3.11/spring-boot-starter-logging-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_logging_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_logging_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_logging_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_logging_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_logging_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-logging/3.3.11/spring-boot-starter-logging-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_logging_3_3_11//file:v1/org/springframework/boot/spring-boot-starter-logging/3.3.11/spring-boot-starter-logging-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-autoconfigure/3.3.11/spring-boot-autoconfigure-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-autoconfigure/3.3.11/spring-boot-autoconfigure-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-autoconfigure/3.3.11/spring-boot-autoconfigure-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_autoconfigure_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_autoconfigure_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_autoconfigure_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_autoconfigure_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_autoconfigure_3_3_11//file:v1/org/springframework/boot/spring-boot-autoconfigure/3.3.11/spring-boot-autoconfigure-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_autoconfigure_3_3_11//file:v1/org/springframework/boot/spring-boot-autoconfigure/3.3.11/spring-boot-autoconfigure-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot\" -> \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot/3.3.11/spring-boot-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot\" -> \"@unmanaged_deps_filter//:org_springframework_spring_context\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context\" -> \"@unmanaged_deps_filter//:org/springframework/spring-context/6.1.19/spring-context-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context\" -> \"@unmanaged_deps_filter//:org_springframework_spring_aop\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context\" -> \"@unmanaged_deps_filter//:org_springframework_spring_expression\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_expression\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_expression\" -> \"@unmanaged_deps_filter//:org/springframework/spring-expression/6.1.19/spring-expression-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_expression\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_expression\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_expression\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-expression/6.1.19/spring-expression-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-expression/6.1.19/spring-expression-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_expression_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_expression_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_expression_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_expression_6_1_19//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_expression_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_expression_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_expression_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_expression_6_1_19//file:v1/org/springframework/spring-expression/6.1.19/spring-expression-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_expression_6_1_19//file:v1/org/springframework/spring-expression/6.1.19/spring-expression-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aop\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aop\" -> \"@unmanaged_deps_filter//:org/springframework/spring-aop/6.1.19/spring-aop-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aop\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aop\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aop\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aop\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_beans\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_beans\" -> \"@unmanaged_deps_filter//:org/springframework/spring-beans/6.1.19/spring-beans-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_beans\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_beans\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_beans\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_core\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_core\" -> \"@unmanaged_deps_filter//:org/springframework/spring-core/6.1.19/spring-core-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_core\" -> \"@unmanaged_deps_filter//:org_springframework_spring_jcl\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_core\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_core\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jcl\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jcl\" -> \"@unmanaged_deps_filter//:org/springframework/spring-jcl/6.1.19/spring-jcl-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jcl\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jcl\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-jcl/6.1.19/spring-jcl-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-jcl/6.1.19/spring-jcl-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_jcl_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jcl_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jcl_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_jcl_6_1_19//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_jcl_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_jcl_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_jcl_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_jcl_6_1_19//file:v1/org/springframework/spring-jcl/6.1.19/spring-jcl-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_jcl_6_1_19//file:v1/org/springframework/spring-jcl/6.1.19/spring-jcl-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-core/6.1.19/spring-core-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-core/6.1.19/spring-core-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_core_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_core_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_core_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_core_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_core_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_core_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_core_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_core_6_1_19//file:v1/org/springframework/spring-core/6.1.19/spring-core-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_core_6_1_19//file:v1/org/springframework/spring-core/6.1.19/spring-core-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-beans/6.1.19/spring-beans-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-beans/6.1.19/spring-beans-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_beans_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_beans_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_beans_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_beans_6_1_19//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_beans_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_beans_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_beans_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_beans_6_1_19//file:v1/org/springframework/spring-beans/6.1.19/spring-beans-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_beans_6_1_19//file:v1/org/springframework/spring-beans/6.1.19/spring-beans-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-aop/6.1.19/spring-aop-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-aop/6.1.19/spring-aop-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_aop_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aop_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aop_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_aop_6_1_19//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_aop_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_aop_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_aop_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_aop_6_1_19//file:v1/org/springframework/spring-aop/6.1.19/spring-aop-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_aop_6_1_19//file:v1/org/springframework/spring-aop/6.1.19/spring-aop-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\" -> \"@unmanaged_deps_filter//:io/micrometer/micrometer-observation/1.13.13/micrometer-observation-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\" -> \"@unmanaged_deps_filter//:io/micrometer/micrometer-commons/1.13.13/micrometer-commons-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@unmanaged_deps_filter//:io/micrometer/micrometer-commons/1.13.13/micrometer-commons-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:io/micrometer/micrometer-commons/1.13.13/micrometer-commons-1.13.13.jar\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons_1_13_13_extension\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons_1_13_13_extension\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons_1_13_13_extension\" -> \"@@rules_jvm_external~~maven~io_micrometer_micrometer_commons_1_13_13//file:file\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_commons_1_13_13_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_commons_1_13_13//file:file\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_commons_1_13_13//file:file\" -> \"@@rules_jvm_external~~maven~io_micrometer_micrometer_commons_1_13_13//file:v1/io/micrometer/micrometer-commons/1.13.13/micrometer-commons-1.13.13.jar\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_commons_1_13_13//file:v1/io/micrometer/micrometer-commons/1.13.13/micrometer-commons-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:io/micrometer/micrometer-observation/1.13.13/micrometer-observation-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:io/micrometer/micrometer-observation/1.13.13/micrometer-observation-1.13.13.jar\" -> \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation_1_13_13_extension\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation_1_13_13_extension\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation_1_13_13_extension\" -> \"@@rules_jvm_external~~maven~io_micrometer_micrometer_observation_1_13_13//file:file\"\n  \"@unmanaged_deps_filter//:io_micrometer_micrometer_observation_1_13_13_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_observation_1_13_13//file:file\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_observation_1_13_13//file:file\" -> \"@@rules_jvm_external~~maven~io_micrometer_micrometer_observation_1_13_13//file:v1/io/micrometer/micrometer-observation/1.13.13/micrometer-observation-1.13.13.jar\"\n  \"@@rules_jvm_external~~maven~io_micrometer_micrometer_observation_1_13_13//file:v1/io/micrometer/micrometer-observation/1.13.13/micrometer-observation-1.13.13.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-context/6.1.19/spring-context-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/spring-context/6.1.19/spring-context-6.1.19.jar\" -> \"@unmanaged_deps_filter//:org_springframework_spring_context_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context_6_1_19_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context_6_1_19_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_context_6_1_19//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_spring_context_6_1_19_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_context_6_1_19//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_context_6_1_19//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_spring_context_6_1_19//file:v1/org/springframework/spring-context/6.1.19/spring-context-6.1.19.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_spring_context_6_1_19//file:v1/org/springframework/spring-context/6.1.19/spring-context-6.1.19.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot/3.3.11/spring-boot-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot/3.3.11/spring-boot-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_3_3_11//file:v1/org/springframework/boot/spring-boot/3.3.11/spring-boot-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_3_3_11//file:v1/org/springframework/boot/spring-boot/3.3.11/spring-boot-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:jakarta_annotation_jakarta_annotation_api\"\n  \"@unmanaged_deps_filter//:jakarta_annotation_jakarta_annotation_api\" -> \"@unmanaged_deps_filter//:jakarta/annotation/jakarta.annotation-api/2.1.1/jakarta.annotation-api-2.1.1.jar\"\n  \"@unmanaged_deps_filter//:jakarta_annotation_jakarta_annotation_api\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@unmanaged_deps_filter//:jakarta_annotation_jakarta_annotation_api\" -> \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@rules_jvm_external//settings:stamp_manifest\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry.java\\n@bazel_tools//tools/jdk:launcher_flag_alias\\n@bazel_tools//tools/jdk:java_stub_template.txt\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\" -> \"@bazel_tools//tools/cpp:optional_current_cc_toolchain\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\" -> \"@bazel_tools//tools/launcher:launcher_maker\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\" -> \"@bazel_tools//tools/jdk:toolchain_type\\n@bazel_tools//tools/jdk:java_plugins_flag_alias\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\" -> \"@bazel_tools//tools/jdk:current_java_toolchain\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:rules_jvm_external\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/zip:zip\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry\" -> \"@bazel_tools//tools/launcher:launcher\"\n  \"@bazel_tools//tools/launcher:launcher\"\n  \"@bazel_tools//tools/launcher:launcher\" -> \"@bazel_tools//tools/launcher:launcher_windows\"\n  [label=\"@@bazel_tools//src/conditions:host_windows\"];\n  \"@bazel_tools//tools/launcher:launcher\" -> \"@bazel_tools//src/tools/launcher:launcher\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//tools/launcher:launcher\" -> \"@bazel_tools//src/conditions:host_windows\"\n  \"@bazel_tools//tools/launcher:launcher_windows\"\n  \"@bazel_tools//tools/launcher:launcher_windows\" -> \"@bazel_tools//tools/launcher:launcher.exe\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//tools/launcher:launcher_windows\" -> \"@bazel_tools//src/tools/launcher:launcher\"\n  [label=\"@@bazel_tools//src/conditions:remote\"];\n  \"@bazel_tools//tools/launcher:launcher_windows\" -> \"@bazel_tools//src/conditions:remote\"\n  \"@bazel_tools//src/tools/launcher:launcher\"\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//src/tools/launcher:dummy.cc\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//src/tools/launcher:launcher_main.cc\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//src/tools/launcher:bash_launcher\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//src/tools/launcher:java_launcher\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//src/tools/launcher:launcher_base\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//src/tools/launcher:python_launcher\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//tools/cpp:toolchain_type\"\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//tools/cpp:link_extra_lib\"\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//tools/cpp:malloc\"\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//src/tools/launcher/util:data_parser\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//src/tools/launcher/util:util\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher\" -> \"@bazel_tools//src/conditions:windows\"\n  \"@bazel_tools//src/tools/launcher:python_launcher\"\n  \"@bazel_tools//src/tools/launcher:python_launcher\" -> \"@bazel_tools//src/tools/launcher:dummy.cc\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//src/tools/launcher:python_launcher\" -> \"@bazel_tools//src/tools/launcher:python_launcher.h\\n@bazel_tools//src/tools/launcher:python_launcher.cc\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:python_launcher\" -> \"@bazel_tools//src/tools/launcher:launcher_base\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:python_launcher\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/tools/launcher:python_launcher\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/tools/launcher:python_launcher\" -> \"@bazel_tools//src/main/native/windows:lib-process\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:python_launcher\" -> \"@bazel_tools//src/conditions:windows\"\n  \"@bazel_tools//src/tools/launcher:python_launcher.h\\n@bazel_tools//src/tools/launcher:python_launcher.cc\"\n  \"@bazel_tools//src/tools/launcher:java_launcher\"\n  \"@bazel_tools//src/tools/launcher:java_launcher\" -> \"@bazel_tools//src/tools/launcher:dummy.cc\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//src/tools/launcher:java_launcher\" -> \"@bazel_tools//src/tools/launcher:java_launcher.cc\\n@bazel_tools//src/tools/launcher:java_launcher.h\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:java_launcher\" -> \"@bazel_tools//src/tools/launcher:launcher_base\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:java_launcher\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/tools/launcher:java_launcher\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/tools/launcher:java_launcher\" -> \"@bazel_tools//src/main/native/windows:lib-process\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:java_launcher\" -> \"@bazel_tools//src/conditions:windows\"\n  \"@bazel_tools//src/main/native/windows:lib-process\"\n  \"@bazel_tools//src/main/native/windows:lib-process\" -> \"@bazel_tools//src/main/native/windows:process.h\\n@bazel_tools//src/main/native/windows:process.cc\"\n  \"@bazel_tools//src/main/native/windows:lib-process\" -> \"@bazel_tools//src/main/native/windows:lib-file\"\n  \"@bazel_tools//src/main/native/windows:lib-process\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/main/native/windows:lib-process\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/main/native/windows:process.h\\n@bazel_tools//src/main/native/windows:process.cc\"\n  \"@bazel_tools//src/tools/launcher:java_launcher.cc\\n@bazel_tools//src/tools/launcher:java_launcher.h\"\n  \"@bazel_tools//src/tools/launcher:bash_launcher\"\n  \"@bazel_tools//src/tools/launcher:bash_launcher\" -> \"@bazel_tools//src/tools/launcher:dummy.cc\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//src/tools/launcher:bash_launcher\" -> \"@bazel_tools//src/tools/launcher:bash_launcher.h\\n@bazel_tools//src/tools/launcher:bash_launcher.cc\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:bash_launcher\" -> \"@bazel_tools//src/tools/launcher:launcher_base\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:bash_launcher\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/tools/launcher:bash_launcher\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/tools/launcher:bash_launcher\" -> \"@bazel_tools//src/conditions:windows\"\n  \"@bazel_tools//src/tools/launcher:launcher_base\"\n  \"@bazel_tools//src/tools/launcher:launcher_base\" -> \"@bazel_tools//src/tools/launcher:dummy.cc\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//src/tools/launcher:launcher_base\" -> \"@bazel_tools//src/tools/launcher:launcher.h\\n@bazel_tools//src/tools/launcher:launcher.cc\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher_base\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/tools/launcher:launcher_base\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/tools/launcher:launcher_base\" -> \"@bazel_tools//src/tools/launcher/util:data_parser\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher_base\" -> \"@bazel_tools//src/tools/launcher/util:util\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher_base\" -> \"@bazel_tools//src/main/cpp/util:filesystem\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher_base\" -> \"@bazel_tools//src/conditions:windows\"\n  \"@bazel_tools//src/tools/launcher/util:data_parser\"\n  \"@bazel_tools//src/tools/launcher/util:data_parser\" -> \"@bazel_tools//src/tools/launcher/util:dummy.cc\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//src/tools/launcher/util:data_parser\" -> \"@bazel_tools//src/tools/launcher/util:data_parser.h\\n@bazel_tools//src/tools/launcher/util:data_parser.cc\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher/util:data_parser\" -> \"@bazel_tools//src/tools/launcher/util:util\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher/util:data_parser\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/tools/launcher/util:data_parser\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/tools/launcher/util:data_parser\" -> \"@bazel_tools//src/conditions:windows\"\n  \"@bazel_tools//src/tools/launcher/util:util\"\n  \"@bazel_tools//src/tools/launcher/util:util\" -> \"@bazel_tools//src/tools/launcher/util:dummy.cc\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//src/tools/launcher/util:util\" -> \"@bazel_tools//src/tools/launcher/util:launcher_util.cc\\n@bazel_tools//src/tools/launcher/util:launcher_util.h\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher/util:util\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/tools/launcher/util:util\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/tools/launcher/util:util\" -> \"@bazel_tools//src/main/cpp/util:filesystem\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/tools/launcher/util:util\" -> \"@bazel_tools//src/conditions:windows\"\n  \"@bazel_tools//src/tools/launcher/util:launcher_util.cc\\n@bazel_tools//src/tools/launcher/util:launcher_util.h\"\n  \"@bazel_tools//src/tools/launcher/util:data_parser.h\\n@bazel_tools//src/tools/launcher/util:data_parser.cc\"\n  \"@bazel_tools//src/tools/launcher/util:dummy.cc\"\n  \"@bazel_tools//src/tools/launcher:launcher.h\\n@bazel_tools//src/tools/launcher:launcher.cc\"\n  \"@bazel_tools//src/tools/launcher:bash_launcher.h\\n@bazel_tools//src/tools/launcher:bash_launcher.cc\"\n  \"@bazel_tools//src/tools/launcher:launcher_main.cc\"\n  \"@bazel_tools//src/tools/launcher:dummy.cc\"\n  \"@bazel_tools//tools/launcher:launcher.exe\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/zip:zip\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/zip:zip\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/zip:StableZipEntry.java\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/zip:zip\" -> \"@bazel_tools//tools/jdk:toolchain_type\\n@bazel_tools//tools/jdk:java_plugins_flag_alias\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/zip:zip\" -> \"@bazel_tools//tools/jdk:current_java_toolchain\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/zip:StableZipEntry.java\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:rules_jvm_external\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:rules_jvm_external\" -> \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:ByteStreams.java\\n@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:Coordinates.java\\n@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:Hasher.java\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:rules_jvm_external\" -> \"@bazel_tools//tools/jdk:toolchain_type\\n@bazel_tools//tools/jdk:java_plugins_flag_alias\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:rules_jvm_external\" -> \"@bazel_tools//tools/jdk:current_java_toolchain\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:ByteStreams.java\\n@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:Coordinates.java\\n@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external:Hasher.java\"\n  \"@bazel_tools//tools/jdk:current_java_toolchain\"\n  \"@bazel_tools//tools/jdk:current_java_toolchain\" -> \"@@rules_java~//toolchains:current_java_toolchain\"\n  \"@@rules_java~//toolchains:current_java_toolchain\"\n  \"@bazel_tools//tools/jdk:toolchain_type\\n@bazel_tools//tools/jdk:java_plugins_flag_alias\"\n  \"@bazel_tools//tools/launcher:launcher_maker\"\n  \"@bazel_tools//tools/launcher:launcher_maker\" -> \"@bazel_tools//tools/launcher:launcher_maker_windows\"\n  [label=\"@@bazel_tools//src/conditions:host_windows\"];\n  \"@bazel_tools//tools/launcher:launcher_maker\" -> \"@bazel_tools//src/tools/launcher:launcher_maker\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//tools/launcher:launcher_maker\" -> \"@bazel_tools//src/conditions:host_windows\"\n  \"@bazel_tools//tools/launcher:launcher_maker_windows\"\n  \"@bazel_tools//tools/launcher:launcher_maker_windows\" -> \"@bazel_tools//tools/launcher:launcher_maker.exe\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//tools/launcher:launcher_maker_windows\" -> \"@bazel_tools//src/conditions:remote\"\n  \"@bazel_tools//tools/launcher:launcher_maker_windows\" -> \"@bazel_tools//src/tools/launcher:launcher_maker\"\n  [label=\"@@bazel_tools//src/conditions:remote\"];\n  \"@bazel_tools//src/tools/launcher:launcher_maker\"\n  \"@bazel_tools//src/tools/launcher:launcher_maker\" -> \"@bazel_tools//src/tools/launcher:launcher_maker.cc\"\n  \"@bazel_tools//src/tools/launcher:launcher_maker\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/tools/launcher:launcher_maker\" -> \"@bazel_tools//tools/cpp:toolchain_type\"\n  \"@bazel_tools//src/tools/launcher:launcher_maker\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/tools/launcher:launcher_maker\" -> \"@bazel_tools//tools/cpp:link_extra_lib\"\n  \"@bazel_tools//src/tools/launcher:launcher_maker\" -> \"@bazel_tools//tools/cpp:malloc\"\n  \"@bazel_tools//src/tools/launcher:launcher_maker\" -> \"@bazel_tools//src/main/cpp/util:filesystem\"\n  [label=\"@@platforms//os:windows\"];\n  \"@bazel_tools//src/tools/launcher:launcher_maker\" -> \"@platforms//os:windows\"\n  \"@bazel_tools//src/main/cpp/util:filesystem\"\n  \"@bazel_tools//src/main/cpp/util:filesystem\" -> \"@bazel_tools//src/main/cpp/util:ijar\"\n  \"@bazel_tools//src/main/cpp/util:filesystem\" -> \"@bazel_tools//src/main/cpp/util:file.cc\\n@bazel_tools//src/main/cpp/util:path.cc\\n@bazel_tools//src/main/cpp/util:path_windows.cc\\n@bazel_tools//src/main/cpp/util:path_posix.cc\\n@bazel_tools//src/main/cpp/util:file.h\\n@bazel_tools//src/main/cpp/util:file_windows.cc\\n@bazel_tools//src/main/cpp/util:file_posix.cc\\n@bazel_tools//src/main/cpp/util:path.h\\n@bazel_tools//src/main/cpp/util:path_platform.h\\n@bazel_tools//src/main/cpp/util:file_platform.h\"\n  [label=\"@@bazel_tools//src/conditions:windows//conditions:default\"];\n  \"@bazel_tools//src/main/cpp/util:filesystem\" -> \"@bazel_tools//src/main/cpp/util:blaze_exit_code\"\n  \"@bazel_tools//src/main/cpp/util:filesystem\" -> \"@bazel_tools//src/main/cpp/util:errors\"\n  \"@bazel_tools//src/main/cpp/util:filesystem\" -> \"@bazel_tools//src/main/cpp/util:logging\"\n  \"@bazel_tools//src/main/cpp/util:filesystem\" -> \"@bazel_tools//src/main/cpp/util:strings\"\n  \"@bazel_tools//src/main/cpp/util:filesystem\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/main/cpp/util:filesystem\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/main/cpp/util:filesystem\" -> \"@bazel_tools//src/main/native/windows:lib-file\"\n  [label=\"@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/main/cpp/util:filesystem\" -> \"@bazel_tools//src/conditions:windows\"\n  \"@bazel_tools//src/main/native/windows:lib-file\"\n  \"@bazel_tools//src/main/native/windows:lib-file\" -> \"@bazel_tools//src/main/native/windows:util.cc\\n@bazel_tools//src/main/native/windows:util.h\\n@bazel_tools//src/main/native/windows:file.cc\\n@bazel_tools//src/main/native/windows:file.h\"\n  \"@bazel_tools//src/main/native/windows:lib-file\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/main/native/windows:lib-file\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/main/native/windows:util.cc\\n@bazel_tools//src/main/native/windows:util.h\\n@bazel_tools//src/main/native/windows:file.cc\\n@bazel_tools//src/main/native/windows:file.h\"\n  \"@bazel_tools//src/main/cpp/util:errors\"\n  \"@bazel_tools//src/main/cpp/util:errors\" -> \"@bazel_tools//src/main/cpp/util:ijar\"\n  \"@bazel_tools//src/main/cpp/util:errors\" -> \"@bazel_tools//src/main/cpp/util:errors_posix.cc\\n@bazel_tools//src/main/cpp/util:errors_windows.cc\\n@bazel_tools//src/main/cpp/util:errors.h\"\n  [label=\"//conditions:default@@bazel_tools//src/conditions:windows\"];\n  \"@bazel_tools//src/main/cpp/util:errors\" -> \"@bazel_tools//src/main/cpp/util:logging\"\n  \"@bazel_tools//src/main/cpp/util:errors\" -> \"@bazel_tools//src/main/cpp/util:port\"\n  \"@bazel_tools//src/main/cpp/util:errors\" -> \"@bazel_tools//src/main/cpp/util:strings\"\n  \"@bazel_tools//src/main/cpp/util:errors\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/main/cpp/util:errors\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/main/cpp/util:errors\" -> \"@bazel_tools//src/conditions:windows\"\n  \"@bazel_tools//src/conditions:windows\"\n  \"@bazel_tools//src/conditions:windows\" -> \"@platforms//os:windows\"\n  \"@platforms//os:windows\"\n  \"@platforms//os:windows\" -> \"@platforms//os:os\"\n  \"@platforms//os:os\"\n  \"@bazel_tools//src/main/cpp/util:port\"\n  \"@bazel_tools//src/main/cpp/util:port\" -> \"@bazel_tools//src/main/cpp/util:port.cc\\n@bazel_tools//src/main/cpp/util:port.h\"\n  \"@bazel_tools//src/main/cpp/util:port\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/main/cpp/util:port\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/main/cpp/util:port.cc\\n@bazel_tools//src/main/cpp/util:port.h\"\n  \"@bazel_tools//src/main/cpp/util:logging\"\n  \"@bazel_tools//src/main/cpp/util:logging\" -> \"@bazel_tools//src/main/cpp/util:logging.h\\n@bazel_tools//src/main/cpp/util:logging.cc\"\n  \"@bazel_tools//src/main/cpp/util:logging\" -> \"@bazel_tools//src/main/cpp/util:blaze_exit_code\"\n  \"@bazel_tools//src/main/cpp/util:logging\" -> \"@bazel_tools//src/main/cpp/util:strings\"\n  \"@bazel_tools//src/main/cpp/util:logging\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/main/cpp/util:logging\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/main/cpp/util:strings\"\n  \"@bazel_tools//src/main/cpp/util:strings\" -> \"@bazel_tools//src/main/cpp/util:strings.cc\\n@bazel_tools//src/main/cpp/util:strings.h\"\n  \"@bazel_tools//src/main/cpp/util:strings\" -> \"@bazel_tools//src/main/cpp/util:blaze_exit_code\"\n  \"@bazel_tools//src/main/cpp/util:strings\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/main/cpp/util:strings\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/main/cpp/util:strings.cc\\n@bazel_tools//src/main/cpp/util:strings.h\"\n  \"@bazel_tools//src/main/cpp/util:logging.h\\n@bazel_tools//src/main/cpp/util:logging.cc\"\n  \"@bazel_tools//src/main/cpp/util:errors_posix.cc\\n@bazel_tools//src/main/cpp/util:errors_windows.cc\\n@bazel_tools//src/main/cpp/util:errors.h\"\n  \"@bazel_tools//src/main/cpp/util:blaze_exit_code\"\n  \"@bazel_tools//src/main/cpp/util:blaze_exit_code\" -> \"@bazel_tools//src/main/cpp/util:exit_code.h\"\n  \"@bazel_tools//src/main/cpp/util:blaze_exit_code\" -> \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//src/main/cpp/util:blaze_exit_code\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//src/main/cpp/util:exit_code.h\"\n  \"@bazel_tools//src/main/cpp/util:file.cc\\n@bazel_tools//src/main/cpp/util:path.cc\\n@bazel_tools//src/main/cpp/util:path_windows.cc\\n@bazel_tools//src/main/cpp/util:path_posix.cc\\n@bazel_tools//src/main/cpp/util:file.h\\n@bazel_tools//src/main/cpp/util:file_windows.cc\\n@bazel_tools//src/main/cpp/util:file_posix.cc\\n@bazel_tools//src/main/cpp/util:path.h\\n@bazel_tools//src/main/cpp/util:path_platform.h\\n@bazel_tools//src/main/cpp/util:file_platform.h\"\n  \"@bazel_tools//src/main/cpp/util:ijar\"\n  \"@bazel_tools//tools/def_parser:def_parser\"\n  \"@bazel_tools//tools/def_parser:def_parser\" -> \"@bazel_tools//tools/def_parser:def_parser_windows\"\n  [label=\"@@bazel_tools//src/conditions:host_windows\"];\n  \"@bazel_tools//tools/def_parser:def_parser\" -> \"@bazel_tools//tools/def_parser:no_op.bat\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//tools/def_parser:def_parser\" -> \"@bazel_tools//src/conditions:host_windows\"\n  \"@bazel_tools//src/conditions:host_windows\"\n  \"@bazel_tools//src/conditions:host_windows\" -> \"@bazel_tools//src/conditions:host_windows_x64_constraint\\n@bazel_tools//src/conditions:host_windows_arm64_constraint\"\n  [label=\"//conditions:default@@bazel_tools//src/conditions:host_windows_arm64_constraint\"];\n  \"@bazel_tools//src/conditions:host_windows_x64_constraint\\n@bazel_tools//src/conditions:host_windows_arm64_constraint\"\n  \"@bazel_tools//tools/def_parser:no_op.bat\"\n  \"@bazel_tools//tools/def_parser:def_parser_windows\"\n  \"@bazel_tools//tools/def_parser:def_parser_windows\" -> \"@bazel_tools//tools/def_parser:def_parser.exe\"\n  [label=\"//conditions:default\"];\n  \"@bazel_tools//tools/def_parser:def_parser_windows\" -> \"@bazel_tools//third_party/def_parser:def_parser\"\n  [label=\"@@bazel_tools//src/conditions:remote\"];\n  \"@bazel_tools//tools/def_parser:def_parser_windows\" -> \"@bazel_tools//src/conditions:remote\"\n  \"@bazel_tools//third_party/def_parser:def_parser\"\n  \"@bazel_tools//third_party/def_parser:def_parser\" -> \"@bazel_tools//third_party/def_parser:def_parser_main.cc\"\n  \"@bazel_tools//third_party/def_parser:def_parser\" -> \"@bazel_tools//third_party/def_parser:def_parser_lib\"\n  \"@bazel_tools//third_party/def_parser:def_parser\" -> \"@bazel_tools//tools/cpp:toolchain_type\"\n  \"@bazel_tools//third_party/def_parser:def_parser\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//third_party/def_parser:def_parser\" -> \"@bazel_tools//tools/cpp:link_extra_lib\"\n  \"@bazel_tools//third_party/def_parser:def_parser\" -> \"@bazel_tools//tools/cpp:malloc\"\n  \"@bazel_tools//tools/cpp:malloc\"\n  \"@bazel_tools//tools/cpp:malloc\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//tools/cpp:link_extra_lib\"\n  \"@bazel_tools//tools/cpp:link_extra_lib\" -> \"@bazel_tools//tools/cpp:link_extra_libs\"\n  \"@bazel_tools//tools/cpp:link_extra_lib\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//tools/cpp:link_extra_libs\"\n  \"@bazel_tools//tools/cpp:link_extra_libs\" -> \"@bazel_tools//tools/cpp:empty_lib\"\n  \"@bazel_tools//tools/cpp:empty_lib\"\n  \"@bazel_tools//tools/cpp:empty_lib\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//third_party/def_parser:def_parser_lib\"\n  \"@bazel_tools//third_party/def_parser:def_parser_lib\" -> \"@bazel_tools//third_party/def_parser:def_parser.h\\n@bazel_tools//third_party/def_parser:def_parser.cc\"\n  \"@bazel_tools//third_party/def_parser:def_parser_lib\" -> \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//tools/cpp:current_cc_toolchain\"\n  \"@bazel_tools//tools/cpp:current_cc_toolchain\" -> \"@bazel_tools//tools/cpp:toolchain\"\n  \"@bazel_tools//tools/cpp:current_cc_toolchain\" -> \"@bazel_tools//tools/cpp:toolchain_type\"\n  \"@bazel_tools//third_party/def_parser:def_parser.h\\n@bazel_tools//third_party/def_parser:def_parser.cc\"\n  \"@bazel_tools//third_party/def_parser:def_parser_main.cc\"\n  \"@bazel_tools//tools/def_parser:def_parser.exe\"\n  \"@bazel_tools//src/tools/launcher:launcher_maker.cc\"\n  \"@bazel_tools//src/conditions:remote\"\n  \"@bazel_tools//tools/launcher:launcher_maker.exe\"\n  \"@bazel_tools//tools/cpp:optional_current_cc_toolchain\"\n  \"@bazel_tools//tools/cpp:optional_current_cc_toolchain\" -> \"@bazel_tools//tools/cpp:toolchain\"\n  \"@bazel_tools//tools/cpp:optional_current_cc_toolchain\" -> \"@bazel_tools//tools/cpp:toolchain_type\"\n  \"@bazel_tools//tools/cpp:toolchain\"\n  \"@bazel_tools//tools/cpp:toolchain\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:toolchain\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:toolchain\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:toolchain\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-darwin_arm64\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:toolchain\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-armeabi-v7a\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-armeabi-v7a\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-armeabi-v7a\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:empty\\n@bazel_tools//tools/build_defs/cc/whitelists/parse_headers_and_layering_check:disabling_parse_headers_and_layering_check_allowed\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-armeabi-v7a\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:stub_armeabi-v7a\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-armeabi-v7a\" -> \"@bazel_tools//tools/build_defs/build_info:cc_build_info\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-armeabi-v7a\" -> \"@bazel_tools//tools/cpp:toolchain_type\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-armeabi-v7a\" -> \"@bazel_tools//tools/cpp:link_dynamic_library\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-armeabi-v7a\" -> \"@bazel_tools//tools/cpp:interface_library_builder\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:stub_armeabi-v7a\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-darwin_arm64\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-darwin_arm64\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:compiler_deps\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-darwin_arm64\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:empty\\n@bazel_tools//tools/build_defs/cc/whitelists/parse_headers_and_layering_check:disabling_parse_headers_and_layering_check_allowed\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-darwin_arm64\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:module.modulemap\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-darwin_arm64\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:local\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-darwin_arm64\" -> \"@bazel_tools//tools/build_defs/build_info:cc_build_info\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-darwin_arm64\" -> \"@bazel_tools//tools/cpp:toolchain_type\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-darwin_arm64\" -> \"@bazel_tools//tools/cpp:link_dynamic_library\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc-compiler-darwin_arm64\" -> \"@bazel_tools//tools/cpp:interface_library_builder\"\n  \"@bazel_tools//tools/cpp:interface_library_builder\"\n  \"@bazel_tools//tools/cpp:interface_library_builder\" -> \"@bazel_tools//tools/cpp:build_interface_so\"\n  \"@bazel_tools//tools/cpp:build_interface_so\"\n  \"@bazel_tools//tools/cpp:link_dynamic_library\"\n  \"@bazel_tools//tools/cpp:link_dynamic_library\" -> \"@bazel_tools//tools/cpp:link_dynamic_library.sh\"\n  \"@bazel_tools//tools/cpp:link_dynamic_library.sh\"\n  \"@bazel_tools//tools/cpp:toolchain_type\"\n  \"@bazel_tools//tools/build_defs/build_info:cc_build_info\"\n  \"@bazel_tools//tools/build_defs/build_info:cc_build_info\" -> \"@bazel_tools//tools/build_defs/build_info/templates:volatile_file.h.template\\n@bazel_tools//tools/build_defs/build_info/templates:non_volatile_file.h.template\\n@bazel_tools//tools/build_defs/build_info/templates:redacted_file.h.template\"\n  \"@bazel_tools//tools/build_defs/build_info/templates:volatile_file.h.template\\n@bazel_tools//tools/build_defs/build_info/templates:non_volatile_file.h.template\\n@bazel_tools//tools/build_defs/build_info/templates:redacted_file.h.template\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:local\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:local\" -> \"@bazel_tools//tools/objc:host_xcodes\"\n  \"@bazel_tools//tools/objc:host_xcodes\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:module.modulemap\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:empty\\n@bazel_tools//tools/build_defs/cc/whitelists/parse_headers_and_layering_check:disabling_parse_headers_and_layering_check_allowed\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:compiler_deps\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:compiler_deps\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:builtin_include_directory_paths\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:compiler_deps\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc_wrapper\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:compiler_deps\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:validate_static_library\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:validate_static_library\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:validate_static_library\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:validate_static_library.sh\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:validate_static_library.sh\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc_wrapper\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc_wrapper\" -> \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc_wrapper.sh\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:cc_wrapper.sh\"\n  \"@@bazel_tools~cc_configure_extension~local_config_cc//:builtin_include_directory_paths\"\n  \"@rules_jvm_external//private/tools/java/com/github/bazelbuild/rules_jvm_external/jar:AddJarManifestEntry.java\\n@bazel_tools//tools/jdk:launcher_flag_alias\\n@bazel_tools//tools/jdk:java_stub_template.txt\"\n  \"@unmanaged_deps_filter//:jakarta/annotation/jakarta.annotation-api/2.1.1/jakarta.annotation-api-2.1.1.jar\"\n  \"@unmanaged_deps_filter//:jakarta/annotation/jakarta.annotation-api/2.1.1/jakarta.annotation-api-2.1.1.jar\" -> \"@unmanaged_deps_filter//:jakarta_annotation_jakarta_annotation_api_2_1_1_extension\"\n  \"@unmanaged_deps_filter//:jakarta_annotation_jakarta_annotation_api_2_1_1_extension\"\n  \"@unmanaged_deps_filter//:jakarta_annotation_jakarta_annotation_api_2_1_1_extension\" -> \"@@rules_jvm_external~~maven~jakarta_annotation_jakarta_annotation_api_2_1_1//file:file\"\n  \"@unmanaged_deps_filter//:jakarta_annotation_jakarta_annotation_api_2_1_1_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~jakarta_annotation_jakarta_annotation_api_2_1_1//file:file\"\n  \"@@rules_jvm_external~~maven~jakarta_annotation_jakarta_annotation_api_2_1_1//file:file\" -> \"@@rules_jvm_external~~maven~jakarta_annotation_jakarta_annotation_api_2_1_1//file:v1/jakarta/annotation/jakarta.annotation-api/2.1.1/jakarta.annotation-api-2.1.1.jar\"\n  \"@@rules_jvm_external~~maven~jakarta_annotation_jakarta_annotation_api_2_1_1//file:v1/jakarta/annotation/jakarta.annotation-api/2.1.1/jakarta.annotation-api-2.1.1.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter/3.3.11/spring-boot-starter-3.3.11.jar\"\n  \"@unmanaged_deps_filter//:org/springframework/boot/spring-boot-starter/3.3.11/spring-boot-starter-3.3.11.jar\" -> \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_3_3_11_extension\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_3_3_11_extension\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_3_3_11//file:file\"\n  \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_3_3_11_extension\" -> \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_3_3_11//file:file\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_3_3_11//file:file\" -> \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_3_3_11//file:v1/org/springframework/boot/spring-boot-starter/3.3.11/spring-boot-starter-3.3.11.jar\"\n  \"@@rules_jvm_external~~maven~org_springframework_boot_spring_boot_starter_3_3_11//file:v1/org/springframework/boot/spring-boot-starter/3.3.11/spring-boot-starter-3.3.11.jar\"\n  \"@bazel_tools//tools/genrule:genrule-setup.sh\"\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules/tests/test_utils/src/test/java/com/depsfilter/DependencyGraphAnalyzer.java",
    "content": "package com.depsfilter;\n\nimport java.util.*;\nimport java.util.regex.Matcher;\nimport java.util.regex.Pattern;\n\npublic class DependencyGraphAnalyzer {\n    \n    private final Map<String, Set<String>> dependencyGraph = new HashMap<>();\n    private final Map<String, String> labelToRuntimeMapping = new HashMap<>();\n    private final Set<String> allJarLabels = new HashSet<>();\n    \n    public void parseDependencyGraph(String graphOutput) {\n        String[] lines = graphOutput.split(\"\\n\");\n        \n        for (String line : lines) {\n            if (line.trim().isEmpty() || !line.contains(\"->\")) {\n                continue;\n            }\n            \n            Pattern edgePattern = Pattern.compile(\"\\\"([^\\\"]+)\\\"\\\\s*->\\\\s*\\\"([^\\\"]+)\\\"\");\n            Matcher matcher = edgePattern.matcher(line);\n            \n            if (matcher.find()) {\n                String from = matcher.group(1);\n                String to = matcher.group(2);\n                \n                // Build complete graph - don't filter here\n                dependencyGraph.computeIfAbsent(from, k -> new HashSet<>()).add(to);\n                \n                // Track JAR labels for mapping\n                if (isJarLabel(from)) {\n                    allJarLabels.add(from);\n                }\n                if (isJarLabel(to)) {\n                    allJarLabels.add(to);\n                }\n            }\n        }\n        \n        buildLabelToRuntimeMapping();\n    }\n    \n    private boolean isJarLabel(String label) {\n        return label.startsWith(\"@\") && label.contains(\"//:\") && label.endsWith(\".jar\");\n    }\n    \n    private boolean isTargetLabel(String label) {\n        return (label.startsWith(\"@spring//\") || label.startsWith(\"@jakarta//\")) && !label.contains(\".jar\");\n    }\n    \n    private void buildLabelToRuntimeMapping() {\n        for (String label : allJarLabels) {\n            String runtimeName = convertLabelToRuntimeName(label);\n            if (runtimeName != null) {\n                labelToRuntimeMapping.put(label, runtimeName);\n            }\n        }\n    }\n    \n    private String convertLabelToRuntimeName(String label) {\n        if (!isJarLabel(label)) {\n            return null;\n        }\n        \n        String runtimePath = label.substring(1).replace(\"//:\", \"/\");\n        \n        // Replace unmanaged_deps_filter/ with rules_jvm_external~~maven~unmanaged_deps_filter/\n        runtimePath = runtimePath.replace(\"unmanaged_deps_filter/\", \"rules_jvm_external~~maven~unmanaged_deps_filter/\");\n        \n        int lastSlash = runtimePath.lastIndexOf('/');\n        if (lastSlash != -1) {\n            String directory = runtimePath.substring(0, lastSlash + 1);\n            String filename = runtimePath.substring(lastSlash + 1);\n            return directory + \"processed_\" + filename;\n        }\n        \n        return null;\n    }\n    \n    public Set<String> computeExpectedRuntimeJars(\n            List<String> depsLabels,\n            List<String> runtimeDepsLabels,\n            Set<String> excludedLabels,\n            Set<String> excludedPatterns,\n            boolean excludeTransitives) {\n        \n        Set<String> expectedJars = new HashSet<>();\n        Set<String> excludedNodes = new HashSet<>();\n        \n        if (excludeTransitives) {\n            // When excludeTransitives=true, exclude the labels and all their transitives\n            for (String excludedLabel : excludedLabels) {\n                excludedNodes.add(excludedLabel);\n                excludedNodes.addAll(getTransitiveDependencies(excludedLabel));\n            }\n        } else {\n            // When excludeTransitives=false, only exclude the specific labels, not their transitives\n            excludedNodes.addAll(excludedLabels);\n        }\n        \n        // Process compile dependencies\n        for (String depLabel : depsLabels) {\n            if (!excludedNodes.contains(depLabel)) {\n                addDependencyAndTransitives(depLabel, expectedJars, excludedNodes, excludedPatterns, excludeTransitives);\n            }\n        }\n        \n        // Process runtime dependencies\n        for (String runtimeDepLabel : runtimeDepsLabels) {\n            if (!excludedNodes.contains(runtimeDepLabel)) {\n                addDependencyAndTransitives(runtimeDepLabel, expectedJars, excludedNodes, excludedPatterns, excludeTransitives);\n            }\n        }\n        \n        // Final filtering: remove any excluded labels from the result\n        Set<String> finalResult = new HashSet<>();\n        \n        // Build a set of JAR labels that should be excluded\n        Set<String> excludedJarLabels = new HashSet<>();\n        for (String excludedLabel : excludedLabels) {\n            if (isJarLabel(excludedLabel)) {\n                // Direct JAR label exclusion\n                excludedJarLabels.add(excludedLabel);\n            } else {\n                // Target label exclusion - find all JAR labels reachable from this target\n                Set<String> reachableJars = new HashSet<>();\n                Set<String> visited = new HashSet<>();\n                findReachableJarLabels(excludedLabel, reachableJars, visited);\n                excludedJarLabels.addAll(reachableJars);\n            }\n        }\n        \n        for (String jar : expectedJars) {\n            // Check if this JAR corresponds to an excluded JAR label\n            boolean isExcluded = false;\n            for (String excludedJarLabel : excludedJarLabels) {\n                String runtimeName = labelToRuntimeMapping.get(excludedJarLabel);\n                if (runtimeName != null && runtimeName.equals(jar)) {\n                    isExcluded = true;\n                    break;\n                }\n            }\n            if (!isExcluded) {\n                finalResult.add(jar);\n            }\n        }\n        \n        return finalResult;\n    }\n    \n    private void addDependencyAndTransitives(\n            String depLabel,\n            Set<String> expectedJars,\n            Set<String> excludedNodes,\n            Set<String> excludedPatterns,\n            boolean excludeTransitives) {\n        \n        // Add the direct dependency if it's not excluded\n        if (!excludedNodes.contains(depLabel) && !isExcludedByPattern(depLabel, excludedPatterns)) {\n            String runtimeName = labelToRuntimeMapping.get(depLabel);\n            if (runtimeName != null) {\n                expectedJars.add(runtimeName);\n            }\n        }\n        \n        // Add transitives, but respect exclusions\n        Set<String> transitives = getTransitiveDependencies(depLabel);\n        for (String transitive : transitives) {\n            if (!excludedNodes.contains(transitive) && !isExcludedByPattern(transitive, excludedPatterns)) {\n                String runtimeName = labelToRuntimeMapping.get(transitive);\n                if (runtimeName != null) {\n                    expectedJars.add(runtimeName);\n                }\n            }\n        }\n    }\n    \n    private Set<String> getTransitiveDependencies(String label) {\n        Set<String> transitives = new HashSet<>();\n        Set<String> visited = new HashSet<>();\n        dfs(label, visited, transitives);\n        return transitives;\n    }\n    \n    private void dfs(String node, Set<String> transitives, Set<String> visited) {\n        if (visited.contains(node)) {\n            return;\n        }\n        visited.add(node);\n        \n        Set<String> neighbors = dependencyGraph.get(node);\n        if (neighbors != null) {\n            for (String neighbor : neighbors) {\n                // Only add JAR labels to transitives, but traverse all paths\n                if (isJarLabel(neighbor)) {\n                    transitives.add(neighbor);\n                }\n                // Continue traversal regardless of node type\n                dfs(neighbor, transitives, visited);\n            }\n        }\n    }\n    \n    private boolean isExcludedByPattern(String label, Set<String> patterns) {\n        String runtimeName = labelToRuntimeMapping.get(label);\n        if (runtimeName == null) {\n            return false;\n        }\n        \n        for (String pattern : patterns) {\n            if (runtimeName.contains(pattern)) {\n                return true;\n            }\n        }\n        return false;\n    }\n    \n    public Map<String, String> getLabelToRuntimeMapping() {\n        return new HashMap<>(labelToRuntimeMapping);\n    }\n    \n    public Map<String, Set<String>> getDependencyGraph() {\n        return new HashMap<>(dependencyGraph);\n    }\n\n    private void findReachableJarLabels(String node, Set<String> jarLabels, Set<String> visited) {\n        if (visited.contains(node)) {\n            return;\n        }\n        visited.add(node);\n        \n        // If this is a JAR label, add it to the result\n        if (isJarLabel(node)) {\n            jarLabels.add(node);\n        }\n        \n        // Continue traversing to find all reachable JAR labels\n        Set<String> neighbors = dependencyGraph.get(node);\n        if (neighbors != null) {\n            for (String neighbor : neighbors) {\n                findReachableJarLabels(neighbor, jarLabels, visited);\n            }\n        }\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/test_utils/src/test/java/com/depsfilter/DependencyGraphTestConfig.java",
    "content": "package com.depsfilter;\n\nimport java.io.IOException;\nimport java.nio.file.Files;\nimport java.nio.file.Paths;\nimport java.util.*;\n\npublic class DependencyGraphTestConfig {\n    \n    private static DependencyGraphAnalyzer analyzer;\n    private static boolean initialized = false;\n    \n    private static final List<String> STANDARD_DEPS = Arrays.asList(\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_data_jpa\",\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_security\",\n        \"@unmanaged_deps_filter//:com_fasterxml_jackson_core_jackson_databind\",\n        \"@unmanaged_deps_filter//:org_hibernate_orm_hibernate_core\",\n        \"@unmanaged_deps_filter//:jakarta_servlet_jsp_jakarta_servlet_jsp_api\"\n    );\n    \n    private static final List<String> STANDARD_RUNTIME_DEPS = Arrays.asList(\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_oauth2_client\",\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_webflux\",\n        \"@unmanaged_deps_filter//:org_springframework_boot_spring_boot_starter_actuator\"\n    );\n    \n    public static void initialize() {\n        if (initialized) {\n            return;\n        }\n        \n        try {\n            String graphOutput = Files.readString(Paths.get(\"springboot/deps_filter_rules/tests/test_utils/dependency_graph.txt\"));\n            analyzer = new DependencyGraphAnalyzer();\n            analyzer.parseDependencyGraph(graphOutput);\n            initialized = true;\n        } catch (IOException e) {\n            throw new RuntimeException(\"Failed to load dependency graph\", e);\n        }\n    }\n    \n    public static DependencyGraphAnalyzer getAnalyzer() {\n        if (!initialized) {\n            initialize();\n        }\n        return analyzer;\n    }\n    \n    public static Set<String> getExpectedJarsForNoFiltering() {\n        return getAnalyzer().computeExpectedRuntimeJars(\n            STANDARD_DEPS,\n            STANDARD_RUNTIME_DEPS,\n            Collections.emptySet(),\n            Collections.emptySet(),\n            false\n        );\n    }\n    \n    public static Set<String> getExpectedJarsForNoFilteringFiltered() {\n        Set<String> all = getExpectedJarsForNoFiltering();\n        Set<String> filtered = new HashSet<>();\n        for (String jar : all) {\n            if (!jar.endsWith(\"-sources.jar\")) {\n                filtered.add(jar);\n            }\n        }\n        return filtered;\n    }\n    \n    public static Set<String> getExpectedJarsForLabelExclusions(Set<String> excludedLabels, boolean excludeTransitives) {\n        return getAnalyzer().computeExpectedRuntimeJars(\n            STANDARD_DEPS,\n            STANDARD_RUNTIME_DEPS,\n            excludedLabels,\n            Collections.emptySet(),\n            excludeTransitives\n        );\n    }\n    \n    public static Set<String> getExpectedJarsForLabelExclusionsFiltered(Set<String> excludedLabels, boolean excludeTransitives) {\n        Set<String> all = getExpectedJarsForLabelExclusions(excludedLabels, excludeTransitives);\n        Set<String> filtered = new HashSet<>();\n        for (String jar : all) {\n            if (!jar.endsWith(\"-sources.jar\")) {\n                filtered.add(jar);\n            }\n        }\n        return filtered;\n    }\n    \n    public static Set<String> getExpectedJarsForPathExclusions(Set<String> excludedPatterns, boolean excludeTransitives) {\n        return getAnalyzer().computeExpectedRuntimeJars(\n            STANDARD_DEPS,\n            STANDARD_RUNTIME_DEPS,\n            Collections.emptySet(),\n            excludedPatterns,\n            excludeTransitives\n        );\n    }\n    \n    public static Set<String> getExpectedJarsForPathExclusionsFiltered(Set<String> excludedPatterns, boolean excludeTransitives) {\n        Set<String> all = getExpectedJarsForPathExclusions(excludedPatterns, excludeTransitives);\n        Set<String> filtered = new HashSet<>();\n        for (String jar : all) {\n            if (!jar.endsWith(\"-sources.jar\")) {\n                filtered.add(jar);\n            }\n        }\n        return filtered;\n    }\n    \n    public static Set<String> getExpectedJarsForMultipleExclusions(\n            Set<String> excludedLabels, \n            Set<String> excludedPatterns, \n            boolean excludeTransitives) {\n        return getAnalyzer().computeExpectedRuntimeJars(\n            STANDARD_DEPS,\n            STANDARD_RUNTIME_DEPS,\n            excludedLabels,\n            excludedPatterns,\n            excludeTransitives\n        );\n    }\n    \n    public static Set<String> getExpectedJarsForMultipleExclusionsFiltered(\n            Set<String> excludedLabels, \n            Set<String> excludedPatterns, \n            boolean excludeTransitives) {\n        Set<String> all = getExpectedJarsForMultipleExclusions(excludedLabels, excludedPatterns, excludeTransitives);\n        Set<String> filtered = new HashSet<>();\n        for (String jar : all) {\n            if (!jar.endsWith(\"-sources.jar\")) {\n                filtered.add(jar);\n            }\n        }\n        return filtered;\n    }\n    \n    public static List<String> getStandardDeps() {\n        return new ArrayList<>(STANDARD_DEPS);\n    }\n    \n    public static List<String> getStandardRuntimeDeps() {\n        return new ArrayList<>(STANDARD_RUNTIME_DEPS);\n    }\n    \n    public static Set<String> getExpectedJarsForCustomDeps(\n            List<String> depsLabels,\n            List<String> runtimeDepsLabels,\n            Set<String> excludedLabels,\n            Set<String> excludedPatterns,\n            boolean excludeTransitives) {\n        return getAnalyzer().computeExpectedRuntimeJars(\n            depsLabels,\n            runtimeDepsLabels,\n            excludedLabels,\n            excludedPatterns,\n            excludeTransitives\n        );\n    }\n    \n    public static Set<String> getExpectedJarsForCustomDepsFiltered(\n            Set<String> depsLabels,\n            Set<String> runtimeDepsLabels,\n            Set<String> excludedLabels,\n            Set<String> excludedPatterns,\n            boolean excludeTransitives) {\n        Set<String> all = getAnalyzer().computeExpectedRuntimeJars(\n            new ArrayList<>(depsLabels),\n            new ArrayList<>(runtimeDepsLabels),\n            excludedLabels,\n            excludedPatterns,\n            excludeTransitives\n        );\n        Set<String> filtered = new HashSet<>();\n        for (String jar : all) {\n            if (!jar.endsWith(\"-sources.jar\")) {\n                filtered.add(jar);\n            }\n        }\n        return filtered;\n    }\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/test_utils/src/test/java/com/depsfilter/DepsFilterTestHelper.java",
    "content": "package com.depsfilter;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\npublic class DepsFilterTestHelper {\n\n    public static List<String> computeClasspathDependencies() {\n        String classpath = System.getProperty(\"java.class.path\");\n        String[] classpathEntries = classpath.split(System.getProperty(\"path.separator\"));\n        List<String> availableDeps = new ArrayList<>();\n        for (String entry : classpathEntries) {\n            availableDeps.add(entry.replace(\"../\", \"\"));\n        }\n        return availableDeps;\n    }\n\n    public static List<String> getTestDeps() {\n        return List.of(\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/junit/junit/4.13.2/processed_junit-4.13.2.jar\",\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/org/hamcrest/hamcrest-core/1.3/processed_hamcrest-core-1.3.jar\",\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/org/assertj/assertj-core/3.26.0/processed_assertj-core-3.26.0.jar\",\n            \"rules_jvm_external~~maven~unmanaged_deps_filter/net/bytebuddy/byte-buddy/1.14.16/processed_byte-buddy-1.14.16.jar\",\n            \"rules_java~~toolchains~remote_java_tools/java_tools/Runner_deploy.jar\",\n            \"springboot/deps_filter_rules/tests/test_utils/libtest_utils.jar\"\n        );\n    }\n\n} "
  },
  {
    "path": "springboot/deps_filter_rules/tests/test_utils/verification_utils.bzl",
    "content": "load(\"@bazel_skylib//lib:unittest.bzl\", \"asserts\")\n\ndef verify_jars(env, actual_jars, expected_jars, jar_field):\n    expected_jars = sorted(expected_jars)\n    actual_jars = sorted(actual_jars)\n    asserts.equals(env, type(expected_jars), type(actual_jars), \n        \"JAR type mismatch: {}\".format(jar_field))\n    asserts.equals(env, expected_jars, actual_jars, \n        \"JAR contents mismatch: {}\".format(jar_field))\n        \ndef verify_runtime_and_compile_jars(ctx, env, javainfo, expected_compile_jars = None, expected_full_compile_jars = None, expected_transitive_compile_jars = None, expected_transitive_runtime_jars = None):\n    \"\"\"Helper function to verify runtime and compile time JARs.\"\"\"\n    transitive_runtime_jars = [jar.basename for jar in javainfo.transitive_runtime_jars.to_list()]\n    verify_jars(env, transitive_runtime_jars, expected_transitive_runtime_jars, \"transitive_runtime_jars\")\n    transitive_compile_jars = [jar.basename for jar in javainfo.transitive_compile_time_jars.to_list()]\n    verify_jars(env, transitive_compile_jars, expected_transitive_compile_jars, \"transitive_compile_jars\")\n    compile_jars = [jar.basename for jar in javainfo.compile_jars.to_list()]\n    verify_jars(env, compile_jars, expected_compile_jars, \"compile_jars\")\n    full_compile_jars = [jar.basename for jar in javainfo.full_compile_jars.to_list()]\n    verify_jars(env, full_compile_jars, expected_full_compile_jars, \"full_compile_jars\")\n\ndef verify_jars_and_dropped_counts(env, expected, expected_compile_dropped = \"0\", expected_full_compile_dropped = \"0\", expected_transitive_compile_dropped = \"0\", expected_transitive_runtime_dropped = \"0\"):\n    dropped_counts = {\n        \"compile_jars_dropped\": expected[\"compile_jars_dropped\"],\n        \"full_compile_jars_dropped\": expected[\"full_compile_jars_dropped\"],\n        \"transitive_compile_jars_dropped\": expected[\"transitive_compile_jars_dropped\"],\n        \"transitive_runtime_jars_dropped\": expected[\"transitive_runtime_jars_dropped\"],\n    }\n    verify_dropped_counts(env, dropped_counts, \n                          expected_compile_dropped, expected_full_compile_dropped,\n                          expected_transitive_compile_dropped, expected_transitive_runtime_dropped)\n\ndef verify_dropped_counts(env, dropped_counts, expected_compile_dropped = \"0\", expected_full_compile_dropped = \"0\", expected_transitive_compile_dropped = \"0\", expected_transitive_runtime_dropped = \"0\"):\n    \"\"\"\n    Verifies that the correct number of JARs were dropped for each type.\n    \"\"\"\n    if expected_compile_dropped == \"0\":\n        asserts.equals(env, dropped_counts[\"compile_jars_dropped\"], 0, \n            \"Expected no compile JARs to be dropped, but {} were dropped\".format(dropped_counts[\"compile_jars_dropped\"]))\n    elif expected_compile_dropped == \">0\":\n        asserts.true(env, dropped_counts[\"compile_jars_dropped\"] > 0, \n            \"Expected some compile JARs to be dropped, but {} were dropped\".format(dropped_counts[\"compile_jars_dropped\"]))\n    \n    if expected_full_compile_dropped == \"0\":\n        asserts.equals(env, dropped_counts[\"full_compile_jars_dropped\"], 0, \n            \"Expected no full compile JARs to be dropped, but {} were dropped\".format(dropped_counts[\"full_compile_jars_dropped\"]))\n    elif expected_full_compile_dropped == \">0\":\n        asserts.true(env, dropped_counts[\"full_compile_jars_dropped\"] > 0, \n            \"Expected some full compile JARs to be dropped, but {} were dropped\".format(dropped_counts[\"full_compile_jars_dropped\"]))\n    \n    if expected_transitive_compile_dropped == \"0\":\n        asserts.equals(env, dropped_counts[\"transitive_compile_jars_dropped\"], 0, \n            \"Expected no transitive compile JARs to be dropped, but {} were dropped\".format(dropped_counts[\"transitive_compile_jars_dropped\"]))\n    elif expected_transitive_compile_dropped == \">0\":\n        asserts.true(env, dropped_counts[\"transitive_compile_jars_dropped\"] > 0, \n            \"Expected some transitive compile JARs to be dropped, but {} were dropped\".format(dropped_counts[\"transitive_compile_jars_dropped\"]))\n    \n    if expected_transitive_runtime_dropped == \"0\":\n        asserts.equals(env, dropped_counts[\"transitive_runtime_jars_dropped\"], 0, \n            \"Expected no transitive runtime JARs to be dropped, but {} were dropped\".format(dropped_counts[\"transitive_runtime_jars_dropped\"]))\n    elif expected_transitive_runtime_dropped == \">0\":\n        asserts.true(env, dropped_counts[\"transitive_runtime_jars_dropped\"] > 0, \n            \"Expected some transitive runtime JARs to be dropped, but {} were dropped\".format(dropped_counts[\"transitive_runtime_jars_dropped\"]))\n\ndef update_jar_name(jar_name, new_jar_name, jar_list):\n    for i, jar in enumerate(jar_list):\n        if jar_name in jar:\n            jar_list[i] = jar.replace(jar_name, new_jar_name)\n    return jar_list\n\ndef _collect_filtered_jars(existing_jars, jar_list, excluded_jars = [], exclusion_patterns = []):\n    dropped_count = 0\n    for jar in jar_list:\n        jar_name = jar.basename\n        if jar_name not in existing_jars and jar_name not in excluded_jars:\n            should_include = True\n            for pattern in exclusion_patterns:\n                if pattern in jar_name:\n                    should_include = False\n                    dropped_count += 1\n                    break\n            if should_include:\n                existing_jars.append(jar_name)\n            else:\n                dropped_count += 1\n        elif jar_name in excluded_jars:\n            dropped_count += 1\n    return existing_jars, dropped_count\n\ndef _compute_excluded_jars_from_labels(ctx):\n    excluded_compile_jars = []\n    excluded_full_compile_jars = []\n    excluded_transitive_compile_jars = []\n    excluded_transitive_runtime_jars = []\n    \n    if not ctx.attr.deps_exclude_labels:\n        return {\n            \"compile_jars\": excluded_compile_jars,\n            \"full_compile_jars\": excluded_full_compile_jars,\n            \"transitive_compile_jars\": excluded_transitive_compile_jars,\n            \"transitive_runtime_jars\": excluded_transitive_runtime_jars,\n        }\n    \n    for excluded_label in ctx.attr.deps_exclude_labels:\n        java_info = excluded_label[JavaInfo]\n        \n        if ctx.attr.exclude_transitives:\n            # Exclude the dep and its transitives\n            excluded_compile_jars, _ = _collect_filtered_jars(excluded_compile_jars, java_info.compile_jars.to_list())\n            excluded_full_compile_jars, _ = _collect_filtered_jars(excluded_full_compile_jars, java_info.full_compile_jars.to_list())\n            excluded_transitive_compile_jars, _ = _collect_filtered_jars(excluded_transitive_compile_jars, java_info.transitive_compile_time_jars.to_list())\n            excluded_transitive_runtime_jars, _ = _collect_filtered_jars(excluded_transitive_runtime_jars, java_info.transitive_runtime_jars.to_list())\n        else:\n            # Only exclude the direct dep JARs\n            excluded_compile_jars, _ = _collect_filtered_jars(excluded_compile_jars, java_info.compile_jars.to_list())\n            excluded_full_compile_jars, _ = _collect_filtered_jars(excluded_full_compile_jars, java_info.full_compile_jars.to_list())\n            excluded_transitive_compile_jars, _ = _collect_filtered_jars(excluded_transitive_compile_jars, java_info.compile_jars.to_list())\n            excluded_transitive_runtime_jars, _ = _collect_filtered_jars(excluded_transitive_runtime_jars, java_info.full_compile_jars.to_list())\n             \n    return {\n        \"compile_jars\": excluded_compile_jars,\n        \"full_compile_jars\": excluded_full_compile_jars,\n        \"transitive_compile_jars\": excluded_transitive_compile_jars,\n        \"transitive_runtime_jars\": excluded_transitive_runtime_jars,\n    }\n\ndef compute_expected_jars(ctx, test_lib_name = None):\n    \"\"\"\n    Computes expected JARs after applying all exclusions (labels and patterns).\n    \"\"\"\n    excluded_jars = _compute_excluded_jars_from_labels(ctx)\n    exclusion_patterns = ctx.attr.deps_exclude_paths or []\n    \n    if test_lib_name == None:\n        expected_compile_jars = []\n        expected_full_compile_jars = []\n        expected_transitive_compile_jars = []\n        expected_transitive_runtime_jars = []\n    else:\n        test_lib_compile_jar = \"lib\" + test_lib_name + \"-hjar.jar\"\n        test_lib_full_compile_jar = \"lib\" + test_lib_name + \".jar\"\n        expected_compile_jars = [test_lib_compile_jar]\n        expected_full_compile_jars = [test_lib_full_compile_jar]\n        expected_transitive_compile_jars = [test_lib_compile_jar]\n        expected_transitive_runtime_jars = [test_lib_full_compile_jar]\n\n    compile_jars_dropped = 0\n    full_compile_jars_dropped = 0\n    transitive_compile_jars_dropped = 0\n    transitive_runtime_jars_dropped = 0\n    \n    # Process compile-time deps\n    for dep in ctx.attr.deps_labels:\n        java_info = dep[JavaInfo]\n        if test_lib_name == None:\n            expected_compile_jars, dropped = _collect_filtered_jars(expected_compile_jars, java_info.compile_jars.to_list(), excluded_jars[\"compile_jars\"], exclusion_patterns)\n            compile_jars_dropped += dropped\n            expected_full_compile_jars, dropped = _collect_filtered_jars(expected_full_compile_jars, java_info.full_compile_jars.to_list(), excluded_jars[\"full_compile_jars\"], exclusion_patterns)\n            full_compile_jars_dropped += dropped\n        else:\n            _, dropped = _collect_filtered_jars([], java_info.compile_jars.to_list(), excluded_jars[\"compile_jars\"], exclusion_patterns)\n            compile_jars_dropped += dropped\n            _, dropped = _collect_filtered_jars([], java_info.full_compile_jars.to_list(), excluded_jars[\"full_compile_jars\"], exclusion_patterns)\n            full_compile_jars_dropped += dropped\n        expected_transitive_compile_jars, dropped = _collect_filtered_jars(expected_transitive_compile_jars, java_info.transitive_compile_time_jars.to_list(), excluded_jars[\"transitive_compile_jars\"], exclusion_patterns)\n        transitive_compile_jars_dropped += dropped\n        expected_transitive_runtime_jars, dropped = _collect_filtered_jars(expected_transitive_runtime_jars, java_info.transitive_runtime_jars.to_list(), excluded_jars[\"transitive_runtime_jars\"], exclusion_patterns)\n        transitive_runtime_jars_dropped += dropped\n    \n    # Process runtime deps\n    for runtime_dep in ctx.attr.runtime_deps_labels:\n        java_info = runtime_dep[JavaInfo]\n        expected_transitive_runtime_jars, dropped = _collect_filtered_jars(expected_transitive_runtime_jars, java_info.transitive_runtime_jars.to_list(), excluded_jars[\"transitive_runtime_jars\"], exclusion_patterns)\n        transitive_runtime_jars_dropped += dropped\n        # Note: Runtime deps typically don't contribute to compile-time transitives\n    \n    return {\n        \"compile_jars\": expected_compile_jars,\n        \"full_compile_jars\": expected_full_compile_jars,\n        \"transitive_compile_jars\": expected_transitive_compile_jars,\n        \"transitive_runtime_jars\": expected_transitive_runtime_jars,\n        \"compile_jars_dropped\": compile_jars_dropped,\n        \"full_compile_jars_dropped\": full_compile_jars_dropped,\n        \"transitive_compile_jars_dropped\": transitive_compile_jars_dropped,\n        \"transitive_runtime_jars_dropped\": transitive_runtime_jars_dropped,\n    }"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/BUILD",
    "content": "load(\"//springboot/deps_filter_rules_legacy:deps_filter.bzl\", \"deps_filter\")\nload(\"//springboot/deps_filter_rules_legacy:deps_filter_disable_transitives.bzl\", \"deps_filter_disable_transitives\")\n\ndeps = [\n    \"@maven//:org_springframework_spring_jdbc\",\n    \"@maven//:org_springframework_spring_web\",\n]\n\ntest_deps = [\n    \"@maven//:junit_junit\",\n    \"@maven//:org_assertj_assertj_core\",\n]\n\ndeps_filter(\n    name = \"filtered_test_deps_with_transitives_excluded\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    deps_exclude_labels = [\n        \"@maven//:org_springframework_spring_web\", # share transitives with spring-jdbc\n    ],\n    exclude_transitives = True,\n    testonly = True,\n)\n\ndeps_filter(\n    name = \"filtered_test_deps_without_transitives_excluded\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    deps_exclude_labels = [\n       \"@maven//:org_springframework_spring_web\", # share transitives with spring-jdbc\n    ],\n    exclude_transitives = False,\n    testonly = True,\n)\n\ndeps_filter_disable_transitives(\n    name = \"filtered_deps_disable_transitives_case_A\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    deps_to_exclude_transitives = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    testonly = True,\n)\n\ndeps_filter_disable_transitives(\n    name = \"filtered_deps_disable_transitives_case_B\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    deps_to_exclude_transitives = [\n        # \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    testonly = True,\n)\n\ndeps_filter_disable_transitives(\n    name = \"filtered_deps_disable_transitives_case_C\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    deps_to_exclude_transitives = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        # \"@maven//:org_springframework_spring_web\",\n    ],\n    testonly = True,\n)\n\ndeps_filter_disable_transitives(\n    name = \"filtered_deps_disable_transitives_case_D\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    testonly = True,\n)\n\njava_test(\n    name = \"TransitiveDepsFilterCaseA\",\n    size = \"small\",\n    srcs = [\"src/test/java/com/depsfilter/TransitiveDepsFilterCaseA.java\"],\n    deps = [\":filtered_deps_disable_transitives_case_A\"] + test_deps,\n)\n\njava_test(\n    name = \"TransitiveDepsFilterCaseB\",\n    size = \"small\",\n    srcs = [\"src/test/java/com/depsfilter/TransitiveDepsFilterCaseB.java\"],\n    deps = [\":filtered_deps_disable_transitives_case_B\"] + test_deps,\n)\n\njava_test(\n    name = \"TransitiveDepsFilterCaseC\",\n    size = \"small\",\n    srcs = [\"src/test/java/com/depsfilter/TransitiveDepsFilterCaseC.java\"],\n    deps = [\":filtered_deps_disable_transitives_case_C\"] + test_deps,\n)\n\njava_test(\n    name = \"TransitiveDepsFilterCaseD\",\n    size = \"small\",\n    srcs = [\"src/test/java/com/depsfilter/TransitiveDepsFilterCaseD.java\"],\n    deps = [\":filtered_deps_disable_transitives_case_D\"] + test_deps,\n)\n\n\njava_test(\n    name = \"DepsFilterWithTransitivesExclusionTest\",\n    size = \"small\",\n    srcs = [\"src/test/java/com/depsfilter/DepsFilterWithTransitivesExclusionTest.java\"],\n    deps = [\":filtered_test_deps_with_transitives_excluded\"] + test_deps,\n)\n\njava_test(\n    name = \"DepsFilterWithoutTransitivesExclusionTest\",\n    size = \"small\",\n    srcs = [\"src/test/java/com/depsfilter/DepsFilterWithoutTransitivesExclusionTest.java\"],\n    deps = [\":filtered_test_deps_without_transitives_excluded\"] + test_deps,\n)\n"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/README.md",
    "content": "## SpringBoot Deps Filters\n\n> **⚠️ Recommendation: Use `@deps_filter_rules/` instead of this legacy rule.** This rule is maintained for backward compatibility only.\n>\n> The legacy `deps_filter` rule has a drawback: it resolves transitive dependencies in the filtered output, which contrasts the Bazel’s standard model, where transitive dependencies are not automatically available for direct use. If a target uses a transitive dependency at compile time without explicitly declaring it, Bazel will throw an \"indirect dependency\" error and will recommend that as a direct dependency.\n>\n> The new `@deps_filter_rules/` filters out unwanted Java dependency JARs (by label or path pattern) while preserving the correct JavaInfo structure for Bazel builds, ensuring proper dependency declarations and avoiding indirect dependency issues.\n\nThis directory contains implementations of deps filters.\nDeps filters are used to remove unwanted dependencies from the dependency graph of your springboot application.\n\nThe topic of unwanted classes and dependencies is explained in detail on this document:\n- [Unwanted Classes and Dependencies](../unwanted_classes.md)\n\n### deps_filter\n\nThis is the standard filter to use for excluding dependencies.\nFor each listed dependency, the dependency is excluded. \nOptionally, the transitives of each excluded dependency is also excluded.\n\nSee the full docs for more information:\n- [deps_filter documentation](deps_filter.md)\n\n### deps_filter_disable_transitives\n\nThis filter is similar to *deps_filter*, but does not exclude the listed dependencies.\nIt excludes the transitives of the listed dependencies.\n\nSee the full docs for more information:\n- [deps_filter_disable_transitives documentation](deps_filter_disable_transitives.md)"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/deps_filter.bzl",
    "content": "def _depaggregator_rule_impl(merged, ctx):\n    \"\"\"\n    This method processes declared deps and their transitive closures \n    to assemble a cohesive set of jars essential for the build process. During \n    this process, it excludes deps specified in 'deps_exclude_labels', which \n    lists jar labels to be omitted from packaging due to issues that cannot \n    be resolved upstream. If 'exclude_transitives' is set to 'true' (default:\n    'false'), any transitive deps that are only required by excluded deps\n    are also omitted, ensuring that only necessary transitives are included \n    in the final package. It uses 'deps_exclude_paths' to exclude deps \n    based on partial filename matches, ensuring problematic files are also \n    excluded from the build. This method ensures that only necessary \n    deps are included for the build process.\n    \"\"\"\n    exclude_transitives = ctx.attr.exclude_transitives\n\n    # list to store jars to be included and a dictionary to track excluded jars\n    jars = []\n    excludes = {}\n\n    if exclude_transitives:\n        # Dictionary to track transitive dependency paths that should be excluded\n        transitives_excludes = {}\n\n        # List to store deps info for deps present in 'deps_exclude_labels'\n        direct_excludes = []\n\n    # Iterate through the deps specified in 'deps_exclude_labels' to collect \n    # jars that should be excluded from the final set.\n\n    for exclusion_info in ctx.attr.deps_exclude_labels:    \n        # For each excluded dependency, add its compile-time JARs to the exclusion list\n        for compile_jar in exclusion_info[JavaInfo].full_compile_jars.to_list():\n            excludes[compile_jar.path] = True\n        \n        if exclude_transitives:\n            # Mark all transitives of the current dependency as excluded\n            # This list will be updated later based on transitives of non-excluded deps\n            direct_excludes.append(str(exclusion_info))\n            for transitive_jar in exclusion_info[JavaInfo].transitive_runtime_jars.to_list():\n                transitives_excludes[transitive_jar.path] = True\n\n    if exclude_transitives:\n        # Iterate over all deps, for non-excluded deps, mark their transitives as included.\n        for deps_info in ctx.attr.deps:\n            # skip the current dependency if it is listed in 'deps_exclude_labels'.\n            if str(deps_info) in direct_excludes:\n                continue     \n                    \n            # For non-excluded deps, mark them and their transitive deps as included (not to be excluded)\n            # (transitive_runtime_jars includes both the primary JAR and its transitive deps)\n            for transitive_jar in deps_info[JavaInfo].transitive_runtime_jars.to_list():\n                if transitive_jar.path in transitives_excludes:\n                    transitives_excludes[transitive_jar.path] = False\n\n        # update the excludes list\n        for dep_path in transitives_excludes:            \n            # print(\"Transitive:\", str(dep_path), \"is excluded\", transitives_excludes[dep_path])\n            if transitives_excludes[dep_path]:\n                excludes[dep_path] = True\n    \n    # compute the final set of jars\n    for dep in merged.transitive_runtime_jars.to_list():\n        # If the current JAR is in the exclusion list, skip it (do not include it)\n        if excludes.get(dep.path, None) != None:\n             pass\n        else:\n            # Default to including the JAR unless a pattern match excludes it\n            include = True\n            for pattern in ctx.attr.deps_exclude_paths:\n                if dep.path.find(pattern) > -1:\n                    include = False\n                    break\n            if include:\n                jars.append(dep)\n\n    return jars\n\ndef _deps_filter_impl(ctx):\n    \"\"\"\n    This rule filters out specified deps and JARs from the compile-time \n    and runtime deps. It utilizes the 'deps_exclude_labels' attribute to omit \n    specific JAR labels and the 'deps_exclude_paths' attribute to exclude \n    deps  based on partial paths in their filenames. If 'exclude_transitives'\n    is set to `True` (default: `False`), any transitive deps solely required\n    by the deps in 'deps_exclude_labels' are also excluded. These exclusions ensure\n    the final collection includes only the necessary elements for the build\n    process, eliminating problematic deps.\n    \"\"\" \n\n    if len(ctx.attr.deps) == 0:\n        fail(\"Error: 'deps' cannot be an empty list\")\n    \n    # magical incantation for getting upstream transitive closure of java deps\n    merged = java_common.merge([dep[java_common.provider] for dep in ctx.attr.deps])\n    runtime_dep_merged = java_common.merge([runtime_dep[java_common.provider] for runtime_dep in ctx.attr.runtime_deps])\n\n    compile_time_jars = _depaggregator_rule_impl(merged, ctx)\n    runtime_jars = _depaggregator_rule_impl(runtime_dep_merged, ctx)\n\n    if len(compile_time_jars) == 0:\n        fail(\"Error: The rule must return at least one compile-time JAR. Excluding all compile-time dependencies is not allowed.\")\n\n    return [\n            DefaultInfo(files = depset(compile_time_jars,)),\n            JavaInfo(\n                compile_jar = None,\n                output_jar = compile_time_jars[0],         # output jar must be non-empty, adding a dummy value to it\n                exports = [JavaInfo(source_jar = jar, compile_jar = jar, output_jar = jar) for jar in compile_time_jars],\n                runtime_deps = [JavaInfo(source_jar = jar, compile_jar = jar, output_jar = jar) for jar in\n                                runtime_jars],\n                deps = [JavaInfo(source_jar = jar, compile_jar = jar, output_jar = jar) for jar in compile_time_jars],\n            ),\n            ]\n\n\ndeps_filter = rule(\n    implementation = _deps_filter_impl,\n    attrs = {\n        \"deps\": attr.label_list(providers = [java_common.provider]),\n        \"runtime_deps\": attr.label_list(providers = [java_common.provider], allow_empty = True),\n        \"deps_exclude_labels\": attr.label_list(providers = [java_common.provider], allow_empty = True),\n        \"deps_exclude_paths\": attr.string_list(),\n        \"exclude_transitives\": attr.bool(default = False),\n    },\n)"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/deps_filter.md",
    "content": "# `deps_filter` Rule\n## Overview\nThe `deps_filter` rule provides a way to filter java dependencies in Bazel projects, ensuring only the necessary ones \nare included in the build. This rule can be referenced by other java targets, such as `java_library` and helps to \nremove problematic or unwanted dependencies, offering better control over dependency graphs. \n\nIt removes Java dependencies from your dependency graph. This is done when you have knowledge that Bazel does not, \nspecifically that your application does not need a dependency at runtime.\n\nThis is useful in cases where:\n- You want to exclude a dependency for a specific reason (it has a vulnerability)\n- There are multiple versions of a dependency on the classpath (dupe classes) and you want to exclude the unfavored one.\n\n\n## Rule Definition\nThe rule is defined as `dep_filter` in `deps_filter.bzl`. It filters out specified deps and JARs from the compile-time and runtime deps. It utilizes the `deps_exclude_labels` attribute to omit specific JAR labels and the `deps_exclude_paths` attribute to exclude dependencies based on partial paths in their filenames. If `exclude_transitives` is set to `True` (default: `False`), any transitive dependencies solely required by the dependencies in `deps_exclude_labels` are also excluded. These exclusions ensure the final collection includes only the necessary elements for the build process, eliminating problematic dependencies.\n\n```\ndeps_filter(\n    name = <string>,\n    deps = <list of labels>,\n    runtime_deps = <list of labels>,\n    deps_exclude_labels = <list of labels>,\n    deps_exclude_paths = <list of strings>,\n    exclude_transitives = <boolean, default = False>,\n    testonly = <boolean, default = False>,\n)\n```\n\n\n### Attributes:\n- `name` (Required): Name of the target.\n- `deps` (Required): List of dependencies to include.\n- `runtime_deps` (Optional): List of runtime dependencies to include.\n- `deps_exclude_labels` (Optional): Dependencies to exclude from the build.\n- `deps_exclude_paths` (Optional): Filename patterns for excluding dependencies.\n- `exclude_transitives` (Optional, Default: `False`): If `True`, transitive dependencies of excluded dependencies are \n  also removed, unless needed by other included dependencies.\n- `testonly` (Optional, Default: `False`): Restricts usage to test environments.\n\n### Behavior\n1. **Excludes Specific Dependencies**:\n   - Removes any dependencies listed in `deps_exclude_labels`.\n2. **Handles Transitive Dependencies**:\n   - If `exclude_transitives` is `True`, transitive dependencies that are only required by excluded dependencies are removed.\n   - If `False`, transitive dependencies remain in the build.\n3. **Filename-Based Exclusions**:\n   - Dependencies matching patterns in `deps_exclude_paths` are excluded.\n\n\n## Adding to Your Project\n### Step 1: Add `rules_spring` to your workspace:\nFollow the steps mentioned [here](../../README.md#loading-the-spring-rules-in-your-workspace). \n\n### Step 2: Load the `deps_filter` rule in your BUILD file:\n```\nload(\"@rules_spring//springboot/deps_filter_rules_legacy:deps_filter.bzl\", \"deps_filter\")\n```\n\n### Step 3: Define and reference the `deps_filter` rule in other targets (e.g., `java_library`) to manage their dependencies:\n```\nload(\"@rules_spring//springboot/deps_filter_rules_legacy:deps_filter.bzl\", \"deps_filter\")\n\ndeps = [\n    ...\n]\n\nruntime_deps = [\n    ...\n]\n\ndeps_filter(\n    name = \"filtered_deps\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_exclude_labels = [\n        \"@maven//:some_dep_you_dont_want\",  \n    ],\n    deps_exclude_paths = [\n        \"javax-servlet\",\n    ],\n    exclude_transitives = True,\n)\n\njava_library(\n    name = \"my_library\",\n    deps = [\":filtered_deps\"], # <--- KEY LINE: USE YOUR FILTERED DEPS HERE!\n    ...\n)\n\n# the filter is not specific to springboot apps, but is often used for springboot\n# due to the complexity of classpaths in springboot apps\nsalesforce_springboot(\n    name = \"myspringboot_app\",\n    java_library = \":my_library\",\n)\n\n```\n\n## Example Usage\n### Example 1: Without Excluding Transitives\n```\ndeps_filter(\n    name = \"filtered_deps\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    deps_exclude_labels = [\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    exclude_transitives = False,\n    testonly = True,\n)\n```\n#### Behavior:\n`org_springframework_spring_web` is excluded, but its transitive dependencies remain.\n\n### Example 2: With Excluding Transitives\n```\ndeps_filter(\n    name = \"filtered_deps\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    deps_exclude_labels = [\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    exclude_transitives = True,\n    testonly = True,\n)\n```\n#### Behavior:\nBoth `org_springframework_spring_web` and its transitive dependencies are excluded, except those required by `org_springframework_spring_jdbc`.\n"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/deps_filter_disable_transitives.bzl",
    "content": "def _depaggregator_rule_impl(merged, deps, ctx):\n    \"\"\"\n    This method processes declared dependencies and their transitive closures \n    to assemble a cohesive set of jars essential for the build process. During \n    this process, it excludes all the transitives of dependencies specified \n    in 'deps_to_exclude_transitives'.\n    \"\"\"\n    jars = []\n    excludes = {}\n\n    # exclude transitives of the specified deps\n    deps_info_to_exclude_transitives = []\n    for dep_info in ctx.attr.deps_to_exclude_transitives:\n        deps_info_to_exclude_transitives.append(str(dep_info))\n        for transitive_jar in dep_info[JavaInfo].transitive_runtime_jars.to_list():\n            excludes[transitive_jar.path] = True\n\n    # process the deps whose transitives are to be kept\n    for dep_info in deps:\n        # always keep the specified deps\n        for compile_jar in dep_info[JavaInfo].full_compile_jars.to_list():\n            if compile_jar.path in excludes:\n                excludes[compile_jar.path] = False\n                \n        if str(dep_info) not in deps_info_to_exclude_transitives:\n            for transitive_jar in dep_info[JavaInfo].transitive_runtime_jars.to_list():\n                if transitive_jar.path in excludes:\n                    excludes[transitive_jar.path] = False\n            \n            \n    for dep in merged.transitive_runtime_jars.to_list():\n        if excludes.get(dep.path, None) != None and excludes[dep.path]:\n            pass\n        else:\n            jars.append(dep)\n    return jars\n\ndef _deps_filter_disable_transitives_impl(ctx):\n    \"\"\"\n    This rule filters out transitives of the specified dependencies and JARs \n    from the compile-time and runtime dependencies. \n    \"\"\" \n    if len(ctx.attr.deps) == 0:\n        fail(\"Error: 'deps' cannot be an empty list\")\n\n    # deps whose transitives are to be excluded must be a subset of deps + runtime_deps \n    deps_info_list = []\n    for dep_info in ctx.attr.deps:\n        deps_info_list.append(str(dep_info))\n\n    for dep_info in ctx.attr.runtime_deps:\n        deps_info_list.append(str(dep_info))\n\n    for dep_info in ctx.attr.deps_to_exclude_transitives:\n        if str(dep_info) not in deps_info_list:\n            fail(\"Error: 'deps' specified in deps_to_exclude_transitives must be subset of deps + runtime_deps\")   \n\n    \n    # magical incantation for getting upstream transitive closure of java deps\n    merged = java_common.merge([dep[java_common.provider] for dep in ctx.attr.deps])\n    runtime_dep_merged = java_common.merge([runtime_dep[java_common.provider] for runtime_dep in ctx.attr.runtime_deps])\n\n    compile_time_jars = _depaggregator_rule_impl(merged, ctx.attr.deps, ctx)\n    runtime_jars = _depaggregator_rule_impl(runtime_dep_merged, ctx.attr.runtime_deps, ctx)\n\n    if len(compile_time_jars) == 0:\n        fail(\"Error: The rule must return at least one compile-time JAR. Excluding all compile-time dependencies is not allowed.\")\n\n\n    return [\n            DefaultInfo(files = depset(compile_time_jars,)),\n            JavaInfo(\n                compile_jar = None,\n                output_jar = compile_time_jars[0],         # output jar must be non-empty, adding a dummy value to it\n                exports = [JavaInfo(source_jar = jar, compile_jar = jar, output_jar = jar) for jar in compile_time_jars],\n                runtime_deps = [JavaInfo(source_jar = jar, compile_jar = jar, output_jar = jar) for jar in\n                                runtime_jars],\n                deps = [JavaInfo(source_jar = jar, compile_jar = jar, output_jar = jar) for jar in compile_time_jars],\n            ),\n            ]\n\n\ndeps_filter_disable_transitives = rule(\n    implementation = _deps_filter_disable_transitives_impl,\n    attrs = {\n        \"deps\": attr.label_list(providers = [java_common.provider]),\n        \"runtime_deps\": attr.label_list(providers = [java_common.provider], allow_empty = True),\n        \"deps_to_exclude_transitives\": attr.label_list(providers = [java_common.provider], allow_empty = True),\n    },\n)"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/deps_filter_disable_transitives.md",
    "content": "# `deps_filter_disable_transitives` Rule\n## Overview\nThe `deps_filter_disable_transitives` rule gives you control over transitive dependencies by disabling their resolution for specific dependencies. Inspired by [Gradle's transitive dependency resolution rule](https://docs.gradle.org/current/userguide/resolution_rules.html#sec:disabling-resolution-transitive-dependencies), it’s useful for excluding problematic dependencies from your project.\n\n## Rule Definition\nThis rule filters out transitives of the specified dependencies and JARs from the compile-time and runtime dependencies.\n\n```\ndeps_filter_disable_transitives(\n    name = <string>,\n    deps = <list of labels>,\n    runtime_deps = <list of labels>,\n    deps_to_exclude_transitives = <list of labels>,\n    testonly = <boolean, default = False>,\n)\n```\n\n### Attributes:\n- `name` (Required): Name of the target.\n- `deps` (Required): List of dependencies to include.\n- `runtime_deps` (Optional): List of runtime dependencies to include.\n- `deps_to_exclude_transitives` (Optional): List of dependencies for which transitive dependencies should be \n  excluded. (must be a subset of `deps` + `runtime_deps`)\n- `testonly` (Optional, Default: False): Restricts usage to test environments.\n\n\n## Adding to Your Project\n### Step 1: Add `rules_spring` to your workspace:\nFollow the steps mentioned [here](../../README.md#loading-the-spring-rules-in-your-workspace). \n\n### Step 2: Load the `deps_filter_disable_transitives` rule in your BUILD file:\n```\nload(\"@rules_spring//springboot/deps_filter_rules_legacy:deps_filter_disable_transitives.bzl\", \"deps_filter_disable_transitives\")\n```\n\n### Step 3: Define and reference the `deps_filter_disable_transitives` in other targets (e.g., `java_library`) to manage their dependencies:\n```\nload(\"@rules_spring//springboot/deps_filter_rules_legacy:deps_filter_disable_transitives.bzl\", \"deps_filter_disable_transitives\")\n\ndeps = [\n    ...\n]\n\nruntime_deps = [\n    ...\n]\n\ndeps_filter_disable_transitives(\n    name = \"filtered_deps\",\n    deps = deps,\n    runtime_deps = runtime_deps,\n    deps_to_exclude_transitives = [\"@maven//:some_dep_whose_transitives_you_dont_want\",]\n)\n\njava_library(\n    name = \"my_library\",\n    deps = [\":filtered_deps\"], # <--- KEY LINE: USE YOUR FILTERED DEPS HERE!\n    ...\n)\n\n# the filter is not specific to springboot apps, but is often used for springboot\n# due to the complexity of classpaths in springboot apps\nsalesforce_springboot(\n    name = \"myspringboot_app\",\n    java_library = \":my_library\",\n)\n```\n\n## Example Usage\n### Example 1\n```\ndeps_filter_disable_transitives(\n    name = \"filtered_deps_disable_transitives_case_A\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    deps_to_exclude_transitives = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n)\n```\n#### Behavior:\nThe build includes `@maven//:org_springframework_spring_jdbc` and `@maven//:org_springframework_spring_web`, but all transitive dependencies of both are excluded.\n\n### Example 2\n```\ndeps_filter_disable_transitives(\n    name = \"filtered_deps_disable_transitives_case_A\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n    deps_to_exclude_transitives = [\n        \"@maven//:org_springframework_spring_web\",\n    ],\n)\n```\n#### Behavior:\n- The build includes `@maven//:org_springframework_spring_jdbc` and its transitive dependencies, as well as `@maven//:org_springframework_spring_web`.\n- Transitive dependencies of `@maven//:org_springframework_spring_web` are excluded, but transitive dependencies of \n  `@maven//:org_springframework_spring_jdbc` are included.\n\n### Example 3\n```\ndeps_filter_disable_transitives(\n    name = \"filtered_deps_disable_transitives_case_A\",\n    deps = [\n        \"@maven//:org_springframework_spring_jdbc\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n)\n```\n#### Behavior:\n- The build includes `@maven//:org_springframework_spring_jdbc` and `@maven//:org_springframework_spring_web`, along with their respective transitive dependencies.\n- No dependencies are excluded.\n"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/src/test/java/com/depsfilter/DepsFilterWithTransitivesExclusionTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.List;\nimport org.junit.Test;\n\npublic class DepsFilterWithTransitivesExclusionTest {\n\n    private List<String> testDeps;\n    private List<String> depsList;\n    private List<String> excludedDirectDeps;\n    private List<String> nonexcludedDirectDeps;\n    private List<String> transitivesOfExcludedDirectDeps;\n    private List<String> transitivesOfNonExcludedDirectDeps;\n\n    @Test\n    public void testTransitivesExclusion() {\n        /*\n            Tests the 'deps_filter' rule with its 'exclude_transitives' attribute set to True.\n            Corresponds to the 'filtered_test_deps_with_transitives_excluded' rule in the BUILD file:\n            \n            deps_filter(\n                name = \"filtered_test_deps_with_transitives_excluded\",\n                deps = [\n                    \"@maven//:org_springframework_spring_jdbc\",\n                    \"@maven//:org_springframework_spring_web\",\n                ],\n                deps_exclude_labels = [\n                    \"@maven//:org_springframework_spring_web\", # share transitives with spring-jdbc\n                ],\n                exclude_transitives = True,\n                testonly = True,\n            )\n\n            This test verifies:\n            - Build-time deps include \"@maven//:org_springframework_spring_jdbc\" and its transitive deps\n            - Excluded deps include \"@maven//:org_springframework_spring_web\" and its transitive deps, except\n              those that are also transitive deps of \"@maven//:org_springframework_spring_jdbc\"\n            This is validated by checking the available deps in the code.\n        */\n\n        initialTestSetup();\n        List<String> expectedExcludedTransitives = getExcludedTransitives();\n        List<String> expectedNonExcludedTransitives = getNonExcludedTransitives();\n        List<String> availableDeps = computeClasspathDependencies();\n\n        // Ensure that excluded direct deps and their transitive deps (if not required by other non-excluded deps)\n        // are not present in the available dependencies.\n        for (String excludedDep : excludedDirectDeps) {\n            assertThat(availableDeps).doesNotContain(excludedDep);\n        }\n\n        for (String excludedTransitive : expectedExcludedTransitives) {\n            assertThat(availableDeps).doesNotContain(excludedTransitive);\n        }\n\n        // Ensure that non-excluded direct deps and their transitive deps are present in the available deps.\n        for (String nonExcludedDep : nonexcludedDirectDeps) {\n            assertThat(availableDeps).contains(nonExcludedDep);\n        }\n\n        for (String nonExcludedTransitive : expectedNonExcludedTransitives) {\n            assertThat(availableDeps).contains(nonExcludedTransitive);\n        }\n\n        // Ensure that combined list of testDeps, depsList, expectedExcludedTransitives, and\n        // expectedNonExcludedTransitives is equal to the combined list of availableDeps,\n        // excludedDirectDeps, and expectedExcludedTransitives.\n        List<String> expectedCombinedDepsList = new ArrayList<>();\n        List<String> actualCombinedDepsList = new ArrayList<>();\n        expectedCombinedDepsList.addAll(testDeps);\n        expectedCombinedDepsList.addAll(depsList);\n        expectedCombinedDepsList.addAll(expectedNonExcludedTransitives);\n        expectedCombinedDepsList.addAll(expectedExcludedTransitives);\n\n        actualCombinedDepsList.addAll(availableDeps);\n        actualCombinedDepsList.addAll(excludedDirectDeps);\n        actualCombinedDepsList.addAll(expectedExcludedTransitives);\n\n        assertThat(actualCombinedDepsList).containsExactlyInAnyOrderElementsOf(expectedCombinedDepsList);\n    }\n\n    private List<String> getExcludedTransitives() {\n        // Exclude transitive deps of excluded deps, except those of non-excluded deps or non-excluded deps themselves\n        List<String> expectedExcludedTransitives = new ArrayList<>();\n        for (String transitive : transitivesOfExcludedDirectDeps) {\n            if ((!transitivesOfNonExcludedDirectDeps.contains(transitive)) && (!nonexcludedDirectDeps.contains(\n                transitive))) {\n                expectedExcludedTransitives.add(transitive);\n            }\n        }\n        return expectedExcludedTransitives;\n    }\n\n    private List<String> getNonExcludedTransitives() {\n        // Transitive deps of non-excluded deps\n        List<String> expectedNonExcludedTransitives = new ArrayList<>();\n        for (String transitive : transitivesOfNonExcludedDirectDeps) {\n            expectedNonExcludedTransitives.add(transitive);\n        }\n        return expectedNonExcludedTransitives;\n    }\n\n    private List<String> computeClasspathDependencies() {\n        String classpath = System.getProperty(\"java.class.path\");\n        String[] classpathEntries = classpath.split(System.getProperty(\"path.separator\"));\n        List<String> availableDeps = new ArrayList<>();\n        for (String entry : classpathEntries) {\n            availableDeps.add(entry.replace(\"../\", \"\"));\n        }\n        return availableDeps;\n    }\n\n    private void initialTestSetup() {\n        // required to run the test - specified in the test target\n        testDeps = List.of(\"springboot/deps_filter_rules_legacy/DepsFilterWithTransitivesExclusionTest.jar\",\n            \"rules_jvm_external~~maven~maven/junit/junit/4.13.2/processed_junit-4.13.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest-core/2.2/processed_hamcrest-core-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest/2.2/processed_hamcrest-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/assertj/assertj-core/3.25.3/processed_assertj-core-3.25.3.jar\",\n            \"rules_jvm_external~~maven~maven/net/bytebuddy/byte-buddy/1.14.12/processed_byte-buddy-1.14.12.jar\",\n            \"rules_java~~toolchains~remote_java_tools/java_tools/Runner_deploy.jar\"\n        );\n\n        // specified in the 'deps' attribute of 'deps_filter'\n        depsList = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jdbc/6.1.14/processed_spring-jdbc-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-web/6.1.14/processed_spring-web-6.1.14.jar\"\n        );\n\n        // specified in the 'deps_exclude_labels' attribute of 'deps_filter'\n        excludedDirectDeps = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-web/6.1.14/processed_spring-web-6.1.14.jar\"\n        );\n\n        // deps that are not excluded = depsList - excludedDirectDeps\n        nonexcludedDirectDeps = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jdbc/6.1.14/processed_spring-jdbc-6.1.14.jar\"\n        );\n\n        transitivesOfExcludedDirectDeps = List.of(\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-observation/1.13\"\n            + \".6/processed_micrometer-observation-1.13.6.jar\",\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-commons/1.13.6/processed_micrometer-commons-1\"\n            + \".13.6.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\"\n        );\n\n        transitivesOfNonExcludedDirectDeps = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-tx/6.1.14/processed_spring-tx-6.1.14.jar\"\n        );\n    }\n}"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/src/test/java/com/depsfilter/DepsFilterWithoutTransitivesExclusionTest.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class DepsFilterWithoutTransitivesExclusionTest {\n\n    private List<String> testDeps;\n    private List<String> depsList;\n    private List<String> excludedDirectDeps;\n    private List<String> nonexcludedDirectDeps;\n    private List<String> transitivesOfExcludedDirectDeps;\n    private List<String> transitivesOfNonExcludedDirectDeps;\n\n    @Test\n    public void testTransitivesExclusion() {\n        /*\n            Tests the 'deps_filter' rule with its 'exclude_transitives' attribute set to False.\n            Corresponds to the 'filtered_test_deps_with_transitives_excluded' rule in the BUILD file:\n\n            deps_filter(\n                name = \"filtered_test_deps_without_transitives_excluded\",\n                deps = [\n                    \"@maven//:org_springframework_spring_jdbc\",\n                    \"@maven//:org_springframework_spring_web\",\n                ],\n                deps_exclude_labels = [\n                    \"@maven//:org_springframework_spring_web\", # share transitives with spring-jdbc\n                ],\n                exclude_transitives = False,\n                testonly = True,\n            )\n\n            This test verifies:\n            - Excluded deps include \"@maven//:org_springframework_spring_web\"\n            - Build-time deps include \"@maven//:org_springframework_spring_jdbc\" and its transitive deps\n              Build-time deps also include transitive deps of \"@maven//:org_springframework_spring_web\"\n\n            This is validated by checking the available deps in the code.\n        */\n\n        initialTestSetup();\n        List<String> allTransitivesDeps = getTransitiveDeps();\n        List<String> availableDeps = computeClasspathDependencies();\n\n        // Ensure that direct deps listed for exclusion are not present in the available deps.\n        for (String excludedDep : excludedDirectDeps) {\n            assertThat(availableDeps).doesNotContain(excludedDep);\n        }\n\n        // Ensure that non-excluded direct deps, their transitive deps, and the transitive deps of excluded deps are\n        // present in the available deps.\n        for (String nonExcludedDep : nonexcludedDirectDeps) {\n            assertThat(availableDeps).contains(nonExcludedDep);\n        }\n\n        for (String transitive : transitivesOfExcludedDirectDeps) {\n            assertThat(availableDeps).contains(transitive);\n        }\n\n        for (String transitive : transitivesOfNonExcludedDirectDeps) {\n            assertThat(availableDeps).contains(transitive);\n        }\n\n        // Ensure that the combined list of testDeps, depsList, and allTransitivesDeps\n        // is equal to the combined list of availableDeps, and excludedDirectDeps.\n        List<String> expectedCombinedDepsList = new ArrayList<>();\n        List<String> actualCombinedDepsList = new ArrayList<>();\n        expectedCombinedDepsList.addAll(testDeps);\n        expectedCombinedDepsList.addAll(depsList);\n        expectedCombinedDepsList.addAll(allTransitivesDeps);\n\n        actualCombinedDepsList.addAll(availableDeps);\n        actualCombinedDepsList.addAll(excludedDirectDeps);\n\n        assertThat(actualCombinedDepsList).containsExactlyInAnyOrderElementsOf(expectedCombinedDepsList);\n    }\n\n    private List<String> getTransitiveDeps() {\n        // Compute transitive deps of both excluded and non-excluded deps\n        Set<String> uniqueTransitivesSet = new HashSet<>();\n        uniqueTransitivesSet.addAll(transitivesOfExcludedDirectDeps);\n        uniqueTransitivesSet.addAll(transitivesOfNonExcludedDirectDeps);\n        for (String directDependency : depsList) {\n            uniqueTransitivesSet.remove(directDependency);\n        }\n        List<String> allTransitivesDeps = List.copyOf(uniqueTransitivesSet);\n        return allTransitivesDeps;\n    }\n\n    private List<String> computeClasspathDependencies() {\n        String classpath = System.getProperty(\"java.class.path\");\n        String[] classpathEntries = classpath.split(System.getProperty(\"path.separator\"));\n        List<String> availableDeps = new ArrayList<>();\n        for (String entry : classpathEntries) {\n            availableDeps.add(entry.replace(\"../\", \"\"));\n        }\n        return availableDeps;\n    }\n\n    private void initialTestSetup() {\n        // required to run the test - specified in the test target\n        testDeps = List.of(\"springboot/deps_filter_rules_legacy/DepsFilterWithoutTransitivesExclusionTest.jar\",\n            \"rules_jvm_external~~maven~maven/junit/junit/4.13.2/processed_junit-4.13.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest-core/2.2/processed_hamcrest-core-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest/2.2/processed_hamcrest-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/assertj/assertj-core/3.25.3/processed_assertj-core-3.25.3.jar\",\n            \"rules_jvm_external~~maven~maven/net/bytebuddy/byte-buddy/1.14.12/processed_byte-buddy-1.14.12.jar\",\n            \"rules_java~~toolchains~remote_java_tools/java_tools/Runner_deploy.jar\"\n        );\n\n        // specified in the 'deps' attribute of 'deps_filter'\n        depsList = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jdbc/6.1.14/processed_spring-jdbc-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-web/6.1.14/processed_spring-web-6.1.14.jar\"\n        );\n\n        // specified in the 'deps_exclude_labels' attribute of 'deps_filter'\n        excludedDirectDeps = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-web/6.1.14/processed_spring-web-6.1.14.jar\"\n        );\n\n        // deps that are not excluded = depsList - excludedDirectDeps\n        nonexcludedDirectDeps = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jdbc/6.1.14/processed_spring-jdbc-6.1.14.jar\"\n        );\n\n        transitivesOfExcludedDirectDeps = List.of(\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-observation/1.13\"\n            + \".6/processed_micrometer-observation-1.13.6.jar\",\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-commons/1.13.6/processed_micrometer-commons-1\"\n            + \".13.6.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\"\n        );\n\n        transitivesOfNonExcludedDirectDeps = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-tx/6.1.14/processed_spring-tx-6.1.14.jar\"\n        );\n    }\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/src/test/java/com/depsfilter/TransitiveDepsFilterCaseA.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class TransitiveDepsFilterCaseA {\n\n    private List<String> testDeps;\n    private List<String> depsList;\n    private List<String> transitivesOfFirstDep;\n    private List<String> transitivesOfSecondDep;\n\n    @Test\n    public void testTransitivesExclusion() {\n        /*\n            This test is for the 'deps_filter_disable_transitives' rule\n            Corresponds to the 'filtered_deps_disable_transitives_case_A' rule in the BUILD file:\n\n            deps_filter_disable_transitives(\n                name = \"filtered_deps_disable_transitives_case_A\",\n                deps = [\n                    \"@maven//:org_springframework_spring_jdbc\",\n                    \"@maven//:org_springframework_spring_web\",\n                ],\n                deps_to_exclude_transitives = [\n                    \"@maven//:org_springframework_spring_jdbc\",\n                    \"@maven//:org_springframework_spring_web\",\n                ],\n                testonly = True,\n            )\n\n            It verifies:\n            - Build-time deps include \"@maven//:org_springframework_spring_jdbc\" and\n              \"@maven//:org_springframework_spring_web\"\n            - Excluded deps include transitive deps of \"@maven//:org_springframework_spring_jdbc\" and\n              \"@maven//:org_springframework_spring_web\" i.e exclude all the transitive deps.\n\n            This is validated by checking the available deps in the code.\n        */\n\n        initialTestSetup();\n        List<String> allTransitivesDeps = getTransitiveDeps();\n        List<String> availableDeps = computeClasspathDependencies();\n\n        // Ensure that all transitive deps are not present in available deps.\n        for (String transitive : allTransitivesDeps) {\n            assertThat(availableDeps).doesNotContain(transitive);\n        }\n\n        // Ensure that all direct deps are present in available deps.\n        for (String dep : depsList) {\n            assertThat(availableDeps).contains(dep);\n        }\n\n        // Ensure that combined list of testDeps, and depsList is equal to combined list of available deps.\n        List<String> expectedCombinedDepsList = new ArrayList<>();\n        List<String> actualCombinedDepsList = new ArrayList<>();\n        expectedCombinedDepsList.addAll(testDeps);\n        expectedCombinedDepsList.addAll(depsList);\n\n        actualCombinedDepsList.addAll(availableDeps);\n\n        assertThat(actualCombinedDepsList).containsExactlyInAnyOrderElementsOf(expectedCombinedDepsList);\n    }\n\n    private List<String> getTransitiveDeps() {\n        Set<String> uniqueTransitivesSet = new HashSet<>();\n        uniqueTransitivesSet.addAll(transitivesOfFirstDep);\n        uniqueTransitivesSet.addAll(transitivesOfSecondDep);\n        for (String directDependency : depsList) {\n            uniqueTransitivesSet.remove(directDependency);\n        }\n        List<String> allTransitivesDeps = List.copyOf(uniqueTransitivesSet);\n        return allTransitivesDeps;\n    }\n\n\n    private List<String> computeClasspathDependencies() {\n        String classpath = System.getProperty(\"java.class.path\");\n        String[] classpathEntries = classpath.split(System.getProperty(\"path.separator\"));\n        List<String> availableDeps = new ArrayList<>();\n        for (String entry : classpathEntries) {\n            availableDeps.add(entry.replace(\"../\", \"\"));\n        }\n        return availableDeps;\n    }\n\n    private void initialTestSetup() {\n        // required to run the test - specified in the test target\n        testDeps = List.of(\"springboot/deps_filter_rules_legacy/TransitiveDepsFilterCaseA.jar\",\n            \"rules_jvm_external~~maven~maven/junit/junit/4.13.2/processed_junit-4.13.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest-core/2.2/processed_hamcrest-core-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest/2.2/processed_hamcrest-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/assertj/assertj-core/3.25.3/processed_assertj-core-3.25.3.jar\",\n            \"rules_jvm_external~~maven~maven/net/bytebuddy/byte-buddy/1.14.12/processed_byte-buddy-1.14.12.jar\",\n            \"rules_java~~toolchains~remote_java_tools/java_tools/Runner_deploy.jar\"\n        );\n\n        // specified in the 'deps' attribute of 'deps_filter'\n        depsList = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jdbc/6.1.14/processed_spring-jdbc-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-web/6.1.14/processed_spring-web-6.1.14.jar\"\n        );\n\n        transitivesOfFirstDep = List.of(\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-observation/1.13\"\n            + \".6/processed_micrometer-observation-1.13.6.jar\",\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-commons/1.13.6/processed_micrometer-commons-1\"\n            + \".13.6.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\"\n        );\n\n        transitivesOfSecondDep = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-tx/6.1.14/processed_spring-tx-6.1.14.jar\"\n        );\n    }\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/src/test/java/com/depsfilter/TransitiveDepsFilterCaseB.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class TransitiveDepsFilterCaseB {\n\n    private List<String> testDeps;\n    private List<String> depsList;\n    private List<String> transitivesOfFirstDep;\n    private List<String> transitivesOfSecondDep;\n\n    @Test\n    public void testTransitivesExclusion() {\n        /*\n            This test is for the 'deps_filter_disable_transitives' rule\n            Corresponds to the 'filtered_deps_disable_transitives_case_B' rule in the BUILD file:\n    \n            deps_filter_disable_transitives(\n                name = \"filtered_deps_disable_transitives_case_B\",\n                deps = [\n                    \"@maven//:org_springframework_spring_jdbc\",\n                    \"@maven//:org_springframework_spring_web\",\n                ],\n                deps_to_exclude_transitives = [\n                    \"@maven//:org_springframework_spring_web\",\n                ],\n                testonly = True,\n            )\n\n            This test verifies:\n            - Build-time deps include \"@maven//:org_springframework_spring_jdbc\", its transitive deps, and\n              \"@maven//:org_springframework_spring_web\"\n            - Excluded deps include transitive deps of @maven//:org_springframework_spring_web, except those that are\n              transitive deps of @maven//:org_springframework_spring_jdbc\"\n\n            This is validated by checking the available deps in the code.\n        */\n\n        initialTestSetup();\n        List<String> expectedExcludedTransitives = getExcludedTransitives();\n        List<String> expectedNonExcludedTransitives = getNonExcludedTransitives();\n        List<String> availableDeps = computeClasspathDependencies();\n\n        // Ensure that all expected excluded deps are not present in available deps.\n        for (String excludedTransitive : expectedExcludedTransitives) {\n            assertThat(availableDeps).doesNotContain(excludedTransitive);\n        }\n\n        // Ensure that all direct deps are present in available deps.\n        for (String dep : depsList) {\n            assertThat(availableDeps).contains(dep);\n        }\n\n        // Ensure that transitive deps of deps not specified in deps_to_exclude_transitives are present in available\n        // deps.\n        for (String nonExcludedTransitive : expectedNonExcludedTransitives) {\n            assertThat(availableDeps).contains(nonExcludedTransitive);\n        }\n\n        // Ensure that combined list of  testDeps, depsList, expectedExcludedTransitives, and\n        // expectedNonExcludedTransitives is equal to combined list of availableDeps, and\n        // expectedExcludedTransitives.\n        List<String> expectedCombinedDepsList = new ArrayList<>();\n        List<String> actualCombinedDepsList = new ArrayList<>();\n        expectedCombinedDepsList.addAll(testDeps);\n        expectedCombinedDepsList.addAll(depsList);\n        expectedCombinedDepsList.addAll(expectedNonExcludedTransitives);\n        expectedCombinedDepsList.addAll(expectedExcludedTransitives);\n\n        actualCombinedDepsList.addAll(availableDeps);\n        actualCombinedDepsList.addAll(expectedExcludedTransitives);\n\n        assertThat(actualCombinedDepsList)\n            .containsExactlyInAnyOrderElementsOf(expectedCombinedDepsList);\n    }\n\n    private List<String> getExcludedTransitives() {\n        // All transitive deps of specified deps in the exclusion list should be excluded,\n        // except those that are also transitive deps of deps not in exclusion list\n        // or the direct deps themselves\n        List<String> expectedExcludedTransitives = new ArrayList<>();\n        for (String transitive : transitivesOfFirstDep) {\n            if ((!transitivesOfSecondDep.contains(transitive))\n                && (!depsList.contains(transitive))) {\n                expectedExcludedTransitives.add(transitive);\n            }\n        }\n        return expectedExcludedTransitives;\n    }\n\n    private List<String> getNonExcludedTransitives() {\n        // Transitive deps of direct deps that are not specified in the exclusion list\n        List<String> expectedNonExcludedTransitives = new ArrayList<>();\n        for (String transitive : transitivesOfSecondDep) {\n            expectedNonExcludedTransitives.add(transitive);\n        }\n        return expectedNonExcludedTransitives;\n    }\n\n\n    private List<String> computeClasspathDependencies() {\n        String classpath = System.getProperty(\"java.class.path\");\n        String[] classpathEntries = classpath.split(System.getProperty(\"path.separator\"));\n        List<String> availableDeps = new ArrayList<>();\n        for (String entry : classpathEntries) {\n            availableDeps.add(entry.replace(\"../\", \"\"));\n        }\n        return availableDeps;\n    }\n\n    private void initialTestSetup() {\n        // required to run the test - specified in the test target\n        testDeps = List.of(\"springboot/deps_filter_rules_legacy/TransitiveDepsFilterCaseB.jar\",\n            \"rules_jvm_external~~maven~maven/junit/junit/4.13.2/processed_junit-4.13.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest-core/2.2/processed_hamcrest-core-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest/2.2/processed_hamcrest-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/assertj/assertj-core/3.25.3/processed_assertj-core-3.25.3.jar\",\n            \"rules_jvm_external~~maven~maven/net/bytebuddy/byte-buddy/1.14.12/processed_byte-buddy-1.14.12.jar\",\n            \"rules_java~~toolchains~remote_java_tools/java_tools/Runner_deploy.jar\"\n        );\n\n        // specified in the 'deps' attribute of 'deps_filter'\n        depsList = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jdbc/6.1.14/processed_spring-jdbc-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-web/6.1.14/processed_spring-web-6.1.14.jar\"\n        );\n\n        transitivesOfFirstDep = List.of(\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-observation/1.13\"\n            + \".6/processed_micrometer-observation-1.13.6.jar\",\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-commons/1.13.6/processed_micrometer-commons-1\"\n            + \".13.6.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\"\n        );\n\n        transitivesOfSecondDep = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-tx/6.1.14/processed_spring-tx-6.1.14.jar\"\n        );\n    }\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/src/test/java/com/depsfilter/TransitiveDepsFilterCaseC.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class TransitiveDepsFilterCaseC {\n\n    private List<String> testDeps;\n    private List<String> depsList;\n    private List<String> transitivesOfFirstDep;\n    private List<String> transitivesOfSecondDep;\n\n    @Test\n    public void testTransitivesExclusion() {\n        /*\n            This test is for the 'deps_filter_disable_transitives' rule\n            Corresponds to the 'filtered_deps_disable_transitives_case_B' rule in the BUILD file:\n    \n            deps_filter_disable_transitives(\n                name = \"filtered_deps_disable_transitives_case_C\",\n                deps = [\n                    \"@maven//:org_springframework_spring_jdbc\",\n                    \"@maven//:org_springframework_spring_web\",\n                ],\n                deps_to_exclude_transitives = [\n                    \"@maven//:org_springframework_spring_jdbc\",\n                ],\n                testonly = True,\n            )\n\n            This test verifies:\n            - Build-time deps include \"@maven//:org_springframework_spring_web\", its transitive deps, and\n              \"@maven//:org_springframework_spring_jdbc\"\n            - Excluded deps include transitive deps of @maven//:org_springframework_spring_jdbc, except those that\n              are transitive deps of @maven//:org_springframework_spring_web\"\n\n            This is validated by checking the available deps in the code.\n        */\n\n        initialTestSetup();\n        List<String> expectedExcludedTransitives = getExcludedTransitives();\n        List<String> expectedNonExcludedTransitives = getNonExcludedTransitives();\n        List<String> availableDeps = computeClasspathDependencies();\n\n        // Ensure that all expected excluded deps are not present in available deps.\n        for (String excludedTransitive : expectedExcludedTransitives) {\n            assertThat(availableDeps).doesNotContain(excludedTransitive);\n        }\n\n        // Ensure that all direct deps are present in available deps.\n        for (String dep : depsList) {\n            assertThat(availableDeps).contains(dep);\n        }\n\n        // Ensure that the transitive deps of direct deps, which are not listed in the exclusion list,\n        // are included in the available dependencies.\n        for (String nonExcludedTransitive : expectedNonExcludedTransitives) {\n            assertThat(availableDeps).contains(nonExcludedTransitive);\n        }\n\n        // Ensure that combined list of  testDeps, depsList, expectedExcludedTransitives, and\n        // expectedNonExcludedTransitives is equal to combined list of availableDeps, and expectedExcludedTransitives.\n        List<String> expectedCombinedDepsList = new ArrayList<>();\n        List<String> actualCombinedDepsList = new ArrayList<>();\n        expectedCombinedDepsList.addAll(testDeps);\n        expectedCombinedDepsList.addAll(depsList);\n        expectedCombinedDepsList.addAll(expectedNonExcludedTransitives);\n        expectedCombinedDepsList.addAll(expectedExcludedTransitives);\n        actualCombinedDepsList.addAll(availableDeps);\n        actualCombinedDepsList.addAll(expectedExcludedTransitives);\n\n        assertThat(actualCombinedDepsList)\n            .containsExactlyInAnyOrderElementsOf(expectedCombinedDepsList);\n    }\n\n    private List<String> getExcludedTransitives() {\n        // All transitive deps of specified deps in the exclusion list should be excluded,\n        // except those that are also transitives deps of deps not in exclusion list\n        // or the direct deps themselves.\n        List<String> expectedExcludedTransitives = new ArrayList<>();\n        for (String transitive : transitivesOfSecondDep) {\n            if ((!transitivesOfFirstDep.contains(transitive))\n                && (!depsList.contains(transitive))) {\n                expectedExcludedTransitives.add(transitive);\n            }\n        }\n        return expectedExcludedTransitives;\n    }\n\n    private List<String> getNonExcludedTransitives() {\n        // Transitive deps of direct deps that are not specified in the exclusion list\n        List<String> expectedNonExcludedTransitives = new ArrayList<>();\n        for (String transitive : transitivesOfFirstDep) {\n            if (!expectedNonExcludedTransitives.contains(transitive)) {\n                expectedNonExcludedTransitives.add(transitive);\n            }\n        }\n        return expectedNonExcludedTransitives;\n    }\n\n\n    private List<String> computeClasspathDependencies() {\n        String classpath = System.getProperty(\"java.class.path\");\n        String[] classpathEntries = classpath.split(System.getProperty(\"path.separator\"));\n        List<String> availableDeps = new ArrayList<>();\n        for (String entry : classpathEntries) {\n            availableDeps.add(entry.replace(\"../\", \"\"));\n        }\n        return availableDeps;\n    }\n\n    private void initialTestSetup() {\n        // required to run the test - specified in the test target\n        testDeps = List.of(\"springboot/deps_filter_rules_legacy/TransitiveDepsFilterCaseC.jar\",\n            \"rules_jvm_external~~maven~maven/junit/junit/4.13.2/processed_junit-4.13.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest-core/2.2/processed_hamcrest-core-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest/2.2/processed_hamcrest-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/assertj/assertj-core/3.25.3/processed_assertj-core-3.25.3.jar\",\n            \"rules_jvm_external~~maven~maven/net/bytebuddy/byte-buddy/1.14.12/processed_byte-buddy-1.14.12.jar\",\n            \"rules_java~~toolchains~remote_java_tools/java_tools/Runner_deploy.jar\"\n        );\n\n        // specified in the 'deps' attribute of 'deps_filter'\n        depsList = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jdbc/6.1.14/processed_spring-jdbc-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-web/6.1.14/processed_spring-web-6.1.14.jar\"\n        );\n\n        transitivesOfFirstDep = List.of(\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-observation/1.13\"\n            + \".6/processed_micrometer-observation-1.13.6.jar\",\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-commons/1.13.6/processed_micrometer-commons-1\"\n            + \".13.6.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\"\n        );\n\n        transitivesOfSecondDep = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-tx/6.1.14/processed_spring-tx-6.1.14.jar\"\n        );\n    }\n}\n"
  },
  {
    "path": "springboot/deps_filter_rules_legacy/src/test/java/com/depsfilter/TransitiveDepsFilterCaseD.java",
    "content": "package com.depsfilter;\n\nimport static org.assertj.core.api.Assertions.assertThat;\n\nimport java.util.ArrayList;\nimport java.util.HashSet;\nimport java.util.List;\nimport java.util.Set;\nimport org.junit.Test;\n\npublic class TransitiveDepsFilterCaseD {\n\n    private List<String> testDeps;\n    private List<String> depsList;\n    private List<String> transitivesOfFirstDep;\n    private List<String> transitivesOfSecondDep;\n\n    @Test\n    public void testTransitivesExclusion() {\n        /*\n            This test is for the 'deps_filter_disable_transitives' rule\n            Corresponds to the 'filtered_deps_disable_transitives_case_B' rule in the BUILD file:\n    \n            deps_filter_disable_transitives(\n                name = \"filtered_deps_disable_transitives_case_D\",\n                deps = [\n                    \"@maven//:org_springframework_spring_jdbc\",\n                    \"@maven//:org_springframework_spring_web\",\n                ],\n                testonly = True,\n            )\n\n            This test verifies:\n            - Build-time deps include \"@maven//:org_springframework_spring_jdbc\" and\n              \"@maven//:org_springframework_spring_web\", and their transitive deps\n            - No deps are excluded\n            This is validated by checking the available deps in the code.\n        */\n\n        initialTestSetup();\n        List<String> allTransitivesDeps = getTransitiveDeps();\n        List<String> availableDeps = computeClasspathDependencies();\n\n        // Ensure that all transitive deps are included in available deps.\n        for (String transitive : allTransitivesDeps) {\n            assertThat(availableDeps).contains(transitive);\n        }\n\n        // Ensure that all direct deps are included in available deps.\n        for (String dep : depsList) {\n            assertThat(availableDeps).contains(dep);\n        }\n\n        // Ensure that combined list of testDeps, depsList, and allTransitivesDeps \n        // is equal to availableDeps\n        List<String> expectedCombinedDepsList = new ArrayList<>();\n        List<String> actualCombinedDepsList = new ArrayList<>();\n        expectedCombinedDepsList.addAll(testDeps);\n        expectedCombinedDepsList.addAll(depsList);\n        expectedCombinedDepsList.addAll(allTransitivesDeps);\n\n        actualCombinedDepsList.addAll(availableDeps);\n\n        assertThat(actualCombinedDepsList).containsExactlyInAnyOrderElementsOf(expectedCombinedDepsList);\n    }\n\n    private List<String> getTransitiveDeps() {\n        // Compute transitive deps of both excluded and non-excluded deps\n        Set<String> uniqueTransitivesSet = new HashSet<>();\n        uniqueTransitivesSet.addAll(transitivesOfFirstDep);\n        uniqueTransitivesSet.addAll(transitivesOfSecondDep);\n        for (String directDependency : depsList) {\n            uniqueTransitivesSet.remove(directDependency);\n        }\n        List<String> allTransitivesDeps = List.copyOf(uniqueTransitivesSet);\n        return allTransitivesDeps;\n    }\n\n\n    private List<String> computeClasspathDependencies() {\n        String classpath = System.getProperty(\"java.class.path\");\n        String[] classpathEntries = classpath.split(System.getProperty(\"path.separator\"));\n        List<String> availableDeps = new ArrayList<>();\n        for (String entry : classpathEntries) {\n            availableDeps.add(entry.replace(\"../\", \"\"));\n        }\n        return availableDeps;\n    }\n\n    private void initialTestSetup() {\n        // required to run the test - specified in the test target\n        testDeps = List.of(\"springboot/deps_filter_rules_legacy/TransitiveDepsFilterCaseD.jar\",\n            \"rules_jvm_external~~maven~maven/junit/junit/4.13.2/processed_junit-4.13.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest-core/2.2/processed_hamcrest-core-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/hamcrest/hamcrest/2.2/processed_hamcrest-2.2.jar\",\n            \"rules_jvm_external~~maven~maven/org/assertj/assertj-core/3.25.3/processed_assertj-core-3.25.3.jar\",\n            \"rules_jvm_external~~maven~maven/net/bytebuddy/byte-buddy/1.14.12/processed_byte-buddy-1.14.12.jar\",\n            \"rules_java~~toolchains~remote_java_tools/java_tools/Runner_deploy.jar\"\n        );\n\n        // specified in the 'deps' attribute of 'deps_filter'\n        depsList = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jdbc/6.1.14/processed_spring-jdbc-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-web/6.1.14/processed_spring-web-6.1.14.jar\"\n        );\n\n        transitivesOfFirstDep = List.of(\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-observation/1.13\"\n            + \".6/processed_micrometer-observation-1.13.6.jar\",\n            \"rules_jvm_external~~maven~maven/io/micrometer/micrometer-commons/1.13.6/processed_micrometer-commons-1\"\n            + \".13.6.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\"\n        );\n\n        transitivesOfSecondDep = List.of(\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-beans/6.1.14/processed_spring-beans-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-core/6.1.14/processed_spring-core-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-jcl/6.1.14/processed_spring-jcl-6.1.14.jar\",\n            \"rules_jvm_external~~maven~maven/org/springframework/spring-tx/6.1.14/processed_spring-tx-6.1.14.jar\"\n        );\n    }\n}\n"
  },
  {
    "path": "springboot/deps_filter_transitive.bzl",
    "content": "\n# THIS VERSION OF THE FILTER IS DEPRECATED AND WILL BE REMOVED\n# Use deps_filter instead: \n#  load(\"@rules_spring//springboot/deps_filter_rules_legacy:deps_filter.bzl\", \"deps_filter\")\n# \n# Note: the attribute deps_exclude has been renamed deps_exclude_labels for deps_filter\n\n\ndef _depaggregator_rule_impl(merged, ctx):\n    \"\"\"\n    This method processes declared deps and their transitive closures \n    to assemble a cohesive set of jars essential for the build process. During \n    this process, it excludes deps specified in 'deps_exclude', which \n    lists jar labels to be omitted from packaging due to issues that cannot \n    be resolved upstream. By default, with 'exclude_transitives' set to true, any \n    transitive deps that are only required by excluded deps \n    are also omitted, ensuring that only necessary transitives are included \n    in the final package. It uses 'deps_exclude_paths' to exclude deps \n    based on partial filename matches, ensuring problematic files are also \n    excluded from the build. This method ensures that only necessary \n    deps are included for the build process.\n    \"\"\"\n    exclude_transitives = ctx.attr.exclude_transitives\n\n    # list to store jars to be included and a dictionary to track excluded jars\n    jars = []\n    excludes = {}\n\n    if exclude_transitives:\n        # Dictionary to track transitive dependency paths that should be excluded\n        transitives_excludes = {}\n\n        # List to store deps info for deps present in 'deps_exclude'\n        direct_excludes = []\n\n    # Iterate through the deps specified in 'deps_exclude' to collect \n    # jars that should be excluded from the final set.\n\n    for exclusion_info in ctx.attr.deps_exclude:    \n        # For each excluded dependency, add its compile-time JARs to the exclusion list\n        for compile_jar in exclusion_info[JavaInfo].full_compile_jars.to_list():\n            excludes[compile_jar.path] = True\n        \n        if exclude_transitives:\n            # Mark all transitives of the current dependency as excluded\n            # This list will be updated later based on transitives of non-excluded deps\n            direct_excludes.append(str(exclusion_info))\n            for transitive_jar in exclusion_info[JavaInfo].transitive_runtime_jars.to_list():\n                transitives_excludes[transitive_jar.path] = True\n\n    if exclude_transitives:\n        # Iterate over all deps, for non-excluded deps, mark their transitives as included.\n        for deps_info in ctx.attr.deps:\n            # skip the current dependency if it is listed in 'deps_exclude'.\n            if str(deps_info) in direct_excludes:\n                continue     \n                    \n            # For non-excluded deps, mark them and their transitive deps as included (not to be excluded)\n            # (transitive_runtime_jars includes both the primary JAR and its transitive deps)\n            for transitive_jar in deps_info[JavaInfo].transitive_runtime_jars.to_list():\n                if transitive_jar.path in transitives_excludes:\n                    transitives_excludes[transitive_jar.path] = False\n\n        # update the excludes list\n        for dep_path in transitives_excludes:            \n            # print(\"Transitive:\", str(dep_path), \"is excluded\", transitives_excludes[dep_path])\n            if transitives_excludes[dep_path]:\n                excludes[dep_path] = True\n    \n    # compute the final set of jars\n    for dep in merged.transitive_runtime_jars.to_list():\n        # If the current JAR is in the exclusion list, skip it (do not include it)\n        if excludes.get(dep.path, None) != None:\n             pass\n        else:\n            # Default to including the JAR unless a pattern match excludes it\n            include = True\n            for pattern in ctx.attr.deps_exclude_paths:\n                if dep.path.find(pattern) > -1:\n                    include = False\n                    break\n            if include:\n                jars.append(dep)\n\n    return jars\n\ndef _deps_filter_transitive_impl(ctx):\n    \"\"\"\n    This rule filters out specified deps and JARs from the compile-time \n    and runtime deps. It utilizes the 'deps_exclude' attribute to omit \n    specific JAR labels and the 'deps_exclude_paths' attribute to exclude \n    deps  based on partial paths in their filenames. By default, with \n    'exclude_transitives' set to true, any transitive deps solely required \n    by the deps in 'deps_exclude' are also excluded. These exclusions ensure\n    the final collection includes only the necessary elements for the build\n    process, eliminating problematic deps.\n    \"\"\" \n\n    print(\"WARN: deps_filter_transitive has been moved to a new name. See rules_spring docs for details.\")\n\n    if len(ctx.attr.deps) == 0:\n        fail(\"Error: 'deps' cannot be an empty list\")\n    \n    # magical incantation for getting upstream transitive closure of java deps\n    merged = java_common.merge([dep[java_common.provider] for dep in ctx.attr.deps])\n    runtime_dep_merged = java_common.merge([runtime_dep[java_common.provider] for runtime_dep in ctx.attr.runtime_deps])\n\n    compile_time_jars = _depaggregator_rule_impl(merged, ctx)\n    runtime_jars = _depaggregator_rule_impl(runtime_dep_merged, ctx)\n\n    if len(compile_time_jars) == 0:\n        fail(\"Error: The rule must return at least one compile-time JAR. Excluding all compile-time dependencies is not allowed.\")\n\n    return [\n            DefaultInfo(files = depset(compile_time_jars,)),\n            JavaInfo(\n                compile_jar = None,\n                output_jar = compile_time_jars[0],         # output jar must be non-empty, adding a dummy value to it\n                exports = [JavaInfo(source_jar = jar, compile_jar = jar, output_jar = jar) for jar in compile_time_jars],\n                runtime_deps = [JavaInfo(source_jar = jar, compile_jar = jar, output_jar = jar) for jar in\n                                runtime_jars],\n                deps = [JavaInfo(source_jar = jar, compile_jar = jar, output_jar = jar) for jar in compile_time_jars],\n            ),\n            ]\n\n\ndeps_filter_transitive = rule(\n    implementation = _deps_filter_transitive_impl,\n    attrs = {\n        \"deps\": attr.label_list(providers = [java_common.provider]),\n        \"runtime_deps\": attr.label_list(providers = [java_common.provider], allow_empty = True),\n        \"deps_exclude\": attr.label_list(providers = [java_common.provider], allow_empty = True),\n        \"deps_exclude_paths\": attr.string_list(),\n        \"exclude_transitives\": attr.bool(default = True),  \n    },\n)"
  },
  {
    "path": "springboot/detect_javax_classes.py",
    "content": "#\n# Copyright (c) 2023, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\nfrom collections import defaultdict\nimport hashlib\nimport os\nimport sys\nimport zipfile\nimport tempfile\n\n\ndef _check_for_javax_classes(springbootzip_filepath, ignorelisted_jars, output_filepath):\n    \"\"\"\n    Prints error message and returns True if javax classes were found,\n    false otherwise.\n\n    Jars in the ignorelisted_jars list are excluded from the check.\n    \"\"\"\n\n    # this will be set to True if any javax classes are found, that are not\n    # contained by any jar in the ignorelist\n    found_javax = False\n    # this set will contain the jars that contain the violaters\n    javax_containing_jars = set()\n    # list of paths of classes that are javax\n    # use each string entry as a key into the class_catalog dict\n    javax_classes = []\n    javax_message_lines = \"\"\n\n    # dict that maps the path to a class to all jars (as list) it was found in,\n    #   and the hash for each appearance\n    # for example:\n    # com/acme/common/HostUtil.class ->\n    # [\n    #   { bazel-out/.../foolib.jar, 5807cc49dfbda8dd937de3b33a885409 },\n    #   { bazel-out/.../blahlib.jar, 5807cc49dfbda8dd937de3b33a885409 }\n    # ]\n    class_catalog = defaultdict(list)\n\n    # Starting the search....\n    # iterate through the springboot jar file, and find inner jars,\n    # open each inner jar and catalog each .class file found\n    try:\n        springbootzip = zipfile.ZipFile(springbootzip_filepath)\n    except zipfile.BadZipFile:\n        # this error happened to me when my computer ran out of disk space during a build\n        result = \"Spring Boot javax detection has failed for %s because the generated jar file is corrupt, please delete this file.\\n\" % springbootzip_filepath\n        print(result)\n        _write_result_to_output_file(output_filepath, result)\n        return True\n\n    sprintbootzipentries = springbootzip.infolist()\n    for springbootzipentry in sprintbootzipentries:\n        if springbootzipentry.filename.endswith(\".jar\"):\n            jar_path = springbootzipentry.filename\n            innerjar = springbootzip.open(springbootzipentry.filename)\n\n            # create a temporary copy of the inner jar as a file on disk\n            innerjar_binarycontent = innerjar.read()\n            innerjar_tmp_fileondisk = tempfile.TemporaryFile()\n            innerjar_tmp_fileondisk.write(innerjar_binarycontent)\n            # initialize a ZipFile object using the temporary copy\n            innerjar_zip = zipfile.ZipFile(innerjar_tmp_fileondisk)\n            innerjar_zipentries = innerjar_zip.infolist()\n\n            for innerjar_zipentry in innerjar_zipentries:\n                innerjar_zipentry_path = innerjar_zipentry.filename\n                if (innerjar_zipentry_path.startswith(\"javax\")):\n                    if innerjar_zipentry_path.endswith(\".class\"):\n                        if innerjar_zipentry_path.endswith(\"module-info.class\"):\n                            continue\n\n                        jar_base = os.path.basename(jar_path)\n                        if jar_base not in ignorelisted_jars:\n                            javax_containing_jars.add(jar_base)\n                            found_javax = True\n\n                            class_bytes = innerjar_zip.read(innerjar_zipentry_path)\n                            digest = hashlib.md5(class_bytes).hexdigest()\n                            class_catalog_entry = (jar_path, digest)\n                            class_catalog[innerjar_zipentry_path].append(class_catalog_entry)\n\n                            javax_message_lines += \"  class %s\\n\" % (innerjar_zipentry_path)\n                            javax_message_lines += \"    jar %s hash %s\\n\" % (jar_base, digest)\n\n\n            # end innerzipentries for loop\n            innerjar_tmp_fileondisk.close()\n\n    if found_javax:\n      result = \"Spring Boot packaging has failed for %s because jars with unexpected javax classes, were found:\\n\" % springbootzip_filepath\n      result += javax_message_lines\n      result += \"You should investigate the javax dependencies, and eliminate them or add these jars to the javaxdetect_ignorelist file:\\n\"\n      for ignorelist_candidate in javax_containing_jars:\n          result += \"   %s\\n\" % ignorelist_candidate\n      print(result)\n      _write_result_to_output_file(output_filepath, result)\n\n    return found_javax\n\ndef _parse_ignorelisted_jars_file(ignorelist_file):\n    \"\"\"\n    Reads the ignorelist.txt file and returns the jars as a set.\n    File format: each line in the file is the name of a jar, like:\n      foo.jar\n      bar.jar\n    \"\"\"\n    ignorelisted_jars = set()\n\n    if ignorelist_file != None:\n        with open(ignorelist_file, \"r\") as lines:\n            for line in lines:\n                line = line.strip()\n                if len(line) == 0 or line.startswith(\"#\"):\n                    continue\n                # cannot use the whole jar path as it is different for generated jars on linux and mac\n                # this logic might need to change if two jars with the same name are part of the ignorelist\n                jar = os.path.basename(line)\n                ignorelisted_jars.add(jar)\n\n    #if len(ignorelisted_jars) > 0:\n    #    print(\"Springboot javax class checker ignorelisted jars:\")\n    #    for ignorelisted_jar in ignorelisted_jars:\n    #        print(\"  %s\" % ignorelisted_jar)\n\n    return ignorelisted_jars\n\ndef _write_result_to_output_file(output_filepath, result):\n    if output_filepath != None:\n      f = open(output_filepath, \"a\")\n      f.write(result)\n      f.close()\n\ndef run_with_ignorelist(springbootzip_filepath, ignorelisted_jars, output_filepath):\n    found_javax = _check_for_javax_classes(springbootzip_filepath, ignorelisted_jars,\n        output_filepath)\n    if found_javax:\n        raise Exception(\"Found javax classes in the packaged springboot jar\")\n    else:\n        _write_result_to_output_file(output_filepath, \"SUCCESS\")\n    return found_javax\n\ndef run(springbootzip_filepath, ignorelist_file, output_filepath):\n    \"\"\"\n    Iterates through a Spring Boot jar and looks for classes in inner jars. If the same\n    class (package name + class name) appears more than once, verify that the .class files\n    have the same hash code. If there is a conflict, this invocation will fail with an error.\n    If both jars are listed in the ignorelist, the conflict will be ignored.\n    \"\"\"\n    ignorelisted_jars = _parse_ignorelisted_jars_file(ignorelist_file)\n    run_with_ignorelist(springbootzip_filepath, ignorelisted_jars, output_filepath)\n\nif __name__ == \"__main__\":\n    # arg1  path to the spring boot jar file (required)\n    # arg2  path to the text file containing the jars to ignore as sources of javax (optional)\n    # arg3  outputfile (optional, will contain \"SUCCESS\" if the check passed, or the list of errors)\n    ignorelist_file = None\n    if len(sys.argv) > 2:\n      ignorelist_file = sys.argv[2]\n      if ignorelist_file == \"no_ignorelist\":\n          ignorelist_file = None\n\n    output_file = None\n    if len(sys.argv) > 3:\n      output_file = sys.argv[3]\n\n    run(sys.argv[1], ignorelist_file, output_file)\n"
  },
  {
    "path": "springboot/empty.txt",
    "content": ""
  },
  {
    "path": "springboot/import_bundles/BUILD",
    "content": "#\n# Copyright (c) 2017-2024, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# List of standard imports bundles that most/all Spring Boot app will need.\n\njava_import(\n    name = \"springboot_required_deps\",\n    jars = [],\n    visibility = [\"//visibility:public\"],\n    exports = [\n        \"@maven//:org_springframework_boot_spring_boot\",\n        \"@maven//:org_springframework_boot_spring_boot_actuator\",\n        \"@maven//:org_springframework_boot_spring_boot_actuator_autoconfigure\",\n        \"@maven//:org_springframework_boot_spring_boot_autoconfigure\",\n        \"@maven//:org_springframework_boot_spring_boot_loader\",\n        \"@maven//:org_springframework_boot_spring_boot_starter\",\n        \"@maven//:org_springframework_boot_spring_boot_starter_logging\",\n        \"@maven//:org_springframework_spring_aop\",\n        \"@maven//:org_springframework_spring_beans\",\n        \"@maven//:org_springframework_spring_context\",\n        \"@maven//:org_springframework_spring_core\",\n        \"@maven//:org_springframework_spring_expression\",\n        \"@maven//:org_springframework_spring_web\",\n    ],\n)\n"
  },
  {
    "path": "springboot/import_bundles/README.md",
    "content": "## Import Bundles for Spring Boot Starters\n\nThis is a scheme for providing convenience bundles of dependencies for each open source Spring Boot starter.\n*springboot_required_deps* is a convenience bundle that contains the core list that all Spring Boot apps need.\nWe used to maintain others, but have since removed all other bundles.\n\n```starlark\ndeps = [\n  \"@rules_spring//springboot/import_bundles:springboot_required_deps\",\n]\n```\n"
  },
  {
    "path": "springboot/javax.md",
    "content": "## Migrating from javax to jakarta for Spring Boot 3\n\nThe Java community is going through its Python2 → Python3 moment.\nOracle donated source code to open source, but their lawyers said that the Java trademark must be protected.\nTherefore, the donated code must be repackaged from *javax* to *jakarta* (e.g. from *javax.servlet* to *jakarta.servlet*).\nThe Maven GAVs change too (e.g. *javax.servlet:javax.servlet-api* to *jakarta.servlet:jakarta.servlet-api*).\nRead more [in this article](https://blogs.oracle.com/javamagazine/post/transition-from-java-ee-to-jakarta-ee).\n\nThis is obviously super disruptive.\nThese changes affect runtime, not just compile time.\nIf you have a compiled jar file with code that references a class in the *javax.servlet* package,\n  it will break at runtime if you deploy it with the newly packaged *jakarta* servlet jar.\nTherefore you have to make the switch across many libs, all at once.\nThis is a big bang upgrade, folks.\n\nThe Spring Boot project chose to force this migration with [Spring Boot 3](https://spring.io/blog/2022/11/24/spring-boot-3-0-goes-ga).\nWhether you like it or not, you must migrate to stay on a supported version of Spring Boot.\nGood times.\n\n### Jakarta Migration Path (in a nutshell)\n\nThere is a migration path for going from *javax* to *jakarta*.\nIt doesn't make it easy, but it does allow you to break it up a little.\n\nThe important thing to know is that there are two aspects of migration: the **GAV**, and the **Java package**.\n- the GAV migration (groupId, artifactId, version) moves from a *javax* groupId and artifactId, to a *jakarta* one\n- the Java package migration involves moving from classes in a *javax* package, to a *jakarta* package\n\nThe GAV migration is the easier one, since it is just a configuration change.\nThe Java package migration is tough, because it involves actual code level changes to use the migrated package names.\n\n### Transitional Jars\n\nThe Jakarta team helps you out a little bit by providing what I call *transitional jars*.\nThese jars are half migrated jars that allow you to take the migration steps incrementally.\nThe best way to explain them is to provide an example:\n\n- Javax Jar:\n  - GAV: *javax.json:javax.json-api:1.1.4*\n  - Java package: *javax.json*\n- Transitional Jar:\n  - GAV: *jakarta.json:jakarta.json-api:1.1.6*\n  - Java package: *javax.json*\n- Jakarta Jar:\n  - GAV: *jakarta.json:jakarta.json-api:2.1.2*\n  - Java package: *jakarta.json*\n\nThis allows you to update to a transitional version of the *jakarta* GAV, without adopting the Java package change too.\nThat first step is just a build metadata change.\n\n:key: After upgrading to the transitional jars, you should enable the\n[springboot rule duplicate class check](https://github.com/salesforce/rules_spring/blob/main/springboot/unwanted_classes.md#detecting-duplicate-classes)\n  which should highlight any jars bringing in old versions of the *javax* classes.\n\n### Not All javax is Migrating to jakarta\n\nBefore you try to rip out *all* javax usages in your Spring Boot jar, know that not every\n  *javax* package is migrating to *jakarta*.\nThe detection tooling is empathetic to this.\nYou can ignore jars that have non-migrating *javax* classes for this reason.\n\n### Javax Detect Mode\n\nAfter upgrading to the transitional jars, and enabling the duplicate class checker, you need to continue to look for *javax* classes\n  in your classpath that are not in a transitional jar.\nThere are widely used projects out there that did bad things - they included standard *javax* classes in their jar files.\nWhile those projects **might** continue to function properly on old *javax* classes, they need to be researched.\nThey hopefully have newer versions that use the newer *jakarta* classes.\n\nThe springboot rule has a *javaxdetect* mode to help with this.\nWhen enabled, it will detect classes in the classpath located in a _javax.*_ package.\nIf the jar that contains that class is not in your ignorelist, the build will fail.\nThe intent is for you to analyze all *javax* classes in your classpath to determine if/when/how they will migrate to _jakarta_.\n\nExample:\n\n```starlark\nspringboot(\n    name = \"my-boot-app\",\n    boot_app_class = \"com.acme.MyService\",\n    javaxdetect_enable = True,\n    javaxdetect_ignorelist = \"//tools/springboot:javaxdetect_ignorelist.txt\",\n    java_library = \":base_lib\",\n)\n```\n\nwhere the contents of the *javaxdetect_ignorelist.txt* file will look like this when you are transitioning:\n\n```\n# TEMPORARY IGNORES\n\n# These are jakarta transitional jars: they use jakarta GAV but still have javax Java packaging.\n# We need these entries until we switch to later versions that contain jakarta packaging.\njakarta.activation-api-1.2.2.jar\njakarta.annotation-api-1.3.5.jar\njakarta.el-3.0.4.jar\njakarta.enterprise.cdi-api-2.0.2.jar\njakarta.inject-2.6.1.jar\njakarta.inject-api-1.0.5.jar\njakarta.interceptor-api-1.2.5.jar\njakarta.jms-api-2.0.3.jar\njakarta.json-1.1.6.jar\njakarta.json-api-1.1.6.jar\njakarta.jws-api-2.1.0.jar\njakarta.persistence-api-2.2.3.jar\njakarta.servlet-api-4.0.4.jar\njakarta.transaction-api-1.3.3.jar\njakarta.validation-api-2.0.2.jar\njakarta.websocket-api-1.1.2.jar\njakarta.websocket-client-api-1.1.2.jar\njakarta.ws.rs-api-2.1.6.jar\njakarta.xml.bind-api-2.3.3.jar\njakarta.xml.soap-api-1.4.2.jar\njakarta.xml.ws-api-2.3.3.jar\n\n# PERMANENT IGNORES\n\n# javax.measure:unit-api\n# This jar is the outcome of [JSR-363](https://jcp.org/en/jsr/detail?id=363).\n# It appears to have no public plans to migrate, and so will remain javax for the foreseeable future.\nunit-api-1.0.jar\n\n# com.google.code.findbugs:jsr305\n# This was an early JSR that never progressed beyond proposal, so it is a dormant JSR.\n# However, Google emitted this findbugs jar, and a bunch of people use it.\n# But since it isn't an official javax product, it has no migration plan.\njsr305-3.0.2.jar\n\n# javax.cache:cache-api\n# This is the outcome of [JSR-107](https://www.jcp.org/en/jsr/detail?id=107) (aka JCache).\n# Discussion about migration: [JCache for jakarta](https://github.com/jsr107/jsr107spec/issues/415)\n# But since JCache was never adopted by JavaEE, it is not planned for migration.\ncache-api-1.1.1.jar\n```\n\nFor completeness, this is the BUILD file at *//tools/springboot*:\n\n```\nexports_files([\n    \"javaxdetect_ignorelist.txt\",\n])\n```\n\n### Javax Reference Checking\n\nIdeally the *springboot()* rule would have a feature for *javax* reference checking.\nMeaning, it would decompile every class in the springboot classpath and check if any were referencing\n  a *javax* package.\nWe don't have that. I wish we did.\n\n### Finishing the Jakarta Migration\n\nOnce you have moved to the transitional jars, and have investigated and resolved jars with *javax* classes in them, you will be ready\n  to finish your migration.\nYou need to move from the **transitional GAV**, to the **jakarta GAV**.\nThis is officially documented as the [JaveEE 10 migration.](https://blogs.oracle.com/javamagazine/post/transition-from-java-ee-to-jakarta-ee)\nWhen you do this step, remove the jakarta transitional jars from your ignore list since you should\n  now be using newer versions that use jakarta packages.\n\nIn addition, the following must happen at the same time as upgrading:\n- [Spring Boot 3](https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide)\n- [Spring 6](https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x)\n- [Jetty 11](https://webtide.com/jetty-10-and-11-have-arrived/)\n- and others, depending on what libraries your service uses\n\nIt is going to be fun.\n"
  },
  {
    "path": "springboot/springboot.bzl",
    "content": "#\n# Copyright (c) 2017-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n#\n# Spring Boot Packager\n#\n# See the macro documentation below for details.\n\n# Spring Boot Executable JAR Layout specification\n#   reverse engineered from the Spring Boot maven plugin\n\n# /\n# /META-INF/\n# /META-INF/MANIFEST.MF                        <-- very specific manifest for Spring Boot (generated by this rule)\n# /BOOT-INF\n# /BOOT-INF/classes\n# /BOOT-INF/classes/git.properties             <-- properties file containing details of the current source tree via Git\n# /BOOT-INF/classes/**/*.class                 <-- compiled application classes, must include @SpringBootApplication class\n# /BOOT-INF/classes/META-INF/*                 <-- application level META-INF config files (e.g. spring.factories)\n# /BOOT-INF/lib\n# /BOOT-INF/lib/*.jar                          <-- all upstream transitive dependency jars must be here (except spring-boot-loader)\n# /org/springframework/boot/loader\n# /org/springframework/boot/loader/**/*.class  <-- the Spring Boot Loader classes must be here\n\n# ***************************************************************\n# Dependency Aggregator Rule\n#  do not use directly, see the SpringBoot Macro below\n\ndef _depaggregator_rule_impl(ctx):\n    # magical incantation for getting upstream transitive closure of java deps\n    merged = java_common.merge([dep[java_common.provider] for dep in ctx.attr.deps])\n\n    jars = []\n    excludes = {}\n\n    for exclusion_info in ctx.attr.deps_exclude_labels:\n        for compile_jar in exclusion_info[JavaInfo].full_compile_jars.to_list():\n            # print(\"Spring Boot Excluding: \"+compile_jar.owner.name+\" as \"+compile_jar.path)\n            excludes[compile_jar.path] = True\n\n    for dep in merged.transitive_runtime_jars.to_list():\n        if excludes.get(dep.path, None) != None:\n            # print(\"exclude by label \" + dep.path)\n            pass\n        else:\n            include = True\n            for pattern in ctx.attr.deps_exclude_paths:\n                if dep.path.find(pattern) > -1:\n                    # print(\"exclude by path \" + dep.path)\n                    include = False\n                    break\n            if include:\n                # print(\"Spring Boot Including: \"+dep.owner.name+\" as \"+dep.path)\n                jars.append(dep)\n\n    #print(\"AGGREGATED DEPS\")\n    #print(jars)\n\n    return [DefaultInfo(files = depset(jars))]\n\n_depaggregator_rule = rule(\n    implementation = _depaggregator_rule_impl,\n    attrs = {\n        \"depaggregator_rule\": attr.label(),\n        \"deps\": attr.label_list(providers = [java_common.provider]),\n        \"deps_exclude_labels\": attr.label_list(providers = [java_common.provider], allow_empty = True),\n        \"deps_exclude_paths\": attr.string_list(),\n    },\n)\n\ndef _appjar_locator_impl(ctx):\n    if java_common.provider in ctx.attr.app_dep:\n        output_jars = ctx.attr.app_dep[java_common.provider].runtime_output_jars\n        if len(output_jars) != 1:\n            fail(\"springboot rule expected 1 app jar but found %s\" % len(output_jars))\n    else:\n        fail(\"Unable to locate the app jar\")\n    return [DefaultInfo(files = depset([output_jars[0]]))]\n\n_appjar_locator_rule = rule(\n    implementation = _appjar_locator_impl,\n    attrs = {\n        \"app_dep\": attr.label(),\n    },\n)\n\n# ***************************************************************\n# Check Dupe Classes Rule\n\ndef _dupeclasses_rule_impl(ctx):\n    # setup the output file (contains SUCCESS, NOT_RUN, or the list of errors)\n    output = ctx.actions.declare_file(ctx.attr.out)\n    outputs = [output]\n\n    if not ctx.attr.dupeclassescheck_enable:\n        ctx.actions.write(output, \"NOT_RUN\", is_executable = False)\n        return [DefaultInfo(files = depset(outputs))]\n\n    inputs = []\n    input_args = ctx.actions.args()\n\n    # inputs (spring boot jar file, ignorelist)\n    inputs.append(ctx.attr.springbootjar.files.to_list()[0])\n    input_args.add(ctx.attr.springbootjar.files.to_list()[0].path)\n    if ctx.attr.dupeclassescheck_ignorelist != None:\n        inputs.append(ctx.attr.dupeclassescheck_ignorelist.files.to_list()[0])\n        input_args.add(ctx.attr.dupeclassescheck_ignorelist.files.to_list()[0].path)\n    else:\n        input_args.add(\"no_ignorelist\")\n\n    # add the output file to the args, so python script knows where to write result\n    input_args.add(output.path)\n\n    # run the dupe checker\n    ctx.actions.run(\n        executable = ctx.executable.script,\n        outputs = outputs,\n        inputs = inputs,\n        arguments = [input_args],\n        progress_message = \"Checking for duplicate classes in the Spring Boot jar...\",\n        mnemonic = \"DupeCheck\",\n    )\n    return [DefaultInfo(files = depset(outputs))]\n\n_dupeclasses_rule = rule(\n    implementation = _dupeclasses_rule_impl,\n    attrs = {\n        \"dupeclasses_rule\": attr.label(),\n        \"script\": attr.label(\n            executable = True,\n            cfg = \"exec\",\n            allow_files = True,\n        ),\n        \"springbootjar\": attr.label(),\n        \"dupeclassescheck_ignorelist\": attr.label(allow_files = True),\n        \"dupeclassescheck_enable\": attr.bool(),\n        \"out\": attr.string(),\n    },\n)\n\n# ***************************************************************\n# JAVAX DETECT Rule\n\ndef _javaxdetect_rule_impl(ctx):\n    # setup the output file (contains SUCCESS, NOT_RUN, or the list of errors)\n    output = ctx.actions.declare_file(ctx.attr.out)\n    outputs = [output]\n\n    if not ctx.attr.javaxdetect_enable:\n        ctx.actions.write(output, \"NOT_RUN\", is_executable = False)\n        return [DefaultInfo(files = depset(outputs))]\n\n    inputs = []\n    input_args = ctx.actions.args()\n\n    # inputs (spring boot jar file, ignorelist)\n    inputs.append(ctx.attr.springbootjar.files.to_list()[0])\n    input_args.add(ctx.attr.springbootjar.files.to_list()[0].path)\n    if ctx.attr.javaxdetect_ignorelist != None:\n        inputs.append(ctx.attr.javaxdetect_ignorelist.files.to_list()[0])\n        input_args.add(ctx.attr.javaxdetect_ignorelist.files.to_list()[0].path)\n    else:\n        input_args.add(\"no_ignorelist\")\n\n    # add the output file to the args, so python script knows where to write result\n    input_args.add(output.path)\n\n    # run the dupe checker\n    ctx.actions.run(\n        executable = ctx.executable.script,\n        outputs = outputs,\n        inputs = inputs,\n        arguments = [input_args],\n        progress_message = \"Checking for javax classes in the Spring Boot jar (candidates for jakarta migration)...\",\n        mnemonic = \"JavaxDetect\",\n    )\n    return [DefaultInfo(files = depset(outputs))]\n\n_javaxdetect_rule = rule(\n    implementation = _javaxdetect_rule_impl,\n    attrs = {\n        \"javaxdetect_rule\": attr.label(),\n        \"script\": attr.label(\n            executable = True,\n            cfg = \"exec\",\n            allow_files = True,\n        ),\n        \"springbootjar\": attr.label(),\n        \"javaxdetect_ignorelist\": attr.label(allow_files = True),\n        \"javaxdetect_enable\": attr.bool(),\n        \"out\": attr.string(),\n    },\n)\n\n# ***************************************************************\n# BANNED DEPS RULE\n\ndef _banneddeps_rule_impl(ctx):\n    output = ctx.actions.declare_file(ctx.attr.out)\n    outputs = [output]\n\n    if ctx.attr.deps_banned == None:\n        ctx.actions.write(output, \"NOT_RUN\", is_executable = False)\n        return [DefaultInfo(files = depset(outputs))]\n\n    # iterate through the transitive set; this set has already had the deps_exclude_labels\n    # rules applied, so this is the filtered list\n    found_banned = False\n    banned_filenames = \"\"\n    deps = ctx.attr.deps\n    for dep in deps:\n        for file in dep.files.to_list():\n            for currentmatcher in ctx.attr.deps_banned:\n                if currentmatcher in file.basename:\n                    # found a banned dep\n                    banned_filenames = banned_filenames + file.basename + \"\\n\"\n                    found_banned = True\n\n    if found_banned:\n        ctx.actions.write(output, \"FAIL\", is_executable = False)\n        fail(\"Found banned jars in the springboot rule [\" + ctx.label.name +\n             \"] dependency list. Filenames:\\n\" + banned_filenames +\n             \"\\nYou can ignore these by setting deps_banned = [] on the springboot() rule.\\n\")\n    else:\n        ctx.actions.write(output, \"SUCCESS\", is_executable = False)\n    return [DefaultInfo(files = depset(outputs))]\n\n_banneddeps_rule = rule(\n    implementation = _banneddeps_rule_impl,\n    attrs = {\n        \"banneddeps_rule\": attr.label(),\n        \"springboot_rule_name\": attr.string(),\n        \"deps_banned\": attr.string_list(),\n        \"deps\": attr.label_list(),\n        \"out\": attr.string(),\n    },\n)\n\n# ***************************************************************\n# Outer launcher script for \"bazel run\"\n\n_bazelrun_script_template = \"\"\"#!/bin/bash\n\nset -e\n\n# bring in the resolved variables needed for running the script\n# SCRIPT_DIR is the directory in which bazel run executes\nSCRIPT_DIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" &> /dev/null && pwd )\"\n\n# Detect Java Toolchain (optional)\n# If the bazelrun_java_toolchain attribute on the springboot rule is set, the springboot\n# rule impl below will replace the java_toolchain_attr tag with the relative path\n# from exec root to the JVM. We have to do some Bash hijinks to resolve the\n# absolute path.\nJAVA_TOOLCHAIN_RELATIVE=%java_toolchain_attr%\nif [ -z ${JAVA_TOOLCHAIN_RELATIVE+x} ]; then\n  # the springboot rule did not set the bazelrun_java_toolchain attribute\n  unset JAVA_TOOLCHAIN\nelse\n  # the springboot rule did set the bazelrun_java_toolchain attribute, convert\n  # it into an absolute path using exec_root\n  exec_root=${SCRIPT_DIR%%bazel-out*}\n  JAVA_TOOLCHAIN=\"${exec_root}${JAVA_TOOLCHAIN_RELATIVE}\"\n  JAVA_TOOLCHAIN_NAME=%java_toolchain_name_attr%\nfi\n\n# the env variables file is found in SCRIPT_DIR\nsource $SCRIPT_DIR/%name%_bazelrun_env.sh\n\n# the inner bazelrun script is found in the runfiles subdir\n# this is either default_bazelrun_script.sh or a custom one provided by the user\nsource %bazelrun_script%\n\"\"\"\n\n# ***************************************************************\n# SpringBoot Rule\n#  do not use directly, see the SpringBoot Macro below\n\ndef _springboot_rule_impl(ctx):\n    outs = depset(transitive = [\n        ctx.attr.app_compile_rule.files,\n        ctx.attr.genmanifest_rule.files,\n        ctx.attr.bazelrun_script.files,\n        ctx.attr.genbazelrunenv_rule.files,\n        ctx.attr.gengitinfo_rule.files,\n        ctx.attr.genjar_rule.files,\n    ])\n\n    # resolve the full path of the launcher script that runs \"java -jar <springboot.jar>\" when calling\n    # \"bazel run\" with the springboot target (bazel run //examples/helloworld) and string sub it\n    # into the _bazelrun_script_template text defined above\n    outer_bazelrun_script_contents = _bazelrun_script_template \\\n        .replace(\"%bazelrun_script%\", ctx.attr.bazelrun_script.files.to_list()[0].short_path) \\\n        .replace(\"%name%\", ctx.attr.name)\n\n    # the bazelrun_java_toolchain optional, if set, we use it as the jvm for bazel run\n    if ctx.attr.bazelrun_java_toolchain != None:\n        # lookup the path to selected java toolchain, and string sub it into the bazel run script\n        # text _bazelrun_script_template defined above\n        java_runtime = ctx.attr.bazelrun_java_toolchain[java_common.JavaToolchainInfo].java_runtime\n        java_bin = [f for f in java_runtime.files.to_list() if f.path.endswith(\"bin/java\") or f.path.endswith(\"bin/java.exe\")][0]\n        outer_bazelrun_script_contents = outer_bazelrun_script_contents \\\n            .replace(\"%java_toolchain_attr%\", java_bin.path)\n        outer_bazelrun_script_contents = outer_bazelrun_script_contents \\\n            .replace(\"%java_toolchain_name_attr%\", ctx.attr.bazelrun_java_toolchain.label.name)\n    else:\n        outer_bazelrun_script_contents = outer_bazelrun_script_contents \\\n            .replace(\"%java_toolchain_attr%\", \"\")\n\n    outer_bazelrun_script_file = ctx.actions.declare_file(\"%s\" % ctx.label.name)\n    ctx.actions.write(outer_bazelrun_script_file, outer_bazelrun_script_contents, is_executable = True)\n\n    # the jar and launcher script we build needs to be part of runfiles so that it ends\n    # up in the working directory that \"bazel run\" uses\n    runfiles_list = ctx.attr.genjar_rule.files.to_list()\n    runfiles_list.append(ctx.attr.bazelrun_script.files.to_list()[0])\n\n    # and add any data files to runfiles\n    if ctx.attr.bazelrun_data != None:\n        for data_target in ctx.attr.bazelrun_data:\n            for data_target in data_target.files.to_list():\n                runfiles_list.append(data_target)\n\n    return [DefaultInfo(\n        files = outs,\n        executable = outer_bazelrun_script_file,\n        runfiles = ctx.runfiles(files = runfiles_list),\n    )]\n\n_springboot_rule = rule(\n    implementation = _springboot_rule_impl,\n    executable = True,\n    attrs = {\n        \"app_compile_rule\": attr.label(),\n        \"dep_aggregator_rule\": attr.label(),\n        \"genmanifest_rule\": attr.label(),\n        \"genbazelrunenv_rule\": attr.label(),\n        \"gengitinfo_rule\": attr.label(),\n        \"genjar_rule\": attr.label(),\n        \"dupecheck_rule\": attr.label(),\n        \"javaxdetect_rule\": attr.label(),\n        \"banneddeps_rule\": attr.label(),\n        \"apprun_rule\": attr.label(),\n        \"bazelrun_script\": attr.label(allow_files = True),\n        \"bazelrun_data\": attr.label_list(allow_files = True),\n        \"bazelrun_java_toolchain\": attr.label(\n            mandatory = False,\n            default = \"@bazel_tools//tools/jdk:current_java_toolchain\",\n            providers = [java_common.JavaToolchainInfo],\n        ),\n    },\n)\n\n# ***************************************************************\n# SpringBoot Macro\n#  this is the entrypoint into the springboot rule\ndef springboot(\n        name,\n        java_library,\n        boot_app_class,\n        boot_launcher_class = \"org.springframework.boot.loader.JarLauncher\",\n        deps = None,\n        deps_banned = [\"junit\", \"mockito\"],  # detects common mistake of test dep pollution\n        deps_exclude_labels = None,\n        deps_exclude = None,\n        deps_exclude_paths = None,\n        deps_index_file = None,\n        deps_use_starlark_order = None,\n        dupeclassescheck_enable = None,\n        dupeclassescheck_ignorelist = None,\n        javaxdetect_enable = None,\n        javaxdetect_ignorelist = None,\n        include_git_properties_file = True,\n        bazelrun_java_toolchain = None,\n        bazelrun_script = None,\n        bazelrun_jvm_flags = None,\n        bazelrun_jvm_flag_list = None,\n        bazelrun_env_flag_list = None,\n        bazelrun_data = None,\n        bazelrun_background = False,\n        addins = [],\n        tags = [],\n        testonly = False,\n        visibility = None,\n        bazelrun_addopens = [],\n        bazelrun_addexports = [],\n        jartools_toolchains = [\"@bazel_tools//tools/jdk:current_host_java_runtime\"],  # Issue 250\n        exclude = [],  # deprecated\n        classpath_index = \"@rules_spring//springboot:empty.txt\",  # deprecated\n        use_build_dependency_order = True,  # deprecated\n        fail_on_duplicate_classes = False,  # deprecated\n        duplicate_class_allowlist = None,  # deprecated\n        jvm_flags = \"\",  # deprecated\n        data = [],  # deprecated\n        restricted_to = None,\n        target_compatible_with = []):\n    \"\"\"Bazel rule for packaging an executable Spring Boot application.\n\n    Note that the rule README has more detailed usage instructions for each attribute.\n\n    Args:\n      name: **Required**. The name of the Spring Boot application. Typically this is set the same as the package name.\n        Ex: *helloworld*.\n      java_library: **Required**. The built jar, identified by the name of the java_library rule, that contains the\n        Spring Boot application.\n      boot_app_class: **Required**. The fully qualified name of the class annotated with @SpringBootApplication.\n        Ex: *com.sample.SampleMain*\n      deps: Optional. An additional set of Java dependencies to add to the executable.\n        Normally all dependencies are set on the *java_library*.\n      deps_banned: Optional. A list of strings to match against the jar filenames in the transitive graph of\n        dependencies for this springboot app. If any of these strings is found within any jar name, the rule will fail.\n        This is useful for detecting jars that should never go to production. The list of dependencies is\n        obtained after the deps_exclude_labels and deps_exclude_paths processing has run. Default: [ \"junit\", \"mockito\" ]\n      deps_exclude_labels: Optional. A list of jar labels that will be omitted from the final packaging step.\n        This is a manual option for eliminating a problematic dependency that cannot be eliminated upstream.\n        Ex: *[\"@maven//:commons_cli_commons_cli\"]*.\n      deps_exclude: Deprecated. Use deps_exclude_labels instead. Functions the same as deps_exclude_labels but retained for backward compatibility.\n      deps_exclude_paths: Optional. This attribute provides a list of partial paths that will be omitted\n        from the final packaging step if the string is contained within the dep filename. This is a more raw method\n        than deps_exclude_labels for eliminating a problematic dependency/file that cannot be eliminated upstream.\n        Ex: [*jackson-databind-*].\n      deps_index_file: Optional. Uses Spring Boot's\n        [classpath index feature](https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html#executable-jar-war-index-files-classpath)\n        to define classpath order. This feature is not commonly used, as the application must be extracted from the jar\n        file for it to work. Ex: *my_classpath_index.idx*\n      deps_use_starlark_order: When running the Spring Boot application from the executable jar file, setting this attribute to\n        *True* will use the classpath order as expressed by the order of deps in the BUILD file. Otherwise it is random order.\n      dupeclassescheck_enable: If *True*, will analyze the list of dependencies looking for any class that appears more than\n        once, but with a different hash. This indicates that your dependency tree has conflicting libraries.\n      dupeclassescheck_ignorelist: Optional. When using the duplicate class check, this attribute provides a file\n        that contains a list of libraries excluded from the analysis. Ex: *dupeclass_libs.txt*\n      javaxdetect_enable: If *True*, will analyze the list of dependencies looking for any class from javax.*\n        package. This is a candidate for migration to jakarta.\n      javaxdetect_ignorelist: Optional. When using the javax detect check, this attribute provides a file\n        that contains a list of libraries excluded from the analysis. Ex: *javaxdetect_ignorelist.txt*\n      include_git_properties_file: If *True*, will include a git.properties file in the resulting jar.\n      bazelrun_java_toolchain: Optional. Label to the Java toolchain to use when launching the application using 'bazel run'\n      bazelrun_script: Optional. When launching the application using 'bazel run', a default launcher script is used.\n        This attribute can be used to provide a customized launcher script. Ex: *my_custom_script.sh*\n      bazelrun_jvm_flags: Optional. Deprecated form of bazelrun_jvm_flag_list. Ex: *-Dcustomprop=gold -DcustomProp2=silver*\n      bazelrun_jvm_flag_list: Optional. When launching the application using 'bazel run', an optional set of JVM flags\n        to pass to the JVM at startup. Ex: *['-Dcustomprop=gold', '-DcustomProp2=silver']*\n      bazelrun_env_flag_list: Optional. When launching the application using 'bazel run', an optional set of environment\n        variables to pass to the launcher script at startup. Ex: *['PROP1=gold', 'PROP2=silver']*\n      bazelrun_data: Uncommon option to add data files to runfiles. Behaves like the *data* attribute defined for *java_binary*.\n      bazelrun_background: Optional. If True, the *bazel run* launcher will not block. The run command will return and process will remain running.\n      addins: Uncommon option to add additional files to the root of the springboot jar. For example a license file. Pass an array of files from the package.\n      tags: Optional. Bazel standard attribute.\n      testonly: Optional. Bazel standard attribute. Defaults to False.\n      visibility: Optional. Bazel standard attribute.\n      jartools_toolchains: Optional. Toolchains for running build tools like singlejar, override for obscure use cases. Default: [\"@bazel_tools//tools/jdk:current_java_runtime\"]\n      restricted_to: Optional. Bazel standard attribute.\n      target_compatible_with: Optional. Bazel standard attribute.\n      exclude: Deprecated synonym of *deps_exclude_labels* and *deps_exclude*.\n      classpath_index: Deprecated synonym of *deps_index_file*\n      use_build_dependency_order: Deprecated synonym of *deps_use_starlark_order*\n      fail_on_duplicate_classes: Deprecated synonym of *dupeclassescheck_enable*\n      duplicate_class_allowlist: Deprecated synonym of *dupeclassescheck_ignorelist*\n      jvm_flags: Deprecated synonym of *bazelrun_jvm_flags*\n      data: Deprecated synonym of *bazelrun_data*\n    \"\"\"\n    # NOTE: if you add/change any params, be sure to rerun the stardoc generator (see BUILD file)\n\n    # Create the subrule names\n    dep_aggregator_rule = name + \"_\" + native.package_name() + \"_deps\"\n    appjar_locator_rule = name + \"_\" + native.package_name() + \"_appjar_locator\"\n    genmanifest_rule = name + \"_\" + native.package_name() + \"_genmanifest\"\n    genbazelrunenv_rule = name + \"_\" + native.package_name() + \"_genbazelrunenv\"\n    gengitinfo_rule = name + \"_\" + native.package_name() + \"_gengitinfo\"\n    genjar_rule = name + \"_\" + native.package_name() + \"_genjar\"\n    dupecheck_rule = name + \"_\" + native.package_name() + \"_dupecheck\"\n    javaxdetect_rule = name + \"_\" + native.package_name() + \"_javaxdetect\"\n    bannedcheck_rule = name + \"_\" + native.package_name() + \"_bannedcheck\"\n    apprun_rule = name + \"_\" + native.package_name() + \"_apprun\"\n\n    # Handle deprecated attribute names; if modern name is not set then take\n    # the legacy attribute value (which may be set to a default, or set by the user)\n    if deps_exclude_labels == None and deps_exclude != None:\n        deps_exclude_labels = deps_exclude\n    if deps_exclude_labels == None:\n        deps_exclude_labels = exclude\n    if deps_index_file == None:\n        deps_index_file = classpath_index\n    if deps_use_starlark_order == None:\n        deps_use_starlark_order = use_build_dependency_order\n    if dupeclassescheck_enable == None:\n        dupeclassescheck_enable = fail_on_duplicate_classes\n    if dupeclassescheck_ignorelist == None:\n        dupeclassescheck_ignorelist = duplicate_class_allowlist\n    if bazelrun_jvm_flags == None:\n        bazelrun_jvm_flags = jvm_flags\n    if bazelrun_jvm_flags == None:\n        bazelrun_jvm_flags = \"\"\n    if bazelrun_jvm_flag_list != None:\n        bazelrun_jvm_flags = bazelrun_jvm_flags + \" \".join(bazelrun_jvm_flag_list)\n    bazelrun_env_flags = \"\"\n    if bazelrun_env_flag_list != None:\n        bazelrun_env_flags = \" \".join(bazelrun_env_flag_list)\n    if bazelrun_data == None:\n        bazelrun_data = data\n\n    # assemble deps; generally all deps will come transitively through the java_library\n    # but a user may choose to add in more deps directly into the springboot jar (rare)\n    java_deps = [java_library]\n    if deps != None:\n        java_deps = [java_library] + deps\n\n    # SUBRULE 1: AGGREGATE UPSTREAM DEPS\n    #  Aggregate transitive closure of upstream Java deps\n    _depaggregator_rule(\n        name = dep_aggregator_rule,\n        deps = java_deps,\n        deps_exclude_labels = deps_exclude_labels,\n        deps_exclude_paths = deps_exclude_paths,\n        tags = tags,\n        testonly = testonly,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n    )\n\n    # SUBRULE 2: GENERATE THE MANIFEST\n    #  NICER: derive the Build JDK and Boot Version values by scanning transitive deps\n    genmanifest_out = name + \"_MANIFEST.MF\"\n    native.genrule(\n        name = genmanifest_rule,\n        srcs = [\":\" + dep_aggregator_rule],\n        cmd = \"$(location @rules_spring//springboot:write_manifest.sh) \" + boot_app_class + \" \" + boot_launcher_class + \" $@ $(JAVABASE) $(SRCS)\",\n        #      message = \"SpringBoot rule is writing the MANIFEST.MF...\",\n        tools = [\"@rules_spring//springboot:write_manifest.sh\"],\n        outs = [genmanifest_out],\n        tags = tags,\n        testonly = testonly,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n        toolchains = jartools_toolchains,  # so that JAVABASE is computed\n    )\n\n    # SUBRULE 2B: GENERATE THE GIT PROPERTIES\n    gengitinfo_out = name + \"_git.properties\"\n    native.genrule(\n        name = gengitinfo_rule,\n        cmd = \"$(location @rules_spring//springboot:write_gitinfo_properties.sh) $@\",\n        tools = [\"@rules_spring//springboot:write_gitinfo_properties.sh\"],\n        outs = [gengitinfo_out],\n        tags = tags,\n        testonly = testonly,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n        stamp = 1,\n    )\n\n    # SUBRULE 2C: CLASSPATH INDEX\n    # see https://github.com/salesforce/rules_spring/issues/81\n    _appjar_locator_rule(\n        name = appjar_locator_rule,\n        app_dep = java_library,\n        tags = tags,\n        testonly = testonly,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n    )\n\n    # SUBRULE 3: INVOKE THE BASH SCRIPT THAT DOES THE PACKAGING\n    # The resolved input_file_paths array is made available as the $(SRCS) token in the cmd string.\n    # Skylark will convert the logical input_file_paths into real file system paths when surfaced in $(SRCS)\n    #  cmd format (see springboot_pkg.sh)\n    #    param0: directory containing the springboot rule\n    #    param1: location of the jar utility (singlejar)\n    #    param2: boot application main classname (the @SpringBootApplication class)\n    #    param3: spring boot launcher class\n    #    param4: jdk path for running java tools e.g. jar; $(JAVABASE)\n    #    param5: compiled application jar name\n    #    param6: use build file deps order [True|False]\n    #    param7: include git.properties file in resulting jar\n    #    param8: executable jar output filename to write to\n    #    param9: compiled application jar\n    #    param10: manifest file\n    #    param11: git.properties file\n    #    param12: classpath_index file\n    #    param13-N: upstream transitive dependency jar(s)\n    native.genrule(\n        name = genjar_rule,\n        srcs = [\n            \":\" + appjar_locator_rule,\n            \":\" + genmanifest_rule,\n            \":\" + gengitinfo_rule,\n            deps_index_file,\n        ] + addins + [\n            \"@rules_spring//springboot:addin_end.txt\",\n            \":\" + dep_aggregator_rule,\n        ],\n        cmd = \"$(location @rules_spring//springboot:springboot_pkg.sh) \" +\n              \"$(location @bazel_tools//tools/jdk:singlejar) \" + boot_app_class + \" \" + boot_launcher_class +\n              \" $(JAVABASE) \" + name + \" \" + str(deps_use_starlark_order) + \" \" + str(include_git_properties_file) + \" $@ $(SRCS)\",\n        tools = [\n            \"@rules_spring//springboot:springboot_pkg.sh\",\n            \"@bazel_tools//tools/jdk:singlejar\",\n        ],\n        tags = tags,\n        testonly = testonly,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n        outs = [_get_springboot_jar_file_name(name)],\n        toolchains = jartools_toolchains,  # so that JAVABASE is computed\n        visibility = visibility,\n    )\n\n    # SUBRULE 3B: GENERATE THE ENV VARIABLES USED BY THE BAZELRUN LAUNCHER SCRIPT\n    genbazelrunenv_out = name + \"_bazelrun_env.sh\"\n    native.genrule(\n        name = genbazelrunenv_rule,\n        srcs = bazelrun_data,\n        cmd = \"$(location @rules_spring//springboot:write_bazelrun_env.sh) \" + name + \" \" + _get_springboot_jar_file_name(name) +\n              \" \" + _get_relative_package_path() + \" $@ \" + _convert_starlarkbool_to_bashbool(bazelrun_background) +\n              \" $(SRCS)\" +\n              \" start_flags\" +\n              \" \" + \" \".join([\"--add-exports=\" + element for element in bazelrun_addexports]) +\n              \" \" + \" \".join([\"--add-opens=\" + element for element in bazelrun_addopens]) +\n              \" \" + bazelrun_jvm_flags +\n              \" start_envs\" +\n              \" \" + bazelrun_env_flags,\n        #      message = \"SpringBoot rule is writing the bazel run launcher env...\",\n        tools = [\"@rules_spring//springboot:write_bazelrun_env.sh\"],\n        outs = [genbazelrunenv_out],\n        tags = tags,\n        testonly = testonly,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n    )\n\n    # SUBRULE 4a: RUN THE DUPE CHECKER (if enabled)\n    # Skip the dupeclasses_rule instantiation entirely if disabled because\n    # running this rule requires Python3 installed. If a workspace does not have\n    # Python3 available, they can just never enable dupeclassescheck_enable and be ok\n    dupecheck_rule_label = None\n    if dupeclassescheck_enable:\n        _dupeclasses_rule(\n            name = dupecheck_rule,\n            script = \"@rules_spring//springboot:check_dupe_classes\",\n            springbootjar = genjar_rule,\n            dupeclassescheck_enable = dupeclassescheck_enable,\n            dupeclassescheck_ignorelist = dupeclassescheck_ignorelist,\n            out = \"dupecheck_results.txt\",\n            tags = tags,\n            testonly = testonly,\n            restricted_to = restricted_to,\n            target_compatible_with = target_compatible_with,\n        )\n        dupecheck_rule_label = \":\" + dupecheck_rule\n\n    # SUBRULE 4b: RUN THE JAVAX DETECTOR (if enabled)\n    # Skip the javaxdetect_rule instantiation entirely if disabled because\n    # running this rule requires Python3 installed. If a workspace does not have\n    # Python3 available, they can just never enable javaxdetect_enable and be ok\n    javaxdetect_rule_label = None\n    if javaxdetect_enable:\n        _javaxdetect_rule(\n            name = javaxdetect_rule,\n            script = \"@rules_spring//springboot:detect_javax_classes\",\n            springbootjar = genjar_rule,\n            javaxdetect_enable = javaxdetect_enable,\n            javaxdetect_ignorelist = javaxdetect_ignorelist,\n            out = \"javaxdetect_results.txt\",\n            tags = tags,\n            testonly = testonly,\n            restricted_to = restricted_to,\n            target_compatible_with = target_compatible_with,\n        )\n        javaxdetect_rule_label = \":\" + javaxdetect_rule\n\n    # SUBRULE 4c: RUN THE BANNED DEP CHECKER (if enabled)\n    # Skip the bannedcheck_rule instantiation entirely if disabled because\n    # running this rule requires Python3 installed. If a workspace does not have\n    # Python3 available, they can just never enable dupeclassescheck_enable and be ok\n    bannedcheck_rule_label = None\n    if deps_banned != None:\n        _banneddeps_rule(\n            springboot_rule_name = name,\n            name = bannedcheck_rule,\n            deps = [\":\" + dep_aggregator_rule],\n            deps_banned = deps_banned,\n            out = \"bannedcheck_results.txt\",\n            tags = tags,\n            testonly = testonly,\n            restricted_to = restricted_to,\n            target_compatible_with = target_compatible_with,\n        )\n        bannedcheck_rule_label = \":\" + bannedcheck_rule\n\n    # SUBRULE 5: PROVIDE A WELL KNOWN RUNNABLE RULE TYPE FOR IDE SUPPORT\n    # The presence of this rule  makes a Spring Boot entry point class runnable\n    # in IntelliJ (it won't run as part of a packaged Spring Boot jar, ie this\n    # won't run java -jar springboot.jar, but close enough)\n    # Making the springboot rule itself executable is not recognized by IntelliJ\n    # (because IntelliJ doesn't know how to handle the springboot rule type or\n    # because of a misconfiguration on our end?)\n    native.java_binary(\n        name = apprun_rule,\n        main_class = boot_app_class,\n        runtime_deps = java_deps,\n        tags = tags,\n        testonly = testonly,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n    )\n\n    if bazelrun_script == None:\n        bazelrun_script = \"@rules_spring//springboot:default_bazelrun_script.sh\"\n\n    # MASTER RULE: Create the composite rule that will aggregate the outputs of the subrules\n    _springboot_rule(\n        name = name,\n        app_compile_rule = java_library,\n        bazelrun_java_toolchain = bazelrun_java_toolchain,\n        dep_aggregator_rule = \":\" + dep_aggregator_rule,\n        genmanifest_rule = \":\" + genmanifest_rule,\n        genbazelrunenv_rule = \":\" + genbazelrunenv_rule,\n        gengitinfo_rule = \":\" + gengitinfo_rule,\n        genjar_rule = \":\" + genjar_rule,\n        dupecheck_rule = dupecheck_rule_label,\n        javaxdetect_rule = javaxdetect_rule_label,\n        apprun_rule = \":\" + apprun_rule,\n        bazelrun_script = bazelrun_script,\n        bazelrun_data = bazelrun_data,\n        tags = tags,\n        testonly = testonly,\n        restricted_to = restricted_to,\n        target_compatible_with = target_compatible_with,\n        visibility = visibility,\n    )\n\n# end springboot macro\n\ndef _get_springboot_jar_file_name(name):\n    if name.endswith(\".jar\"):\n        fail(\"the name attribute of the springboot rule should not end with '.jar'\")\n    return name + \".jar\"\n\ndef _convert_starlarkbool_to_bashbool(starlarkbool):\n    if starlarkbool:\n        return \"true\"\n    return \"false\"\n\ndef _get_relative_package_path():\n    \"\"\"Convert the current package name into a relative file system path. Because\n    this value is used as a positional argument, if native.package_name() returns\n    empty string (e.g. the target is //:foo), we replace it with a token so that\n    it won't confuse the parsing of the positional arguments.\n    \"\"\"\n    if not native.package_name():\n        return \"root\"\n    return native.package_name() + \"/\"\n"
  },
  {
    "path": "springboot/springboot_doc.md",
    "content": "## Springboot() Attributes\n\nThis page has moved [here](attributes.bzl)."
  },
  {
    "path": "springboot/springboot_pkg.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2017-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# This script outputs a proper Spring Boot executable jar.\n# This script is callable from a Bazel build (via a genrule in springboot.bzl).\n# It takes a standard Bazel java_binary output executable jar and 'springboot-ifies' it.\n# See springboot.bzl to see how it is invoked from the build.\n# You should not be trying to invoke this file directly from your BUILD file.\n\n# Debugging? This script outputs a lot of useful debugging information under\n# /tmp/bazel/debug/springboot for each Spring Boot app.\n\n# fail on error (https://github.com/salesforce/rules_spring/issues/100)\nset -e\n\nruledir=$(pwd)\nsinglejar_cmd=$(pwd)/$1\nmainclass=$2\nspring_boot_launcher_class=${3}\njavabase=$4\nappjar_name=$5\ndeps_starlark_order=$6\ninclude_git_properties_file=$7\noutputjar=$8\nappjar=$9\nmanifest=${10}\ngitpropsfile=${11}\ndeps_index_file=${12}\nfirst_addin_arg=13\n\n# converting starlark booleans to bash booleans\nif [ $deps_starlark_order = \"True\" ]; then\n  deps_starlark_order=true\nelse\n  deps_starlark_order=false\nfi\n\nif [ $include_git_properties_file = \"True\" ]; then\n  include_git_properties_file=true\nelse\n  include_git_properties_file=false\nfi\n\n# package name (not guaranteed to be globally unique)\npackagename=$(basename $appjar_name)\n\n# generate a package working path sha (globally unique). this allows this rule to function correctly\n# if sandboxing is disabled. the wrinkle is deriving the right shasum util\nshasum_output=$(shasum -h 2>/dev/null) || true\nif [[ $shasum_output = *\"Usage\"* ]]; then\n   shasum_install_msg=\"Hashing command line utility 'shasum' will be used\"\n   packagesha_raw=$(echo \"$outputjar\" | shasum )\nelse\n   # linux command is sha1sum, assume that\n   packagesha_raw=$(echo \"$outputjar\" | sha1sum )\n   shasum_install_msg=\"Hashing command line utility 'sha1sum' will be used\"\nfi\nexport packagesha=$(echo \"$packagesha_raw\" | cut -d \" \" -f 1 )\n\n# Build time telemetry\nbuild_date_time=$(date)\nbuild_time_start=$SECONDS\n\nspringboot_rule_tmpdir=${tmpdir:-/tmp}/bazel\nmkdir -p $springboot_rule_tmpdir\n\n# by mistake, this variable got lower cased for a while; it should be upper case but\n# now we should check for either, through 2025\nif [ -z \"${debug_springboot_rule}\" ]; then\n  if [ -z \"${DEBUG_SPRINGBOOT_RULE}\" ]; then\n    debugfile=/dev/null\n    debug_notset=1\n  fi\nfi\nif [ -z \"${debug_notset}\" ]; then\n    debugdir=$springboot_rule_tmpdir/debug/springboot\n    mkdir -p $debugdir\n    debugfileName=$packagename-$packagesha\n    debugfile=$debugdir/${debugfileName}.log\n    echo \"SPRING BOOT DEBUG LOG: $debugfile\"\nfi\n>$debugfile\n\n# Write debug header\necho \"\" >> $debugfile\necho \"*************************************************************************************\" >> $debugfile\necho \"Build time: $build_date_time\"  >> $debugfile\necho \"SPRING BOOT PACKAGER FOR BAZEL\" >> $debugfile\necho \"  ruledir         $ruledir     (build working directory)\" >> $debugfile\necho \"  singlejar       $singlejar_cmd (path to the singlejar utility)\" >> $debugfile\necho \"  mainclass       $mainclass   (classname of the @SpringBootApplication class for the manifest.MF file entry)\" >> $debugfile\necho \"  bootloader      $spring_boot_launcher_class   (classname of the Spring Boot Loader to use)\" >> $debugfile\necho \"  outputjar       $outputjar   (the executable JAR that will be built from this rule)\" >> $debugfile\necho \"  javabase        $javabase    (the path to the JDK2)\" >> $debugfile\necho \"  appjar          $appjar      (contains the .class files for the Spring Boot application)\" >> $debugfile\necho \"  appjar_name     $appjar_name (unused, is the appjar filename without the .jar extension)\" >> $debugfile\necho \"  manifest        $manifest    (the location of the generated manifest.MF file)\" >> $debugfile\necho \"  deps_index_file $deps_index_file (the location of the classpath index file - optional)\" >> $debugfile\necho \"  deplibs         (list of upstream transitive dependencies, these will be incorporated into the jar file in BOOT-INF/lib )\" >> $debugfile\necho \"  gitpropsfile    $gitpropsfile (the location of the generated git.properties file)\" >> $debugfile\necho \"*************************************************************************************\" >> $debugfile\n\n# compute path to jar utility\npushd . > /dev/null\ncd $javabase/bin\njar_command=$(pwd)/jar\npopd > /dev/null\necho \"Jar command:\" >> $debugfile\necho $jar_command >> $debugfile\n\necho $shasum_install_msg >> $debugfile\necho \"Unique identifier for this build: [$packagesha] computed from [$packagesha_raw]\" >> $debugfile\n\n# Setup working directories. Working directory is unique to this package path (uses SHA of path)\n# to tolerate non-sandboxed builds if so configured.\nbase_working_dir=$ruledir/$packagesha\nworking_dir=$base_working_dir/working\necho \"DEBUG: packaging working directory $working_dir\" >> $debugfile\nmkdir -p $working_dir/BOOT-INF/lib\nmkdir -p $working_dir/BOOT-INF/classes\n\n# We need a unique scratch work area\nTMP_working_dir=$base_working_dir/tmp\nmkdir -p $TMP_working_dir\n\n# Addins is the feature to add files to the root of the springboot jar\n# The addins are listed in order as args, until the addin_end.txt file marks the end\ni=$first_addin_arg\nwhile [ \"$i\" -le \"$#\" ]; do\n  eval \"addin=\\${$i}\"\n  echo \"     ADDINt: $addin\" >> $debugfile\n  if [[ $addin == *addin_end.txt ]]; then\n    i=$((i + 1))\n    echo \"     ADDIN end found: $addin\" >> $debugfile\n    break\n  fi\n  echo \"     ADDIN: $addin\" >> $debugfile\n  cp $addin $working_dir\n  i=$((i + 1))\ndone\nfirst_jar_arg=$i\necho \"\" >> $debugfile\n\n# log the list of dep jars we were given\ni=$first_jar_arg\nwhile [ \"$i\" -le \"$#\" ]; do\n  eval \"lib=\\${$i}\"\n  echo \"     DEPLIB:      $lib\" >> $debugfile\n  i=$((i + 1))\ndone\necho \"\" >> $debugfile\n\n# Extract the compiled Boot application classes into BOOT-INF/classes\n#    this must include the application's main class (annotated with @SpringBootApplication)\ncd $working_dir/BOOT-INF/classes\n# Extract all files except META-INF/MANIFEST.MF to avoid duplicate manifest entries\n$jar_command -xf $ruledir/$appjar\n# Remove the extracted MANIFEST.MF to prevent duplicate entries in the final jar\nrm -f META-INF/MANIFEST.MF\n\n# Copy all transitive upstream dependencies into BOOT-INF/lib\n#   The dependencies are passed as arguments to the script, starting at index $first_jar_arg\ncd $working_dir\n\n# Below we iterate over all deps and build a string that contains all jar paths,\n# space separated\nboot_inf_lib_jars=\"\"\n\ni=$first_jar_arg\nwhile [ \"$i\" -le \"$#\" ]; do\n  eval \"lib=\\${$i}\"\n  libname=$(basename $lib)\n  libdir=$(dirname $lib)\n  echo \"DEBUG: libname: $libname\" >> $debugfile\n  echo \"DEBUG: libdir: $libdir\" >> $debugfile\n  # Some paths may contain % as a result of Bazel URL encoding the folder name, such as\n  # user@example.com becoming user%40example.com. Such folders fail to load (see Issue #270).\n  # Translate % to _ to avoid this issue.\n  libdir=${libdir//%/_}\n  echo \"DEBUG: sanitized libdir: $libdir\" >> $debugfile\n  if [[ $libname == *jar ]]; then\n    # we only want to process .jar files as libs\n    if [[ $libname == *spring-boot-loader* ]] || [[ $libname == *spring_boot_loader* ]] || [[ $libname == librootclassloader_lib* ]]; then\n      # if libname contains the string 'spring-boot-loader' then...\n      # the Spring Boot Loader classes are special, they must be extracted at the root level /,\n      #   not in BOOT-INF/lib/loader.jar nor BOOT-INF/classes/**/*.class\n      # we only extract org/* and com/* since we don't want the toplevel META-INF files\n      $jar_command xf $ruledir/$lib com org META-INF/services\n    else\n      # copy the jar into BOOT-INF/lib, being mindful to prevent name collisions by using subdirectories (see Issue #61)\n      # the logic to truncate paths below doesn't need to be perfect, it just hopes to simplify the jar paths so they look better for most cases\n      # for maven_install deps, the algorithm to correctly identify the end of the server path and the groupId is not defined\n      #\n      # a note on duplicate artifacts:\n      # if the same dep (same gav) is brought in multiple times by different\n      # maven_install rules, we do not end up with multiple copies of the same\n      # jar. our logic handles this case because of how we truncate the paths\n      # below: both (identical) jars will get copied into the same location,\n      # the 2nd one overwriting the first one, and therefore we end of with\n      # only a single jar in the final assembly, as desired\n      # example: 2 maven_install rules bring in spring-boot-starter-jetty:\n      # \"maven\" rule: external/maven/v1/https/repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter-jetty/2.4.1/spring-boot-starter-jetty-2.4.1.jar\n      # \"spring_boot_starter_jetty\" rule: external/spring_boot_starter_jetty/v1/https/repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter-jetty/2.4.1/spring-boot-starter-jetty-2.4.1.jar\n      # the relative destpath we compute below starts after \"maven2\"\n      #\n      # related to above, a note on duplicate jar entries:\n      # if the jar cmd is called with the same path more than once, for example:\n      # jar -cf foo.jar a/b/c.txt d/e/f.txt a/b/c.txt, the first path \"wins\",\n      # subsequent duplicate paths are ignored. so for the example above, the\n      # jar will have entries: a/b/c.txt, d/e/f.txt\n      # this \"first one wins\" behavior is also what we want when duplicate\n      # dependencies are encountered\n      if [[ ${libdir} == *external*maven2* ]]; then\n        # this is a maven_install jar probably from maven central\n        # libdir:      bazel-out/darwin-fastbuild/bin/external/maven/v1/https/repo1.maven.org/maven2/org/springframework/boot/spring-boot-starter-logging/2.2.1.RELEASE/spring-boot-starter-logging-2.2.1.RELEASE.jar\n        # libdestdir:  BOOT-INF/lib/org/springframework/boot/spring-boot-starter-logging/2.2.1.RELEASE/spring-boot-starter-logging-2.2.1.RELEASE.jar\n        libdestdir=\"BOOT-INF/lib/${libdir#*maven2}\"\n      elif [[ ${libdir} == *external*public* ]]; then\n        # this is a maven_install jar probably from Sonatype Nexus\n        # libdir:      bazel-out/darwin-fastbuild/bin/external/maven/v1/https/ournexus.acme.com/nexus/content/groups/public/org/springframework/boot/spring-boot-starter-logging/2.2.1.RELEASE/spring-boot-starter-logging-2.2.1.RELEASE.jar\n        # libdestdir:  BOOT-INF/lib/org/springframework/boot/spring-boot-starter-logging/2.2.1.RELEASE/spring-boot-starter-logging-2.2.1.RELEASE.jar\n        libdestdir=\"BOOT-INF/lib/${libdir#*public}\"\n      elif [[ ${libdir} == bazel-out* ]]; then\n        # this is an internally built jar from the workspace, use the Bazel package name as the path to prevent name collisions\n        # libdir:      bazel-out/darwin-fastbuild/bin/projects/libs/acme/blue_lib/liblue_lib.jar\n        # libdestdir:  BOOT-INF/lib/projects/libs/acme/blue_lib/liblue_lib.jar\n        libdestdir=\"BOOT-INF/lib/${libdir#*bin}\"\n      else\n        # something else, just copy into BOOT-INF/lib using the full path as it exists\n        # this works fine, but you will see some Bazel internal output dirs as part of the path in the jar\n        libdestdir=\"BOOT-INF/lib/${libdir}\"\n      fi\n      mkdir -p ${libdestdir}\n      libdestpath=${libdestdir}/$libname\n      boot_inf_lib_jars=\"${boot_inf_lib_jars} ${libdestpath}\"\n      cp -f $ruledir/$lib $libdestpath\n    fi\n  fi\n\n  i=$((i + 1))\ndone\n\nelapsed_trans=$(( $SECONDS - build_time_start ))\necho \"DEBUG: finished copying transitives into BOOT-INF/lib, elapsed time (seconds): $elapsed_trans\" >> $debugfile\n\n\n\n# Generate Spring Boot index files for jarmode=tools support\necho \"DEBUG: generating Spring Boot index files\" >> $debugfile\n\n# Generate classpath.idx\necho \"DEBUG: generating BOOT-INF/classpath.idx\" >> $debugfile\nclasspath_idx_file=\"BOOT-INF/classpath.idx\"\n> $classpath_idx_file  # Create empty file\nfor jar_path in $boot_inf_lib_jars; do\n  if [[ -f \"$jar_path\" ]]; then\n    # Clean up double slashes and use the actual jar path as it appears in the jar file\n    clean_jar_path=$(echo \"$jar_path\" | sed 's|//|/|g')\n    echo \"- \\\"$clean_jar_path\\\"\" >> $classpath_idx_file\n  fi\ndone\n\n# Generate layers.idx\necho \"DEBUG: generating BOOT-INF/layers.idx\" >> $debugfile\nlayers_idx_file=\"BOOT-INF/layers.idx\"\ncat > $layers_idx_file << 'EOF'\n- \"dependencies\":\n  - \"BOOT-INF/lib/\"\n- \"spring-boot-loader\":\n  - \"org/\"\n- \"snapshot-dependencies\":\n- \"application\":\n  - \"BOOT-INF/classes/\"\n  - \"BOOT-INF/classpath.idx\"\n  - \"BOOT-INF/layers.idx\"\n  - \"META-INF/\"\nEOF\n\n# Inject the Git properties into a properties file in the jar\n# (the -f is needed when remote caching is used, as cached files come down as r-x and\n#  if you rerun the build it needs to overwrite)\nif [[ \"$include_git_properties_file\" == true ]]; then\n  echo \"DEBUG: adding git.properties\" >> $debugfile\n  cat $ruledir/$gitpropsfile >> $debugfile\n  cp -f $ruledir/$gitpropsfile $working_dir/BOOT-INF/classes/git.properties\nfi\n\n# Inject the classpath index (unless it is the default empty.txt file). Requires Spring Boot version 2.3+\n# https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html#executable-jar-war-index-files-classpath\nif [[ ! $deps_index_file = *empty.txt ]]; then\n  cp $ruledir/$deps_index_file $working_dir/BOOT-INF/classpath.idx\nfi\n\n# Create the output jar\ncd $working_dir\n\n# Write debug telemetry data\necho \"DEBUG: Creating the JAR file $working_dir\" >> $debugfile\necho \"DEBUG: jar contents:\" >> $debugfile\nfind . >> $debugfile\nelapsed_pre_jar=$(( $SECONDS - build_time_start ))\necho \"DEBUG: elapsed time (seconds): $elapsed_pre_jar\" >> $debugfile\n\n# First use jar to create a correct jar file for Spring Boot\n# Note that a critical part of this step is to pass option 0 into the jar command\n# that tells jar not to compress the jar, only package it. Spring Boot does not\n# allow the jar file to be compressed (it will fail at startup).\nraw_output_jar=$ruledir/${outputjar}.raw\necho \"DEBUG: Running jar command to produce $raw_output_jar\" >> $debugfile\n\n# The current working directory now has exactly the structure we want to jar up\n# HOWEVER, instead of running jar just once, we run jar multiple times to ensure\n# that the jar entries are added in the required order to the jar:\n# Spring Boot Loader -> BOOT-INF/classes -> BOOT-INF/lib\n# A different order can create confusing classpath ordering issues when\n# the uber jar is executed using java -jar\n\n# Move BOOT-INF/classes and BOOT-INF/lib out of the way, into this tmp directory\ntmp_boot_inf_dir=$TMP_working_dir/boot_inf\n# We need this directory to be clean (we'll re-create it below)\nrm -rf $tmp_boot_inf_dir\n\n# Move BOOT-INF/classes\ntmp_classes_dir=$tmp_boot_inf_dir/classes\nmkdir -p \"${tmp_classes_dir}/BOOT-INF\"\nmv BOOT-INF/classes \"${tmp_classes_dir}/BOOT-INF\"\n# Move BOOT-INF/lib\ntmp_lib_dir=$tmp_boot_inf_dir/lib\nmkdir -p \"${tmp_lib_dir}/BOOT-INF\"\nmv BOOT-INF/lib \"${tmp_lib_dir}/BOOT-INF\"\n\n# Given the mv cmds above, we now jar everything EXCEPT BOOT-INF/classes and BOOT-INF/lib\n$jar_command -cfm0 $raw_output_jar $ruledir/$manifest .  2>&1 | tee -a $debugfile\n# Now add BOOT-INF/classes\ncd $tmp_classes_dir\n$jar_command -uf0 $raw_output_jar .  2>&1 | tee -a $debugfile\ncd $working_dir\n# Finally add BOOT-INF/lib\ncd $tmp_lib_dir\nif [ \"$deps_starlark_order\" == true ]; then\n  # if this command fails due to the command line being too long, please see the docs\n  # about setting deps_starlark_order=False as a workaround\n  $jar_command -uf0 $raw_output_jar $boot_inf_lib_jars  2>&1 | tee -a $debugfile\nelse\n  $jar_command -uf0 $raw_output_jar .  2>&1 | tee -a $debugfile\nfi\ncd $working_dir\n\n(\n    # Use Bazel's singlejar to re-jar it which normalizes timestamps as Jan 1 2010\n    # note that it does not use the manifest from the jar file, which is a bummer\n    # so we have to respecify the manifest data\n    # TODO we should rewrite write_manfiest.sh to produce inputs compatible for singlejar (Issue #27)\n    singlejar_options=\"--normalize --dont_change_compression\" # add in --verbose for more details from command\n    singlejar_mainclass=\"--main_class $spring_boot_launcher_class\"\n    # #205: Execute the singlejar command from the original ruledir, so the build-data.properties file\n    # contains a deterministic, relative path for 'build.target'.\n    cd \"$ruledir\"\n    $singlejar_cmd $singlejar_options $singlejar_mainclass \\\n        --deploy_manifest_lines \"Start-Class: $mainclass\" \\\n        --deploy_manifest_lines \"Spring-Boot-Classes: BOOT-INF/classes/\" \\\n        --deploy_manifest_lines \"Spring-Boot-Lib: BOOT-INF/lib/\" \\\n        --deploy_manifest_lines \"Spring-Boot-Classpath-Index: BOOT-INF/classpath.idx\" \\\n        --deploy_manifest_lines \"Spring-Boot-Layers-Index: BOOT-INF/layers.idx\" \\\n        --sources $raw_output_jar \\\n        --output \"$outputjar\" 2>&1 | tee -a $debugfile\n)\n\nif [ $? -ne 0 ]; then\n  echo \"ERROR: Failed creating the JAR file $working_dir.\" | tee -a $debugfile\nfi\n\ncd $ruledir\n\n# Elapsed build time\nbuild_time_end=$SECONDS\nbuild_time_duration=$(( build_time_end - build_time_start ))\necho \"DEBUG: SpringBoot packaging subrule elapsed time (seconds) for $packagename: $build_time_duration\" >> $debugfile\n"
  },
  {
    "path": "springboot/src/main/java/com/salesforce/rulesspring/cli/SpringBootInspector.java",
    "content": "package com.salesforce.rulesspring.cli;\n\nimport java.io.BufferedWriter;\nimport java.io.File;\nimport java.io.FileWriter;\n\nimport com.salesforce.rulesspring.index.SpringBootIndexReporter;\nimport com.salesforce.rulesspring.index.IndexOfFiles;\nimport com.salesforce.rulesspring.index.SpringBootJarIndexer;\n\npublic class SpringBootInspector {\n\n    public static void main(String[] args) throws Exception {\n        if (args.length < 3) {\n            System.out.println(\"ERROR: this tool needs at least 3 arguments\");\n            usage();\n            return;\n        }\n\n        Command cmd = parseArgs(args);\n        if (cmd == null) {\n            // command line was invalid, and reason was already logged, just exit\n            return;\n        }\n\n        if (\"inspector\".equals(cmd.mode)) {\n            File jarFile = new File(cmd.jarFilepath);\n            if (!jarFile.exists()) {\n                System.err.println(\"ERROR: File \"+cmd.jarFilepath+\" does not exist.\");\n                return;\n            }\n            System.out.println(\"Spring Boot Jar absolute path: \"+jarFile.getAbsolutePath());\n\n            if (\"index\".equals(cmd.operation)) {\n                File indexFile = new File(cmd.outputPath);\n                if (indexFile.exists()) {\n                    System.err.println(\"ERROR: File \"+indexFile.getAbsolutePath()+\" already exists and we don't overwrite files.\");\n                    return;\n                }\n                System.out.println(\"Index output file absolute path: \"+indexFile.getAbsolutePath());\n\n\n                SpringBootJarIndexer indexer = new SpringBootJarIndexer(jarFile);\n                IndexOfFiles index = indexer.indexJar(cmd.recursive);\n\n                SpringBootIndexReporter reporter = new SpringBootIndexReporter();\n                String report = reporter.generateReport(index, cmd.reportOptions);\n\n                BufferedWriter writer = new BufferedWriter(new FileWriter(indexFile));\n                writer.write(report);\n                writer.close();\n\n                System.out.println(\"Wrote index file as \"+cmd.outputPath);\n            } else {\n                System.err.println(\"Operation \"+cmd.operation+\" is not implemented.\");\n            }\n        }\n    }\n\n    protected static void usage() {\n        System.out.println(\"Spring Boot Jar Inspector\");\n        System.out.println(\"Usage:\");\n        System.out.println(\"  java -jar springboot-cli.jar MODE OPERATION [operation specific args]\");\n        System.out.println(\"    MODE: 'inspector' for running operations on a single Spring Boot jar; 'comparator' when running operations with multiple Spring Boot jars\");\n        System.out.println(\"    OPERATION: a keyword that activates a particular operation; operations are documented below\");\n        System.out.println(\"\\n\");\n\n        System.out.println(\"INSPECTOR OPERATIONS:\");\n        System.out.println(\"\\n\");\n        System.out.println(\" index: generates an index of files within the Spring Boot jar.\");\n        System.out.println(\"   java -jar springboot-cli.jar inspect index SPRING-BOOT-JAR-PATH INDEX-REPORT-PATH [--recursive] [--report REPORT-OPTIONS]\");\n        System.out.println(\"     SPRING-BOOT-JAR-PATH: path to your Spring Boot executable jar file; it must exist\");\n        System.out.println(\"     INDEX-REPORT-PATH: path to write the report from this tool; it must not already exist\");\n        System.out.println(\"     --recursive: if present, inspector will also index the contents of the nested jars found inside the Spring Boot jar\");\n        System.out.println(\"     REPORT-OPTIONS: optional list of modifiers to the reporting engine; see docs for details\");\n    }\n\n    protected static Command parseArgs(String[] args) {\n        // TODO this is pretty awkward but keeping it simple for now\n\n        Command cmd = new Command();\n        cmd.mode = args[0];\n        cmd.operation = args[1];\n        System.out.println(\"Mode: \"+cmd.mode);\n        System.out.println(\"Operation: \"+cmd.operation);\n\n        int optionalArgIndex = 2;\n        if (\"inspector\".equals(cmd.mode)) {\n            if (\"index\".equals(cmd.operation)) {\n                if (args.length < 4) {\n                    System.out.println(\"ERROR: Not enough arguments for the index command.\");\n                    usage();\n                    return null;\n                }\n                cmd.jarFilepath = args[2];\n                cmd.outputPath = args[3];\n                System.out.println(\"Spring Boot Jar: \"+cmd.jarFilepath);\n                System.out.println(\"Index output file: \"+cmd.outputPath);\n                optionalArgIndex = 4;\n            }\n        }\n        parseOptionalArgs(args, optionalArgIndex, cmd);\n        return cmd;\n    }\n\n    protected static void parseOptionalArgs(String[] args, int index, Command cmd) {\n        for (int i = index; i<args.length; i++) {\n            if (\"--recursive\".equals(args[i])) {\n                cmd.recursive = true;\n                System.out.println(\"Recursive: true\");\n            } else if (\"--report\".equals(args[i])) {\n                cmd.reportOptions = args[i+1];\n                i++;\n                System.out.println(\"Report options: \"+cmd.reportOptions);\n            } else {\n                System.err.println(\"Unrecognized parameter \"+args[i]+ \". Ignoring.\");\n            }\n        }\n\n    }\n\n    public static class Command {\n        // General args\n        public String mode;\n        public String operation;\n        public String jarFilepath;\n        public String outputPath;\n\n        // inspector:index args\n        public boolean recursive = false;\n        public String reportOptions = null;\n    }\n\n}\n"
  },
  {
    "path": "springboot/src/main/java/com/salesforce/rulesspring/index/IndexFileType.java",
    "content": "package com.salesforce.rulesspring.index;\n\npublic enum IndexFileType {\n    LIBRARY, // jar file\n    CLASS, // .class file\n    RESOURCE // anything else\n}\n"
  },
  {
    "path": "springboot/src/main/java/com/salesforce/rulesspring/index/IndexOfFiles.java",
    "content": "package com.salesforce.rulesspring.index;\n\nimport java.util.ArrayList;\nimport java.util.List;\n\n/**\n * The index generated from inspecting a jar file.\n */\npublic class IndexOfFiles {\n    \n    // We have two types of index objects:\n    // 1. index of the files directly inside the spring boot executable jar\n    // 2. index of the contents of a jar file inside the spring boot executable jar (aka nested jar)\n    protected boolean isNestedJarIndex = false;\n\n    // either the path on disk to the executable jar (if this is an index of a spring boot jar),\n    // or the relative path of the nested jar file inside the spring boot jar file\n    protected String jarPath;\n    \n    // if this is an index of a jar file inside the executable jar (nested jar) this will point to the \n    // spring boot executable jar index\n    protected IndexedFile parentIndex;\n    \n    // The lists of found files:\n    protected List<IndexedFile> libraries = new ArrayList<>();\n    protected List<IndexedFile> classes = new ArrayList<>();\n    protected List<IndexedFile> resources = new ArrayList<>();\n    \n    public IndexOfFiles(String jarPath) {\n        this.jarPath = jarPath;\n    }\n\n    public IndexOfFiles(IndexedFile parentIndex, String jarPath) {\n        this.parentIndex = parentIndex;\n        this.isNestedJarIndex = true;\n        this.jarPath = jarPath;\n    }\n\n    public void addIndexEntry(IndexedFile indexEntry) {\n        switch (indexEntry.type) {\n        case LIBRARY:\n            libraries.add(indexEntry);\n            break;\n        case CLASS:\n            classes.add(indexEntry);\n            break;\n        case RESOURCE:\n            resources.add(indexEntry);\n            break;\n        default:\n            throw new IllegalStateException(\"Somebody added a new Index entry type, but forgot to build an index collection for it.\");\n        }\n        \n    }\n\n    public String getJarPath() {\n        return jarPath;\n    }\n    \n    public IndexedFile getParentIndex() {\n        return parentIndex;\n    }\n    \n    public List<IndexedFile> getLibraries() {\n        return libraries;\n    }\n\n    public List<IndexedFile> getClasses() {\n        return classes;\n    }\n\n    public List<IndexedFile> getResources() {\n        return resources;\n    }\n}\n"
  },
  {
    "path": "springboot/src/main/java/com/salesforce/rulesspring/index/IndexedFile.java",
    "content": "package com.salesforce.rulesspring.index;\n\nimport java.nio.file.attribute.FileTime;\nimport java.util.Comparator;\nimport java.util.zip.ZipEntry;\n\n/**\n * Represents a file found inside of a jar file.\n */\npublic class IndexedFile {\n    // library (jar), class, or resource file\n    protected IndexFileType type;\n    \n    // full path inside of the jar file\n    protected String fullPath;\n    \n    // the filename, i.e. the last path element of the fullPath\n    protected String filename;\n    \n    protected long sizeInBytes = 0;\n    protected long createdTimeMillis = 0;\n    protected long modifiedTimeMillis = 0;\n\n    // if this index entry is for a file found in a nested jar inside of an outer jar, parentLibrary will\n    // point to the index of the parent jar\n    protected IndexedFile parentLibrary = null; \n\n    static IndexedFile parseZipEntry(IndexedFile parentLibrary, ZipEntry zipEntry) {\n        IndexedFile indexEntry = new IndexedFile();\n        indexEntry.fullPath = zipEntry.getName();\n        indexEntry.filename = indexEntry.fullPath;\n        \n        String fp = indexEntry.fullPath;\n        if (fp.contains(\"/\")) {\n            int lastSlash = fp.lastIndexOf(\"/\");\n            indexEntry.filename = fp.substring(lastSlash+1);\n        }\n        \n        if (fp.contains(\"BOOT-INF/lib\") && fp.endsWith(\".jar\")) {\n            indexEntry.type = IndexFileType.LIBRARY;\n        }\n        else if (fp.endsWith(\".class\")) {\n            indexEntry.type = IndexFileType.CLASS;\n        } else { \n            indexEntry.type = IndexFileType.RESOURCE;\n        }\n        \n        indexEntry.sizeInBytes = zipEntry.getSize();\n        FileTime fTime = zipEntry.getCreationTime();\n        if (fTime != null) {\n            indexEntry.createdTimeMillis = fTime.toMillis();\n        }\n        fTime = zipEntry.getLastModifiedTime();\n        if (fTime != null) {\n            indexEntry.modifiedTimeMillis = fTime.toMillis();\n        }\n\n        return indexEntry;\n    }\n    \n    public static class FullPathComparator implements Comparator<IndexedFile> {\n        @Override\n        public int compare(IndexedFile e1, IndexedFile e2) {\n            return e1.fullPath.compareTo(e2.fullPath); \n        }\n    }\n\n    public static class FilenameComparator implements Comparator<IndexedFile> {\n        @Override\n        public int compare(IndexedFile e1, IndexedFile e2) {\n            return e1.filename.compareTo(e2.filename); \n        }\n    }\n}\n"
  },
  {
    "path": "springboot/src/main/java/com/salesforce/rulesspring/index/SpringBootIndexReporter.java",
    "content": "package com.salesforce.rulesspring.index;\n\nimport java.util.Comparator;\nimport java.util.List;\n\n/**\n * Generates the text report with the results of an indexing operation.\n * This class is pretty simple, so the code serves as the documentation.\n * <p>\n * To see what options are implemented, see parseOptions() below.\n */\npublic class SpringBootIndexReporter {\n    \n    protected boolean includeLibs = true;\n    protected boolean includeClasses = true;\n    protected boolean includeResources = true;\n    \n    protected boolean prettyHeadings = true;\n    \n    protected boolean writeFullPaths = false;\n    protected boolean writeFileSize = false;\n    protected boolean writeCreatedTime = false;\n    protected boolean writeModifiedTime = false;\n    \n    protected boolean sortOnFullPaths = false;\n    \n    public SpringBootIndexReporter() {\n        \n    }\n\n    public String generateReport(IndexOfFiles index) {\n        return this.generateReport(index, null);\n    }\n\n    public String generateReport(IndexOfFiles index, String options) {\n        StringBuffer result = new StringBuffer();\n        parseOptions(options);\n        \n        Comparator<IndexedFile> sortOrder = new IndexedFile.FilenameComparator();\n        if (sortOnFullPaths) {\n            sortOrder = new IndexedFile.FullPathComparator();\n        }\n        \n        if (prettyHeadings) {\n            result.append(\"Jar File: \");\n            result.append(index.getJarPath());\n            result.append(\"\\n\");\n        }\n        \n        if (includeLibs) {\n            index.libraries.sort(sortOrder);\n            processList(index.libraries, \"Libraries\", result);\n        }\n\n        if (includeClasses) {\n            index.classes.sort(sortOrder);\n            processList(index.classes, \"Classes\", result);\n        }\n\n        if (includeResources) {\n            index.resources.sort(sortOrder);\n            processList(index.resources, \"Resources\", result);\n        }\n\n        return result.toString();\n    }\n    \n    protected void parseOptions(String options) {\n        if (options == null) {\n            return;\n        }\n        includeLibs = options.contains(\"L\"); // write the list of .jar files found\n        includeClasses = options.contains(\"C\"); // write the list of  .class files found\n        includeResources = options.contains(\"R\"); // write the list of other files found\n        prettyHeadings = options.contains(\"H\"); // write pretty headings into the output\n        writeFullPaths = options.contains(\"F\"); // write full paths of each entry\n        writeFileSize = options.contains(\"Z\"); // write the file size of each file\n        writeCreatedTime = options.contains(\"B\"); // write the created time of each file\n        writeModifiedTime = options.contains(\"M\"); // write the modified time of each file\n        sortOnFullPaths = options.contains(\"S\"); // when sorting, sort on the path and not the filename\n    }\n    \n    protected void processList(List<IndexedFile> list, String headingLabel, StringBuffer result) {\n        if (prettyHeadings) {\n            result.append(\"\\n\\n\");\n            result.append(headingLabel);\n            result.append(\"\\n---------------\\n\");\n        }\n        for (IndexedFile lib : list) {\n            if (writeFullPaths) {\n                result.append(lib.fullPath);\n            } else {\n                result.append(lib.filename);\n            }\n            if (writeFileSize) {\n                result.append(\"  size=\");\n                result.append(\"\"+lib.sizeInBytes);\n            }\n            if (writeCreatedTime) {\n                result.append(\"  created=\");\n                result.append(\"\"+lib.createdTimeMillis);\n            }\n            if (writeModifiedTime) {\n                result.append(\"  modified=\");\n                result.append(\"\"+lib.modifiedTimeMillis);\n            }\n            result.append(\"\\n\");\n        }\n    }\n}\n"
  },
  {
    "path": "springboot/src/main/java/com/salesforce/rulesspring/index/SpringBootJarIndexer.java",
    "content": "package com.salesforce.rulesspring.index;\n\nimport java.io.File;\nimport java.io.IOException;\nimport java.util.Collections;\nimport java.util.Enumeration;\nimport java.util.zip.ZipEntry;\nimport java.util.zip.ZipFile;\n\n/**\n * Produces an index from the contents of a Spring Boot jar.\n */\npublic class SpringBootJarIndexer {\n\n    protected File bootJarFile;\n    \n    public SpringBootJarIndexer(File jarFile) {\n        this.bootJarFile = jarFile;\n    }\n\n    /**\n     * Index the contents of the Spring Boot jar.\n     * \n     * @param recursive if true, it will produce child indices of each nested jar inside the Spring Boot executable jar.\n     */\n    public IndexOfFiles indexJar(boolean recursive) throws IOException {\n        IndexOfFiles index = new IndexOfFiles(bootJarFile.getAbsolutePath());\n        try (ZipFile zipFile = new ZipFile(this.bootJarFile)) {\n            \n            Enumeration<? extends ZipEntry> entries = zipFile.entries();\n            for (ZipEntry entry : Collections.list(entries)) {\n                if (entry.isDirectory()) {\n                    continue;\n                }\n                IndexedFile indexEntry = IndexedFile.parseZipEntry(null, entry);\n                index.addIndexEntry(indexEntry);\n                \n                if (recursive && indexEntry.type.equals(IndexFileType.LIBRARY)) {\n                    // TODO do the nested indexing\n                    indexJar(indexEntry, entry);\n                }\n            }\n        } \n        return index;\n    }\n\n    /**\n     * Create a child index for a nested jar.\n     */\n    protected IndexOfFiles indexJar(IndexedFile parentLibrary, ZipEntry nestedJar) throws IOException {\n        \n        // TODO this needs to be reworked to open the jar from the ZipEntry\n        \n        IndexOfFiles index = new IndexOfFiles(bootJarFile.getAbsolutePath());\n        try (ZipFile zipFile = new ZipFile(this.bootJarFile)) {\n            \n            Enumeration<? extends ZipEntry> entries = zipFile.entries();\n            for (ZipEntry entry : Collections.list(entries)) {\n                if (entry.isDirectory()) {\n                    continue;\n                }\n                IndexedFile indexEntry = IndexedFile.parseZipEntry(parentLibrary, entry);\n                index.addIndexEntry(indexEntry);\n            }\n        } \n        return index;\n    }\n}\n"
  },
  {
    "path": "springboot/src/test/java/com/salesforce/rulesspring/index/SpringBootJarIndexerTest.java",
    "content": "package com.salesforce.rulesspring.index;\n\npublic class SpringBootJarIndexerTest {\n\n}\n"
  },
  {
    "path": "springboot/testing_springboot.md",
    "content": "## Implementing Tests for SpringBoot Applications in Bazel\n\nBefore reading this document, please read Spring Boot documentation on how to write Spring Boot tests in general.\nDocuments that explain the *SpringBootTest* annotation is what you should look for.\n\nThis document explains how to invoke those tests from your Bazel build.\nBe sure to also look at the [example application](../../examples/helloworld) for actual test implementations.\n\nThe code snippets below assume you have a Spring Boot application with *BUILD* file as:\n```starlark\njava_library(\n    name = \"helloworld_lib\",\n    srcs = glob([\"src/main/java/**/*.java\"]),\n    resources = glob([\"src/main/resources/**\"]),\n    deps = ...redacted...,\n)\n\nspringboot(\n    name = \"helloworld\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n)\n```\n\n### Unit Tests\n\nYour unit tests should operate against the *java_library* target, not the *springboot* target.\nBecause of this, unit tests are just standard Bazel Java.\nYour *BUILD* file will have:\n\n```starlark\ntest_deps = [\n    \"@maven//:junit_junit\",\n    \"@maven//:org_hamcrest_hamcrest_core\",\n]\n\njava_test(\n   name = \"SampleRestUnitTest\",\n   srcs = [\"src/test/java/com/sample/SampleRestUnitTest.java\"],\n   deps = [ \":helloworld_lib\" ] + test_deps,\n)\n```\n\n### Functional Tests (starts an application context)\n\nFunctional tests need to invoke the Spring Boot machinery to start up the application with the Spring application context.\nFunctional tests should target the *java_library*, not the output of the *springboot* rule.\nThis may be unexpected as you may worry that your tests are not testing the artifact that will be promoted to production.\nSee the next *Integration Tests* section for another option.\n\nYour functional test will have the standard Spring Boot annotations:\n\n```java\n@RunWith(SpringRunner.class)\n@SpringBootTest(classes = SampleMain.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)\npublic class SampleRestFuncTest {\n   ...\n```\n\nwith *BUILD* file\n\n```starlark\nspringboottest_deps = [\n    \"@maven//:org_springframework_spring_beans\",\n    \"@maven//:org_springframework_boot_spring_boot_test\",\n    \"@maven//:org_springframework_spring_test\",\n]\n\njava_test(\n    name = \"SampleRestFuncTest\",\n    srcs = [\"src/test/java/com/sample/SampleRestFuncTest.java\"],\n    deps = [ \":helloworld_lib\" ] + test_deps + springboottest_deps,\n    resources = glob([\"src/test/resources/**\"]),\n)\n```\n\n### Spring Boot Jar Tests and Integration Tests\n\nWithin Salesforce, almost all testing is done as Unit and Functional tests against the *java_library* jar.\nBut we also like to run a small number of final checks against the *springboot* deployable jar.\nThese tests, and all integration tests, are done within a Docker container.\n\nWe rely on external Bazel tools for this, and we don't offer anything of interest beyond what those tools provide.\nWe refer you to that documentation.\n\n- [rules_oci](https://github.com/bazel-contrib/rules_oci)\n- [testcontainers](https://www.testcontainers.org/)\n\n### Code Coverage\n\nSince Unit and Functional tests are run against the *java_library*, and not the *springboot* rule, code coverage is done with\n  standard Bazel Java techniques.\nWe do provide a convenience script to show how to run *lcov* to generate the html report.\nBut none of this is specific to *springboot*.\n\n```bash\nbazel coverage //examples/helloworld/...\n./tools/codecoverage/coverage-report.sh\n```\n"
  },
  {
    "path": "springboot/tests/check_dupe_classes_test.py",
    "content": "#\n# Copyright (c) 2019-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\nimport os\nimport subprocess\nimport tempfile\nimport shutil\nimport unittest\nimport check_dupe_classes\nimport platform\n\nFAKE_CONT1 = \"This is some class bytecode\"\nFAKE_CONT2 = \"This is some other class bytecode\"\nALLOWLIST_PATH = \"\"\n\nclass TestVerifyDupeClasses(unittest.TestCase):\n\n    def setUp(self):\n        global ALLOWLIST_PATH\n        self.tempdir = tempfile.mkdtemp(\"TestVerifyConflict\")\n        ALLOWLIST_PATH = self._write_allowlist_file()\n\n    def tearDown(self):\n        shutil.rmtree(self.tempdir)\n\n    def test_single_jar_with_two_unique_class(self):\n        classes_dir = self._create_fake_class(\"MyClass.class\", \"classes\",\n                                              \"com/salesforce\", FAKE_CONT1)\n        classes_dir = self._create_fake_class(\"MyClass2.class\", \"classes\",\n                                              \"com/salesforce\", FAKE_CONT2)\n\n        jar_dir = os.path.join(self.tempdir, \"inner_jar2\")\n        os.makedirs(jar_dir)\n        jar_file = self._create_jar(\"myjar.jar\", jar_dir, classes_dir)\n\n        springbootjar = self._create_springboot_jar(\"sb2.jar\", jar_dir)\n\n        check_dupe_classes.run(springbootjar, ALLOWLIST_PATH, None)\n\n    def test_two_jars_with_duplicate_class__same_content(self):\n        classes_dir1 = self._create_fake_class(\"MyClass.class\", \"classes1\",\n                                               \"com/salesforce\", FAKE_CONT1)\n        # make the jar more interesting: add another class\n        self._create_fake_class(\"MyClass2.class\", \"classes1\", \"com/salesforce\",\n                                FAKE_CONT2)\n        classes_dir2 = self._create_fake_class(\"MyClass.class\", \"classes2\",\n                                               \"com/salesforce\", FAKE_CONT1)\n\n        jar_dir = os.path.join(self.tempdir, \"inner_jar3\")\n        os.makedirs(jar_dir)\n        jar_file1 = self._create_jar(\"myjar1.jar\", jar_dir, classes_dir1)\n        jar_file2 = self._create_jar(\"myjar2.jar\", jar_dir, classes_dir2)\n\n        springbootjar = self._create_springboot_jar(\"sb3.jar\", jar_dir)\n\n        check_dupe_classes.run(springbootjar, ALLOWLIST_PATH, None)\n\n    def test_two_jars_with_duplicate_class__different_content(self):\n        classes_dir1 = self._create_fake_class(\"MyClass.class\", \"classes1\",\n                                               \"com/salesforce\", FAKE_CONT1)\n        classes_dir2 = self._create_fake_class(\"MyClass.class\", \"classes2\",\n                                               \"com/salesforce\", FAKE_CONT2)\n\n        jar_dir = os.path.join(self.tempdir, \"inner_jar4\")\n        os.makedirs(jar_dir)\n        jar_file1 = self._create_jar(\"myjar1.jar\", jar_dir, classes_dir1)\n        jar_file2 = self._create_jar(\"myjar2.jar\", jar_dir, classes_dir2)\n\n        springbootjar = self._create_springboot_jar(\"sb4.jar\", jar_dir)\n\n        with self.assertRaises(Exception) as ctx:\n            check_dupe_classes.run(springbootjar, ALLOWLIST_PATH, None)\n\n        self.assertIn(\"Found duplicate classes\", str(ctx.exception))\n\n    def test_two_jars_with_duplicate_class_allowlisted__different_content(self):\n        classes_dir1 = self._create_fake_class(\"MyClass.class\", \"classes1\",\n                                               \"com/salesforce\", FAKE_CONT1)\n        classes_dir2 = self._create_fake_class(\"MyClass.class\", \"classes2\",\n                                               \"com/salesforce\", FAKE_CONT2)\n\n        jar_dir = os.path.join(self.tempdir, \"inner_jar5\")\n        os.makedirs(jar_dir)\n        jar_file1 = self._create_jar(\"myjar20.jar\", jar_dir, classes_dir1)\n        jar_file2 = self._create_jar(\"myjar21.jar\", jar_dir, classes_dir2)\n\n        springbootjar = self._create_springboot_jar(\"sb5.jar\", jar_dir)\n\n        check_dupe_classes.run(springbootjar, ALLOWLIST_PATH, None)\n\n\n    # HELPERS\n\n    def _create_jar(self, name, jar_dir, classes_dir):\n        jar_file = os.path.join(jar_dir, name)\n        self._run(\"jar cf %s %s\" % (jar_file, \".\"), cwd=classes_dir)\n        assert os.path.exists(jar_file)\n        return jar_file\n\n    def _create_springboot_jar(self, name, innerjar_dir):\n        jar_file = os.path.join(self.tempdir, name)\n        self._run(\"jar cf %s %s\" % (jar_file, \".\"), cwd=innerjar_dir)\n        assert os.path.exists(jar_file)\n        return jar_file\n\n    def _create_fake_class(self, name, root_classes_dir, package, content):\n        classes_dir = os.path.join(self.tempdir, root_classes_dir)\n        package_dir = os.path.join(classes_dir, package)\n        if not os.path.exists(package_dir):\n            os.makedirs(package_dir)\n        class_file = os.path.join(package_dir, name)\n        with open(class_file, \"w\") as f:\n            f.write(content)\n        return classes_dir\n\n    def _write_index_file(self, jar_files):\n        index_file_path = os.path.join(self.tempdir, \"classes.txt\")\n        print(index_file_path)\n        with open(index_file_path, \"wb\") as f:\n            for jar_file in jar_files:\n                f.write((\"%s%s\\n\" % (check_dupe_classes.JARNAME_PREFIX, jar_file)).encode())\n                f.write(self._run(\"unzip -l %s\" % jar_file))\n        return index_file_path\n\n    def _write_allowlist_file(self):\n        allowlist_file_path = os.path.join(self.tempdir, \"allowlist.txt\")\n        with open(allowlist_file_path, \"w\") as f:\n                f.write(self.tempdir+ \"/myjar20.jar\\n\")\n                f.write(self.tempdir+ \"/myjar21.jar\\n\")\n        return allowlist_file_path\n\n    def _run(self, cmd, cwd=None):\n        if not cwd:\n            cwd = self.tempdir\n        output = subprocess.Popen(cmd, cwd=cwd, shell=True, stdout=subprocess.PIPE).stdout.read()\n        return output\n\n\nif __name__ == '__main__':\n    unittest.main()\n"
  },
  {
    "path": "springboot/unwanted_classes.md",
    "content": "## Detecting, Excluding and Suppressing Unwanted Classes and Dependencies\n\nSpring Boot jars normally aggregate a great number of dependency jars, many from outside the Bazel\n  build (external Maven-built jars).\nThe Spring Boot rule will copy the transitive closure of all Java jar deps into the [Spring Boot executable jar](https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html).\nThis is normally what you want.\n\nBut sometimes you have a transitive dependency that causes problems when included in your Spring Boot jar, but\n  you don't have the control to remove it from your dependency graph.\nThis can cause problems such as:\n- multiple jars have the same class, but at different versions\n- an unwanted class carries a Spring annotation such that the class gets instantiated at startup\n- a jar file should never be deployed to production, by version_conflict_policy\n\nThese problems are difficult to detect ordinarily.\nThe Spring Boot rule has a set of strategies and features for dealing with this situation, which unfortunately\n  is somewhat common.\n\n\n## Detection\n\n### Detecting Duplicate Classes\n\nThere is a feature on the *springboot* rule that will fail the build if duplicate classes are detected.\nIt is disabled by default, but can be enabled with an attribute:\n\n```starlark\nspringboot(\n    name = \"helloworld\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n    dupeclassescheck_enable = True,\n)\n```\n\nIt will scan all inner jars file, and fail the build if:\n- the same class (package + classname) is found in more than one inner jar, AND...\n- the MD5 hash of the classfile bytes differ\n\nThe dupe class checking feature requires Python3, which is included by default in MODULE.bazel.\nIf you don't have Python3 available for your build, *dupeclassescheck_enable* must be False.\n\n*Advanced:* In some cases, you will have a classes that are duplicated and would normally fail this check - but you cannot remove them.\nThere is an [ignorelist](#duplicate-class-detection-ignorelist) feature that will ignore specific jars with duplicated classes.\n\n### Detecting Banned Dependencies\n\nIn some cases your repository will contain jar files that should *never* be included in your springboot application.\nPerhaps there is a licensing issue, or a security issue, or you just want to be hygienic.\n\nBut if a transitive dependency 5 layers deep in your app's graph decides to add such a jar,\n  you won't ordinarily be notified of the problem.\nBazel will silently add the jar to your springboot transitive graph, and the jar will get packaged into your service.\n\nThe *deps_banned* attribute is provided for this case.\nIt should be set to the list of strings to look for in the dependency filenames.\nIf the string is found, the rule will fail with a descriptive message.\n\n```starlark\nspringboot(\n    name = \"helloworld\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n\n    # Example use cases\n    # 1. Some Maven libs forget to make junit/mockito test scoped\n    # 2. lombok is only needed at compile time\n    # 3. topsecret-1.2.3.jar has some code in it that should only be used by internal apps\n    # 4. acme-5.0.0.jar is a commercial jar, that isn't licensed for production use\n    deps_banned = [\"junit\", \"mockito\", \"lombok\", \"topsecret\", \"acme\"],\n)\n```\n\nThe list of dependencies is obtained after the *deps_exclude_labels* and *deps_exclude_paths* processing has run.\n\n### Brute Force Class Listing\n\nIn some cases, it can be helpful to get a full catalog of the classes included in all dependency jars for your springboot application.\nThe script to do this is located here:\n- [jar exploder utility](../tools/jar_explode)\n\n## Remediation\n\n### Removing Unwanted Libraries and Classes by Removing a Dependency in the BUILD File\n\nThe best way to handle unwanted libraries and  classes is to remove the dependency that brings\n  in the unwanted artifact from the *java_library* rule.\nThis eliminates it from usage for the Spring Boot application.\nBazel query is the best way to do this:\n\n```bash\n# find the label of libraries containing the duplicated classes in your java_library\nbazel query 'deps(//examples/helloworld:helloworld_lib)' | grep webmvc\n```\n\n```bash\n# find the path from your java_library to that unwanted library\nbazel query 'somepath(//examples/helloworld:helloworld_lib, \"@maven//:org_springframework_spring_webmvc\")'\n```\n\n### Removing Unwanted Classes with a Deps Filter\n\nThe next best way to exclude dependencies is to remove them before they are added to\n  the ```java_library``` rule invocation.\nThis mechanism is not specific to ```springboot``` at all - it is provided\n  by rules_spring because it is a commmon use case.\nThe benefits to excluding dependencies this way (as opposed to the exclude lists)\n  is that your test execution will use the actual classpath set into\n  the ```springboot``` executable jar.\n\nA simple example is below, and there is detailed documentation in the filter directory:\n- [deps_filter documentation](deps_filter_rules_legacy/README.md)\n\nIn this example, the springboot jar wants the red, green and blue libraries, but\ndoes not want the yellow library (a transitive).\n```starlark\n#\nload(\"@rules_spring//springboot/deps_filter_rules_legacy:deps_filter.bzl\", \"deps_filter\")\n\ndeps = [\n    \"@maven//:com_colors_red\",\n    \"@maven//:com_colors_green\",\n    \"@maven//:com_colors_blue\",\n]\n\ndeps_filter(\n    name = \"filtered_deps\",\n    deps = deps, # input list of deps\n    deps_exclude_labels = [\n        \"@maven//:com_colors_yellow\", # yellow is a transitive of green, and we don't want it\n    ],\n    exclude_transitives = True, # also exclude any transitive of yellow\n)\n\njava_library(\n    name = \"base_lib\",\n    deps = [\":filtered_deps\"], # the filtered deps has yellow removed\n    ...  \n)\n\nspringboot(\n    ...\n    java_library = \":base_lib\",\n    ...\n)\n```\n\n\n### Removing Unwanted Classes with an Exclude List (deprecated)\n\nAn exclude list can be passed to the Spring Boot rule which will prevent that dependency\n  from being copied into the jar during the packaging step.\nThis was our original mechanism of removing dependencies from the dependency graph.\n\n:warning: The Exclude list approach is not recommended. The Filter list is more accurate.\nWith Exclude lists, your tests will run without the exclusions, such that your test classpath\nwill not match what will run with your executable jar.\n\nThere are two forms: *deps_exclude_labels* and *deps_exclude_paths*.\n- *deps_exclude_labels* uses Bazel labels to match the desired target to exclude.\n- *deps_exclude_paths* is a partial String match against the file path of the dependency within the jar.\n\nThe first one is more elegant and maintainable, as the label will be validated by Bazel.\nHowever, in some cases this can be tedious as a given dep may be exposed under many labels.\nThis is the case when you have many *maven_install* rules that transitively bring in the same dependency.\nYou may have to exclude the same dependency multiple times if you use the label approach.\nThe path approach is easier for these cases.\n\nIt is used like this:\n\n```starlark\n# WARNING: This is an obsolete example. Use the filter mechanism instead.\nspringboot(\n    name = \"helloworld\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n    deps_exclude_labels = [\n      \"@maven//:com_google_protobuf_protobuf_java\",\n      \"//protos/third-party/google/protobuf:any_java_proto\",\n    ],\n    deps_exclude_paths = [\n      \"jackson-databind\", # will exclude any dep that has 'jackson-databind' in the path\n      \"google\", # will exclude any dep that has 'google' in the path\n    ],\n)\n```\n\n### Suppressing Unwanted Classes with Classpath Ordering\n\nIn Java, the JVM will load classes from the classpath.\nIf multiple versions of the same class are in the classpath, the class version that is loaded first will 'win'.\nTherefore, another way to suppress an old version of a class is to make sure the newer version is loaded first.\n\nThere are two ways to affect the ordering.\n\n#### Classpath Ordering using the BUILD file\n\nWhen the Spring Boot jar file is executed using `java -jar`, the runtime classpath order is based on the order of the jar entries written into the jar file.\nThe earlier entries will be loaded before the later entries.\n\nThe Spring Boot rule uses a specific order for writing the dependencies into the jar file:\n  - Internal Spring Boot classes\n  - Service classes (`srcs` of the `java_library` rule that the `springboot` rule references)\n  - Dependencies (`deps` and `runtime_deps` of the `java_library` rule the `springboot` rule references)\n\nThe order of the dependencies is based on Bazel's `depset` order, which is strongly influenced by BUILD file order.\nThe earlier entries in the `deps` list will be loaded before the later entries.\nHowever, note that transitive dependencies are traversed in depth first order.\n\nWhat this means is you can choose which version of the class 'wins' by putting the dependency jar higher in the `deps` list in the BUILD file.\nThis order isn't guaranteed by Bazel, but seems to be reliable.\n\nTo view the order of dependencies written into the Spring Boot jar, use the command `jar -tvf {springboot jar}`.\nThe output of that command is faithful to the order of written entries.\n\n#### Example\n\n[lib1](../../examples/helloworld/libs/lib1) and [lib2](../../examples/helloworld/libs/lib2) have a duplicate class: [lib1's IntentionalDupedClass](../../examples/helloworld/libs/lib1/src/main/java/com/bazel/demo/IntentionalDupedClass.java) and [lib2's IntentionalDupedClass](../../examples/helloworld/libs/lib2/src/main/java/com/bazel/demo/IntentionalDupedClass.java).\nIn the example's [BUILD file](../../examples/helloworld/BUILD), if `lib1` appears before `lib2` in `deps`,\n   you will see the following output when running `bazel run sample/helloworld`:\n```\nSampleMain:  Intentional duped class version: Hello LIB1!\n```\n\nIn the BUILD file, if you move `lib2` in front of `lib1` and re-run, you will see:\n```\nSampleMain:  Intentional duped class version: Hello LIB2!\n```\n\n##### Disabling BUILD file classpath dependency ordering\n\nThe current implementation of this feature uses the `jar` command line utility.\nExplicit jar entry ordering is implemented by specifying an explicit file list when running `jar`.  \nVery large dependency sets may cause the jar command to exceed the system command line length limit.\nIf you run into errors, you can disable this feature by setting the attribute `deps_use_starlark_order` to `False`.\n\n\n#### Classpath Ordering with a Classpath Index\n\nAnother approach for defining a particular classpath order is with a *classpath index*.\nThe classpath index is a [Spring Boot feature](https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html#executable-jar-war-index-files-classpath) (starting with Spring Boot 2.3) that allows you to\n  instruct the Spring Boot loader to load one jar before another.\nThe feature is explained in the Spring Boot documentation:\n- [Spring Boot Classpath Index](https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-executable-jar-format.html#executable-jar-war-index-files-classpath)\n\nThe Spring Boot rule exposes the *deps_index_file* attribute:\n\n```starlark\nspringboot(\n    name = \"helloworld\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n\n    # if you have conflicting classes in dependency jar files, you can define the order in which the jars are loaded\n    deps_index_file = \"helloworld_classpath.idx\",\n)\n```\n\n:fire: However, there is a major caveat with this Spring Boot feature.\nIt only works if you first explode the executable jar, and then invoke the *JarLauncher*:\n\n```bash\n$ jar -xf helloworld.jar\n$ java org.springframework.boot.loader.JarLauncher\n```\n\n\n### Ignoring Duplicate Classes\n\nSometimes you have transitives that are out of your control that bring in duplicate classes.\nIf you cannot use the exclusion solutions shown above, you would normally be blocked from using the duplicate class checker.\nIt would always fail.\n\nFor this reason, the duplicate class detection feature supports an *ignorelist*.\nThe *ignorelist* instructs the checker to ignore certain jars from the dupe checker process.\n\nTo use this feature, create a text file in the same directory as the BUILD file (e.g. *my_ignorelist.txt*).\nAdd a jar filename on each line like this:\n\n```\n# write the filename of the jar files that should be excluded from dupe detection\njakarta.annotation-api-1.3.5.jar\nspring-jcl-5.2.1.RELEASE.jar\nlibfoo1.jar\nlibfoo2.jar\n```\n\nand then follow this pattern in the BUILD file:\n\n```starlark\nspringboot(\n    name = \"helloworld\",\n    boot_app_class = \"com.sample.SampleMain\",\n    java_library = \":helloworld_lib\",\n    dupeclassescheck_enable = True,\n    dupeclassescheck_ignorelist = \"my_allowlist.txt\",\n)\n```\n\nNote that you must list **both** jars in which the duplicate class exists in order for the duplicate to be ignored.\n"
  },
  {
    "path": "springboot/write_bazelrun_env.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# This file is used to generate the environment variables used by the\n# default_bazelrun_script.sh for launching Spring Boot applications with\n# bazel run, as in 'bazel run //examples/helloworld'\n\nset -e\n\nRULE_NAME=${1}\nSPRINGBOOTJAR_FILENAME=${2}\nLABEL_PATH=${3}\nOUTPUTFILE_PATH=${4}\nDO_BACKGROUND=${5}\nstart_varargs=6\n\nif [ \"$LABEL_PATH\" == \"root\" ]; then\n    # token that indicates that the target is in the root path, which for the\n    # purposes of the label path, is empty string\n    LABEL_PATH=\"\"\nfi\n\n# start the output file with the fixed args\necho \"export RULE_NAME=$RULE_NAME\" > $OUTPUTFILE_PATH\necho \"export LABEL_PATH=$LABEL_PATH\" >> $OUTPUTFILE_PATH\necho \"export SPRINGBOOTJAR_FILENAME=$SPRINGBOOTJAR_FILENAME\" >> $OUTPUTFILE_PATH\necho \"export DO_BACKGROUND=$DO_BACKGROUND\" >> $OUTPUTFILE_PATH\n\n# start processing of dynamic args, which will appear in this order:\n# zero or more datafiles, zero or more jvm flags, zero or more env variables\nDATAFILES=\"\"\nJVM_FLAGS=\"\"\njvm_flags_started=0\nenvs_started=0\ni=$start_varargs\nwhile [ \"$i\" -le \"$#\" ]; do\n  eval \"arg=\\${$i}\"\n  if [ \"$arg\" = \"start_flags\" ]; then\n    jvm_flags_started=1\n  elif [ \"$arg\" = \"start_envs\" ]; then\n    envs_started=1\n    jvm_flags_started=0\n  else\n    if [ $jvm_flags_started -eq 1 ]; then\n      JVM_FLAGS=\"$JVM_FLAGS $arg\"\n    elif [ $envs_started -eq 1 ]; then\n      echo \"export $arg\" >> $OUTPUTFILE_PATH\n    else\n      DATAFILES=\"${DATAFILES}$arg \"\n    fi\n  fi\n  i=$((i + 1))\ndone\n\necho \"export DATAFILES=\\\"$DATAFILES\\\"\" >> $OUTPUTFILE_PATH\necho \"export JVM_FLAGS=\\\"$JVM_FLAGS\\\"\" >> $OUTPUTFILE_PATH\n\nif [ -f \"$LABEL_PATH/application.properties\" ]; then\n    echo \"export USE_EXTERNAL_CONFIG=true\" >> $OUTPUTFILE_PATH\nfi\n\n\n# DEBUG output\n#echo \"Generating 'bazel run' env.\"\n#echo \"SPRINGBOOTJAR_FILENAME=$SPRINGBOOTJAR_FILENAME\"\n#echo \"LABEL_PATH=$LABEL_PATH\"\n#echo \"OUTPUTFILE_PATH=$OUTPUTFILE_PATH\"\n#echo \"DO_BACKGROUND=$DO_BACKGROUND\"\n#echo \"DATAFILES=$DATAFILES\"\n#echo \"JVM_FLAGS=$JVM_FLAGS\"\n#echo \"CURRENT DIR: $(pwd)\"\n#echo \"LABEL_PATH: $LABEL_PATH\"\n"
  },
  {
    "path": "springboot/write_gitinfo_properties.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2017-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# Inject the Git properties into a properties file in the jar.\n# This matches what the Maven git-commit-id-plugin\n\n# PERF NOTE:\n# Be aware that for dev builds, we mute the git properties (build stamping) to allow many developers\n#   to share cache entries for Spring Boot jars. This is a major perf optimization.\n# See //tools/buildstamp/README.md for details.\n\nset -e\n\n# Create the properties file\ngitpropsfile=$1\necho \"# git info injected by Bazel build\" > $gitpropsfile\n\nruledir=$(pwd)\nstableprops=$ruledir/bazel-out/stable-status.txt\nvolatileprops=$ruledir/bazel-out/volatile-status.txt\n\n# BUILD ENVIRONMENT PROPERTIES\necho \"\" >> $gitpropsfile\n\nfor key in git.build.user.email git.build.host git.build.time; do\n  value=$(grep $key $volatileprops | cut -d \" \" -f 2-100)\n  if [[ $? == 0 ]];\n  then\n    echo \"$key=$value\" >> $gitpropsfile\n  fi\ndone\n\n# BRANCH PROPERTIES\necho \"\" >> $gitpropsfile\n\nfor key in STABLE_git.branch STABLE_git.dirty STABLE_git.remote.origin.url; do\n  value=$(grep $key $stableprops | cut -d \" \" -f 2-100)\n  if [[ $? == 0 ]];\n  then\n    git_key=$(echo $key | cut -d '_' -f 2)\n    echo \"$git_key=$value\" >> $gitpropsfile\n  fi\ndone\n\n# LAST COMMIT PROPERTIES\necho \"\" >> $gitpropsfile\n\n# we do git.commit.id SHA as a one-off, because we have to change the name to match\n# the git-commit-id-plugin\nvalue=$(grep git.commit.id.sha $stableprops | cut -d \" \" -f 2-100)\nif [[ $? == 0 ]];\nthen\n  echo \"git.commit.id=$value\" >> $gitpropsfile\nfi\n\nfor key in STABLE_git.commit.user.email STABLE_git.commit.user.name STABLE_git.commit.id.abbrev STABLE_git.commit.id.describe STABLE_git.closest.tag.name STABLE_git.commit.time STABLE_git.commit.message.short; do\n  value=$(grep $key $stableprops | cut -d \" \" -f 2-100)\n  if [[ $? == 0 ]];\n  then\n    git_key=$(echo $key | cut -d '_' -f 2)\n    echo \"$git_key=$value\" >> $gitpropsfile\n  fi\ndone\n"
  },
  {
    "path": "springboot/write_manifest.sh",
    "content": "#!/bin/bash\n#\n# Copyright (c) 2017-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\nset -e\n\nmainclass=$1\nspringbootlauncherclass=$2\nmanifestfile=$3\njavabase=$4\nfound_spring_jar=0\n# Looking for the springboot jar injected by springboot.bzl and extracting the version\nfor var in \"$@\"\ndo\n  if [[ $var = *\"spring-boot-\"* ]] || [[ $var = *\"spring_boot_\"* ]]; then\n    # determine the version of spring boot\n    # this little area of the rule has had problems in the past; reconsider whether doing\n    # this is worth it; and certainly carefully review prior issues here before making changes\n    #   Issues: #130, #119, #111\n    $javabase/bin/jar xf $var META-INF/MANIFEST.MF || continue\n    spring_version=$(grep 'Implementation-Version' META-INF/MANIFEST.MF | cut -d : -f2 | tr -d '[:space:]')\n    rm -rf META-INF\n\n    # we do want to validate that the deps include spring boot, and this is a\n    # convenient place to do it, but it is a little misplaced as we are\n    # generating the manifest in this script\n    found_spring_jar=1\n    break\n  fi\ndone\n\nif [[ $found_spring_jar -ne 1 ]]; then\n    echo \"ERROR: //springboot/write_manifest.sh could not find the spring-boot jar\"\n    exit 1\nfi\n\n#get the java -version details\n# todo this isn't the best value to use. it is the version that will be used by the jar tool\n# to package the boot jar but not for compiling the code (java_toolchain)\njava_string=$($javabase/bin/java -version 2>&1)\n\n#get the first line of the version details and get the version\njava_version=$(echo \"$java_string\" | head -n1 | cut -d ' ' -f 3 | awk '{print substr($0, 2, length($0)-2)}' )\n\necho \"Manifest-Version: 1.0\" > $manifestfile\necho \"Created-By: Bazel\" >> $manifestfile\necho \"Built-By: Bazel\" >> $manifestfile\necho \"Main-Class: $springbootlauncherclass\" >> $manifestfile\necho \"Spring-Boot-Classes: BOOT-INF/classes/\" >> $manifestfile\necho \"Spring-Boot-Lib: BOOT-INF/lib/\" >> $manifestfile\necho \"Spring-Boot-Version: $spring_version\" >> $manifestfile\necho \"Build-Jdk: $java_version\" >> $manifestfile\necho \"Start-Class: $mainclass\" >> $manifestfile\n"
  },
  {
    "path": "tools/buildstamp/README.md",
    "content": "## Build Stamping\n\nBazel has a feature to optionally add 'stamping' information to particular build artifacts.\nThat feature is described [in this Bazel documentation](https://bazel.build/docs/user-manual#workspace-status).\n\nWe sometimes stamp Spring Boot applications with Git information (such as branch,\n   commit id, build time, etc) such that the data can be found in the [/actuator/info](https://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints) endpoint.\nThis helps with troubleshooting as we can determine exactly what source code built the application.\nGreat, right?\n\n#### The Downsides of Stamping\n\nThe main issue with stamping is that it reduces the benefit of Bazel remote build caching.\nOnce an artifact is stamped with Git data, it cannot be shared via the remote cache with other builds.\nAlso, any other artifact that depends on that artifact will also miss the remote cache.\nThis is a big limitation.\n\n#### Full Stamping is Disabled by Default at Salesforce\n\nInternally at Salesforce, we like to make use of remote caching for developer builds.\nTo mitigate the remote caching limitation, our build by default has very limited build stamping.\nIt does **not** include the Git data in the stamp.\nThis allows multiple machines to share the same remote cache artifacts, particularly for Spring Boot.\n\nDetails about how this is done is explained in the Internals section below.\n\n#### Run a Build with Full Stamping\n\nThe default behavior of the build is optimized for remote caching performance.\nBut when you are building artifacts for deployment to shared environments (e.g. test envs, prod)\n  you should run your build with the full stamp.\nThis will allow others to figure out who built the artifact, when, and with what Git coordinates.\nWhen troubleshooting problems, that extra data is critical.\n\nTo signal to the build that you want full stamping, you can create a marker file to enable it:\n\n```bash\n$ cd [your workspace] (i.e. top level directory of your repo where WORKSPACE is)\n$ touch full_stamp.txt  (marker file that triggers full stamping)\n$ bazel build //...\n```\n\nFull stamping is also signaled if the environment variable *IS_RELEASE_BUILD* is set to true.\nThis may be more convenient for CI systems.\n\n```bash\n$ export IS_RELEASE_BUILD=true\n$ bazel build //...\n```\n\n### BUILD File Configuration\n\nThe way to signal to Bazel to stamp a particular artifact is to add an attribute to the rule in your BUILD file:\n\n```\n  stamp = 1\n```\n\nThis is done automatically for you in the [Spring Boot rule](../../springboot/springboot.bzl)\n   when it generates the *git.properties* file, as seen in this snippet:\n\n```starlark\ngengitinfo_out = \"git.properties\"\nnative.genrule(\n    name = gengitinfo_rule,\n    cmd = \"$(location @rules_spring//springboot:write_gitinfo_properties.sh) $@\",\n    tools = [\"@rules_spring//springboot:write_gitinfo_properties.sh\"],\n    outs = [gengitinfo_out],\n    tags = tags,\n    stamp = 1,\n)\n```\n\n### Internals\n\n#### Understand stable-status.txt and volatiles-status.txt\n\nThe Bazel documentation provides a good explanation for how stamping works in Bazel, so please visit that first:\n- [Bazel Build Stamping](https://bazel.build/docs/user-manual#workspace-status)\n\n#### Monorepo Stamping Implementation\n\nThe build is configured to **always** run the stamping code, configured here:\n- [.bazelrc](../../.base-bazelrc#L55)\n\nThe stamping code is in this directory, and has our custom code to do the stamping:\n- [get_workspace_status](get_workspace_status)\n\nThat script is where we do performance optimization to **only apply a full stamp when doing important builds**.\nThe way we do this is by halting the script before it writes the Git data into the *stable-status.txt* file by default.\n\nThis is where we make that choice:\n- [Halt stamping of Git data by default](get_workspace_status#L46)\n\nIf the file *full_stamp.txt* exists at the top level of the monorepo, it will run the full stamping code.\n"
  },
  {
    "path": "tools/buildstamp/get_workspace_status",
    "content": "#\n# Copyright (c) 2017-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\n# This script is executed with every 'bazel build' command if .bazelrc (or included file)\n# has these settings:\n#   build --stamp\n#   build --workspace_status_command tools/buildstamp/get_workspace_status\n# Which enables Bazel *stamping* for every build.\n\n# This script writes Git data to::\n#   bazel-out/volatile-status.txt\n#   bazel-out/stable-status.txt\n# If anything in stable-status.txt changes, it will trigger a rebuild of any target that\n#   has stamp=1 as an attribute (such as the Spring Boot rule).\n# Changes to volatile-status.txt do not trigger rebuilds of those targets.\n#\n# More information:\n# Bazel stamping: https://docs.bazel.build/versions/master/user-manual.html#flag--workspace_status_command\n# Spring Boot git.properties:  //springboot/write_gitinfo_properties.sh\n# Spring Boot info actuator endpoint: ttps://docs.spring.io/spring-boot/docs/current/reference/html/production-ready-features.html#production-ready-endpoints\n\n\n# ********************************\n# ********************************\n# TEST FOR FULL STAMPING\n# ********************************\n# ********************************\n\n# if IS_RELEASE_BUILD=true or the file full_stamp.txt exists, full stamping is enabled\n\nif [ \"$IS_RELEASE_BUILD\" = true ]; then\n  echo \"IS_RELEASE_BUILD environment variable set: $IS_RELEASE_BUILD\"\nelse\n  if [[ ! -f full_stamp.txt ]]; then\n    echo \"full_stamp.txt file was not detected\"\n    exit 0\n  fi\n  echo \"full_stamp.txt file detected\"\nfi\necho \"Full Bazel build stamping enabled. Adding Git properties to stamp. See //tools/buildstamp for details.\"\n\n\n# ********************************\n# GIT\n# ********************************\n\n# This data is then later consumed by the //springboot rule (perhaps other rules as well) to write\n#   a git.properties file into the Spring Boot jar, which is then surfaced in the Spring Boot\n#   actuator info endpoint.\n\n# BUILD ENVIRONMENT PROPERTIES\n# git.build.user.email\ngit_email=$(git config --get user.email)\nif [[ $? == 0 ]];\nthen\n  echo \"git.build.user.email $git_email\"\nfi\n\n# git.build.host\ngit_build_host=$(hostname)\necho \"git.build.host $git_build_host\"\n\n# git.build.time\ngit_build_time=$(date -u '+%Y-%m-%d @ %H\\:%M\\:%S -0000')\nif [[ $? == 0 ]];\nthen\n  echo \"git.build.time $git_build_time\"\nfi\n\n\n# BRANCH PROPERTIES\n# git.branch\ngit_branch=$(git rev-parse --abbrev-ref HEAD)\nif [[ $? == 0 ]];\nthen\n  echo \"STABLE_git.branch $git_branch\"\nfi\n\n# dirty? (modified files in branch when built)\ngit diff-index --quiet HEAD --\nif [[ $? == 0 ]];\nthen\n    git_status=\"false\"\nelse\n    git_status=\"true\"\nfi\necho \"STABLE_git.dirty $git_status\"\n\n# git.remote.origin.url\ngit_remote_url=$(git config --get remote.origin.url)\nif [[ $? == 0 ]];\nthen\n  echo \"STABLE_git.remote.origin.url $git_remote_url\"\nfi\n\n\n# LAST COMMIT PROPERTIES\n\n# git.commit.user.email  (email of last commit author)\ngit_commit_email=$(git log -1 --pretty=format:'%ae')\nif [[ $? == 0 ]];\nthen\n  echo \"STABLE_git.commit.user.email $git_commit_email\"\nfi\n\n# git.commit.user.name\ngit_commit_author=$(git log -1 --pretty=format:'%an')\nif [[ $? == 0 ]];\nthen\n  echo \"STABLE_git.commit.user.name $git_commit_author\"\nfi\n\n# git.commit.id.sha\ngit_commit_id=$(git log -1 --pretty=format:'%H')\nif [[ $? == 0 ]];\nthen\n  echo \"STABLE_git.commit.id.sha $git_commit_id\"\nfi\n\n# git.commit.id.abbrev\ngit_commit_id_short=$(git log -1 --pretty=format:'%h')\nif [[ $? == 0 ]];\nthen\n  echo \"STABLE_git.commit.id.abbrev $git_commit_id_short\"\nfi\n\n# git.commit.time\ngit_commit_time=$(git log -1 --pretty=format:'%ai')\nif [[ $? == 0 ]];\nthen\n  echo \"STABLE_git.commit.time $git_commit_time\"\nfi\n\n# git.commit.message.short (just going with commit 'status' here)\ngit_commit_msg=$(git log -1 --pretty=format:'%s')\nif [[ $? == 0 ]];\nthen\n  echo \"STABLE_git.commit.message.short $git_commit_msg\"\nfi\n\n# git.commit.id.describe\ngit_commit_describe=$(git describe)\nif [[ $? == 0 ]];\nthen\n  echo \"STABLE_git.commit.id.describe $git_commit_describe\"\nfi\n\n# git.closest.tag.name\ngit_closest_tag=$(git describe --abbrev=0)\nif [[ $? == 0 ]];\nthen\n  echo \"STABLE_git.closest.tag.name $git_closest_tag\"\nfi\n"
  },
  {
    "path": "tools/codecoverage/coverage-report.sh",
    "content": "#!/usr/bin/env bash\n#\n# Copyright (c) 2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\nif [ ! -f \"WORKSPACE\" ]; then\n    echo \"ERROR Please run this script from the workspace root.\"\n    exit 1\nfi\n\necho \"\"\necho \"Before running this script, you must run a coverage job in Bazel.\"\necho \"bazel coverage //examples/helloworld/...\"\n\necho \"\"\necho \"Press enter to continue...\"\nread GOFORIT1\n\necho \"This script requires lcov to be installed (e.g. brew install lcov)\"\necho \"Your lcov version:\"\nlcov --version\n\necho \"\"\necho \"Press enter to continue...\"\nread GOFORIT2\n\nfind bazel-testlogs/ -type f -name \"coverage.dat\" -not -empty -exec  genhtml -o coverage-reports {} +\n\necho \"\"\necho \"Report generation complete.\"\necho \"You can view the report by opening ./coverage-reports/index.html in a browser.\"\n"
  },
  {
    "path": "tools/formatter/README.md",
    "content": "# Bazel File Formatter\n\nThis script runs the Bazel buildifier tool on all of our Bazel files (BUILD, \\*.bzl).\nExecute it from the root of the repo.\n\n```bash\ncd rules-spring\n./tools/formatter/format_bazel_files.sh\n```\n\nPlease do not mix functional and formatting changes in a PR.\nBefore running the script, make sure you have a clean Git workspace.\n"
  },
  {
    "path": "tools/formatter/format_bazel_files.sh",
    "content": "#\n# Copyright (c) 2019-2021, salesforce.com, inc.\n# All rights reserved.\n# Licensed under the BSD 3-Clause license.\n# For full license text, see LICENSE.txt file in the repo root  or https://opensource.org/licenses/BSD-3-Clause\n#\n\necho \"This script will format all repo BUILD and .bzl files according to style standards.\"\necho \"\"\necho \"NOTE: It requires that you have Go installed.  https://golang.org/doc/install\"\necho \"\"\n\nif [ ! -f \"WORKSPACE\" ]; then\n  echo \"Please launch this script from the root of the repo.\"\n  echo \"  ./tools/formatter/format_bazel_files.sh\"\n  exit 1\nfi\n\necho \"Before running, we will check that you have a clean Git workspace.\"\necho \"Do not mix functional changes together with formatting changes in the same PR.\"\necho \"Press Enter to continue...\"\nread MR_BOJANGLES\n\ngit status\n\necho \"\"\necho \"Is your Git workspace clean? Press Enter to continue, or ctrl-c to bail.\"\necho \"In the next step, we will make sure you have 'buildifer' installed, which is the tool that does the formatting.\"\necho \"Press Enter to continue...\"\nread TAMBOURINE_MAN\n\ngo get github.com/bazelbuild/buildtools/buildifier\n\necho \"\"\necho \"If the previous step didn't emit any errors, we are ready to do the formatting.\"\necho \"After the formatting is done, review the diffs and submit a PR.\"\necho \"Press Enter to continue...\"\nread VANDALS_STOLE_THE_HANDLE\n\nfind . -name BUILD | xargs ~/go/bin/buildifier\nfind . -name BUILD.bazel | xargs ~/go/bin/buildifier\n\nfind . -name BUILD | xargs ~/go/bin/buildifier --lint=fix\nfind . -name BUILD.bazel | xargs ~/go/bin/buildifier --lint=fix\n\nfind . -name '*.bzl' | xargs ~/go/bin/buildifier\n\n\necho \"\"\necho \"Now we will run the manual linter, which will show what issues remain in the files.\"\necho \"They are informational and can be fixed manually if you wish.\"\necho \"Press Enter to continue...\"\nread BLOWIN_IN_THE_WIND\nfind . -name BUILD | xargs ~/go/bin/buildifier --lint=warn\nfind . -name BUILD.bazel | xargs ~/go/bin/buildifier --lint=warn\nfind . -name '*.bzl' | xargs ~/go/bin/buildifier --lint=warn\n"
  },
  {
    "path": "tools/get_github_stats_downloads.py",
    "content": "import requests\n\n'''\nThis script queries GitHub to get the number of downloads of the releases of our rule.\n'''\n\nowner = \"salesforce\"\nrepo = \"rules_spring\"\nh = {\"Accept\": \"application/vnd.github.v3+json\"}\nu = f\"https://api.github.com/repos/{owner}/{repo}/releases?per_page=100\"\nr = requests.get(u, headers=h).json()\nr.reverse() # older tags first\n\nprint(\"GitHub download stats for releases of the Bazel Spring Boot rule:\")\nprint(\"=================================================================\")\nfor rel in r:\n  if rel['assets']:\n    tag = rel['tag_name']\n    dls = rel['assets'][0]['download_count']\n    pub = rel['published_at']\n    print(f\"PubDate: {pub} | Tag: {tag} | Dls: {dls} \")\n"
  },
  {
    "path": "tools/jar_explode/README.md",
    "content": "## Jar Explode Debug Utility\n\nSpring Boot jars typically contain hundreds of upstream dependency jars.\nIn cases where you have ClassNotFound errors or class version conflicts, it can be helpful to get a full searchable catalog of which classes are in the jar (or not).\n\nUse this utility to extract the springboot jar, and the nested dependency jars, such that the .class files can be searched for and located.\n\n```\n# Example:  find out which jars contain the GrpcUtil class\n\n$ ./jar_explode.sh ../../bazel-bin/examples/helloworld/heloworld.jar\n$ cd /tmp/bazel/springbootexplode\n$ find . -name GrpcUtil.class\n```"
  },
  {
    "path": "tools/jar_explode/jar_explode.sh",
    "content": "#!/bin/bash\n\n# This is a handy utility script to explode classes from the generated springboot jar\n# into /tmp so you can do searches to find where a certain class is coming from.\n\n# Example:  find out which jars contain the GrpcUtil class\n\n# $ ./jar_explode.sh ../../bazel-bin/examples/helloworld/heloworld.jar\n# $ cd /tmp/bazel/springbootexplode\n# $ find . -name GrpcUtil.class\n\nSPRINGBOOTJAR=$1\nJAR=$(basename $1)\n\nrm -rf /tmp/bazel/springbootexplode\nmkdir -p /tmp/bazel/springbootexplode/extract\ncp $1 /tmp/bazel/springbootexplode/extract\n\npushd .\ncd /tmp/bazel/springbootexplode\nBASEDIR=$(pwd)\ncd extract\n\njar -xvf $JAR\ncd BOOT-INF/lib\n\nfor f in $(find . -name '*.jar'); do\n  jarname=\"$(basename -- $f)\"\n  echo \"Processing $jarname file..\";\n  mkdir $BASEDIR/$jarname\n  cp $f $BASEDIR/$jarname\n  pushd .\n  cd $BASEDIR/$jarname\n  jar -xvf $jarname\n  popd\ndone\n\necho \"Extracted the springboot classes to $BASEDIR\"\n\npopd ."
  },
  {
    "path": "tools/license/BUILD",
    "content": "filegroup(\n    name = \"standard_package\",\n    srcs = glob([\"**\"]),\n)\n"
  },
  {
    "path": "tools/license/licenses_used.bzl",
    "content": "# Copyright 2022 Google LLC\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n# https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n\"\"\"License compliance checking.\"\"\"\n\nload(\n    \"@rules_license//rules:gather_licenses_info.bzl\",\n    \"gather_licenses_info\",\n    \"write_licenses_info\",\n)\n\ndef _licenses_used_impl(ctx):\n    # Gather all licenses and make it available as JSON\n    write_licenses_info(ctx, ctx.attr.deps, ctx.outputs.out)\n    return [DefaultInfo(files = depset([ctx.outputs.out]))]\n\n_licenses_used = rule(\n    implementation = _licenses_used_impl,\n    doc = \"\"\"Internal tmplementation method for licenses_used().\"\"\",\n    attrs = {\n        \"deps\": attr.label_list(\n            doc = \"\"\"List of targets to collect LicenseInfo for.\"\"\",\n            aspects = [gather_licenses_info],\n        ),\n        \"out\": attr.output(\n            doc = \"\"\"Output file.\"\"\",\n            mandatory = True,\n        ),\n    },\n)\n\ndef licenses_used(name, deps, out = None, **kwargs):\n    \"\"\"Collects LicensedInfo providers for a set of targets and writes as JSON.\n\n    The output is a single JSON array, with an entry for each license used.\n    See gather_licenses_info.bzl:write_licenses_info() for a description of the schema.\n\n    Args:\n      name: The target.\n      deps: A list of targets to get LicenseInfo for. The output is the union of\n            the result, not a list of information for each dependency.\n      out: The output file name. Default: <name>.json.\n      **kwargs: Other args\n\n    Usage:\n\n      licenses_used(\n          name = \"license_info\",\n          deps = [\":my_app\"],\n          out = \"license_info.json\",\n      )\n    \"\"\"\n    if not out:\n        out = name + \".json\"\n    _licenses_used(name = name, deps = deps, out = out, **kwargs)\n"
  }
]