diff --git a/.agents/skills/move-files/SKILL.md b/.agents/skills/move-files/SKILL.md
new file mode 100644
index 000000000..2885f4828
--- /dev/null
+++ b/.agents/skills/move-files/SKILL.md
@@ -0,0 +1,49 @@
+---
+name: move-files
+description: >
+ Move or rename any files/directories in a repo: preserve history, update all
+ references and build metadata, verify no stale paths remain.
+---
+
+# Move Files
+
+## Workflow
+
+1. Preflight.
+ - Run `git status --short`.
+ - Map each `source -> destination`.
+ - Classify scope: simple same-module moves stay targeted; package, module, or
+ cross-module moves need broader inspection.
+ - Ask before ambiguous mappings, destination conflicts, or unclear semantic
+ package/module changes.
+
+2. Search before moving.
+ - Search all old identifiers: paths, names, resource refs, doc links.
+ - For Gradle/module/source-set moves, check `settings.gradle.kts`,
+ `build.gradle.kts`, and `buildSrc`.
+ - For Kotlin/Java, update package declarations only when package intent
+ changes.
+
+3. Move safely.
+ - Prefer `git mv` for tracked files in the repo.
+ - Use filesystem moves only for untracked/generated/out-of-git files.
+ - Create parent directories first.
+ - For case-only renames, move through a temporary name.
+
+4. Repair references.
+ - Update all references: imports, build metadata, docs, resources, and scripts.
+ - Start search scope narrow: affected directory, then module, then repo-wide.
+ - Prefer precise edits; avoid broad replacements on generic names.
+
+5. Verify.
+ - Re-run targeted searches for old tokens.
+ - Run `git status --short` and confirm the delta matches the move.
+ - Run focused validation for moved files, or state what could not run.
+
+## Repo Notes
+
+Follow `.agents/project-structure-expectations.md` for module/source-set/test moves.
+
+## Report
+
+Return: `Moved[]`, `UpdatedRefs[]`, `Verification[]`, `Risks[]`.
diff --git a/.agents/skills/move-files/agents/openai.yaml b/.agents/skills/move-files/agents/openai.yaml
new file mode 100644
index 000000000..ba90a9f8f
--- /dev/null
+++ b/.agents/skills/move-files/agents/openai.yaml
@@ -0,0 +1,4 @@
+interface:
+ display_name: "Move Files"
+ short_description: "Move files safely across a repo"
+ default_prompt: "Use $move-files to relocate files or directories in this repository while preserving history, updating references, and verifying the result."
diff --git a/.agents/skills/update-copyright/SKILL.md b/.agents/skills/update-copyright/SKILL.md
new file mode 100644
index 000000000..6afc4c7cf
--- /dev/null
+++ b/.agents/skills/update-copyright/SKILL.md
@@ -0,0 +1,16 @@
+---
+name: update-copyright
+description: >
+ Update source file copyright headers from the IntelliJ IDEA copyright profile,
+ replacing `today.year` with the current year.
+ Automatically apply when source files are modified in a change set.
+---
+
+# Copyright Update
+
+**Command:** `python3 .agents/skills/update-copyright/scripts/update_copyright.py`
+
+1. Scope: explicit files/dirs from the user, or all tracked source files if none given.
+2. No explicit paths → run with `--dry-run` first, then without.
+3. Relay stdout (notice source, file count, changed paths) to the user.
+4. Never add a copyright header to a file that does not already have one.
diff --git a/.agents/skills/update-copyright/agents/openai.yaml b/.agents/skills/update-copyright/agents/openai.yaml
new file mode 100644
index 000000000..246dd647f
--- /dev/null
+++ b/.agents/skills/update-copyright/agents/openai.yaml
@@ -0,0 +1,4 @@
+interface:
+ display_name: "Copyright Update"
+ short_description: "Refresh source copyright headers"
+ default_prompt: "Use $update-copyright to refresh source file copyright headers from the IntelliJ IDEA copyright profile in this repository."
diff --git a/.agents/skills/update-copyright/scripts/update_copyright.py b/.agents/skills/update-copyright/scripts/update_copyright.py
new file mode 100755
index 000000000..2dbf8bbc4
--- /dev/null
+++ b/.agents/skills/update-copyright/scripts/update_copyright.py
@@ -0,0 +1,389 @@
+#!/usr/bin/env python3
+"""Update source copyright headers from IntelliJ IDEA copyright profiles."""
+
+from __future__ import annotations
+
+import argparse
+import datetime as dt
+import html
+import re
+import subprocess
+import sys
+from pathlib import Path
+from xml.etree import ElementTree as ET
+
+
+BLOCK_EXTENSIONS = {
+ ".c",
+ ".cc",
+ ".cpp",
+ ".cs",
+ ".css",
+ ".cxx",
+ ".dart",
+ ".go",
+ ".gradle",
+ ".groovy",
+ ".h",
+ ".hh",
+ ".hpp",
+ ".java",
+ ".js",
+ ".jsx",
+ ".kt",
+ ".kts",
+ ".less",
+ ".m",
+ ".mm",
+ ".proto",
+ ".rs",
+ ".scala",
+ ".scss",
+ ".swift",
+ ".ts",
+ ".tsx",
+}
+HASH_EXTENSIONS = {
+ ".bash",
+ ".bzl",
+ ".properties",
+ ".pl",
+ ".py",
+ ".rb",
+ ".sh",
+ ".toml",
+ ".yaml",
+ ".yml",
+ ".zsh",
+}
+XML_EXTENSIONS = {
+ ".fxml",
+ ".pom",
+ ".wsdl",
+ ".xml",
+ ".xsd",
+ ".xsl",
+ ".xslt",
+}
+EXCLUDED_DIRS = {
+ ".agents",
+ ".git",
+ ".gradle",
+ ".idea",
+ ".kotlin",
+ "build",
+ "generated",
+ "out",
+ "tmp",
+}
+EXCLUDED_FILES = {
+ "gradlew",
+ "gradlew.bat",
+}
+
+
+def parse_args() -> argparse.Namespace:
+ parser = argparse.ArgumentParser(
+ description=(
+ "Update source copyright headers from "
+ ".idea/copyright/profiles_settings.xml."
+ )
+ )
+ parser.add_argument(
+ "paths",
+ nargs="*",
+ help="Files or directories to update. Defaults to tracked source files.",
+ )
+ parser.add_argument(
+ "--root",
+ type=Path,
+ default=Path.cwd(),
+ help="Repository root. Defaults to the current working directory.",
+ )
+ parser.add_argument(
+ "--year",
+ default=str(dt.date.today().year),
+ help="Year to substitute for today.year. Defaults to the current year.",
+ )
+ parser.add_argument(
+ "--dry-run",
+ action="store_true",
+ help="Report files that would change without writing them.",
+ )
+ parser.add_argument(
+ "--check",
+ action="store_true",
+ help="Exit with status 1 if any file would change; do not write files.",
+ )
+ return parser.parse_args()
+
+
+def profile_filename(profile_name: str) -> str:
+ stem = re.sub(r"[^A-Za-z0-9]+", "_", profile_name).strip("_")
+ if not stem:
+ raise ValueError("The default copyright profile name is empty.")
+ return f"{stem}.xml"
+
+
+def load_notice(root: Path, year: str) -> tuple[str, Path]:
+ settings_path = root / ".idea" / "copyright" / "profiles_settings.xml"
+ if not settings_path.is_file():
+ raise FileNotFoundError(f"Missing {settings_path}")
+
+ settings_root = ET.parse(settings_path).getroot()
+ settings = settings_root.find(".//settings")
+ if settings is None:
+ raise ValueError(f"{settings_path} does not contain a settings tag.")
+
+ default_profile = settings.get("default")
+ if not default_profile:
+ raise ValueError(f"{settings_path} settings tag has no default attribute.")
+
+ profile_path = settings_path.parent / profile_filename(default_profile)
+ if not profile_path.is_file():
+ raise FileNotFoundError(
+ f"Default profile {default_profile!r} resolves to missing {profile_path}"
+ )
+
+ profile_root = ET.parse(profile_path).getroot()
+ notice = None
+ for option in profile_root.findall(".//option"):
+ if option.get("name") == "notice":
+ notice = option.get("value")
+ break
+ if notice is None:
+ raise ValueError(f"{profile_path} has no option named 'notice'.")
+
+ decoded = html.unescape(notice)
+ decoded = decoded.replace("${today.year}", year)
+ decoded = decoded.replace("$today.year", year)
+ decoded = decoded.replace("today.year", year)
+ return decoded.rstrip(), profile_path
+
+
+def style_for(path: Path) -> str | None:
+ name = path.name
+ suffix = path.suffix.lower()
+ if name.endswith((".sh.template", ".bash.template", ".zsh.template")):
+ return "hash"
+ if suffix in BLOCK_EXTENSIONS:
+ return "block"
+ if suffix in HASH_EXTENSIONS:
+ return "hash"
+ if suffix in XML_EXTENSIONS:
+ return "xml"
+ return None
+
+
+def is_excluded(path: Path) -> bool:
+ if path.name in EXCLUDED_FILES:
+ return True
+ parts = path.parts
+ if len(parts) >= 2 and parts[0] == "gradle" and parts[1] == "wrapper":
+ return True
+ return any(part in EXCLUDED_DIRS for part in parts)
+
+
+def tracked_files(root: Path) -> list[Path]:
+ try:
+ result = subprocess.run(
+ ["git", "-C", str(root), "ls-files", "-z"],
+ check=True,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ )
+ except (FileNotFoundError, subprocess.CalledProcessError):
+ return [
+ path.relative_to(root)
+ for path in root.rglob("*")
+ if path.is_file() and not is_excluded(path.relative_to(root))
+ ]
+
+ paths = []
+ for item in result.stdout.decode("utf-8").split("\0"):
+ if not item:
+ continue
+ path = Path(item)
+ if (root / path).is_file():
+ paths.append(path)
+ return paths
+
+
+def expand_requested_paths(root: Path, requested: list[str]) -> list[Path]:
+ if not requested:
+ paths = tracked_files(root)
+ else:
+ paths = []
+ for item in requested:
+ path = (root / item).resolve()
+ if not path.exists():
+ raise FileNotFoundError(f"Path does not exist: {item}")
+ if not path.is_relative_to(root):
+ raise ValueError(
+ f"Path is outside the repository root: {item!r} "
+ f"(resolved to {path}, root is {root})"
+ )
+ if path.is_dir():
+ for child in path.rglob("*"):
+ if child.is_file():
+ paths.append(child.relative_to(root))
+ else:
+ paths.append(path.relative_to(root))
+
+ unique = sorted(set(paths), key=lambda p: p.as_posix())
+ return [
+ path
+ for path in unique
+ if style_for(path) is not None and not is_excluded(path)
+ ]
+
+
+def newline_for(text: str) -> str:
+ return "\r\n" if "\r\n" in text else "\n"
+
+
+def build_header(notice: str, style: str, newline: str) -> str:
+ lines = notice.splitlines()
+ if style == "block":
+ body = newline.join(f" * {line}" if line else " *" for line in lines)
+ return f"/*{newline}{body}{newline} */{newline}{newline}"
+ if style == "hash":
+ body = newline.join(f"# {line}" if line else "#" for line in lines)
+ return f"{body}{newline}{newline}"
+ if style == "xml":
+ body = newline.join(f" ~ {line}" if line else " ~" for line in lines)
+ return f"{newline}{newline}"
+ raise ValueError(f"Unsupported comment style: {style}")
+
+
+def split_leading_directive(text: str, style: str, newline: str) -> tuple[str, str]:
+ if style == "hash" and text.startswith("#!"):
+ line_end = text.find("\n")
+ if line_end == -1:
+ return text + newline + newline, ""
+ prefix = text[: line_end + 1] + newline
+ return prefix, strip_leading_blank_lines(text[line_end + 1 :])
+
+ if style == "xml" and text.startswith("")
+ if close != -1:
+ line_end = text.find("\n", close)
+ if line_end == -1:
+ return text + newline + newline, ""
+ prefix = text[: line_end + 1] + newline
+ return prefix, strip_leading_blank_lines(text[line_end + 1 :])
+
+ return "", strip_leading_blank_lines(text)
+
+
+def strip_leading_blank_lines(text: str) -> str:
+ return re.sub(r"^(?:[ \t]*\r?\n)+", "", text)
+
+
+def strip_existing_header(text: str, style: str) -> tuple[str, bool]:
+ if style == "block" and text.startswith("/*"):
+ close = text.find("*/")
+ if close != -1:
+ candidate = text[: close + 2]
+ if is_copyright_header(candidate):
+ return strip_leading_blank_lines(text[close + 2 :]), True
+
+ if style == "xml" and text.startswith("")
+ if close != -1:
+ candidate = text[: close + 3]
+ if is_copyright_header(candidate):
+ return strip_leading_blank_lines(text[close + 3 :]), True
+
+ if style == "hash":
+ lines = text.splitlines(keepends=True)
+ end = 0
+ for line in lines:
+ stripped = line.strip()
+ if stripped == "" or stripped.startswith("#"):
+ end += len(line)
+ continue
+ break
+ candidate = text[:end]
+ if candidate and is_copyright_header(candidate):
+ return strip_leading_blank_lines(text[end:]), True
+
+ return text, False
+
+
+def is_copyright_header(text: str) -> bool:
+ limited = text[:5000]
+ return "Copyright" in limited and (
+ "Licensed under" in limited or "All rights reserved" in limited
+ )
+
+
+def updated_text(text: str, notice: str, style: str) -> str:
+ original = text
+ bom = "\ufeff" if text.startswith("\ufeff") else ""
+ if bom:
+ text = text[1:]
+ newline = newline_for(text)
+ prefix, body = split_leading_directive(text, style, newline)
+ body, had_header = strip_existing_header(body, style)
+ if not had_header:
+ return original
+ return bom + prefix + build_header(notice, style, newline) + body
+
+
+def update_file(root: Path, path: Path, notice: str, dry_run: bool) -> bool:
+ absolute = root / path
+ style = style_for(path)
+ if style is None:
+ return False
+
+ try:
+ text = absolute.read_text(encoding="utf-8")
+ except FileNotFoundError:
+ print(f"Skipping missing file: {path}", file=sys.stderr)
+ return False
+ except UnicodeDecodeError:
+ print(f"Skipping non-UTF-8 file: {path}", file=sys.stderr)
+ return False
+
+ next_text = updated_text(text, notice, style)
+ if next_text == text:
+ return False
+
+ if not dry_run:
+ with absolute.open("w", encoding="utf-8", newline="") as file:
+ file.write(next_text)
+ return True
+
+
+def main() -> int:
+ args = parse_args()
+ root = args.root.resolve()
+ notice, profile_path = load_notice(root, args.year)
+ try:
+ paths = expand_requested_paths(root, args.paths)
+ except (FileNotFoundError, ValueError) as exc:
+ print(f"error: {exc}", file=sys.stderr)
+ return 2
+ dry_run = args.dry_run or args.check
+
+ changed = [
+ path
+ for path in paths
+ if update_file(root, path, notice, dry_run=dry_run)
+ ]
+
+ rel_profile = profile_path.relative_to(root)
+ action = "Would update" if dry_run else "Updated"
+ print(f"Notice source: {rel_profile}")
+ print(f"{action} {len(changed)} file(s).")
+ for path in changed:
+ print(path.as_posix())
+
+ if args.check and changed:
+ return 1
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())
diff --git a/.agents/skills/update-copyright/tests/test_update_copyright.py b/.agents/skills/update-copyright/tests/test_update_copyright.py
new file mode 100644
index 000000000..8770b3275
--- /dev/null
+++ b/.agents/skills/update-copyright/tests/test_update_copyright.py
@@ -0,0 +1,130 @@
+from __future__ import annotations
+
+import subprocess
+import sys
+import tempfile
+import unittest
+from pathlib import Path
+
+
+SCRIPT = Path(__file__).resolve().parents[1] / "scripts" / "update_copyright.py"
+
+
+class UpdateCopyrightTest(unittest.TestCase):
+ def test_default_run_leaves_plain_source_without_header_unchanged(self) -> None:
+ with tempfile.TemporaryDirectory() as temp_dir:
+ root = Path(temp_dir)
+ self.write_profile(root)
+ source = root / "Foo.java"
+ original = "class Foo {}\n"
+ source.write_text(original, encoding="utf-8")
+
+ subprocess.run(["git", "init", "-q"], cwd=root, check=True)
+ subprocess.run(["git", "add", "Foo.java"], cwd=root, check=True)
+
+ result = self.run_script(root)
+
+ self.assertEqual(result.returncode, 0, result.stderr)
+ self.assertIn("Updated 0 file(s).", result.stdout)
+ self.assertEqual(result.stderr, "")
+ self.assertEqual(source.read_text(encoding="utf-8"), original)
+
+ def test_existing_header_is_updated(self) -> None:
+ with tempfile.TemporaryDirectory() as temp_dir:
+ root = Path(temp_dir)
+ self.write_profile(root)
+ source = root / "Foo.java"
+ source.write_text(
+ "/*\n"
+ " * Copyright 2024 ACME\n"
+ " * All rights reserved\n"
+ " */\n"
+ "\n"
+ "class Foo {}\n",
+ encoding="utf-8",
+ )
+
+ result = self.run_script(root, "--year", "2026", "Foo.java")
+
+ self.assertEqual(result.returncode, 0, result.stderr)
+ self.assertIn("Updated 1 file(s).", result.stdout)
+ self.assertIn("Foo.java", result.stdout)
+ self.assertEqual(result.stderr, "")
+ self.assertEqual(
+ source.read_text(encoding="utf-8"),
+ "/*\n"
+ " * Copyright 2026 ACME\n"
+ " * All rights reserved\n"
+ " */\n"
+ "\n"
+ "class Foo {}\n",
+ )
+
+ def test_default_run_skips_tracked_files_deleted_from_working_tree(self) -> None:
+ with tempfile.TemporaryDirectory() as temp_dir:
+ root = Path(temp_dir)
+ self.write_profile(root)
+ source = root / "Foo.java"
+ source.write_text("class Foo {}\n", encoding="utf-8")
+
+ subprocess.run(["git", "init", "-q"], cwd=root, check=True)
+ subprocess.run(["git", "add", "Foo.java"], cwd=root, check=True)
+ source.unlink()
+
+ result = subprocess.run(
+ [
+ sys.executable,
+ str(SCRIPT),
+ "--root",
+ str(root),
+ "--dry-run",
+ ],
+ check=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ text=True,
+ )
+
+ self.assertEqual(result.returncode, 0, result.stderr)
+ self.assertIn("Would update 0 file(s).", result.stdout)
+ self.assertEqual(result.stderr, "")
+
+ @staticmethod
+ def run_script(root: Path, *args: str) -> subprocess.CompletedProcess[str]:
+ return subprocess.run(
+ [
+ sys.executable,
+ str(SCRIPT),
+ "--root",
+ str(root),
+ *args,
+ ],
+ check=False,
+ stdout=subprocess.PIPE,
+ stderr=subprocess.PIPE,
+ text=True,
+ )
+
+ @staticmethod
+ def write_profile(root: Path) -> None:
+ copyright_dir = root / ".idea" / "copyright"
+ copyright_dir.mkdir(parents=True)
+ (copyright_dir / "profiles_settings.xml").write_text(
+ ''
+ ''
+ "\n",
+ encoding="utf-8",
+ )
+ (copyright_dir / "Default.xml").write_text(
+ ''
+ ""
+ ''
+ ""
+ "\n",
+ encoding="utf-8",
+ )
+
+
+if __name__ == "__main__":
+ unittest.main()
diff --git a/.claude/skills b/.claude/skills
new file mode 120000
index 000000000..2b7a412b8
--- /dev/null
+++ b/.claude/skills
@@ -0,0 +1 @@
+../.agents/skills
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 48de9f27a..a3e0ec13b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -130,3 +130,7 @@ pubspec.lock
/tmp
.gradle-test-kit/
+
+# Python cache
+__pycache__/
+*.pyc
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index 0bd1d9dc2..7be402da6 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -255,6 +255,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/build.gradle.kts b/build.gradle.kts
index eee7b93c1..77e52c422 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -39,12 +39,15 @@ import io.spine.dependency.local.Reflect
import io.spine.dependency.local.Time
import io.spine.dependency.local.ToolBase
import io.spine.dependency.local.Validation
+import io.spine.gradle.RunBuild
import io.spine.gradle.publish.PublishingRepos
+import io.spine.gradle.publish.SpinePublishing
import io.spine.gradle.publish.spinePublishing
import io.spine.gradle.repo.standardToSpineSdk
import io.spine.gradle.report.coverage.JacocoConfig
import io.spine.gradle.report.license.LicenseReporter
import io.spine.gradle.report.pom.PomGenerator
+import java.time.Duration
buildscript {
standardSpineSdkRepositories()
@@ -105,19 +108,21 @@ repositories {
}
plugins {
+ base
id("org.jetbrains.kotlinx.kover")
idea
jacoco
`project-report`
}
-val gradlePluginModule = "gradle-plugin"
-
spinePublishing {
artifactPrefix = "spine-"
toolArtifactPrefix = "time-"
- modules = productionModules.map { it.name }.toSet() - gradlePluginModule
- modulesWithCustomPublishing = setOf(gradlePluginModule)
+ modulesWithCustomPublishing = setOf(
+ "gradle-plugin",
+ "validation",
+ )
+ modules = productionModules.map { it.name }.toSet() - modulesWithCustomPublishing
destinations = with(PublishingRepos) {
setOf(
gitHub("time"),
@@ -172,3 +177,33 @@ gradle.projectsEvaluated {
LicenseReporter.mergeAllReports(project)
PomGenerator.applyTo(project)
}
+
+private val INTEGRATION_TEST_TIMEOUT_MINUTES = 30L
+
+val publishedModules: Set = extensions.getByType().projectsToPublish()
+
+val localPublish by tasks.registering {
+ val pubTasks = publishedModules.map { p ->
+ p.tasks["publishToMavenLocal"]
+ }
+ dependsOn(pubTasks)
+}
+
+val integrationTests by tasks.registering(RunBuild::class) {
+ directory = "$rootDir/tests"
+ timeout.set(Duration.ofMinutes(INTEGRATION_TEST_TIMEOUT_MINUTES))
+ dependsOn(localPublish)
+ subprojects.forEach {
+ it.tasks.findByName("test")?.let { testTask ->
+ this@registering.dependsOn(testTask)
+ }
+ }
+ doLast {
+ val f = file("$directory/_out/error-out.txt")
+ project.logger.error(f.readText())
+ }
+}
+
+val check by tasks.existing {
+ dependsOn(integrationTests)
+}
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index 1a3fc8a64..6496c646c 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -36,9 +36,6 @@ plugins {
java
groovy
`kotlin-dsl`
-
- // https://github.com/jk1/Gradle-License-Report/releases
- id("com.github.jk1.dependency-license-report").version("2.9")
}
repositories {
@@ -65,7 +62,12 @@ val jacksonVersion = "2.18.3"
*/
val googleAuthToolVersion = "2.1.5"
-val licenseReportVersion = "2.7"
+/**
+ * Generates reports about the licenses of the dependencies for a Gradle project.
+ *
+ * https://github.com/jk1/Gradle-License-Report
+ */
+val licenseReportVersion = "3.1.2"
val grGitVersion = "4.1.1"
@@ -113,7 +115,7 @@ val protobufPluginVersion = "0.9.6"
* @see
* Dokka Releases
*/
-val dokkaVersion = "2.1.0"
+val dokkaVersion = "2.2.0"
/**
* The version of Detekt Gradle Plugin.
@@ -139,7 +141,7 @@ val koverVersion = "0.9.1"
*
* @see Shadow Plugin releases
*/
-val shadowVersion = "9.2.2"
+val shadowVersion = "9.4.1"
/**
* The version of JUnit used to test the build scripts.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt b/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
index ba0433aaf..858731b3f 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/build/Dokka.kt
@@ -26,6 +26,9 @@
package io.spine.dependency.build
+import io.spine.dependency.build.Dokka.GradlePlugin.id
+import io.spine.dependency.local.Spine
+
// https://github.com/Kotlin/dokka
@Suppress("unused", "ConstPropertyName")
object Dokka {
@@ -35,7 +38,7 @@ object Dokka {
* When changing the version, also change the version used in the
* `buildSrc/build.gradle.kts`.
*/
- const val version = "2.1.0"
+ const val version = "2.2.0"
object GradlePlugin {
const val id = "org.jetbrains.dokka"
@@ -76,7 +79,7 @@ object Dokka {
* Custom Dokka Plugins
*/
object SpineExtensions {
- private const val group = "io.spine.tools"
+ private const val group = Spine.toolsGroup
const val version = "2.0.0-SNAPSHOT.7"
const val lib = "$group:spine-dokka-extensions:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/lib/JetBrainsAnnotations.kt b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JetBrainsAnnotations.kt
new file mode 100644
index 000000000..f1a66e2a5
--- /dev/null
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/lib/JetBrainsAnnotations.kt
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.dependency.lib
+
+/**
+ * Annotations library from JetBrains.
+ *
+ * https://github.com/JetBrains/java-annotations
+ */
+object JetBrainsAnnotations {
+ /**
+ * The version of the library transitively used.
+ */
+ const val version = "23.0.0"
+ const val groupId = "org.jetbrains"
+ const val artifactId = "annotations"
+ const val lib = "$groupId:$artifactId:$version"
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
index b999a75d2..463cbf2b1 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Base.kt
@@ -33,8 +33,8 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName", "unused")
object Base {
- const val version = "2.0.0-SNAPSHOT.386"
- const val versionForBuildScript = "2.0.0-SNAPSHOT.386"
+ const val version = "2.0.0-SNAPSHOT.387"
+ const val versionForBuildScript = "2.0.0-SNAPSHOT.387"
const val group = Spine.group
private const val prefix = "spine"
const val libModule = "$prefix-base"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
index 31cbfb3fa..330917d7c 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Compiler.kt
@@ -60,7 +60,7 @@ import io.spine.dependency.Dependency
)
object Compiler : Dependency() {
const val pluginGroup = Spine.group
- override val group = "io.spine.tools"
+ override val group = Spine.toolsGroup
const val pluginId = "io.spine.compiler"
/**
@@ -72,7 +72,7 @@ object Compiler : Dependency() {
* The version of the Compiler dependencies.
*/
override val version: String
- private const val fallbackVersion = "2.0.0-SNAPSHOT.041"
+ private const val fallbackVersion = "2.0.0-SNAPSHOT.043"
/**
* The distinct version of the Compiler used by other build tools.
@@ -81,7 +81,7 @@ object Compiler : Dependency() {
* transitive dependencies, this is the version used to build the project itself.
*/
val dogfoodingVersion: String
- private const val fallbackDfVersion = "2.0.0-SNAPSHOT.041"
+ private const val fallbackDfVersion = "2.0.0-SNAPSHOT.043"
/**
* The artifact for the Compiler Gradle plugin.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
index 2e0b6973b..1f95edc47 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvm.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -39,7 +39,7 @@ typealias CoreJava = CoreJvm
@Suppress("ConstPropertyName", "unused")
object CoreJvm {
const val group = Spine.group
- const val version = "2.0.0-SNAPSHOT.372"
+ const val version = "2.0.0-SNAPSHOT.373"
const val coreArtifact = "spine-core"
const val clientArtifact = "spine-client"
@@ -50,9 +50,9 @@ object CoreJvm {
const val server = "$group:$serverArtifact:$version"
@Deprecated("Use `serverTestLib` instead.", ReplaceWith("serverTestLib"))
- const val testUtilServer = "${Spine.toolsGroup}:spine-server-testlib:$version"
+ const val testUtilServer = "${Spine.toolsGroup}:server-testlib:$version"
- const val coreTestLib = "${Spine.toolsGroup}:spine-core-testlib:$version"
- const val clientTestLib = "${Spine.toolsGroup}:spine-client-testlib:$version"
- const val serverTestLib = "${Spine.toolsGroup}:spine-server-testlib:$version"
+ const val coreTestLib = "${Spine.toolsGroup}:core-testlib:$version"
+ const val clientTestLib = "${Spine.toolsGroup}:client-testlib:$version"
+ const val serverTestLib = "${Spine.toolsGroup}:server-testlib:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt
index 344e8a13f..dfdaf9535 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/CoreJvmCompiler.kt
@@ -46,12 +46,12 @@ object CoreJvmCompiler {
/**
* The version used to in the build classpath.
*/
- const val dogfoodingVersion = "2.0.0-SNAPSHOT.058"
+ const val dogfoodingVersion = "2.0.0-SNAPSHOT.062"
/**
* The version to be used for integration tests.
*/
- const val version = "2.0.0-SNAPSHOT.058"
+ const val version = "2.0.0-SNAPSHOT.062"
/**
* The ID of the Gradle plugin.
@@ -61,33 +61,20 @@ object CoreJvmCompiler {
/**
* The library with the [dogfoodingVersion].
*/
- val pluginLib = pluginLibNew(dogfoodingVersion)
+ val pluginLib = pluginLib(dogfoodingVersion)
/**
- * The library with the given [version].
- *
- * This is the notation before the version `2.0.0-SNAPSHOT.013`
+ * The name of the published fat JAR artifact.
*/
- @Deprecated("Use `pluginLibNew()` instead.")
- fun pluginLib(version: String): String = "$group:core-jvm-plugins:$version:all"
+ const val fatJarArtifact = "core-jvm-plugins"
/**
* The library with the given [version].
- *
- * @since 2.0.0-SNAPSHOT.013
- */
- fun pluginLibNew(version: String): String = "$group:core-jvm-plugins:$version"
-
- /** The artifact reference for forcing in configurations. */
- const val pluginsArtifact: String = "$group:core-jvm-plugins:$version"
-
- /**
- * The `core-jvm-base` artifact with the [version].
*/
- val base = base(version)
+ fun pluginLib(version: String): String = "$group:core-jvm-plugins:$version"
/**
- * The `core-jvm-base` artifact with the given [version].
+ * The artifact reference for forcing in configurations.
*/
- fun base(version: String): String = "$group:core-jvm-base:$version"
+ val pluginsArtifact: String = pluginLib(version)
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
index 3bb11408c..04d19ea52 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Logging.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -33,7 +33,7 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName", "unused")
object Logging {
- const val version = "2.0.0-SNAPSHOT.411"
+ const val version = "2.0.0-SNAPSHOT.417"
const val group = Spine.group
const val loggingArtifact = "spine-logging"
@@ -46,7 +46,7 @@ object Logging {
const val grpcContext = "$group:spine-logging-grpc-context:$version"
const val smokeTest = "$group:spine-logging-smoke-test:$version"
- const val testLib = "${Spine.toolsGroup}:spine-logging-testlib:$version"
+ const val testLib = "${Spine.toolsGroup}:logging-testlib:$version"
// Transitive dependencies.
// Make `public` and use them to force a version in a particular repository, if needed.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
index 3b4df1009..8ead98780 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ProtoTap.kt
@@ -37,7 +37,7 @@ package io.spine.dependency.local
"MemberVisibilityCanBePrivate" /* The properties are used directly by other subprojects. */,
)
object ProtoTap {
- const val group = "io.spine.tools"
+ const val group = Spine.toolsGroup
const val version = "0.14.0"
const val gradlePluginId = "io.spine.prototap"
const val api = "$group:prototap-api:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
index d3fe7c693..355399a52 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/TestLib.kt
@@ -33,8 +33,8 @@ package io.spine.dependency.local
*/
@Suppress("ConstPropertyName")
object TestLib {
- const val version = "2.0.0-SNAPSHOT.211"
+ const val version = "2.0.0-SNAPSHOT.213"
const val group = Spine.toolsGroup
- const val artifact = "spine-testlib"
+ const val artifact = "base-testlib"
const val lib = "$group:$artifact:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
index 363e8a305..275aa0070 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Time.kt
@@ -40,11 +40,12 @@ import io.spine.dependency.Dependency
)
object Time : Dependency() {
override val group = Spine.group
- override val version = "2.0.0-SNAPSHOT.234"
+ override val version = "2.0.0-SNAPSHOT.235"
private const val infix = "spine-time"
fun lib(version: String): String = "$group:$infix:$version"
val lib get() = lib(version)
+ const val libArtifact: String = infix
fun javaExtensions(version: String): String = "$group:$infix-java:$version"
val javaExtensions get() = javaExtensions(version)
@@ -55,6 +56,12 @@ object Time : Dependency() {
fun testLib(version: String): String = "${Spine.toolsGroup}:time-testlib:$version"
val testLib get() = testLib(version)
+ fun validation(version: String): String = "${Spine.toolsGroup}:time-validation:$version"
+ val validation get() = validation(version)
+
+ fun gradlePlugin(version: String): String = "${Spine.toolsGroup}:time-gradle-plugin:$version"
+ val gradlePlugin get() = gradlePlugin(version)
+
override val modules: List
get() = listOf(
lib,
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
index c4b9b6dc7..12f3e0d27 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/ToolBase.kt
@@ -34,8 +34,8 @@ package io.spine.dependency.local
@Suppress("ConstPropertyName", "unused")
object ToolBase {
const val group = Spine.toolsGroup
- const val version = "2.0.0-SNAPSHOT.376"
- const val dogfoodingVersion = "2.0.0-SNAPSHOT.376"
+ const val version = "2.0.0-SNAPSHOT.378"
+ const val dogfoodingVersion = "2.0.0-SNAPSHOT.378"
const val lib = "$group:tool-base:$version"
const val classicCodegen = "$group:classic-codegen:$version"
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt b/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
index cf429bf43..a5ef40318 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/local/Validation.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@ object Validation {
/**
* The version of the Validation library artifacts.
*/
- const val version = "2.0.0-SNAPSHOT.408"
+ const val version = "2.0.0-SNAPSHOT.413"
/**
* The last version of Validation compatible with ProtoData.
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
index 58fb52876..f857bcd88 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
+++ b/buildSrc/src/main/kotlin/io/spine/dependency/test/Kotest.kt
@@ -35,29 +35,23 @@ package io.spine.dependency.test
*/
@Suppress("unused", "ConstPropertyName")
object Kotest {
- const val version = "6.1.10"
+ const val version = "6.1.11"
const val group = "io.kotest"
const val gradlePluginId = "io.kotest"
const val assertions = "$group:kotest-assertions-core:$version"
const val runnerJUnit5 = "$group:kotest-runner-junit5:$version"
const val runnerJUnit5Jvm = "$group:kotest-runner-junit5-jvm:$version"
- const val frameworkApi = "$group:kotest-framework-api:$version"
- const val datatest = "$group:kotest-framework-datatest:$version"
const val frameworkEngine = "$group:kotest-framework-engine:$version"
+ const val common = "$group:kotest-common:$version"
- // https://plugins.gradle.org/plugin/io.kotest.multiplatform
- @Deprecated("The plugin is deprecated. Use `io.kotest` plugin instead.")
- object MultiplatformGradlePlugin {
- const val version = "6.0.0.M4"
- const val id = "io.kotest.multiplatform"
- const val classpath = "$group:kotest-framework-multiplatform-plugin-gradle:$version"
- }
-
- // https://github.com/kotest/kotest-gradle-plugin
- @Deprecated("The repository is archived. Use `io.kotest.multiplatform` plugin instead.")
- object JvmGradlePlugin {
- const val version = "0.4.11"
- const val id = "io.kotest"
- const val classpath = "$group:kotest-gradle-plugin:$version"
- }
+ /**
+ * @deprecated Use `frameworkEngine` instead.
+ */
+ @Deprecated("Use `frameworkEngine` instead.", ReplaceWith("frameworkEngine"))
+ const val frameworkApi = "$group:kotest-framework-api:$version"
+ /**
+ * @deprecated The dependency was merged into the core framework.
+ */
+ @Deprecated("The dependency was merged into the core framework.")
+ const val datatest = "$group:kotest-framework-datatest:$version"
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt b/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
index deda20363..afccc24b5 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/ProjectExtensions.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -36,10 +36,6 @@ import org.gradle.api.tasks.SourceSetContainer
import org.gradle.kotlin.dsl.findByType
import org.gradle.kotlin.dsl.getByType
-/**
- * This file contains extension methods and properties for the Gradle `Project`.
- */
-
/**
* Logs the result of the function using the project logger at `INFO` level.
*/
@@ -86,8 +82,9 @@ fun Project.getTask(name: String): T {
/**
* Obtains Maven artifact ID of this [Project].
*
- * The method checks if [SpinePublishing] extension is configured upon this project. If yes,
- * returns [SpinePublishing.artifactId] for the project. Otherwise, a project's name is returned.
+ * The property getter checks if [SpinePublishing] extension is configured upon this project.
+ * If yes, it returns [SpinePublishing.artifactId] for the project.
+ * Otherwise, a project's name is returned.
*/
val Project.artifactId: String
get() {
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt b/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt
index a7f269f94..0277bcd28 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/docs/UpdatePluginVersion.kt
@@ -93,8 +93,9 @@ abstract class UpdatePluginVersion : DefaultTask() {
@Suppress("MemberNameEqualsClassName")
private fun updatePluginVersion(file: File, id: String, version: String) {
val content = file.readText()
- // Regex to match: id("plugin-id") version "version-number"
- val regex = """id\("$id"\)\s+version\s+"([^"]+)"""".toRegex()
+ val pluginId = Regex.escape(id)
+ // Regex to match: id("pluginId") version "version-number"
+ val regex = """id\("$pluginId"\)\s+version\s+"([^"]+)"""".toRegex()
if (regex.containsMatchIn(content)) {
val updatedContent = regex.replace(content) {
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt
index cdfd2c469..860dfbed1 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/github/pages/UpdateGitHubPages.kt
@@ -107,15 +107,7 @@ class UpdateGitHubPages : Plugin {
override fun apply(project: Project) {
val extension = UpdateGitHubPagesExtension.createIn(project)
project.afterEvaluate {
- //TODO:2025-11-20:alexander.yevsyukov: Remove this line and uncomment the below block
- // when new publishing procedure is finalized.
registerTasks(extension)
-// val projectVersion = project.version.toString()
-// if (projectVersion.isSnapshot()) {
-// registerNoOpTask()
-// } else {
-// registerTasks(extension)
-// }
}
}
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
index 5b3bbe129..5dd8dc54e 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/PublicationHandler.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -26,7 +26,9 @@
package io.spine.gradle.publish
+import DocumentationSettings
import LicenseSettings
+import io.spine.gradle.artifactId
import io.spine.gradle.isSnapshot
import io.spine.gradle.repo.Repository
import io.spine.gradle.report.pom.InceptionYear
@@ -125,25 +127,49 @@ sealed class PublicationHandler(
}
/**
- * Copies the attributes of Gradle [Project] to this [MavenPublication].
+ * Copies the attributes of the [project] to this [MavenPublication].
*
* The following project attributes are copied:
* * [group][Project.getGroup];
* * [version][Project.getVersion];
* * [description][Project.getDescription].
*
- * Also, this function adds the [artifactPrefix][SpinePublishing.artifactPrefix] to
- * the [artifactId][MavenPublication.setArtifactId] of this publication,
- * if the prefix is not added yet.
+ * The [artifactId] is derived from the project
+ * [extension property][io.spine.gradle.artifactId] of the same name, combined with
+ * the platform-specific suffix already present in the publication's artifact ID.
+ * This preserves Kotlin Multiplatform suffixes such as `-jvm`.
*
- * Finally, the Apache Software License 2.0 is set as the only license
- * under which the published artifact is distributed.
+ * For example, if the project artifact ID is `spine-logging` and the publication's
+ * current artifact ID is `logging-jvm` (set by the KMP plugin), the resulting
+ * artifact ID will be `spine-logging-jvm`.
+ *
+ * The Apache Software License 2.0 is set as the only license
+ * under which the published artifact is distributed via [LicenseSettings]
+ *
+ * The source control management attributes are obtained from [DocumentationSettings].
+ *
+ * @see LicenseSettings
+ * @see DocumentationSettings
*/
protected fun MavenPublication.copyProjectAttributes() {
groupId = project.group.toString()
- val prefix = project.spinePublishing.artifactPrefix
- if (!artifactId.startsWith(prefix)) {
- artifactId = prefix + artifactId
+ // Add the proper prefix to the `artifactId`.
+ // The default `artifactId` is either `project.name` or
+ // the `project.name` with the platform suffix of a KMM distribution.
+ artifactId = if (artifactId.startsWith(project.name)) {
+ val platformSuffix = artifactId.removePrefix(project.name)
+ val replacedId = project.artifactId + platformSuffix
+ project.logger.info(
+ "The project `${project.name}` got modified artifact: `$replacedId`."
+ )
+ replacedId
+ } else {
+ project.logger.info(
+ "The `artifactId` for the project `${project.name}` stays: `$artifactId`."
+ )
+ // This is an unlikely case of `artifactId` being set to something unrelated
+ // to the project name. Let's keep it as is.
+ artifactId
}
version = project.version.toString()
pom.description.set(project.description)
@@ -152,7 +178,9 @@ sealed class PublicationHandler(
license {
name.set(LicenseSettings.name)
url.set(LicenseSettings.url)
- distribution.set(LicenseSettings.url)
+ // It's either `"repo"` or `"manual"`.
+ // https://maven.apache.org/ref/3.9.15/maven-model/apidocs/org/apache/maven/model/License.html#setDistribution(java.lang.String)
+ distribution.set("repo")
}
}
pom.scm {
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt
index 87157fdf6..0fa60fdc0 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/ShadowJarExts.kt
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -24,54 +24,59 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+@file:Suppress("ConstPropertyName")
+
package io.spine.gradle.publish
import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar
+import org.gradle.api.file.DuplicatesStrategy
/**
- * Calls [ShadowJar.mergeServiceFiles] for the files we use in the Spine SDK.
+ * Configures a `ShadowJar` task for Spine SDK publishing.
*/
-fun ShadowJar.handleMergingServiceFiles() {
- ServiceFiles.all.forEach {
- append(it)
- }
+@Suppress("unused")
+fun ShadowJar.setup() {
+ duplicatesStrategy = DuplicatesStrategy.INCLUDE // Required for service-file merging.
+ mergeServiceFiles()
+ append(DESC_REF)
+ deduplicateEntries()
}
-@Suppress("ConstPropertyName")
-private object ServiceFiles {
-
- /**
- * Files containing references to descriptor set files.
- */
- private const val descriptorSetReferences = "desc.ref"
-
- private const val servicesDir = "META-INF/services"
- /**
- * Providers of custom Protobuf options introduced by the libraries.
- */
- private const val optionProviders = "$servicesDir/io.spine.option.OptionsProvider"
+/**
+ * The name of a descriptor set reference file.
+ */
+private const val DESC_REF = "desc.ref"
- /**
- * KSP symbol processor provider.
- */
- private const val kspSymbolProcessorProviders =
- "$servicesDir/com.google.devtools.ksp.KspSymbolProcessorProvider"
+/**
+ * Installs a first-copy-wins exclusion predicate for all JAR entries except those
+ * registered for merging, such as service files, descriptor set references, etc.
+ *
+ * Shadow's [org.gradle.api.file.DuplicatesStrategy.INCLUDE] must remain on the task so
+ * that every copy of a merged file reaches its
+ * [AppendingTransformer][com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer].
+ * All other entries — `.class` files, settings JSONs, Kotlin module descriptors,
+ * Maven metadata, etc. — are deduplicated here to suppress duplicate-entry warnings
+ * and keep the fat JAR size minimal.
+ */
+private fun ShadowJar.deduplicateEntries() {
+ val seenPaths = mutableSetOf()
+ doFirst { seenPaths.clear() }
+ eachFile {
+ val needsMerging = path.isServiceFile || path.isDescriptorSetReference
+ if (!needsMerging && !seenPaths.add(path)) {
+ exclude()
+ }
+ }
+}
- /**
- * Message routing setup classes generated by the Compiler for JVM.
- */
- private const val routeSetupPackage = "io.spine.server.route.setup"
- private const val routeSetupPrefix = "$servicesDir/$routeSetupPackage"
- private const val commandRoutingSetupClasses = "$routeSetupPrefix.CommandRoutingSetup"
- private const val eventRoutingSetupClasses = "$routeSetupPrefix.EventRoutingSetup"
- private const val stateRoutingSetupClasses = "$routeSetupPrefix.StateRoutingSetup"
+/**
+ * Returns `true` for file paths containing references to descriptor set files.
+ */
+private val String.isDescriptorSetReference: Boolean
+ get() = contains(DESC_REF)
- val all = arrayOf(
- descriptorSetReferences,
- optionProviders,
- kspSymbolProcessorProviders,
- commandRoutingSetupClasses,
- eventRoutingSetupClasses,
- stateRoutingSetupClasses
- )
-}
+/**
+ * Tells if the path belongs to a service file.
+ */
+private val String.isServiceFile: Boolean
+ get() = contains("META-INF/services")
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt b/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
index 37fdf5f7d..a12c1d20f 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/publish/SpinePublishing.kt
@@ -28,6 +28,7 @@
package io.spine.gradle.publish
+import io.spine.dependency.local.Spine
import io.spine.gradle.repo.Repository
import java.util.Locale
import org.gradle.api.Project
@@ -148,10 +149,8 @@ import org.gradle.kotlin.dsl.findByType
*/
fun Project.spinePublishing(block: SpinePublishing.() -> Unit): SpinePublishing {
apply()
- val name = SpinePublishing::class.java.simpleName
- .replaceFirstChar { it.lowercase(Locale.getDefault()) }
val extension = with(extensions) {
- findByType() ?: create(name, project)
+ findByType() ?: create(SpinePublishing.extensionName, project)
}
extension.run {
block()
@@ -191,6 +190,12 @@ open class SpinePublishing(private val project: Project) {
* to a tool module's artifact ID.
*/
const val NONE_PREFIX = "NONE"
+
+ /**
+ * The name of the extension registered in a Gradle project.
+ */
+ public val extensionName: String = SpinePublishing::class.java.simpleName
+ .replaceFirstChar { it.lowercase(Locale.ROOT) }
}
private val testJar = TestJar()
@@ -345,13 +350,14 @@ open class SpinePublishing(private val project: Project) {
*
* @see modules
*/
- private fun projectsToPublish(): Collection {
+ fun projectsToPublish(): Set {
if (project.subprojects.isEmpty()) {
return setOf(project)
}
return modules.union(modulesWithCustomPublishing)
.map { name -> project.project(name) }
.ifEmpty { setOf(project) }
+ .toSet()
}
/**
@@ -415,22 +421,27 @@ open class SpinePublishing(private val project: Project) {
* @see toolArtifactPrefix
*/
fun artifactId(project: Project): String {
- if (project.isTool) {
+ val result = if (project.isTool) {
check(!toolArtifactPrefix.isEmpty()) {
"Artifact prefix cannot be empty for tool modules. " +
"Please set the `toolArtifactPrefix` property in `spinePublishing`. " +
"Use `\"NONE\"` to have an empty prefix for tool modules."
}
val prefix =
- if (toolArtifactPrefix == NONE_PREFIX) { "" }
- else { toolArtifactPrefix }
- return "$prefix${project.name}"
+ if (toolArtifactPrefix == NONE_PREFIX) {
+ ""
+ } else {
+ toolArtifactPrefix
+ }
+ "$prefix${project.name}"
+ } else {
+ "$artifactPrefix${project.name}"
}
- return "$artifactPrefix${project.name}"
+ return result
}
private val Project.isTool: Boolean
- get() = group == "io.spine.tools"
+ get() = group == Spine.toolsGroup
/**
* Ensures that all modules, marked as included into [testJar] publishing,
diff --git a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt
index 5f18b9575..8ede9919a 100644
--- a/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt
+++ b/buildSrc/src/main/kotlin/io/spine/gradle/report/license/LicenseReporter.kt
@@ -29,6 +29,7 @@ package io.spine.gradle.report.license
import com.github.jk1.license.LicenseReportExtension
import com.github.jk1.license.LicenseReportExtension.ALL
import com.github.jk1.license.LicenseReportPlugin
+import io.spine.dependency.local.Spine
import io.spine.gradle.applyPlugin
import io.spine.gradle.getTask
import java.io.File
@@ -85,10 +86,10 @@ object LicenseReporter {
with(project.the()) {
outputDir = reportOutputDir.absolutePath
excludeGroups = arrayOf(
- "io.spine",
+ Spine.group,
"io.spine.gcloud",
"io.spine.protodata",
- "io.spine.tools",
+ Spine.toolsGroup,
"io.spine.validation"
)
configurations = ALL
diff --git a/buildSrc/src/main/kotlin/jvm-module.gradle.kts b/buildSrc/src/main/kotlin/jvm-module.gradle.kts
index 11696c1aa..a7b2cd44a 100644
--- a/buildSrc/src/main/kotlin/jvm-module.gradle.kts
+++ b/buildSrc/src/main/kotlin/jvm-module.gradle.kts
@@ -30,6 +30,8 @@ import io.spine.dependency.build.Dokka
import io.spine.dependency.build.ErrorProne
import io.spine.dependency.build.JSpecify
import io.spine.dependency.lib.Guava
+import io.spine.dependency.lib.Jackson
+import io.spine.dependency.lib.Kotlin
import io.spine.dependency.lib.Protobuf
import io.spine.dependency.local.Reflect
import io.spine.dependency.test.Jacoco
@@ -130,7 +132,13 @@ fun Module.forceConfigurations() {
excludeProtobufLite()
all {
resolutionStrategy {
+ val cfg = this@all
+ val rs = this@resolutionStrategy
+ Jackson.forceArtifacts(project, cfg, rs)
+ Jackson.DataFormat.forceArtifacts(project, cfg, rs)
force(
+ Jackson.annotations,
+ Kotlin.bom,
Dokka.BasePlugin.lib,
Reflect.lib,
)
diff --git a/buildSrc/src/main/kotlin/kmp-module.gradle.kts b/buildSrc/src/main/kotlin/kmp-module.gradle.kts
index 4f7ec6398..9bc0fd34b 100644
--- a/buildSrc/src/main/kotlin/kmp-module.gradle.kts
+++ b/buildSrc/src/main/kotlin/kmp-module.gradle.kts
@@ -25,6 +25,8 @@
*/
import io.spine.dependency.boms.BomsPlugin
+import io.spine.dependency.lib.Jackson
+import io.spine.dependency.lib.Kotlin
import io.spine.dependency.local.Reflect
import io.spine.dependency.local.TestLib
import io.spine.dependency.test.JUnit
@@ -82,7 +84,12 @@ fun Project.forceConfigurations() {
forceVersions()
all {
resolutionStrategy {
+ val cfg = this@all
+ val rs = this@resolutionStrategy
+ Jackson.forceArtifacts(project, cfg, rs)
+ Jackson.DataFormat.forceArtifacts(project, cfg, rs)
force(
+ Kotlin.bom,
Reflect.lib
)
}
@@ -123,7 +130,6 @@ kotlin {
implementation(kotlin("test-annotations-common"))
implementation(Kotest.assertions)
implementation(Kotest.frameworkEngine)
- implementation(Kotest.datatest)
}
}
val jvmTest by getting {
diff --git a/buildSrc/src/main/kotlin/module.gradle.kts b/buildSrc/src/main/kotlin/module.gradle.kts
index 8392adb60..d50a45393 100644
--- a/buildSrc/src/main/kotlin/module.gradle.kts
+++ b/buildSrc/src/main/kotlin/module.gradle.kts
@@ -36,6 +36,7 @@ import io.spine.dependency.lib.Jackson
import io.spine.dependency.lib.Protobuf
import io.spine.dependency.local.Base
import io.spine.dependency.local.Compiler
+import io.spine.dependency.local.Logging
import io.spine.dependency.local.Reflect
import io.spine.dependency.local.ToolBase
import io.spine.dependency.test.Jacoco
@@ -154,6 +155,7 @@ fun Module.forceConfigurations() {
Dokka.BasePlugin.lib,
Jackson.annotations,
Reflect.lib,
+ Logging.testLib,
ToolBase.gradlePluginApi,
ToolBase.jvmTools,
ToolBase.pluginBase,
diff --git a/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt b/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt
index 37f58e040..52663c2e6 100644
--- a/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt
+++ b/buildSrc/src/test/kotlin/io/spine/gradle/publish/SpinePublishingTest.kt
@@ -156,10 +156,9 @@ class SpinePublishingTest {
// Let's use it instead of creating a second one with a different name.
extension.modules = setOf("sub")
- // Subproject's extension must be named 'SpinePublishing'
- // to be found by SpinePublishing::class.java.simpleName
- val extensionName = SpinePublishing::class.java.simpleName
- val subExtension = subproject.extensions.create(extensionName, subproject)
+ val extensionName = SpinePublishing.extensionName
+ val subExtension =
+ subproject.extensions.create(extensionName, subproject)
val exception = shouldThrow {
subExtension.configured()
diff --git a/config b/config
index 3986ebdd1..cd6e86330 160000
--- a/config
+++ b/config
@@ -1 +1 @@
-Subproject commit 3986ebdd1ebece40e9433122ab9d46b4253fca03
+Subproject commit cd6e86330c283e0414be7c318a4cd450dd3c6982
diff --git a/dependencies.md b/dependencies.md
index 9f6fd8829..843bea5ab 100644
--- a/dependencies.md
+++ b/dependencies.md
@@ -1,6 +1,6 @@
-# Dependencies of `io.spine.tools:time-gradle-plugin:2.0.0-SNAPSHOT.235`
+# Dependencies of `io.spine.tools:time-gradle-plugin:2.0.0-SNAPSHOT.236`
## Runtime
1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
@@ -27,6 +27,38 @@
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-datatypes-collections](https://github.com/FasterXML/jackson-datatypes-collections)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.1.8.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
+ * **Project URL:** [http://source.android.com/](http://source.android.com/)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.59.2.
+ * **Project URL:** [https://github.com/googleapis/sdk-platform-java](https://github.com/googleapis/sdk-platform-java)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
* **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -66,6 +98,62 @@
* **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
* **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+1. **Group** : com.sksamuel.aedile. **Name** : aedile-core. **Version** : 2.1.2.
+ * **Project URL:** [http://www.github.com/sksamuel/aedile](http://www.github.com/sksamuel/aedile)
+ * **License:** [The Apache 2.0 License](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-bom. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-inprocess. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-kotlin-stub. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/grpc/grpc-kotlin](https://github.com/grpc/grpc-kotlin)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.27.0.
+ * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
+ * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
+ * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
+
+1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
+ * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
+ * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
* **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -94,6 +182,18 @@
* **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1.
* **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -140,6 +240,21 @@
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-datatypes-collections](https://github.com/FasterXML/jackson-datatypes-collections)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.20.0.
* **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
* **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -154,6 +269,10 @@
* **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
* **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.1.8.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
* **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
* **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
@@ -162,6 +281,14 @@
* **Project URL:** [https://github.com/oowekyala/nice-xml-messages](https://github.com/oowekyala/nice-xml-messages)
* **License:** [MIT License](https://github.com/oowekyala/nice-xml-messages/tree/master/LICENSE)
+1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
+ * **Project URL:** [http://source.android.com/](http://source.android.com/)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.59.2.
+ * **Project URL:** [https://github.com/googleapis/sdk-platform-java](https://github.com/googleapis/sdk-platform-java)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.2.
* **Project URL:** [https://github.com/google/auto/tree/main/common](https://github.com/google/auto/tree/main/common)
* **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -267,6 +394,10 @@
* **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
* **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
+1. **Group** : com.sksamuel.aedile. **Name** : aedile-core. **Version** : 2.1.2.
+ * **Project URL:** [http://www.github.com/sksamuel/aedile](http://www.github.com/sksamuel/aedile)
+ * **License:** [The Apache 2.0 License](https://opensource.org/licenses/Apache-2.0)
+
1. **Group** : com.soywiz.korlibs.korte. **Name** : korte-jvm. **Version** : 4.0.10.
* **Project URL:** [https://github.com/korlibs/korge-next](https://github.com/korlibs/korge-next)
* **License:** [MIT](https://raw.githubusercontent.com/korlibs/korge-next/master/korge/LICENSE.txt)
@@ -406,30 +537,74 @@
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.10.
+1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-bom. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-inprocess. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-kotlin-stub. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/grpc/grpc-kotlin](https://github.com/grpc/grpc-kotlin)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.27.0.
+ * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
+ * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
+ * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
+
1. **Group** : javax.inject. **Name** : javax.inject. **Version** : 1.
* **Project URL:** [http://code.google.com/p/atinject/](http://code.google.com/p/atinject/)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -489,6 +664,10 @@
* **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
* **License:** [The MIT License](http://opensource.org/licenses/MIT)
+1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
+ * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.2.
* **Project URL:** [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -537,31 +716,31 @@
* **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -880,14 +1059,14 @@
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
+This report was generated on **Tue Apr 28 13:46:33 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine.tools:time-testlib:2.0.0-SNAPSHOT.235`
+# Dependencies of `io.spine.tools:time-testlib:2.0.0-SNAPSHOT.236`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -1240,27 +1419,27 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -1371,31 +1550,31 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1690,14 +1869,14 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
+This report was generated on **Tue Apr 28 13:46:33 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine:spine-time:2.0.0-SNAPSHOT.235`
+# Dependencies of `io.spine:spine-time:2.0.0-SNAPSHOT.236`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -1867,11 +2046,11 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
* **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.devtools.ksp. **Name** : symbol-processing. **Version** : 2.3.6.
+1. **Group** : com.google.devtools.ksp. **Name** : com.google.devtools.ksp.gradle.plugin. **Version** : 2.3.6.
* **Project URL:** [https://goo.gle/ksp](https://goo.gle/ksp)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.google.devtools.ksp. **Name** : symbol-processing-aa-embeddable. **Version** : 2.3.6.
+1. **Group** : com.google.devtools.ksp. **Name** : symbol-processing. **Version** : 2.3.6.
* **Project URL:** [https://goo.gle/ksp](https://goo.gle/ksp)
* **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -1997,10 +2176,6 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://github.com/korlibs/korge-next](https://github.com/korlibs/korge-next)
* **License:** [MIT](https://raw.githubusercontent.com/korlibs/korge-next/master/korge/LICENSE.txt)
-1. **Group** : com.squareup. **Name** : javapoet. **Version** : 1.13.0.
- * **Project URL:** [http://github.com/square/javapoet/](http://github.com/square/javapoet/)
- * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-
1. **Group** : com.squareup. **Name** : kotlinpoet. **Version** : 2.2.0.
* **Project URL:** [https://github.com/square/kotlinpoet](https://github.com/square/kotlinpoet)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2009,10 +2184,6 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://github.com/square/kotlinpoet](https://github.com/square/kotlinpoet)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : com.squareup. **Name** : kotlinpoet-ksp. **Version** : 2.2.0.
- * **Project URL:** [https://github.com/square/kotlinpoet](https://github.com/square/kotlinpoet)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
* **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
* **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2188,27 +2359,27 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
* **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -2323,14 +2494,6 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
* **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
-1. **Group** : org.jboss.forge.roaster. **Name** : roaster-api. **Version** : 2.29.0.Final.
- * **License:** [Eclipse Public License version 1.0](http://www.eclipse.org/legal/epl-v10.html)
- * **License:** [Public Domain](http://repository.jboss.org/licenses/cc0-1.0.txt)
-
-1. **Group** : org.jboss.forge.roaster. **Name** : roaster-jdt. **Version** : 2.29.0.Final.
- * **License:** [Eclipse Public License version 1.0](http://www.eclipse.org/legal/epl-v10.html)
- * **License:** [Public Domain](http://repository.jboss.org/licenses/cc0-1.0.txt)
-
1. **Group** : org.jcommander. **Name** : jcommander. **Version** : 1.85.
* **Project URL:** [https://jcommander.org](https://jcommander.org)
* **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2347,31 +2510,31 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2379,14 +2542,6 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
* **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
-1. **Group** : org.jetbrains.intellij.deps.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.8.0-intellij-14.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
-1. **Group** : org.jetbrains.intellij.deps.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.8.0-intellij-14.
- * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
- * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-
1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools. **Version** : 2.3.20.
* **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
* **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -2678,14 +2833,14 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
+This report was generated on **Tue Apr 28 13:46:33 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine:spine-time-java:2.0.0-SNAPSHOT.235`
+# Dependencies of `io.spine:spine-time-java:2.0.0-SNAPSHOT.236`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -3038,27 +3193,27 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -3169,31 +3324,31 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -3488,14 +3643,14 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
+This report was generated on **Tue Apr 28 13:46:33 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
-# Dependencies of `io.spine:spine-time-kotlin:2.0.0-SNAPSHOT.235`
+# Dependencies of `io.spine:spine-time-kotlin:2.0.0-SNAPSHOT.236`
## Runtime
1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
@@ -3856,27 +4011,27 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://detekt.dev](https://detekt.dev)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
-1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.10.
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
* **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
* **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
@@ -3987,31 +4142,31 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
* **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
* **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
-1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.1.0.
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
* **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
* **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
@@ -4306,6 +4461,2228 @@ This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
-This report was generated on **Fri Apr 03 16:26:28 WEST 2026** using
+This report was generated on **Tue Apr 28 13:46:33 WEST 2026** using
+[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
+[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
+
+
+
+
+# Dependencies of `io.spine.tools:time-validation:2.0.0-SNAPSHOT.236`
+
+## Runtime
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.20.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-yaml. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformats-text](https://github.com/FasterXML/jackson-dataformats-text)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-datatypes-collections](https://github.com/FasterXML/jackson-datatypes-collections)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-parameter-names. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names](https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.1.8.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
+ * **Project URL:** [http://source.android.com/](http://source.android.com/)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.59.2.
+ * **Project URL:** [https://github.com/googleapis/sdk-platform-java](https://github.com/googleapis/sdk-platform-java)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.1.1.
+ * **Project URL:** [https://github.com/google/auto/tree/main/service](https://github.com/google/auto/tree/main/service)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.palantir.javaformat. **Name** : palantir-java-format. **Version** : 2.75.0.
+ * **Project URL:** [https://github.com/palantir/palantir-java-format](https://github.com/palantir/palantir-java-format)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.palantir.javaformat. **Name** : palantir-java-format-spi. **Version** : 2.75.0.
+ * **Project URL:** [https://github.com/palantir/palantir-java-format](https://github.com/palantir/palantir-java-format)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.sksamuel.aedile. **Name** : aedile-core. **Version** : 2.1.2.
+ * **Project URL:** [http://www.github.com/sksamuel/aedile](http://www.github.com/sksamuel/aedile)
+ * **License:** [The Apache 2.0 License](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-bom. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-inprocess. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-kotlin-stub. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/grpc/grpc-kotlin](https://github.com/grpc/grpc-kotlin)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.27.0.
+ * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
+ * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
+ * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
+
+1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
+ * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
+ * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.functionaljava. **Name** : functionaljava. **Version** : 4.8.
+ * **Project URL:** [http://functionaljava.org/](http://functionaljava.org/)
+ * **License:** [The BSD3 License](https://github.com/functionaljava/functionaljava/blob/master/etc/LICENCE)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu-jvm. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.yaml. **Name** : snakeyaml. **Version** : 2.4.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+## Compile, tests, and tooling
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.20.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-yaml. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformats-text](https://github.com/FasterXML/jackson-dataformats-text)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-datatypes-collections](https://github.com/FasterXML/jackson-datatypes-collections)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-parameter-names. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names](https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 7.1.1.
+ * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.0.5.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.1.8.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
+ * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : com.github.oowekyala.ooxml. **Name** : nice-xml-messages. **Version** : 3.1.
+ * **Project URL:** [https://github.com/oowekyala/nice-xml-messages](https://github.com/oowekyala/nice-xml-messages)
+ * **License:** [MIT License](https://github.com/oowekyala/nice-xml-messages/tree/master/LICENSE)
+
+1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
+ * **Project URL:** [http://source.android.com/](http://source.android.com/)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.59.2.
+ * **Project URL:** [https://github.com/googleapis/sdk-platform-java](https://github.com/googleapis/sdk-platform-java)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/common](https://github.com/google/auto/tree/main/common)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.1.1.
+ * **Project URL:** [https://github.com/google/auto/tree/main/service](https://github.com/google/auto/tree/main/service)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/value](https://github.com/google/auto/tree/main/value)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.devtools.ksp. **Name** : com.google.devtools.ksp.gradle.plugin. **Version** : 2.3.6.
+ * **Project URL:** [https://goo.gle/ksp](https://goo.gle/ksp)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.devtools.ksp. **Name** : symbol-processing. **Version** : 2.3.6.
+ * **Project URL:** [https://goo.gle/ksp](https://goo.gle/ksp)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.devtools.ksp. **Name** : symbol-processing-api. **Version** : 2.3.6.
+ * **Project URL:** [https://goo.gle/ksp](https://goo.gle/ksp)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.devtools.ksp. **Name** : symbol-processing-common-deps. **Version** : 2.3.6.
+ * **Project URL:** [https://goo.gle/ksp](https://goo.gle/ksp)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.devtools.ksp. **Name** : symbol-processing-gradle-plugin. **Version** : 2.3.6.
+ * **Project URL:** [https://goo.gle/ksp](https://goo.gle/ksp)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : javac. **Version** : 9+181-r4173-1.
+ * **Project URL:** [https://github.com/google/error-prone-javac](https://github.com/google/error-prone-javac)
+ * **License:** [GNU General Public License, version 2, with the Classpath Exception](http://openjdk.java.net/legal/gplv2+ce.html)
+
+1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.gradle. **Name** : osdetector-gradle-plugin. **Version** : 1.7.3.
+ * **Project URL:** [https://github.com/google/osdetector-gradle-plugin](https://github.com/google/osdetector-gradle-plugin)
+ * **License:** [Apache License 2.0](http://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 33.5.0-jre.
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-gradle-plugin. **Version** : 0.9.6.
+ * **Project URL:** [https://github.com/google/protobuf-gradle-plugin](https://github.com/google/protobuf-gradle-plugin)
+ * **License:** [BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protoc. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.palantir.javaformat. **Name** : palantir-java-format. **Version** : 2.75.0.
+ * **Project URL:** [https://github.com/palantir/palantir-java-format](https://github.com/palantir/palantir-java-format)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.palantir.javaformat. **Name** : palantir-java-format-spi. **Version** : 2.75.0.
+ * **Project URL:** [https://github.com/palantir/palantir-java-format](https://github.com/palantir/palantir-java-format)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.12.1.
+ * **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
+ * **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
+
+1. **Group** : com.sksamuel.aedile. **Name** : aedile-core. **Version** : 2.1.2.
+ * **Project URL:** [http://www.github.com/sksamuel/aedile](http://www.github.com/sksamuel/aedile)
+ * **License:** [The Apache 2.0 License](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : com.soywiz.korlibs.korte. **Name** : korte-jvm. **Version** : 4.0.10.
+ * **Project URL:** [https://github.com/korlibs/korge-next](https://github.com/korlibs/korge-next)
+ * **License:** [MIT](https://raw.githubusercontent.com/korlibs/korge-next/master/korge/LICENSE.txt)
+
+1. **Group** : com.squareup. **Name** : kotlinpoet. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/square/kotlinpoet](https://github.com/square/kotlinpoet)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.squareup. **Name** : kotlinpoet-jvm. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/square/kotlinpoet](https://github.com/square/kotlinpoet)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
+ * **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.16.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-collections. **Name** : commons-collections. **Version** : 3.2.2.
+ * **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations-jvm. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.zacsweers.autoservice. **Name** : auto-service-ksp. **Version** : 1.2.0.
+ * **Project URL:** [https://github.com/ZacSweers/auto-service-ksp](https://github.com/ZacSweers/auto-service-ksp)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.7.4.
+ * **Project URL:** [https://picocli.info](https://picocli.info)
+ * **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.davidburstrom.contester. **Name** : contester-breakpoint. **Version** : 0.2.0.
+ * **Project URL:** [https://github.com/davidburstrom/contester](https://github.com/davidburstrom/contester)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.41.0-eisop1.
+ * **Project URL:** [https://eisop.github.io/](https://eisop.github.io/)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+
+1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.12.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-bom. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-inprocess. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-kotlin-stub. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/grpc/grpc-kotlin](https://github.com/grpc/grpc-kotlin)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.27.0.
+ * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
+ * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
+ * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
+
+1. **Group** : javax.inject. **Name** : javax.inject. **Version** : 1.
+ * **Project URL:** [http://code.google.com/p/atinject/](http://code.google.com/p/atinject/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : junit. **Name** : junit. **Version** : 4.13.2.
+ * **Project URL:** [http://junit.org](http://junit.org)
+ * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
+
+1. **Group** : kr.motd.maven. **Name** : os-maven-plugin. **Version** : 1.7.1.
+ * **Project URL:** [https://github.com/trustin/os-maven-plugin/](https://github.com/trustin/os-maven-plugin/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.2.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.5.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-ant. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.11.1.
+ * **Project URL:** [https://www.antlr.org/](https://www.antlr.org/)
+ * **License:** [BSD-3-Clause](https://www.antlr.org/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
+ * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
+ * **License:** [The BSD License](http://www.antlr.org/license.html)
+
+1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.17.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-lang/](https://commons.apache.org/proper/commons-lang/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.client5. **Name** : httpclient5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5-h2. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
+ * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.3.
+ * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
+ * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
+ * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.2.
+ * **Project URL:** [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The BSD 2-Clause License](http://www.opensource.org/licenses/bsd-license.php)
+
+1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.32.
+ * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.functionaljava. **Name** : functionaljava. **Version** : 4.8.
+ * **Project URL:** [http://functionaljava.org/](http://functionaljava.org/)
+ * **License:** [The BSD3 License](https://github.com/functionaljava/functionaljava/blob/master/etc/LICENCE)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.javassist. **Name** : javassist. **Version** : 3.28.0-GA.
+ * **Project URL:** [http://www.javassist.org/](http://www.javassist.org/)
+ * **License:** [Apache License 2.0](http://www.apache.org/licenses/)
+ * **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
+ * **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
+
+1. **Group** : org.jcommander. **Name** : jcommander. **Version** : 1.85.
+ * **Project URL:** [https://jcommander.org](https://jcommander.org)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
+ * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
+ * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-compat. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-cri-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-runner. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-client. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-abi-reader. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-metadata-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-tooling-core. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu-jvm. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.8.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.9.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.16.1.
+ * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
+ * **License:** [The MIT License](https://jsoup.org/license)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.junit. **Name** : junit-bom. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit-pioneer. **Name** : junit-pioneer. **Version** : 2.3.0.
+ * **Project URL:** [https://junit-pioneer.org/](https://junit-pioneer.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-launcher. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.3.0.
+ * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.1.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.2.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.reflections. **Name** : reflections. **Version** : 0.10.2.
+ * **Project URL:** [http://github.com/ronmamo/reflections](http://github.com/ronmamo/reflections)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [WTFPL](http://www.wtfpl.net/)
+
+1. **Group** : org.slf4j. **Name** : jul-to-slf4j. **Version** : 1.7.36.
+ * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.7.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.1.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.2.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : org.yaml. **Name** : snakeyaml. **Version** : 2.4.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+
+The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
+
+This report was generated on **Tue Apr 28 13:46:33 WEST 2026** using
+[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
+[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
+
+
+
+
+# Dependencies of `io.spine:spine-validation-tests:2.0.0-SNAPSHOT.236`
+
+## Runtime
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.20.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-yaml. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformats-text](https://github.com/FasterXML/jackson-dataformats-text)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-datatypes-collections](https://github.com/FasterXML/jackson-datatypes-collections)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-parameter-names. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names](https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.1.8.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
+ * **Project URL:** [http://source.android.com/](http://source.android.com/)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.59.2.
+ * **Project URL:** [https://github.com/googleapis/sdk-platform-java](https://github.com/googleapis/sdk-platform-java)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.1.1.
+ * **Project URL:** [https://github.com/google/auto/tree/main/service](https://github.com/google/auto/tree/main/service)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.palantir.javaformat. **Name** : palantir-java-format. **Version** : 2.75.0.
+ * **Project URL:** [https://github.com/palantir/palantir-java-format](https://github.com/palantir/palantir-java-format)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.palantir.javaformat. **Name** : palantir-java-format-spi. **Version** : 2.75.0.
+ * **Project URL:** [https://github.com/palantir/palantir-java-format](https://github.com/palantir/palantir-java-format)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.sksamuel.aedile. **Name** : aedile-core. **Version** : 2.1.2.
+ * **Project URL:** [http://www.github.com/sksamuel/aedile](http://www.github.com/sksamuel/aedile)
+ * **License:** [The Apache 2.0 License](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-bom. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-inprocess. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-kotlin-stub. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/grpc/grpc-kotlin](https://github.com/grpc/grpc-kotlin)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.27.0.
+ * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
+ * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
+ * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
+
+1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
+ * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
+ * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.functionaljava. **Name** : functionaljava. **Version** : 4.8.
+ * **Project URL:** [http://functionaljava.org/](http://functionaljava.org/)
+ * **License:** [The BSD3 License](https://github.com/functionaljava/functionaljava/blob/master/etc/LICENCE)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu-jvm. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.yaml. **Name** : snakeyaml. **Version** : 2.4.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+## Compile, tests, and tooling
+1. **Group** : com.fasterxml.jackson. **Name** : jackson-bom. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-bom](https://github.com/FasterXML/jackson-bom)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-annotations. **Version** : 2.20.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-core. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.core. **Name** : jackson-databind. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-xml. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformat-xml](https://github.com/FasterXML/jackson-dataformat-xml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.dataformat. **Name** : jackson-dataformat-yaml. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-dataformats-text](https://github.com/FasterXML/jackson-dataformats-text)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-guava. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-datatypes-collections](https://github.com/FasterXML/jackson-datatypes-collections)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jdk8. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jdk8)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.datatype. **Name** : jackson-datatype-jsr310. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310](https://github.com/FasterXML/jackson-modules-java8/jackson-datatype-jsr310)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-kotlin. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-module-kotlin](https://github.com/FasterXML/jackson-module-kotlin)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.jackson.module. **Name** : jackson-module-parameter-names. **Version** : 2.20.0.
+ * **Project URL:** [https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names](https://github.com/FasterXML/jackson-modules-java8/jackson-module-parameter-names)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.fasterxml.woodstox. **Name** : woodstox-core. **Version** : 7.1.1.
+ * **Project URL:** [https://github.com/FasterXML/woodstox](https://github.com/FasterXML/woodstox)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.0.5.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.ben-manes.caffeine. **Name** : caffeine. **Version** : 3.1.8.
+ * **Project URL:** [https://github.com/ben-manes/caffeine](https://github.com/ben-manes/caffeine)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.github.kevinstern. **Name** : software-and-algorithms. **Version** : 1.0.
+ * **Project URL:** [https://www.github.com/KevinStern/software-and-algorithms](https://www.github.com/KevinStern/software-and-algorithms)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : com.github.oowekyala.ooxml. **Name** : nice-xml-messages. **Version** : 3.1.
+ * **Project URL:** [https://github.com/oowekyala/nice-xml-messages](https://github.com/oowekyala/nice-xml-messages)
+ * **License:** [MIT License](https://github.com/oowekyala/nice-xml-messages/tree/master/LICENSE)
+
+1. **Group** : com.google.android. **Name** : annotations. **Version** : 4.1.1.4.
+ * **Project URL:** [http://source.android.com/](http://source.android.com/)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.google.api.grpc. **Name** : proto-google-common-protos. **Version** : 2.59.2.
+ * **Project URL:** [https://github.com/googleapis/sdk-platform-java](https://github.com/googleapis/sdk-platform-java)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto. **Name** : auto-common. **Version** : 1.2.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/common](https://github.com/google/auto/tree/main/common)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.service. **Name** : auto-service-annotations. **Version** : 1.1.1.
+ * **Project URL:** [https://github.com/google/auto/tree/main/service](https://github.com/google/auto/tree/main/service)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.auto.value. **Name** : auto-value-annotations. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/google/auto/tree/main/value](https://github.com/google/auto/tree/main/value)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.findbugs. **Name** : jsr305. **Version** : 3.0.2.
+ * **Project URL:** [http://findbugs.sourceforge.net/](http://findbugs.sourceforge.net/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.code.gson. **Name** : gson. **Version** : 2.13.0.
+ * **Project URL:** [https://github.com/google/gson](https://github.com/google/gson)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotation. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotation](https://errorprone.info/error_prone_annotation)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_annotations](https://errorprone.info/error_prone_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_check_api. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_check_api](https://errorprone.info/error_prone_check_api)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_core. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_core](https://errorprone.info/error_prone_core)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : error_prone_type_annotations. **Version** : 2.36.0.
+ * **Project URL:** [https://errorprone.info/error_prone_type_annotations](https://errorprone.info/error_prone_type_annotations)
+ * **License:** [Apache 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.errorprone. **Name** : javac. **Version** : 9+181-r4173-1.
+ * **Project URL:** [https://github.com/google/error-prone-javac](https://github.com/google/error-prone-javac)
+ * **License:** [GNU General Public License, version 2, with the Classpath Exception](http://openjdk.java.net/legal/gplv2+ce.html)
+
+1. **Group** : com.google.flogger. **Name** : flogger. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.flogger. **Name** : flogger-system-backend. **Version** : 0.7.4.
+ * **Project URL:** [https://github.com/google/flogger](https://github.com/google/flogger)
+ * **License:** [Apache 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.googlejavaformat. **Name** : google-java-format. **Version** : 1.19.1.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : failureaccess. **Version** : 1.0.3.
+ * **Project URL:** [https://github.com/google/guava/](https://github.com/google/guava/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava. **Version** : 33.5.0-jre.
+ * **Project URL:** [https://github.com/google/guava](https://github.com/google/guava)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : guava-testlib. **Version** : 33.5.0-jre.
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.guava. **Name** : listenablefuture. **Version** : 9999.0-empty-to-avoid-conflict-with-guava.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.j2objc. **Name** : j2objc-annotations. **Version** : 2.8.
+ * **Project URL:** [https://github.com/google/j2objc/](https://github.com/google/j2objc/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-java-util. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protobuf-kotlin. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+
+1. **Group** : com.google.protobuf. **Name** : protoc. **Version** : 4.34.1.
+ * **Project URL:** [https://developers.google.com/protocol-buffers/](https://developers.google.com/protocol-buffers/)
+ * **License:** [BSD-3-Clause](https://opensource.org/licenses/BSD-3-Clause)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth. **Name** : truth. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-java8-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-liteproto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.google.truth.extensions. **Name** : truth-proto-extension. **Version** : 1.4.4.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : com.palantir.javaformat. **Name** : palantir-java-format. **Version** : 2.75.0.
+ * **Project URL:** [https://github.com/palantir/palantir-java-format](https://github.com/palantir/palantir-java-format)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.palantir.javaformat. **Name** : palantir-java-format-spi. **Version** : 2.75.0.
+ * **Project URL:** [https://github.com/palantir/palantir-java-format](https://github.com/palantir/palantir-java-format)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : com.puppycrawl.tools. **Name** : checkstyle. **Version** : 10.12.1.
+ * **Project URL:** [https://checkstyle.org/](https://checkstyle.org/)
+ * **License:** [LGPL-2.1+](http://www.gnu.org/licenses/old-licenses/lgpl-2.1.txt)
+
+1. **Group** : com.sksamuel.aedile. **Name** : aedile-core. **Version** : 2.1.2.
+ * **Project URL:** [http://www.github.com/sksamuel/aedile](http://www.github.com/sksamuel/aedile)
+ * **License:** [The Apache 2.0 License](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : com.soywiz.korlibs.korte. **Name** : korte-jvm. **Version** : 4.0.10.
+ * **Project URL:** [https://github.com/korlibs/korge-next](https://github.com/korlibs/korge-next)
+ * **License:** [MIT](https://raw.githubusercontent.com/korlibs/korge-next/master/korge/LICENSE.txt)
+
+1. **Group** : commons-beanutils. **Name** : commons-beanutils. **Version** : 1.9.4.
+ * **Project URL:** [https://commons.apache.org/proper/commons-beanutils/](https://commons.apache.org/proper/commons-beanutils/)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-codec. **Name** : commons-codec. **Version** : 1.16.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-codec/](https://commons.apache.org/proper/commons-codec/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : commons-collections. **Name** : commons-collections. **Version** : 3.2.2.
+ * **Project URL:** [http://commons.apache.org/collections/](http://commons.apache.org/collections/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : dev.drewhamilton.poko. **Name** : poko-annotations-jvm. **Version** : 0.17.1.
+ * **Project URL:** [https://github.com/drewhamilton/Poko](https://github.com/drewhamilton/Poko)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : info.picocli. **Name** : picocli. **Version** : 4.7.4.
+ * **Project URL:** [https://picocli.info](https://picocli.info)
+ * **License:** [The Apache Software License, version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.davidburstrom.contester. **Name** : contester-breakpoint. **Version** : 0.2.0.
+ * **Project URL:** [https://github.com/davidburstrom/contester](https://github.com/davidburstrom/contester)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.detekt.sarif4k. **Name** : sarif4k-jvm. **Version** : 0.6.0.
+ * **Project URL:** [https://detekt.github.io/detekt](https://detekt.github.io/detekt)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.github.eisop. **Name** : dataflow-errorprone. **Version** : 3.41.0-eisop1.
+ * **Project URL:** [https://eisop.github.io/](https://eisop.github.io/)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+
+1. **Group** : io.github.java-diff-utils. **Name** : java-diff-utils. **Version** : 4.12.
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-api. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-cli. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-core. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-metrics. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-parser. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-psi-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-html. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-md. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-sarif. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-txt. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-report-xml. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-complexity. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-coroutines. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-documentation. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-empty. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-errorprone. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-exceptions. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-naming. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-performance. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-rules-style. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-tooling. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.gitlab.arturbosch.detekt. **Name** : detekt-utils. **Version** : 1.23.8.
+ * **Project URL:** [https://detekt.dev](https://detekt.dev)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : io.grpc. **Name** : grpc-api. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-bom. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-context. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-core. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-inprocess. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-kotlin-stub. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/grpc/grpc-kotlin](https://github.com/grpc/grpc-kotlin)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-protobuf-lite. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.grpc. **Name** : grpc-stub. **Version** : 1.76.0.
+ * **Project URL:** [https://github.com/grpc/grpc-java](https://github.com/grpc/grpc-java)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-core-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-assertions-shared-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.kotest. **Name** : kotest-common-jvm. **Version** : 6.1.11.
+ * **Project URL:** [https://github.com/kotest/kotest](https://github.com/kotest/kotest)
+ * **License:** [Apache-2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : io.perfmark. **Name** : perfmark-api. **Version** : 0.27.0.
+ * **Project URL:** [https://github.com/perfmark/perfmark](https://github.com/perfmark/perfmark)
+ * **License:** [Apache 2.0](https://opensource.org/licenses/Apache-2.0)
+
+1. **Group** : javax.annotation. **Name** : javax.annotation-api. **Version** : 1.3.2.
+ * **Project URL:** [http://jcp.org/en/jsr/detail?id=250](http://jcp.org/en/jsr/detail?id=250)
+ * **License:** [CDDL + GPLv2 with classpath exception](https://github.com/javaee/javax.annotation/blob/master/LICENSE)
+
+1. **Group** : javax.inject. **Name** : javax.inject. **Version** : 1.
+ * **Project URL:** [http://code.google.com/p/atinject/](http://code.google.com/p/atinject/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : junit. **Name** : junit. **Version** : 4.13.2.
+ * **Project URL:** [http://junit.org](http://junit.org)
+ * **License:** [Eclipse Public License 1.0](http://www.eclipse.org/legal/epl-v10.html)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.2.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sf.saxon. **Name** : Saxon-HE. **Version** : 12.5.
+ * **Project URL:** [http://www.saxonica.com/](http://www.saxonica.com/)
+ * **License:** [Mozilla Public License Version 2.0](http://www.mozilla.org/MPL/2.0/)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-ant. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-core. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : net.sourceforge.pmd. **Name** : pmd-java. **Version** : 7.12.0.
+ * **License:** [BSD-style](http://pmd.sourceforge.net/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.11.1.
+ * **Project URL:** [https://www.antlr.org/](https://www.antlr.org/)
+ * **License:** [BSD-3-Clause](https://www.antlr.org/license.html)
+
+1. **Group** : org.antlr. **Name** : antlr4-runtime. **Version** : 4.9.3.
+ * **Project URL:** [http://www.antlr.org](http://www.antlr.org)
+ * **License:** [The BSD License](http://www.antlr.org/license.html)
+
+1. **Group** : org.apache.commons. **Name** : commons-lang3. **Version** : 3.17.0.
+ * **Project URL:** [https://commons.apache.org/proper/commons-lang/](https://commons.apache.org/proper/commons-lang/)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.client5. **Name** : httpclient5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.httpcomponents.core5. **Name** : httpcore5-h2. **Version** : 5.1.3.
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.logging.log4j. **Name** : log4j-api. **Version** : 2.20.0.
+ * **Project URL:** [https://www.apache.org/](https://www.apache.org/)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apache.logging.log4j. **Name** : log4j-core. **Version** : 2.20.0.
+ * **Project URL:** [https://www.apache.org/](https://www.apache.org/)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.apiguardian. **Name** : apiguardian-api. **Version** : 1.1.2.
+ * **Project URL:** [https://github.com/apiguardian-team/apiguardian](https://github.com/apiguardian-team/apiguardian)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.checkerframework. **Name** : checker-compat-qual. **Version** : 2.5.3.
+ * **Project URL:** [https://checkerframework.org](https://checkerframework.org)
+ * **License:** [GNU General Public License, version 2 (GPL2), with the classpath exception](http://www.gnu.org/software/classpath/license.html)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.checkerframework. **Name** : checker-qual. **Version** : 3.40.0.
+ * **Project URL:** [https://checkerframework.org/](https://checkerframework.org/)
+ * **License:** [The MIT License](http://opensource.org/licenses/MIT)
+
+1. **Group** : org.codehaus.mojo. **Name** : animal-sniffer-annotations. **Version** : 1.21.
+ * **License:** [MIT license](http://www.opensource.org/licenses/mit-license.php)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.codehaus.woodstox. **Name** : stax2-api. **Version** : 4.2.2.
+ * **Project URL:** [http://github.com/FasterXML/stax2-api](http://github.com/FasterXML/stax2-api)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [The BSD 2-Clause License](http://www.opensource.org/licenses/bsd-license.php)
+
+1. **Group** : org.freemarker. **Name** : freemarker. **Version** : 2.3.32.
+ * **Project URL:** [https://freemarker.apache.org/](https://freemarker.apache.org/)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.functionaljava. **Name** : functionaljava. **Version** : 4.8.
+ * **Project URL:** [http://functionaljava.org/](http://functionaljava.org/)
+ * **License:** [The BSD3 License](https://github.com/functionaljava/functionaljava/blob/master/etc/LICENCE)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.hamcrest. **Name** : hamcrest-core. **Version** : 3.0.
+ * **Project URL:** [http://hamcrest.org/JavaHamcrest/](http://hamcrest.org/JavaHamcrest/)
+ * **License:** [BSD-3-Clause](https://raw.githubusercontent.com/hamcrest/JavaHamcrest/master/LICENSE)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.agent. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.core. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.jacoco. **Name** : org.jacoco.report. **Version** : 0.8.13.
+ * **License:** [EPL-2.0](https://www.eclipse.org/legal/epl-2.0/)
+
+1. **Group** : org.javassist. **Name** : javassist. **Version** : 3.28.0-GA.
+ * **Project URL:** [http://www.javassist.org/](http://www.javassist.org/)
+ * **License:** [Apache License 2.0](http://www.apache.org/licenses/)
+ * **License:** [LGPL 2.1](http://www.gnu.org/licenses/lgpl-2.1.html)
+ * **License:** [MPL 1.1](http://www.mozilla.org/MPL/MPL-1.1.html)
+
+1. **Group** : org.jcommander. **Name** : jcommander. **Version** : 1.85.
+ * **Project URL:** [https://jcommander.org](https://jcommander.org)
+ * **License:** [Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : annotations. **Version** : 26.0.2.
+ * **Project URL:** [https://github.com/JetBrains/java-annotations](https://github.com/JetBrains/java-annotations)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains. **Name** : markdown-jvm. **Version** : 0.7.3.
+ * **Project URL:** [https://github.com/JetBrains/markdown](https://github.com/JetBrains/markdown)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-kotlin-symbols. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : analysis-markdown. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-base. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : dokka-core. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : javadoc-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : kotlin-as-java-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.dokka. **Name** : templating-plugin. **Version** : 2.2.0.
+ * **Project URL:** [https://github.com/Kotlin/dokka](https://github.com/Kotlin/dokka)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.intellij.deps. **Name** : trove4j. **Version** : 1.0.20200330.
+ * **Project URL:** [https://github.com/JetBrains/intellij-deps-trove4j](https://github.com/JetBrains/intellij-deps-trove4j)
+ * **License:** [GNU LESSER GENERAL PUBLIC LICENSE 2.1](https://www.gnu.org/licenses/old-licenses/lgpl-2.1.en.html)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : abi-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-bom. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-api. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-compat. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-cri-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-build-tools-impl. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-compiler-runner. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-client. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-daemon-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-abi-reader. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-klib-commonizer-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-metadata-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-reflect. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-script-runtime. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-compiler-impl-embeddable. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-scripting-jvm. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-common. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk7. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.0.21.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-stdlib-jdk8. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlin. **Name** : kotlin-tooling-core. **Version** : 2.3.20.
+ * **Project URL:** [https://kotlinlang.org/](https://kotlinlang.org/)
+ * **License:** [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : atomicfu-jvm. **Version** : 0.29.0.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.atomicfu](https://github.com/Kotlin/kotlinx.atomicfu)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-bom. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-core-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-jdk8. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-coroutines-test-jvm. **Version** : 1.10.2.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.coroutines](https://github.com/Kotlin/kotlinx.coroutines)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-datetime-jvm. **Version** : 0.7.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx-datetime](https://github.com/Kotlin/kotlinx-datetime)
+ * **License:** [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.8.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-html-jvm. **Version** : 0.9.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.html](https://github.com/Kotlin/kotlinx.html)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-core-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jetbrains.kotlinx. **Name** : kotlinx-serialization-json-jvm. **Version** : 1.4.1.
+ * **Project URL:** [https://github.com/Kotlin/kotlinx.serialization](https://github.com/Kotlin/kotlinx.serialization)
+ * **License:** [The Apache Software License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.jsoup. **Name** : jsoup. **Version** : 1.16.1.
+ * **Project URL:** [https://jsoup.org/](https://jsoup.org/)
+ * **License:** [The MIT License](https://jsoup.org/license)
+
+1. **Group** : org.jspecify. **Name** : jspecify. **Version** : 1.0.0.
+ * **Project URL:** [http://jspecify.org/](http://jspecify.org/)
+ * **License:** [The Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.junit. **Name** : junit-bom. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit-pioneer. **Name** : junit-pioneer. **Version** : 2.3.0.
+ * **Project URL:** [https://junit-pioneer.org/](https://junit-pioneer.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-api. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.jupiter. **Name** : junit-jupiter-params. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-commons. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-engine. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.junit.platform. **Name** : junit-platform-launcher. **Version** : 6.0.3.
+ * **Project URL:** [https://junit.org/](https://junit.org/)
+ * **License:** [Eclipse Public License v2.0](https://www.eclipse.org/legal/epl-v20.html)
+
+1. **Group** : org.opentest4j. **Name** : opentest4j. **Version** : 1.3.0.
+ * **Project URL:** [https://github.com/ota4j-team/opentest4j](https://github.com/ota4j-team/opentest4j)
+ * **License:** [The Apache License, Version 2.0](https://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-commons. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.ow2.asm. **Name** : asm-tree. **Version** : 9.6.
+ * **Project URL:** [http://asm.ow2.io/](http://asm.ow2.io/)
+ * **License:** [BSD-3-Clause](https://asm.ow2.io/license.html)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.1.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.pcollections. **Name** : pcollections. **Version** : 4.0.2.
+ * **Project URL:** [https://github.com/hrldcpr/pcollections](https://github.com/hrldcpr/pcollections)
+ * **License:** [The MIT License](https://opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.reflections. **Name** : reflections. **Version** : 0.10.2.
+ * **Project URL:** [http://github.com/ronmamo/reflections](http://github.com/ronmamo/reflections)
+ * **License:** [The Apache Software License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+ * **License:** [WTFPL](http://www.wtfpl.net/)
+
+1. **Group** : org.slf4j. **Name** : jul-to-slf4j. **Version** : 1.7.36.
+ * **Project URL:** [http://www.slf4j.org](http://www.slf4j.org)
+ * **License:** [MIT License](http://www.opensource.org/licenses/mit-license.php)
+
+1. **Group** : org.snakeyaml. **Name** : snakeyaml-engine. **Version** : 2.7.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml-engine](https://bitbucket.org/snakeyaml/snakeyaml-engine)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.1.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : org.xmlresolver. **Name** : xmlresolver. **Version** : 5.2.2.
+ * **Project URL:** [https://github.com/xmlresolver/xmlresolver](https://github.com/xmlresolver/xmlresolver)
+ * **License:** [Apache License version 2.0](https://www.apache.org/licenses/LICENSE-2.0)
+
+1. **Group** : org.yaml. **Name** : snakeyaml. **Version** : 2.4.
+ * **Project URL:** [https://bitbucket.org/snakeyaml/snakeyaml](https://bitbucket.org/snakeyaml/snakeyaml)
+ * **License:** [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.txt)
+
+
+The dependencies distributed under several licenses, are used according their commercial-use-friendly license.
+
+This report was generated on **Tue Apr 28 13:46:33 WEST 2026** using
[Gradle-License-Report plugin](https://github.com/jk1/Gradle-License-Report) by Evgeny Naumenko, licensed under
[Apache 2.0 License](https://github.com/jk1/Gradle-License-Report/blob/master/LICENSE).
\ No newline at end of file
diff --git a/gradle-plugin/build.gradle.kts b/gradle-plugin/build.gradle.kts
index 281300828..82ed55f30 100644
--- a/gradle-plugin/build.gradle.kts
+++ b/gradle-plugin/build.gradle.kts
@@ -24,6 +24,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+import io.spine.dependency.local.Compiler
import io.spine.dependency.local.Time
import io.spine.dependency.local.ToolBase
import io.spine.gradle.publish.addSourceAndDocJars
@@ -49,6 +50,7 @@ artifactMeta {
Time.javaExtensions(versionToPublish),
Time.kotlinExtensions(versionToPublish),
Time.testLib(versionToPublish),
+ Time.validation(versionToPublish),
)
excludeConfigurations {
containing(*buildToolConfigurations)
@@ -78,6 +80,7 @@ gradlePlugin {
dependencies {
compileOnly(gradleKotlinDsl())
+ implementation(Compiler.gradleApi)
implementation(ToolBase.gradlePluginApi)
implementation(ToolBase.jvmTools)
}
diff --git a/gradle-plugin/src/main/kotlin/io/spine/tools/time/gradle/TimeGradlePlugin.kt b/gradle-plugin/src/main/kotlin/io/spine/tools/time/gradle/TimeGradlePlugin.kt
index 2a383b9f7..d9b60fdf1 100644
--- a/gradle-plugin/src/main/kotlin/io/spine/tools/time/gradle/TimeGradlePlugin.kt
+++ b/gradle-plugin/src/main/kotlin/io/spine/tools/time/gradle/TimeGradlePlugin.kt
@@ -26,6 +26,7 @@
package io.spine.tools.time.gradle
+import io.spine.tools.compiler.gradle.api.addUserClasspathDependency
import io.spine.tools.gradle.DslSpec
import io.spine.tools.gradle.lib.LibraryPlugin
import io.spine.tools.gradle.lib.spineExtension
@@ -52,6 +53,7 @@ public class TimeGradlePlugin : LibraryPlugin(
override fun apply(project: Project) {
super.apply(project)
project.configureTime()
+ project.passValidationToCompiler()
}
}
@@ -70,6 +72,12 @@ private fun Project.configureTime() {
}
}
+private fun Project.passValidationToCompiler() {
+ pluginManager.withPlugin(TimeValidation.validationPluginId) {
+ addUserClasspathDependency(TimeValidation.artifact)
+ }
+}
+
private val Project.timeExtension: TimeGradleExtension
get() = spineExtension()
diff --git a/gradle-plugin/src/main/kotlin/io/spine/tools/time/gradle/TimeValidation.kt b/gradle-plugin/src/main/kotlin/io/spine/tools/time/gradle/TimeValidation.kt
new file mode 100644
index 000000000..fcecb06ac
--- /dev/null
+++ b/gradle-plugin/src/main/kotlin/io/spine/tools/time/gradle/TimeValidation.kt
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.time.gradle
+
+import io.spine.tools.meta.MavenArtifact
+import io.spine.tools.meta.Module
+
+/**
+ * The meta-information about the `time-validation` module.
+ *
+ * The artifact version is resolved from the metadata embedded in the
+ * `time-gradle-plugin` artifact at build time.
+ */
+internal object TimeValidation {
+
+ /**
+ * The plugin ID of the Spine Validation Gradle plugin.
+ */
+ const val validationPluginId: String = "io.spine.validation"
+
+ /**
+ * The Maven artifact for the `io.spine.tools:time-validation` module.
+ */
+ val artifact: MavenArtifact by lazy {
+ Meta.dependency(Module("io.spine.tools", "time-validation"))
+ }
+}
diff --git a/pom.xml b/pom.xml
index 4d0e62532..64877507f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,7 +10,7 @@ all modules and does not describe the project structure per-subproject.
-->
io.spine
spine-time
-2.0.0-SNAPSHOT.235
+2.0.0-SNAPSHOT.236
2015
@@ -50,25 +50,37 @@ all modules and does not describe the project structure per-subproject.
io.spine
spine-base
- 2.0.0-SNAPSHOT.386
+ 2.0.0-SNAPSHOT.387
compile
io.spine
spine-validation-jvm-runtime
- 2.0.0-SNAPSHOT.408
+ 2.0.0-SNAPSHOT.413
+ compile
+
+
+ io.spine.tools
+ compiler-gradle-api
+ 2.0.0-SNAPSHOT.043
+ compile
+
+
+ io.spine.tools
+ compiler-jvm
+ 2.0.0-SNAPSHOT.043
compile
io.spine.tools
gradle-plugin-api
- 2.0.0-SNAPSHOT.376
+ 2.0.0-SNAPSHOT.378
compile
io.spine.tools
jvm-tools
- 2.0.0-SNAPSHOT.376
+ 2.0.0-SNAPSHOT.378
compile
@@ -110,13 +122,25 @@ all modules and does not describe the project structure per-subproject.
io.kotest
kotest-assertions-core
- 6.1.10
+ 6.1.11
+ test
+
+
+ io.spine.tools
+ base-testlib
+ 2.0.0-SNAPSHOT.213
+ test
+
+
+ io.spine.tools
+ compiler-testlib
+ 2.0.0-SNAPSHOT.043
test
io.spine.tools
- spine-testlib
- 2.0.0-SNAPSHOT.211
+ logging-testlib
+ 2.0.0-SNAPSHOT.417
test
@@ -205,22 +229,22 @@ all modules and does not describe the project structure per-subproject.
io.spine.tools
compiler-cli-all
- 2.0.0-SNAPSHOT.041
+ 2.0.0-SNAPSHOT.043
io.spine.tools
compiler-protoc-plugin
- 2.0.0-SNAPSHOT.041
+ 2.0.0-SNAPSHOT.043
io.spine.tools
- core-jvm-gradle-plugins
- 2.0.0-SNAPSHOT.058
+ core-jvm-plugins
+ 2.0.0-SNAPSHOT.062
io.spine.tools
- core-jvm-routing
- 2.0.0-SNAPSHOT.058
+ prototap-protoc-plugin
+ 0.14.0
io.spine.tools
@@ -230,7 +254,7 @@ all modules and does not describe the project structure per-subproject.
io.spine.tools
validation-java-bundle
- 2.0.0-SNAPSHOT.408
+ 2.0.0-SNAPSHOT.413
net.sourceforge.pmd
@@ -266,32 +290,32 @@ all modules and does not describe the project structure per-subproject.
org.jetbrains.dokka
all-modules-page-plugin
- 2.1.0
+ 2.2.0
org.jetbrains.dokka
analysis-kotlin-symbols
- 2.1.0
+ 2.2.0
org.jetbrains.dokka
dokka-base
- 2.1.0
+ 2.2.0
org.jetbrains.dokka
dokka-core
- 2.1.0
+ 2.2.0
org.jetbrains.dokka
javadoc-plugin
- 2.1.0
+ 2.2.0
org.jetbrains.dokka
templating-plugin
- 2.1.0
+ 2.2.0
org.jetbrains.kotlin
diff --git a/settings.gradle.kts b/settings.gradle.kts
index e3ebd4081..052048022 100644
--- a/settings.gradle.kts
+++ b/settings.gradle.kts
@@ -1,5 +1,5 @@
/*
- * Copyright 2025, TeamDev. All rights reserved.
+ * Copyright 2026, TeamDev. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -40,4 +40,6 @@ include(
"time-kotlin",
"testlib",
"gradle-plugin",
+ "validation",
+ "validation-tests",
)
diff --git a/tests/Module.md b/tests/Module.md
new file mode 100644
index 000000000..ed76f7b33
--- /dev/null
+++ b/tests/Module.md
@@ -0,0 +1,7 @@
+# Module `tests`
+
+Integration tests for the `io.spine.time` Gradle plugin.
+
+This project is a standalone Gradle build that exercises the full plugin application:
+adding `spine-time` dependencies and passing the `time-validation` module to the Spine Compiler.
+It is executed from the root project via the `integrationTests` task.
diff --git a/tests/build.gradle.kts b/tests/build.gradle.kts
new file mode 100644
index 000000000..a300be47f
--- /dev/null
+++ b/tests/build.gradle.kts
@@ -0,0 +1,163 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+@file:Suppress("RemoveRedundantQualifierName") // To prevent IDEA replacing FQN imports.
+
+import io.spine.dependency.boms.BomsPlugin
+import io.spine.dependency.kotlinx.Coroutines
+import io.spine.dependency.lib.Grpc
+import io.spine.dependency.lib.Jackson
+import io.spine.dependency.lib.Kotlin
+import io.spine.dependency.local.Base
+import io.spine.dependency.local.Compiler
+import io.spine.dependency.local.Logging
+import io.spine.dependency.local.Reflect
+import io.spine.dependency.local.Time
+import io.spine.dependency.local.Validation
+import io.spine.gradle.kotlin.applyJvmToolchain
+import io.spine.gradle.kotlin.setFreeCompilerArgs
+import io.spine.gradle.publish.PublishingRepos.gitHub
+import io.spine.gradle.repo.standardToSpineSdk
+
+buildscript {
+ standardSpineSdkRepositories()
+ doForceVersions(configurations)
+
+ apply(from = "${rootDir}/../version.gradle.kts")
+ val versionToPublish = extra["versionToPublish"].toString()
+ dependencies {
+ classpath(io.spine.dependency.local.Validation.gradlePluginLib)
+ classpath(io.spine.dependency.local.Time.gradlePlugin(versionToPublish))
+ }
+
+ configurations {
+ all {
+ exclude(group = "io.spine", module = "spine-flogger-api")
+ exclude(group = "io.spine", module = "spine-logging-backend")
+
+ resolutionStrategy {
+ val jackson = io.spine.dependency.lib.Jackson
+ val cfg = this@all
+ val rs = this@resolutionStrategy
+ jackson.forceArtifacts(project, cfg, rs)
+ io.spine.dependency.lib.Jackson.DataType.forceArtifacts(project, cfg, rs)
+
+ io.spine.dependency.kotlinx.Coroutines.forceArtifacts(
+ project, this@all, this@resolutionStrategy
+ )
+ io.spine.dependency.lib.Grpc.forceArtifacts(
+ project, this@all, this@resolutionStrategy
+ )
+ force(
+ io.spine.dependency.lib.Kotlin.bom,
+ io.spine.dependency.lib.Jackson.annotations,
+ io.spine.dependency.lib.Grpc.bom,
+ io.spine.dependency.local.Base.annotations,
+ io.spine.dependency.local.Base.environment,
+ io.spine.dependency.local.Base.lib,
+ io.spine.dependency.local.Reflect.lib,
+ io.spine.dependency.local.Time.lib(versionToPublish),
+ io.spine.dependency.local.Time.javaExtensions(versionToPublish),
+ io.spine.dependency.local.Logging.lib,
+ io.spine.dependency.local.Logging.middleware,
+ io.spine.dependency.local.Validation.runtime,
+ io.spine.dependency.local.Compiler.api,
+ io.spine.dependency.local.Compiler.gradleApi,
+ io.spine.dependency.local.Compiler.params,
+ io.spine.dependency.local.Compiler.pluginLib,
+ )
+ }
+ }
+ }
+}
+
+plugins {
+ kotlin("jvm")
+ id("module-testing")
+ `java-test-fixtures`
+}
+apply(plugin ="io.spine.validation")
+apply(plugin ="io.spine.time")
+
+apply(from = "${rootDir}/../version.gradle.kts")
+
+group = "io.spine.tools"
+version = extra["versionToPublish"]!!
+
+repositories {
+ standardToSpineSdk()
+ gitHub("time")
+ mavenLocal()
+}
+
+apply()
+
+configurations {
+ forceVersions()
+ all {
+ exclude(group = "io.spine", module = "spine-validate")
+ exclude(group = "io.spine", module = "spine-flogger-api")
+ resolutionStrategy {
+ val cfg = this@all
+ val rs = this@resolutionStrategy
+ Jackson.forceArtifacts(project, cfg, rs)
+ Jackson.DataType.forceArtifacts(project, cfg, rs)
+ Jackson.DataFormat.forceArtifacts(project, cfg, rs)
+ Coroutines.forceArtifacts(project, cfg, rs)
+ Grpc.forceArtifacts(project, cfg, rs)
+ Kotlin.StdLib.forceArtifacts(project, cfg, rs)
+ force(
+ Kotlin.bom,
+ Jackson.annotations,
+ Grpc.bom,
+ Reflect.lib,
+ Base.lib,
+ Logging.lib,
+ Logging.middleware,
+ Logging.testLib,
+ Validation.runtime,
+ Compiler.api,
+ Time.lib(version.toString()),
+ Time.javaExtensions(version.toString()),
+ )
+ }
+ }
+}
+
+kotlin {
+ applyJvmToolchain(BuildSettings.javaVersion.asInt())
+ compilerOptions {
+ jvmTarget.set(BuildSettings.jvmTarget)
+ setFreeCompilerArgs()
+ }
+}
+
+dependencies {
+ testFixturesImplementation(Time.lib(version.toString()))
+ testFixturesImplementation(Validation.runtime)
+ testFixturesImplementation(Compiler.api)
+ testFixturesImplementation(Compiler.testlib)
+}
diff --git a/tests/buildSrc b/tests/buildSrc
new file mode 120000
index 000000000..053a423d7
--- /dev/null
+++ b/tests/buildSrc
@@ -0,0 +1 @@
+../buildSrc
\ No newline at end of file
diff --git a/tests/gradle.properties b/tests/gradle.properties
new file mode 120000
index 000000000..7677fb73b
--- /dev/null
+++ b/tests/gradle.properties
@@ -0,0 +1 @@
+../gradle.properties
\ No newline at end of file
diff --git a/tests/gradlew b/tests/gradlew
new file mode 120000
index 000000000..502f5a2d3
--- /dev/null
+++ b/tests/gradlew
@@ -0,0 +1 @@
+../gradlew
\ No newline at end of file
diff --git a/tests/gradlew.bat b/tests/gradlew.bat
new file mode 120000
index 000000000..284013288
--- /dev/null
+++ b/tests/gradlew.bat
@@ -0,0 +1 @@
+../gradlew.bat
\ No newline at end of file
diff --git a/tests/settings.gradle.kts b/tests/settings.gradle.kts
new file mode 100644
index 000000000..3f87ac031
--- /dev/null
+++ b/tests/settings.gradle.kts
@@ -0,0 +1,35 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+pluginManagement {
+ repositories {
+ gradlePluginPortal()
+ mavenLocal()
+ mavenCentral()
+ }
+}
+
+rootProject.name = "time-tests"
diff --git a/tests/src/test/kotlin/io/spine/tools/time/validation/java/Assertions.kt b/tests/src/test/kotlin/io/spine/tools/time/validation/java/Assertions.kt
new file mode 100644
index 000000000..2425ede43
--- /dev/null
+++ b/tests/src/test/kotlin/io/spine/tools/time/validation/java/Assertions.kt
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.time.validation.java
+
+import com.google.errorprone.annotations.CanIgnoreReturnValue
+import com.google.protobuf.Message
+import io.kotest.matchers.collections.shouldHaveSize
+import io.kotest.matchers.shouldNotBe
+import io.spine.validation.ConstraintViolation
+import io.spine.validation.ValidationException
+import org.junit.jupiter.api.Assertions.fail
+import org.junit.jupiter.api.assertDoesNotThrow
+import org.junit.jupiter.api.assertThrows
+
+@CanIgnoreReturnValue
+internal fun assertValidationException(builder: Message.Builder): ConstraintViolation {
+ val exception = assertThrows {
+ builder.build()
+ }
+ val error = exception.asMessage()
+ error.constraintViolationList shouldHaveSize 1
+ return error.constraintViolationList[0]
+}
+
+internal fun assertNoException(builder: Message.Builder) {
+ try {
+ assertDoesNotThrow {
+ val result = builder.build()
+ result shouldNotBe null
+ }
+ } catch (e: ValidationException) {
+ fail("Unexpected constraint violation: " + e.constraintViolations, e)
+ }
+}
+
+internal fun assertValidationFails(executable: () -> Unit) {
+ assertThrows { executable() }
+}
+
+internal fun assertValidationPasses(executable: () -> Unit) {
+ assertDoesNotThrow(executable)
+}
diff --git a/tests/src/test/kotlin/io/spine/tools/time/validation/java/ProtoTimestampWhenSpec.kt b/tests/src/test/kotlin/io/spine/tools/time/validation/java/ProtoTimestampWhenSpec.kt
new file mode 100644
index 000000000..b124f1423
--- /dev/null
+++ b/tests/src/test/kotlin/io/spine/tools/time/validation/java/ProtoTimestampWhenSpec.kt
@@ -0,0 +1,238 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.time.validation.java
+
+import com.google.protobuf.Duration
+import com.google.protobuf.Timestamp
+import com.google.protobuf.util.Durations.fromMillis
+import com.google.protobuf.util.Timestamps
+import io.spine.test.tools.validate.anyProtoTimestamp
+import io.spine.test.tools.validate.anyProtoTimestamps
+import io.spine.test.tools.validate.futureProtoTimestamp
+import io.spine.test.tools.validate.futureProtoTimestamps
+import io.spine.test.tools.validate.pastProtoTimestamp
+import io.spine.test.tools.validate.pastProtoTimestamps
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Nested
+import org.junit.jupiter.api.Test
+
+@DisplayName("If used with Protobuf `Timestamp`, `(when)` constrain should")
+internal class ProtoTimestampWhenSpec {
+
+ @Nested inner class
+ `when given a timestamp denoting` {
+
+ @Nested inner class
+ `the past` {
+
+ @Test
+ fun `throw, if restricted to be in future`() = assertValidationFails {
+ futureProtoTimestamp {
+ value = pastTime()
+ }
+ }
+
+ @Test
+ fun `pass, if restricted to be in past`() = assertValidationPasses {
+ pastProtoTimestamp {
+ value = pastTime()
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anyProtoTimestamp {
+ value = pastTime()
+ }
+ }
+ }
+
+ @Nested inner class
+ `the future` {
+
+ @Test
+ fun `throw, if restricted to be in past`() = assertValidationFails {
+ pastProtoTimestamp {
+ value = futureTime()
+ }
+ }
+
+ @Test
+ fun `pass, if restricted to be in future`() = assertValidationPasses {
+ futureProtoTimestamp {
+ value = futureTime()
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anyProtoTimestamp {
+ value = futureTime()
+ }
+ }
+ }
+ }
+
+ @Nested inner class
+ `when given several timestamps` {
+
+ @Nested inner class
+ `denoting only the past` {
+
+ private val severalPastTimes = listOf(pastTime(), pastTime(), pastTime())
+
+ @Test
+ fun `throw, if restricted to be in future`() = assertValidationFails {
+ futureProtoTimestamps {
+ value.addAll(severalPastTimes)
+ }
+ }
+
+ @Test
+ fun `pass, if restricted to be in past`() = assertValidationPasses {
+ pastProtoTimestamps {
+ value.addAll(severalPastTimes)
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anyProtoTimestamps {
+ value.addAll(severalPastTimes)
+ }
+ }
+ }
+
+ @Nested inner class
+ `denoting only the future` {
+
+ private val severalFutureTimes = listOf(futureTime(), futureTime(), futureTime())
+
+ @Test
+ fun `throw, if restricted to be in past`() = assertValidationFails {
+ pastProtoTimestamps {
+ value.addAll(severalFutureTimes)
+ }
+ }
+
+ @Test
+ fun `pass, if restricted to be in future`() = assertValidationPasses {
+ futureProtoTimestamps {
+ value.addAll(severalFutureTimes)
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anyProtoTimestamps {
+ value.addAll(severalFutureTimes)
+ }
+ }
+ }
+
+ @Nested inner class
+ `with a single past stamp within the future stamps` {
+
+ private val severalFutureAndPast = listOf(futureTime(), pastTime(), futureTime())
+
+ @Test
+ fun `throw, if restricted to be in future`() = assertValidationFails {
+ futureProtoTimestamps {
+ value.addAll(severalFutureAndPast)
+ }
+ }
+
+ @Test
+ fun `throw, if restricted to be in past`() = assertValidationFails {
+ pastProtoTimestamps {
+ value.addAll(severalFutureAndPast)
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anyProtoTimestamps {
+ value.addAll(severalFutureAndPast)
+ }
+ }
+ }
+
+ @Nested inner class
+ `with a single future stamp within the past stamps` {
+
+ private val severalPastAndFuture = listOf(pastTime(), futureTime(), pastTime())
+
+ @Test
+ fun `throw, if restricted to be in future`() = assertValidationFails {
+ futureProtoTimestamps {
+ value.addAll(severalPastAndFuture)
+ }
+ }
+
+ @Test
+ fun `throw, if restricted to be in past`() = assertValidationFails {
+ pastProtoTimestamps {
+ value.addAll(severalPastAndFuture)
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anyProtoTimestamps {
+ value.addAll(severalPastAndFuture)
+ }
+ }
+ }
+ }
+}
+
+private fun pastTime(): Timestamp {
+ val current = Timestamps.now()
+ val past = Timestamps.subtract(current, HALF_OF_SECONDS)
+ return past
+}
+
+private fun futureTime(): Timestamp {
+ val current = Timestamps.now()
+ val future = Timestamps.add(current, HALF_OF_SECONDS)
+ return future
+}
+
+/**
+ * Protobuf [Duration] of five hundred milliseconds.
+ *
+ * To shift the time into the past or future, we add or subtract a difference of this amount.
+ *
+ * There are two reasons for choosing 500 milliseconds:
+ *
+ * 1. The generated code uses `io.spine.base.Time.currentTime()` to get the current timestamp
+ * for comparison. In turn, this method relies on `io.spine.base.Time.SystemTimeProvider`
+ * by default, which has millisecond precision.
+ * 2. Adding too small amount of time to make the stamp denote "future" might be unreliable.
+ * As it could catch up `now` by the time `Time.currentTime()` is invoked.
+ */
+private val HALF_OF_SECONDS: Duration = fromMillis(500)
diff --git a/tests/src/test/kotlin/io/spine/tools/time/validation/java/SpineTemporalWhenSpec.kt b/tests/src/test/kotlin/io/spine/tools/time/validation/java/SpineTemporalWhenSpec.kt
new file mode 100644
index 000000000..5f4115c37
--- /dev/null
+++ b/tests/src/test/kotlin/io/spine/tools/time/validation/java/SpineTemporalWhenSpec.kt
@@ -0,0 +1,239 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.time.validation.java
+
+import io.spine.test.tools.validate.anySpineTemporal
+import io.spine.test.tools.validate.anySpineTemporals
+import io.spine.test.tools.validate.futureSpineTemporal
+import io.spine.test.tools.validate.futureSpineTemporals
+import io.spine.test.tools.validate.pastSpineTemporal
+import io.spine.test.tools.validate.pastSpineTemporals
+import io.spine.time.LocalDateTimes
+import java.time.Instant
+import java.time.LocalDateTime.ofInstant
+import java.time.ZoneOffset.UTC
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Nested
+import org.junit.jupiter.api.Test
+import io.spine.time.LocalDateTime as SpineTimeLocalDateTime
+
+@DisplayName("If used with Spine `Temporal`, `(when)` constraint should")
+internal class SpineTemporalWhenSpec {
+
+ @Nested inner class
+ `when given a temporal denoting` {
+
+ @Nested inner class
+ `the past` {
+
+ @Test
+ fun `throw, if restricted to be in future`() = assertValidationFails {
+ futureSpineTemporal {
+ value = pastTime()
+ }
+ }
+
+ @Test
+ fun `pass, if restricted to be in past`() = assertValidationPasses {
+ pastSpineTemporal {
+ value = pastTime()
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anySpineTemporal {
+ value = pastTime()
+ }
+ }
+ }
+
+ @Nested inner class
+ `the future` {
+
+ @Test
+ fun `throw, if restricted to be in past`() = assertValidationFails {
+ pastSpineTemporal {
+ value = futureTime()
+ }
+ }
+
+ @Test
+ fun `pass, if restricted to be in future`() = assertValidationPasses {
+ futureSpineTemporal {
+ value = futureTime()
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anySpineTemporal {
+ value = futureTime()
+ }
+ }
+ }
+ }
+
+ @Nested inner class
+ `when given several times` {
+
+ @Nested inner class
+ `denoting only the past` {
+
+ private val severalPastTimes = listOf(pastTime(), pastTime(), pastTime())
+
+ @Test
+ fun `throw, if restricted to be in future`() = assertValidationFails {
+ futureSpineTemporals {
+ value.addAll(severalPastTimes)
+ }
+ }
+
+ @Test
+ fun `pass, if restricted to be in past`() = assertValidationPasses {
+ pastSpineTemporals {
+ value.addAll(severalPastTimes)
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anySpineTemporals {
+ value.addAll(severalPastTimes)
+ }
+ }
+ }
+
+ @Nested inner class
+ `denoting only the future` {
+
+ private val severalFutureTimes = listOf(futureTime(), futureTime(), futureTime())
+
+ @Test
+ fun `throw, if restricted to be in past`() = assertValidationFails {
+ pastSpineTemporals {
+ value.addAll(severalFutureTimes)
+ }
+ }
+
+ @Test
+ fun `pass, if restricted to be in future`() = assertValidationPasses {
+ futureSpineTemporals {
+ value.addAll(severalFutureTimes)
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anySpineTemporals {
+ value.addAll(severalFutureTimes)
+ }
+ }
+ }
+
+ @Nested inner class
+ `with a single past time within the future times` {
+
+ private val severalFutureAndPast = listOf(futureTime(), pastTime(), futureTime())
+
+ @Test
+ fun `throw, if restricted to be in future`() = assertValidationFails {
+ futureSpineTemporals {
+ value.addAll(severalFutureAndPast)
+ }
+ }
+
+ @Test
+ fun `throw, if restricted to be in past`() = assertValidationFails {
+ pastSpineTemporals {
+ value.addAll(severalFutureAndPast)
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anySpineTemporals {
+ value.addAll(severalFutureAndPast)
+ }
+ }
+ }
+
+ @Nested inner class
+ `with a single future time within the past times` {
+
+ private val severalPastAndFuture = listOf(pastTime(), futureTime(), pastTime())
+
+ @Test
+ fun `throw, if restricted to be in future`() = assertValidationFails {
+ futureSpineTemporals {
+ value.addAll(severalPastAndFuture)
+ }
+ }
+
+ @Test
+ fun `throw, if restricted to be in past`() = assertValidationFails {
+ pastSpineTemporals {
+ value.addAll(severalPastAndFuture)
+ }
+ }
+
+ @Test
+ fun `pass, if not restricted at all`() = assertValidationPasses {
+ anySpineTemporals {
+ value.addAll(severalPastAndFuture)
+ }
+ }
+ }
+ }
+}
+
+private fun pastTime(): SpineTimeLocalDateTime {
+ val current = Instant.now() // It is a UTC stamp.
+ val past = current.minusMillis(HALF_OF_SECOND)
+ return LocalDateTimes.of(ofInstant(past, UTC))
+}
+
+private fun futureTime(): SpineTimeLocalDateTime {
+ val current = Instant.now() // It is a UTC stamp.
+ val past = current.plusMillis(HALF_OF_SECOND)
+ return LocalDateTimes.of(ofInstant(past, UTC))
+}
+
+/**
+ * Five hundred milliseconds.
+ *
+ * To shift the time into the past or future, we add or subtract a difference of this amount.
+ *
+ * There are two reasons for choosing 500 milliseconds:
+ *
+ * 1. The generated code uses `io.spine.base.Time.currentTime()` to get the current timestamp
+ * for comparison. In turn, this method relies on `io.spine.base.Time.SystemTimeProvider`
+ * by default, which has millisecond precision.
+ * 2. Adding too small amount of time to make the stamp denote "future" might be unreliable.
+ * As it could catch up `now` by the time `Time.currentTime()` is invoked.
+ */
+private const val HALF_OF_SECOND: Long = 500
diff --git a/tests/src/test/kotlin/io/spine/tools/time/validation/java/WhenRuleITest.kt b/tests/src/test/kotlin/io/spine/tools/time/validation/java/WhenRuleITest.kt
new file mode 100644
index 000000000..af45e97c0
--- /dev/null
+++ b/tests/src/test/kotlin/io/spine/tools/time/validation/java/WhenRuleITest.kt
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.time.validation.java
+
+import com.google.protobuf.util.Timestamps
+import io.spine.validation.test.Player
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+
+@DisplayName("`(when)` rule should")
+internal class WhenRuleITest {
+
+ @Test
+ fun `prohibit invalid timestamp`() {
+ val startWhen = Timestamps.fromSeconds(4792687200L) // 15 Nov 2121
+ val player = Player.newBuilder()
+ .setStartedCareerIn(startWhen)
+ assertValidationException(player)
+ }
+
+ @Test
+ fun `allow valid timestamp`() {
+ val timestamp = Timestamps.fromSeconds(59086800L) // 15 Nov 1971
+ val player = Player.newBuilder()
+ .setStartedCareerIn(timestamp)
+ assertNoException(player)
+ }
+}
diff --git a/tests/src/testFixtures/proto/spine/test/tools/validate/when.proto b/tests/src/testFixtures/proto/spine/test/tools/validate/when.proto
new file mode 100644
index 000000000..39da9a34c
--- /dev/null
+++ b/tests/src/testFixtures/proto/spine/test/tools/validate/when.proto
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+syntax = "proto3";
+
+package spine.test.tools.validate;
+
+import "spine/options.proto";
+import "spine/time_options.proto";
+
+option (type_url_prefix) = "type.spine.io";
+option java_package = "io.spine.test.tools.validate";
+option java_outer_classname = "WhenProto";
+option java_multiple_files = true;
+
+import "google/protobuf/timestamp.proto";
+import "spine/time/time.proto";
+
+// Tests `PAST` restriction with a Protobuf timestamp.
+message PastProtoTimestamp {
+ google.protobuf.Timestamp value = 1 [(when).in = PAST];
+}
+
+// Tests `PAST` restriction with a Spine temporal.
+message PastSpineTemporal {
+ spine.time.LocalDateTime value = 1 [(when).in = PAST];
+}
+
+// Tests `FUTURE` restriction with a Protobuf timestamp.
+message FutureProtoTimestamp {
+ google.protobuf.Timestamp value = 1 [(when).in = FUTURE];
+}
+
+// Tests `FUTURE` restriction with a Spine temporal.
+message FutureSpineTemporal {
+ spine.time.LocalDateTime value = 1 [(when).in = FUTURE];
+}
+
+// Tests that a Protobuf timestamp is not restricted when there's no option.
+message AnyProtoTimestamp {
+ google.protobuf.Timestamp value = 1;
+}
+
+// Tests that a Spine temporal is not restricted when there's no option.
+message AnySpineTemporal {
+ spine.time.LocalDateTime value = 1;
+}
diff --git a/tests/src/testFixtures/proto/spine/test/tools/validate/when_repeated.proto b/tests/src/testFixtures/proto/spine/test/tools/validate/when_repeated.proto
new file mode 100644
index 000000000..c2148c621
--- /dev/null
+++ b/tests/src/testFixtures/proto/spine/test/tools/validate/when_repeated.proto
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+syntax = "proto3";
+
+package spine.test.tools.validate;
+
+import "spine/options.proto";
+import "spine/time_options.proto";
+
+option (type_url_prefix) = "type.spine.io";
+option java_package = "io.spine.test.tools.validate";
+option java_outer_classname = "WhenRepeatedProto";
+option java_multiple_files = true;
+
+import "google/protobuf/timestamp.proto";
+import "spine/time/time.proto";
+
+// Tests `PAST` restriction with a repeated Protobuf timestamp.
+message PastProtoTimestamps {
+ repeated google.protobuf.Timestamp value = 1 [(when).in = PAST];
+}
+
+// Tests `PAST` restriction with a repeated Spine temporal.
+message PastSpineTemporals {
+ repeated spine.time.LocalDateTime value = 1 [(when).in = PAST];
+}
+
+// Tests `FUTURE` restriction with a repeated Protobuf timestamp.
+message FutureProtoTimestamps {
+ repeated google.protobuf.Timestamp value = 1 [(when).in = FUTURE];
+}
+
+// Tests `FUTURE` restriction with a repeated Spine temporal.
+message FutureSpineTemporals {
+ repeated spine.time.LocalDateTime value = 1 [(when).in = FUTURE];
+}
+
+// Tests that a repeated Protobuf timestamp is not restricted when there's no option.
+message AnyProtoTimestamps {
+ repeated google.protobuf.Timestamp value = 1;
+}
+
+// Tests that a repeated Spine temporal is not restricted when there's no option.
+message AnySpineTemporals {
+ repeated spine.time.LocalDateTime value = 1;
+}
diff --git a/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt b/tests/src/testFixtures/proto/test/football.proto
similarity index 74%
rename from buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt
rename to tests/src/testFixtures/proto/test/football.proto
index 826f86853..95bd06f3c 100644
--- a/buildSrc/src/main/kotlin/io/spine/dependency/build/LicenseReport.kt
+++ b/tests/src/testFixtures/proto/test/football.proto
@@ -24,17 +24,21 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-package io.spine.dependency.build
+syntax = "proto3";
-// https://github.com/jk1/Gradle-License-Report
-@Suppress("unused")
-object LicenseReport {
- private const val version = "3.0.1"
- const val lib = "com.github.jk1:gradle-license-report:$version"
+package spine.validation.test;
- object GradlePlugin {
- const val version = LicenseReport.version
- const val id = "com.github.jk1.dependency-license-report"
- const val lib = LicenseReport.lib
- }
+import "spine/options.proto";
+import "spine/time_options.proto";
+
+option (type_url_prefix) = "type.spine.io";
+option java_package = "io.spine.validation.test";
+option java_outer_classname = "FootballProto";
+option java_multiple_files = true;
+
+import "google/protobuf/timestamp.proto";
+
+message Player {
+
+ google.protobuf.Timestamp started_career_in = 1 [(when).in = PAST];
}
diff --git a/validation-tests/Module.md b/validation-tests/Module.md
new file mode 100644
index 000000000..56a223b9d
--- /dev/null
+++ b/validation-tests/Module.md
@@ -0,0 +1,5 @@
+# Module `validation-tests`
+
+This is a test-only module that verifies compilation using Protobuf files
+in the `testFixtures` source set. The module is based on Prototap and verifies
+the handling of errors in using time-related validation options, such as `(when)`.
diff --git a/validation-tests/build.gradle.kts b/validation-tests/build.gradle.kts
new file mode 100644
index 000000000..63ab688fe
--- /dev/null
+++ b/validation-tests/build.gradle.kts
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import io.spine.dependency.boms.BomsPlugin
+import io.spine.dependency.lib.Protobuf
+import io.spine.dependency.local.Base
+import io.spine.dependency.local.Compiler
+import io.spine.dependency.local.Logging
+import io.spine.dependency.local.Validation
+import io.spine.gradle.report.license.LicenseReporter
+
+plugins {
+ kotlin("jvm")
+ module
+ id("module-testing")
+ protobuf
+ `java-test-fixtures`
+ prototap
+}
+apply()
+LicenseReporter.generateReportIn(project)
+
+dependencies {
+ implementation(Validation.javaBundle)
+ implementation(project(":validation"))
+
+ testImplementation(Logging.testLib)?.because("We need `tapConsole`.")
+ testImplementation(Compiler.testlib)
+
+ testFixturesImplementation(Base.lib)?.because("The `io.spine.option` package is needed.")
+ testFixturesImplementation(project(":time"))?.because("We need `TimeOptionsProto`.")
+}
+
+protobuf {
+ protoc { artifact = Protobuf.compiler }
+}
diff --git a/validation-tests/src/test/kotlin/io/spine/tools/time/validation/CompilationErrorTest.kt b/validation-tests/src/test/kotlin/io/spine/tools/time/validation/CompilationErrorTest.kt
new file mode 100644
index 000000000..12cf445f9
--- /dev/null
+++ b/validation-tests/src/test/kotlin/io/spine/tools/time/validation/CompilationErrorTest.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.time.validation
+
+import io.spine.testing.compiler.AbstractCompilationErrorTest
+import io.spine.tools.compiler.plugin.Plugin
+import io.spine.tools.validation.java.JavaValidationPlugin
+
+/**
+ * An abstract base for compilation error tests of [JavaValidationPlugin].
+ */
+internal abstract class CompilationErrorTest : AbstractCompilationErrorTest() {
+
+ override fun plugins(): List = listOf(
+ object : JavaValidationPlugin() {}
+ )
+}
diff --git a/validation-tests/src/test/kotlin/io/spine/tools/time/validation/WhenReactionSpec.kt b/validation-tests/src/test/kotlin/io/spine/tools/time/validation/WhenReactionSpec.kt
new file mode 100644
index 000000000..366035a39
--- /dev/null
+++ b/validation-tests/src/test/kotlin/io/spine/tools/time/validation/WhenReactionSpec.kt
@@ -0,0 +1,93 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.time.validation
+
+import io.kotest.matchers.string.shouldContain
+import io.kotest.matchers.string.shouldInclude
+import io.spine.tools.compiler.ast.name
+import io.spine.tools.compiler.ast.qualifiedName
+import io.spine.tools.compiler.protobuf.field
+import io.spine.tools.time.validation.java.WhenOption
+import io.spine.tools.validation.given.WhenBoolField
+import io.spine.tools.validation.given.WhenInt32Field
+import io.spine.tools.validation.given.WhenStringField
+import io.spine.tools.validation.given.WhenWithInvalidPlaceholders
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+
+@DisplayName("`WhenReaction` should reject")
+internal class WhenReactionSpec : CompilationErrorTest() {
+
+ @Test
+ fun `option on a boolean field`() {
+ val message = WhenBoolField.getDescriptor()
+ val error = assertCompilationFails(message)
+ val field = message.field("value")
+ error.message.run {
+ shouldContain(field.type.name)
+ shouldContain(field.qualifiedName)
+ shouldContain("is not supported")
+ }
+ }
+
+ @Test
+ fun `option on an integer field`() {
+ val message = WhenInt32Field.getDescriptor()
+ val error = assertCompilationFails(message)
+ val field = message.field("value")
+ error.message.run {
+ shouldContain(field.type.name)
+ shouldContain(field.qualifiedName)
+ shouldContain("is not supported")
+ }
+ }
+
+ @Test
+ fun `option on a string field`() {
+ val message = WhenStringField.getDescriptor()
+ val error = assertCompilationFails(message)
+ val field = message.field("value")
+ error.message.run {
+ shouldContain(field.type.name)
+ shouldContain(field.qualifiedName)
+ shouldContain("is not supported")
+ }
+ }
+
+ @Test
+ fun `the error message with unsupported placeholders`() {
+ val message = WhenWithInvalidPlaceholders.getDescriptor()
+ val error = assertCompilationFails(message)
+ val field = message.field("value")
+ error.message.run {
+ shouldContain(field.qualifiedName)
+ shouldContain(WhenOption.NAME)
+ shouldContain("unsupported placeholders")
+ shouldInclude("[when]")
+ }
+ }
+}
diff --git a/validation-tests/src/test/kotlin/io/spine/tools/time/validation/java/WhenOptionSpec.kt b/validation-tests/src/test/kotlin/io/spine/tools/time/validation/java/WhenOptionSpec.kt
new file mode 100644
index 000000000..694d4e11f
--- /dev/null
+++ b/validation-tests/src/test/kotlin/io/spine/tools/time/validation/java/WhenOptionSpec.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.time.validation.java
+
+import io.kotest.matchers.shouldBe
+import io.spine.time.validation.TimeOptionsProto
+import org.junit.jupiter.api.DisplayName
+import org.junit.jupiter.api.Test
+
+@DisplayName("`WhenOption` should")
+internal class WhenOptionSpec {
+
+ @Test
+ fun `have the name matching the descriptor name`() {
+ WhenOption.NAME shouldBe TimeOptionsProto.`when`.descriptor.name
+ }
+}
diff --git a/validation-tests/src/testFixtures/proto/spine/validation/stubs/when_option_spec.proto b/validation-tests/src/testFixtures/proto/spine/validation/stubs/when_option_spec.proto
new file mode 100644
index 000000000..3c59b33a3
--- /dev/null
+++ b/validation-tests/src/testFixtures/proto/spine/validation/stubs/when_option_spec.proto
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+syntax = "proto3";
+
+package spine.validation.stubs;
+
+import "spine/options.proto";
+import "spine/time_options.proto";
+
+import "google/protobuf/timestamp.proto";
+
+option (type_url_prefix) = "type.spine.io";
+option java_package = "io.spine.tools.validation.given";
+option java_outer_classname = "WhenOptionSpecProto";
+option java_multiple_files = true;
+
+// Provides a boolean field with the inapplicable `(when)` option.
+message WhenBoolField {
+ bool value = 1 [(when).in = FUTURE];
+}
+
+// Provides an int32 field with the inapplicable `(when)` option.
+message WhenInt32Field {
+ int32 value = 1 [(when).in = FUTURE];
+}
+
+// Provides a string field with the inapplicable `(when)` option.
+message WhenStringField {
+ string value = 1 [(when).in = PAST];
+}
+
+// Provides a `(when)` field that specifies a custom error message using
+// the placeholders not supported by the option.
+message WhenWithInvalidPlaceholders {
+ google.protobuf.Timestamp value = 1 [(when) = {
+ in: PAST,
+ error_msg: "The field value `${field.value}` must be in `${when}`."
+ }];
+}
diff --git a/validation/Module.md b/validation/Module.md
new file mode 100644
index 000000000..9d2f125f0
--- /dev/null
+++ b/validation/Module.md
@@ -0,0 +1,7 @@
+# Module `validation`
+
+Implements time-related validation options for the Spine Compiler.
+
+Provides the `(when)` option via [WhenOption][io.spine.tools.time.validation.java.WhenOption],
+a [ValidationOption][io.spine.tools.validation.java.ValidationOption] that constrains timestamp
+and temporal fields to be in the past or future.
diff --git a/validation/build.gradle.kts b/validation/build.gradle.kts
new file mode 100644
index 000000000..98a171344
--- /dev/null
+++ b/validation/build.gradle.kts
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+import groovy.util.Node
+import io.spine.dependency.local.Compiler
+import io.spine.dependency.local.Validation
+import io.spine.gradle.publish.addSourceAndDocJars
+
+plugins {
+ protobuf
+ module
+ `maven-publish`
+ id(coreJvmCompiler.pluginId)
+}
+
+group = "io.spine.tools"
+
+dependencies {
+ implementation(Compiler.jvm)
+ implementation(Validation.javaBundle)
+ implementation(project(":time"))
+}
+
+configurations.all {
+ resolutionStrategy.dependencySubstitution {
+ substitute(module("io.spine:spine-time"))
+ .using(project(":time"))
+ substitute(module("io.spine:spine-time-java"))
+ .using(project(":time-java"))
+ substitute(module("io.spine:spine-time-kotlin"))
+ .using(project(":time-kotlin"))
+ }
+}
+
+publishing {
+ publications {
+ create("mavenJava") {
+ // `groupId`, `artifactId` and `version` are filled in by `CustomPublicationHandler`.
+ artifact(tasks.named("jar"))
+ // Declare no dependencies because they are going to be available via the
+ // classpath of the Validation Java plugin to which this module is plugged in
+ // via the `ValidationOption` service API.
+ pom.withXml {
+ Node(asNode(), "dependencies")
+ }
+ addSourceAndDocJars(project)
+ }
+ }
+}
+
+spineCompilerRemoteDebug(enabled = false)
diff --git a/validation/src/main/kotlin/io/spine/tools/time/validation/java/WhenGenerator.kt b/validation/src/main/kotlin/io/spine/tools/time/validation/java/WhenGenerator.kt
new file mode 100644
index 000000000..34ef9f9d0
--- /dev/null
+++ b/validation/src/main/kotlin/io/spine/tools/time/validation/java/WhenGenerator.kt
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.time.validation.java
+
+import io.spine.base.FieldPath
+import io.spine.server.query.select
+import io.spine.time.validation.Time.FUTURE
+import io.spine.tools.compiler.ast.TypeName
+import io.spine.tools.compiler.ast.isRepeatedMessage
+import io.spine.tools.compiler.ast.name
+import io.spine.tools.compiler.jvm.CodeBlock
+import io.spine.tools.compiler.jvm.Expression
+import io.spine.tools.compiler.jvm.JavaValueConverter
+import io.spine.tools.compiler.jvm.ReadVar
+import io.spine.tools.compiler.jvm.StringLiteral
+import io.spine.tools.compiler.jvm.call
+import io.spine.tools.compiler.jvm.field
+import io.spine.tools.time.validation.TimeFieldType.TFT_TEMPORAL
+import io.spine.tools.time.validation.TimeFieldType.TFT_TIMESTAMP
+import io.spine.tools.time.validation.WhenField
+import io.spine.tools.validation.ErrorPlaceholder
+import io.spine.tools.validation.ErrorPlaceholder.FIELD_PATH
+import io.spine.tools.validation.ErrorPlaceholder.FIELD_TYPE
+import io.spine.tools.validation.ErrorPlaceholder.FIELD_VALUE
+import io.spine.tools.validation.ErrorPlaceholder.PARENT_TYPE
+import io.spine.tools.validation.ErrorPlaceholder.WHEN_IN
+import io.spine.tools.validation.java.expression.EmptyFieldCheck
+import io.spine.tools.validation.java.expression.JsonExtensionsClass
+import io.spine.tools.validation.java.expression.SpineTime
+import io.spine.tools.validation.java.expression.TimestampsClass
+import io.spine.tools.validation.java.expression.constraintViolation
+import io.spine.tools.validation.java.expression.joinToString
+import io.spine.tools.validation.java.expression.orElse
+import io.spine.tools.validation.java.expression.resolve
+import io.spine.tools.validation.java.expression.stringify
+import io.spine.tools.validation.java.expression.templateString
+import io.spine.tools.validation.java.generate.MessageScope.message
+import io.spine.tools.validation.java.generate.OptionGeneratorWithConverter
+import io.spine.tools.validation.java.generate.SingleOptionCode
+import io.spine.tools.validation.java.generate.ValidateScope.parentName
+import io.spine.tools.validation.java.generate.ValidateScope.parentPath
+import io.spine.tools.validation.java.generate.ValidateScope.violations
+import io.spine.validation.ConstraintViolation
+
+/**
+ * The generator for the `(when)` option.
+ */
+internal class WhenGenerator : OptionGeneratorWithConverter() {
+
+ /**
+ * All `(when)` fields in the current compilation process.
+ */
+ private val allWhenFields by lazy {
+ querying.select()
+ .all()
+ }
+
+ override fun codeFor(type: TypeName): List =
+ allWhenFields
+ .filter { it.id.type == type }
+ .map { GenerateWhen(it, converter).code() }
+}
+
+/**
+ * Generates code for a single application of the `(when)` option
+ * represented by the [view].
+ */
+private class GenerateWhen(
+ private val view: WhenField,
+ override val converter: JavaValueConverter
+) : EmptyFieldCheck {
+
+ private val field = view.subject
+ private val fieldType = field.type
+ private val declaringType = field.declaringType
+ private val fieldValue = message.field(field).getter()
+
+ /**
+ * Returns the generated code.
+ */
+ fun code(): SingleOptionCode = when {
+ fieldType.isMessage -> validateTime(fieldValue)
+ fieldType.isRepeatedMessage ->
+ CodeBlock(
+ """
+ for (var element : $fieldValue) {
+ ${validateTime(ReadVar("element"))}
+ }
+ """.trimIndent()
+ )
+
+ else -> unsupportedFieldType()
+ }.run { SingleOptionCode(this) }
+
+ /**
+ * Yields an expression to check if the provided [fieldValue] matches
+ * the time [restriction][WhenField.getBound].
+ *
+ * The reported violations are appended to [violations] list, if any.
+ *
+ * Depending on the field type, the method uses either Protobuf's
+ * [Timestamps.compare()][com.google.protobuf.util.Timestamps.compare]
+ * or Spine's [Temporal.isInPast()][io.spine.time.Temporal.isInPast] and
+ * [Temporal.isInFuture()][io.spine.time.Temporal.isInFuture] methods.
+ */
+ private fun validateTime(fieldValue: Expression): CodeBlock {
+ val isTimeOutOfBound = when (view.type) {
+ TFT_TIMESTAMP -> {
+ val operator = if (view.bound == FUTURE) "<" else ">"
+ "$TimestampsClass.compare($fieldValue, $SpineTime.currentTime()) $operator 0"
+ }
+
+ TFT_TEMPORAL -> {
+ val checkBound = if (view.bound == FUTURE) "isInPast" else "isInFuture"
+ "$fieldValue.$checkBound()"
+ }
+
+ else -> unsupportedFieldType()
+ }
+ return CodeBlock(
+ """
+ if (!${field.hasDefaultValue()} && $isTimeOutOfBound) {
+ var fieldPath = ${parentPath.resolve(field.name)};
+ var typeName = ${parentName.orElse(declaringType)};
+ var violation = ${violation(ReadVar("fieldPath"), ReadVar("typeName"), fieldValue)};
+ $violations.add(violation);
+ }
+ """.trimIndent()
+ )
+ }
+
+ private fun violation(
+ fieldPath: Expression,
+ typeName: Expression,
+ fieldValue: Expression<*>,
+ ): Expression {
+ val typeNameStr = typeName.stringify()
+ val placeholders = supportedPlaceholders(fieldPath, typeNameStr, fieldValue)
+ val errorMessage = templateString(view.errorMessage, placeholders, WhenOption.NAME)
+ return constraintViolation(errorMessage, typeNameStr, fieldPath, fieldValue)
+ }
+
+ private fun supportedPlaceholders(
+ fieldPath: Expression,
+ typeName: Expression,
+ fieldValue: Expression<*>,
+ ): Map> = mapOf(
+ FIELD_PATH to fieldPath.joinToString(),
+ FIELD_VALUE to JsonExtensionsClass.call("toCompactJson", fieldValue),
+ FIELD_TYPE to StringLiteral(fieldType.name),
+ PARENT_TYPE to typeName,
+ WHEN_IN to StringLiteral("${view.bound}".lowercase())
+ )
+
+ private fun unsupportedFieldType(): Nothing =
+ error(
+ "The field type `${field.type.name}` is not supported by `${this::class.simpleName}`." +
+ " Please ensure that the supported field types in this generator match those" +
+ " used by the reaction, which verified `${view::class.simpleName}`."
+ )
+}
diff --git a/validation/src/main/kotlin/io/spine/tools/time/validation/java/WhenOption.kt b/validation/src/main/kotlin/io/spine/tools/time/validation/java/WhenOption.kt
new file mode 100644
index 000000000..4b267736f
--- /dev/null
+++ b/validation/src/main/kotlin/io/spine/tools/time/validation/java/WhenOption.kt
@@ -0,0 +1,197 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+package io.spine.tools.time.validation.java
+
+import com.google.auto.service.AutoService
+import com.google.protobuf.Timestamp
+import io.spine.core.External
+import io.spine.core.Subscribe
+import io.spine.core.Where
+import io.spine.protobuf.unpack
+import io.spine.server.entity.alter
+import io.spine.server.event.NoReaction
+import io.spine.server.event.React
+import io.spine.server.event.asA
+import io.spine.server.tuple.EitherOf2
+import io.spine.time.Temporal
+import io.spine.time.validation.Time
+import io.spine.time.validation.TimeOption
+import io.spine.tools.compiler.Compilation
+import io.spine.tools.compiler.ast.Field
+import io.spine.tools.compiler.ast.FieldRef
+import io.spine.tools.compiler.ast.FieldType
+import io.spine.tools.compiler.ast.File
+import io.spine.tools.compiler.ast.event.FieldOptionDiscovered
+import io.spine.tools.compiler.ast.extractMessageType
+import io.spine.tools.compiler.ast.isRepeatedMessage
+import io.spine.tools.compiler.ast.name
+import io.spine.tools.compiler.ast.qualifiedName
+import io.spine.tools.compiler.ast.ref
+import io.spine.tools.compiler.check
+import io.spine.tools.compiler.jvm.findJavaClassName
+import io.spine.tools.compiler.jvm.javaClass
+import io.spine.tools.compiler.plugin.Reaction
+import io.spine.tools.compiler.plugin.View
+import io.spine.tools.compiler.type.TypeSystem
+import io.spine.tools.time.validation.TimeFieldType
+import io.spine.tools.time.validation.TimeFieldType.TFT_TEMPORAL
+import io.spine.tools.time.validation.TimeFieldType.TFT_TIMESTAMP
+import io.spine.tools.time.validation.TimeFieldType.TFT_UNKNOWN
+import io.spine.tools.time.validation.WhenField
+import io.spine.tools.time.validation.event.WhenFieldDiscovered
+import io.spine.tools.time.validation.event.whenFieldDiscovered
+import io.spine.tools.validation.ErrorPlaceholder.FIELD_PATH
+import io.spine.tools.validation.ErrorPlaceholder.FIELD_TYPE
+import io.spine.tools.validation.ErrorPlaceholder.FIELD_VALUE
+import io.spine.tools.validation.ErrorPlaceholder.PARENT_TYPE
+import io.spine.tools.validation.ErrorPlaceholder.WHEN_IN
+import io.spine.tools.validation.OPTION_NAME
+import io.spine.tools.validation.checkPlaceholders
+import io.spine.tools.validation.defaultMessage
+import io.spine.tools.validation.java.ValidationOption
+import io.spine.tools.validation.java.generate.OptionGenerator
+
+/**
+ * Extends the Java validation with code generation for the `(when)` option.
+ */
+@AutoService(ValidationOption::class)
+public class WhenOption : ValidationOption {
+
+ public companion object {
+
+ /**
+ * The name of the option as it appears in the Protobuf definition.
+ */
+ public const val NAME: String = "when"
+ }
+
+ override val reactions: Set> = setOf(WhenReaction())
+
+ override val view: Set>> = setOf(WhenFieldView::class.java)
+
+ override val generator: OptionGenerator = WhenGenerator()
+}
+
+/**
+ * Controls whether a field should be validated with the `(when)` option.
+ *
+ * Whenever a field marked with the `(when)` options is discovered, emits
+ * [WhenFieldDiscovered] event if the following conditions are met:
+ *
+ * 1) The field type is supported by the option.
+ * 2) The error message does not contain unsupported placeholders.
+ * 3) The option value is other than [Time.TIME_UNDEFINED].
+ *
+ * If (1) or (2) is violated, the reaction reports a compilation error.
+ *
+ * Violation of (3) means that the `(when)` option is applied correctly,
+ * but effectively disabled. [WhenFieldDiscovered] is not emitted for
+ * disabled options. In this case, the reaction emits [NoReaction] meaning
+ * that the option is ignored.
+ */
+internal class WhenReaction : Reaction() {
+
+ @React
+ override fun whenever(
+ @External @Where(field = OPTION_NAME, equals = WhenOption.NAME)
+ event: FieldOptionDiscovered
+ ): EitherOf2 {
+ val field = event.subject
+ val file = event.file
+ val timeType = checkFieldType(field, typeSystem, file)
+
+ val option = event.option.value.unpack()
+ val timeBound = option.`in`
+ if (timeBound == Time.TIME_UNDEFINED) {
+ return ignore()
+ }
+
+ val message = option.errorMsg.ifEmpty { option.descriptorForType.defaultMessage }
+ message.checkPlaceholders(SUPPORTED_PLACEHOLDERS, field, file, WhenOption.NAME)
+
+ return whenFieldDiscovered {
+ id = field.ref
+ subject = field
+ errorMessage = message
+ bound = timeBound
+ type = timeType
+ }.asA()
+ }
+}
+
+private fun checkFieldType(field: Field, typeSystem: TypeSystem, file: File): TimeFieldType {
+ val timeType = typeSystem.determineTimeType(field.type)
+ Compilation.check(timeType != TFT_UNKNOWN, file, field.span) {
+ "The field type `${field.type.name}` of the `${field.qualifiedName}` field" +
+ " is not supported by the `(${WhenOption.NAME})` option. Supported field types:" +
+ " `google.protobuf.Timestamp` and types introduced in the `spine.time` package" +
+ " that describe time-related concepts."
+ }
+ return timeType
+}
+
+/**
+ * Analysis the given [fieldType], determining whether it represents
+ * the Protobuf [Timestamp] or Spine [Temporal].
+ *
+ * For other field types, the method returns [TimeFieldType.TFT_UNKNOWN].
+ */
+private fun TypeSystem.determineTimeType(fieldType: FieldType): TimeFieldType {
+ if (!fieldType.isMessage && !fieldType.isRepeatedMessage) {
+ return TFT_UNKNOWN
+ }
+ val messageType = fieldType.extractMessageType(typeSystem = this)?.name
+ val javaClass = messageType?.findJavaClassName(typeSystem = this)?.javaClass()
+ return when {
+ javaClass == null -> TFT_UNKNOWN
+ javaClass == Timestamp::class.java -> TFT_TIMESTAMP
+ Temporal::class.java.isAssignableFrom(javaClass) -> TFT_TEMPORAL
+ else -> TFT_UNKNOWN
+ }
+}
+
+/**
+ * A view of a field that is marked with the `(when)` option.
+ */
+internal class WhenFieldView : View() {
+
+ @Subscribe
+ fun on(e: WhenFieldDiscovered) = alter {
+ subject = e.subject
+ errorMessage = e.errorMessage
+ bound = e.bound
+ type = e.type
+ }
+}
+
+private val SUPPORTED_PLACEHOLDERS = setOf(
+ FIELD_PATH,
+ FIELD_TYPE,
+ FIELD_VALUE,
+ PARENT_TYPE,
+ WHEN_IN,
+)
diff --git a/validation/src/main/proto/spine/tools/time/validation/events.proto b/validation/src/main/proto/spine/tools/time/validation/events.proto
new file mode 100644
index 000000000..fda7ff16c
--- /dev/null
+++ b/validation/src/main/proto/spine/tools/time/validation/events.proto
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+syntax = "proto3";
+
+package spine.tools.time.validation;
+
+import "spine/options.proto";
+
+option (type_url_prefix) = "type.spine.io";
+option java_package = "io.spine.tools.time.validation.event";
+option java_outer_classname = "EventsProto";
+option java_multiple_files = true;
+
+import "spine/compiler/ast.proto";
+import "spine/time_options.proto";
+import "spine/tools/time/validation/time_field_type.proto";
+
+// The event emitted whenever a field with `(when)` option is discovered
+// and has passed the necessary checks to confirm the option is applied correctly.
+message WhenFieldDiscovered {
+
+ compiler.FieldRef id = 1;
+
+ // The field in which the option was discovered.
+ compiler.Field subject = 2;
+
+ // The error message template.
+ string error_message = 3;
+
+ // Defines a restriction for the timestamp.
+ Time bound = 4;
+
+ // The type of the field.
+ spine.tools.time.validation.TimeFieldType type = 5;
+}
diff --git a/validation/src/main/proto/spine/tools/time/validation/time_field_type.proto b/validation/src/main/proto/spine/tools/time/validation/time_field_type.proto
new file mode 100644
index 000000000..be8f9211a
--- /dev/null
+++ b/validation/src/main/proto/spine/tools/time/validation/time_field_type.proto
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2025, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+syntax = "proto3";
+
+package spine.tools.time.validation;
+
+import "spine/options.proto";
+
+option (type_url_prefix) = "type.spine.io";
+option java_package = "io.spine.tools.time.validation";
+option java_outer_classname = "TimeFieldTypeProto";
+option java_multiple_files = true;
+
+// Time-related field type supported by the `(when)` option.
+enum TimeFieldType {
+
+ TFT_UNKNOWN = 0;
+
+ // Denotes `com.google.protobuf.Timestamp`.
+ TFT_TIMESTAMP = 1;
+
+ // Denotes an interface `io.spine.time.Temporal`, which the field type should
+ // implement to be handled by the option.
+ TFT_TEMPORAL = 2;
+}
diff --git a/validation/src/main/proto/spine/tools/time/validation/views.proto b/validation/src/main/proto/spine/tools/time/validation/views.proto
new file mode 100644
index 000000000..e18d6e17f
--- /dev/null
+++ b/validation/src/main/proto/spine/tools/time/validation/views.proto
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2026, TeamDev. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Redistribution and use in source and/or binary forms, with or without
+ * modification, must retain the above copyright notice and the following
+ * disclaimer.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+syntax = "proto3";
+
+package spine.tools.time.validation;
+
+import "spine/options.proto";
+
+option (type_url_prefix) = "type.spine.io";
+option java_package = "io.spine.tools.time.validation";
+option java_outer_classname = "ViewsProto";
+option java_multiple_files = true;
+
+import "spine/compiler/ast.proto";
+import "spine/time_options.proto";
+import "spine/tools/time/validation/time_field_type.proto";
+
+// A view of a field that is marked with `(when)` option.
+message WhenField {
+ option (entity).kind = PROJECTION;
+
+ compiler.FieldRef id = 1;
+
+ // The field in which the option was discovered.
+ compiler.Field subject = 2;
+
+ // The error message template.
+ string error_message = 3;
+
+ // Defines a restriction for the timestamp.
+ Time bound = 4;
+
+ // The type of the field.
+ spine.tools.time.validation.TimeFieldType type = 5;
+}
diff --git a/version.gradle.kts b/version.gradle.kts
index 984db38ee..1df9dd0b8 100644
--- a/version.gradle.kts
+++ b/version.gradle.kts
@@ -27,4 +27,4 @@
/**
* The version of this library for publishing.
*/
-val versionToPublish by extra("2.0.0-SNAPSHOT.235")
+val versionToPublish by extra("2.0.0-SNAPSHOT.236")