From 146340c3a0f8f87d2cbbfdc4c1d9ffe8884dad6b Mon Sep 17 00:00:00 2001 From: nikita-ty754 Date: Wed, 5 Nov 2025 15:36:04 +0200 Subject: [PATCH 1/5] python backend --- ...e CS files (adt_ compact, wrapped).run.xml | 2 +- ...te CS files (adt_ full, unwrapped).run.xml | 2 +- .../Generate__cs_adt__unwrapped_.xml | 2 +- .../Generate__cs_adt__wrapped_.xml | 2 +- .mdl/defs/tests.md | 100 +++- .mobala/version-commit.lock | 1 + .run/Help.run.xml | 0 .../scala/io/septimalmind/baboon/Baboon.scala | 23 +- .../septimalmind/baboon/BaboonModuleJvm.scala | 8 +- .../io/septimalmind/baboon/CLIOptions.scala | 19 + .../native-image/resource-config.json | 3 +- .../baboon-runtime/python/baboon_codecs.py | 336 ++++++++++++++ .../python/baboon_runtime_shared.py | 203 ++++++++ .../io/septimalmind/baboon/BaboonModule.scala | 34 +- .../septimalmind/baboon/CompilerOptions.scala | 16 + .../python/PyBaboonTranslator.scala | 313 +++++++++++++ .../python/PyCodecFixtureTranslator.scala | 129 ++++++ .../python/PyCodecTestTranslator.scala | 155 +++++++ .../translator/python/PyCodecTranslator.scala | 18 + .../python/PyConversionTranslator.scala | 366 +++++++++++++++ .../translator/python/PyDefnTranslator.scala | 379 +++++++++++++++ .../translator/python/PyDomainTreeTools.scala | 81 ++++ .../translator/python/PyFileTools.scala | 64 +++ .../python/PyJsonCodecGenerator.scala | 105 +++++ .../translator/python/PyTypeTranslator.scala | 147 ++++++ .../baboon/translator/python/PyTypes.scala | 110 +++++ .../python/PyUEBACodecGenerator.scala | 435 ++++++++++++++++++ .../baboon/translator/python/PyValue.scala | 24 + .../baboon/typer/BaboonEnquiries.scala | 36 ++ .../baboon/typer/model/Version.scala | 4 + .../test/resources/baboon/pkg0/pkg01.baboon | 3 +- .../test/resources/baboon/pkg0/pkg02.baboon | 1 + .../test/resources/baboon/pkg0/pkg03.baboon | 2 +- run | 0 .../ConvTest/Test_CrossLanguageCompat.cs | 59 ++- test/conv-test-py/compat_main.py | 72 +++ test/conv-test-py/requirements.txt | 1 + test/conv-test-py/test_conversions.py | 19 + .../BaboonDefinitions.csproj | 4 +- test/cs-stub/BaboonTests/BaboonTests.csproj | 2 +- test/cs-stub/ConversionsTest.sln | 3 +- test/py-stub/requirements.txt | 1 + 42 files changed, 3249 insertions(+), 35 deletions(-) create mode 100644 .mobala/version-commit.lock create mode 100644 .run/Help.run.xml create mode 100644 baboon-compiler/src/main/resources/baboon-runtime/python/baboon_codecs.py create mode 100644 baboon-compiler/src/main/resources/baboon-runtime/python/baboon_runtime_shared.py create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecFixtureTranslator.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTestTranslator.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTranslator.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyConversionTranslator.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyDefnTranslator.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyDomainTreeTools.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyFileTools.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyJsonCodecGenerator.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyTypeTranslator.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyTypes.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyUEBACodecGenerator.scala create mode 100644 baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyValue.scala create mode 100755 run create mode 100644 test/conv-test-py/compat_main.py create mode 100644 test/conv-test-py/requirements.txt create mode 100644 test/conv-test-py/test_conversions.py create mode 100644 test/py-stub/requirements.txt diff --git a/.idea/runConfigurations/Generate CS files (adt_ compact, wrapped).run.xml b/.idea/runConfigurations/Generate CS files (adt_ compact, wrapped).run.xml index eab93e70..6d4c4e3c 100644 --- a/.idea/runConfigurations/Generate CS files (adt_ compact, wrapped).run.xml +++ b/.idea/runConfigurations/Generate CS files (adt_ compact, wrapped).run.xml @@ -6,7 +6,7 @@ diff --git a/.idea/runConfigurations/Generate CS files (adt_ full, unwrapped).run.xml b/.idea/runConfigurations/Generate CS files (adt_ full, unwrapped).run.xml index 9b56b74c..87764a29 100644 --- a/.idea/runConfigurations/Generate CS files (adt_ full, unwrapped).run.xml +++ b/.idea/runConfigurations/Generate CS files (adt_ full, unwrapped).run.xml @@ -6,7 +6,7 @@ diff --git a/.idea/runConfigurations/Generate__cs_adt__unwrapped_.xml b/.idea/runConfigurations/Generate__cs_adt__unwrapped_.xml index ca0bca3f..872cf7e2 100644 --- a/.idea/runConfigurations/Generate__cs_adt__unwrapped_.xml +++ b/.idea/runConfigurations/Generate__cs_adt__unwrapped_.xml @@ -6,7 +6,7 @@ diff --git a/.idea/runConfigurations/Generate__cs_adt__wrapped_.xml b/.idea/runConfigurations/Generate__cs_adt__wrapped_.xml index de9bcae1..db71c2e5 100644 --- a/.idea/runConfigurations/Generate__cs_adt__wrapped_.xml +++ b/.idea/runConfigurations/Generate__cs_adt__wrapped_.xml @@ -6,7 +6,7 @@ diff --git a/.mdl/defs/tests.md b/.mdl/defs/tests.md index 152e63cb..6c382e7c 100644 --- a/.mdl/defs/tests.md +++ b/.mdl/defs/tests.md @@ -31,13 +31,15 @@ TEST_DIR="./target/test-regular" # Create temporary test directories mkdir -p "$TEST_DIR" -rm -rf "$TEST_DIR/cs-stub" "$TEST_DIR/sc-stub" +rm -rf "$TEST_DIR/cs-stub" "$TEST_DIR/sc-stub" "$TEST_DIR/py-stub" # Copy stub projects, excluding generated and build artifacts rsync -a --exclude='Generated*' --exclude='generated-*' --exclude='bin' --exclude='obj' --exclude='target' --exclude='project/target' \ ./test/cs-stub/ "$TEST_DIR/cs-stub/" rsync -a --exclude='Generated*' --exclude='generated-*' --exclude='bin' --exclude='obj' --exclude='target' --exclude='project/target' \ ./test/sc-stub/ "$TEST_DIR/sc-stub/" +rsync -a --exclude='Generated*' --exclude='generated-*' --exclude='bin' --exclude='obj' --exclude='target' --exclude='project/target' \ + ./test/py-stub/ "$TEST_DIR/py-stub/" $BABOON_BIN \ --model-dir ./baboon-compiler/src/test/resources/baboon/ \ @@ -58,7 +60,15 @@ $BABOON_BIN \ --sc-write-evolution-dict true \ --sc-wrapped-adt-branch-codecs false \ --generate-ueba-codecs-by-default=true \ - --generate-json-codecs-by-default=true + --generate-json-codecs-by-default=true \ + :python \ + --output "$TEST_DIR/py-stub/BaboonDefinitions/Generated" \ + --test-output "$TEST_DIR/py-stub/BaboonTests/GeneratedTests" \ + --fixture-output "$TEST_DIR/py-stub/BaboonTests/GeneratedFixtures" \ + --generate-ueba-codecs-by-default=true \ + --generate-json-codecs-by-default=true \ + --py-write-evolution-dict true \ + --py-wrapped-adt-branch-codecs false ret success:bool=true ret test_dir:string="$TEST_DIR" @@ -91,6 +101,22 @@ popd ret success:bool=true ``` +# action: test-python-regular + +Run Python tests with regular adt codecs. + +```bash +TEST_DIR="${action.test-gen-regular-adt.test_dir}" +pushd "$TEST_DIR/py-stub" +python3 -m venv .venv +source .venv/bin/activate +python3 -m pip install -r requirements.txt +python3 -m unittest discover -s BaboonTests/GeneratedTests/testpkg/pkg0 +popd + +ret success:bool=true +``` + # action: test-gen-wrapped-adt Generate code with wrapped ADT branch codecs. @@ -103,13 +129,15 @@ TEST_DIR="./target/test-wrapped" # Create temporary test directories mkdir -p "$TEST_DIR" -rm -rf "$TEST_DIR/cs-stub" "$TEST_DIR/sc-stub" +rm -rf "$TEST_DIR/cs-stub" "$TEST_DIR/sc-stub" "$TEST_DIR/py-stub" # Copy stub projects, excluding generated and build artifacts rsync -a --exclude='Generated*' --exclude='generated-*' --exclude='bin' --exclude='obj' --exclude='target' --exclude='project/target' \ ./test/cs-stub/ "$TEST_DIR/cs-stub/" rsync -a --exclude='Generated*' --exclude='generated-*' --exclude='bin' --exclude='obj' --exclude='target' --exclude='project/target' \ ./test/sc-stub/ "$TEST_DIR/sc-stub/" +rsync -a --exclude='Generated*' --exclude='generated-*' --exclude='bin' --exclude='obj' --exclude='target' --exclude='project/target' \ + ./test/py-stub/ "$TEST_DIR/py-stub/" $BABOON_BIN \ --model-dir ./baboon-compiler/src/test/resources/baboon/ \ @@ -130,7 +158,15 @@ $BABOON_BIN \ --sc-write-evolution-dict true \ --sc-wrapped-adt-branch-codecs true \ --generate-ueba-codecs-by-default=true \ - --generate-json-codecs-by-default=true + --generate-json-codecs-by-default=true \ + :python \ + --output "$TEST_DIR/py-stub/BaboonDefinitions/Generated" \ + --test-output "$TEST_DIR/py-stub/BaboonTests/GeneratedTests" \ + --fixture-output "$TEST_DIR/py-stub/BaboonTests/GeneratedFixtures" \ + --generate-ueba-codecs-by-default=true \ + --generate-json-codecs-by-default=true \ + --py-write-evolution-dict true \ + --py-wrapped-adt-branch-codecs true ret success:bool=true ret test_dir:string="$TEST_DIR" @@ -163,6 +199,22 @@ popd ret success:bool=true ``` +# action: test-python-wrapped + +Run Python tests with wrapped ADT codecs + +```bash +TEST_DIR="${action.test-gen-regular-adt.test_dir}" +pushd "$TEST_DIR/py-stub" +python3 -m venv .venv +source .venv/bin/activate +python3 -m pip install -r requirements.txt +python3 -m unittest discover -s BaboonTests/GeneratedTests/testpkg/pkg0 +popd + +ret success:bool=true +``` + # action: test-gen-manual Generate code for manual test projects. @@ -179,7 +231,26 @@ $BABOON_BIN \ :cs \ --output ./test/conv-test-cs/ConvTest/Generated \ :scala \ - --output ./test/conv-test-sc/src/main/scala/generated-main + --output ./test/conv-test-sc/src/main/scala/generated-main \ + :python \ + --output ./test/conv-test-py/Generated + +ret success:bool=true +``` + +# action: test-gen-compat-python + +Generate compatibility test files using Python. + +```bash +dep action.test-gen-manual + +pushd ./test/conv-test-py +python3 -m venv .venv +source .venv/bin/activate +python3 -m pip install -r requirements.txt +python3 compat_main.py +popd ret success:bool=true ``` @@ -219,6 +290,7 @@ Run manual C# compatibility tests. ```bash dep action.test-gen-compat-scala dep action.test-gen-compat-cs +dep action.test-gen-compat-python pushd ./test/conv-test-cs dotnet build @@ -245,7 +317,7 @@ ret success:bool=true # action: test-sbt-basic -Run manual Scala compatibility tests. +Run basic SBT tests. ```bash dep action.build @@ -254,6 +326,20 @@ sbt +test ret success:bool=true ``` +# action: test-manual-python + +Run Python conversion test + +```bash +dep action.test-gen-compat-python +pushd ./test/conv-test-py +source .venv/bin/activate +python3 -m unittest discover -s . +popd + +ret success:bool=true +``` + # action: test Run complete test suite (orchestrator action). @@ -262,8 +348,10 @@ Run complete test suite (orchestrator action). dep action.test-sbt-basic dep action.test-cs-regular dep action.test-scala-regular +dep action.test-python-regular dep action.test-cs-wrapped dep action.test-scala-wrapped +dep action.test-python-wrapped dep action.test-manual-cs dep action.test-manual-scala diff --git a/.mobala/version-commit.lock b/.mobala/version-commit.lock new file mode 100644 index 00000000..b7b7899c --- /dev/null +++ b/.mobala/version-commit.lock @@ -0,0 +1 @@ +87a6a202f917745e826d6f245f78db48cb92965b \ No newline at end of file diff --git a/.run/Help.run.xml b/.run/Help.run.xml new file mode 100644 index 00000000..e69de29b diff --git a/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/Baboon.scala b/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/Baboon.scala index ff157c40..b71ff188 100644 --- a/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/Baboon.scala +++ b/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/Baboon.scala @@ -188,6 +188,25 @@ object Baboon { ), ) } + case "python" => + CaseApp.parse[PyCLIOptions](roleArgs).leftMap(e => s"Can't parse cs CLI: $e").map { + case (opts, _) => + val shopts = mkGenericOpts(opts) + + CompilerTarget.PyTarget( + id = "Python", + output = shopts.outOpts, + generic = shopts.genericOpts, + language = PyOptions( + writeEvolutionDict = opts.pyWriteEvolutionDict.getOrElse(true), + wrappedAdtBranchCodecs = opts.pyWrappedAdtBranchCodecs.getOrElse(false), + generateJsonCodecs = opts.generateJsonCodecs.getOrElse(true), + generateUebaCodecs = opts.generateUebaCodecs.getOrElse(true), + generateJsonCodecsByDefault = opts.generateJsonCodecsByDefault.getOrElse(false), + generateUebaCodecsByDefault = opts.generateUebaCodecsByDefault.getOrElse(false), + ), + ) + } case r => Left(s"Unknown role id: $r") } } @@ -238,7 +257,7 @@ object Baboon { val safeToRemove = NEList.from(opts.extAllowCleanup) match { case Some(value) => value.toSet - case None => Set("meta", "cs", "json", "scala") + case None => Set("meta", "cs", "json", "scala", "py", "pyc") } val outOpts = OutputOptions( @@ -269,6 +288,8 @@ object Baboon { new BaboonJvmCSModule[F](t) case t: CompilerTarget.ScTarget => new BaboonJvmScModule[F](t) + case t: CompilerTarget.PyTarget => + new BaboonJvmPyModule[F](t) } Injector diff --git a/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/BaboonModuleJvm.scala b/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/BaboonModuleJvm.scala index a7db7f91..1abf18c4 100644 --- a/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/BaboonModuleJvm.scala +++ b/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/BaboonModuleJvm.scala @@ -1,7 +1,7 @@ package io.septimalmind.baboon import distage.ModuleDef -import io.septimalmind.baboon.CompilerTarget.{CSTarget, ScTarget} +import io.septimalmind.baboon.CompilerTarget.{CSTarget, PyTarget, ScTarget} import io.septimalmind.baboon.parser.{BaboonInclusionResolver, BaboonInclusionResolverImpl} import io.septimalmind.baboon.util.BLogger import izumi.functional.bio.unsafe.MaybeSuspend2 @@ -25,6 +25,12 @@ class BaboonJvmScModule[F[+_, +_]: Error2: TagKK](target: ScTarget) extends Modu make[ScTarget].fromValue(target) } +class BaboonJvmPyModule[F[+_, +_]: Error2: TagKK](target: PyTarget) extends ModuleDef { + include(new SharedTranspilerJvmModule[F]()) + include(new BaboonCommonPyModule[F]()) + make[PyTarget].fromValue(target) +} + class BaboonModuleJvm[F[+_, +_]: Error2: MaybeSuspend2: TagKK]( options: CompilerOptions, parallelAccumulatingOps2: ParallelErrorAccumulatingOps2[F], diff --git a/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/CLIOptions.scala b/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/CLIOptions.scala index b65c6e67..8c9a4686 100644 --- a/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/CLIOptions.scala +++ b/baboon-compiler/.jvm/src/main/scala/io/septimalmind/baboon/CLIOptions.scala @@ -80,6 +80,25 @@ case class ScCLIOptions( generateUebaCodecsByDefault: Option[Boolean], ) extends SharedCLIOptions +case class PyCLIOptions( + @Recurse + generic: GenericTranspilerCLIOptions, + @HelpMessage("Allow to erase target directory even if files with these extensions exist there. Default: cs,json,meta") + extAllowCleanup: List[String], + @HelpMessage("Adds evolution metadata as a Scala dictionary") + pyWriteEvolutionDict: Option[Boolean], + @HelpMessage("Every ADT branch will encode ADT metadata and expect it in the decoder") + pyWrappedAdtBranchCodecs: Option[Boolean], + @HelpMessage("Generate JSON codecs") + generateJsonCodecs: Option[Boolean], + @HelpMessage("Generate UEBA codecs") + generateUebaCodecs: Option[Boolean], + @HelpMessage("Generate JSON codecs even for types without derived[json]") + generateJsonCodecsByDefault: Option[Boolean], + @HelpMessage("Generate UEBA codecs even for types without derived[ueba]") + generateUebaCodecsByDefault: Option[Boolean], +) extends SharedCLIOptions + case class CLIOptions( @HelpMessage("A list of *.baboon files to process (can be combined with --model-dir)") model: List[String], diff --git a/baboon-compiler/src/main/resources/META-INF/native-image/resource-config.json b/baboon-compiler/src/main/resources/META-INF/native-image/resource-config.json index 4420bcac..ea665662 100644 --- a/baboon-compiler/src/main/resources/META-INF/native-image/resource-config.json +++ b/baboon-compiler/src/main/resources/META-INF/native-image/resource-config.json @@ -1,6 +1,7 @@ { "resources": [ {"pattern": "baboon-runtime/cs/.*\\.cs"}, - {"pattern": "baboon-runtime/scala/.*\\.scala"} + {"pattern": "baboon-runtime/scala/.*\\.scala"}, + {"pattern": "baboon-runtime/python/.*\\.py"} ] } \ No newline at end of file diff --git a/baboon-compiler/src/main/resources/baboon-runtime/python/baboon_codecs.py b/baboon-compiler/src/main/resources/baboon-runtime/python/baboon_codecs.py new file mode 100644 index 00000000..f3ebef6b --- /dev/null +++ b/baboon-compiler/src/main/resources/baboon-runtime/python/baboon_codecs.py @@ -0,0 +1,336 @@ +from datetime import datetime, timedelta, timezone +from abc import ABC, abstractmethod +from typing import TypeVar, Generic +from decimal import Decimal +from io import BytesIO +from uuid import UUID +import struct + +from pydantic import BaseModel + +T = TypeVar("T") + +class IBaboonCodecData(ABC): + @abstractmethod + def baboon_domain_version(self) -> str: + raise NotImplementedError + + @abstractmethod + def baboon_domain_identifier(self) -> str: + raise NotImplementedError + + @abstractmethod + def baboon_type_identifier(self) -> str: + raise NotImplementedError + +class BaboonJsonCodec(IBaboonCodecData, Generic[T]): + @abstractmethod + def encode(self, obj: T) -> str: + raise NotImplementedError + + @abstractmethod + def decode(self, json_str: str) -> T: + raise NotImplementedError + +class BaboonUEBACodec(IBaboonCodecData, Generic[T]): + @abstractmethod + def encode(self, ctx: 'BaboonCodecContext', wire: 'LEDataOutputStream', obj: T): + raise NotImplementedError + + @abstractmethod + def decode(self, ctx: 'BaboonCodecContext', wire: 'LEDataInputStream') -> T: + raise NotImplementedError + +class BaboonCodecContext: + def __init__(self, use_indices: bool): + self.use_indices = use_indices + + @classmethod + def indexed(cls): + return cls(True) + + @classmethod + def compact(cls): + return cls(False) + + @classmethod + def default(cls): + return cls(False) + +class BaboonIndexEntry(BaseModel): + offset: int + length: int + +class BaboonBinCodecIndexed(ABC): + @abstractmethod + def index_elements_count(self, ctx: BaboonCodecContext) -> int: ... + + def read_index(self, ctx: BaboonCodecContext, wire: 'LEDataInputStream') -> list[BaboonIndexEntry]: + header = wire.read_byte() + is_indexed = (header & 0b00000001) != 0 + result: list[BaboonIndexEntry] = [] + + prev_offset = 0 + prev_len = 0 + + if is_indexed: + left = self.index_elements_count(ctx) + while left > 0: + offset = wire.read_u32() + length = wire.read_u32() + + assert length > 0, "Length must be positive" + assert offset >= prev_offset + prev_len, f"Offset violation: {offset} < {prev_offset + prev_len}" + + result.append(BaboonIndexEntry(offset=offset, length=length)) + left -= 1 + prev_offset = offset + prev_len = length + + return result + +CS_EPOCH_DIFF_MS = 62_135_596_800_000 + +class LEDataOutputStream: + def __init__(self, stream: BytesIO): + self.stream = stream + + def write(self, b: bytes): + self.stream.write(b) + + def write_byte(self, b: int): + self.stream.write(struct.pack(" 28: + f = f.quantize(Decimal("1.0000000000000000000000000000")) + + sign, digits_tuple, exponent = f.as_tuple() + mantissa = 0 + for d in digits_tuple: + mantissa = mantissa * 10 + d + + scale = 0 + if exponent < 0: + scale = -exponent + elif exponent > 0: + mantissa *= (10 ** exponent) + scale = 0 + + if mantissa >= (1 << 96): + raise ValueError(f"Decimal value {f} is too large for C# Decimal (96-bit limit).") + + flags = (scale << 16) + if sign == 1: + flags |= 0x80000000 + + lo = mantissa & 0xFFFFFFFF + mid = (mantissa >> 32) & 0xFFFFFFFF + hi = (mantissa >> 64) & 0xFFFFFFFF + + self.write_u32(lo) + self.write_u32(mid) + self.write_u32(hi) + self.write_u32(flags) + + def write_bool(self, b: bool): + self.stream.write(struct.pack("?", b)) + + def write_uuid(self, u: UUID): + self.stream.write(u.bytes_le) + + def write_str(self, s: str): + bytes_data = s.encode("utf-8") + value = len(bytes_data) + while True: + current_byte = value & 0x7F + value >>= 7 + if value != 0: + current_byte |= 0x80 + self.write_byte(current_byte) + if value == 0: + break + self.stream.write(bytes_data) + + def write_datetime(self, d: datetime): + if d.tzinfo is None: + d = d.replace(tzinfo=timezone.utc) + + off = d.utcoffset() + offset_ms = 0 + if off: + offset_ms = (off.days * 86400 + off.seconds) * 1000 + off.microseconds // 1000 + + unix_epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) + delta = d - unix_epoch + + unix_utc_ms = ( + (delta.days * 86_400 * 1000) + + (delta.seconds * 1000) + + (delta.microseconds // 1000) + ) + + cs_utc_millis_0001 = unix_utc_ms + CS_EPOCH_DIFF_MS + cs_local_millis_0001 = cs_utc_millis_0001 + offset_ms + + self.write_i64(cs_local_millis_0001) + self.write_i64(offset_ms) + + kind = 1 if offset_ms == 0 else 2 + self.write_byte(kind) + + def write_bytes(self, b: bytes): + self.write_u32(len(b)) + self.stream.write(b) + + def write_optional(self, o, f): + if o is None: + self.write_byte(0) + else: + self.write_byte(1) + f(o) + + def write_seq(self, c, f): + self.write_i32(len(c)) + for i in c: + f(i) + + def write_dict(self, d, kf, vf): + self.write_i32(len(d)) + for k,v in d.items(): + kf(k) + vf(v) + +class LEDataInputStream: + def __init__(self, stream : BytesIO): + self.stream = stream + + def read_byte(self) -> int: + return struct.unpack(" int: + return struct.unpack(" int: + return struct.unpack(" int: + return struct.unpack(" int: + return struct.unpack(" int: + return struct.unpack(" int: + return struct.unpack(" int: + return struct.unpack(" float: + return struct.unpack(" float: + return struct.unpack(" Decimal: + lo = self.read_u32() + mid = self.read_u32() + hi = self.read_u32() + flags = self.read_u32() + + # combine into 96-bit integer + mantissa = lo | (mid << 32) | (hi << 64) + + scale = (flags >> 16) & 0xFF + sign = (flags >> 31) & 1 + + value = Decimal(mantissa) / (Decimal(10) ** scale) + return -value if sign else value + + def read_bool(self) -> bool: + return struct.unpack("?", self.stream.read(1))[0] + + def read_uuid(self) -> UUID: + return UUID(bytes_le = self.stream.read(16)) + + def read_str(self) -> str: + length = 0 + shift = 0 + while True: + byte_read = self.read_byte() & 0xFF + length |= (byte_read & 0x7F) << shift + if (byte_read & 0x80) == 0: + break + shift += 7 + buffer = self.stream.read(length) + return buffer.decode("utf-8") + + def read_datetime(self) -> datetime: + cs_local_millis_0001 = self.read_i64() + offset_millis = self.read_i64() + kind = self.read_byte() + + cs_utc_millis_0001 = cs_local_millis_0001 - offset_millis + unix_utc_millis = cs_utc_millis_0001 - CS_EPOCH_DIFF_MS + tz = timezone(timedelta(milliseconds=offset_millis)) + unix_epoch = datetime(1970, 1, 1, tzinfo=timezone.utc) + dt_utc = unix_epoch + timedelta(milliseconds=unix_utc_millis) + + return dt_utc.astimezone(tz) + + def read_bytes(self) -> bytes: + length = self.read_u32() + return self.stream.read(length) + +class AbstractBaboonCodecs: + def __init__(self): + self._codecs = {} + + def register(self, codec_id: str, impl: IBaboonCodecData): + self._codecs[codec_id] = impl + + def find(self, codec_id: str) -> IBaboonCodecData: + return self._codecs[codec_id] + + def try_find(self, codec_id: str) -> tuple[bool, object | None]: + value = self._codecs.get(codec_id) + if value is not None: + return True, value + else: + return False, None + +class AbstractBaboonJsonCodecs(AbstractBaboonCodecs): + pass + +class AbstractBaboonUebaCodecs(AbstractBaboonCodecs): + pass \ No newline at end of file diff --git a/baboon-compiler/src/main/resources/baboon-runtime/python/baboon_runtime_shared.py b/baboon-compiler/src/main/resources/baboon-runtime/python/baboon_runtime_shared.py new file mode 100644 index 00000000..21d3df01 --- /dev/null +++ b/baboon-compiler/src/main/resources/baboon-runtime/python/baboon_runtime_shared.py @@ -0,0 +1,203 @@ + + +from datetime import datetime, timedelta, timezone +from typing import TypeVar, Generic, ClassVar +from abc import ABC, abstractmethod +from pydantic import BaseModel, ConfigDict +from uuid import UUID, uuid4 +from decimal import Decimal +from functools import wraps +import struct +import warnings +import random +import string + +T = TypeVar("T") +To = TypeVar("To") +From = TypeVar("From") + + +class BaboonMeta: + pass + + +class IBaboonGenerated: + pass + + +class IBaboonGeneratedLatest: + pass + + +class IBaboonAdtMemberMeta: + pass + + +def deprecated(message): + def decorator(cls): + original_init = cls.__init__ + + @wraps(original_init) + def new_init(self, *args, **kwargs): + warnings.warn( + message, + DeprecationWarning, + stacklevel=2 + ) + original_init(self, *args, **kwargs) + + cls.__init__ = new_init + return cls + + return decorator + +class Fixture: + @staticmethod + def next_byte() -> int: + return random.randint(-100, 100) + + @staticmethod + def next_ubyte() -> int: + return random.randint(0, 200) + + @staticmethod + def next_i16() -> int: + return random.randint(-500, 500) + + @staticmethod + def next_u16() -> int: + return random.randint(0, 1000) + + @staticmethod + def next_i32() -> int: + return random.randint(-16384, 16384) + + @staticmethod + def next_u32(u=16384) -> int: + return random.randint(0, u) + + @staticmethod + def next_i64() -> int: + return random.randint(-32768, 32768) + + @staticmethod + def next_u64() -> int: + return random.randint(0, 32768) + + @staticmethod + def next_f32() -> float: + val = random.uniform(-16384.0, 16384.0) + return struct.unpack(' float: + return random.uniform(-16384.0, 16384.0) + + @staticmethod + def next_f128() -> Decimal: + value = random.uniform(0, 1) + return Decimal(str(round(value, 10))) + + @staticmethod + def next_bool() -> bool: + return random.choice([True, False]) + + @staticmethod + def next_string() -> str: + return ''.join(random.choices(string.ascii_letters + string.digits, k=20)) + + @staticmethod + def next_datetime() -> datetime: + start = datetime(1970, 1, 1, tzinfo=timezone.utc) + end = datetime(2100, 1, 1, tzinfo=timezone.utc) + + delta = end - start + random_seconds = random.randrange(int(delta.total_seconds())) + return start + timedelta(seconds=random_seconds) + + @staticmethod + def next_uuid() -> UUID: + return uuid4() + + @staticmethod + def next_bytes() -> bytes: + return bytes([random.randint(0, 255) for _ in range(16)]) + + @staticmethod + def next_list(f): + return [f() for _ in range(10)] + + @staticmethod + def next_set(f): + return {f() for _ in range(10)} + + @staticmethod + def next_dict(kf, vf): + return {kf(): vf() for _ in range(10)} + + @staticmethod + def next_optional(vf): + return vf() + + @staticmethod + def next_random_enum(e): + return random.choice(list(e)) + + @staticmethod + def oneof(l: list[T]) -> T: + return random.choice(l) + + +class ConversionKey(BaseModel): + from_t: type + to: type + + model_config = ConfigDict( + frozen=True + ) + + +class GenericConversion(ABC): + pass + + +class BaboonAbstractConversions(GenericConversion): + def __init__(self): + self.registry = {} + + def register(self, conversion, type_from: type, to_type: type): + key = ConversionKey(from_t=type_from, to=to_type) + self.registry[key] = conversion + + def convert_with_context(self, context, from_value, type_from, to_type): + key = ConversionKey(from_t=type_from, to=to_type) + return self.registry[key].do_convert(context, self, from_value) + + @abstractmethod + def versions_from(self) -> list[str]: + raise NotImplementedError + + @abstractmethod + def version_to(self) -> str: + raise NotImplementedError + + +class BaboonAbstractConversion(ABC, Generic[From, To]): + @abstractmethod + def do_convert(self, ctx, conversions: BaboonAbstractConversions, cfrom: From) -> To: + raise NotImplementedError + + @staticmethod + @abstractmethod + def version_from() -> str: + raise NotImplementedError + + @staticmethod + @abstractmethod + def version_to() -> str: + raise NotImplementedError + + @staticmethod + @abstractmethod + def type_id() -> type: + raise NotImplementedError \ No newline at end of file diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/BaboonModule.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/BaboonModule.scala index 3665a264..4292e48d 100644 --- a/baboon-compiler/src/main/scala/io/septimalmind/baboon/BaboonModule.scala +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/BaboonModule.scala @@ -6,6 +6,8 @@ import io.septimalmind.baboon.parser.BaboonParser import io.septimalmind.baboon.translator.BaboonAbstractTranslator import io.septimalmind.baboon.translator.csharp.* import io.septimalmind.baboon.translator.csharp.CSCodecFixtureTranslator.CSRandomMethodTranslatorImpl +import io.septimalmind.baboon.translator.python.* +import io.septimalmind.baboon.translator.python.PyDefnTranslator.PyDefnTranslatorImpl import io.septimalmind.baboon.translator.scl.* import io.septimalmind.baboon.typer.* import io.septimalmind.baboon.typer.model.* @@ -54,12 +56,12 @@ class BaboonModuleLogicModule[F[+_, +_]: Error2: MaybeSuspend2: TagKK]( make[BaboonRuntimeCodec[F]].from[BaboonRuntimeCodec.BaboonRuntimeCodecImpl[F]] } -class SharedTranspilerModule[F[+_, +_]: Error2: TagKK]() extends ModuleDef { +class SharedTranspilerModule[F[+_, +_]: Error2: TagKK] extends ModuleDef { include(new BaboonSharedModule[F]) make[BaboonMetagen].from[BaboonMetagen.BaboonMetagenImpl] } -class BaboonCommonCSModule[F[+_, +_]: Error2: TagKK]() extends ModuleDef { +class BaboonCommonCSModule[F[+_, +_]: Error2: TagKK] extends ModuleDef { include(new SharedTranspilerModule[F]) makeSubcontext[CSDefnTranslator[F]] @@ -88,7 +90,7 @@ class BaboonCommonCSModule[F[+_, +_]: Error2: TagKK]() extends ModuleDef { .ref[CSBaboonTranslator[F]] } -class BaboonCommonScModule[F[+_, +_]: Error2: TagKK]() extends ModuleDef { +class BaboonCommonScModule[F[+_, +_]: Error2: TagKK] extends ModuleDef { include(new SharedTranspilerModule[F]) makeSubcontext[ScDefnTranslator[F]] @@ -113,3 +115,29 @@ class BaboonCommonScModule[F[+_, +_]: Error2: TagKK]() extends ModuleDef { many[BaboonAbstractTranslator[F]] .ref[ScBaboonTranslator[F]] } + +class BaboonCommonPyModule[F[+_, +_]: Error2: TagKK] extends ModuleDef { + include(new SharedTranspilerModule[F]) + + makeSubcontext[PyDefnTranslator[F]] + .localDependencies(List(DIKey[Domain], DIKey[BaboonEvolution])) + .withSubmodule(new ModuleDef { + make[PyDefnTranslator[F]].from[PyDefnTranslatorImpl[F]] + make[PyDomainTreeTools].from[PyDomainTreeTools.PyDomainTreeToolsImpl] + make[PyCodecFixtureTranslator].from[PyCodecFixtureTranslator.PyCodecFixtureTranslatorImpl] + make[PyCodecTestTranslator].from[PyCodecTestTranslator.PyCodecTestTranslatorImpl] + make[PyJsonCodecGenerator] + many[PyCodecTranslator] + .add[PyJsonCodecGenerator] + .add[PyUEBACodecGenerator] + }) + + make[PyFileTools].from[PyFileTools.ScFileToolsImpl] + + make[PyTypeTranslator] + makeFactory[PyConversionTranslator.Factory[F]] + + make[PyBaboonTranslator[F]].aliased[BaboonAbstractTranslator[F]] + many[BaboonAbstractTranslator[F]] + .ref[PyBaboonTranslator[F]] +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/CompilerOptions.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/CompilerOptions.scala index 81176aea..7300af79 100644 --- a/baboon-compiler/src/main/scala/io/septimalmind/baboon/CompilerOptions.scala +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/CompilerOptions.scala @@ -24,8 +24,24 @@ object CompilerTarget { generic: GenericOptions, language: ScOptions, ) extends CompilerTarget + + case class PyTarget( + id: String, + output: OutputOptions, + generic: GenericOptions, + language: PyOptions, + ) extends CompilerTarget } +final case class PyOptions( + writeEvolutionDict: Boolean, + wrappedAdtBranchCodecs: Boolean, + generateJsonCodecs: Boolean, + generateUebaCodecs: Boolean, + generateUebaCodecsByDefault: Boolean, + generateJsonCodecsByDefault: Boolean, +) + final case class ScOptions( writeEvolutionDict: Boolean, wrappedAdtBranchCodecs: Boolean, diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala new file mode 100644 index 00000000..41e86561 --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala @@ -0,0 +1,313 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.CompilerProduct +import io.septimalmind.baboon.CompilerTarget.PyTarget +import io.septimalmind.baboon.parser.model.issues.{BaboonIssue, TranslationIssue} +import io.septimalmind.baboon.translator.python.PyTypes.* +import io.septimalmind.baboon.translator.python.PyValue.PyModuleId +import io.septimalmind.baboon.translator.{BaboonAbstractTranslator, OutputFile, Sources} +import io.septimalmind.baboon.typer.model.{BaboonFamily, BaboonLineage, Domain, DomainMember, EvolutionStep} +import izumi.distage.Subcontext +import izumi.functional.bio.{Error2, F} +import izumi.fundamentals.collections.nonempty.NEList +import izumi.fundamentals.platform.resources.IzResources +import izumi.fundamentals.platform.strings.TextTree +import izumi.fundamentals.collections.IzCollections.* +import izumi.fundamentals.platform.strings.TextTree.Quote + +class PyBaboonTranslator[F[+_, +_]: Error2]( + translator: Subcontext[PyDefnTranslator[F]], + convTransFactory: PyConversionTranslator.Factory[F], + target: PyTarget, + pyFileTools: PyFileTools, + typeTranslator: PyTypeTranslator, +) extends BaboonAbstractTranslator[F] { + + type Out[T] = F[NEList[BaboonIssue], T] + + override def translate(family: BaboonFamily): Out[Sources] = { + for { + translated <- translateFamily(family) + runtime <- sharedRuntime() + fixture <- sharedFixture() + rendered = (translated ++ runtime ++ fixture).map { + o => + val content = renderTree(o) + (o.path, OutputFile(content, o.product)) + } + unique <- F.fromEither(rendered.toUniqueMap(c => BaboonIssue.of(TranslationIssue.NonUniqueOutputFiles(c)))) + } yield Sources(unique) + } + + private def translateFamily( + family: BaboonFamily + ): Out[List[PyDefnTranslator.Output]] = { + F.flatSequenceAccumErrors { + family.domains.iterator.map { case (_, lineage) => translateLineage(lineage) }.toList + } + } + + private def translateLineage( + lineage: BaboonLineage + ): Out[List[PyDefnTranslator.Output]] = { + F.flatSequenceAccumErrors { + lineage.versions.iterator.map { case (_, domain) => translateDomain(domain, lineage) }.toList + } + } + + private def translateDomain(domain: Domain, lineage: BaboonLineage): Out[List[PyDefnTranslator.Output]] = { + val evo = lineage.evolution + translator.provide(domain).provide(evo).produce().use { + defnTranslator => + for { + defnSources <- translateProduct(domain, CompilerProduct.Definition, defnTranslator.translate) + fixturesSources <- translateProduct(domain, CompilerProduct.Fixture, defnTranslator.translateFixtures) + testsSources <- translateProduct(domain, CompilerProduct.Test, defnTranslator.translateTests) + initPyFile = if (domain.version == lineage.evolution.latest) Nil else List(genInitPy(defnSources, domain)) + + conversionSources <- { + if (target.output.products.contains(CompilerProduct.Conversion)) { + val evosToCurrent = evo.diffs.keySet.filter(_.to == domain.version) + generateConversions(domain, lineage, evosToCurrent, defnSources) + } else { + F.pure(List.empty) + } + } + meta <- { + if (target.language.writeEvolutionDict) { + generateMeta(domain, lineage) + } else { + F.pure(List.empty) + } + } + } yield { + defnSources ++ + conversionSources ++ + fixturesSources ++ + testsSources ++ + meta ++ + initPyFile + } + } + } + + private def genInitPy(definitions: List[PyDefnTranslator.Output], domain: Domain): PyDefnTranslator.Output = { + val modules = definitions.map(o => q"${o.module.module}") + val importTree = q"""from . import ( + | ${modules.join(",\n").shift(4)} + |)""".stripMargin + val initPyModule = typeTranslator.toPyModule(domain.id) + val versionStr = domain.version.format(prefix = "v", delimiter = "_") + val fileName = "__init__.py" + val path = initPyModule.path ++ List(versionStr, fileName) + PyDefnTranslator.Output( + path.mkString("/"), + importTree, + initPyModule, + CompilerProduct.Definition, + ) + } + + private def sharedRuntime(): Out[List[PyDefnTranslator.Output]] = { + def rt(path: String, resource: String): PyDefnTranslator.Output = { + PyDefnTranslator.Output( + path, + TextTree.text(IzResources.readAsString(resource).get), + pyBaboonSharedRuntimeModule, + CompilerProduct.Runtime, + ) + } + + if (target.output.products.contains(CompilerProduct.Runtime)) { + F.pure( + List( + rt("baboon_runtime_shared.py", "baboon-runtime/python/baboon_runtime_shared.py"), + rt("baboon_codecs.py", "baboon-runtime/python/baboon_codecs.py"), + ) + ) + } else F.pure(Nil) + } + + private def sharedFixture(): Out[List[PyDefnTranslator.Output]] = { + F.pure(Nil) + } + + private def renderTree(o: PyDefnTranslator.Output): String = { + val usedTypes = o.tree.values.collect { case t: PyValue.PyType => t } + .filterNot(_.moduleId == pyBuiltins) + .filterNot(_.moduleId == o.module) + .distinct + + val (versioned, usual) = usedTypes.partition(_.versioned) + + val versionPkgImports = versioned + .map(t => t.moduleId.pathToVersion -> t.moduleId).toMap + .map { + case (path, module) => + q"from ${path.mkString(".")} import ${module.moduleVersionString.getOrElse("")}" + }.toList + + val usualImportsByModule = usual + .groupBy(_.moduleId).toList.sortBy { case (moduleId, types) => moduleId.path.size + types.size }.reverse.map { + case (module, types) => + if (module.isBaboonModule) { + val baseString = pyFileTools.definitionsBasePkg.mkString(".") + val typesString = types.map(_.name).mkString(", ") + q"from $baseString.${module.module} import $typesString" + } else { + val typesString = types.map(_.name).mkString(", ") + q"from ${module.path.mkString(".")} import $typesString" + } + } + + val allImports = (usualImportsByModule ++ versionPkgImports).joinN() + + val full = Seq(allImports, o.tree).joinNN() + + full.mapRender { + case t: PyValue.PyType => t.name + } + } + + private def generateConversions( + domain: Domain, + lineage: BaboonLineage, + toCurrent: Set[EvolutionStep], + defnOut: List[PyDefnTranslator.Output], + ): Out[List[PyDefnTranslator.Output]] = { + val module = typeTranslator.toPyModule(domain.id) + + for { + conversions <- F.flatSequenceAccumErrors { + lineage.evolution.rules + .filter(kv => toCurrent.contains(kv._1)) + .map { + case (srcVer, rules) => + convTransFactory( + srcDom = lineage.versions(srcVer.from), + domain = domain, + rules = rules, + evolution = lineage.evolution, + ).makeConversions + } + } + } yield { + val conversionRegs = conversions.map(_.register).toList + val missing = conversions.flatMap(_.missing.iterator.toSeq).toSeq + + val missingTree = if (missing.isEmpty) q"pass" else missing.join("\n") + + val converter = + q"""class RequiredConversions($pyABC): + | ${missingTree.shift(4).trim} + | + |class BaboonConversions($baboonAbstractConversions): + | def __init__(self, required: RequiredConversions): + | super().__init__() + | self.required = required + | ${conversionRegs.join("\n").shift(8).trim} + | + | def versions_from(self) -> $pyList[$pyStr]: + | return [${toCurrent.map(_.from.v.toString).map(v => s"\"$v\"").mkString(", ")}] + | + | def version_to(self) -> $pyStr: + | return "${domain.version.v.toString}" + |""".stripMargin + + val regsMap = defnOut.flatMap(_.codecReg).toMultimap.view.mapValues(_.flatten).toMap + val codecs = regsMap.map { + case (codecid, regs) => + val nme = q"BaboonCodecs${codecid.capitalize}" + q"""class $nme (${abstractBaboonCodecs(codecid)}): + | def __init__(self): + | super().__init__() + | ${regs.toList.map(r => q"self.register($r)").join("\n").shift(8).trim} + | + | @$pyClassMethod + | @$pyCache + | def instance (cls): + | return cls() + |""".stripMargin + }.toList.join("\n\n") + + val basename = pyFileTools.basename(domain, lineage.evolution) + + val runtimeSource = Seq(converter, codecs).join("\n\n") + val runtimeOutput = PyDefnTranslator.Output( + s"$basename/baboon_runtime.py", + runtimeSource, + module, + CompilerProduct.Conversion, + ) + + val convertersOutput = conversions.map { + conv => + PyDefnTranslator.Output( + s"$basename/${conv.fileName}", + conv.conversionTree, + module, + CompilerProduct.Conversion, + ) + } + List(runtimeOutput) ++ convertersOutput + } + } + + private def generateMeta(domain: Domain, lineage: BaboonLineage): Out[List[PyDefnTranslator.Output]] = { + val basename = pyFileTools.basename(domain, lineage.evolution) + + val entries = lineage.evolution + .typesUnchangedSince(domain.version) + .toList + .sortBy(_._1.toString) + .map { + case (tid, version) => + q""""${tid.toString}": [${version.sameIn.map(_.v.toString).map(s => q"\"$s\"").toList.join(", ")}]""" + } + + val metaTree = + q"""class BaboonMetadata($baboonMeta): + | def __init__(self) -> None: + | self.unmodified: dict[str, list[str]] = { + | ${entries.join(",\n").shift(12).trim} + | } + | + | def unmodified_since(self, type_id_string: $pyStr) -> $pyList[$pyStr]: + | return self.unmodified.get(type_id_string, []) + | + |""".stripMargin + + val metaOutput = PyDefnTranslator.Output( + s"$basename/baboon_metadata.py", + metaTree, + PyModuleId(NEList.unsafeFrom(domain.id.path.toList :+ "baboon_metadata")), + CompilerProduct.Definition, + ) + + F.pure(List(metaOutput)) + } + + private def translateProduct( + domain: Domain, + p: CompilerProduct, + translate: DomainMember.User => F[NEList[BaboonIssue], List[PyDefnTranslator.Output]], + ): F[NEList[BaboonIssue], List[PyDefnTranslator.Output]] = { + if (target.output.products.contains(p)) { + F.flatTraverseAccumErrors(domain.defs.meta.nodes.toList) { + case (_, defn: DomainMember.User) => translate(defn) + case _ => F.pure(List.empty) + } + } else { + F.pure(List.empty) + } + } +} + +object PyBaboonTranslator { + case class RenderedConversion( + fileName: String, + conversionTree: TextTree[PyValue], + register: TextTree[PyValue], + missing: Option[TextTree[PyValue]], + ) +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecFixtureTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecFixtureTranslator.scala new file mode 100644 index 00000000..0953f71e --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecFixtureTranslator.scala @@ -0,0 +1,129 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.translator.python.PyTypes.{baboonFixture, pyList, pyStaticMethod} +import io.septimalmind.baboon.translator.python.PyValue.PyType +import io.septimalmind.baboon.typer.BaboonEnquiries +import io.septimalmind.baboon.typer.model.{BaboonEvolution, Domain, DomainMember, TypeId, TypeRef, Typedef} +import io.septimalmind.baboon.typer.model.TypeId.Builtins +import izumi.fundamentals.platform.strings.TextTree +import izumi.fundamentals.platform.strings.TextTree.Quote + +trait PyCodecFixtureTranslator { + def translate(defn: DomainMember.User): Option[TextTree[PyValue]] + def fixtureType(tid: TypeId.User): PyType +} + +object PyCodecFixtureTranslator { + final class PyCodecFixtureTranslatorImpl( + typeTranslator: PyTypeTranslator, + enquiries: BaboonEnquiries, + evolution: BaboonEvolution, + pyFileTools: PyFileTools, + domain: Domain, + ) extends PyCodecFixtureTranslator { + override def translate(defn: DomainMember.User): Option[TextTree[PyValue]] = { + defn.defn match { + case _ if enquiries.hasForeignType(defn, domain) => None + case _ if enquiries.isRecursiveTypedef(defn, domain) => None + case _: Typedef.Contract => None + case _: Typedef.Enum => None + case _: Typedef.Foreign => None + case _: Typedef.Service => None + case dto: Typedef.Dto => Some(doTranslateDto(dto)) + case adt: Typedef.Adt => Some(doTranslateAdt(adt)) + } + } + + private def doTranslateDto(dto: Typedef.Dto): TextTree[PyValue] = { + val generatedFields = dto.fields.map(f => q"${f.name.name}=${genType(f.tpe)}") + val dtoType = typeTranslator + .asPyType(dto.id, domain, evolution, pkgBase = pyFileTools.definitionsBasePkg) + + q"""class ${dto.id.name.name.capitalize}_Fixture: + | @$pyStaticMethod + | def random() -> $dtoType: + | return $dtoType( + | ${generatedFields.join(",\n").shift(12).trim} + | ) + |""".stripMargin + } + + private def doTranslateAdt(adt: Typedef.Adt): TextTree[PyValue] = { + val members = adt.members.toList + .flatMap(m => domain.defs.meta.nodes.get(m)) + .collect { case DomainMember.User(_, d: Typedef.Dto, _, _) => d } + + val membersFixtures = members.sortBy(_.id.toString).map(dto => doTranslateDto(dto)) + val membersGenerators = members.sortBy(_.id.toString).map(dto => q"${dto.id.name.name}_Fixture.random()") + + val adtType = typeTranslator + .asPyType(adt.id, domain, evolution, pkgBase = pyFileTools.definitionsBasePkg) + + q"""class ${adt.id.name.name}_Fixture: + | @$pyStaticMethod + | def random() -> $adtType: + | return $baboonFixture.oneof(${adt.id.name.name}_Fixture.random_all()) + | + | @$pyStaticMethod + | def random_all() -> $pyList[$adtType]: + | return [ + | ${membersGenerators.join(",\n").shift(12).trim} + | ] + | + |${membersFixtures.joinN().trim} + |""".stripMargin + } + + private def genType(tpe: TypeRef): TextTree[PyValue] = { + tpe match { + case s: TypeRef.Scalar => + s.id match { + case TypeId.Builtins.i08 => q"$baboonFixture.next_byte()" + case TypeId.Builtins.i16 => q"$baboonFixture.next_i16()" + case TypeId.Builtins.i32 => q"$baboonFixture.next_i32()" + case TypeId.Builtins.i64 => q"$baboonFixture.next_i64()" + + case TypeId.Builtins.u08 => q"$baboonFixture.next_ubyte()" + case TypeId.Builtins.u16 => q"$baboonFixture.next_u16()" + case TypeId.Builtins.u32 => q"$baboonFixture.next_u32()" + case TypeId.Builtins.u64 => q"$baboonFixture.next_u64()" + + case TypeId.Builtins.f32 => q"$baboonFixture.next_f32()" + case TypeId.Builtins.f64 => q"$baboonFixture.next_f64()" + case TypeId.Builtins.f128 => q"$baboonFixture.next_f128()" + + case TypeId.Builtins.str => q"$baboonFixture.next_string()" + case TypeId.Builtins.uid => q"$baboonFixture.next_uuid()" + case TypeId.Builtins.tsu => q"$baboonFixture.next_datetime()" + case TypeId.Builtins.tso => q"$baboonFixture.next_datetime()" + + case TypeId.Builtins.bit => q"$baboonFixture.next_bool()" + + case TypeId.Builtins.bytes => q"$baboonFixture.next_bytes()" + + case id: TypeId.User if enquiries.isEnum(tpe, domain) => + val tpe = typeTranslator.asPyType(id, domain, evolution, pyFileTools.definitionsBasePkg) + q"$baboonFixture.next_random_enum($tpe)" + case u: TypeId.User => q"${fixtureType(u)}.random()" + case t => throw new IllegalArgumentException(s"Unexpected scalar type: $t") + } + case TypeRef.Constructor(id, args) => + id match { + case Builtins.lst => q"$baboonFixture.next_list(lambda: ${genType(args.head)})" + case Builtins.set => q"$baboonFixture.next_set(lambda: ${genType(args.head)})" + case Builtins.map => q"$baboonFixture.next_dict(lambda: ${genType(args.head)}, lambda: ${genType(args.last)})" + case Builtins.opt => q"$baboonFixture.next_optional(lambda: ${genType(args.head)})" + case t => throw new IllegalArgumentException(s"Unexpected scalar type: $t") + } + } + } + + override def fixtureType(tid: TypeId.User): PyType = { + val typeName = s"${tid.name.name}_Fixture" + val pyModuleId = typeTranslator + .toPyModule(tid, domain.version, evolution, pyFileTools.fixturesBasePkg) + .withModuleName(typeName) + PyType(pyModuleId, typeName) + } + } +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTestTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTestTranslator.scala new file mode 100644 index 00000000..c191f884 --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTestTranslator.scala @@ -0,0 +1,155 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.CompilerTarget.PyTarget +import io.septimalmind.baboon.translator.python.PyTypes.* +import io.septimalmind.baboon.translator.python.PyValue.PyType +import io.septimalmind.baboon.typer.BaboonEnquiries +import io.septimalmind.baboon.typer.model.{BaboonEvolution, Domain, DomainMember, Typedef} +import io.septimalmind.baboon.util.BLogger +import izumi.fundamentals.platform.strings.TextTree +import izumi.fundamentals.platform.strings.TextTree.Quote + +trait PyCodecTestTranslator { + def translate(defn: DomainMember.User, pyRef: PyType, srcRef: PyType): Option[TextTree[PyValue]] +} + +object PyCodecTestTranslator { + final class PyCodecTestTranslatorImpl( + fixtureTranslator: PyCodecFixtureTranslator, + typeTranslator: PyTypeTranslator, + codecs: Set[PyCodecTranslator], + enquiries: BaboonEnquiries, + evolution: BaboonEvolution, + pyFileTools: PyFileTools, + pyTarget: PyTarget, + logger: BLogger, + domain: Domain, + ) extends PyCodecTestTranslator { + override def translate( + defn: DomainMember.User, + pyRef: PyType, + srcRef: PyType, + ): Option[TextTree[PyValue]] = { + val isLatestVersion = domain.version == evolution.latest + + defn match { + case d if enquiries.hasForeignType(d, domain) => None + case d if enquiries.isRecursiveTypedef(d, domain) => None + case d if d.defn.isInstanceOf[Typedef.NonDataTypedef] => None + case _ if !isLatestVersion => None + case _ => + val testClass = + q"""class Test_${srcRef.name}_Tests($pyTestCase): + | ${makeTest(defn, srcRef)} + |""".stripMargin + Some(testClass) + } + } + + private def makeTest(defn: DomainMember.User, srcRef: PyType): TextTree[PyValue] = { + val fixture = makeFixture(defn) + codecs.map { + case jsonCodec: PyJsonCodecGenerator => + val codec = jsonCodec.codecType(defn.id) + val body = jsonCodecAssertions(defn) + q"""def test_json_codec(self): + | for _ in range(${pyTarget.generic.codecTestIterations.toString}): + | self.json_codec_test_impl() + | + |def test_load_json_produced_by_cs_codecs(self): + | self.cs_json_test("default") + | + |def cs_json_test(self, clue): + | tpeid = "${defn.id.render}" + | with open(f"../target/cs/json-{clue}/{tpeid}.json", encoding="utf-8") as f: + | cs_json = f.read() + | decoded = $codec.instance().decode(cs_json) + | self.json_compare(decoded) + | + |def json_codec_test_impl(self): + | ${fixture.shift(4).trim} + | ${body.shift(4).trim} + | + |def json_compare(self, fixture): + | fixtureJson = $codec.instance().encode(fixture) + | fixtureDecoded = $codec.instance().decode(fixtureJson) + | self.assertEqual(fixture, fixtureDecoded) + |""".stripMargin + case uebaCodec: PyUEBACodecGenerator => + val codec = uebaCodec.codecType(defn.id) + val body = uebaCodecAssertions(defn) + q"""def test_ueba_codec(self): + | for _ in range(${pyTarget.generic.codecTestIterations.toString}): + | self.ueba_codec_test_impl($baboonCodecContext.default()) + | + |def ueba_codec_test_impl(self, context): + | ${fixture.shift(4).trim} + | ${body.shift(4).trim} + | + |def test_ueba_produced_by_cs_codecs(self): + | self.cs_ueba_test($baboonCodecContext.indexed(), "indexed") + | self.cs_ueba_test($baboonCodecContext.compact(), "compact") + | + |def cs_ueba_test(self, context, clue): + | tpeid = "${defn.id.render}" + | with open(f"../target/cs/ueba-{clue}/{tpeid}.uebin", "rb") as f: + | cs_uebin = f.read() + | memory_stream = $pyBytesIO() + | input_stream = $baboonLEDataInputStream(memory_stream) + | memory_stream.write(cs_uebin) + | memory_stream.seek(0) + | decoded = $codec.instance().decode(context, input_stream) + | self.ueba_compare(context, decoded) + | + |def ueba_compare(self, context, obj): + | memory_stream = $pyBytesIO() + | output_stream = $baboonLEDataOutputStream(memory_stream) + | $codec.instance().encode(context, output_stream, obj) + | memory_stream.seek(0) + | input_stream = $baboonLEDataInputStream(memory_stream) + | decoded = $codec.instance().decode(context, input_stream) + | self.assertEqual(obj, decoded) + | + |""".stripMargin + case unknown => + logger.message(s"Cannot create codec tests () for unsupported type $srcRef") + q"" + }.toList.map(_.stripMargin.trim).joinNN().shift(4).trim + } + + private def jsonCodecAssertions(defn: DomainMember.User): TextTree[PyValue] = { + defn.defn match { + case _: Typedef.Adt => + q"""for fixture in fixtures: + | self.json_compare(fixture) + |""".stripMargin + case _ => q"self.json_compare(fixture)" + } + } + + private def uebaCodecAssertions(defn: DomainMember.User): TextTree[PyValue] = { + defn.defn match { + case _: Typedef.Adt => + q"""for fixture in fixtures: + | self.ueba_compare(context, fixture) + |""".stripMargin.trim + case _ => + q"self.ueba_compare(context, fixture)" + } + } + + private def makeFixture(defn: DomainMember.User): TextTree[PyValue] = { + defn.defn match { + case _: Typedef.Enum => + val enumTpe = typeTranslator.asPyType(defn.id, domain, evolution, pyFileTools.definitionsBasePkg) + q"fixture = $baboonFixture.next_random_enum($enumTpe)" + case _: Typedef.Adt => + val fixtureType = fixtureTranslator.fixtureType(defn.id) + q"fixtures = $fixtureType.random_all()" + case _ => + val fixtureType = fixtureTranslator.fixtureType(defn.id) + q"fixture = $fixtureType.random()" + } + } + } +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTranslator.scala new file mode 100644 index 00000000..e8a41c6a --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTranslator.scala @@ -0,0 +1,18 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.translator.python.PyCodecTranslator.CodecMeta +import io.septimalmind.baboon.translator.python.PyValue.PyType +import io.septimalmind.baboon.typer.model.{DomainMember, TypeId} +import izumi.fundamentals.platform.strings.TextTree + +trait PyCodecTranslator { + def translate(defn: DomainMember.User, pyRef: PyType, srcRef: PyType): Option[TextTree[PyValue]] + def codecType(tid: TypeId.User): PyType + def codecMeta(tid: TypeId.User): CodecMeta + def isActive(id: TypeId): Boolean + def id: String +} + +object PyCodecTranslator { + case class CodecMeta(member: TextTree[PyValue]) +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyConversionTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyConversionTranslator.scala new file mode 100644 index 00000000..05a262dc --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyConversionTranslator.scala @@ -0,0 +1,366 @@ +package io.septimalmind.baboon.translator.python + +import distage.Id +import io.septimalmind.baboon.parser.model.issues.{BaboonIssue, TranslationIssue} +import io.septimalmind.baboon.translator.python.PyBaboonTranslator.RenderedConversion +import io.septimalmind.baboon.translator.python.PyTypes.* +import io.septimalmind.baboon.translator.python.PyValue.{PyModuleId, PyType} +import io.septimalmind.baboon.typer.model.* +import io.septimalmind.baboon.typer.model.Conversion.FieldOp +import izumi.functional.bio.{Error2, F} +import izumi.fundamentals.collections.nonempty.NEList +import izumi.fundamentals.platform.strings.TextTree +import izumi.fundamentals.platform.strings.TextTree.Quote + +import scala.util.chaining.scalaUtilChainingOps + +object PyConversionTranslator { + trait Factory[F[+_, +_]] { + def apply( + srcDom: Domain @Id("source"), + domain: Domain @Id("current"), + rules: BaboonRuleset, + evolution: BaboonEvolution, + ): PyConversionTranslator[F] + } +} + +final class PyConversionTranslator[F[+_, +_]: Error2]( + srcDom: Domain @Id("source"), + domain: Domain @Id("current"), + rules: BaboonRuleset, + evolution: BaboonEvolution, + typeTranslator: PyTypeTranslator, + pyFileTools: PyFileTools, +) { + private val sourceVersion = srcDom.version + private val currentVersion = domain.version + + private val sourceVersionString = sourceVersion.format(delimiter = "_") + private val currentVersionString = currentVersion.format(prefix = "v", delimiter = "_") + + type Out[T] = F[NEList[BaboonIssue], T] + + def makeConversions: Out[List[RenderedConversion]] = { + F.flatTraverseAccumErrors(rules.conversions) { + case _: Conversion.RemovedTypeNoConversion => F.pure(Nil) + case _: Conversion.NonDataTypeTypeNoConversion => F.pure(Nil) + case conversion => + val convType = conversionType(conversion) + val fileName = s"${convType.moduleId.module}.py" + + val typeFrom = typeTranslator.asPyTypeVersioned(conversion.sourceTpe, srcDom, evolution, pyFileTools.definitionsBasePkg) + def typeTo = typeTranslator.asPyType(conversion.sourceTpe, domain, evolution, pyFileTools.definitionsBasePkg) + + val meta = + q"""@$pyStaticMethod + |def version_from() -> str: + | return "${sourceVersion.v.toString}" + | + |@$pyStaticMethod + |def version_to() -> str: + | return "${domain.version.v.toString}" + | + |@$pyStaticMethod + |def type_id() -> str: + | return "${conversion.sourceTpe.toString}" + | + |@$pyClassMethod + |@$pyCache + |def instance (cls): + | return cls() + |""".stripMargin + + val convTree = genConversionTree(conversion, typeFrom, typeTo, convType, meta) + val registerTree = genRegisterTree(conversion, typeFrom, typeTo, convType) + val abstractConversion = genAbstractConversion(conversion, convType) + + convTree + .zip(registerTree) + .fold(F.pure(List.empty[RenderedConversion])) { case (conv, reg) => F.pure(List(RenderedConversion(fileName, conv, reg, abstractConversion))) } + .catchSome { + case _ => F.fail(BaboonIssue.of(TranslationIssue.TranslationBug())) + } + } + } + + private def genRegisterTree( + conversion: Conversion, + typeFrom: PyType, + typeTo: PyType, + convType: PyType, + ): Option[TextTree[PyType]] = { + conversion match { + case _: Conversion.CustomConversionRequired => Some(q"self.register(required.${convType.name}(), $typeFrom, $typeTo)") + case _: Conversion.CopyEnumByName | _: Conversion.CopyAdtBranchByName | _: Conversion.DtoConversion => + Some(q"self.register($convType.instance(), $typeFrom, $typeTo)") + + case _ => None + } + } + + private def genAbstractConversion(conversion: Conversion, convType: PyType): Option[TextTree[PyType]] = { + conversion match { + case _: Conversion.CustomConversionRequired => + Some( + q"""@$pyAbstractMethod + |def ${convType.name}(self): + | raise NotImplementedError + |""".stripMargin + ) + case _ => None + } + } + + private def genConversionTree( + conversion: Conversion, + typeFrom: PyType, + typeTo: PyType, + convType: PyType, + meta: TextTree[PyType], + ): Option[TextTree[PyValue]] = { + conversion match { + case _: Conversion.CopyEnumByName => + Some(q"""class ${convType.name}($pyABC, $baboonAbstractConversion[$typeFrom, $typeTo]): + | @$pyOverride + | def do_convert(self, ctx, conversions, _from: $typeFrom) -> $typeTo: + | return $typeTo[_from.name] + | + | ${meta.shift(4).trim} + |""".stripMargin) + + case c: Conversion.CopyAdtBranchByName => + val memberCases = c.oldDefn + .dataMembers(srcDom) + .map(tid => tid -> typeTranslator.asPyTypeVersioned(tid, srcDom, evolution, pyFileTools.definitionsBasePkg)) + .map { + case (oldTypeId, oldType) => + q"""case $oldType(): + | return ${transfer(TypeRef.Scalar(oldTypeId), q"_from")} + |""".stripMargin + } + val defaultCase = q"""case other: + | raise ValueError(f"Bad input: {other}") + |""".stripMargin + + val cases = memberCases :+ defaultCase + + Some(q"""class ${convType.name}($baboonAbstractConversion[$typeFrom, $typeTo]): + | @$pyOverride + | def do_convert(self, ctx, conversions: $baboonAbstractConversions, _from: $typeFrom) -> $typeTo: + | match _from: + | ${cases.joinN().shift(12).trim} + | + | ${meta.shift(4).trim} + |""".stripMargin) + + case c: Conversion.DtoConversion => + val dtoDefn = domain.defs.meta.nodes(c.sourceTpe) match { + case DomainMember.User(_, d: Typedef.Dto, _, _) => d + case _ => throw new IllegalStateException("DTO expected") + } + val ops = c.ops.map(o => o.targetField -> o).toMap + val assigns = dtoDefn.fields.map { + field => + val op = ops(field) + val fieldName = field.name.name + val fieldRef = q"_from.$fieldName" + val expr = op match { + case o: FieldOp.Transfer => transfer(o.targetField.tpe, fieldRef) + + case o: FieldOp.InitializeWithDefault => + o.targetField.tpe match { + case TypeRef.Constructor(id, args) => + id match { + case TypeId.Builtins.lst => + q"$pyList[${typeTranslator.asPyRef(args.head, domain, evolution)}]()" + case TypeId.Builtins.set => + q"$pySet[${typeTranslator.asPyRef(args.head, domain, evolution)}]()" + case TypeId.Builtins.map => + q"$pyDict[${typeTranslator.asPyRef(args.head, domain, evolution)}, ${typeTranslator.asPyRef(args.last, domain, evolution)}]()" + case TypeId.Builtins.opt => q"None" + case _ => throw new IllegalStateException(s"Unsupported constructor type: $id") + } + case _ => throw new IllegalStateException("Unsupported target field type") + } + + case o: FieldOp.WrapIntoCollection => + o.newTpe.id match { + case TypeId.Builtins.opt => fieldRef + case TypeId.Builtins.set => q"{$fieldRef}" + case TypeId.Builtins.lst => q"[$fieldRef]" + case _ => throw new Exception() + } + + case o: FieldOp.ExpandPrecision => transfer(o.newTpe, q"$fieldRef") + + case o: FieldOp.SwapCollectionType => swapCollType(q"$fieldRef", o) + } + val fieldType = asVersionedIfUserTpe(field.tpe) + q"${field.name.name.toLowerCase}: $fieldType = $expr" + } + val ctorArgs = dtoDefn.fields.map(f => q"${f.name.name.toLowerCase}") + Some(q"""class ${convType.name}($baboonAbstractConversion[$typeFrom, $typeTo]): + | @$pyOverride + | def do_convert(self, ctx, conversions: $baboonAbstractConversions, _from: $typeFrom) -> $typeTo: + | ${assigns.join("\n").shift(8).trim} + | return $typeTo( + | ${ctorArgs.zip(dtoDefn.fields).map { case (a, f) => q"${f.name.name}=$a" }.join(",\n").shift(12).trim} + | ) + | + | ${meta.shift(4).trim} + |""".stripMargin.trim) + + case _: Conversion.CustomConversionRequired => + Some(q"""class ${convType.name}($baboonAbstractConversion[$typeFrom, $typeTo]): + | + | ${meta.shift(4).trim} + |""".stripMargin) + + case _ => None + } + } + + private def swapCollType(fieldRef: TextTree[PyValue], op: FieldOp.SwapCollectionType): TextTree[PyValue] = { + val TypeRef.Constructor(oldId, oldArgs) = op.oldTpe + val TypeRef.Constructor(newId, newArgs) = op.newTpe + val tmp = q"v" + + (oldId, newId) match { + case (TypeId.Builtins.opt, TypeId.Builtins.lst) => + q"[] if $fieldRef is None else [${transfer(newArgs.head, fieldRef, Some(oldArgs.head))}]" + case (TypeId.Builtins.opt, TypeId.Builtins.set) => + q"{} if $fieldRef is None else {${transfer(newArgs.head, fieldRef, Some(oldArgs.head))}}" + case (TypeId.Builtins.opt, TypeId.Builtins.opt) => + q"None if $fieldRef is None else ${transfer(newArgs.head, fieldRef, Some(oldArgs.head))}" + + case (TypeId.Builtins.lst, TypeId.Builtins.lst) => + q"[${transfer(newArgs.head, tmp, Some(oldArgs.head))} for v in range(len($fieldRef))]" + case (TypeId.Builtins.lst, TypeId.Builtins.set) => + q"{${transfer(newArgs.head, tmp, Some(oldArgs.head))} for v in range(len($fieldRef))}" + + case (TypeId.Builtins.set, TypeId.Builtins.lst) => + q"[${transfer(newArgs.head, tmp, Some(oldArgs.head))} for v in range(len($fieldRef))]" + case (TypeId.Builtins.set, TypeId.Builtins.set) => + q"{${transfer(newArgs.head, tmp, Some(oldArgs.head))} for v in range(len($fieldRef))}" + + case (TypeId.Builtins.map, TypeId.Builtins.map) => + val keyRef = q"k" + val valRef = q"v" + q"{${transfer(newArgs.head, keyRef, Some(oldArgs.head))}: ${transfer(newArgs.last, valRef, Some(oldArgs.last))} for k,v in $fieldRef.items()}" + case _ => + throw new IllegalStateException("Unsupported collection swap") + } + } + + private def transfer( + newTpe: TypeRef, + oldRef: TextTree[PyValue], + maybeOldTpe: Option[TypeRef] = None, + ): TextTree[PyValue] = { + val oldTpe = maybeOldTpe.getOrElse(newTpe) + val newTypeRefTree = typeTranslator.asPyRef(newTpe, domain, evolution, pyFileTools.definitionsBasePkg) + val oldTypeRefTree = asVersionedIfUserTpe(oldTpe) + + (newTpe, oldTpe) match { + case (c: TypeRef.Constructor, s: TypeRef.Scalar) => + val headTransfer = transfer(c.args.head, oldRef, Some(s)) + c.id match { + case TypeId.Builtins.opt => q"$headTransfer" + case TypeId.Builtins.lst => q"[$headTransfer]" + case TypeId.Builtins.set => q"{$headTransfer}" + case _ => throw new IllegalStateException(s"Unsupported constructor type: ${c.id}") + } + + case (ns: TypeRef.Scalar, os: TypeRef.Scalar) => + transferScalar(oldRef, newTypeRefTree, oldTypeRefTree, ns, os) + case (TypeRef.Scalar(_), c: TypeRef.Constructor) => + throw new IllegalStateException(s"Unsupported scalar to constructor conversion: ${c.id}") + case (cn: TypeRef.Constructor, co: TypeRef.Constructor) => + transferConstructor(oldRef, cn, co) + + } + } + + private def transferConstructor( + oldRef: TextTree[PyValue], + cn: TypeRef.Constructor, + co: TypeRef.Constructor, + ): TextTree[PyValue] = { + val tmp = q"v" + cn match { + case c: TypeRef.Constructor if c.id == TypeId.Builtins.lst => + q"[${transfer(c.args.head, tmp, Some(co.args.head))} for v in $oldRef]" + + case c: TypeRef.Constructor if c.id == TypeId.Builtins.map => + val keyRef = c.args.head + val valueRef = c.args.last + val kv = q"k" + val vv = q"v" + + q"{${transfer(keyRef, kv, Some(co.args.head))}: ${transfer(valueRef, vv, Some(co.args.last))} for k,v in $oldRef.items()}" + case c: TypeRef.Constructor if c.id == TypeId.Builtins.set => + q"{${transfer(c.args.head, tmp, Some(co.args.head))} for v in $oldRef}" + case c: TypeRef.Constructor if c.id == TypeId.Builtins.opt => + q"None if $oldRef is None else ${transfer(c.args.head, oldRef, Some(co.args.head))}" + case c => throw new IllegalStateException(s"Unsupported constructor type: ${c.id}") + } + } + + private def transferScalar( + oldRef: TextTree[PyValue], + newTypeRefTree: TextTree[PyValue], + oldTypeRefTree: TextTree[PyValue], + newScalar: TypeRef.Scalar, + oldScalar: TypeRef.Scalar, + ): TextTree[PyValue] = { + val direct = if (newScalar == oldScalar) oldRef else q"$newTypeRefTree($oldRef)" + val conv = q"conversions.convert_with_context(ctx, $oldRef, $oldTypeRefTree, $newTypeRefTree)" + + newScalar.id match { + case _: TypeId.Builtin => direct + case id: TypeId.User => + domain.defs.meta.nodes(id) match { + case DomainMember.User(_, _: Typedef.Foreign, _, _) => direct + case _ => conv + } + } + } + + private def asVersionedIfUserTpe(typeRef: TypeRef) = { + typeRef.id match { + case u: TypeId.User => typeTranslator.asPyTypeVersioned(u, srcDom, evolution, pyFileTools.definitionsBasePkg).pipe(t => q"$t") + case _ => typeTranslator.asPyRef(typeRef, domain, evolution, pyFileTools.definitionsBasePkg) + } + } + + private def makeName(conversion: Conversion): String = { + val nameParts = + Seq("Convert") ++ + conversion.sourceTpe.owner.asPseudoPkg ++ + Seq(conversion.sourceTpe.name.name, "From", sourceVersionString) + + nameParts.mkString("__") + } + + private def conversionType(conversion: Conversion): PyType = { + val className = makeName(conversion) + + val moduleName = Seq( + "from", + sourceVersionString, + conversion.sourceTpe.owner.asPseudoPkg.mkString("_"), + s"${conversion.sourceTpe.name.name}", + ).mkString("_") + + val versionPathPart = if (domain.version == evolution.latest) Nil else List(currentVersionString) + val convModuleId = PyModuleId( + NEList.unsafeFrom( + pyFileTools.definitionsBasePkg ++ + domain.id.path ++ + versionPathPart :+ moduleName + ) + ) + PyType(convModuleId, className) + } +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyDefnTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyDefnTranslator.scala new file mode 100644 index 00000000..f730a817 --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyDefnTranslator.scala @@ -0,0 +1,379 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.CompilerProduct +import io.septimalmind.baboon.parser.model.issues.BaboonIssue +import io.septimalmind.baboon.translator.python.PyTypes.* +import io.septimalmind.baboon.translator.python.PyValue.PyType +import io.septimalmind.baboon.typer.BaboonEnquiries +import io.septimalmind.baboon.typer.model.* +import izumi.functional.bio.{Applicative2, F} +import izumi.fundamentals.collections.nonempty.NEList +import izumi.fundamentals.platform.strings.TextTree +import izumi.fundamentals.platform.strings.TextTree.Quote + +trait PyDefnTranslator[F[+_, +_]] { + def translate(defn: DomainMember.User): F[NEList[BaboonIssue], List[PyDefnTranslator.Output]] + def translateFixtures(defn: DomainMember.User): F[NEList[BaboonIssue], List[PyDefnTranslator.Output]] + def translateTests(defn: DomainMember.User): F[NEList[BaboonIssue], List[PyDefnTranslator.Output]] +} + +object PyDefnTranslator { + final case class CodecReg( + typeId: TypeId, + tpe: PyType, + tpeKeepForeigns: PyType, + tpeId: TextTree[PyValue], + trees: Map[String, TextTree[PyValue]], + ) + + final case class Output( + path: String, + tree: TextTree[PyValue], + module: PyValue.PyModuleId, + product: CompilerProduct, + codecReg: List[(String, List[TextTree[PyValue]])] = List.empty, + ) + + final case class PyDefnRepr( + defn: TextTree[PyValue], + codecs: List[CodecReg], + ) + + final class PyDefnTranslatorImpl[F[+_, +_]: Applicative2]( + codecsFixture: PyCodecFixtureTranslator, + codecsTests: PyCodecTestTranslator, + typeTranslator: PyTypeTranslator, + baboonEnquiries: BaboonEnquiries, + codecs: Set[PyCodecTranslator], + pyDomTrees: PyDomainTreeTools, + evolution: BaboonEvolution, + fileTools: PyFileTools, + domain: Domain, + ) extends PyDefnTranslator[F] { + override def translate(defn: DomainMember.User): F[NEList[BaboonIssue], List[Output]] = { + defn.id.owner match { + case Owner.Adt(_) => F.pure(List.empty) + case _ => doTranslate(defn) + } + } + + override def translateFixtures(defn: DomainMember.User): F[NEList[BaboonIssue], List[Output]] = { + defn.id.owner match { + case Owner.Adt(_) => F.pure(List.empty) + case _ => doTranslateFixtures(defn) + } + } + + override def translateTests(defn: DomainMember.User): F[NEList[BaboonIssue], List[Output]] = { + defn.id.owner match { + case Owner.Adt(_) => F.pure(List.empty) + case _ => doTranslateTests(defn) + } + } + + private def doTranslateTests(defn: DomainMember.User): F[NEList[BaboonIssue], List[Output]] = { + val codecsTestsOut = codecsTests + .translate( + defn, + typeTranslator.asPyType(defn.id, domain, evolution, fileTools.definitionsBasePkg), + typeTranslator.asPyTypeKeepForeigns(defn.id, domain, evolution, fileTools.definitionsBasePkg), + ).map( + codecsTest => + Output( + getOutputPath(defn, prefix = Some("test_")), + codecsTest, + typeTranslator.toPyModule(defn.id, domain.version, evolution, fileTools.testsBasePkg), + CompilerProduct.Test, + ) + ) + + F.pure(codecsTestsOut.toList) + } + + private def doTranslateFixtures(defn: DomainMember.User): F[NEList[BaboonIssue], List[Output]] = { + val fixtureTree = codecsFixture + .translate(defn).map( + fixture => + Output( + getOutputPath(defn, suffix = Some("_Fixture")), + fixture, + typeTranslator.toPyModule(defn.id, domain.version, evolution, fileTools.fixturesBasePkg), + CompilerProduct.Fixture, + ) + ) + F.pure(fixtureTree.toList) + } + + private def doTranslate(defn: DomainMember.User): F[NEList[BaboonIssue], List[Output]] = { + val repr = makeFullRepr(defn) + + val regsPerCodec = codecs.toList.map(codecTranslator => + (codecTranslator.id, repr.codecs.flatMap(reg => reg.trees.get(codecTranslator.id).map(expr => q"${reg.tpeId}, $expr"))) + ) + + F.pure( + List( + Output( + getOutputPath(defn), + repr.defn, + typeTranslator.toPyModule(defn.id, domain.version, evolution, fileTools.definitionsBasePkg), + CompilerProduct.Definition, + codecReg = regsPerCodec, + ) + ) + ) + } + + private def makeFullRepr(defn: DomainMember.User): PyDefnRepr = { + val isLatestVersion = domain.version == evolution.latest + + def obsoletePrevious(tree: TextTree[PyValue]): TextTree[PyValue] = { + if (isLatestVersion || tree.isEmpty) tree + else { + q"""@$deprecated("Version ${domain.version.toString} is obsolete, you should migrate to ${evolution.latest.toString}") + |$tree""".stripMargin + } + } + + val pyRef = typeTranslator.asPyType(defn.id, domain, evolution, fileTools.definitionsBasePkg) + val srcRef = typeTranslator.asPyTypeKeepForeigns(defn.id, domain, evolution, fileTools.definitionsBasePkg) + + val repr = mkRepr(defn, isLatestVersion) + val defnRepr = List(obsoletePrevious(repr.defn)) + val codecTrees = codecs.toList.flatMap(_.translate(defn, pyRef, srcRef)).map(obsoletePrevious) + val allDefs = (defnRepr ++ codecTrees).joinNN() + + val reg = defn.defn match { + case _: Typedef.NonDataTypedef => List.empty[CodecReg] + case d => + val codecsReg = codecs.toList + .sortBy(_.getClass.getName) + .flatMap { + codec => + if (codec.isActive(d.id)) { + List(codec.id -> q"${codec.codecType(defn.id)}.instance()") + } else { + List.empty + } + } + List(CodecReg(defn.id, pyRef, srcRef, q"\"${defn.id.toString}\"", codecsReg.toMap)) + } + + val allRegs = reg ++ repr.codecs + + assert(defn.id.pkg == domain.id) + PyDefnRepr(allDefs, allRegs) + } + + private def mkRepr(defn: DomainMember.User, isLatestVersion: Boolean): PyDefnRepr = { + val genMarker = if (isLatestVersion) iBaboonGeneratedLatest else iBaboonGenerated + val codecMeta = codecs.map(_.codecMeta(defn.id).member) + val mainMeta = pyDomTrees.makeDataMeta(defn) ++ codecMeta + val jsonCodecActive = codecs.collectFirst { case jsonCodec: PyJsonCodecGenerator => jsonCodec }.exists(_.isActive(defn.id)) + defn.defn match { + case dto: Typedef.Dto => + val dtoContracts = dto.contracts + val dtoContractsDefs = dtoContracts.flatMap(domain.defs.meta.nodes.get).collect { case DomainMember.User(_, c: Typedef.Contract, _, _) => c } + val contractsFields = dtoContractsDefs.flatMap(_.fields) + + val dtoFieldsTrees = genDtoFields(dto.fields, contractsFields.toSet) + val dtoProperties = genDtoProperties(contractsFields) + + val contractParents = dto.contracts.toSeq + val adtParent = dto.id.owner match { + case Owner.Adt(id) => List(id) + case _ => Nil + } + val directParentsDefs = (adtParent ++ contractParents).flatMap(domain.defs.meta.nodes.get).collect { case u: DomainMember.User => u } + + val superclasses = baboonEnquiries.collectParents(domain, directParentsDefs).toSet + val uniqueContracts = dtoContracts.filterNot(c1 => superclasses.contains(c1)) + val genMarkerParent = if (adtParent.nonEmpty || contractParents.nonEmpty) Nil else List(genMarker) + val adtMemberMetaParent = if (adtParent.isEmpty) Nil else List(iBaboonAdtMemberMeta) + + val superclassesTypes = (adtParent ++ uniqueContracts).map(c => typeTranslator.asPyType(c, domain, evolution, fileTools.definitionsBasePkg)) + + val parentTypes = superclassesTypes ++ genMarkerParent ++ adtMemberMetaParent :+ pydanticBaseModel + + val parents = mkParents(parentTypes) + + val modelConfig = genDtoPydanticModelConf(dto.fields, dtoContracts.nonEmpty, jsonCodecActive) + + val members = + List( + Some(dtoFieldsTrees.joinN()), + Some(modelConfig), + dtoProperties.map(_.joinN()), + Some(mainMeta.joinN()), + ).flatten + + PyDefnRepr( + q"""class ${dto.id.name.name}($parents): + | ${members.joinNN().shift(4).trim} + |""".stripMargin, + List.empty, + ) + + case enum: Typedef.Enum => + val branches = enum.members.map(m => q"${m.name.capitalize} = \"${m.name.capitalize}\"").toSeq + PyDefnRepr( + q"""|class ${enum.id.name.name}($pyEnum): + | ${branches.joinN().shift(4).trim} + |""".stripMargin, + List.empty, + ) + case adt: Typedef.Adt => + val contracts = adt.contracts.map(c => typeTranslator.asPyType(c, domain, evolution, fileTools.definitionsBasePkg)) + val defaultParents = contracts ++ List(pydanticBaseModel) + val genMarkerParent = if (adt.contracts.isEmpty) List(genMarker) else Nil + val allParents = defaultParents ++ genMarkerParent + val parents = mkParents(allParents) + + val memberTrees = adt.members.map( + mid => + domain.defs.meta.nodes.get(mid) match { + case Some(mdefn: DomainMember.User) => makeFullRepr(mdefn) + case m => throw new RuntimeException(s"BUG: missing/wrong adt member: $mid => $m") + } + ) + + val branches = memberTrees + .map(_.defn) + .toSeq + + val jsonCodec = if (jsonCodecActive) { + Some(q""" + |__registry__: dict[str, type] = $pyDefaultDict() + | + |def __init_subclass__(cls, **kwargs): + | super().__init_subclass__(**kwargs) + | ${adt.id.name.name}.__registry__[cls.__name__] = cls + | + |@$pydanticModelSerializer(mode='wrap') + |def serialize(self, serializer): + | return {self.__class__.__name__: serializer(self)} + | + |@$pydanticModelValidator(mode="wrap") + |@$pyClassMethod + |def polymorphic(cls, values, handler): + | if isinstance(values, dict) and len(values) == 1: + | class_name = next(iter(values)) + | registry = ${adt.id.name.name}.__registry__ + | + | if class_name in registry: + | candidate = registry[class_name] + | if issubclass(candidate, cls): + | return candidate.model_validate(values[class_name]) + | else: + | raise ValueError("not subcluss") + | + | return handler(values) + |""".stripMargin) + } else None + + val members = List( + jsonCodec, + Some(mainMeta.joinN()), + ).flatten + + val regs = memberTrees.map(_.codecs) + + PyDefnRepr( + q"""|class ${adt.id.name.name}($parents): + | pass + | + | ${members.joinNN().shift(4).trim} + | + |${branches.joinNN()} + |""".stripMargin, + regs.toList.flatten, + ) + + case contract: Typedef.Contract => + val contracts = contract.contracts.map(c => typeTranslator.asPyType(c, domain, evolution, fileTools.definitionsBasePkg)) + val allParents = if (contract.contracts.isEmpty) List(genMarker, pyABC) ++ contracts else contracts + val parents = mkParents(allParents) + val methods = contract.fields.map { + f => + val tpe = typeTranslator.asPyRef(f.tpe, domain, evolution, fileTools.definitionsBasePkg) + val name = s"${f.name.name}" + q"""@$pyAbstractMethod + |def $name(self) -> $tpe: + | raise NotImplementedError + |""".stripMargin + } + val allMethods = if (methods.isEmpty) q"pass" else methods.joinN() + PyDefnRepr( + q"""|class ${contract.id.name.name}($parents): + | ${allMethods.shift(4).trim} + |""".stripMargin, + List.empty, + ) + case _: Typedef.Service => PyDefnRepr(q"", List.empty) + case _: Typedef.Foreign => PyDefnRepr(q"", List.empty) + } + + } + + private def genDtoFields(dtoFields: List[Field], contractsFields: Set[Field]): List[TextTree[PyValue]] = { + val fields = dtoFields.map { + field => + val fieldName = field.name.name + val fieldType = typeTranslator.asPyRef(field.tpe, domain, evolution, fileTools.definitionsBasePkg) + + if (contractsFields.contains(field)) { + q"${fieldName}_: $fieldType = $pydanticField(alias='$fieldName', serialization_alias='$fieldName')" + } else q"$fieldName: $fieldType" + } + if (fields.isEmpty) List(q"pass") else fields + } + + private def genDtoProperties(contractsFields: List[Field]): Option[List[TextTree[PyValue]]] = { + if (contractsFields.nonEmpty) { + val properties = contractsFields + .map(f => q"""@property + |def ${f.name.name}(self) -> ${typeTranslator.asPyRef(f.tpe, domain, evolution, fileTools.definitionsBasePkg)}: + | return self.${f.name.name}_ + |""".stripMargin) + Some(properties) + } else None + } + + private def genDtoPydanticModelConf(dtoFields: List[Field], hasContracts: Boolean, jsonCodecActive: Boolean): TextTree[PyType] = { + val frozen = Some(q"frozen=True") + val serializeByAlias = if (jsonCodecActive && hasContracts) Some(q"serialize_by_alias=True") else None + val serializeJsonBytesAsHex = + if (dtoFields.map(_.tpe.id).contains(TypeId.Builtins.bytes)) { + List( + q"ser_json_bytes='hex'", + q"val_json_bytes='hex'", + ) + } else Nil + + val serializeDecimalAsJsonNumber = + if (dtoFields.map(_.tpe.id).contains(TypeId.Builtins.f128)) { + List(q"json_encoders={Decimal: float}") + } else Nil + + val configs = List(frozen, serializeByAlias, serializeJsonBytesAsHex, serializeDecimalAsJsonNumber).flatten + + q"""model_config = $pydanticConfigDict( + | ${configs.join(",\n").shift(4).trim} + |)""".stripMargin + } + + private def mkParents(refs: List[PyType]): TextTree[PyValue] = { + if (refs.isEmpty) q"" else q"${refs.map(s => q"$s").join(", ")}" + } + + private def getOutputPath(defn: DomainMember.User, prefix: Option[String] = None, suffix: Option[String] = None): String = { + val fbase = fileTools.basename(domain, evolution) + val fname = s"${prefix.getOrElse("")}${defn.id.name.name}${suffix.getOrElse("")}.py" + defn.defn.id.owner match { + case Owner.Toplevel => s"$fbase/$fname" + case Owner.Ns(path) => s"$fbase/${path.map(_.name.toLowerCase).mkString("/")}/$fname" + case Owner.Adt(id) => s"$fbase/${id.name.name.toLowerCase}.$fname" + } + } + } +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyDomainTreeTools.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyDomainTreeTools.scala new file mode 100644 index 00000000..2da3dc63 --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyDomainTreeTools.scala @@ -0,0 +1,81 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.translator.python.PyTypes.* +import io.septimalmind.baboon.typer.model.{BaboonEvolution, Domain, DomainMember, Owner, Typedef} +import izumi.fundamentals.platform.strings.TextTree +import izumi.fundamentals.platform.strings.TextTree.Quote + +trait PyDomainTreeTools { + def makeDataMeta(defn: DomainMember.User): Seq[TextTree[PyValue]] + def makeCodecMeta(defn: DomainMember.User): Seq[TextTree[PyValue]] +} + +object PyDomainTreeTools { + final class PyDomainTreeToolsImpl( + domain: Domain, + evolution: BaboonEvolution, + typeTranslator: PyTypeTranslator, + pyFileTools: PyFileTools, + ) extends PyDomainTreeTools { + override def makeDataMeta(defn: DomainMember.User): Seq[TextTree[PyValue]] = { + makeFullMeta(defn, isCodec = false) + } + + override def makeCodecMeta(defn: DomainMember.User): Seq[TextTree[PyValue]] = { + defn.defn match { + case _: Typedef.Enum => makeFullMeta(defn, isCodec = true) + case _: Typedef.Foreign => makeFullMeta(defn, isCodec = true) + case _ => makeRefMeta(defn) + } + } + + private def makeFullMeta(defn: DomainMember.User, isCodec: Boolean): Seq[TextTree[PyValue]] = { + val adtMethods = defn.id.owner match { + case Owner.Adt(id) => + List( + q"""baboon_adt_type_identifier: $pyClassVar[$pyStr] = "${id.toString}" + |@$pyClassMethod + |def baboon_adt_type(cls) -> $pyType: + | return cls + |""".stripMargin + ) + case _ => List.empty + } + + val unmodifiedMethods = if (!isCodec) { + val unmodifiedSince = evolution.typesUnchangedSince(domain.version)(defn.id) + List( + q"""baboon_same_in_version: $pyClassVar[$pyList[$pyStr]] = [${unmodifiedSince.sameIn.map(v => q"\"${v.v.toString}\"").toList.join(", ")}]""".stripMargin + ) + } else Nil + + domainAndTypeMeta(defn) ++ unmodifiedMethods ++ adtMethods + } + + private def makeRefMeta(defn: DomainMember.User): Seq[TextTree[PyValue]] = { + val pyType = typeTranslator.asPyType(defn.id, domain, evolution, pyFileTools.definitionsBasePkg) + + val adtMethods = defn.id.owner match { + case Owner.Adt(id) => + List( + q"""baboon_adt_type_identifier: $pyClassVar[$pyStr] = $pyType.baboon_adt_type_identifier + |@$pyClassMethod + |def baboon_adt_type(cls) -> type: + | return type(${typeTranslator.asPyType(id, domain, evolution, pyFileTools.definitionsBasePkg)}) + |""".stripMargin + ) + case _ => Nil + } + + domainAndTypeMeta(defn) ++ adtMethods + } + + private def domainAndTypeMeta(defn: DomainMember.User): Seq[TextTree[PyValue]] = { + Seq( + q"""baboon_domain_version: $pyClassVar[$pyStr] = "${domain.version.v.toString}"""", + q"""baboon_domain_identifier: $pyClassVar[$pyStr] = "${defn.id.pkg.toString}"""", + q"""baboon_type_identifier: $pyClassVar[$pyStr] = "${defn.id.toString}"""", + ) + } + } +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyFileTools.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyFileTools.scala new file mode 100644 index 00000000..e5a8d673 --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyFileTools.scala @@ -0,0 +1,64 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.CompilerTarget.PyTarget +import io.septimalmind.baboon.typer.model.{BaboonEvolution, Domain} +import izumi.fundamentals.collections.nonempty.NEString + +trait PyFileTools { + def basename(dom: Domain, evolution: BaboonEvolution): String + def definitionsBasePkg: List[String] + def fixturesBasePkg: List[String] + def testsBasePkg: List[String] +} + +object PyFileTools { + class ScFileToolsImpl(pyTarget: PyTarget) extends PyFileTools { + private val ( + definitionsBase, + fixturesBase, + testsBase, + ) = collectPackagesBases + + override val definitionsBasePkg: List[String] = definitionsBase.map(_.mkString) + override val fixturesBasePkg: List[String] = fixturesBase.map(_.mkString) + override val testsBasePkg: List[String] = testsBase.map(_.mkString) + + def basename(dom: Domain, evolution: BaboonEvolution): String = { + basename( + dom, + evolution.latest == dom.version, + ) + } + + private def basename(dom: Domain, omitVersion: Boolean): String = { + val base = dom.id.path.map(_.toLowerCase) + val version = dom.version.format(prefix = "v", delimiter = "_") + val segments = if (omitVersion) base else base ++ Seq(version) + segments.mkString("/") + } + + private def collectPackagesBases: (List[NEString], List[NEString], List[NEString]) = { + val basePaths = List( + pyTarget.output.output.segments.toList, + pyTarget.output.fixturesOutput.map(_.segments).getOrElse(Nil), + pyTarget.output.testsOutput.map(_.segments).getOrElse(Nil), + ) + + val longestCommonPrefix = basePaths.reduceLeft { + (currentPrefix, nextSequence) => + currentPrefix + .zip(nextSequence) + .takeWhile { case (a, b) => a == b } + .map(_._1) + } + + if (longestCommonPrefix.nonEmpty) { + ( + pyTarget.output.output.segments.drop(longestCommonPrefix.size).toList, + pyTarget.output.fixturesOutput.map(_.segments).getOrElse(Nil).drop(longestCommonPrefix.size).toList, + pyTarget.output.testsOutput.map(_.segments).getOrElse(Nil).drop(longestCommonPrefix.size).toList, + ) + } else (List(pyTarget.output.output.name), Nil, Nil) + } + } +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyJsonCodecGenerator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyJsonCodecGenerator.scala new file mode 100644 index 00000000..6bf23e74 --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyJsonCodecGenerator.scala @@ -0,0 +1,105 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.CompilerTarget.PyTarget +import io.septimalmind.baboon.parser.model.DerivationDecl +import io.septimalmind.baboon.translator.python.PyTypes.* +import io.septimalmind.baboon.translator.python.PyValue.PyType +import io.septimalmind.baboon.typer.model.{BaboonEvolution, Domain, DomainMember, TypeId, Typedef} +import izumi.fundamentals.platform.strings.TextTree +import izumi.fundamentals.platform.strings.TextTree.Quote + +final class PyJsonCodecGenerator( + typeTranslator: PyTypeTranslator, + treeTools: PyDomainTreeTools, + pyFileTools: PyFileTools, + evolution: BaboonEvolution, + pyTarget: PyTarget, + domain: Domain, +) extends PyCodecTranslator { + override def translate(defn: DomainMember.User, pyRef: PyType, srcRef: PyType): Option[TextTree[PyValue]] = { + (defn.defn match { + case _: Typedef.Dto => Some(genDtoBodies(pyRef)) + case _: Typedef.Adt => Some(genAdtBodies(pyRef)) + case _: Typedef.Enum => Some(genEnumBodies(pyRef)) + case _: Typedef.Foreign => Some(genForeignTypesBodies(pyRef)) + case _: Typedef.Service => None + case _: Typedef.Contract => None + }).map { + case (enc, dec) => genCodec(defn, pyRef, srcRef, enc, dec) + } + } + + private def genCodec( + defn: DomainMember.User, + pyRef: PyType, + srcRef: PyType, + enc: TextTree[PyValue], + dec: TextTree[PyValue], + ): TextTree[PyValue] = { + val baseMethods = + q"""def encode(self, value: $pyRef) -> $pyStr: + | ${enc.shift(4).trim} + | + |def decode(self, wire: $pyStr) -> $pyRef: + | ${dec.shift(4).trim} + |""".stripMargin + + val codecParent = q"$baboonJsonCodec[$pyRef]" + val codecName = q"${srcRef.name}_JsonCodec" + q"""class $codecName($codecParent): + | ${baseMethods.shift(4).trim} + | + | ${treeTools.makeCodecMeta(defn).joinN().shift(4).trim} + | + | @$pyClassMethod + | @$pyCache + | def instance (cls): + | return cls() + |""".stripMargin + } + + private def genForeignTypesBodies(name: PyType): (TextTree[PyValue], TextTree[PyValue]) = { + ( + q"""raise ValueError(f"$name is a foreign type")""", + q"""raise ValueError(f"$name is a foreign type")""", + ) + } + + private def genEnumBodies(name: PyType): (TextTree[PyValue], TextTree[PyValue]) = { + val encode = q"""return $pyJsonDumps(value.value)""".stripMargin + val decode = q"""return $name($pyJsonLoads(wire))""".stripMargin + (encode, decode) + } + + private def genAdtBodies(name: PyType): (TextTree[PyValue], TextTree[PyValue]) = { + val encode = q"""return value.model_dump_json()""".stripMargin + val decode = q"""return $name.model_validate_json(wire)""".stripMargin + (encode, decode) + } + + private def genDtoBodies(name: PyType): (TextTree[PyValue], TextTree[PyValue]) = { + val encode = q"""return value.model_dump_json()""".stripMargin + val decode = q"""return $name.model_validate_json(wire)""".stripMargin + (encode, decode) + } + + override def codecType(tid: TypeId.User): PyType = { + val typeName = s"${tid.name.name}_JsonCodec" + val moduleId = typeTranslator.toPyModule(tid, domain.version, evolution, pyFileTools.definitionsBasePkg) + PyType(moduleId, typeName) + } + + override def codecMeta(tid: TypeId.User): PyCodecTranslator.CodecMeta = { + val meta = q"""@$pyStaticMethod + |def codec_json(): + | return ${codecType(tid)}.instance()""".stripMargin + PyCodecTranslator.CodecMeta(meta) + } + + override def isActive(id: TypeId): Boolean = { + pyTarget.language.generateJsonCodecs && (pyTarget.language.generateJsonCodecsByDefault || domain.derivationRequests + .getOrElse(DerivationDecl("json"), Set.empty[TypeId]).contains(id)) + } + + override def id: String = "json" +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyTypeTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyTypeTranslator.scala new file mode 100644 index 00000000..e65f880c --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyTypeTranslator.scala @@ -0,0 +1,147 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.translator.python.PyTypes.* +import io.septimalmind.baboon.translator.python.PyValue.{PyModuleId, PyType} +import io.septimalmind.baboon.typer.model.* +import izumi.fundamentals.collections.nonempty.NEList +import izumi.fundamentals.platform.strings.TextTree +import izumi.fundamentals.platform.strings.TextTree.Quote + +final class PyTypeTranslator { + def asPyRef( + tpe: TypeRef, + domain: Domain, + evolution: BaboonEvolution, + pkgBase: List[String] = Nil, + ): TextTree[PyValue] = { + tpe match { + case TypeRef.Scalar(id) => + q"${asPyType(id, domain, evolution, pkgBase)}" + case TypeRef.Constructor(id, args) => + val tpe = asPyType(id, domain, evolution, pkgBase) + val targs = args.map(asPyRef(_, domain, evolution, pkgBase)) + q"$tpe[${targs.toSeq.join(", ")}]" + } + } + + def asPyType( + tpe: TypeId, + domain: Domain, + evolution: BaboonEvolution, + pkgBase: List[String] = Nil, + ): PyType = { + tpe match { + case b: TypeId.BuiltinScalar => + b match { + case TypeId.Builtins.i08 | TypeId.Builtins.u08 => pyInt + case TypeId.Builtins.i16 | TypeId.Builtins.u16 => pyInt + case TypeId.Builtins.i32 | TypeId.Builtins.u32 => pyInt + case TypeId.Builtins.i64 | TypeId.Builtins.u64 => pyInt + case TypeId.Builtins.f32 => pyFloat + case TypeId.Builtins.f64 => pyFloat + case TypeId.Builtins.f128 => pyDecimal + case TypeId.Builtins.str => pyStr + case TypeId.Builtins.uid => pyUuid + case TypeId.Builtins.tso | TypeId.Builtins.tsu => pyDateTime + case TypeId.Builtins.bit => pyBool + case TypeId.Builtins.bytes => pyBytes + + case other => throw new IllegalArgumentException(s"Unexpected: $other") + } + case TypeId.Builtins.map => pyDict + case TypeId.Builtins.lst => pyList + case TypeId.Builtins.set => pySet + case TypeId.Builtins.opt => pyOpt + case uid: TypeId.User => asPyTypeDerefForeign(uid, domain, evolution, pkgBase) + case other => throw new IllegalArgumentException(s"Unexpected: $other") + } + } + + def asPyTypeDerefForeign( + tid: TypeId.User, + domain: Domain, + evolution: BaboonEvolution, + pkgBase: List[String] = Nil, + ): PyType = { + derefForeign(tid, domain).getOrElse(asPyTypeKeepForeigns(tid, domain, evolution, pkgBase)) + } + + def asPyTypeKeepForeigns( + tid: TypeId.User, + domain: Domain, + evolution: BaboonEvolution, + pkgBase: List[String] = Nil, + ): PyType = { + val module = toPyModule(tid, domain.version, evolution, pkgBase) + PyType(module, s"${tid.name.name.capitalize}") + } + + def asPyTypeVersioned( + tid: TypeId.User, + domain: Domain, + evolution: BaboonEvolution, + pkgBase: List[String], + ): PyType = { + derefForeign(tid, domain).getOrElse { + val moduleId = toPyModule(tid, domain.version, evolution, pkgBase) + val versionString = domain.version.format(prefix = "v", delimiter = "_") + val ownerPath = renderOwner(tid.owner) + val moduleName = typeModuleName(tid) match { + case Some(name) => ownerPath :+ name + case None => ownerPath + } + val typeName = List(tid.name.name) + val fullTypeName = (List(versionString) ++ moduleName ++ typeName).mkString(".") + PyType(moduleId, fullTypeName, versioned = true) + } + } + + def toPyModule( + tid: TypeId.User, + version: Version, + evolution: BaboonEvolution, + pkgBase: List[String], + ): PyModuleId = { + val pathToModule = tid.pkg.path.toList + val versionPathPart = if (version != evolution.latest) List(version.format(prefix = "v", delimiter = "_")) else Nil + val ownerPath = renderOwner(tid.owner) + val name = typeModuleName(tid).toList + val fullPath = pkgBase ++ pathToModule ++ versionPathPart ++ ownerPath ++ name + PyModuleId(NEList.unsafeFrom(fullPath), if (version == evolution.latest) None else Some(version)) + } + + def toPyModule(pkg: Pkg): PyModuleId = { + PyModuleId(NEList.unsafeFrom(pkg.path.toList)) + } + + private def derefForeign( + tid: TypeId.User, + domain: Domain, + ): Option[PyType] = { + domain.defs.meta.nodes(tid) match { + case DomainMember.User(_, defn: Typedef.Foreign, _, _) => + val foreign = defn.bindings("py") + val parts = foreign.decl.split('.').toList + assert(parts.length > 1) + val module = parts.init + val id = parts.last + Some(PyType(PyModuleId(NEList.unsafeFrom(module)), id)) + case _ => None + } + } + + private def typeModuleName(tid: TypeId.User): Option[String] = { + tid.owner match { + case _: Owner.Adt => None + case _ => Some(tid.name.name) + } + } + + private def renderOwner(owner: Owner): List[String] = { + owner match { + case Owner.Toplevel => Nil + case Owner.Ns(path) => path.map(_.name.toLowerCase).toList + case Owner.Adt(id) => renderOwner(id.owner) :+ id.name.name + } + } +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyTypes.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyTypes.scala new file mode 100644 index 00000000..927c747c --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyTypes.scala @@ -0,0 +1,110 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.translator.python.PyValue.{PyModuleId, PyType} + +object PyTypes { + // baboon + + // baboon modules + val pyBaboonSharedRuntimeModule: PyModuleId = PyModuleId(s"baboon_runtime_shared") + val pyBaboonCodecsModule: PyModuleId = PyModuleId(s"baboon_codecs") + + // python modules + val pyBuiltins: PyModuleId = PyModuleId("builtins") + val pyUUUIDModule: PyModuleId = PyModuleId("uuid") + val pyDateTimeModule: PyModuleId = PyModuleId("datetime") + val pyTypingModule: PyModuleId = PyModuleId("typing") + val pyEnumModule: PyModuleId = PyModuleId("enum") + val pyAbcModule: PyModuleId = PyModuleId("abc") + val pyJson: PyModuleId = PyModuleId("json") + val pyFuncTools: PyModuleId = PyModuleId("functools") + val pyUnittest: PyModuleId = PyModuleId("unittest") + val pyIO: PyModuleId = PyModuleId("io") + val pyDecimalModule: PyModuleId = PyModuleId("decimal") + val pyCollections: PyModuleId = PyModuleId("collections") + + // python external modules + val pydantic: PyModuleId = PyModuleId("pydantic") + + // baboon meta + val baboonMeta: PyType = PyType(pyBaboonSharedRuntimeModule, "BaboonMeta") + val iBaboonGenerated: PyType = PyType(pyBaboonSharedRuntimeModule, "IBaboonGenerated") + val iBaboonGeneratedLatest: PyType = PyType(pyBaboonSharedRuntimeModule, "IBaboonGeneratedLatest") + val iBaboonAdtMemberMeta: PyType = PyType(pyBaboonSharedRuntimeModule, "IBaboonAdtMemberMeta") + + // baboon codecs + val baboonJsonCodec: PyType = PyType(pyBaboonCodecsModule, "BaboonJsonCodec") + val baboonUEBACodec: PyType = PyType(pyBaboonCodecsModule, "BaboonUEBACodec") + def abstractBaboonCodecs(id: String): PyType = PyType(pyBaboonCodecsModule, s"AbstractBaboon${id.capitalize}Codecs") + val baboonCodecContext: PyType = PyType(pyBaboonCodecsModule, "BaboonCodecContext") + val baboonUEBACodecIndexed: PyType = PyType(pyBaboonCodecsModule, "BaboonBinCodecIndexed") + + // baboon conversions + val baboonAbstractConversion: PyType = PyType(pyBaboonSharedRuntimeModule, "BaboonAbstractConversion") + val baboonAbstractConversions: PyType = PyType(pyBaboonSharedRuntimeModule, "BaboonAbstractConversions") + + // baboon types + val deprecated: PyType = PyType(pyBaboonSharedRuntimeModule, "deprecated") + val baboonFixture: PyType = PyType(pyBaboonSharedRuntimeModule, "Fixture") + val baboonLEDataOutputStream: PyType = PyType(pyBaboonCodecsModule, "LEDataOutputStream") + val baboonLEDataInputStream: PyType = PyType(pyBaboonCodecsModule, "LEDataInputStream") + val baboonSafeList: PyType = PyType(pyBaboonCodecsModule, "SafeList") + val baboonSafeSet: PyType = PyType(pyBaboonCodecsModule, "SafeSet") + + // python + + // builtins + val pyInt = PyType(pyBuiltins, "int") + val pyFloat = PyType(pyBuiltins, "float") + val pyDecimal = PyType(pyDecimalModule, "Decimal") + val pyBool = PyType(pyBuiltins, "bool") + val pyStr = PyType(pyBuiltins, "str") + val pyType = PyType(pyBuiltins, "type") + val pyDict = PyType(pyBuiltins, "dict") + val pySet = PyType(pyBuiltins, "set") + val pyList = PyType(pyBuiltins, "list") + val pyClassMethod = PyType(pyBuiltins, "classmethod") + val pyStaticMethod = PyType(pyBuiltins, "staticmethod") + val pyBytes = PyType(pyBuiltins, "bytes") + + // unittest + val pyTestCase = PyType(pyUnittest, "TestCase") + + // io + val pyBytesIO = PyType(pyIO, "BytesIO") + + // functools + val pyCache = PyType(pyFuncTools, "cache") + + // pydantic + val pydanticField = PyType(pydantic, "Field") + val pydanticBaseModel = PyType(pydantic, "BaseModel") + val pydanticConfigDict = PyType(pydantic, "ConfigDict") + val pydanticModelSerializer = PyType(pydantic, "model_serializer") + val pydanticModelValidator = PyType(pydantic, "model_validator") + + // typing + val pyOpt = PyType(pyTypingModule, "Optional") + val pyOverride = PyType(pyTypingModule, "override") + val pyClassVar = PyType(pyTypingModule, "ClassVar") + + // json + val pyJsonDumps = PyType(pyJson, "dumps") + val pyJsonLoads = PyType(pyJson, "loads") + + // uuid + val pyUuid = PyType(pyUUUIDModule, "UUID") + + // datetime + val pyDateTime = PyType(pyDateTimeModule, "datetime") + + // enum + val pyEnum = PyType(pyEnumModule, "Enum") + + // abc + val pyABC: PyType = PyType(pyAbcModule, "ABC") + val pyAbstractMethod = PyType(pyAbcModule, "abstractmethod") + + // collections + val pyDefaultDict: PyType = PyType(pyCollections, "defaultdict") +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyUEBACodecGenerator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyUEBACodecGenerator.scala new file mode 100644 index 00000000..ed4621f2 --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyUEBACodecGenerator.scala @@ -0,0 +1,435 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.CompilerTarget.PyTarget +import io.septimalmind.baboon.parser.model.DerivationDecl +import io.septimalmind.baboon.translator.python.PyTypes.* +import io.septimalmind.baboon.translator.python.PyValue.PyType +import io.septimalmind.baboon.typer.model.* +import izumi.fundamentals.platform.strings.TextTree +import izumi.fundamentals.platform.strings.TextTree.Quote + +class PyUEBACodecGenerator( + typeTranslator: PyTypeTranslator, + treeTools: PyDomainTreeTools, + evolution: BaboonEvolution, + pyFileTools: PyFileTools, + pyTarget: PyTarget, + domain: Domain, +) extends PyCodecTranslator { + override def translate( + defn: DomainMember.User, + pyRef: PyValue.PyType, + srcRef: PyValue.PyType, + ): Option[TextTree[PyValue]] = { + (defn.defn match { + case d: Typedef.Dto => Some(genDtoBodies(pyRef, d)) + case e: Typedef.Enum => Some(genEnumBodies(e)) + case a: Typedef.Adt => Some(genAdtBodies(pyRef, a)) + case _: Typedef.Foreign => Some(genForeignTypesBodies(pyRef)) + case _: Typedef.Service => None + case _: Typedef.Contract => None + }).map { + case (enc, dec) => + val branchDecoder = defn.defn match { + case d: Typedef.Dto => genBranchDecoder(pyRef, d) + case _ => None + } + genCodec(defn, pyRef, srcRef, enc, dec, branchDecoder) + } + } + + private def genCodec( + defn: DomainMember.User, + pyRef: PyType, + srcRef: PyType, + enc: TextTree[PyValue], + dec: TextTree[PyValue], + branchDecoder: Option[TextTree[PyValue]], + ): TextTree[PyValue] = { + val indexBody = defn.defn match { + case d: Typedef.Dto => + val varlens = d.fields.filter(f => domain.refMeta(f.tpe).len.isVariable) + val comment = varlens.map(f => q"# ${f.toString}").joinN() + q"""$comment + |return ${varlens.size.toString}""".stripMargin + + case _: Typedef.Enum => q"return 0" + case _: Typedef.Adt => q"return 0" + case _: Typedef.Foreign => q"""raise ValueError("$pyRef is a foreign type")""" + + case d: Typedef.Contract => throw new IllegalArgumentException(s"BUG: contract codec should not be rendered: $d") + case d: Typedef.Service => throw new IllegalArgumentException(s"BUG: service codec should not be rendered: $d") + } + + val indexMethods = List( + q"""def index_elements_count(self, ctx: $baboonCodecContext) -> $pyInt: + | ${indexBody.shift(4).trim} + |""".stripMargin + ) + + val methods = + List(q"""def encode(self, ctx: $baboonCodecContext, wire: $baboonLEDataOutputStream, value: $pyRef): + | ${enc.shift(4).trim} + | + |def decode(self, ctx: $baboonCodecContext, wire: $baboonLEDataInputStream) -> $pyRef: + | ${dec.shift(4).trim} + |""".stripMargin) ++ branchDecoder.map { + body => + q"""def decode_branch(self, ctx: $baboonCodecContext, wire: $baboonLEDataInputStream) -> $pyRef: + | ${body.shift(4).trim} + |""".stripMargin + }.toList ++ indexMethods + + val parents = defn.defn match { + case _: Typedef.Enum => List(q"$baboonUEBACodec[${pyRef.name}]", q"$baboonUEBACodecIndexed") + case _ => + val adtParents: List[TextTree[PyValue]] = defn.id.owner match { + case Owner.Adt(_) => List(q"$iBaboonAdtMemberMeta") + case _ => List.empty + } + + List( + q"$baboonUEBACodec[$pyRef]", + q"$baboonUEBACodecIndexed", + ) ++ adtParents + } + + val name = q"${srcRef.name}_UEBACodec" + + q"""class $name(${parents.join(", ")}): + | ${methods.joinNN().shift(4).trim} + | + | ${treeTools.makeCodecMeta(defn).joinN().shift(4).trim} + | + | @$pyClassMethod + | @$pyCache + | def instance (cls): + | return cls() + |""".stripMargin + } + + private def genBranchDecoder( + name: PyType, + dto: Typedef.Dto, + ): Option[TextTree[PyValue]] = { + dto.id.owner match { + case Owner.Adt(_) if pyTarget.language.wrappedAdtBranchCodecs => + val fieldsCodecs = fieldsOf(dto).map { case (enc, dec, _) => (enc, dec) } + Some(genDtoDecoder(name, fieldsCodecs, dto)) + case _ => None + } + } + + private def genEnumBodies(enum: Typedef.Enum): (TextTree[PyValue], TextTree[PyValue]) = { + val branches = enum.members.zipWithIndex.toList.map { + case (m, i) => + ( + q"""if value.value == "${m.name}": + | wire.write_byte(${i.toString}) + | return + |""".stripMargin, + q"""if as_byte == ${i.toString}: + | return ${enum.id.name.name}.${m.name} + |""".stripMargin, + ) + } + + ( + q"""${branches.map(_._1).joinN()} + | + |raise ValueError(f"Cannot encode {value} to ${enum.id.name.name}: no matching value")""".stripMargin, + q"""as_byte = wire.read_byte() + | + |${branches.map(_._2).joinN()} + | + |raise ValueError(f"Cannot decode {wire} to ${enum.id.name.name}: no matching value")""".stripMargin, + ) + } + + private def genAdtBodies(name: PyType, adt: Typedef.Adt): (TextTree[PyValue], TextTree[PyValue]) = { + val branches = adt.dataMembers(domain).zipWithIndex.map { + case (member, i) => + val cName = codecType(member) + val encoder = { + if (pyTarget.language.wrappedAdtBranchCodecs) { + q"""if isinstance(value, ${member.name.name}): + | $cName.instance().encode(ctx, wire, value) + | return + |""".stripMargin + } else { + q"""if isinstance(value, ${member.name.name}): + | wire.write_byte(${i.toString}) + | $cName.instance().encode(ctx, wire, value) + | return + |""".stripMargin + } + } + val decoder = { + if (pyTarget.language.wrappedAdtBranchCodecs) { + q"""if as_byte == ${i.toString}: + | return $cName.instance().decode_branch(ctx, wire) + |""".stripMargin + } else { + q"""if as_byte == ${i.toString}: + | return $cName.instance().decode(ctx, wire) + |""".stripMargin + } + } + (encoder, decoder) + } + + ( + q"""${branches.map(_._1).joinN()} + | + |raise ValueError(f"Cannot encode {value} to $name: no matching value") + |""".stripMargin, + q"""as_byte = wire.read_byte() + | + |${branches.map(_._2).joinN()} + | + |raise ValueError(f"Cannot decode {wire} to $name: no matching value") + |""".stripMargin, + ) + } + + private def genDtoDecoder(name: PyValue.PyType, fields: List[(TextTree[PyValue], TextTree[PyValue])], dto: Typedef.Dto): TextTree[PyValue] = { + val fieldsDecoders = dto.fields.zip(fields.map(_._2)).map { case (field, decoder) => q"${field.name.name}=$decoder" } + q"""index = self.read_index(ctx, wire) + | + |if ctx.use_indices: + | assert len(index) == self.index_elements_count(ctx) + | + |return ${name.name}( + | ${fieldsDecoders.join(",\n").shift(4).trim} + |) + |""".stripMargin + } + + private def genDtoBodies(name: PyType, dto: Typedef.Dto): (TextTree[PyValue], TextTree[PyValue]) = { + def adtBranchIndex(id: TypeId.User) = { + domain.defs.meta + .nodes(id).asInstanceOf[DomainMember.User] + .defn.asInstanceOf[Typedef.Adt] + .dataMembers(domain) + .zipWithIndex.find(_._1 == dto.id).get._2 + } + + val fields = fieldsOf(dto) + + val noIndex = Seq( + q"wire.write_byte(header)", + fields.map(_._1).joinN(), + ).filterNot(_.isEmpty).join("\n") + + val fieldsEncoders = + q"""header = 0b0000000 + | + |if ctx.use_indices: + | header = (header | 0b0000001) & 0xFF + | wire.write_byte(header) + | write_memory_stream = $pyBytesIO() + | fake_writer = $baboonLEDataOutputStream(write_memory_stream) + | ${fields.map(_._3).join("\n").shift(4).trim} + | write_memory_stream.flush() + | wire.write(write_memory_stream.getvalue()) + |else: + | ${noIndex.shift(4).trim} + |""".stripMargin + + val fieldsDecoders = genDtoDecoder(name, fields.map { case (a, b, _) => (a, b) }, dto) + + val enc = dto.id.owner match { + case Owner.Adt(id) if pyTarget.language.wrappedAdtBranchCodecs => + val idx = adtBranchIndex(id) + q"""wire.write_byte(${idx.toString}) + |$fieldsEncoders""".stripMargin + case _ => fieldsEncoders + } + + val dec = dto.id.owner match { + case Owner.Adt(id) if pyTarget.language.wrappedAdtBranchCodecs => + val idx = adtBranchIndex(id) + q"""marker = wire.read_byte() + |assert marker == ${idx.toString} + |return self.decode_branch(ctx, wire)""".stripMargin + case _ => fieldsDecoders + } + + (enc, dec) + } + + private def fieldsOf(dto: Typedef.Dto): List[(TextTree[PyValue], TextTree[PyValue], TextTree[PyValue])] = { + dto.fields.map { + f => + val fieldRef = q"value.${f.name.name}" + val encoder = mkEncoder(f.tpe, fieldRef, q"wire") + val fakeEnc = mkEncoder(f.tpe, fieldRef, q"fake_writer") + val dec = mkDecoder(f.tpe) + + val w = domain.refMeta(f.tpe).len match { + case BinReprLen.Fixed(bytes) => + q"""# ${f.toString} + |before = write_memory_stream.tell() + |${fakeEnc.trim} + |after = write_memory_stream.tell() + |length = after - before + |assert length == ${bytes.toString} + |""".stripMargin + + case v: BinReprLen.Variable => + val sanityChecks = v match { + case BinReprLen.Unknown() => + q"assert after >= before, f\"Got after={after}, before={before}\"" + + case BinReprLen.Alternatives(variants) => + q"assert length in {${variants.mkString(", ")}}, f\"Got length={length}\"" + + case BinReprLen.Range(min, max) => + List( + Some(q"assert length >= ${min.toString}, f\"Got length={length}\" "), + max.map(m => q"assert length <= ${m.toString}, $$\"Got length={length}\""), + ).flatten.joinN() + } + + q"""# ${f.toString} + |before = write_memory_stream.tell() + |wire.write_i32(before) + |${fakeEnc.trim} + |after = write_memory_stream.tell() + |length = after - before + |wire.write_i32(length) + |${sanityChecks.trim} + |""".stripMargin + } + (encoder, dec, w) + } + } + + private def mkEncoder(tpe: TypeRef, ref: TextTree[PyValue], writerRef: TextTree[PyValue]): TextTree[PyValue] = { + tpe match { + case TypeRef.Scalar(id) => + id match { + case s: TypeId.BuiltinScalar => + s match { + case TypeId.Builtins.bit => q"$writerRef.write_bool($ref)" + case TypeId.Builtins.i08 => q"$writerRef.write_byte($ref)" + case TypeId.Builtins.i16 => q"$writerRef.write_i16($ref)" + case TypeId.Builtins.i32 => q"$writerRef.write_i32($ref)" + case TypeId.Builtins.i64 => q"$writerRef.write_i64($ref)" + case TypeId.Builtins.u08 => q"$writerRef.write_ubyte($ref)" + case TypeId.Builtins.u16 => q"$writerRef.write_u16($ref)" + case TypeId.Builtins.u32 => q"$writerRef.write_u32($ref)" + case TypeId.Builtins.u64 => q"$writerRef.write_u64($ref)" + case TypeId.Builtins.f32 => q"$writerRef.write_f32($ref)" + case TypeId.Builtins.f64 => q"$writerRef.write_f64($ref)" + + case TypeId.Builtins.f128 => q"$writerRef.write_f128($ref)" + case TypeId.Builtins.str => q"$writerRef.write_str($ref)" + + case TypeId.Builtins.uid => q"$writerRef.write_uuid($ref)" + case TypeId.Builtins.tsu => q"$writerRef.write_datetime($ref)" + case TypeId.Builtins.tso => q"$writerRef.write_datetime($ref)" + + case TypeId.Builtins.bytes => q"$writerRef.write_bytes($ref)" + + case o => throw new RuntimeException(s"BUG: Unexpected type: $o") + } + case u: TypeId.User => + val target = codecType(u) + q"$target.instance().encode(ctx, $writerRef, $ref)" + } + case c: TypeRef.Constructor => + c.id match { + case TypeId.Builtins.opt => + q"$writerRef.write_optional($ref, lambda v: ${mkEncoder(c.args.head, q"v", writerRef)})" + case TypeId.Builtins.map => + val keyEncoder = mkEncoder(c.args.head, q"v", writerRef) + val valueEncoder = mkEncoder(c.args.last, q"v", writerRef) + q"$writerRef.write_dict($ref, lambda v: $keyEncoder, lambda v: $valueEncoder)" + case TypeId.Builtins.lst => + q"$writerRef.write_seq($ref, lambda v: ${mkEncoder(c.args.head, q"v", writerRef)})" + case TypeId.Builtins.set => + q"$writerRef.write_seq($ref, lambda v: ${mkEncoder(c.args.head, q"v", writerRef)})" + case o => + throw new RuntimeException(s"BUG: Unexpected type: $o") + } + } + } + + private def mkDecoder(tpe: TypeRef): TextTree[PyValue] = { + tpe match { + case TypeRef.Scalar(id) => + id match { + case s: TypeId.BuiltinScalar => + s match { + case TypeId.Builtins.bit => q"wire.read_bool()" + case TypeId.Builtins.i08 => q"wire.read_byte()" + case TypeId.Builtins.i16 => q"wire.read_i16()" + case TypeId.Builtins.i32 => q"wire.read_i32()" + case TypeId.Builtins.i64 => q"wire.read_i64()" + case TypeId.Builtins.u08 => q"wire.read_ubyte()" + case TypeId.Builtins.u16 => q"wire.read_u16()" + case TypeId.Builtins.u32 => q"wire.read_u32()" + case TypeId.Builtins.u64 => q"wire.read_u64()" + case TypeId.Builtins.f32 => q"wire.read_f32()" + case TypeId.Builtins.f64 => q"wire.read_f64()" + + case TypeId.Builtins.f128 => q"wire.read_f128()" + case TypeId.Builtins.str => q"wire.read_str()" + + case TypeId.Builtins.uid => q"wire.read_uuid()" + case TypeId.Builtins.tsu => q"wire.read_datetime()" + case TypeId.Builtins.tso => q"wire.read_datetime()" + + case TypeId.Builtins.bytes => q"wire.read_bytes()" + + case o => throw new RuntimeException(s"BUG: Unexpected type: $o") + } + case u: TypeId.User => q"${codecType(u)}.instance().decode(ctx, wire)" + } + case c: TypeRef.Constructor => + c.id match { + case TypeId.Builtins.opt => + q"None if wire.read_byte() == 0 else ${mkDecoder(c.args.head)}" + case TypeId.Builtins.map => + val keyDecoder = mkDecoder(c.args.head) + val valueDecoder = mkDecoder(c.args.last) + q"{$keyDecoder: $valueDecoder for _ in range(wire.read_i32())}" + case TypeId.Builtins.lst => + q"[${mkDecoder(c.args.head)} for _ in range(wire.read_i32())]" + case TypeId.Builtins.set => + q"{${mkDecoder(c.args.head)} for _ in range(wire.read_i32())}" + case o => + throw new RuntimeException(s"BUG: Unexpected type: $o") + } + } + } + + private def genForeignTypesBodies(name: PyType): (TextTree[PyValue], TextTree[PyValue]) = { + ( + q"""raise ValueError(f"${name.name} is a foreign type")""", + q"""raise ValueError(f"${name.name} is a foreign type")""", + ) + } + + override def codecType(tid: TypeId.User): PyType = { + val typeName = s"${tid.name.name}_UEBACodec" + val moduleId = typeTranslator + .toPyModule(tid, domain.version, evolution, pyFileTools.definitionsBasePkg) + PyType(moduleId, typeName) + } + + override def codecMeta(tid: TypeId.User): PyCodecTranslator.CodecMeta = { + val meta = q"""@$pyStaticMethod + |def codec_ueba(): + | return ${codecType(tid)}.instance()""".stripMargin + PyCodecTranslator.CodecMeta(meta) + } + + override def isActive(id: TypeId): Boolean = { + pyTarget.language.generateUebaCodecs && (pyTarget.language.generateUebaCodecsByDefault || domain.derivationRequests + .getOrElse(DerivationDecl("ueba"), Set.empty[TypeId]).contains(id)) + } + + override def id: String = "ueba" +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyValue.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyValue.scala new file mode 100644 index 00000000..2f29f7d2 --- /dev/null +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyValue.scala @@ -0,0 +1,24 @@ +package io.septimalmind.baboon.translator.python + +import io.septimalmind.baboon.typer.model.Version +import izumi.fundamentals.collections.nonempty.NEList + +sealed trait PyValue +object PyValue { + final case class PyModuleId(path: NEList[String], version: Option[Version] = None) { + val module: String = path.last + val moduleVersionString: Option[String] = version.map(v => v.format(prefix = "v", delimiter = "_")) + val pathToVersion: List[String] = path.toList.takeWhile(p => !moduleVersionString.contains(p)) + def withModuleName(name: String): PyModuleId = { + this.copy(path = NEList.unsafeFrom(path.toList.init :+ name)) + } + val isBaboonModule: Boolean = path.head.startsWith("baboon") + } + object PyModuleId { + def apply(module: String): PyModuleId = { + new PyModuleId(NEList.unsafeFrom(List(module)), None) + } + } + + final case class PyType(moduleId: PyModuleId, name: String, versioned: Boolean = false) extends PyValue +} diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/typer/BaboonEnquiries.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/typer/BaboonEnquiries.scala index c2ae5e3e..352948a6 100644 --- a/baboon-compiler/src/main/scala/io/septimalmind/baboon/typer/BaboonEnquiries.scala +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/typer/BaboonEnquiries.scala @@ -29,6 +29,8 @@ trait BaboonEnquiries { def isEnum(tpe: TypeRef, domain: Domain): Boolean def unfold(dom: Domain, contracts: List[TypeId.User]): List[Field] + + def collectParents(domain: Domain, definitions: List[DomainMember.User]): List[TypeId.User] } object BaboonEnquiries { @@ -416,6 +418,40 @@ object BaboonEnquiries { } } + override def collectParents(domain: Domain, definitions: List[DomainMember.User]): List[TypeId.User] = { + def collectUserDefinitions(ids: List[TypeId.User]): List[DomainMember.User] = { + ids.flatMap(domain.defs.meta.nodes.get).collect { case u: DomainMember.User => u } + } + + @tailrec + def loop(acc: List[TypeId.User], toProcess: List[DomainMember.User]): List[TypeId.User] = { + toProcess match { + case Nil => acc + case head :: tail => + head.defn match { + case d: Typedef.Dto => + val adtParent = d.id.owner match { + case Owner.Adt(id) => collectUserDefinitions(List(id)) + case _ => List.empty + } + val contractsDefs = collectUserDefinitions(d.contracts) + val all = adtParent.map(_.id) ++ contractsDefs.map(_.id) + loop(acc ++ all, tail ++ adtParent ++ contractsDefs) + + case adt: Typedef.Adt => + val contractsDefs = collectUserDefinitions(adt.contracts) + loop(acc ++ contractsDefs.map(_.id), tail ++ contractsDefs) + + case c: Typedef.Contract => + val contractsDefs = collectUserDefinitions(c.contracts) + loop(acc ++ contractsDefs.map(_.id), tail ++ contractsDefs) + + case _ => loop(acc, tail) + } + } + } + loop(Nil, definitions) + } } } diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/typer/model/Version.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/typer/model/Version.scala index f29e678c..17fa10cf 100644 --- a/baboon-compiler/src/main/scala/io/septimalmind/baboon/typer/model/Version.scala +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/typer/model/Version.scala @@ -16,6 +16,10 @@ case class Version(v: izumi.fundamentals.platform.versions.Version) { def <=(o: Version)(implicit ord: Ordering[izumi.fundamentals.platform.versions.Version]): Boolean = !(this > o) def >=(o: Version)(implicit ord: Ordering[izumi.fundamentals.platform.versions.Version]): Boolean = !(this < o) + + def format(prefix: String = "", delimiter: String): String = { + s"$prefix${toString.replace(".", delimiter)}" + } } object Version { diff --git a/baboon-compiler/src/test/resources/baboon/pkg0/pkg01.baboon b/baboon-compiler/src/test/resources/baboon/pkg0/pkg01.baboon index 3b67048b..053e0e8e 100644 --- a/baboon-compiler/src/test/resources/baboon/pkg0/pkg01.baboon +++ b/baboon-compiler/src/test/resources/baboon/pkg0/pkg01.baboon @@ -5,11 +5,13 @@ version "1.0.0" foreign ObscureInt { cs = "System.Int32" scala = "java.lang.Integer" + py = "builtins.int" } foreign ForeignStruct { cs = "BaboonDefinitions.Foreign.TestForeignStruct" with { "value-type" = "yes" } scala = "java.lang.Integer" + py = "typing.NamedTuple" } @@ -248,7 +250,6 @@ root data T13_2 { f: map[T13_1, i32] f1: map[uid, i32] } - root data T14_FieldRename { oldName: str unchanged: i32 diff --git a/baboon-compiler/src/test/resources/baboon/pkg0/pkg02.baboon b/baboon-compiler/src/test/resources/baboon/pkg0/pkg02.baboon index 412df194..14e537bf 100644 --- a/baboon-compiler/src/test/resources/baboon/pkg0/pkg02.baboon +++ b/baboon-compiler/src/test/resources/baboon/pkg0/pkg02.baboon @@ -14,6 +14,7 @@ enum T1_E1 { foreign ObscureInt { cs = "System.Int32" scala = "java.lang.Integer" + py = "builtins.int" } root data T1_E1_RET { diff --git a/baboon-compiler/src/test/resources/baboon/pkg0/pkg03.baboon b/baboon-compiler/src/test/resources/baboon/pkg0/pkg03.baboon index c5907db5..c4cf9ed0 100644 --- a/baboon-compiler/src/test/resources/baboon/pkg0/pkg03.baboon +++ b/baboon-compiler/src/test/resources/baboon/pkg0/pkg03.baboon @@ -303,4 +303,4 @@ root data T14_FieldRename { root data T15_FieldRenameWithTypeChange { newField: i32 was oldField keepField: str -} +} \ No newline at end of file diff --git a/run b/run new file mode 100755 index 00000000..e69de29b diff --git a/test/conv-test-cs/ConvTest/Test_CrossLanguageCompat.cs b/test/conv-test-cs/ConvTest/Test_CrossLanguageCompat.cs index d4b75c22..b02e14de 100644 --- a/test/conv-test-cs/ConvTest/Test_CrossLanguageCompat.cs +++ b/test/conv-test-cs/ConvTest/Test_CrossLanguageCompat.cs @@ -5,13 +5,16 @@ using Baboon.Runtime.Shared; using Newtonsoft.Json; using Newtonsoft.Json.Linq; +using System.Linq; namespace ConvTest { [TestFixture] public class Test_CrossLanguageCompat { - private readonly string baseDir = Path.GetFullPath(Path.Combine("..", "..", "..", "..", "..", "..", "target", "compat-test")); + private readonly string baseDir = + Path.GetFullPath(Path.Combine("..", "..", "..", "..", "..", "..", "target", "compat-test")); + private readonly BaboonCodecContext ctx = BaboonCodecContext.Default; // Helper methods @@ -19,7 +22,8 @@ private AllBasicTypes ReadJsonFile(string source, string format) { var file = Path.Combine(baseDir, $"{source}-json", "all-basic-types.json"); var jsonStr = File.ReadAllText(file, Encoding.UTF8); - using var reader = new JsonTextReader(new StringReader(jsonStr)) { DateParseHandling = DateParseHandling.None }; + using var reader = new JsonTextReader(new StringReader(jsonStr)) + { DateParseHandling = DateParseHandling.None }; var jsonToken = JToken.Load(reader); return AllBasicTypes_JsonCodec.Instance.Decode(ctx, jsonToken); } @@ -41,15 +45,15 @@ private void AssertBasicFields(AllBasicTypes data, string label) Assert.That(data.Vbit, Is.True); } - private void PrintComparison(string label, AllBasicTypes scalaData, AllBasicTypes csData) + private void PrintComparison(string label, string lang, AllBasicTypes langData, AllBasicTypes csData) { Console.WriteLine($"Comparing Scala and C# {label} data:"); - Console.WriteLine($" Scala: vi8={scalaData.Vi8}, vi16={scalaData.Vi16}, vi32={scalaData.Vi32}, vi64={scalaData.Vi64}"); - Console.WriteLine($" C#: vi8={csData.Vi8}, vi16={csData.Vi16}, vi32={csData.Vi32}, vi64={csData.Vi64}"); - Console.WriteLine($" Scala: vf32={scalaData.Vf32}, vf64={scalaData.Vf64}, vf128={scalaData.Vf128}"); - Console.WriteLine($" C#: vf32={csData.Vf32}, vf64={csData.Vf64}, vf128={csData.Vf128}"); - Console.WriteLine($" Scala: vtsu={scalaData.Vtsu}, vtso={scalaData.Vtso}"); - Console.WriteLine($" C#: vtsu={csData.Vtsu}, vtso={csData.Vtso}"); + Console.WriteLine($" {lang}: vi8={langData.Vi8}, vi16={langData.Vi16}, vi32={langData.Vi32}, vi64={langData.Vi64}"); + Console.WriteLine($" C#: vi8={csData.Vi8}, vi16={csData.Vi16}, vi32={csData.Vi32}, vi64={csData.Vi64}"); + Console.WriteLine($" {lang}: vf32={langData.Vf32}, vf64={langData.Vf64}, vf128={langData.Vf128}"); + Console.WriteLine($" C#: vf32={csData.Vf32}, vf64={csData.Vf64}, vf128={csData.Vf128}"); + Console.WriteLine($" {lang}: vtsu={langData.Vtsu}, vtso={langData.Vtso}"); + Console.WriteLine($" C#: vtsu={csData.Vtsu}, vtso={csData.Vtso}"); } // JSON Tests @@ -65,6 +69,12 @@ public void CSharp_JSON_Deserialization_Should_Read_CSharp_Generated_JSON() AssertBasicFields(ReadJsonFile("cs", "C# JSON"), "C# JSON"); } + [Test] + public void CSharp_JSON_Deserialization_Should_Read_Python_Generated_JSON() + { + AssertBasicFields(ReadJsonFile("cs", "C# JSON"), "C# JSON"); + } + // UEBA Tests [Test] public void CSharp_UEBA_Deserialization_Should_Read_Scala_Generated_UEBA() @@ -78,13 +88,20 @@ public void CSharp_UEBA_Deserialization_Should_Read_CSharp_Generated_UEBA() AssertBasicFields(ReadUebaFile("cs", "C# UEBA"), "C# UEBA"); } + [Test] + public void CSharp_UEBA_Deserialization_Should_Read_Python_Generated_UEBA() + { + AssertBasicFields(ReadUebaFile("python", "C# UEBA"), "C# UEBA"); + } + + // Cross-language comparison [Test] public void CrossLanguage_Comparison_Should_Verify_Scala_And_CSharp_JSON_Produce_Equivalent_Data() { var scalaData = ReadJsonFile("scala", "Scala JSON"); var csData = ReadJsonFile("cs", "C# JSON"); - PrintComparison("JSON", scalaData, csData); + PrintComparison("JSON", "Scala", scalaData, csData); Assert.That(csData, Is.EqualTo(scalaData), "Scala and C# JSON data should be equal"); } @@ -93,8 +110,26 @@ public void CrossLanguage_Comparison_Should_Verify_Scala_And_CSharp_UEBA_Produce { var scalaData = ReadUebaFile("scala", "Scala UEBA"); var csData = ReadUebaFile("cs", "C# UEBA"); - PrintComparison("UEBA", scalaData, csData); + PrintComparison("UEBA", "Scala", scalaData, csData); Assert.That(csData, Is.EqualTo(scalaData), "Scala and C# UEBA data should be equal"); } + + [Test] + public void CrossLanguage_Comparison_Should_Verify_Python_And_CSharp_JSON_Produce_Equivalent_Data() + { + var csData = ReadJsonFile("cs", "C# JSON"); + var pythonData = ReadJsonFile("python", "python JSON"); + PrintComparison("JSON", "Python", pythonData, csData); + Assert.That(csData, Is.EqualTo(pythonData), "Python and C# JSON data should be equal"); + } + + [Test] + public void CrossLanguage_Comparison_Should_Verify_Python_And_CSharp_UEBA_Produce_Equivalent_Data() + { + var pythonData = ReadUebaFile("python", "python UEBA"); + var csData = ReadUebaFile("cs", "C# UEBA"); + PrintComparison("UEBA", "python", pythonData, csData); + Assert.That(csData, Is.EqualTo(pythonData), "python and C# UEBA data should be equal"); + } } -} +} \ No newline at end of file diff --git a/test/conv-test-py/compat_main.py b/test/conv-test-py/compat_main.py new file mode 100644 index 00000000..7e35a52d --- /dev/null +++ b/test/conv-test-py/compat_main.py @@ -0,0 +1,72 @@ +import io +from datetime import datetime, timezone, timedelta + +from decimal import Decimal +from pathlib import Path +from uuid import UUID + +from Generated.convtest.testpkg.AllBasicTypes import AllBasicTypes, AllBasicTypes_JsonCodec, AllBasicTypes_UEBACodec +from Generated.baboon_codecs import BaboonCodecContext, LEDataInputStream, LEDataOutputStream + + +def create_sample_data(): + return AllBasicTypes( + vi8=42, + vi16=1234, + vi32=123456, + vi64=123456789, + vu8=200, + vu16=50000, + vu32=3000000000, + vu64=10000000000, + vf32=3.14159, + vf64=2.718281828, + vf128=Decimal("123456789.987654321"), + vstr="Hello, Baboon!", + vbstr=b'Hello Bytes', + vuid=UUID("12345678-1234-5678-1234-567812345678"), + vbit=True, + vtsu=datetime(2024, 6, 15, 12, 30, 45, 123456, tzinfo=timezone.utc), + vtso=datetime(2024, 6, 15, 14, 30, 45, 987654, tzinfo=timezone(timedelta(hours=2))), + voptStr="optional value", + vlstI32=[1, 2, 3, 4, 5], + vsetStr={"apple", "banana", "cherry"}, + vmapStrI32={"one": 1, "two": 2, "three": 3}, + voptLst=["nested", "list", "values"], + vlstOpt=[10, None, 20, 30], + vmapLst={"numbers": [1, 2, 3], "more": [4, 5, 6]}, + ) + + +# create sample data will all basic types +sample_data = create_sample_data() + +# Create output directories - use absolute path relative to project root +base_dir = Path("../../target/compat-test").resolve() +json_dir = base_dir / "python-json" +ueba_dir = base_dir / "python-ueba" + +json_dir.mkdir(parents=True, exist_ok=True) +ueba_dir.mkdir(parents=True, exist_ok=True) + +# Serialize to JSON +json_str = AllBasicTypes_JsonCodec.instance().encode(sample_data) +json_file_path = json_dir / "all-basic-types.json" +with open(json_file_path, "w", encoding="utf-8") as f: + f.write(json_str) + +print(f"Written JSON to {json_file_path}") + +# Serialize to UEBA +memory_stream = io.BytesIO() +ueba_writer = LEDataOutputStream(memory_stream) +AllBasicTypes_UEBACodec.instance().encode(BaboonCodecContext.default(), ueba_writer, sample_data) +ueba_bytes = memory_stream.getvalue() + +ueba_file_path = ueba_dir / "all-basic-types.ueba" +with open(ueba_file_path, "wb") as f: + f.write(ueba_bytes) + +print(f"Written UEBA to {ueba_file_path}") + +print("Python serialization complete!") diff --git a/test/conv-test-py/requirements.txt b/test/conv-test-py/requirements.txt new file mode 100644 index 00000000..46857f69 --- /dev/null +++ b/test/conv-test-py/requirements.txt @@ -0,0 +1 @@ +pydantic==2.12.5 \ No newline at end of file diff --git a/test/conv-test-py/test_conversions.py b/test/conv-test-py/test_conversions.py new file mode 100644 index 00000000..2313a48a --- /dev/null +++ b/test/conv-test-py/test_conversions.py @@ -0,0 +1,19 @@ +from unittest import TestCase + +from Generated.convtest.testpkg import v1_0_0 +from Generated.convtest.testpkg.Adt0 import B1 +from Generated.convtest.testpkg import Adt0 +from Generated.convtest.testpkg.baboon_runtime import BaboonConversions, RequiredConversions + +class TestConversions(TestCase): + def test_derived_conversion_adt_autoupgrade(self): + b1 = v1_0_0.Adt0.B1(f="value") + conv = BaboonConversions(required=RequiredConversions()) + + converted = conv.convert_with_context(conv, b1, v1_0_0.Adt0.B1, B1) + + self.assertEqual(b1.f, converted.f) + + converted2 = conv.convert_with_context(conv, b1, v1_0_0.Adt0.Adt0, Adt0.Adt0) + + self.assertEqual(converted, converted2) diff --git a/test/cs-stub/BaboonDefinitions/BaboonDefinitions.csproj b/test/cs-stub/BaboonDefinitions/BaboonDefinitions.csproj index be84dee4..c242b0c9 100644 --- a/test/cs-stub/BaboonDefinitions/BaboonDefinitions.csproj +++ b/test/cs-stub/BaboonDefinitions/BaboonDefinitions.csproj @@ -1,4 +1,4 @@ - + netstandard2.1 @@ -12,4 +12,4 @@ - + \ No newline at end of file diff --git a/test/cs-stub/BaboonTests/BaboonTests.csproj b/test/cs-stub/BaboonTests/BaboonTests.csproj index 937bd63d..d4afed2f 100644 --- a/test/cs-stub/BaboonTests/BaboonTests.csproj +++ b/test/cs-stub/BaboonTests/BaboonTests.csproj @@ -18,4 +18,4 @@ - + \ No newline at end of file diff --git a/test/cs-stub/ConversionsTest.sln b/test/cs-stub/ConversionsTest.sln index ae198619..a58e61da 100644 --- a/test/cs-stub/ConversionsTest.sln +++ b/test/cs-stub/ConversionsTest.sln @@ -1,4 +1,3 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BaboonTests", "BaboonTests\BaboonTests.csproj", "{5DFBB7B1-5992-44B3-B75E-C228BB133718}" EndProject @@ -19,4 +18,4 @@ Global {2A158F54-564F-4130-894D-9665B70BF3EC}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A158F54-564F-4130-894D-9665B70BF3EC}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection -EndGlobal +EndGlobal \ No newline at end of file diff --git a/test/py-stub/requirements.txt b/test/py-stub/requirements.txt new file mode 100644 index 00000000..46857f69 --- /dev/null +++ b/test/py-stub/requirements.txt @@ -0,0 +1 @@ +pydantic==2.12.5 \ No newline at end of file From 672e2e23cfa78694b1a9fba2febef16a9ed41ffc Mon Sep 17 00:00:00 2001 From: nikita-ty754 Date: Wed, 3 Dec 2025 11:50:27 +0200 Subject: [PATCH 2/5] ref --- .../translator/python/PyBaboonTranslator.scala | 12 ++++-------- .../translator/python/PyCodecTestTranslator.scala | 2 +- 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala index 41e86561..18108386 100644 --- a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala @@ -29,8 +29,7 @@ class PyBaboonTranslator[F[+_, +_]: Error2]( for { translated <- translateFamily(family) runtime <- sharedRuntime() - fixture <- sharedFixture() - rendered = (translated ++ runtime ++ fixture).map { + rendered = (translated ++ runtime).map { o => val content = renderTree(o) (o.path, OutputFile(content, o.product)) @@ -128,9 +127,6 @@ class PyBaboonTranslator[F[+_, +_]: Error2]( } else F.pure(Nil) } - private def sharedFixture(): Out[List[PyDefnTranslator.Output]] = { - F.pure(Nil) - } private def renderTree(o: PyDefnTranslator.Output): String = { val usedTypes = o.tree.values.collect { case t: PyValue.PyType => t } @@ -147,10 +143,10 @@ class PyBaboonTranslator[F[+_, +_]: Error2]( q"from ${path.mkString(".")} import ${module.moduleVersionString.getOrElse("")}" }.toList - val usualImportsByModule = usual - .groupBy(_.moduleId).toList.sortBy { case (moduleId, types) => moduleId.path.size + types.size }.reverse.map { + val usualImportsByModule = usual.groupBy(_.moduleId).toList + .sortBy { case (moduleId, types) => moduleId.path.size + types.size }.reverse.map { case (module, types) => - if (module.isBaboonModule) { + if (module == pyBaboonCodecsModule || module == pyBaboonSharedRuntimeModule) { val baseString = pyFileTools.definitionsBasePkg.mkString(".") val typesString = types.map(_.name).mkString(", ") q"from $baseString.${module.module} import $typesString" diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTestTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTestTranslator.scala index c191f884..8d695ef6 100644 --- a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTestTranslator.scala +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyCodecTestTranslator.scala @@ -112,7 +112,7 @@ object PyCodecTestTranslator { | |""".stripMargin case unknown => - logger.message(s"Cannot create codec tests () for unsupported type $srcRef") + logger.message(s"Cannot create codec tests (${unknown.id}) for unsupported type $srcRef") q"" }.toList.map(_.stripMargin.trim).joinNN().shift(4).trim } From bedb32cf001fde4835ddf6976f273b14cb9b227d Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Thu, 15 Jan 2026 10:19:53 +0000 Subject: [PATCH 3/5] wip: python --- .gitignore | 2 + .../python/PyBaboonTranslator.scala | 41 ++++++++++++++++--- .../python/PyConversionTranslator.scala | 29 ++++++++++--- .../python/PyJsonCodecGenerator.scala | 4 +- .../python/PyUEBACodecGenerator.scala | 4 +- 5 files changed, 65 insertions(+), 15 deletions(-) diff --git a/.gitignore b/.gitignore index 84b450f0..f5183b38 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +__pycache__ +.venv .direnv baboon.json .idea diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala index 18108386..a6f1dff1 100644 --- a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyBaboonTranslator.scala @@ -91,14 +91,25 @@ class PyBaboonTranslator[F[+_, +_]: Error2]( } private def genInitPy(definitions: List[PyDefnTranslator.Output], domain: Domain): PyDefnTranslator.Output = { - val modules = definitions.map(o => q"${o.module.module}") - val importTree = q"""from . import ( - | ${modules.join(",\n").shift(4)} - |)""".stripMargin val initPyModule = typeTranslator.toPyModule(domain.id) val versionStr = domain.version.format(prefix = "v", delimiter = "_") val fileName = "__init__.py" - val path = initPyModule.path ++ List(versionStr, fileName) + val initPyDir = initPyModule.path.toList :+ versionStr + val expectedDepth = initPyDir.size + 1 + + val sameLevelModules = definitions + .filter(o => o.path.split("/").length == expectedDepth) + .map(o => q"${o.module.module}") + + val importTree = if (sameLevelModules.nonEmpty) { + q"""from . import ( + | ${sameLevelModules.join(",\n").shift(4)} + |)""".stripMargin + } else { + q"" + } + + val path = initPyDir :+ fileName PyDefnTranslator.Output( path.mkString("/"), importTree, @@ -143,6 +154,24 @@ class PyBaboonTranslator[F[+_, +_]: Error2]( q"from ${path.mkString(".")} import ${module.moduleVersionString.getOrElse("")}" }.toList + val namespaceImports = versioned + .filter { t => + val parts = t.name.split('.') + parts.length > 3 + } + .flatMap { t => + val parts = t.name.split('.') + val versionPart = parts.head + val namespacePart = parts(1) + val modulePart = parts(2) + val pathToVersion = t.moduleId.pathToVersion + val nsImport = q"from ${(pathToVersion :+ versionPart).mkString(".")} import $namespacePart" + val moduleImport = q"from ${(pathToVersion :+ versionPart :+ namespacePart).mkString(".")} import $modulePart" + List(nsImport, moduleImport) + } + .distinct + .toList + val usualImportsByModule = usual.groupBy(_.moduleId).toList .sortBy { case (moduleId, types) => moduleId.path.size + types.size }.reverse.map { case (module, types) => @@ -156,7 +185,7 @@ class PyBaboonTranslator[F[+_, +_]: Error2]( } } - val allImports = (usualImportsByModule ++ versionPkgImports).joinN() + val allImports = (usualImportsByModule ++ versionPkgImports ++ namespaceImports).joinN() val full = Seq(allImports, o.tree).joinNN() diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyConversionTranslator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyConversionTranslator.scala index 05a262dc..631add3f 100644 --- a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyConversionTranslator.scala +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyConversionTranslator.scala @@ -45,12 +45,12 @@ final class PyConversionTranslator[F[+_, +_]: Error2]( F.flatTraverseAccumErrors(rules.conversions) { case _: Conversion.RemovedTypeNoConversion => F.pure(Nil) case _: Conversion.NonDataTypeTypeNoConversion => F.pure(Nil) - case conversion => + case conversion: TargetedConversion => val convType = conversionType(conversion) val fileName = s"${convType.moduleId.module}.py" val typeFrom = typeTranslator.asPyTypeVersioned(conversion.sourceTpe, srcDom, evolution, pyFileTools.definitionsBasePkg) - def typeTo = typeTranslator.asPyType(conversion.sourceTpe, domain, evolution, pyFileTools.definitionsBasePkg) + def typeTo = typeTranslator.asPyType(conversion.targetTpe, domain, evolution, pyFileTools.definitionsBasePkg) val meta = q"""@$pyStaticMethod @@ -121,7 +121,7 @@ final class PyConversionTranslator[F[+_, +_]: Error2]( ): Option[TextTree[PyValue]] = { conversion match { case _: Conversion.CopyEnumByName => - Some(q"""class ${convType.name}($pyABC, $baboonAbstractConversion[$typeFrom, $typeTo]): + Some(q"""class ${convType.name}($baboonAbstractConversion[$typeFrom, $typeTo]): | @$pyOverride | def do_convert(self, ctx, conversions, _from: $typeFrom) -> $typeTo: | return $typeTo[_from.name] @@ -135,8 +135,9 @@ final class PyConversionTranslator[F[+_, +_]: Error2]( .map(tid => tid -> typeTranslator.asPyTypeVersioned(tid, srcDom, evolution, pyFileTools.definitionsBasePkg)) .map { case (oldTypeId, oldType) => + val newTypeId = c.branchMapping.getOrElse(oldTypeId.name.name, oldTypeId) q"""case $oldType(): - | return ${transfer(TypeRef.Scalar(oldTypeId), q"_from")} + | return ${transfer(TypeRef.Scalar(newTypeId), q"_from", Some(TypeRef.Scalar(oldTypeId)))} |""".stripMargin } val defaultCase = q"""case other: @@ -155,7 +156,7 @@ final class PyConversionTranslator[F[+_, +_]: Error2]( |""".stripMargin) case c: Conversion.DtoConversion => - val dtoDefn = domain.defs.meta.nodes(c.sourceTpe) match { + val dtoDefn = domain.defs.meta.nodes(c.targetTpe) match { case DomainMember.User(_, d: Typedef.Dto, _, _) => d case _ => throw new IllegalStateException("DTO expected") } @@ -195,6 +196,24 @@ final class PyConversionTranslator[F[+_, +_]: Error2]( case o: FieldOp.ExpandPrecision => transfer(o.newTpe, q"$fieldRef") case o: FieldOp.SwapCollectionType => swapCollType(q"$fieldRef", o) + + case o: FieldOp.Rename => + val srcFieldRef = q"_from.${o.sourceFieldName.name}" + transfer(o.targetField.tpe, srcFieldRef) + + case o: FieldOp.Redef => + val srcFieldRef = q"_from.${o.sourceFieldName.name}" + o.modify match { + case m: FieldOp.WrapIntoCollection => + m.newTpe.id match { + case TypeId.Builtins.opt => srcFieldRef + case TypeId.Builtins.set => q"{$srcFieldRef}" + case TypeId.Builtins.lst => q"[$srcFieldRef]" + case _ => throw new IllegalStateException(s"Unsupported collection type: ${m.newTpe.id}") + } + case m: FieldOp.ExpandPrecision => transfer(m.newTpe, srcFieldRef) + case m: FieldOp.SwapCollectionType => swapCollType(srcFieldRef, m) + } } val fieldType = asVersionedIfUserTpe(field.tpe) q"${field.name.name.toLowerCase}: $fieldType = $expr" diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyJsonCodecGenerator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyJsonCodecGenerator.scala index 6bf23e74..e047904a 100644 --- a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyJsonCodecGenerator.scala +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyJsonCodecGenerator.scala @@ -1,7 +1,7 @@ package io.septimalmind.baboon.translator.python import io.septimalmind.baboon.CompilerTarget.PyTarget -import io.septimalmind.baboon.parser.model.DerivationDecl +import io.septimalmind.baboon.parser.model.RawMemberMeta import io.septimalmind.baboon.translator.python.PyTypes.* import io.septimalmind.baboon.translator.python.PyValue.PyType import io.septimalmind.baboon.typer.model.{BaboonEvolution, Domain, DomainMember, TypeId, Typedef} @@ -98,7 +98,7 @@ final class PyJsonCodecGenerator( override def isActive(id: TypeId): Boolean = { pyTarget.language.generateJsonCodecs && (pyTarget.language.generateJsonCodecsByDefault || domain.derivationRequests - .getOrElse(DerivationDecl("json"), Set.empty[TypeId]).contains(id)) + .getOrElse(RawMemberMeta.Derived("json"), Set.empty[TypeId]).contains(id)) } override def id: String = "json" diff --git a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyUEBACodecGenerator.scala b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyUEBACodecGenerator.scala index ed4621f2..bf10d25c 100644 --- a/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyUEBACodecGenerator.scala +++ b/baboon-compiler/src/main/scala/io/septimalmind/baboon/translator/python/PyUEBACodecGenerator.scala @@ -1,7 +1,7 @@ package io.septimalmind.baboon.translator.python import io.septimalmind.baboon.CompilerTarget.PyTarget -import io.septimalmind.baboon.parser.model.DerivationDecl +import io.septimalmind.baboon.parser.model.RawMemberMeta import io.septimalmind.baboon.translator.python.PyTypes.* import io.septimalmind.baboon.translator.python.PyValue.PyType import io.septimalmind.baboon.typer.model.* @@ -428,7 +428,7 @@ class PyUEBACodecGenerator( override def isActive(id: TypeId): Boolean = { pyTarget.language.generateUebaCodecs && (pyTarget.language.generateUebaCodecsByDefault || domain.derivationRequests - .getOrElse(DerivationDecl("ueba"), Set.empty[TypeId]).contains(id)) + .getOrElse(RawMemberMeta.Derived("ueba"), Set.empty[TypeId]).contains(id)) } override def id: String = "ueba" From ca372a12154998d8edd1297fd7826c00dde89636 Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Thu, 15 Jan 2026 12:24:54 +0000 Subject: [PATCH 4/5] wip: windows --- .mdl/defs/tests.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.mdl/defs/tests.md b/.mdl/defs/tests.md index 6c382e7c..8653d87f 100644 --- a/.mdl/defs/tests.md +++ b/.mdl/defs/tests.md @@ -109,7 +109,7 @@ Run Python tests with regular adt codecs. TEST_DIR="${action.test-gen-regular-adt.test_dir}" pushd "$TEST_DIR/py-stub" python3 -m venv .venv -source .venv/bin/activate +if [ -f ".venv/Scripts/activate" ]; then source .venv/Scripts/activate; else source .venv/bin/activate; fi python3 -m pip install -r requirements.txt python3 -m unittest discover -s BaboonTests/GeneratedTests/testpkg/pkg0 popd @@ -207,7 +207,7 @@ Run Python tests with wrapped ADT codecs TEST_DIR="${action.test-gen-regular-adt.test_dir}" pushd "$TEST_DIR/py-stub" python3 -m venv .venv -source .venv/bin/activate +if [ -f ".venv/Scripts/activate" ]; then source .venv/Scripts/activate; else source .venv/bin/activate; fi python3 -m pip install -r requirements.txt python3 -m unittest discover -s BaboonTests/GeneratedTests/testpkg/pkg0 popd @@ -247,7 +247,7 @@ dep action.test-gen-manual pushd ./test/conv-test-py python3 -m venv .venv -source .venv/bin/activate +if [ -f ".venv/Scripts/activate" ]; then source .venv/Scripts/activate; else source .venv/bin/activate; fi python3 -m pip install -r requirements.txt python3 compat_main.py popd @@ -333,7 +333,7 @@ Run Python conversion test ```bash dep action.test-gen-compat-python pushd ./test/conv-test-py -source .venv/bin/activate +if [ -f ".venv/Scripts/activate" ]; then source .venv/Scripts/activate; else source .venv/bin/activate; fi python3 -m unittest discover -s . popd From 36eb359deabc5a21ed47218968620794abb94b60 Mon Sep 17 00:00:00 2001 From: Pavel Shirshov Date: Thu, 15 Jan 2026 12:27:49 +0000 Subject: [PATCH 5/5] wip: lockfile --- deps.lock.json | 1480 ++---------------------------------------------- 1 file changed, 32 insertions(+), 1448 deletions(-) diff --git a/deps.lock.json b/deps.lock.json index 33db6793..c9801dc6 100644 --- a/deps.lock.json +++ b/deps.lock.json @@ -9,38 +9,6 @@ "url": "https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.github.sbt/sbt-duplicates-finder/scala_2.12/sbt_1.0/1.1.0/jars/sbt-duplicates-finder.jar", "sha256": "1rfn4vd8kk3pl0qzbgzv7db7yjf8wqrdsh29l8inp13y8s4r53sx" }, - { - "url": "https://repo.scala-sbt.org/scalasbt/sbt-plugin-releases/com.github.sbt/sbt-duplicates-finder/scala_2.12/sbt_1.0/1.1.0/srcs/sbt-duplicates-finder-sources.jar", - "sha256": "1482kq095rk2cz05npbz22i9kc8135rwgr24bvj7fr6a1ba0h4pf" - }, - { - "url": "https://repo1.maven.org/maven2/ch/epfl/scala/bloop-config_2.12/2.3.3/bloop-config_2.12-2.3.3-sources.jar", - "sha256": "1grcvighqlda1ipm2dwh59zb4v74ilgyb787i86n9jz4vdfjvyjb" - }, - { - "url": "https://repo1.maven.org/maven2/ch/epfl/scala/bloop-config_2.12/2.3.3/bloop-config_2.12-2.3.3.jar", - "sha256": "1mn4h8l7z00dji4gzdi4sigxbnh5959pnra602ply3k7f4gbzbw4" - }, - { - "url": "https://repo1.maven.org/maven2/ch/epfl/scala/bloop-config_2.12/2.3.3/bloop-config_2.12-2.3.3.pom", - "sha256": "1qhhgh2rja0rawzg0n2n5rwy3va8aafqxl729cb6yg81pr9klzca" - }, - { - "url": "https://repo1.maven.org/maven2/ch/epfl/scala/sbt-bloop_2.12_1.0/2.0.17/sbt-bloop_2.12_1.0-2.0.17-sources.jar", - "sha256": "183hiv4i8qgp7qkbkqnd08kqgj587gv786x36v7kb9mi9j7d953s" - }, - { - "url": "https://repo1.maven.org/maven2/ch/epfl/scala/sbt-bloop_2.12_1.0/2.0.17/sbt-bloop_2.12_1.0-2.0.17.jar", - "sha256": "0wchcv2arzzwsyg42kwzm1basdhhbj9a5ww821gx82w7y5gvbhhp" - }, - { - "url": "https://repo1.maven.org/maven2/ch/epfl/scala/sbt-bloop_2.12_1.0/2.0.17/sbt-bloop_2.12_1.0-2.0.17.pom", - "sha256": "1di8al9bmsxsn6063cbvkm2p4av3n56w6n2rkjn4w55paq9b2jby" - }, - { - "url": "https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.3.9/logback-core-1.3.9-sources.jar", - "sha256": "1lj58bv3i4l5fpzd8xl3k0zakism83sj27785qbk095lkpvy96lf" - }, { "url": "https://repo1.maven.org/maven2/ch/qos/logback/logback-core/1.3.9/logback-core-1.3.9.jar", "sha256": "0qf8h3cbvpi015bbzmxipfpgz74rinp0hwnfgzi1b7i5k1ssri9d" @@ -73,22 +41,6 @@ "url": "https://repo1.maven.org/maven2/com/chuusai/shapeless_sjs1_2.13/2.3.7/shapeless_sjs1_2.13-2.3.7.pom", "sha256": "0mwmz2d8qdbsx516gna43i3zzlbg8r7df930x0526rk0pmk9x4f4" }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-apache-http_2.12/0.7.0/gigahorse-apache-http_2.12-0.7.0-sources.jar", - "sha256": "0dmv8n0g0rylamhgi9jay5dn1dy0x7z79y1snvw282g2yh3w2z1b" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-apache-http_2.12/0.7.0/gigahorse-apache-http_2.12-0.7.0.jar", - "sha256": "12fnln8wvp8gmhcwp4m6zwkaa7xl414sn9figxbr43izdl5w40gk" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-apache-http_2.12/0.7.0/gigahorse-apache-http_2.12-0.7.0.pom", - "sha256": "1q2r9x02qx5dg1y17kivyz4p2qsc1758rbvmmslqc4rxz7p837kk" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-apache-http_2.12/0.9.3/gigahorse-apache-http_2.12-0.9.3-sources.jar", - "sha256": "1cdqyrxc14q60jghnqw6cxwj6jkxz2481fam7hcc5wabv6n0gsb2" - }, { "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-apache-http_2.12/0.9.3/gigahorse-apache-http_2.12-0.9.3.jar", "sha256": "0dz19ijzwyghcxjqhilyy8z36c23gk74md94c67kildfkns3jxc2" @@ -98,24 +50,12 @@ "sha256": "15j4qh41ccawjxb4ribsiy95g6m5skglas5lvys9h68napj1zqfw" }, { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.4.0/gigahorse-core_2.12-0.4.0.pom", - "sha256": "016qvlpk20in5a2wdp438frbi83fz5sf2nbada4j9vlfdjjgrjxa" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.7.0/gigahorse-core_2.12-0.7.0-sources.jar", - "sha256": "0j4im3fjpmmxjf8rmqg3fwg0dif0pbjhd3bk42p4d80vp14zy31z" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.7.0/gigahorse-core_2.12-0.7.0.jar", - "sha256": "01ppricd07swq8vd3lp9klmgkwhiapwfydwarjzcgdpmldkb44kf" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.7.0/gigahorse-core_2.12-0.7.0.pom", - "sha256": "0p6acki1dyf89956nbkxiw5bawmrdr23w1ma2kbr8wysrhr1rga3" + "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.4.0/gigahorse-core_2.12-0.4.0.jar", + "sha256": "0g9xifyh2j5krymfrsi5vy9s3qxsjskv9fvwb3h9qda3g2zz7ahh" }, { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.9.3/gigahorse-core_2.12-0.9.3-sources.jar", - "sha256": "1wkv2rji9dhdmrk2ch3rk4lvvm1qvdmimnd191my7rk4lgj56jgr" + "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.4.0/gigahorse-core_2.12-0.4.0.pom", + "sha256": "016qvlpk20in5a2wdp438frbi83fz5sf2nbada4j9vlfdjjgrjxa" }, { "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.9.3/gigahorse-core_2.12-0.9.3.jar", @@ -125,10 +65,6 @@ "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-core_2.12/0.9.3/gigahorse-core_2.12-0.9.3.pom", "sha256": "1l067rjbsm79032si2xzh9q5cmzhw4a0hw66rdf8yr7lvdmnd9bn" }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-okhttp_2.12/0.4.0/gigahorse-okhttp_2.12-0.4.0-sources.jar", - "sha256": "107lxyfg4lr67qa3ibdc90axrxy5fwxx5f0phyczkphfiyd2phd2" - }, { "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-okhttp_2.12/0.4.0/gigahorse-okhttp_2.12-0.4.0.jar", "sha256": "03k2hqdzvc19w15q189mblvfw87hp93b3x8z7ha09ly2psm3827p" @@ -137,22 +73,6 @@ "url": "https://repo1.maven.org/maven2/com/eed3si9n/gigahorse-okhttp_2.12/0.4.0/gigahorse-okhttp_2.12-0.4.0.pom", "sha256": "0cpj5379a9d626s2bn211xg5vf15bf0pj1v94rzxdlzb4z9avwkv" }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-apache-httpasyncclient/0.7.0/shaded-apache-httpasyncclient-0.7.0-sources.jar", - "sha256": "13y147jqcjfd54nrvk0vsqh2rg5vy374j2x3v7cblryd9hxm1siz" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-apache-httpasyncclient/0.7.0/shaded-apache-httpasyncclient-0.7.0.jar", - "sha256": "08fwa5ciy5k8jgwmc69vcnpr0yk11ids6f39jzjq64kl40vnrscq" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-apache-httpasyncclient/0.7.0/shaded-apache-httpasyncclient-0.7.0.pom", - "sha256": "0vslmsydcr0mcqh0dzx279fmvnxwvi5r02jqrq6zhxzfp7kgzyyk" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-apache-httpclient5/0.9.3/shaded-apache-httpclient5-0.9.3-sources.jar", - "sha256": "1fzm8p6gskq52gag61xjk2ywbgqpyskkh49lgjclk11hkvvfh4bm" - }, { "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-apache-httpclient5/0.9.3/shaded-apache-httpclient5-0.9.3.jar", "sha256": "0q4ghs6wphya93qi73n24yaigq1gf24zqycif4ml4b9496zzqdr3" @@ -161,22 +81,6 @@ "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-apache-httpclient5/0.9.3/shaded-apache-httpclient5-0.9.3.pom", "sha256": "1yldpbva1m2ngn6whf335dsq4dqf6vp264q87vkbam6zkh3kwzdq" }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-jawn-parser_2.12/0.9.1/shaded-jawn-parser_2.12-0.9.1-sources.jar", - "sha256": "0ljgjkp85qpay2x9p6w455cp8nwizmmgnqpgs22j8rc3rb9in14h" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-jawn-parser_2.12/0.9.1/shaded-jawn-parser_2.12-0.9.1.jar", - "sha256": "0mwcrzr8jy9w2bzar9z0q91rbxn42sxrix0ydjlwf64mia2bbxbc" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-jawn-parser_2.12/0.9.1/shaded-jawn-parser_2.12-0.9.1.pom", - "sha256": "1fvrfx3pln9g1q77jy8jaqgg4gbmz1w3n41v201gbmbmln7jh1aq" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-jawn-parser_2.12/1.3.2/shaded-jawn-parser_2.12-1.3.2-sources.jar", - "sha256": "1sbjprnvl6mvxjfj7kmypd0pf9cz2g85wvybgdmvi59lrd8i30gy" - }, { "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-jawn-parser_2.12/1.3.2/shaded-jawn-parser_2.12-1.3.2.jar", "sha256": "1glk3xlb39hnd4q0bn218d1jzd73w98ql011p19mmcj9s7zjrx3n" @@ -185,10 +89,6 @@ "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-jawn-parser_2.12/1.3.2/shaded-jawn-parser_2.12-1.3.2.pom", "sha256": "1yvk08m25846019giv14nlsjzjgkrivsyy0i8ajhbv67pm8nvchv" }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4-sources.jar", - "sha256": "0l75yjh6fndi4ialaz36nvcw7fqy3bk98pszbzmb06chfqy0wh3k" - }, { "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4.jar", "sha256": "0h2s0p3ja8c3c8szcy9zc2jmkcznq5kvfk2bgpjhz87w631m2h16" @@ -197,10 +97,6 @@ "url": "https://repo1.maven.org/maven2/com/eed3si9n/shaded-scalajson_2.12/1.0.0-M4/shaded-scalajson_2.12-1.0.0-M4.pom", "sha256": "1l0mfsrynxykl0f0b0i9d2nkz92d4075n2pql5bk9awc51a07yfa" }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.10.1/sjson-new-core_2.12-0.10.1-sources.jar", - "sha256": "11cgd23253f6zw8vg62ys6qf06xw8xq2ynlqzgxl9714sx4nx1fh" - }, { "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.10.1/sjson-new-core_2.12-0.10.1.jar", "sha256": "1awkmprry5pkzx6cqbfggckidffpf2jpvrqjg5zd10ykjna0rpry" @@ -209,26 +105,6 @@ "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.10.1/sjson-new-core_2.12-0.10.1.pom", "sha256": "1c75ads44iwiagv4x5xdizjvdva2zxx74xi6mqy3mmrmawl931rj" }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.9.0/sjson-new-core_2.12-0.9.0.pom", - "sha256": "0b8g46khrz7ga1f01d6hyhraapapi800l0ym6xhnabwzz3cda294" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.9.1/sjson-new-core_2.12-0.9.1-sources.jar", - "sha256": "0f1ivdhzyf9ffnyyni0fnaizbbxyashaz92w0kj16h3amk3fkw4h" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.9.1/sjson-new-core_2.12-0.9.1.jar", - "sha256": "0pckm4wx4bznwaf6qhwm0flhpqd4qws5nrcc9gniszl0gf2ygiq1" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-core_2.12/0.9.1/sjson-new-core_2.12-0.9.1.pom", - "sha256": "0zzg8i4nql0nm5lwiv24iw5b7g6ckdlavikwb5qy9hmswym6fc89" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.10.1/sjson-new-murmurhash_2.12-0.10.1-sources.jar", - "sha256": "0zh83b00m85kifsy6231i9djyyw9ss09bgxmvkkpybg9wxq8f4z8" - }, { "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.10.1/sjson-new-murmurhash_2.12-0.10.1.jar", "sha256": "13y36nc69inwa9r42bgj82rvb1i6q5c6fdk5n4400kn6ilm02f5s" @@ -237,22 +113,6 @@ "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.10.1/sjson-new-murmurhash_2.12-0.10.1.pom", "sha256": "1sfhxmskmhwa6dwsl3ldbx6yblmlpq9qixza0xjg77z28ciapmp5" }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.9.1/sjson-new-murmurhash_2.12-0.9.1-sources.jar", - "sha256": "18a6zgfchzz933ymrsvhcq88xmp1gl1aibggfbwmypv9jn77n87c" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.9.1/sjson-new-murmurhash_2.12-0.9.1.jar", - "sha256": "01w4pl4hvy585x28xfr2cmfdzmyynhzvfdypsr02qlspss7nsmfr" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-murmurhash_2.12/0.9.1/sjson-new-murmurhash_2.12-0.9.1.pom", - "sha256": "0k7kbv6whl1c3xr9nvchcq8fnh10mbx14h1q0dsbad7clxfzi72s" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.10.1/sjson-new-scalajson_2.12-0.10.1-sources.jar", - "sha256": "18rhdrinj8pgrjizhmxnvhh5m7f7ycdd77smrpi5k1n2yaxddma8" - }, { "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.10.1/sjson-new-scalajson_2.12-0.10.1.jar", "sha256": "1vni9j79nkcs5sqp6ik3cxgkgp3ipjggdjadr6ddfrpjl1ld6vqq" @@ -261,18 +121,6 @@ "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.10.1/sjson-new-scalajson_2.12-0.10.1.pom", "sha256": "1p1ldfhdi292y3r4q2bm7jz2ip840z7xg3gxj1n41c3lbx6nwi19" }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.9.1/sjson-new-scalajson_2.12-0.9.1-sources.jar", - "sha256": "00sgdiw3xlfj799r9z0ycrfhcapvi2nzi93j65qf4wrsn2zh0wsj" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.9.1/sjson-new-scalajson_2.12-0.9.1.jar", - "sha256": "095whknbrnx704k136r0grgyiz26ybxnn3iggwcbcw664ka98jqq" - }, - { - "url": "https://repo1.maven.org/maven2/com/eed3si9n/sjson-new-scalajson_2.12/0.9.1/sjson-new-scalajson_2.12-0.9.1.pom", - "sha256": "1kwccjj659jq69hn2crn446h8kw70mlnp7bxb1gly27xabaysjxn" - }, { "url": "https://repo1.maven.org/maven2/com/github/alexarchambault/case-app-annotations_2.13/2.1.0-M30/case-app-annotations_2.13-2.1.0-M30.jar", "sha256": "16mvbqrlchnpmzxs8igh8gh3r5csxg2ax1s5vivc81p8hp97w5a7" @@ -297,10 +145,6 @@ "url": "https://repo1.maven.org/maven2/com/github/alexarchambault/case-app_2.13/2.1.0-M30/case-app_2.13-2.1.0-M30.pom", "sha256": "1ixa9ginwvniivj4l298ikdbnixbrbwrifsckzwc3r1hz84h7iiq" }, - { - "url": "https://repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.8.5/caffeine-2.8.5-sources.jar", - "sha256": "1i15fbcjmq9drb3lnkw87bay8ljbc4xdqggjpwbk3fbbwxw7wraj" - }, { "url": "https://repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.8.5/caffeine-2.8.5.jar", "sha256": "1j1b6pj9awii94zhrpkrg6li7903dsgvlw6xajl0z3jrpyliajw1" @@ -309,10 +153,6 @@ "url": "https://repo1.maven.org/maven2/com/github/ben-manes/caffeine/caffeine/2.8.5/caffeine-2.8.5.pom", "sha256": "1ih831k820c2591xc9hjsanb6s4lw9wy2460nm6k64sxfw078a2y" }, - { - "url": "https://repo1.maven.org/maven2/com/github/eldis/tool-launcher/0.2.2/tool-launcher-0.2.2-sources.jar", - "sha256": "0q8xb1gplq0fbbrvn3by8zxmq46pf3205mrpvflxiz82ac8jl95v" - }, { "url": "https://repo1.maven.org/maven2/com/github/eldis/tool-launcher/0.2.2/tool-launcher-0.2.2.jar", "sha256": "1p81sspx2sfv9kki5sv5wbc8gdww1awpkd7hcf1kvyzgssg3h0a3" @@ -321,10 +161,6 @@ "url": "https://repo1.maven.org/maven2/com/github/eldis/tool-launcher/0.2.2/tool-launcher-0.2.2.pom", "sha256": "0imzkqdq7r9p1jcdgx0wcb8nacf2y7c0vf89xp9bbl9aqa1ilyf0" }, - { - "url": "https://repo1.maven.org/maven2/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10-sources.jar", - "sha256": "0dlpn9wk4j2vpd7x7bgz3mh2iwlszyz5jsq2czqpv9s7dm2ifgln" - }, { "url": "https://repo1.maven.org/maven2/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.jar", "sha256": "1hai840sgjdp5rwn6v6x6zsqpk9hk2zqs46h4pr30mp9yhiznrcl" @@ -333,10 +169,6 @@ "url": "https://repo1.maven.org/maven2/com/github/luben/zstd-jni/1.5.5-10/zstd-jni-1.5.5-10.pom", "sha256": "0v0rhn4d6ipashc970dmrv9mkg92ri2b3z875npxng4yr0g2lhm2" }, - { - "url": "https://repo1.maven.org/maven2/com/github/mwiede/jsch/0.2.23/jsch-0.2.23-sources.jar", - "sha256": "13l1ydz04zlqwwxbcpw15nl4k32sz8gd2k9w30mmc7ln2a5hmn8c" - }, { "url": "https://repo1.maven.org/maven2/com/github/mwiede/jsch/0.2.23/jsch-0.2.23.jar", "sha256": "0j7aaf9rs0cybaf0xavxm1vr9bfbharhqksjwa84h7acvmwgjpy4" @@ -345,10 +177,6 @@ "url": "https://repo1.maven.org/maven2/com/github/mwiede/jsch/0.2.23/jsch-0.2.23.pom", "sha256": "1wr7nn03nznqgjxlg6mywh7w1q9rywdvrkfr2xb5cq5jqnpz0583" }, - { - "url": "https://repo1.maven.org/maven2/com/github/plokhotnyuk/jsoniter-scala/jsoniter-scala-core_2.12/2.13.5.2/jsoniter-scala-core_2.12-2.13.5.2-sources.jar", - "sha256": "0dbffw3flgwl63av1dwgpxpayixj5yzypsypibk2grzwr3mbb779" - }, { "url": "https://repo1.maven.org/maven2/com/github/plokhotnyuk/jsoniter-scala/jsoniter-scala-core_2.12/2.13.5.2/jsoniter-scala-core_2.12-2.13.5.2.jar", "sha256": "1czfb2hnp0lqian4b0wv4jbqj0f13hsickq2yaj0zf6kng23f9wf" @@ -357,6 +185,10 @@ "url": "https://repo1.maven.org/maven2/com/github/plokhotnyuk/jsoniter-scala/jsoniter-scala-core_2.12/2.13.5.2/jsoniter-scala-core_2.12-2.13.5.2.pom", "sha256": "08az5yl01iwn8v68l2id4x0x679w1xf2mbb1h0m0m7wr68q53dbw" }, + { + "url": "https://repo1.maven.org/maven2/com/github/plokhotnyuk/jsoniter-scala/jsoniter-scala-core_2.12/2.13.5/jsoniter-scala-core_2.12-2.13.5.pom", + "sha256": "0bcfmciza6xv1wbsay4g9xiw5k50zzarnrv1yqfmj9lb1wk6lzr3" + }, { "url": "https://repo1.maven.org/maven2/com/github/pureconfig/pureconfig-core_2.13/0.17.8/pureconfig-core_2.13-0.17.8.jar", "sha256": "1k72758y3ac235l43k1z516jpnk6w0i5acrgl7gxgv3j7vnr0a7r" @@ -381,10 +213,6 @@ "url": "https://repo1.maven.org/maven2/com/github/pureconfig/pureconfig-magnolia_2.13/0.17.8/pureconfig-magnolia_2.13-0.17.8.pom", "sha256": "16xhymj9g11q50iafnai8xykmcirf59xh6kwlsh1m5yfdggg5br1" }, - { - "url": "https://repo1.maven.org/maven2/com/github/sbt/pgp-library_2.12/2.2.1/pgp-library_2.12-2.2.1-sources.jar", - "sha256": "082yzgkw475wiizbhk8pwnqd4s8gwfqygx64096rgdny87p4cxna" - }, { "url": "https://repo1.maven.org/maven2/com/github/sbt/pgp-library_2.12/2.2.1/pgp-library_2.12-2.2.1.jar", "sha256": "1fczkb7flajhqmiy8cmsifb1qmjlmivfb0fyy2vf7l5w01hv729x" @@ -393,10 +221,6 @@ "url": "https://repo1.maven.org/maven2/com/github/sbt/pgp-library_2.12/2.2.1/pgp-library_2.12-2.2.1.pom", "sha256": "1qq7290bcfc2x81q0yavmzl951rz3gkl086f66i1grzw9gdmqxk4" }, - { - "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-git_2.12_1.0/2.0.1/sbt-git-2.0.1-sources.jar", - "sha256": "1fxcsqwjyylfdi6ip0h2cc0y76212n4030anpq4d06nm5r93b370" - }, { "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-git_2.12_1.0/2.0.1/sbt-git-2.0.1.jar", "sha256": "04lmyy90pmznnbi2l396zv2d5c8ksclr3nn4if9486y61pdyrki4" @@ -405,10 +229,6 @@ "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-git_2.12_1.0/2.0.1/sbt-git-2.0.1.pom", "sha256": "09204plixpyprf5rwiifaq6gdvb603vxd8zzwh4sz6h4m5gihwlr" }, - { - "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-native-packager_2.12_1.0/1.10.4/sbt-native-packager_2.12_1.0-1.10.4-sources.jar", - "sha256": "18wv8b6afz4jdi2qi3rpvpr6yyz0wwb4hk2963hggxyr2pccnw12" - }, { "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-native-packager_2.12_1.0/1.10.4/sbt-native-packager_2.12_1.0-1.10.4.jar", "sha256": "1vyvf8c7a9h59acnkrwq9fpk59gh5zv64bgpapsvc85j47z9mi6g" @@ -417,10 +237,6 @@ "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-native-packager_2.12_1.0/1.10.4/sbt-native-packager_2.12_1.0-1.10.4.pom", "sha256": "04ncgk7zh68rffbiwzqqbfhprlgd6431vik9h5jx15j20nb1yjd4" }, - { - "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-pgp_2.12_1.0/2.2.1/sbt-pgp-2.2.1-sources.jar", - "sha256": "0cvh6rdmb2iqrw02mgbyhk98xr2fs4sqjigjcx3nkvwddm85l7r0" - }, { "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-pgp_2.12_1.0/2.2.1/sbt-pgp-2.2.1.jar", "sha256": "0valfznbaaih52yjl78wx6bci5i7fm72xapj167rdn5f7k88haly" @@ -429,10 +245,6 @@ "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-pgp_2.12_1.0/2.2.1/sbt-pgp-2.2.1.pom", "sha256": "1y141sl7i6qvf96kakhr4c2a6nmi3r0rb4x2nzklfg7axirxs3z7" }, - { - "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-release_2.12_1.0/1.4.0/sbt-release_2.12_1.0-1.4.0-sources.jar", - "sha256": "0npd6skvchljzmai3x70w2lj2c33plmsgjf1qzw8nbb43ndql8l8" - }, { "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-release_2.12_1.0/1.4.0/sbt-release_2.12_1.0-1.4.0.jar", "sha256": "123z25aawqrm1lksm67j9wl1yamw8av4s6h849qrbq4195i3ig9r" @@ -441,10 +253,6 @@ "url": "https://repo1.maven.org/maven2/com/github/sbt/sbt-release_2.12_1.0/1.4.0/sbt-release_2.12_1.0-1.4.0.pom", "sha256": "1cvr3dcz5y6p0185nzkh2cnbbkl3im4m0rrsy7gi91258cr4qgd8" }, - { - "url": "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0-sources.jar", - "sha256": "19bdf7i3w93yaykcv4fyi54ip2ag99d7q637q8hid1n8slxn4jnp" - }, { "url": "https://repo1.maven.org/maven2/com/google/errorprone/error_prone_annotations/2.4.0/error_prone_annotations-2.4.0.jar", "sha256": "0a5287bvcaaqvx6y90zn7bqnjwrxb26k1ps9w25jwrha4d40cajz" @@ -461,10 +269,6 @@ "url": "https://repo1.maven.org/maven2/com/google/guava/guava-parent/18.0/guava-parent-18.0.pom", "sha256": "0rmia42xirzgk3r2h1syzs7n7ib1nv84yzh87yizcmz7jn4crb54" }, - { - "url": "https://repo1.maven.org/maven2/com/google/guava/guava/18.0/guava-18.0-sources.jar", - "sha256": "144mkphrim6lvrrxifysgls8zbdr6x20y3fz5ih02fma9k782cqg" - }, { "url": "https://repo1.maven.org/maven2/com/google/guava/guava/18.0/guava-18.0.jar", "sha256": "16bgkzvk3sprn5rs9hfcpvz9vgyhy40zni1amffcxrfj0gygnr6n" @@ -477,10 +281,6 @@ "url": "https://repo1.maven.org/maven2/com/google/jimfs/jimfs-parent/1.1/jimfs-parent-1.1.pom", "sha256": "1g96idyskcl3ryfc3fd5lq12ay5f4nbars3h528yzq2p3rsma5f7" }, - { - "url": "https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1-sources.jar", - "sha256": "1kk4gv1hp8y2dq8azh7qx04n2cw5pv4malfv4xlkscfja0sbbsxd" - }, { "url": "https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.jar", "sha256": "1pbx4lf1y24bgdfaf9bw9p0abnm7mlxhnlc7jfpk1af0swl8x0n4" @@ -489,10 +289,6 @@ "url": "https://repo1.maven.org/maven2/com/google/jimfs/jimfs/1.1/jimfs-1.1.pom", "sha256": "0i3sgapm9r7wgmrm0qlb2hzarm6q6irfbjnz5x3ppw92v5f6xa7g" }, - { - "url": "https://repo1.maven.org/maven2/com/googlecode/javaewah/JavaEWAH/1.1.13/JavaEWAH-1.1.13-sources.jar", - "sha256": "002h5ig3asg1pm7r4w67yzn2vn4mwqdrpqi2g4n97f1qvpga8zxk" - }, { "url": "https://repo1.maven.org/maven2/com/googlecode/javaewah/JavaEWAH/1.1.13/JavaEWAH-1.1.13.jar", "sha256": "04bidmlmv4ghinwngbmaq0887i1b1g3kckijxbbm0xri3lmxl3sc" @@ -501,18 +297,6 @@ "url": "https://repo1.maven.org/maven2/com/googlecode/javaewah/JavaEWAH/1.1.13/JavaEWAH-1.1.13.pom", "sha256": "1x0pzklgbd2bf3wkka6li2sc90hhx8al9f0bfmvxj438kkzb29cp" }, - { - "url": "https://repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54-sources.jar", - "sha256": "0jpl8cy2167j7nvn2sbz9lsxyiz6lml1lcq7d825bd7nb3fj3l29" - }, - { - "url": "https://repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54.jar", - "sha256": "1nqz1r2q1nrm2bz1573c95pwahhqrsh07znlzmw28xhn6cx2gswj" - }, - { - "url": "https://repo1.maven.org/maven2/com/jcraft/jsch/0.1.54/jsch-0.1.54.pom", - "sha256": "0y1libpsmrcalmyr2ca495c0k8nqm6s47rqq1vi6lzxy74h533xb" - }, { "url": "https://repo1.maven.org/maven2/com/lihaoyi/fastparse_2.13/3.1.1/fastparse_2.13-3.1.1.jar", "sha256": "1mfrrafh7bi5x14hjyb3y21c58r2q7nq9fac97zrr77qs3d3fgzz" @@ -561,22 +345,6 @@ "url": "https://repo1.maven.org/maven2/com/lihaoyi/sourcecode_sjs1_2.13/0.4.0/sourcecode_sjs1_2.13-0.4.0.pom", "sha256": "0kw09dhcgrdlnpk440iydxjni7sgyk8nnjmchf48psdgpmwng8cf" }, - { - "url": "https://repo1.maven.org/maven2/com/lihaoyi/unroll-annotation_2.12/0.1.12/unroll-annotation_2.12-0.1.12-sources.jar", - "sha256": "1k7blapxbb39li3fl9r2486g3gjza44lpbpgyw6dj3byipl6bnyj" - }, - { - "url": "https://repo1.maven.org/maven2/com/lihaoyi/unroll-annotation_2.12/0.1.12/unroll-annotation_2.12-0.1.12.jar", - "sha256": "1xvjda46z5v07j4dbv6zidrnp0j498547ffqr5538kz20qgf5kbf" - }, - { - "url": "https://repo1.maven.org/maven2/com/lihaoyi/unroll-annotation_2.12/0.1.12/unroll-annotation_2.12-0.1.12.pom", - "sha256": "078fplwmlrb9zx3cvi9nplp94gkk7advn9zp86w5h81vb2fij89f" - }, - { - "url": "https://repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2-sources.jar", - "sha256": "1d1j06iki6c74q655dzxr37igkcafavj3cjdj5nnlb7xvc0m8fpd" - }, { "url": "https://repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2.jar", "sha256": "1h26hnx0rx9qzjdqriqrp2a8vsixf84l2n33bss6092w4fxyq4pl" @@ -585,10 +353,6 @@ "url": "https://repo1.maven.org/maven2/com/lmax/disruptor/3.4.2/disruptor-3.4.2.pom", "sha256": "1npma26j5h6fsw7p66kk313scxg33ipnsknin9cz4qnac7ifa4bk" }, - { - "url": "https://repo1.maven.org/maven2/com/michaelpollmeier/versionsort/1.0.11/versionsort-1.0.11-sources.jar", - "sha256": "1wdnc00ms6rhsaavl1narrhyn3mp3p5jnj37p5dks0ynhnj9hdmp" - }, { "url": "https://repo1.maven.org/maven2/com/michaelpollmeier/versionsort/1.0.11/versionsort-1.0.11.jar", "sha256": "0ii1v22ki38xvcynbh2mvqg9k2kabxgdgi5qjp5hf7k0g11ycn7y" @@ -597,10 +361,6 @@ "url": "https://repo1.maven.org/maven2/com/michaelpollmeier/versionsort/1.0.11/versionsort-1.0.11.pom", "sha256": "0wa1i57cqzhjg0rgvnfpqq6696dnikk12l8ilrj0p7grxrk0mwm8" }, - { - "url": "https://repo1.maven.org/maven2/com/orrsella/sbt-stats_2.12_1.0/1.0.7/sbt-stats-1.0.7-sources.jar", - "sha256": "0bsrxf04bi05qwfghxim0903imxh9xfp5v72j2mfq3j0g09wfgs8" - }, { "url": "https://repo1.maven.org/maven2/com/orrsella/sbt-stats_2.12_1.0/1.0.7/sbt-stats-1.0.7.jar", "sha256": "0nx3gar2czkk9xk51r89w0521xi5vx6gql90hahv0pgrrz8iam4v" @@ -625,10 +385,6 @@ "url": "https://repo1.maven.org/maven2/com/softwaremill/magnolia1_2/magnolia_sjs1_2.13/1.1.10/magnolia_sjs1_2.13-1.1.10.pom", "sha256": "1wn167cxxrwill80visq6ny6dsx2jmhjis33y2j7dx04jm8z65bl" }, - { - "url": "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.14.0/okhttp-3.14.0-sources.jar", - "sha256": "0b9rd4v74lf3n1j342pha9lmh8jhb47917kv23sbfkx97vr0w6kp" - }, { "url": "https://repo1.maven.org/maven2/com/squareup/okhttp3/okhttp/3.14.0/okhttp-3.14.0.jar", "sha256": "0mdl650x9jwkkcaxs60d9d69h9qzk404zchb6mmk946z1nwxxxps" @@ -645,10 +401,6 @@ "url": "https://repo1.maven.org/maven2/com/squareup/okio/okio-parent/1.17.2/okio-parent-1.17.2.pom", "sha256": "097h2vz0wxjb9nj8lhdaazkzpfasr1ss38qgn6ab63iadwa407z8" }, - { - "url": "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.17.2/okio-1.17.2-sources.jar", - "sha256": "0lj2iflxnms11pxahry4d59vsgbxcqrnrfanfb152nfw9c04jsgr" - }, { "url": "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.17.2/okio-1.17.2.jar", "sha256": "1f72kw6ap0a5rw2ng20sxdy28kb01nc6y7byqka7mi7s5wny837q" @@ -657,10 +409,6 @@ "url": "https://repo1.maven.org/maven2/com/squareup/okio/okio/1.17.2/okio-1.17.2.pom", "sha256": "1w03pgj28lsb9x7g10gaky8hxvb4xsa1k99x415p2smb8dagfmyd" }, - { - "url": "https://repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.12/file-tree-views-2.1.12-sources.jar", - "sha256": "1mgqy7i53bdmiixgixvy498ahiya079b6s156ypdb8m3h0cl3dlw" - }, { "url": "https://repo1.maven.org/maven2/com/swoval/file-tree-views/2.1.12/file-tree-views-2.1.12.jar", "sha256": "0559xpx2v7yakwjv71wki8ayqai7p8hcjdnvjwzcz4kskf476wzx" @@ -670,12 +418,12 @@ "sha256": "0ip7mfqdbfl7n6k27cpyg9ypa286kvzmqh8f63fqa7bdfzf71lpd" }, { - "url": "https://repo1.maven.org/maven2/com/typesafe/config/1.2.0/config-1.2.0.pom", - "sha256": "08p5xrn5lkmhrrwfiswdfqjv914b1w11l2jbnywfw2ka9mgjqyh5" + "url": "https://repo1.maven.org/maven2/com/typesafe/config/1.2.0/config-1.2.0.jar", + "sha256": "0q5xhyyyin4dmw0pnx18lp184msn5ppzmqxib3iv2pxrmklc5wjn" }, { - "url": "https://repo1.maven.org/maven2/com/typesafe/config/1.4.2/config-1.4.2-sources.jar", - "sha256": "0brl5ywgs0ndhg3r1m2bhmadmg6v90s7npyhkzhan92yk2v3j49g" + "url": "https://repo1.maven.org/maven2/com/typesafe/config/1.2.0/config-1.2.0.pom", + "sha256": "08p5xrn5lkmhrrwfiswdfqjv914b1w11l2jbnywfw2ka9mgjqyh5" }, { "url": "https://repo1.maven.org/maven2/com/typesafe/config/1.4.2/config-1.4.2.jar", @@ -694,12 +442,12 @@ "sha256": "1wqg0fhiv3jbblzi00vc1ig6lad5hc08i9nv01yzh3r2vnlsyzmn" }, { - "url": "https://repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.2.2/ssl-config-core_2.12-0.2.2.pom", - "sha256": "13wkl4kp07z6sb4ipp8jjk51ngg56nwvprsg3lxwpwig6ns9c7jj" + "url": "https://repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.2.2/ssl-config-core_2.12-0.2.2.jar", + "sha256": "1r67al8hfzqvf6718x71wbyh67s733pi0aalb7d9fzzbmp04w56g" }, { - "url": "https://repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.6.1/ssl-config-core_2.12-0.6.1-sources.jar", - "sha256": "02czzfaq651140wqa8zmaklrvy0yvsc3dz6rv4vnmh1glxcrkrfh" + "url": "https://repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.2.2/ssl-config-core_2.12-0.2.2.pom", + "sha256": "13wkl4kp07z6sb4ipp8jjk51ngg56nwvprsg3lxwpwig6ns9c7jj" }, { "url": "https://repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.6.1/ssl-config-core_2.12-0.6.1.jar", @@ -709,10 +457,6 @@ "url": "https://repo1.maven.org/maven2/com/typesafe/ssl-config-core_2.12/0.6.1/ssl-config-core_2.12-0.6.1.pom", "sha256": "01hb0az1g582vmcivmmwcn72prahwm7lixmgagc4myhvdn4k9vqd" }, - { - "url": "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.16.1/commons-codec-1.16.1-sources.jar", - "sha256": "1ghkz0s8qi8shm74ba89vvpy927f4893bmggvd2wsl7rpqv7778v" - }, { "url": "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.16.1/commons-codec-1.16.1.jar", "sha256": "1r550hnq20fcpngy87j35bni5cxj53dfx4113srd3jr2bysvz1zc" @@ -721,10 +465,6 @@ "url": "https://repo1.maven.org/maven2/commons-codec/commons-codec/1.16.1/commons-codec-1.16.1.pom", "sha256": "0a5dj2sjxrwns6i59skhhg4nfk8m1j1s0bx0f51wcz4x5zcxs9mq" }, - { - "url": "https://repo1.maven.org/maven2/commons-io/commons-io/2.15.1/commons-io-2.15.1-sources.jar", - "sha256": "0il2bdxpq79raw5bh6501yn72k02xb3vd90720fcpvf1hfxj9jsh" - }, { "url": "https://repo1.maven.org/maven2/commons-io/commons-io/2.15.1/commons-io-2.15.1.jar", "sha256": "0m71akmdfpr7ri41mj0fl20l622g2vpwl9qcpcpgv35nw4pg32m5" @@ -1053,10 +793,6 @@ "url": "https://repo1.maven.org/maven2/io/7mind/izumi/logstage-rendering-circe_2.13/1.2.21/logstage-rendering-circe_2.13-1.2.21.pom", "sha256": "1pclrxsaab7xiv6nbqv9dkyaa4f7c8rigwls19qfd04dl98a15pg" }, - { - "url": "https://repo1.maven.org/maven2/io/7mind/izumi/sbt/sbt-izumi_2.12_1.0/0.0.101/sbt-izumi_2.12_1.0-0.0.101-sources.jar", - "sha256": "0ixgrjr5n4b6mnxiffym1s47lk3k1ijv8hx779jva1m9lfd1ylyr" - }, { "url": "https://repo1.maven.org/maven2/io/7mind/izumi/sbt/sbt-izumi_2.12_1.0/0.0.101/sbt-izumi_2.12_1.0-0.0.101.jar", "sha256": "1l5g7jvnfv7dci90da22pdasaff5iijw9p8wj5i9336bnpdcxb88" @@ -1161,10 +897,6 @@ "url": "https://repo1.maven.org/maven2/io/circe/circe-scalajs_sjs1_2.13/0.14.1/circe-scalajs_sjs1_2.13-0.14.1.pom", "sha256": "0da3z7lrq25jba6lgjcllyb2vcqyp81aml0g5di9wa800mmgzyca" }, - { - "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-cache_2.12/2.1.9/coursier-cache_2.12-2.1.9-sources.jar", - "sha256": "1ndzf7pkdn3viaqvp18aa9bngn9ihii1g2hxqixgzip7w7zbxy7g" - }, { "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-cache_2.12/2.1.9/coursier-cache_2.12-2.1.9.jar", "sha256": "01hvfbanmia5k1azjzqj3dfz6aih39kby6wjn1bmkdzlrfqyg427" @@ -1173,10 +905,6 @@ "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-cache_2.12/2.1.9/coursier-cache_2.12-2.1.9.pom", "sha256": "12l8vhlawyqjl63zy5dcx4ijlbbvag97y2lmri7mg46ya8wsbvpb" }, - { - "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-core_2.12/2.1.9/coursier-core_2.12-2.1.9-sources.jar", - "sha256": "0n19rhyvjmvy8ahp7hwzya19dc9csqnphnwrn492w0pdag8khysl" - }, { "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-core_2.12/2.1.9/coursier-core_2.12-2.1.9.jar", "sha256": "01y9l8vs8rv6gdqn6w8jj3jajbl3cvpxxwy3f48kmc09q7jhawfb" @@ -1185,10 +913,6 @@ "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-core_2.12/2.1.9/coursier-core_2.12-2.1.9.pom", "sha256": "0zkxca2c4q7b6spd3qrz4p5kfda3rg47s3wdw22ajagynd5wqci1" }, - { - "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-proxy-setup/2.1.9/coursier-proxy-setup-2.1.9-sources.jar", - "sha256": "0w6i2gwzg8agzpbpwsfmvcyknq4x3czjrnj3wx9ag53md2vyh91b" - }, { "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-proxy-setup/2.1.9/coursier-proxy-setup-2.1.9.jar", "sha256": "1ch9x1jy1fx94xdi0aqps59vbvxarshnbxdhip44x9s55v1dmx4x" @@ -1197,10 +921,6 @@ "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-proxy-setup/2.1.9/coursier-proxy-setup-2.1.9.pom", "sha256": "0rizm989n29qh8n3kiib7yb48njmr7m5sl9p1a2ij83ll6x3c722" }, - { - "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-util_2.12/2.1.9/coursier-util_2.12-2.1.9-sources.jar", - "sha256": "0lcm0mhl0v7hv2bzqkk6x83dx05yi595dhdws0cggmmvrzfq78wg" - }, { "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-util_2.12/2.1.9/coursier-util_2.12-2.1.9.jar", "sha256": "1hy6xp3skbwgkaf2xfn1hk99ysk47l1sy4y5xc04935nckg9ig63" @@ -1209,10 +929,6 @@ "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier-util_2.12/2.1.9/coursier-util_2.12-2.1.9.pom", "sha256": "1rd0vkrsyn418xx1kc1gdbsf6qvgxzvw04an7lq4n4l6w1g3n1hc" }, - { - "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier_2.12/2.1.9/coursier_2.12-2.1.9-sources.jar", - "sha256": "0zxnb0p5s0sv2m5s5l6xaxbdq8bigxiwwf8bbgkqirf5ajkn75sg" - }, { "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier_2.12/2.1.9/coursier_2.12-2.1.9.jar", "sha256": "13im2ixls3jkf5m46g8xckg94g29zchwj6nqanxb8i3l2z3ja4jw" @@ -1221,10 +937,6 @@ "url": "https://repo1.maven.org/maven2/io/get-coursier/coursier_2.12/2.1.9/coursier_2.12-2.1.9.pom", "sha256": "0j601rnvmg55lkpfjp0gjfffj8rq7vp82569xm1h83b9zmchf7af" }, - { - "url": "https://repo1.maven.org/maven2/io/get-coursier/jniutils/windows-jni-utils/0.3.3/windows-jni-utils-0.3.3-sources.jar", - "sha256": "10w5ki430albpwfsd9813z5n38grw4anizkwljlb63j4xw67ccym" - }, { "url": "https://repo1.maven.org/maven2/io/get-coursier/jniutils/windows-jni-utils/0.3.3/windows-jni-utils-0.3.3.jar", "sha256": "1rm7qf53zv24pd6f8zj6dg0c1zkzic8dhf5j0w0f4m932v7yys5b" @@ -1233,10 +945,6 @@ "url": "https://repo1.maven.org/maven2/io/get-coursier/jniutils/windows-jni-utils/0.3.3/windows-jni-utils-0.3.3.pom", "sha256": "0jwicb6hwgmy3wdskhch53xgi9918i3cnbj4pqa3fgv8j87r0lxd" }, - { - "url": "https://repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.1.10/lm-coursier-shaded_2.12-2.1.10-sources.jar", - "sha256": "0zsmxc4imq3ny1i0iqdr0xk2znqniyxij0nq9i7bcg3q92rx4jy7" - }, { "url": "https://repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.1.10/lm-coursier-shaded_2.12-2.1.10.jar", "sha256": "02l53nqrzzzbh1f020mvgkcqq67vssbz4ak8sg3zz985xwr95yl1" @@ -1245,22 +953,6 @@ "url": "https://repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.1.10/lm-coursier-shaded_2.12-2.1.10.pom", "sha256": "1bv8hi33p4apg701cwvyb3gxck76xjjjz5wac9hrvgkrvkj9qn3g" }, - { - "url": "https://repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.1.2/lm-coursier-shaded_2.12-2.1.2-sources.jar", - "sha256": "1m5m2p7hmvsb1ap94nw6g9c9y4dxqkycxkqivh0k2vgyv9qj0q99" - }, - { - "url": "https://repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.1.2/lm-coursier-shaded_2.12-2.1.2.jar", - "sha256": "1k1ic1z4zzqg2ws2pwyx08vmwcm7k0hgp48lx6y5r5z0xyc6nzjc" - }, - { - "url": "https://repo1.maven.org/maven2/io/get-coursier/lm-coursier-shaded_2.12/2.1.2/lm-coursier-shaded_2.12-2.1.2.pom", - "sha256": "126micsqailypbhzdqqccj5hk2psqd6l9lv46ad8jl0miwzk0anm" - }, - { - "url": "https://repo1.maven.org/maven2/io/github/alexarchambault/concurrent-reference-hash-map/1.1.0/concurrent-reference-hash-map-1.1.0-sources.jar", - "sha256": "1b6jq1x44yp8jcqbm6bapdayyygcfdczhwxsqxlhgjd6kd0i64lk" - }, { "url": "https://repo1.maven.org/maven2/io/github/alexarchambault/concurrent-reference-hash-map/1.1.0/concurrent-reference-hash-map-1.1.0.jar", "sha256": "0q9g18p1sgb4pzqpv91l7qss30a6rirjxjywzzzbkbq94ac0f9sm" @@ -1277,10 +969,6 @@ "url": "https://repo1.maven.org/maven2/io/github/alexarchambault/data-class_2.13/0.2.7/data-class_2.13-0.2.7.pom", "sha256": "1da82q5yvpqrr5z5j7l9jswxlipfj75i0bai716jy6d9507qn4pi" }, - { - "url": "https://repo1.maven.org/maven2/io/github/alexarchambault/windows-ansi/windows-ansi/0.0.5/windows-ansi-0.0.5-sources.jar", - "sha256": "002b970z1ivm34isgasldrjm1879jq31xrjiag1wjc5xqnyc696s" - }, { "url": "https://repo1.maven.org/maven2/io/github/alexarchambault/windows-ansi/windows-ansi/0.0.5/windows-ansi-0.0.5.jar", "sha256": "0s8zqjj9rk8hjyx7ci4n16x0557f8i2nmcv5j75d8w4l361b1b7r" @@ -1333,10 +1021,6 @@ "url": "https://repo1.maven.org/maven2/io/github/java-diff-utils/java-diff-utils/4.15/java-diff-utils-4.15.pom", "sha256": "0bpr7wxcvaywpzmpg505ynpkyddai2lfds53jjk1mdv2x1h2mpqs" }, - { - "url": "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar", - "sha256": "15bvjk140gdxvsi7zlqsgs5wbcnpiamrs13f7dpad10d5vjp328j" - }, { "url": "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar", "sha256": "16xbi6mz75r1maw116njab6ln7hm9mhwrxshav4msmfdbccsajz0" @@ -1345,10 +1029,6 @@ "url": "https://repo1.maven.org/maven2/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.pom", "sha256": "15vby0b3gwm1x6g46l98k6j48a18hfp2nyixhpj7hvj0r98s5926" }, - { - "url": "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1-sources.jar", - "sha256": "0gj31rfs2a5kwyi2k18spisjxszicwcpi2j9mwyrq4qwj7i7xf64" - }, { "url": "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.jar", "sha256": "1zz7gnahy2352345411rjlhsf64ikkc6z49dqcv1cj0clm271iwi" @@ -1357,10 +1037,6 @@ "url": "https://repo1.maven.org/maven2/javax/inject/javax.inject/1/javax.inject-1.pom", "sha256": "1ylb39if9gqyj98fccb54s0ad25p19d811d2ixih8y3202qi4gll" }, - { - "url": "https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6-sources.jar", - "sha256": "14xg0s77848rl26wfsr3w28qfm88nmwx1lwxayz6mr710l3q96ii" - }, { "url": "https://repo1.maven.org/maven2/jline/jline/2.14.6/jline-2.14.6.jar", "sha256": "0bghq9812yd95cyymzdfx0bqbl79796sbmr2wr1bw294r2marlcp" @@ -1381,10 +1057,6 @@ "url": "https://repo1.maven.org/maven2/net/bytebuddy/byte-buddy/1.17.6/byte-buddy-1.17.6.pom", "sha256": "0gkbjk8hddfmv72s0cwbgzg7qan1045dpfb3r8yfgc0mpzflfk2h" }, - { - "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.12.0/jna-platform-5.12.0-sources.jar", - "sha256": "0vlzn8yva7dc1k1vb0pgpzy91ci83z92acsk64fg59ij0fanqivy" - }, { "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.12.0/jna-platform-5.12.0.jar", "sha256": "07fwck08fb0725dc5mslwgnxnzzg2ma3kaizycjfflhfml2wkjm8" @@ -1393,22 +1065,6 @@ "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.12.0/jna-platform-5.12.0.pom", "sha256": "1nsxfy915a1a87843q962pdlgm4dm04k7lgfxjk62wzc9ys01ngw" }, - { - "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.13.0/jna-platform-5.13.0-sources.jar", - "sha256": "0zh8rkim2swaqilk7r7x3294ypf12lpywmibdzrp8znz95v96f9g" - }, - { - "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.13.0/jna-platform-5.13.0.jar", - "sha256": "1pbks71wl6rk6nybznk5ghc26p6r9l1c760xxjv0jw79ys47nka7" - }, - { - "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna-platform/5.13.0/jna-platform-5.13.0.pom", - "sha256": "0rkh4pgz1ydlnh26npiqiym05pyxlqhim7kqz2b83japy250rck3" - }, - { - "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.12.0/jna-5.12.0-sources.jar", - "sha256": "05i6dk4vbmbby59h51jwak0mglv67i530dnapidg2l7fpdhvd0xq" - }, { "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.12.0/jna-5.12.0.jar", "sha256": "1dwp2a3blsspsqf8jsks509aj9fci9z2bgsfymddjs2cp7v14qgr" @@ -1417,18 +1073,6 @@ "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.12.0/jna-5.12.0.pom", "sha256": "04rkdd4n24f077i6mcbmqnk9zgnjbjir1bvh8xjwk0g0fw4msjqm" }, - { - "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0-sources.jar", - "sha256": "1x19vmqsimj3l2h0pwqyr9wb46s2b8v04xpkqi0z23gnx11mii54" - }, - { - "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.jar", - "sha256": "1fv419kxvasa2jxgx8g0y1vicpf5z8izrgr7aqfim9b2l0czim36" - }, - { - "url": "https://repo1.maven.org/maven2/net/java/dev/jna/jna/5.13.0/jna-5.13.0.pom", - "sha256": "0x13sjwgdc7f7hjlwhpj88f1nlq9n4frwynaxi3m5x3qh5bw45gm" - }, { "url": "https://repo1.maven.org/maven2/net/java/jvnet-parent/3/jvnet-parent-3.pom", "sha256": "0nj7958drckwf634cw9gmwgmdi302bya7bas16bbzp9rzag7ix9h" @@ -1437,30 +1081,10 @@ "url": "https://repo1.maven.org/maven2/net/openhft/java-parent-pom/1.1.28/java-parent-pom-1.1.28.pom", "sha256": "1gq9i0hfh5isl7xq36qcp7xfp3sfqga173mzbmprwawxg8s9q682" }, - { - "url": "https://repo1.maven.org/maven2/net/openhft/root-parent-pom/1.1.13/root-parent-pom-1.1.13.pom", - "sha256": "0ndfllknvi34cmp5gqihav1gz1r4bffyxgcx96yvxzq31qwc6w70" - }, { "url": "https://repo1.maven.org/maven2/net/openhft/root-parent-pom/1.2.12/root-parent-pom-1.2.12.pom", "sha256": "1kvwjvgzkf81jwivrmvwdyccld9m242xgnipafn92ba2hr62p01i" }, - { - "url": "https://repo1.maven.org/maven2/net/openhft/zero-allocation-hashing/0.10.1/zero-allocation-hashing-0.10.1-sources.jar", - "sha256": "1pc10jxyx1cf2waa6shnwrlb8d79kb1s3gq6f36irhr6lsg0a0nl" - }, - { - "url": "https://repo1.maven.org/maven2/net/openhft/zero-allocation-hashing/0.10.1/zero-allocation-hashing-0.10.1.jar", - "sha256": "0cldk2las0c2l2kl4f1945g0s87685qp7xhl2h31l02ynww6hqw3" - }, - { - "url": "https://repo1.maven.org/maven2/net/openhft/zero-allocation-hashing/0.10.1/zero-allocation-hashing-0.10.1.pom", - "sha256": "0vw4jhm8i3kqqv8380mxcccv0ypnhhwzbcgbgdw82cbr95xh5k1m" - }, - { - "url": "https://repo1.maven.org/maven2/net/openhft/zero-allocation-hashing/0.16/zero-allocation-hashing-0.16-sources.jar", - "sha256": "02biypblq1djmjzbyqf12l7qqxa74ns7h0ksc4dnc2ygbjrwj1j6" - }, { "url": "https://repo1.maven.org/maven2/net/openhft/zero-allocation-hashing/0.16/zero-allocation-hashing-0.16.jar", "sha256": "0gamd2cb0f6nwy6rzm307inm2h55pjhb3g2fvrslacf81ij9rhrv" @@ -1469,10 +1093,6 @@ "url": "https://repo1.maven.org/maven2/net/openhft/zero-allocation-hashing/0.16/zero-allocation-hashing-0.16.pom", "sha256": "1ilgfbyir6d670v97x564cmdsi1lfhlbm7gv3bw5adhrcdlljj89" }, - { - "url": "https://repo1.maven.org/maven2/org/apache/ant/ant-launcher/1.10.14/ant-launcher-1.10.14-sources.jar", - "sha256": "0wfrvg7m39a99ph07afrjfijn593p1bhfflsfssyzm2a5fpq8hx6" - }, { "url": "https://repo1.maven.org/maven2/org/apache/ant/ant-launcher/1.10.14/ant-launcher-1.10.14.jar", "sha256": "19aiv6a1ncr6zy0wbszpw9n51gvs6icbbyzki0w3jkm2lwjrg47h" @@ -1485,10 +1105,6 @@ "url": "https://repo1.maven.org/maven2/org/apache/ant/ant-parent/1.10.14/ant-parent-1.10.14.pom", "sha256": "07rk3dkbb7hlwny12z6syyxg9n6brxi1bwmfxxqc5237c1m105h8" }, - { - "url": "https://repo1.maven.org/maven2/org/apache/ant/ant/1.10.14/ant-1.10.14-sources.jar", - "sha256": "16xq9cx7nshihy3rngfi1mv5ri1kasd97ph8jz0iqllha7ssmp0q" - }, { "url": "https://repo1.maven.org/maven2/org/apache/ant/ant/1.10.14/ant-1.10.14.jar", "sha256": "0wcnirn9a76sh6ab6y3dn69zz41wqjs5v8frc4nh9hg47ljdkfsc" @@ -1517,10 +1133,6 @@ "url": "https://repo1.maven.org/maven2/org/apache/apache/6/apache-6.pom", "sha256": "1csvz8bb2l6fk5ks4gqj0mjmiaczb010km0b5lv0rx0kdq4vbv8j" }, - { - "url": "https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.26.1/commons-compress-1.26.1-sources.jar", - "sha256": "04p8qbfcysm5cik8nbzkl5m19v3wgama4y32j9hc9xwkxcwmwz3n" - }, { "url": "https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.26.1/commons-compress-1.26.1.jar", "sha256": "015v301vbf3ac9yxkfvckxg72mzhglj401aabchbffvwyd05vfr7" @@ -1529,10 +1141,6 @@ "url": "https://repo1.maven.org/maven2/org/apache/commons/commons-compress/1.26.1/commons-compress-1.26.1.pom", "sha256": "0vmh8m4p19x8vik6xk8j4yvczrb2il91krnz80w6zjc83l18li2z" }, - { - "url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0-sources.jar", - "sha256": "0vwv55y7g1id6rxqhhbf5p2rww8xkhgggaj3prnh5wcqp2pqcfxb" - }, { "url": "https://repo1.maven.org/maven2/org/apache/commons/commons-lang3/3.14.0/commons-lang3-3.14.0.jar", "sha256": "0g71vlcc83l9vzyj6id3dxcm218f4yn5jma6pjssnjc9wqzbz5kv" @@ -1565,10 +1173,6 @@ "url": "https://repo1.maven.org/maven2/org/apache/geronimo/genesis/genesis/2.0/genesis-2.0.pom", "sha256": "1rns4dljk93pwg2j45yfrsf24b3291bfw23ksxc12qrlsjfjzvdr" }, - { - "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.3.5/httpclient-4.3.5-sources.jar", - "sha256": "1mb9dz4z96q44n3vqsf96hnqnqc8da2sc53kfzsn7ajicl4kb38g" - }, { "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpclient/4.3.5/httpclient-4.3.5.jar", "sha256": "1ipqxr7qsin53q1j6xw5aa3kqciv2fxazmm9axzkzpl5rqdm515i" @@ -1585,10 +1189,6 @@ "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcomponents-core/4.3.2/httpcomponents-core-4.3.2.pom", "sha256": "01hqbi67cckbfsqxbdxdsskb0gbhm1g68x9r7bz1q5njglfc6gma" }, - { - "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2-sources.jar", - "sha256": "0nvci12lich8qncydy2xdzx31kga3x2kwapwv4hzlggzndw70ywl" - }, { "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/httpcore/4.3.2/httpcore-4.3.2.jar", "sha256": "12sjy6s54xgcjjnb6rbqrylj1vvb601czr6sak88jvrmw8h27l5b" @@ -1601,10 +1201,6 @@ "url": "https://repo1.maven.org/maven2/org/apache/httpcomponents/project/7/project-7.pom", "sha256": "1hs8m8cgyypd6vb882zjyns58nhzrkm7cpbb0kg5i9amhm1blvix" }, - { - "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.17.1/log4j-api-2.17.1-sources.jar", - "sha256": "1c02v6rds5adnrc7d88l8650shqbs8f97q93sc4gqihssrvix30r" - }, { "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.17.1/log4j-api-2.17.1.jar", "sha256": "1r0x2sb93rm97lh515a17iwx9rmh0ckq5580in4b3f2gmg4a9n5h" @@ -1613,10 +1209,6 @@ "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.17.1/log4j-api-2.17.1.pom", "sha256": "12p8q4lzjhmv052wr4x1j4zr93dib2qji5q9mq8bwa8b4brwwahy" }, - { - "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.17.1/log4j-core-2.17.1-sources.jar", - "sha256": "14kpcbm8mly8nahi8gh133488w69s8w9vcaggykyrdzdkrg2vk2i" - }, { "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.17.1/log4j-core-2.17.1.jar", "sha256": "0h9x3x8vi34z1w5vzg8rgkpd67x0m3wwg9wl9qvbk03r90iz4ry9" @@ -1625,10 +1217,6 @@ "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.17.1/log4j-core-2.17.1.pom", "sha256": "1zdak1z5qvvjjcmv1qr6zfh19bqhjk12f29w7kx1nanjskv3pfqb" }, - { - "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.17.1/log4j-slf4j-impl-2.17.1-sources.jar", - "sha256": "1sw326139vvc12yqmny0m54widkqcmd0bfmd8m5n2cr428psh53b" - }, { "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.17.1/log4j-slf4j-impl-2.17.1.jar", "sha256": "07p4g3ximiddimq21v5hl0l5wj08kpd3a1jkq84n01ymwlh3g879" @@ -1645,10 +1233,6 @@ "url": "https://repo1.maven.org/maven2/org/apache/logging/logging-parent/3/logging-parent-3.pom", "sha256": "19r2fzjl4whkrv132fmz62zbk1904sqn9hmnvrhl2k89p312wfkn" }, - { - "url": "https://repo1.maven.org/maven2/org/apache/xbean/xbean-reflect/3.7/xbean-reflect-3.7-sources.jar", - "sha256": "17jg5lyj1yz651zwr5jwbaqbjgzj9vbl39bddj08s9gfn46phngd" - }, { "url": "https://repo1.maven.org/maven2/org/apache/xbean/xbean-reflect/3.7/xbean-reflect-3.7.jar", "sha256": "1jr92qyx5dmr7sr53vq96a7frxq00yb828pk49kzhsd6nndmwkhh" @@ -1661,10 +1245,6 @@ "url": "https://repo1.maven.org/maven2/org/apache/xbean/xbean/3.7/xbean-3.7.pom", "sha256": "1drsqdldqfk529grmgjpshjxa1f72lr1yyh9r4pvc144vqr72wga" }, - { - "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcpg-jdk15on/1.69/bcpg-jdk15on-1.69-sources.jar", - "sha256": "0kqw5r872x420pa6ymzq720nhj060viyw01zgp9gyljgm7c9r7ny" - }, { "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcpg-jdk15on/1.69/bcpg-jdk15on-1.69.jar", "sha256": "0d1ryqk9w4jwnccirnjsa3r26j2af4z3skz3jh0d064mzpvlz653" @@ -1673,10 +1253,6 @@ "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcpg-jdk15on/1.69/bcpg-jdk15on-1.69.pom", "sha256": "0kxdkyv255vk23m8aivw9ilqzs5ym45c0p6wd5wfg7ss77z808ns" }, - { - "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.69/bcprov-jdk15on-1.69-sources.jar", - "sha256": "0a65jymyd4y4ahnk5631lv0w20wglpgd6p8qb9m81r9aanywrl9j" - }, { "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.69/bcprov-jdk15on-1.69.jar", "sha256": "14m2cfbzmay7i6bvvmd93naj4ah2zw1i0qq2c0jrz69nz4wvssg4" @@ -1685,10 +1261,6 @@ "url": "https://repo1.maven.org/maven2/org/bouncycastle/bcprov-jdk15on/1.69/bcprov-jdk15on-1.69.pom", "sha256": "1pkqpakran05h6jis920yg7z4k6jmjfh5cz6dagfgg4m8iqy50gx" }, - { - "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.4.1/checker-qual-3.4.1-sources.jar", - "sha256": "10zbl56n4akkrqbk1ifxx2hz6yj5g2y4hkbxrj4nmqikww1svr36" - }, { "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.4.1/checker-qual-3.4.1.jar", "sha256": "0zjha61sasdfyscmll51cjcnzxgqzqcmkq7w1yfdchh58s3wirdw" @@ -1697,10 +1269,6 @@ "url": "https://repo1.maven.org/maven2/org/checkerframework/checker-qual/3.4.1/checker-qual-3.4.1.pom", "sha256": "0x4k1glx55qppc9cnri07va54fd20wg3hmgvj4s7rdrgjg8c0wc1" }, - { - "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-archiver/4.9.0/plexus-archiver-4.9.0-sources.jar", - "sha256": "0jg0qrmmx1g61xd4kzmrbnj9rz9xkg2306hdxadfccw13wd19jff" - }, { "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-archiver/4.9.0/plexus-archiver-4.9.0.jar", "sha256": "0gm0d1mf9jarz4llx1kpvhsmk9djlm007pna97qhqqgq0gnpwk89" @@ -1709,10 +1277,6 @@ "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-archiver/4.9.0/plexus-archiver-4.9.0.pom", "sha256": "002azqcifgwpfk6y15l1pc8x88cj0lqgjr5c8zwvc1bchhvpl47z" }, - { - "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-classworlds/2.6.0/plexus-classworlds-2.6.0-sources.jar", - "sha256": "12dbgj0gfnph7r9mazd2637myaqhpla7crqycvb45m0sdnfldp59" - }, { "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-classworlds/2.6.0/plexus-classworlds-2.6.0.jar", "sha256": "0j9m9zbw152gdqvigwh2l922z4nrxzbdbgky86f7qy4zqig7rxsj" @@ -1721,10 +1285,6 @@ "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-classworlds/2.6.0/plexus-classworlds-2.6.0.pom", "sha256": "1fm70pssjy6xc31j7f9l23pghg60s997vklp0wnadzrfz5cnr6j6" }, - { - "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-container-default/2.1.1/plexus-container-default-2.1.1-sources.jar", - "sha256": "13xfvx0n52wn80bjai44misdsqmx1665v16vylcnwppv8ii60mlk" - }, { "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-container-default/2.1.1/plexus-container-default-2.1.1.jar", "sha256": "1rqwkqcqqbmh7g4jq5r41db4wc166kdsw7gcd4d9lrna84788rcb" @@ -1737,10 +1297,6 @@ "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-containers/2.1.1/plexus-containers-2.1.1.pom", "sha256": "0g43m8a24620ammdgdjc19j6fkzyzjrx9npwjqjvms3dpjaawaf1" }, - { - "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-io/3.4.1/plexus-io-3.4.1-sources.jar", - "sha256": "1m9clx7yz6c0mlds38xsirii0bgvrsasn4kg4cb59cfrk94fg50l" - }, { "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-io/3.4.1/plexus-io-3.4.1.jar", "sha256": "1i621m8m3wa7g38ryckvpihcbkzi13gqznsdc1b8dyb855yf0fxc" @@ -1749,10 +1305,6 @@ "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-io/3.4.1/plexus-io-3.4.1.pom", "sha256": "11ws5dcx9rvf5xi1izp430zhrcddr7s8y6jc1m6lpj7f1dx09mkw" }, - { - "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/4.0.0/plexus-utils-4.0.0-sources.jar", - "sha256": "0j5n1k3jahfq3l630zmac5fx4hsxc6v1lyhrhb6giwgfmsqhk9dg" - }, { "url": "https://repo1.maven.org/maven2/org/codehaus/plexus/plexus-utils/4.0.0/plexus-utils-4.0.0.jar", "sha256": "02ysq5l3vn0lb0pswwrc0zz2rlk25pr7a60zd665qvlcnh1xf317" @@ -1785,10 +1337,6 @@ "url": "https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit-parent/5.13.1.202206130422-r/org.eclipse.jgit-parent-5.13.1.202206130422-r.pom", "sha256": "10xwy6ga3fmigjy4fspa7zp5akrxvhc4j5pfhmvsai4gxmvgqrfy" }, - { - "url": "https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/5.13.1.202206130422-r/org.eclipse.jgit-5.13.1.202206130422-r-sources.jar", - "sha256": "0pplisl6l80j4z8ny93j54j3a4sx0i8jxb9m7rnrzh3iphwm5nyj" - }, { "url": "https://repo1.maven.org/maven2/org/eclipse/jgit/org.eclipse.jgit/5.13.1.202206130422-r/org.eclipse.jgit-5.13.1.202206130422-r.jar", "sha256": "0p05nlp24nxs2sa7andnvil3yhv5axg9y281cx4w2mcfdid3cyfn" @@ -1813,10 +1361,6 @@ "url": "https://repo1.maven.org/maven2/org/fusesource/hawtbuf/hawtbuf-project/1.9/hawtbuf-project-1.9.pom", "sha256": "1yjca5xk7wvf5g7jkkym09qcib7f1sk45iiy7ilpmlrrdz3hl5ph" }, - { - "url": "https://repo1.maven.org/maven2/org/fusesource/hawtbuf/hawtbuf-proto/1.9/hawtbuf-proto-1.9-sources.jar", - "sha256": "072w43731718n1848llaqmv864wqzj012v1x5nahbdak765afv5b" - }, { "url": "https://repo1.maven.org/maven2/org/fusesource/hawtbuf/hawtbuf-proto/1.9/hawtbuf-proto-1.9.jar", "sha256": "1g509kxdx328nbhy6psqphj5mjwsk9wv2y09zm0qfkmm916c2cbv" @@ -1825,10 +1369,6 @@ "url": "https://repo1.maven.org/maven2/org/fusesource/hawtbuf/hawtbuf-proto/1.9/hawtbuf-proto-1.9.pom", "sha256": "1mq8sp0rrkls1ylhvzrb4jvqhv8cs8mi58i87ssiyzrbf5hrfhaq" }, - { - "url": "https://repo1.maven.org/maven2/org/fusesource/hawtbuf/hawtbuf/1.9/hawtbuf-1.9-sources.jar", - "sha256": "0nz4g817dh5blfj5fhnn4rqkksc22r73zqi57jqaf3rhy76q5nqx" - }, { "url": "https://repo1.maven.org/maven2/org/fusesource/hawtbuf/hawtbuf/1.9/hawtbuf-1.9.jar", "sha256": "11hd6vjzg2w4npbqbdm2r5xm09hiqxvv5i3rxxzdvsz921kchmx0" @@ -1842,12 +1382,12 @@ "sha256": "03c0kqxmgvfs7jnp75pv89a0fh9cbmd668asj9cm87zx7j4kdj02" }, { - "url": "https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.18/jansi-1.18.pom", - "sha256": "0jzvcni37vlgf7q341ffb6754505fzdji52qh5ppnk9a5jf633yx" + "url": "https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.18/jansi-1.18.jar", + "sha256": "16r2ynk177hk26zjrcwxnfiv01zifsfp0m6n7cd7lz3ncpy697hh" }, { - "url": "https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/2.4.1/jansi-2.4.1-sources.jar", - "sha256": "1f192z3r21bsdsybz4fkw4iy1a5m1rvk6h8na66bygm1cwam21zp" + "url": "https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/1.18/jansi-1.18.pom", + "sha256": "0jzvcni37vlgf7q341ffb6754505fzdji52qh5ppnk9a5jf633yx" }, { "url": "https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/2.4.1/jansi-2.4.1.jar", @@ -1857,10 +1397,6 @@ "url": "https://repo1.maven.org/maven2/org/fusesource/jansi/jansi/2.4.1/jansi-2.4.1.pom", "sha256": "0fxvn4z0gkf3gkgi23jivzx6llg79arh9c7vg63rymfkliwxk61z" }, - { - "url": "https://repo1.maven.org/maven2/org/iq80/snappy/snappy/0.4/snappy-0.4-sources.jar", - "sha256": "03apzr8l9jmxcwmz3sr0icib5l7a64akm5xp3izza8ydbk12nhxk" - }, { "url": "https://repo1.maven.org/maven2/org/iq80/snappy/snappy/0.4/snappy-0.4.jar", "sha256": "1jds257xy63x383vb1dziafv9ziq0z9f9xhz7q3ddsaca1ywi826" @@ -1870,44 +1406,12 @@ "sha256": "12nh4mxvlsj3q3s2wjzcb8ssim8c9rj9allsnzcljh8y24bww2d7" }, { - "url": "https://repo1.maven.org/maven2/org/jline/jline-builtins/3.24.1/jline-builtins-3.24.1-sources.jar", - "sha256": "164axazj4176w1akn9kx7gi3a4dw85zy79pqkm9xsb91j36g9r74" + "url": "https://repo1.maven.org/maven2/org/jline/jline-builtins/3.27.1/jline-builtins-3.27.1.jar", + "sha256": "11wdim6bbmx4f8vbjv96ni8abzkv1n1w21mnbvz2m06w06968nid" }, { - "url": "https://repo1.maven.org/maven2/org/jline/jline-builtins/3.24.1/jline-builtins-3.24.1.jar", - "sha256": "1lb7jjbfrshr3jh8gl9mx7fcb6rqgm016zangg9sw4lasd4bq8d6" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-builtins/3.24.1/jline-builtins-3.24.1.pom", - "sha256": "1vg3fr7fzq7s83lf908bj2k3343rvmkrk6xcy01r4qymm8cqjy3j" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-builtins/3.27.1/jline-builtins-3.27.1-sources.jar", - "sha256": "12xks5smw834iws4hcahr72smgk62mli1q2gn3p9s3zs04zgfmfm" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-builtins/3.27.1/jline-builtins-3.27.1.jar", - "sha256": "11wdim6bbmx4f8vbjv96ni8abzkv1n1w21mnbvz2m06w06968nid" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-builtins/3.27.1/jline-builtins-3.27.1.pom", - "sha256": "1bkjh7387js3yhyfpknl3dcp5i8qfzx808hd8aq2nnd10jzz6wbp" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-native/3.24.1/jline-native-3.24.1-sources.jar", - "sha256": "056cmc7ld6x1qhzszdbq4a6pxl4jpr9ddxsh2rsfjagm6d10pw9j" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-native/3.24.1/jline-native-3.24.1.jar", - "sha256": "05xxvz4wdqpnp9qrhbpmjwacb7npfm7f21xhh6wlgdnk09sj6ds3" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-native/3.24.1/jline-native-3.24.1.pom", - "sha256": "0629m96izvr2m13l68z919bv9p1cw9bi2nf7871krq9lvjvjpv0z" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-native/3.27.1/jline-native-3.27.1-sources.jar", - "sha256": "0dgwcysqnxlgavzf6maqxjpxf1rrm6siq5awv0gs4n9hyhah97np" + "url": "https://repo1.maven.org/maven2/org/jline/jline-builtins/3.27.1/jline-builtins-3.27.1.pom", + "sha256": "1bkjh7387js3yhyfpknl3dcp5i8qfzx808hd8aq2nnd10jzz6wbp" }, { "url": "https://repo1.maven.org/maven2/org/jline/jline-native/3.27.1/jline-native-3.27.1.jar", @@ -1917,30 +1421,10 @@ "url": "https://repo1.maven.org/maven2/org/jline/jline-native/3.27.1/jline-native-3.27.1.pom", "sha256": "13rj7lw6nmgl2s6w0j3ij4v4p6s5cwgm4bazd74nwm4zrjp2izlz" }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-parent/3.24.1/jline-parent-3.24.1.pom", - "sha256": "0a0rai3rhsqlq7siaa8h0r202d110zc47kgh0fmha0d7w2pc1hv8" - }, { "url": "https://repo1.maven.org/maven2/org/jline/jline-parent/3.27.1/jline-parent-3.27.1.pom", "sha256": "108maqyh9szm5z4fxrp30mq38l30inh3gmwdnkfj9ki0dh3zsr79" }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-reader/3.24.1/jline-reader-3.24.1-sources.jar", - "sha256": "054r2j11dmccnv1c79bkml715b78zcv19d0pahbnhznha51lzw57" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-reader/3.24.1/jline-reader-3.24.1.jar", - "sha256": "1nxrqc00jhcfn3l2graiskhcfk6kjin2962f6bi0ggpmkfmvsqw2" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-reader/3.24.1/jline-reader-3.24.1.pom", - "sha256": "02p1f1w98rldifaanq34594wsh6b9vk0fq4mbrm8qii8k0d3zay0" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-reader/3.27.1/jline-reader-3.27.1-sources.jar", - "sha256": "17cj90aksfq1brnzdyfp7rjxd8mlabf74l5bms8vi6276g7iq985" - }, { "url": "https://repo1.maven.org/maven2/org/jline/jline-reader/3.27.1/jline-reader-3.27.1.jar", "sha256": "0y256g9zrf322ycl58z5y7xgky4cjgv7jcq19shby1dxma0b3pgy" @@ -1949,22 +1433,6 @@ "url": "https://repo1.maven.org/maven2/org/jline/jline-reader/3.27.1/jline-reader-3.27.1.pom", "sha256": "020zrz50b9apf38p6xiwnzhkn9k831bs5gcw6glml17kdmym9qqs" }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-style/3.24.1/jline-style-3.24.1-sources.jar", - "sha256": "07k7x04190mhm4jah5yc8f7dzn7gn3gm8xlh8gsh8hb3wk2l569v" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-style/3.24.1/jline-style-3.24.1.jar", - "sha256": "18fl24x0dd9axn7h124ljjdpjgvsnqk4anjqjn9nwhm85w78h0ql" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-style/3.24.1/jline-style-3.24.1.pom", - "sha256": "0g426xhsq3w2psilc7wqs0qag3ahw8gqvy5bimhx8fq1kidw2bx2" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-style/3.27.1/jline-style-3.27.1-sources.jar", - "sha256": "1q4m1gpg0hw0hkv63jyhwsyp7sj95cb4y8bfkiv8inis56paq11q" - }, { "url": "https://repo1.maven.org/maven2/org/jline/jline-style/3.27.1/jline-style-3.27.1.jar", "sha256": "0fiihar5i2d4x0d7p6q9wv1gm6qk99x5q83l62cdd12rn9qric9z" @@ -1973,34 +1441,6 @@ "url": "https://repo1.maven.org/maven2/org/jline/jline-style/3.27.1/jline-style-3.27.1.pom", "sha256": "048kfkb9fr2ascjcnx1l7lh87czi6gnn18sbs2r2mar1dls37n9g" }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal-jansi/3.24.1/jline-terminal-jansi-3.24.1-sources.jar", - "sha256": "1jh64dd538x6as1k3c7p9n05g5qjacjskdq7rh2v0hg674cf8pcq" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal-jansi/3.24.1/jline-terminal-jansi-3.24.1.jar", - "sha256": "19c5ksfxaawplikl13vmmw76km5pbv6c7alka1v1694p4lvr4lqy" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal-jansi/3.24.1/jline-terminal-jansi-3.24.1.pom", - "sha256": "16vfcqhzraqjpyngw6r2p68rw2acc3f8a4nj872lvwwz39kj4220" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal-jna/3.24.1/jline-terminal-jna-3.24.1-sources.jar", - "sha256": "1jjls3yaxdpck2c3y5r276r9a4qxvrf5hmwm1magcqfjzd836g6q" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal-jna/3.24.1/jline-terminal-jna-3.24.1.jar", - "sha256": "0304whx1cb7ypwqbl5hkk56sy8jdarlg3wrg8whagymhc20x6ngc" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal-jna/3.24.1/jline-terminal-jna-3.24.1.pom", - "sha256": "031glx4j3hvfl48lc93qrskr8fkfdj7iary5xw8nv7i36xzxgn90" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.27.1/jline-terminal-jni-3.27.1-sources.jar", - "sha256": "1v7nym7snw7b37ak3s0qlkyrwdy09y1wc0nhbwqmlvs80kp486hl" - }, { "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.27.1/jline-terminal-jni-3.27.1.jar", "sha256": "10hg2lfxgixjqasqkqw2bcaf18dwdbkkhwsih1fv57wfwvqn9g74" @@ -2009,22 +1449,6 @@ "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal-jni/3.27.1/jline-terminal-jni-3.27.1.pom", "sha256": "0mwp6qj0fdi1qgfxp1mazvcb1cccnlilmjw42iq80pzmrgiqsi2j" }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal/3.24.1/jline-terminal-3.24.1-sources.jar", - "sha256": "11zg2h1sdxd50rkaljc96s6jfacid1rlqx5kpaxhnfzci381ydmx" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal/3.24.1/jline-terminal-3.24.1.jar", - "sha256": "1qjry4h48pbr6by21n6fk4wic2hk73wfpynwkbn8ww9lw53jpqyr" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal/3.24.1/jline-terminal-3.24.1.pom", - "sha256": "0s3fmqpyy3nlrjng99vs0nndy21j1vm1hyqqc6zma6jrabwm7r2b" - }, - { - "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal/3.27.1/jline-terminal-3.27.1-sources.jar", - "sha256": "0jaxdfdcj0hv5jn86c8ckmxr45bm4ca57h27ys7rmalwyvy7369c" - }, { "url": "https://repo1.maven.org/maven2/org/jline/jline-terminal/3.27.1/jline-terminal-3.27.1.jar", "sha256": "1wmmwfqby521pljyscy335w2y24rbjijd14k0nsrijkba1bbgds2" @@ -2061,10 +1485,6 @@ "url": "https://repo1.maven.org/maven2/org/junit/junit-bom/5.9.3/junit-bom-5.9.3.pom", "sha256": "1mrf6kf0y6bic98n30w8s9gnxykgzv5j8mx1bh745wkjkv6jj0sd" }, - { - "url": "https://repo1.maven.org/maven2/org/msgpack/msgpack-core/0.9.6/msgpack-core-0.9.6-sources.jar", - "sha256": "0wlwjzva9dkdla42xjvfnh37pzs23jrii3x4br8amcx6a61hgi2v" - }, { "url": "https://repo1.maven.org/maven2/org/msgpack/msgpack-core/0.9.6/msgpack-core-0.9.6.jar", "sha256": "1vh0clrr8iibhgr5zy8zh2y1h7a3pnd5bjq655k8napmzpwi30ba" @@ -2081,10 +1501,6 @@ "url": "https://repo1.maven.org/maven2/org/portable-scala/portable-scala-reflect_sjs1_2.13/1.1.3/portable-scala-reflect_sjs1_2.13-1.1.3.pom", "sha256": "0d2k2j1p4lap87ydfpbspzvas8hpaws8v4z828pi83hgwmhfi5p3" }, - { - "url": "https://repo1.maven.org/maven2/org/portable-scala/sbt-crossproject_2.12_1.0/1.3.2/sbt-crossproject_2.12_1.0-1.3.2-sources.jar", - "sha256": "18czxz2hp674bdir5qmz2igb7h2yhjzlfs6q1ipm58d6mk7fn331" - }, { "url": "https://repo1.maven.org/maven2/org/portable-scala/sbt-crossproject_2.12_1.0/1.3.2/sbt-crossproject_2.12_1.0-1.3.2.jar", "sha256": "123j9lhv03gimvz7f00160zsshy22xzbnmfhcwdzkvqaqxgvaq7l" @@ -2093,10 +1509,6 @@ "url": "https://repo1.maven.org/maven2/org/portable-scala/sbt-crossproject_2.12_1.0/1.3.2/sbt-crossproject_2.12_1.0-1.3.2.pom", "sha256": "12v127n33ij4alkdaf35hyr2ih3kfxv7zwnr21j647icgir4ldz0" }, - { - "url": "https://repo1.maven.org/maven2/org/portable-scala/sbt-platform-deps_2.12_1.0/1.0.2/sbt-platform-deps_2.12_1.0-1.0.2-sources.jar", - "sha256": "18xbnnq2dcnlhj4diqqz0b00hakfipr93mdq930d40flgpkaky7n" - }, { "url": "https://repo1.maven.org/maven2/org/portable-scala/sbt-platform-deps_2.12_1.0/1.0.2/sbt-platform-deps_2.12_1.0-1.0.2.jar", "sha256": "1xs3kmja1xy36dvyjqvz6hqbzbdk7vh201q3bks9jdnvadcalb5k" @@ -2105,10 +1517,6 @@ "url": "https://repo1.maven.org/maven2/org/portable-scala/sbt-platform-deps_2.12_1.0/1.0.2/sbt-platform-deps_2.12_1.0-1.0.2.pom", "sha256": "1qqimp1fzbw16amq39rs3iw80136dig6k2rkrjbi44jfc4qglkkh" }, - { - "url": "https://repo1.maven.org/maven2/org/portable-scala/sbt-scalajs-crossproject_2.12_1.0/1.3.2/sbt-scalajs-crossproject_2.12_1.0-1.3.2-sources.jar", - "sha256": "10bci9984pnansj8glps4zzxlpwwn0fv73sjx1y3d4dd8vjvasjk" - }, { "url": "https://repo1.maven.org/maven2/org/portable-scala/sbt-scalajs-crossproject_2.12_1.0/1.3.2/sbt-scalajs-crossproject_2.12_1.0-1.3.2.jar", "sha256": "1bv712ywbp3cf085xbiql6jj5j4fysxgxd96m4w0h86hh5yx6gsd" @@ -2118,12 +1526,12 @@ "sha256": "04a12lvipzan03m89ayf27jil6nv0gd1rr7qjskicrg8lw2mcqjw" }, { - "url": "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.2/reactive-streams-1.0.2.pom", - "sha256": "1v9x8rbkrl2748cy26p69i7n585gb1igrhy8q38ahjvkwncnlqjv" + "url": "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.2/reactive-streams-1.0.2.jar", + "sha256": "1blgxscxysxhfzfca9hadi2ddx14rqr4np8nqab0838f2h5sn2fc" }, { - "url": "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3-sources.jar", - "sha256": "1fpy44b5qxh0qc8q7znmwpdr38ycdd36i9jskddwmcf94850gd6m" + "url": "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.2/reactive-streams-1.0.2.pom", + "sha256": "1v9x8rbkrl2748cy26p69i7n585gb1igrhy8q38ahjvkwncnlqjv" }, { "url": "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.jar", @@ -2133,10 +1541,6 @@ "url": "https://repo1.maven.org/maven2/org/reactivestreams/reactive-streams/1.0.3/reactive-streams-1.0.3.pom", "sha256": "00n6a4yqaycxlf1dhn0sdsh7ag3vz47m21ybyqrph9glfmqldvfc" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-js/sbt-scalajs_2.12_1.0/1.19.0/sbt-scalajs_2.12_1.0-1.19.0-sources.jar", - "sha256": "0bcbc6syb7z4z5gkh87xycxbn9nppl9vqlx82blwhj8yphs9jmfn" - }, { "url": "https://repo1.maven.org/maven2/org/scala-js/sbt-scalajs_2.12_1.0/1.19.0/sbt-scalajs_2.12_1.0-1.19.0.jar", "sha256": "0wdnbx0cx3lm0xffwpzhm4vwpvvq04mkg86yvgwnj9h5ir1wi5b7" @@ -2153,10 +1557,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-compiler_2.13.16/1.19.0/scalajs-compiler_2.13.16-1.19.0.pom", "sha256": "187znax64zzmcil5pgb10qsmg4ji828517w7aclw2icfsw65cg8j" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-env-nodejs_2.12/1.4.0/scalajs-env-nodejs_2.12-1.4.0-sources.jar", - "sha256": "14harazxqx5lm8hny89mmy2wvx76adsfqxjrn2dpjfmmxvmpf59w" - }, { "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-env-nodejs_2.12/1.4.0/scalajs-env-nodejs_2.12-1.4.0.jar", "sha256": "0f2yfzgd8bqdxd3yrb4pcbry11lhpdm7lf57gfsrs63wkszqz6lf" @@ -2165,10 +1565,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-env-nodejs_2.12/1.4.0/scalajs-env-nodejs_2.12-1.4.0.pom", "sha256": "1k1ma7ls287ii525f20whj1k0g52gkbxf1bqwnwn55kmxqakbipr" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-ir_2.12/1.19.0/scalajs-ir_2.12-1.19.0-sources.jar", - "sha256": "1r16ilb12gkqs1vb3yzvqh753svr6sx4vs6fxn77av2dnwi2yyhp" - }, { "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-ir_2.12/1.19.0/scalajs-ir_2.12-1.19.0.jar", "sha256": "1rb87xdy0dgdckcmn5zizbi3ri49km04shixm53lk5swywayfi59" @@ -2185,10 +1581,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-javalib/1.19.0/scalajs-javalib-1.19.0.pom", "sha256": "0aqj8xlxa98csl8rn2139sjdy786lxd0kpyf5cgcd9ijkgwzxrl3" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-js-envs_2.12/1.4.0/scalajs-js-envs_2.12-1.4.0-sources.jar", - "sha256": "1xy0qndcwhd99dxpjq4h4qksnsa51lx6dcpqmj7xv1q8k1qsmvgl" - }, { "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-js-envs_2.12/1.4.0/scalajs-js-envs_2.12-1.4.0.jar", "sha256": "19biamq6bh6j6ldmknyid02v7pbbfvr3vvhl24fi14av6qsiinn6" @@ -2205,10 +1597,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-library_2.13/1.19.0/scalajs-library_2.13-1.19.0.pom", "sha256": "0k5vm1yw6dx73zi9kribd4sfklkqf9aa2am4a25dnhi9k7nknawm" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-linker-interface_2.12/1.19.0/scalajs-linker-interface_2.12-1.19.0-sources.jar", - "sha256": "1jhljphnwz8lvdrrk707znzmrnkz19rl09ajdkbk3bcfinb0dk1l" - }, { "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-linker-interface_2.12/1.19.0/scalajs-linker-interface_2.12-1.19.0.jar", "sha256": "1a713pljmrzsyfmx8k3gy8aha6gwmm1s3wx64ghvsic5bykk4vhq" @@ -2217,10 +1605,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-linker-interface_2.12/1.19.0/scalajs-linker-interface_2.12-1.19.0.pom", "sha256": "0hnjw94pp649l59s7wac979zkl1n3rwds3clfz7yzs1czk3yvg9d" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-logging_2.12/1.1.1/scalajs-logging_2.12-1.1.1-sources.jar", - "sha256": "0qk0zp4fwzin1d7v59kn7icc4gmva6y3a6cmy09168q7dq2zv4jy" - }, { "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-logging_2.12/1.1.1/scalajs-logging_2.12-1.1.1.jar", "sha256": "1hk395i0vcqh0gwygpzpsb7iq42jw7w8r0nx2ym8g01kzz52x7f5" @@ -2229,10 +1613,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-logging_2.12/1.1.1/scalajs-logging_2.12-1.1.1.pom", "sha256": "0im3b34y67hw2jdh1hm4v0hbc9b3bwx74z3g9djpv8hqsqy4adzl" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-sbt-test-adapter_2.12/1.19.0/scalajs-sbt-test-adapter_2.12-1.19.0-sources.jar", - "sha256": "105bkrrd7rkga0rgrri3a5m0asz2znlin3nlj0pkqpk0x6k6y76c" - }, { "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-sbt-test-adapter_2.12/1.19.0/scalajs-sbt-test-adapter_2.12-1.19.0.jar", "sha256": "1lz2g780yjqcxkgmalwcasvx0wai35fawrbg0bzgiw5183y63px9" @@ -2265,10 +1645,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-js/scalajs-test-interface_2.13/1.19.0/scalajs-test-interface_2.13-1.19.0.pom", "sha256": "0fvzvd9j15d6bi1pf5zsc25s962w5bs386i3w4qj1fnhi51z9h8f" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-collection-compat_2.12/2.11.0/scala-collection-compat_2.12-2.11.0-sources.jar", - "sha256": "0z7h4nkrjgsc0v5w8mr38nrn72ms6dvalxv7jmr6amh7d2lyjzj1" - }, { "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-collection-compat_2.12/2.11.0/scala-collection-compat_2.12-2.11.0.jar", "sha256": "0xd6kvk2pwdwn94xsndlnxh9q7nl3lc7s70vgln392hl99h71wbv" @@ -2277,10 +1653,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-collection-compat_2.12/2.11.0/scala-collection-compat_2.12-2.11.0.pom", "sha256": "11skcckwa0vfj7m32kkn4mb08v32ra9h07a8n30jdx4av5vyxkzz" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-collection-compat_2.12/2.13.0/scala-collection-compat_2.12-2.13.0-sources.jar", - "sha256": "00hh88kc3kggijgyvbc9m5js8qjv7fwkdidh5067ask8gf1aaww2" - }, { "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-collection-compat_2.12/2.13.0/scala-collection-compat_2.12-2.13.0.jar", "sha256": "043ny4v403rnb281ywplc7v5dbzw48hl0gny7vyplya6pwikbsx0" @@ -2305,10 +1677,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-collection-compat_sjs1_2.13/2.13.0/scala-collection-compat_sjs1_2.13-2.13.0.pom", "sha256": "1pb2grfbv2diaw76xzgx3dg33hs1jjr9wpjlpsv7y5k3kxm7zrxv" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2-sources.jar", - "sha256": "1qsnnxy8jymmkd1db3j240ns0h8dwcmhr346ssk4mwj8wylkzglg" - }, { "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-parser-combinators_2.12/1.1.2/scala-parser-combinators_2.12-1.1.2.jar", "sha256": "1hnvn23nkz4kq1wvbk8rz2n2bjjhm03s7b85g7brsni97ss5x614" @@ -2334,12 +1702,12 @@ "sha256": "1q6zfq1lj4mrf9wfgzhg9j3lhfpgmp7l0piijkfscmdmv83x6yv5" }, { - "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.2.0/scala-xml_2.12-2.2.0.pom", - "sha256": "1b1lmi5lfdzrlyf82vbivrmhi9w8767y3q264a8j8rx8nh553c41" + "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.2.0/scala-xml_2.12-2.2.0.jar", + "sha256": "0bsq2lc4f74v9hi9hgbd57wl43q0g8vmpfnfkacp5sngga5zg4px" }, { - "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0-sources.jar", - "sha256": "0768v3rhr1mdbjzcfrcmbj0x7sm4s8f9dpp6wvkx7srnrpyv54xv" + "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.2.0/scala-xml_2.12-2.2.0.pom", + "sha256": "1b1lmi5lfdzrlyf82vbivrmhi9w8767y3q264a8j8rx8nh553c41" }, { "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.12/2.3.0/scala-xml_2.12-2.3.0.jar", @@ -2357,10 +1725,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-lang/modules/scala-xml_2.13/2.1.0/scala-xml_2.13-2.1.0.pom", "sha256": "066is8nfbnng68jj1p9mvmw7qk3hx9j8m7l6g6bcf8gxwnkq50h4" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.20/scala-compiler-2.12.20-sources.jar", - "sha256": "0a2hvivr9aywin7pkiyk5ahvzz042x7yn2bmrv7wnyvs33441h87" - }, { "url": "https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.12.20/scala-compiler-2.12.20.jar", "sha256": "18hzfgijpg3ajfi11lmrp8m2dzsgw3n43i56grqinwk9bkbpd1n8" @@ -2377,10 +1741,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-lang/scala-compiler/2.13.16/scala-compiler-2.13.16.pom", "sha256": "1aq6xfknynd6fch7lwm8xdi6xq3qjpfpylbmj6jlwbf229dmajwm" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.20/scala-library-2.12.20-sources.jar", - "sha256": "1viq7k7kpx5qj2f25kqw1aa1iif82d9c1ajm1lj1axfc879c0k66" - }, { "url": "https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.12.20/scala-library-2.12.20.jar", "sha256": "1jzw9hal60mjl6854hzb5av2q13g6fzv042gl8ls6cff9jc8z2jd" @@ -2397,10 +1757,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-lang/scala-library/2.13.16/scala-library-2.13.16.pom", "sha256": "0lv8m0dsayxkxsjffqnkak0klkfjk1r30vfqd1496c7bjsx74nxj" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.20/scala-reflect-2.12.20-sources.jar", - "sha256": "1yk5dhq2r3kgavbi9zb6vib3wjfa3rdglbcwqxkyki23gdlkkp8s" - }, { "url": "https://repo1.maven.org/maven2/org/scala-lang/scala-reflect/2.12.20/scala-reflect-2.12.20.jar", "sha256": "1yz1h6yb597q8wnpwrsg4grfqdjpnbmjkn9qc3m801d7qz6i86az" @@ -2429,10 +1785,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-lang/scala2-sbt-bridge/2.13.16/scala2-sbt-bridge-2.13.16.pom", "sha256": "18p2d2566b1dbhc9sjadv6d687w3y9w0cxyajrd5cmyslvdlsl8y" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.11.7/actions_2.12-1.11.7-sources.jar", - "sha256": "1mcysqwiw5ms0kq9r96m6k02s794fj7d0a3nfpms81q2wfiv9kc7" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.11.7/actions_2.12-1.11.7.jar", "sha256": "0lcx072xlg53fga0xvz7wzmipxd6mg6y885f8nh4jignbw2v4b49" @@ -2441,22 +1793,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.11.7/actions_2.12-1.11.7.pom", "sha256": "0vzr84l5hdgrpp7bvpvrfvwavdx24nsfkm60fqv7zxkvr3w8ksvq" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.9.9/actions_2.12-1.9.9-sources.jar", - "sha256": "0177d8n536mh5yx55v6gbkn09mrgvbddghyrjj8xq9f8vc5yx0kb" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.9.9/actions_2.12-1.9.9.jar", - "sha256": "0w5mcxww0qkm7y9jq9kfawg30g86wypa8gw01vb68crs7hcpxvl4" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/actions_2.12/1.9.9/actions_2.12-1.9.9.pom", - "sha256": "074swcak7yy68dqhbva9qjhybpvx7ibrkbsjfmkhsqmy0lbyv9xm" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.11.7/collections_2.12-1.11.7-sources.jar", - "sha256": "07qpcw26lrdgjailrh108zfviv515k1m1prixmkkdhkq7r8cfv4p" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.11.7/collections_2.12-1.11.7.jar", "sha256": "1syaxc0y30lv83b59rkz0phcdxikalwcnblvx4szylykfnq3a301" @@ -2465,22 +1801,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.11.7/collections_2.12-1.11.7.pom", "sha256": "1ccn0aq3mawnq0qbgqyimzrdagzn9ak2i72nzqhbln33djdqzv1g" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.9.9/collections_2.12-1.9.9-sources.jar", - "sha256": "153ljng42g9d8603rvz7sacfnlbwbyczk0q9gm11nanb7fvr51x1" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.9.9/collections_2.12-1.9.9.jar", - "sha256": "1migchrz0fdg4viz68yri1ir77j3wh506msw8rz9r4w2cc5yvj7v" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/collections_2.12/1.9.9/collections_2.12-1.9.9.pom", - "sha256": "1fb7aj8749w7qm5mjswhdbna876sb1id2fb7d69hfzi2qcy3b8g9" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.11.7/command_2.12-1.11.7-sources.jar", - "sha256": "120s1xsrp8h14jmv9cr0w6rh5qqgpbs28s5a6r3ckkhb74qi2ncq" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.11.7/command_2.12-1.11.7.jar", "sha256": "0wxrk4szi14850pg6sg2kq6lbgm1m1gh5f1a7vy6c6c3415f9x6f" @@ -2489,22 +1809,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.11.7/command_2.12-1.11.7.pom", "sha256": "0f6aibav7v0dwsg1wkj6y56zxc1590lsgvay66l0c8ahbzl9wabc" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.9.9/command_2.12-1.9.9-sources.jar", - "sha256": "16sia88ni6y73qahks7cbb1n0rh3hg2lj6718l89kgyf555kvcll" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.9.9/command_2.12-1.9.9.jar", - "sha256": "06v1sscirdkyp3i0h8qld00nyawsc2srfsdpr43bxzrk3rfz0r8g" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/command_2.12/1.9.9/command_2.12-1.9.9.pom", - "sha256": "0fjhvr69gw699lwarapa4x4fbplz2iwld28xfwbvcs4pj4z8l3wm" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.11.0/compiler-bridge_2.12-1.11.0-sources.jar", - "sha256": "1ssvrw137hm8z9nhrlwmi72780fhpy0j4lm33z6njpmm124b62xy" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.11.0/compiler-bridge_2.12-1.11.0.jar", "sha256": "121m9px3970xsmcfqv2vi7r7db0v1rpnvbmhynn0n5kfsm38qqca" @@ -2513,22 +1817,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.11.0/compiler-bridge_2.12-1.11.0.pom", "sha256": "15dqgpw6midxhp460494sw55bkq872m48f6ilqvd39pws44kcldm" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.9.6/compiler-bridge_2.12-1.9.6-sources.jar", - "sha256": "1cdlpyg9n0scsrqd7njxmlsznl5ayylpkypj4si4mmam2yl5maid" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.9.6/compiler-bridge_2.12-1.9.6.jar", - "sha256": "0l9df4c59lzq8b8pxvyjss7p1pdg7v8z32nf7sn4fc4bs34dv7w4" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-bridge_2.12/1.9.6/compiler-bridge_2.12-1.9.6.pom", - "sha256": "1cfabnyiagjxz9fjkx7r0cwpac9g0zssadlhx289pvdpbjcrx887" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.11.0/compiler-interface-1.11.0-sources.jar", - "sha256": "1haiwsl3av9sdfq5hsidmixb20601qmrahgcj2jsjysxwfqqi99i" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.11.0/compiler-interface-1.11.0.jar", "sha256": "1jfaz15b9bpg1s2g7v00c462hzwxph081djk9vk58404b83x299h" @@ -2537,22 +1825,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.11.0/compiler-interface-1.11.0.pom", "sha256": "09a7780vavy8myinj7hkjbzkam1h142jm3dv898ad9qq7q24vj6n" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.9.6/compiler-interface-1.9.6-sources.jar", - "sha256": "1jngym0hc32pwjp9n6mrwag94jcq5kxsaqf16v7a6yb7szfg07x3" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.9.6/compiler-interface-1.9.6.jar", - "sha256": "13gsqi1v1hcjmbvvb1zmzfn514dy53gqirx3xamwh57gzhfav1mr" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/compiler-interface/1.9.6/compiler-interface-1.9.6.pom", - "sha256": "1rws7lsncg09s7cawq17fdxcdjhl98prp0j53alzhrsycr8mjmwi" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.11.7/completion_2.12-1.11.7-sources.jar", - "sha256": "0gji9id3lsmxdhh9v4j9kaggp5m70bv7dh907vmslcd7n0w06mcm" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.11.7/completion_2.12-1.11.7.jar", "sha256": "055mbkk4qm3rshgdl41wz7c898fwdf726934kp8x9963z5pnpf4f" @@ -2561,22 +1833,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.11.7/completion_2.12-1.11.7.pom", "sha256": "1bdqm1z34fashpnr4a3azc7w2q6q8gr5fsx92lnm0ky4h6qcr9d7" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.9.9/completion_2.12-1.9.9-sources.jar", - "sha256": "1wpnah3w3np8v4z7lw196hbcrgxxsijsmpq5cx1407gy1gl2h9zi" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.9.9/completion_2.12-1.9.9.jar", - "sha256": "1x7qpxfib4k1j87f6jf1w5fjj643mr7n7d8gzj1zms4cw2zggsjq" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/completion_2.12/1.9.9/completion_2.12-1.9.9.pom", - "sha256": "19s0513zj17hnrbay9q48m3vmc318fkgajqpbg4x1c53dc09ynyd" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.11.7/core-macros_2.12-1.11.7-sources.jar", - "sha256": "1g2dgr27g4fmvmkr8z4l8g3fi8vxqz2bjq7k57viqnxhgv0s3jgh" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.11.7/core-macros_2.12-1.11.7.jar", "sha256": "0jqa2h1026k683039788pip824f87hrwzv5jbz9jjhi06fw5hnwa" @@ -2585,22 +1841,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.11.7/core-macros_2.12-1.11.7.pom", "sha256": "0882s7m8dsx8bynl6aqk9imzbs3h7xlh6656638qgnrcprgrrrzw" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.9.9/core-macros_2.12-1.9.9-sources.jar", - "sha256": "0x27kjdk05nm48rq5lb894jiw3zzrx10a5kpylss22j4c9k1kswl" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.9.9/core-macros_2.12-1.9.9.jar", - "sha256": "1qh6w0wc7xk1hln76n7375mcxhy7973aagzv73819znk9xi0c0dh" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/core-macros_2.12/1.9.9/core-macros_2.12-1.9.9.pom", - "sha256": "1ama9k30gj5nynn16wjvjvb6n94rifr192vcqd53r57k2vkgag4m" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.10.5/io_2.12-1.10.5-sources.jar", - "sha256": "0lqph362qia23grynwlq3xqy19l366ygpjb9aqgnzzbgpwfh8gyi" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.10.5/io_2.12-1.10.5.jar", "sha256": "02ysz4nsi28qjzip6l3r5h3amkp49fz1rxb8a0rl23436y28655z" @@ -2609,34 +1849,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.10.5/io_2.12-1.10.5.pom", "sha256": "04f3dpxsnk8sxakg3dzvsg4bjgpirfww1nycpqx71hpfjwbwm22i" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.9.9/io_2.12-1.9.9-sources.jar", - "sha256": "07bkb8sgf4wvnpfk7qfgfgvxgfzk58j19j2lvg9m54pg5iksjjai" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.9.9/io_2.12-1.9.9.jar", - "sha256": "1vb8qfhgn8mbaq0jgjaq9vzxc4rw5rz2v2k6hma1pn494kn7k11g" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/io_2.12/1.9.9/io_2.12-1.9.9.pom", - "sha256": "1nz6f3a2ya90c8dinfdcw5cp9byl117bsv2l3dfkk151v9rgzmg2" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.6.2/ipcsocket-1.6.2-sources.jar", - "sha256": "0cy8kkzkz4s3f2y2ai9fn6hhmc5682z79kmj4w86xzicmsjwycq6" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.6.2/ipcsocket-1.6.2.jar", - "sha256": "1bkl4adgjqi2g1k3cpbj128bwfb05i7i90izh58y9crnf3mv7d2d" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.6.2/ipcsocket-1.6.2.pom", - "sha256": "17q0ln8maavqzpfqpysqh95m1bhfs97aq2kfmcbyyfw3kkz8fw5h" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.6.3/ipcsocket-1.6.3-sources.jar", - "sha256": "0y0wizi6kc4rncw9lv1c2n1xs6ka2q8lpcw4a8wwfmxrppwz5q5x" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.6.3/ipcsocket-1.6.3.jar", "sha256": "1qi6x1wpcb2vd7bcm078p0r3ckpph39z95zkpsr5hqlll63fsfyw" @@ -2645,22 +1857,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/ipcsocket/ipcsocket/1.6.3/ipcsocket-1.6.3.pom", "sha256": "1g6vkk6cmfr073i4bhkycdrijb157jp7pgs8dg5fapj8sz8dscbf" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-396a783bba347016e7fe30dacc60d355be607fe2/ivy-2.3.0-sbt-396a783bba347016e7fe30dacc60d355be607fe2-sources.jar", - "sha256": "1ibxfyjbr2r9mqd5kxcw4zk4k9pgbdzs6d75k0m1syy9y08jxspf" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-396a783bba347016e7fe30dacc60d355be607fe2/ivy-2.3.0-sbt-396a783bba347016e7fe30dacc60d355be607fe2.jar", - "sha256": "1q8fpc0j57bdyw6f6iqnvdxpyhyavclfkyi5zckb20k30s7lgvib" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-396a783bba347016e7fe30dacc60d355be607fe2/ivy-2.3.0-sbt-396a783bba347016e7fe30dacc60d355be607fe2.pom", - "sha256": "0ymrfvbyn2k207pq88y014nsypclq3b137fpnbl1m8ydcljs71sn" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-77cc781d727b367d3761f097d89f5a4762771d41/ivy-2.3.0-sbt-77cc781d727b367d3761f097d89f5a4762771d41-sources.jar", - "sha256": "1xj73q3i38dqj0fgsjda5a32cvvqkb3f5fa6nb3jn74winpyszsx" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-77cc781d727b367d3761f097d89f5a4762771d41/ivy-2.3.0-sbt-77cc781d727b367d3761f097d89f5a4762771d41.jar", "sha256": "1zrkispiv5g5i6i75fzyvyz4p8yf0gzxviy33zy488vvvvkp0zxr" @@ -2669,10 +1865,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/ivy/ivy/2.3.0-sbt-77cc781d727b367d3761f097d89f5a4762771d41/ivy-2.3.0-sbt-77cc781d727b367d3761f097d89f5a4762771d41.pom", "sha256": "047fzj5imqaxqf49a54cy932df6a0vqiqkyfcq2i80swlkjzfvjb" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/jline/jline/2.14.7-sbt-9a88bc413e2b34a4580c001c654d1a7f4f65bf18/jline-2.14.7-sbt-9a88bc413e2b34a4580c001c654d1a7f4f65bf18-sources.jar", - "sha256": "1lwhzqx7kdc2vkip3w3n4j3g7r5yv1wlmjpknndjknnr23rinwms" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/jline/jline/2.14.7-sbt-9a88bc413e2b34a4580c001c654d1a7f4f65bf18/jline-2.14.7-sbt-9a88bc413e2b34a4580c001c654d1a7f4f65bf18.jar", "sha256": "1c3csrjv67x5k3n92rys0mbql0af0k814vbh2p85xyjl35wamnx0" @@ -2681,34 +1873,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/jline/jline/2.14.7-sbt-9a88bc413e2b34a4580c001c654d1a7f4f65bf18/jline-2.14.7-sbt-9a88bc413e2b34a4580c001c654d1a7f4f65bf18.pom", "sha256": "09gk17wfl5xl03fzzcp69s7lzbbfm3v7srfvsjld2c2dgf49n9vy" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/jline/jline/2.14.7-sbt-9c3b6aca11c57e339441442bbf58e550cdfecb79/jline-2.14.7-sbt-9c3b6aca11c57e339441442bbf58e550cdfecb79-sources.jar", - "sha256": "1dzvs4ipfizm28kj613zyfwkq74b36iflx51fg7z0d13h77d11i9" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/jline/jline/2.14.7-sbt-9c3b6aca11c57e339441442bbf58e550cdfecb79/jline-2.14.7-sbt-9c3b6aca11c57e339441442bbf58e550cdfecb79.jar", - "sha256": "1wc9bz74i11x4j0ycskxvfpj1d7cx2k9p1gm8f8axibxkgljmca0" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/jline/jline/2.14.7-sbt-9c3b6aca11c57e339441442bbf58e550cdfecb79/jline-2.14.7-sbt-9c3b6aca11c57e339441442bbf58e550cdfecb79.pom", - "sha256": "1m974gpy8byzhb75xn6xyvx9frv2yjmy7bjdxxchbni2hn85cd32" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.4.2/launcher-interface-1.4.2-sources.jar", - "sha256": "06whnp710qk5cznw4n8574l27izmhiyn0hg7pbqj04vsqhc98r0p" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.4.2/launcher-interface-1.4.2.jar", - "sha256": "19r2pgahjmvz602vigg7b5phhp3mckam25pg681g5kkhmnlcj1zi" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.4.2/launcher-interface-1.4.2.pom", - "sha256": "08hfq6726zg3f3chp1ymyk5nn80kpjd7cc97zvkpn00lkjg9kxl9" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.5.1/launcher-interface-1.5.1-sources.jar", - "sha256": "0haf5fwnfm20rv6lr0pg5ji6xj6r5h5i9f8jn1zhnd4s4pcygb83" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.5.1/launcher-interface-1.5.1.jar", "sha256": "1w8q7vcldjbijgsiw94mk02nb92zk45h3qb718qc5bm0biif107s" @@ -2717,10 +1881,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/launcher-interface/1.5.1/launcher-interface-1.5.1.pom", "sha256": "1hsjsx20ynw4agnckix0m6sihff4am9ijdni9j3l8b9nqjbnsz2g" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.11.6/librarymanagement-core_2.12-1.11.6-sources.jar", - "sha256": "1ndj8sp9np9gw6xmyn3dliz7yn7x0pn72cj4zy9nfai5l12z2mri" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.11.6/librarymanagement-core_2.12-1.11.6.jar", "sha256": "1wg02xgcswai3r312avx6gih94jisvxqm051s1qbcpma1lqnw4w7" @@ -2729,22 +1889,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.11.6/librarymanagement-core_2.12-1.11.6.pom", "sha256": "17252591ajl4n7a3k9kysdi0732xgl9qdg12xngv6hb9smm9vnd5" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.9.3/librarymanagement-core_2.12-1.9.3-sources.jar", - "sha256": "1ic2w63mn93729mn4khbsizaby8z29r6ddpcvd5azxvi25x3ypkp" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.9.3/librarymanagement-core_2.12-1.9.3.jar", - "sha256": "0sl0yzahz1vjlprpq7ra3571j5150ap4zxz6fcdq1af9gicqbsdl" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-core_2.12/1.9.3/librarymanagement-core_2.12-1.9.3.pom", - "sha256": "17fp331r3ll5p231rilgvh51zlafgwymsmfcc70vz3ziv7a6pg0h" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.11.6/librarymanagement-ivy_2.12-1.11.6-sources.jar", - "sha256": "1pj18vbf8mxr471rwnkr9xz9maz8kklwg7pw1amc7555fxfs4zay" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.11.6/librarymanagement-ivy_2.12-1.11.6.jar", "sha256": "0m4h445xvb2z4amdbp4005dqvibar22xmw46icnkszw66p6h4n80" @@ -2753,22 +1897,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.11.6/librarymanagement-ivy_2.12-1.11.6.pom", "sha256": "1ld9bfrzv6j8pr6cz304kjib3bkc58xkqsg5z12zicpx6bwxlwxx" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.9.3/librarymanagement-ivy_2.12-1.9.3-sources.jar", - "sha256": "07xzb7hm0gkgjdyflr9y3jh83cx5pq8jvyvplb7w06z99b8hrnyd" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.9.3/librarymanagement-ivy_2.12-1.9.3.jar", - "sha256": "01lzr5m9xmip8szrlyvnp00i9dx6jdmz9j4di9jhhqy7aq6w3s11" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/librarymanagement-ivy_2.12/1.9.3/librarymanagement-ivy_2.12-1.9.3.pom", - "sha256": "14myafi9iqf2d4sfdjk2h1ki0p2jkj2ykpw0f6y9c9wa9ai2d0lb" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.11.7/logic_2.12-1.11.7-sources.jar", - "sha256": "1vyvzafzvhsnrkba18ihfj3wpznq3bv1frlf4p7wghsfdr8a8qd9" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.11.7/logic_2.12-1.11.7.jar", "sha256": "1g42pp57x3k9bglh64i2a7qrjqqr3av9dnpjnia06hfy9cdh4zw9" @@ -2777,22 +1905,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.11.7/logic_2.12-1.11.7.pom", "sha256": "10l0wplp7sg2kh1vpiq2hnqyil9g55yhpcp8bckabdv56blxhnag" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.9.9/logic_2.12-1.9.9-sources.jar", - "sha256": "1cc58745zhbr6zpvc115j51h75kqfbbgpixkiw506n45i84j031z" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.9.9/logic_2.12-1.9.9.jar", - "sha256": "10xbyf19zpv45x20yp922f913ggdg68l7q7fx2yl46111lqjz7lj" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/logic_2.12/1.9.9/logic_2.12-1.9.9.pom", - "sha256": "1q9pq0qj1665w3gs9d7a5w96sygzlw5fzly3i297i38l6a1m6fly" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.11.7/main-settings_2.12-1.11.7-sources.jar", - "sha256": "0dyhajx6rixjisshf2g30q5zd89nvllpkrah01f1vgpaa9iskpfb" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.11.7/main-settings_2.12-1.11.7.jar", "sha256": "03i388xcpl4k7bh9x4yiq7719r9rqz3hgg5v9yxx3layyx4yy19r" @@ -2801,22 +1913,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.11.7/main-settings_2.12-1.11.7.pom", "sha256": "0jwyz20588q3zry38n782cjvw3bwzgilba2lj8v5l2iqn9jff1m7" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.9.9/main-settings_2.12-1.9.9-sources.jar", - "sha256": "1cg66lsvy2svgbh09kfys18401ky2gdsdqzsads1d6aidrkigiq2" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.9.9/main-settings_2.12-1.9.9.jar", - "sha256": "1mb97lyas120lwjssif70qrzbl69jwy7ashggifxzwbh8smxnwh9" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/main-settings_2.12/1.9.9/main-settings_2.12-1.9.9.pom", - "sha256": "0f02ynyc75pd8vnk9iw2rmsw4y0vpp43zzvcmwn0payhwsaf4kx2" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.11.7/main_2.12-1.11.7-sources.jar", - "sha256": "1rnd3494c0g4sv153qvm5g7a2np4nns8z68ggdw2lnzpyaxsz3vn" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.11.7/main_2.12-1.11.7.jar", "sha256": "18zw8dc59pmijq3gwv425f90p4g3lm057w1m6m05a825wbn7hqwk" @@ -2825,22 +1921,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.11.7/main_2.12-1.11.7.pom", "sha256": "1kdi0wqk18mvnchdbqyfb51gk6kbnhdzmnj73mb9gnak96rlcbys" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.9.9/main_2.12-1.9.9-sources.jar", - "sha256": "11bmb8kqbwdh7x2q1wpj85j64awkc20z0zy7ygx5wadjkiqg3kvp" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.9.9/main_2.12-1.9.9.jar", - "sha256": "0gxr71xdfr66rvblxg8xgm27d0hrgbr39b4dnq41vlpc644p8qmr" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/main_2.12/1.9.9/main_2.12-1.9.9.pom", - "sha256": "17l9x4k0vp9mdmp682jbhb5g1r86gx3sf0xfihqr3yhbc84ilhn0" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.11.7/protocol_2.12-1.11.7-sources.jar", - "sha256": "0p7isj548ikcl610ar6c4mygbnzmjp4b1p3mbvl0xm82vf8jd2nh" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.11.7/protocol_2.12-1.11.7.jar", "sha256": "1s7nx3v88r13ry5f991j51jcl8dhl97rca1wy6gammqjbrcskpqa" @@ -2849,22 +1929,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.11.7/protocol_2.12-1.11.7.pom", "sha256": "0hzqqs6mzm4ha2163clcwfkxp08zap1126gcxxzycs0cmkpsd639" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.9.9/protocol_2.12-1.9.9-sources.jar", - "sha256": "110qn3xg37f6w7k51ac7pym9x0kz6mkc2x2r8sv4r4dlc1xsk1vb" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.9.9/protocol_2.12-1.9.9.jar", - "sha256": "08pp3cy7iccaqil571l07i7r2f90gyqb5z15lchjqny5jvd3kvhl" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/protocol_2.12/1.9.9/protocol_2.12-1.9.9.pom", - "sha256": "1s4iih1r6g41rsqjxr78a5z71gpa7fks62jff5xbs0qdz3rinjvd" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.11.7/run_2.12-1.11.7-sources.jar", - "sha256": "0inqawyn06r7647dnzj8f5pqv1kwkcw7ab8h6kr3w89g528y3zkp" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.11.7/run_2.12-1.11.7.jar", "sha256": "0dky5b0bi10fq0h8yhs27739i5ji04r3wdfp6x4ljnf9y38fwlk5" @@ -2873,22 +1937,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.11.7/run_2.12-1.11.7.pom", "sha256": "0d90xp5qs40fsxnwhgk24k7ppf655hjh5rx7gcq5ds7gnrrjagqx" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.9.9/run_2.12-1.9.9-sources.jar", - "sha256": "12wmlvfwqb15pz053wac9ablm5ami0vzipbmjlgwh521v23d8g8c" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.9.9/run_2.12-1.9.9.jar", - "sha256": "022srgih54ahcnqw55cbnb0j2c4jx528nmzj1lncdm1mvikyyd2z" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/run_2.12/1.9.9/run_2.12-1.9.9.pom", - "sha256": "1f9j8p50w13ylfiqxc9mhcjkavbz7y248qrbpvnvkjm98isia12l" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.1/sbinary_2.12-0.5.1-sources.jar", - "sha256": "1iz2ky4ww8bdznzqc2d4hysxlmgcd1f83bb9isivzzi9dcsz5xyh" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.1/sbinary_2.12-0.5.1.jar", "sha256": "00rkdkrmw55yc4z1s36bcwf7r2vh92i0ij7mblkkv3byqvrgwc66" @@ -2897,10 +1945,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbinary_2.12/0.5.1/sbinary_2.12-0.5.1.pom", "sha256": "0911brj2s04lsh67n5r30n9hn8vr41267h2biy7z1yyymlbynhd3" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbt-dependency-tree_2.12_1.0/1.9.9/sbt-dependency-tree_2.12_1.0-1.9.9-sources.jar", - "sha256": "1wmkhyl7py9ignym78pshxg2cvsj9c6hdbz9ivg941m4qs366b25" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbt-dependency-tree_2.12_1.0/1.9.9/sbt-dependency-tree_2.12_1.0-1.9.9.jar", "sha256": "0j7mdwh5is4clbfwwznaj6x7r355z0pcx1i192icyd5vlyigp9fy" @@ -2909,10 +1953,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbt-dependency-tree_2.12_1.0/1.9.9/sbt-dependency-tree_2.12_1.0-1.9.9.pom", "sha256": "0bi5675mxd2i9jhd626qaxknfrfxdhyqfm0wsxmrrjdl56mmvj98" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.11.7/sbt-1.11.7-sources.jar", - "sha256": "0syka8gri34a803ml0jr2rb43702rvhfkbhq3wyhfwv08f6kvlx8" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.11.7/sbt-1.11.7.jar", "sha256": "1z1sgwrxma4dm56769k48xgvmi1y401g3xy7c186pp7vk8a1qzp5" @@ -2921,22 +1961,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.11.7/sbt-1.11.7.pom", "sha256": "0h78v893ndjkfb8cwl8gn1wilcf7p3gfg8vsk5944z5lv9glqwxv" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.9.9/sbt-1.9.9-sources.jar", - "sha256": "0gcy28xgcpj2nhcz8zvvxqvzzlkd0fzbfgw35c3dfwk5hi634yas" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.9.9/sbt-1.9.9.jar", - "sha256": "1jx5dsk5rgxvqk8492vafk2lssns48yj61x7wa8i556bfpvhbg4f" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/sbt/1.9.9/sbt-1.9.9.pom", - "sha256": "0gh22r6661r7vybgkzg33qnc09c238kr32kjk5804dbyb1ckv7ln" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.11.7/scripted-plugin_2.12-1.11.7-sources.jar", - "sha256": "0r22jf27cf05j3n3g9nly59v04rrrxqx5k5f5h6jrc4p3mfbwvkv" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.11.7/scripted-plugin_2.12-1.11.7.jar", "sha256": "0f6p5x9w9b7qa6kwcps9y7i8k3fw8wsqvvpqfxz5p1i763bva00v" @@ -2945,10 +1969,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/scripted-plugin_2.12/1.11.7/scripted-plugin_2.12-1.11.7.pom", "sha256": "1gcpfyg71vwjqf8spnwhir741d6l738nbsah824bmvwkpkar91rh" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.11.7/task-system_2.12-1.11.7-sources.jar", - "sha256": "1r35wq9gzrh3wmv9z92qbyah3ssqv43904x9n88hprbfvz79yrhp" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.11.7/task-system_2.12-1.11.7.jar", "sha256": "1xdc94vdcgc7rp2j7dk5dripvqfj5118mws7gjp77az57mr704bg" @@ -2957,22 +1977,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.11.7/task-system_2.12-1.11.7.pom", "sha256": "1zdii982x6mdzsrc1vsc24740k9232gnxl6m7rhkxb9b0kddim4b" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.9.9/task-system_2.12-1.9.9-sources.jar", - "sha256": "04vdaifmfb4xlb170nf1z66fnx1pms1a1pv9n8qrdxlcvdx238br" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.9.9/task-system_2.12-1.9.9.jar", - "sha256": "1i97xafyd3zzgsyrkv6h2ph42m6w974d742zfjw91x5h9iha4cms" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/task-system_2.12/1.9.9/task-system_2.12-1.9.9.pom", - "sha256": "01swbcm8vggmvmvw3rkbjpaibk4v3qa0hv9dgj5dqfiff0nkadrw" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.11.7/tasks_2.12-1.11.7-sources.jar", - "sha256": "1c7ax3lph3cpca0jmz6xbj98zyb3n57m41zd0nmm2i0x2444d5vz" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.11.7/tasks_2.12-1.11.7.jar", "sha256": "0fhkvbhw2vvryv9apsv70zkbqnyv6ygl2qzn01qpv4x9vjmhnfv6" @@ -2981,22 +1985,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.11.7/tasks_2.12-1.11.7.pom", "sha256": "1d4qb0vzv15c9njmhxd53nvz22bk7y6yhqygfyn8qj9352lgwpjj" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.9.9/tasks_2.12-1.9.9-sources.jar", - "sha256": "1qgxba9nvs15bmk19cgfk82h1pffirz2iiyj4rr6xi5hidjjdgc9" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.9.9/tasks_2.12-1.9.9.jar", - "sha256": "1y2q62p43nqpyhnhvsry4ys3vi9xn0rdy64zpzm63nrfj76qfjyz" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/tasks_2.12/1.9.9/tasks_2.12-1.9.9.pom", - "sha256": "09m0igcvpjbv7fibqr4z2l5p8jla44zjg8l91anhfqfkbbx2qq8i" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1-sources.jar", - "sha256": "0b9ry5fbfsar4dsjcj6hj72vlznvrrn6ckrdn1y1i8bs435smw3f" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1.jar", "sha256": "0mkw92467i4jip5kbzvl5v1zwzv05alb3hb97l6z9bp641mxbf0b" @@ -3005,10 +1993,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/template-resolver/0.1/template-resolver-0.1.pom", "sha256": "0nsx88y1b3nqpd6r80bb1rpaaskfhcxdbfaqngykrxz8gvq3i2q3" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/test-agent/1.11.7/test-agent-1.11.7-sources.jar", - "sha256": "169m8c5v08xb9bplxn5hy2ny5gd7d5jygzsvkhwxhqd2xh75fnqj" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/test-agent/1.11.7/test-agent-1.11.7.jar", "sha256": "1nnbi63ki0hv8hwdc6qa5g3klkyghv1i4qxyiqiprxq5qigsfly3" @@ -3017,22 +2001,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/test-agent/1.11.7/test-agent-1.11.7.pom", "sha256": "0w67msjb9j2pnckbhd57daa0aj0wwi93hc0mrk25rx9wwafcby7n" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/test-agent/1.9.9/test-agent-1.9.9-sources.jar", - "sha256": "01abjjmymd1slvb0vindprvaw67xc4ilsdy151frdv1w195hdg4i" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/test-agent/1.9.9/test-agent-1.9.9.jar", - "sha256": "08pa45ai17h0b4ri0bbrjm7bmm4zy90wbqb630b9jg7138kfj97z" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/test-agent/1.9.9/test-agent-1.9.9.pom", - "sha256": "1i27zggzsvvpb0bjd0yp8v65fc7h3sqlqmfcnw7pbg57fwm5bpyj" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0-sources.jar", - "sha256": "1bd533m6mffi3kglhy75dr3bsw4d498ivvr5s6fvvw7lklf4j563" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.jar", "sha256": "17klrl4ylpsy9d16fk6npb7lxfqr1w1m9slsxhph1wwmpcw0pxqm" @@ -3041,10 +2009,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/test-interface/1.0/test-interface-1.0.pom", "sha256": "0bknid634xcq5r8fs1bx0ydxs3rhzgmzq1400h7y29n2s2lhdfk1" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.11.7/testing_2.12-1.11.7-sources.jar", - "sha256": "07fv35hww5j4bwf86fy651bazi65ny19zp0n22yw0sipsvxdqdgm" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.11.7/testing_2.12-1.11.7.jar", "sha256": "04syffxdnxs5cmhviiffhsh85272gdkrwji80q7x54g8r11258pf" @@ -3053,22 +2017,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.11.7/testing_2.12-1.11.7.pom", "sha256": "0nfk61prfy9qwyp1m23llplv63p655i4ypaki2n121cd7w16sz12" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.9.9/testing_2.12-1.9.9-sources.jar", - "sha256": "17gmizwrfp1ijq1l09x9954cmjim54m9k9k031jy282lijayblp6" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.9.9/testing_2.12-1.9.9.jar", - "sha256": "0nmfi1nh5hc7av5p86ldrl1gik81211vdhsi10ynjk24mf405rmx" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/testing_2.12/1.9.9/testing_2.12-1.9.9.pom", - "sha256": "0g52c6az3s5xklyd0n8d9r83q6abi3cyzbbcxypz0hfq08nifqln" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.11.7/util-cache_2.12-1.11.7-sources.jar", - "sha256": "0y7a7jf3ngp3zwjarygb6jcz6yjv4vzz8h8z66vk688z8c7k1mab" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.11.7/util-cache_2.12-1.11.7.jar", "sha256": "02b3z29rfqy6zl8nwdy7as8vwqjgd39wmx1pzwiappx0z3s1x38y" @@ -3077,22 +2025,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.11.7/util-cache_2.12-1.11.7.pom", "sha256": "1aqgvhdiq49a4525xgv33ss7lxq9q5kgkdfxbkrlv7aynzry2qz1" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.9.9/util-cache_2.12-1.9.9-sources.jar", - "sha256": "03vddy4rch60pvylvjxl6aysgn93vh94glivsqjwdwbg583a86mr" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.9.9/util-cache_2.12-1.9.9.jar", - "sha256": "0hydy14hkaw9dkljlqp8wbn33iw5d3qh7g269vpdg32jk7n6hsra" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-cache_2.12/1.9.9/util-cache_2.12-1.9.9.pom", - "sha256": "1ig569vp4zm4v4haybww1i25r3xkr8i53qv8cxvskjfnlzrk249h" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.11.7/util-control_2.12-1.11.7-sources.jar", - "sha256": "1kjv4ld6db6n6wfv9w5iq87c3gxr1lcxxqx6ninabnyvgnjmf2sz" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.11.7/util-control_2.12-1.11.7.jar", "sha256": "1azxmnrpcrrqa9y1aj61h2azlds0l4zpv56bgy08w5q83797ds9f" @@ -3101,22 +2033,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.11.7/util-control_2.12-1.11.7.pom", "sha256": "033awpd5pfc8nhxl006w540j400f3dsyps63wmx1n67fx14c83sd" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.9.9/util-control_2.12-1.9.9-sources.jar", - "sha256": "118j89hj097w3byiwinw53375flw6p0m99i7z74nyhhpn4n3iqwv" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.9.9/util-control_2.12-1.9.9.jar", - "sha256": "0ij0lmwk79yr68c62giac58ybbgbixshnrr130x92swm51yax324" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-control_2.12/1.9.9/util-control_2.12-1.9.9.pom", - "sha256": "0pkv02kb7l3b9iwxggmdcspkpljp1lwyrxsgpfrjsr284lwywb23" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.11.7/util-interface-1.11.7-sources.jar", - "sha256": "0fw6q4nng75z31vmim46k9w8rdfjg65y2b8ccpmjjchphnkbs5q6" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.11.7/util-interface-1.11.7.jar", "sha256": "0iz1a96hq70hjag4c1nhyxm4rv9nsa5lb1917mrn8w4rch6k231g" @@ -3125,22 +2041,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.11.7/util-interface-1.11.7.pom", "sha256": "17mggws1f4zinsrpg3qy1kf75bd3lxy6xjbk2q6kchnhk4a962mx" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.9.9/util-interface-1.9.9-sources.jar", - "sha256": "1kndjmi0im4d0qzlya7zcc6j2xv0bmjd963ki4lg3xrxmrl0w0jm" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.9.9/util-interface-1.9.9.jar", - "sha256": "1g5vvj2xckzwgjkqkky43izy5305gd8s1rvn1ml8vwwyw19pyh5a" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-interface/1.9.9/util-interface-1.9.9.pom", - "sha256": "0a9gp5vcv878krn1g2w3idqxv9bzzkl0vzlr55p212kqf2mcr6cx" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.11.7/util-logging_2.12-1.11.7-sources.jar", - "sha256": "1nx2wzrwjlhr498sgknw5kcq7rpahi7j9r73a0wssamy066m9609" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.11.7/util-logging_2.12-1.11.7.jar", "sha256": "14rd8xx7klij8pv7zsw8993x7xm6czv4197rxfgwr8zanks2nq3d" @@ -3149,22 +2049,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.11.7/util-logging_2.12-1.11.7.pom", "sha256": "0qr2m098gyw8vqqh8fzv5wn5rigqkpvwfw5x4m3rzsfs027a8fr7" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.9.9/util-logging_2.12-1.9.9-sources.jar", - "sha256": "15glndjm2qzlxi2l9hhgxlncrp96axiwx08ylvhi2pm4rj19zl6g" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.9.9/util-logging_2.12-1.9.9.jar", - "sha256": "1b9xdnj3ifjcgxicfhchmm2vfql1s64ns0423dhijq1h05wwi7qn" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-logging_2.12/1.9.9/util-logging_2.12-1.9.9.pom", - "sha256": "1xsrqis9v9amsd4w52klvhf5pwc70bs8789q4966qw2ysbwiw8mq" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.11.7/util-position_2.12-1.11.7-sources.jar", - "sha256": "186vfa9rcl16isxvnds14afgrr40rkgn05ibypg3y427rv3vfisv" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.11.7/util-position_2.12-1.11.7.jar", "sha256": "1r99m2nbr4gznpqm56jc203vmkh7si2bsng0m97af05p6kj78mdy" @@ -3173,22 +2057,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.11.7/util-position_2.12-1.11.7.pom", "sha256": "044f3s30w2a6f4szyh8sv1xxvhsdsvclllqljrxpg40aa3ih9zz5" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.9.9/util-position_2.12-1.9.9-sources.jar", - "sha256": "1kg3mmldjb7xk0fm3pd4djrfmc20krs7wla4sx9cxqmb7v04c409" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.9.9/util-position_2.12-1.9.9.jar", - "sha256": "0aiaw588xz7v9h14ibziqyp3abr5ga3bjm9k3wl7xf6nzg870r8k" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-position_2.12/1.9.9/util-position_2.12-1.9.9.pom", - "sha256": "0imzbfwrv3s93kjzx9005pp9l9zc5iyl3ryhsw15v6n20raw5314" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.11.7/util-relation_2.12-1.11.7-sources.jar", - "sha256": "0mjlcbm9czkzkmfkcxr1nq77khscamm4kzpza3hzisxhb0qas6lz" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.11.7/util-relation_2.12-1.11.7.jar", "sha256": "1y8zm83c91y5s05w37w6jbvv9c2nm1jha4m3jiypji16pyq4vijh" @@ -3197,22 +2065,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.11.7/util-relation_2.12-1.11.7.pom", "sha256": "08rnh8199n0fw5si600kc1qrj7czcni6x1imv53hwlf0yr1f6474" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.9.9/util-relation_2.12-1.9.9-sources.jar", - "sha256": "1h5n5v1ip8i265j7jqf7akmq7xhfn6ia4bgbbwbszr5m2r8abxq9" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.9.9/util-relation_2.12-1.9.9.jar", - "sha256": "1rbdwhiphwbpxk85ayqs0wnczmj6iycz22bkd3q5ir9aynxs8rqr" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-relation_2.12/1.9.9/util-relation_2.12-1.9.9.pom", - "sha256": "10yxqyfkf2m3jyg9nqifz6av9b2mbipkpdbi3y6mhapg7kgrasdp" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.11.7/util-tracking_2.12-1.11.7-sources.jar", - "sha256": "13v87vmv1f3p7z8qnrdzlynpaigm1lxv2rsqf5kqhab96fqgx605" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.11.7/util-tracking_2.12-1.11.7.jar", "sha256": "0sp9jl2pnqr5gdl33wl83rrf45izwggmpivfyb7wynhg0hk414py" @@ -3221,22 +2073,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.11.7/util-tracking_2.12-1.11.7.pom", "sha256": "0fv9mg9vihasyvy5x7ax2nx6wq1v0rkmchnpwqkppqak7rkngdjx" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.9.9/util-tracking_2.12-1.9.9-sources.jar", - "sha256": "0159mbggf7x8sry6ms6bclgz8351z5pb5qw4cpx814hfwpdh6bia" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.9.9/util-tracking_2.12-1.9.9.jar", - "sha256": "1db7bwqhfn0x40lavkm9zkab1a7vbqxy8j7g54xrk3hwgi6bf539" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/util-tracking_2.12/1.9.9/util-tracking_2.12-1.9.9.pom", - "sha256": "10smgpgaaa3liyrsv5x3s034vibbjnribqql2mrfjqf3d57i097x" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.11.0/zinc-apiinfo_2.12-1.11.0-sources.jar", - "sha256": "0jwb8kwd05zr09hxxmiw04x07r0vm2m9vzy4marawxq6qrm8rwwd" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.11.0/zinc-apiinfo_2.12-1.11.0.jar", "sha256": "0hccl4w60xfiq5xns43la254i9vqb7bfxzgzkd2i4gn8kf8nwav3" @@ -3245,22 +2081,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.11.0/zinc-apiinfo_2.12-1.11.0.pom", "sha256": "1lhakd1v0bw4mga374az1ycyhxwrc60yd1kwp6azs5iq84a822h6" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.9.6/zinc-apiinfo_2.12-1.9.6-sources.jar", - "sha256": "135fcf7d9qg2c6sxlwjnl7w3xya21crsfqbmixn3g0pacgqxb94l" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.9.6/zinc-apiinfo_2.12-1.9.6.jar", - "sha256": "1qqw64a2qvl21xvqhf3gyfgyx9vnphvs3hlzyzp7k2nmcw2kdzmz" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-apiinfo_2.12/1.9.6/zinc-apiinfo_2.12-1.9.6.pom", - "sha256": "1387akf6dmxr44sxc48jvarvywm1pz1r2z0s8ibsvkxckgbxfgml" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.11.0/zinc-classfile_2.12-1.11.0-sources.jar", - "sha256": "029kkhajyfamayvqm8v258h52216h65wl52mrv2pajvbgvwpl6af" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.11.0/zinc-classfile_2.12-1.11.0.jar", "sha256": "14sgvsd7csc5y11ig3vpnv1vl80wjkg0xjd0z450xgyqy86ym2yn" @@ -3269,22 +2089,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.11.0/zinc-classfile_2.12-1.11.0.pom", "sha256": "1ym6589ac8nrsw4bk0qw9cj0di1rjykjxbfa3ypddmdci09lq0cr" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.9.6/zinc-classfile_2.12-1.9.6-sources.jar", - "sha256": "1lnlwxwq7vdnb38c7nif07c22j01321rk7r972py1s62rdclnff6" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.9.6/zinc-classfile_2.12-1.9.6.jar", - "sha256": "0s4a86gl847jyh78ppp8maqrvn4rcfqap7k9ka7xhmz50r9hn6ca" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classfile_2.12/1.9.6/zinc-classfile_2.12-1.9.6.pom", - "sha256": "00pqsls654mbzvsnh4372hq6midy2c5dni7wy5pjqajrwps6vw1r" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.11.0/zinc-classpath_2.12-1.11.0-sources.jar", - "sha256": "16if790kknsazkqp8zx9sx1sf9y56fhp2ld0j4rmc39j5j203pdg" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.11.0/zinc-classpath_2.12-1.11.0.jar", "sha256": "162l8wbkpxnkkn0wzcgcsnbhshjl8lx3sphh68d1r6kcj7p0mklr" @@ -3293,22 +2097,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.11.0/zinc-classpath_2.12-1.11.0.pom", "sha256": "0j7dzsqk80lmskgky56kpcc1zwwkhzkl0sy752fb5y7m0qy9k7a7" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.9.6/zinc-classpath_2.12-1.9.6-sources.jar", - "sha256": "0p1b12cfz6x4c7m6wf616dysizxaihgkhfsvyv7lp6j43738z60m" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.9.6/zinc-classpath_2.12-1.9.6.jar", - "sha256": "0mmld30mgkyz7vwvr663y6ml22sjbxs0604ns7kqrjjgzggxhlyz" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-classpath_2.12/1.9.6/zinc-classpath_2.12-1.9.6.pom", - "sha256": "188i813kp4y2v07vbgp4wh8s30b0cb1r6j0iygawqqaljv85l0j8" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.11.0/zinc-compile-core_2.12-1.11.0-sources.jar", - "sha256": "0z5xxn4v2dddn6p290bpn7qgqfxl9yl1i97rf8lgx4nmpk0hr88c" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.11.0/zinc-compile-core_2.12-1.11.0.jar", "sha256": "1mnr9vzj1xavh45wnsqz3p5b8m768i8gp1ps1az5xmah9dqv30px" @@ -3317,22 +2105,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.11.0/zinc-compile-core_2.12-1.11.0.pom", "sha256": "15p60z4x029d9q6ambwf119c4i18rspq9jn3lrl0gnzfms1cr107" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.9.6/zinc-compile-core_2.12-1.9.6-sources.jar", - "sha256": "162ys808371dalszxy2wj9q5mlvfphaya58phfwml0r9x6ajmv9l" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.9.6/zinc-compile-core_2.12-1.9.6.jar", - "sha256": "0kq8w769maq3fy4i7n5n4hdns6iylr0iggxq5ks7nbx6w6sqrw48" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile-core_2.12/1.9.6/zinc-compile-core_2.12-1.9.6.pom", - "sha256": "1a26i692mrj01qw7181sqvgs9p4a7mln46n8kgysdd3gsz3is6w9" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.11.0/zinc-compile_2.12-1.11.0-sources.jar", - "sha256": "1aywbnmbqny1b9nzzw99saliw85khkljx71rrrpdwrslwgpsmyb9" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.11.0/zinc-compile_2.12-1.11.0.jar", "sha256": "0k49zgdlkjl4sw1cp7c5s1mqy0d0lx9avg3vnh59pi87kkym68iq" @@ -3341,22 +2113,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.11.0/zinc-compile_2.12-1.11.0.pom", "sha256": "0chlmzmlq3lsl2ymk7r0pr4gx9k8kfj00ykzziwvs5q99834p39p" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.9.6/zinc-compile_2.12-1.9.6-sources.jar", - "sha256": "1vqkphxp1fdnl9jcd6knfgkscf19q55p2qz9sxcfwlsaag70wycf" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.9.6/zinc-compile_2.12-1.9.6.jar", - "sha256": "19gsj54v5ic5nwaf4wdgzi77diigvdcn3qnhz587llhh44bqyl5f" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-compile_2.12/1.9.6/zinc-compile_2.12-1.9.6.pom", - "sha256": "1rf8ikwg27kn3d6bh4apic76vsppbkazm29npagfbc6664k6kj8a" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.11.0/zinc-core_2.12-1.11.0-sources.jar", - "sha256": "0m27g4fwclbl9yyi7s8vnqrmqjy0d3abaykbfqx40cymnkqmyza0" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.11.0/zinc-core_2.12-1.11.0.jar", "sha256": "1acwb9lx1hn6r5f6q8vs55klv2nmsys5zwzsjb7y6prbymmwbqvh" @@ -3365,22 +2121,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.11.0/zinc-core_2.12-1.11.0.pom", "sha256": "03ziqzpbnww6ibhc3yx09v356782lkkfagsf3341kk1k05l0k8p0" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.9.6/zinc-core_2.12-1.9.6-sources.jar", - "sha256": "037irr9dxr4pkx8fxwdxbrzkmxl3l6l23q2816l8cf0sanccyjqz" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.9.6/zinc-core_2.12-1.9.6.jar", - "sha256": "0g8c28rgl8alikc2bxlval0w36lsmb04bamxrjk174ygp5xsg92i" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-core_2.12/1.9.6/zinc-core_2.12-1.9.6.pom", - "sha256": "02p1w7xzqd517224phvqpycz7705qm7ali9s1ry5ifjmf7b7sn1k" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.11.7/zinc-lm-integration_2.12-1.11.7-sources.jar", - "sha256": "12ghz47a1bbni5igi7j59cjkayvrzx3sdi2gzrfr4g75vjn9h328" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.11.7/zinc-lm-integration_2.12-1.11.7.jar", "sha256": "06jx79s67yip4r3892jp2kng9y9k5c5ng50c61kc0kgrr73g4mhp" @@ -3389,22 +2129,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.11.7/zinc-lm-integration_2.12-1.11.7.pom", "sha256": "15z3xc030v5y5a18k1a26pjrj11x35wryxnynbjd5zdwlh2yccz4" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.9.9/zinc-lm-integration_2.12-1.9.9-sources.jar", - "sha256": "0bvykf74pwxv0czx978mvsd0x5w4caqm6x1vg9fbwrnkshdw66nk" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.9.9/zinc-lm-integration_2.12-1.9.9.jar", - "sha256": "15vywjkq51jj7w0yvdcz60s11v12ywjb4w27ydp0qw5cs8q1ld7j" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-lm-integration_2.12/1.9.9/zinc-lm-integration_2.12-1.9.9.pom", - "sha256": "0vfqkgfcnmpsqzvgnp8bzsqv3ijdspcl6mrgfwcdwxsn5qkih6qx" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist-core-assembly/1.11.0/zinc-persist-core-assembly-1.11.0-sources.jar", - "sha256": "0f4ablyyzxy9sqjsksb2c187pv8bi8ybixylcjsi4kwdr5d4zhk2" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist-core-assembly/1.11.0/zinc-persist-core-assembly-1.11.0.jar", "sha256": "0s2cq7z1n03fxx9wxlpqc1w0j7x5g3da1m1wcxkrip1v6k9ds3ss" @@ -3413,22 +2137,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist-core-assembly/1.11.0/zinc-persist-core-assembly-1.11.0.pom", "sha256": "0qdciwxvlw6kfz2bd80fkfqwg9ic0mr1kg39dv85g4wssk0cxraj" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist-core-assembly/1.9.6/zinc-persist-core-assembly-1.9.6-sources.jar", - "sha256": "1nixch6kq6nrllqcin95pl99arxgjskzri8qxfld05z4nxg9f34x" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist-core-assembly/1.9.6/zinc-persist-core-assembly-1.9.6.jar", - "sha256": "1zxwaf5whwywj4kr0zy6wwxssyxm4c3k2x8fnibvgxflndc1719m" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist-core-assembly/1.9.6/zinc-persist-core-assembly-1.9.6.pom", - "sha256": "1i7msrrwwv79nam9lw1maf7657kj6rvn5drqyai2x4kwpw5ajgjx" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.11.0/zinc-persist_2.12-1.11.0-sources.jar", - "sha256": "1m1dly98vqf5ll8rjgv2dk91irajdqy28axq7z7wx8m96yzf27wf" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.11.0/zinc-persist_2.12-1.11.0.jar", "sha256": "147bnibimmnjznsh2jb85qgrcjgqdyz6v3fbs921hy8pw56wz8k8" @@ -3437,22 +2145,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.11.0/zinc-persist_2.12-1.11.0.pom", "sha256": "0dwbp6xyja1zspljqgfs0x6gsi8dk1fv8gm00kyw9w07pfr7n50p" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.9.6/zinc-persist_2.12-1.9.6-sources.jar", - "sha256": "07hlxnnc6h1mjn400nydws75z1fxjymsr2aglwd9psdn8icyf54a" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.9.6/zinc-persist_2.12-1.9.6.jar", - "sha256": "0h0afgskjvchrp5b2d7xi00asmi3737md7b2sl3x02arryihfqh6" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc-persist_2.12/1.9.6/zinc-persist_2.12-1.9.6.pom", - "sha256": "02i10zh9s384gffbbalrjwl7y9yrwfa0bakkjljal1p0kig5plrr" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.11.0/zinc_2.12-1.11.0-sources.jar", - "sha256": "18a2r3nvaaw2jw59m7r1biyfwc13d1v45ihfqdq3dlg6fmmyhhr9" - }, { "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.11.0/zinc_2.12-1.11.0.jar", "sha256": "15kvh90c630r7qfdvcja790bdr69yb1lmn29pp31yqyhkdrqy7cf" @@ -3461,18 +2153,6 @@ "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.11.0/zinc_2.12-1.11.0.pom", "sha256": "018rx4404wmf77yfkq3h1xrj72yabvfzivjy173h11flrxcchm9z" }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.9.6/zinc_2.12-1.9.6-sources.jar", - "sha256": "0q6naidhp9xmicip552qpwif6slfqy9472z0pjjynkls6npnhgcl" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.9.6/zinc_2.12-1.9.6.jar", - "sha256": "0q5sbdjfq2ds9821nmsdk6jh5pxwjxc3hn9rwsg76dpwhnk93rip" - }, - { - "url": "https://repo1.maven.org/maven2/org/scala-sbt/zinc_2.12/1.9.6/zinc_2.12-1.9.6.pom", - "sha256": "1gqcfan6ki9lbl4ymbbckc167fjpzchza2mj09hc02qyn37z78ij" - }, { "url": "https://repo1.maven.org/maven2/org/scalactic/scalactic_2.13/3.2.19/scalactic_2.13-3.2.19.jar", "sha256": "1bylrj6897947l54y4iwy3y8ygm3rzs5lv61csgf4l6l2zg36z62" @@ -3713,10 +2393,6 @@ "url": "https://repo1.maven.org/maven2/org/scalatest/scalatest_sjs1_2.13/3.2.19/scalatest_sjs1_2.13-3.2.19.pom", "sha256": "0i5kqj8fppxc2l3c0ar258cjwdm07ifmh9rw48qv3i588pb26qvi" }, - { - "url": "https://repo1.maven.org/maven2/org/scoverage/sbt-scoverage_2.12_1.0/2.0.11/sbt-scoverage_2.12_1.0-2.0.11-sources.jar", - "sha256": "1jm85z5vcx2az6la1j7gkbr9w37xj3ai29mxp9yjj74d9w020c0g" - }, { "url": "https://repo1.maven.org/maven2/org/scoverage/sbt-scoverage_2.12_1.0/2.0.11/sbt-scoverage_2.12_1.0-2.0.11.jar", "sha256": "172bx65vm4nxh6mf2imfxjj2gk8n714kl32xg4kdl4aq08hgqjw7" @@ -3725,10 +2401,6 @@ "url": "https://repo1.maven.org/maven2/org/scoverage/sbt-scoverage_2.12_1.0/2.0.11/sbt-scoverage_2.12_1.0-2.0.11.pom", "sha256": "1f3g1wi260g5531a2cv47qvqfmz9vl2vs46fm94ffhm7yiijnx5n" }, - { - "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-domain_2.12/2.1.0/scalac-scoverage-domain_2.12-2.1.0-sources.jar", - "sha256": "1m51qgw7zyknhw4g3fd08hkvax6didca6hi9kyy20z4fmiw8zn9m" - }, { "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-domain_2.12/2.1.0/scalac-scoverage-domain_2.12-2.1.0.jar", "sha256": "0a4p5bmq1q2xkwdccfgzi5kws2d4pj25jxkd6sxhcrf3yc0s2799" @@ -3737,10 +2409,6 @@ "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-domain_2.12/2.1.0/scalac-scoverage-domain_2.12-2.1.0.pom", "sha256": "15j6i6qla9xnckq88ya1k6164fvqkq551gk2lrgax53w5cl3fsc2" }, - { - "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-plugin_2.12.19/2.1.0/scalac-scoverage-plugin_2.12.19-2.1.0-sources.jar", - "sha256": "1bw67s1fi07azc3p394vfd6hq85126rbw0filpvry3vikjdhhhyi" - }, { "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-plugin_2.12.19/2.1.0/scalac-scoverage-plugin_2.12.19-2.1.0.jar", "sha256": "1a4n1as1z775qysb0nkg0k6y53wfvdqkpr1aand8yizhgj677gsx" @@ -3749,10 +2417,6 @@ "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-plugin_2.12.19/2.1.0/scalac-scoverage-plugin_2.12.19-2.1.0.pom", "sha256": "0ghbh4fwzskk1b2b6b51cbamy7i1rma4ljx3sb6mbg4s05i1pxwl" }, - { - "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-reporter_2.12/2.1.0/scalac-scoverage-reporter_2.12-2.1.0-sources.jar", - "sha256": "06qprdgcmyz028c1whzqgvmkyx3r6n9ix34x0qkg4rmm75nyw4z8" - }, { "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-reporter_2.12/2.1.0/scalac-scoverage-reporter_2.12-2.1.0.jar", "sha256": "01gn4hshmmzjlqlqmifsibjixingbxipcvdxsj2yq6h68pbgfcrg" @@ -3761,10 +2425,6 @@ "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-reporter_2.12/2.1.0/scalac-scoverage-reporter_2.12-2.1.0.pom", "sha256": "0hj6vnjqyvxlz874ga6m5k7gxff4vm7lirxspzmfdvsbwnqy8s6q" }, - { - "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-serializer_2.12/2.1.0/scalac-scoverage-serializer_2.12-2.1.0-sources.jar", - "sha256": "01ddxzwy6cvgcz248ldam5kdxawbfznsagijwsbcpqly2ry4j1np" - }, { "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-serializer_2.12/2.1.0/scalac-scoverage-serializer_2.12-2.1.0.jar", "sha256": "19sz51wjvm2swqvgx6w3rbqs77140dxznc8dnw35da2y9sd86i9f" @@ -3773,10 +2433,6 @@ "url": "https://repo1.maven.org/maven2/org/scoverage/scalac-scoverage-serializer_2.12/2.1.0/scalac-scoverage-serializer_2.12-2.1.0.pom", "sha256": "1mgiybl4va00j9wxjyvln0gw20lr4g4sd3fpjkzxw93vwlwwhyj8" }, - { - "url": "https://repo1.maven.org/maven2/org/slf4j/jcl-over-slf4j/1.7.7/jcl-over-slf4j-1.7.7-sources.jar", - "sha256": "151mwar4fz5ibszwxkdml8hvxna61av7qbhdn7hwjfd3sa6v2l0m" - }, { "url": "https://repo1.maven.org/maven2/org/slf4j/jcl-over-slf4j/1.7.7/jcl-over-slf4j-1.7.7.jar", "sha256": "1qmw2jhd8wdgsyhbf16nz93dpl9j91737ik7wl135hp1a1cjniy6" @@ -3789,10 +2445,6 @@ "url": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.pom", "sha256": "0563y89kbl5d5r02c9221hjkvh1cl97g01jjrffy2rwv3rslf1vy" }, - { - "url": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36-sources.jar", - "sha256": "02hmzixxfjkdrj30lndqny1mxybr2fvjs4rz2njvf99pg8sh9g0m" - }, { "url": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.36/slf4j-api-1.7.36.jar", "sha256": "1h512ry8g0nriazg3dqzs6s96502a77drw8vq26nfya97rg5gvyk" @@ -3825,10 +2477,6 @@ "url": "https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/5/oss-parent-5.pom", "sha256": "0g8da9zsimg7drhsnzivb2c874jda96frbii05iqlpaq189d8y0n" }, - { - "url": "https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/6/oss-parent-6.pom", - "sha256": "16c4i8n978zfb788i6lrwv9b6qgirzqnc25kl5c28fgmx09nsc5l" - }, { "url": "https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/7/oss-parent-7.pom", "sha256": "0m4lallnlhyfj3z24ispxzwvsxzaznhw6zsmk4j74sibr5kqh7xm" @@ -3837,10 +2485,6 @@ "url": "https://repo1.maven.org/maven2/org/sonatype/oss/oss-parent/9/oss-parent-9.pom", "sha256": "0yl2hbwz2kn1hll1i00ddzn8f89bfdcjwdifz0pj2j15k1gjch7v" }, - { - "url": "https://repo1.maven.org/maven2/org/sonatype/spice/zapper/spice-zapper/1.3/spice-zapper-1.3-sources.jar", - "sha256": "019paai0l6nd40244z0dkh0lybjbfr3s0ri5yv8dgm47kbyr7rpp" - }, { "url": "https://repo1.maven.org/maven2/org/sonatype/spice/zapper/spice-zapper/1.3/spice-zapper-1.3.jar", "sha256": "1h5hyp8iily4gy62dhj0k7niqvblq51yrvq1h512w0jvj977i36k" @@ -3849,10 +2493,6 @@ "url": "https://repo1.maven.org/maven2/org/sonatype/spice/zapper/spice-zapper/1.3/spice-zapper-1.3.pom", "sha256": "1jlgg61r3yl8gs0jzg3xgvy54qbryk40slfkz0fh427x7riby8bg" }, - { - "url": "https://repo1.maven.org/maven2/org/tukaani/xz/1.9/xz-1.9-sources.jar", - "sha256": "0qplns12ldnjfz6ac70g00v9zdfyybkxv4ai0cppa3mr0rzs9vsv" - }, { "url": "https://repo1.maven.org/maven2/org/tukaani/xz/1.9/xz-1.9.jar", "sha256": "1r9mymavi6w85zbn0zfpxs4m535sfnpxv8x0ydnzky24zin306r1" @@ -3933,10 +2573,6 @@ "url": "https://repo1.maven.org/maven2/org/typelevel/simulacrum-scalafix-annotations_2.13/0.5.4/simulacrum-scalafix-annotations_2.13-0.5.4.pom", "sha256": "1irj37c0qw1ij367xcsl08ahd5gwvk3ggh0m5mzddxgc1mrhbdxa" }, - { - "url": "https://repo1.maven.org/maven2/org/virtuslab/scala-cli/config_2.12/0.2.1/config_2.12-0.2.1-sources.jar", - "sha256": "03h2qmahvq9mspv59acndmsmlnzzmvs1y04q1fhdrh6f52yp38p7" - }, { "url": "https://repo1.maven.org/maven2/org/virtuslab/scala-cli/config_2.12/0.2.1/config_2.12-0.2.1.jar", "sha256": "1g2knf6sg63w3xq7y0nsjhf3hhl8zmbza69bx1vzsr068nrsd83a" @@ -3945,10 +2581,6 @@ "url": "https://repo1.maven.org/maven2/org/virtuslab/scala-cli/config_2.12/0.2.1/config_2.12-0.2.1.pom", "sha256": "1lmzwrrl7l97h1qlwj6c8133hh4bkslb88yvwkpkzdgnr54x7x0w" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-codec_2.12/23.11.3/airframe-codec_2.12-23.11.3-sources.jar", - "sha256": "1rf42vsg0fy4qw0aymnz2vrpanhgl8ryy13m6hsrvjq65kgnagwh" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-codec_2.12/23.11.3/airframe-codec_2.12-23.11.3.jar", "sha256": "0bipr90j86i27hsgilpqmjiyx6blzpx4r683ck3zs5smln1mb5kh" @@ -3957,10 +2589,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-codec_2.12/23.11.3/airframe-codec_2.12-23.11.3.pom", "sha256": "025b0zvchxk0hwwkqyq8jxqkqvqbkqgmpp96fs5hpz3pq9p8ymhk" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-control_2.12/23.11.3/airframe-control_2.12-23.11.3-sources.jar", - "sha256": "18dkj7xn47gb38zhqahzrvb7mhfi7v51acaxf8msncbprfm6xl2z" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-control_2.12/23.11.3/airframe-control_2.12-23.11.3.jar", "sha256": "19x05xzz5nhl7g5ya22aw1iygmnw1h8v0xfmkkpiq25zvw6w0a3g" @@ -3969,10 +2597,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-control_2.12/23.11.3/airframe-control_2.12-23.11.3.pom", "sha256": "0fk24nq36wp3v3p39pm6k2y2nvxv2sqvw03c8pw6zplgff80p2w3" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-di-macros_2.12/23.11.3/airframe-di-macros_2.12-23.11.3-sources.jar", - "sha256": "0mi269wakjy3yjrbg38mvysr4n46ki759xwdmccrzfz3a2dbkz8q" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-di-macros_2.12/23.11.3/airframe-di-macros_2.12-23.11.3.jar", "sha256": "18yjqnsx1c84k4zkhzm0csq041nf0jl43qj5jlmgnm48xa6z0d3d" @@ -3981,10 +2605,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-di-macros_2.12/23.11.3/airframe-di-macros_2.12-23.11.3.pom", "sha256": "0kvk1mwkdqy3fhin6210j465cwg3hxkvb435r5k6v7z6pxlmk4sq" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-http_2.12/23.11.3/airframe-http_2.12-23.11.3-sources.jar", - "sha256": "04yawkxn28np7vymn1f26zmdf5c5f7hxwl5zi6zpqcsfv9wqy47j" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-http_2.12/23.11.3/airframe-http_2.12-23.11.3.jar", "sha256": "1y48n2wqyaba2c3d9kcpjdch39zmh86sckr0rb1is3a6qyrr824k" @@ -3993,10 +2613,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-http_2.12/23.11.3/airframe-http_2.12-23.11.3.pom", "sha256": "130npvrjxy4minlrjgk4aq1gchr038jl1785mzkfnikcsq6vh1n0" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-json_2.12/23.11.3/airframe-json_2.12-23.11.3-sources.jar", - "sha256": "00ldhnj2s9ncw87naf4cr6i4c114vcy1zyxay4qv6mlbf38xf42d" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-json_2.12/23.11.3/airframe-json_2.12-23.11.3.jar", "sha256": "188s3ryk58vnhn24ivrcmgsvp2qda0p1if1ckpymlw7wpz906d9z" @@ -4005,10 +2621,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-json_2.12/23.11.3/airframe-json_2.12-23.11.3.pom", "sha256": "08y0illi91p3d1s0syb468csqq3zgbdyi9njxwf71xn820jjk2zh" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-log_2.12/23.11.3/airframe-log_2.12-23.11.3-sources.jar", - "sha256": "1y2j7ns6gxhdn9lji4z0wmn7carbgam4krcb4qf6i460xaajv5l9" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-log_2.12/23.11.3/airframe-log_2.12-23.11.3.jar", "sha256": "0fkbq8cyrdi3v2zfn9ckppspzh0k44yf0rg7znwlcpxxclyh6j6m" @@ -4017,10 +2629,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-log_2.12/23.11.3/airframe-log_2.12-23.11.3.pom", "sha256": "1sjlx388a65g7wi94bbx1mcqbw2k4c4jn3qxp3qnglx7bgvjp0ms" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-metrics_2.12/23.11.3/airframe-metrics_2.12-23.11.3-sources.jar", - "sha256": "14qa3mcy8kvqrgwzgf6i3s2kg9scjx7y9jq41dikdqgm078599cl" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-metrics_2.12/23.11.3/airframe-metrics_2.12-23.11.3.jar", "sha256": "0x4fp6i1rniyvypvkj0777f9lm36dpmziznawi6yl2z5y8hahqg7" @@ -4029,10 +2637,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-metrics_2.12/23.11.3/airframe-metrics_2.12-23.11.3.pom", "sha256": "059yyjy1ga56bk2hisrmk4qx9bxd2mrp1fzrnnak7d05vz0czm9w" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-msgpack_2.12/23.11.3/airframe-msgpack_2.12-23.11.3-sources.jar", - "sha256": "02vbx4dnqpij6k7y4wwn6ipaali1kvpf9hmd8z5jcxsgns9bq7xx" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-msgpack_2.12/23.11.3/airframe-msgpack_2.12-23.11.3.jar", "sha256": "0bv1s39pbrnzm2fqz223gzx548fcbrzh9kjxwfhhhkcsvglzywvm" @@ -4041,10 +2645,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-msgpack_2.12/23.11.3/airframe-msgpack_2.12-23.11.3.pom", "sha256": "032i1m9fmgzy8dj0jkd7k961vmp084mc9izlbipc7shfhr1aidc3" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-rx_2.12/23.11.3/airframe-rx_2.12-23.11.3-sources.jar", - "sha256": "0d9f971zjahbjc7cs3451ybfwq2srk5q3ynfifwjqanyha5fx5wc" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-rx_2.12/23.11.3/airframe-rx_2.12-23.11.3.jar", "sha256": "1prri81h1ng0km1a7bwjmqrr8m49w1s1hn8i9fw080mprbkf8kbz" @@ -4053,10 +2653,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-rx_2.12/23.11.3/airframe-rx_2.12-23.11.3.pom", "sha256": "0c672sy621ds7fsmvgrpawvvmcgm04k0xa0ifrfl0cnkn7bj1xxd" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-surface_2.12/23.11.3/airframe-surface_2.12-23.11.3-sources.jar", - "sha256": "0p88fs1f0h027kmpybaqnc3mlg0dqjwjpya1l52hi8gyk2dkz3rh" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-surface_2.12/23.11.3/airframe-surface_2.12-23.11.3.jar", "sha256": "1qj4c2g56h6r609wnw5m65i13dpvbw6hqlmj74bzhh7d199wbar4" @@ -4065,10 +2661,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-surface_2.12/23.11.3/airframe-surface_2.12-23.11.3.pom", "sha256": "1lz8q4nkwlhl3ln2z6765h06ys37yl6r60bgr7djgky6izly3mx8" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-ulid_2.12/23.11.3/airframe-ulid_2.12-23.11.3-sources.jar", - "sha256": "0fginbv7n0myjlpgc70s53jl68vr6720hcvw0iyyv3sv3fb64jln" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-ulid_2.12/23.11.3/airframe-ulid_2.12-23.11.3.jar", "sha256": "07qg7b46i6x1bblmapdy6vyv6lcx3yb5kpj772blviydkzqybarc" @@ -4077,10 +2669,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe-ulid_2.12/23.11.3/airframe-ulid_2.12-23.11.3.pom", "sha256": "1gyph68ldpd989z5rqv3179g7srv8xydxkzv2bs4gq50ib8whdhb" }, - { - "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe_2.12/23.11.3/airframe_2.12-23.11.3-sources.jar", - "sha256": "1dikbcsmqzsbkj6s6gmz2l2in0qqwfd42bkrqn411v66291vvgs0" - }, { "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe_2.12/23.11.3/airframe_2.12-23.11.3.jar", "sha256": "12krpxbr7vidywgls3061vwrvx7m0p4ma1xdzq8nc1f4hsr4k7y6" @@ -4089,10 +2677,6 @@ "url": "https://repo1.maven.org/maven2/org/wvlet/airframe/airframe_2.12/23.11.3/airframe_2.12-23.11.3.pom", "sha256": "0nar599bd4p53cxskr8abmqxlg68198arlzz00w0zvpmbghr5bxw" }, - { - "url": "https://repo1.maven.org/maven2/org/xerial/sbt/sbt-sonatype_2.12_1.0/3.10.0/sbt-sonatype_2.12_1.0-3.10.0-sources.jar", - "sha256": "12yrzc91vjdhhz5r294mrf4bgsdzh12mqks0j97p1gzr9xafdmp3" - }, { "url": "https://repo1.maven.org/maven2/org/xerial/sbt/sbt-sonatype_2.12_1.0/3.10.0/sbt-sonatype_2.12_1.0-3.10.0.jar", "sha256": "1p7j8sq3mnrcksaym7zsdrjdl39z50q321nm7r40pxxd6ldq8bvm"