From eb3274bb534f541ad0a015e608da5580d5290b80 Mon Sep 17 00:00:00 2001 From: Martin Weise <martin.weise@tuwien.ac.at> Date: Sun, 24 Nov 2024 19:44:02 +0000 Subject: [PATCH] Hotfix/upload --- .docker/docker-compose.yml | 3 + .docs/.swagger/api.base.yaml | 2 +- .docs/.swagger/api.yaml | 2 +- .docs/changelog.md | 18 +- .docs/index.md | 6 +- .docs/kubernetes.md | 2 +- .gitlab-ci.yml | 38 +- Makefile | 4 +- dbrepo-analyse-service/Pipfile | 2 +- dbrepo-analyse-service/Pipfile.lock | 621 ++-- .../lib/dbrepo-1.5.2.tar.gz | Bin 0 -> 39300 bytes dbrepo-data-service/pom.xml | 2 +- dbrepo-data-service/querystore/pom.xml | 4 +- dbrepo-data-service/report/pom.xml | 4 +- dbrepo-data-service/rest-service/pom.xml | 6 +- .../endpoint/TableEndpointUnitTest.java | 1 - .../tuwien/endpoint/ViewEndpointUnitTest.java | 1 - .../DatabaseServiceIntegrationTest.java | 3 +- .../service/SubsetServiceIntegrationTest.java | 1 - .../service/TableServiceIntegrationTest.java | 2 +- .../service/ViewServiceIntegrationTest.java | 5 +- dbrepo-data-service/services/pom.xml | 6 +- .../java/at/tuwien/mapper/DataMapper.java | 30 +- .../java/at/tuwien/mapper/MetadataMapper.java | 7 +- .../impl/AccessServiceMariaDbImpl.java | 2 +- .../impl/DatabaseServiceMariaDbImpl.java | 8 +- .../impl/SchemaServiceMariaDbImpl.java | 6 +- .../impl/SubsetServiceMariaDbImpl.java | 8 +- .../service/impl/TableServiceMariaDbImpl.java | 10 +- .../service/impl/ViewServiceMariaDbImpl.java | 5 - dbrepo-metadata-service/api/pom.xml | 6 +- dbrepo-metadata-service/entities/pom.xml | 4 +- dbrepo-metadata-service/oai/pom.xml | 4 +- dbrepo-metadata-service/pom.xml | 2 +- dbrepo-metadata-service/report/pom.xml | 4 +- dbrepo-metadata-service/repositories/pom.xml | 4 +- dbrepo-metadata-service/rest-service/pom.xml | 4 +- dbrepo-metadata-service/services/pom.xml | 4 +- dbrepo-metadata-service/test/pom.xml | 4 +- dbrepo-search-service/Pipfile | 2 +- dbrepo-search-service/Pipfile.lock | 511 ++- dbrepo-search-service/init/Pipfile.lock | 489 ++- .../init/lib/dbrepo-1.5.2.tar.gz | Bin 0 -> 39300 bytes dbrepo-search-service/lib/dbrepo-1.5.2.tar.gz | Bin 0 -> 39300 bytes dbrepo-ui/composables/upload-service.ts | 5 + dbrepo-upload-service/.gitignore | 2 + dbrepo-upload-service/mvnw | 310 ++ dbrepo-upload-service/mvnw.cmd | 182 ++ dbrepo-upload-service/pom.xml | 168 + dbrepo-upload-service/pre-create.sh | 45 + .../src/main/java/at/tuwien/Application.java | 13 + .../src/main/resources/application-local.yml | 82 + .../src/main/resources/application.yml | 84 + .../java/at/tuwien/config/GatewayConfig.java | 40 + .../java/at/tuwien/config/KeycloakConfig.java | 83 + .../java/at/tuwien/config/TusdConfig.java | 16 + .../at/tuwien/config/TusdContainerConfig.java | 71 + .../interceptor/KeycloakInterceptor.java | 61 + .../service/UploadServiceIntegrationTest.java | 138 + .../src/test/resources/application.properties | 23 + .../src/test/resources/init/dbrepo-realm.json | 2822 +++++++++++++++++ docker-compose.yml | 4 +- helm/dbrepo/Chart.yaml | 4 +- helm/dbrepo/README.md | 4 +- helm/dbrepo/templates/metadata-secret.yaml | 4 +- helm/dbrepo/templates/upload-configmap.yaml | 54 + helm/dbrepo/values.yaml | 26 +- install.sh | 20 +- lib/python/pyproject.toml | 2 +- lib/python/setup.py | 2 +- make/dev.mk | 1 + make/test.mk | 4 + sonar-project.properties | 2 +- 73 files changed, 5157 insertions(+), 962 deletions(-) create mode 100644 dbrepo-analyse-service/lib/dbrepo-1.5.2.tar.gz create mode 100644 dbrepo-search-service/init/lib/dbrepo-1.5.2.tar.gz create mode 100644 dbrepo-search-service/lib/dbrepo-1.5.2.tar.gz create mode 100644 dbrepo-upload-service/.gitignore create mode 100755 dbrepo-upload-service/mvnw create mode 100644 dbrepo-upload-service/mvnw.cmd create mode 100644 dbrepo-upload-service/pom.xml create mode 100755 dbrepo-upload-service/pre-create.sh create mode 100644 dbrepo-upload-service/src/main/java/at/tuwien/Application.java create mode 100644 dbrepo-upload-service/src/main/resources/application-local.yml create mode 100644 dbrepo-upload-service/src/main/resources/application.yml create mode 100644 dbrepo-upload-service/src/test/java/at/tuwien/config/GatewayConfig.java create mode 100644 dbrepo-upload-service/src/test/java/at/tuwien/config/KeycloakConfig.java create mode 100644 dbrepo-upload-service/src/test/java/at/tuwien/config/TusdConfig.java create mode 100644 dbrepo-upload-service/src/test/java/at/tuwien/config/TusdContainerConfig.java create mode 100644 dbrepo-upload-service/src/test/java/at/tuwien/interceptor/KeycloakInterceptor.java create mode 100644 dbrepo-upload-service/src/test/java/at/tuwien/service/UploadServiceIntegrationTest.java create mode 100644 dbrepo-upload-service/src/test/resources/application.properties create mode 100644 dbrepo-upload-service/src/test/resources/init/dbrepo-realm.json create mode 100644 helm/dbrepo/templates/upload-configmap.yaml diff --git a/.docker/docker-compose.yml b/.docker/docker-compose.yml index 76788c4099..07c0f1b6ca 100644 --- a/.docker/docker-compose.yml +++ b/.docker/docker-compose.yml @@ -443,10 +443,13 @@ services: container_name: dbrepo-upload-service hostname: upload-service image: docker.io/tusproject/tusd:v2.4.0 + volumes: + - "./config/pre-create.sh:/srv/tusd-hooks/pre-create:ro" command: - "-behind-proxy" - "-max-size=2000000000" - "-base-path=/api/upload/files/" + - "-hooks-dir=/srv/tusd-hooks/" - "-s3-endpoint=${STORAGE_ENDPOINT:-http://storage-service:9000}" - "-s3-bucket=dbrepo" environment: diff --git a/.docs/.swagger/api.base.yaml b/.docs/.swagger/api.base.yaml index 864ee99e28..d5fadcf597 100644 --- a/.docs/.swagger/api.base.yaml +++ b/.docs/.swagger/api.base.yaml @@ -24,7 +24,7 @@ info: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0 title: DBRepo REST API - version: 1.5.1 + version: 1.5.2 openapi: 3.1.0 servers: - description: Test Instance diff --git a/.docs/.swagger/api.yaml b/.docs/.swagger/api.yaml index 714e7c1dd8..8ba41ba2b1 100644 --- a/.docs/.swagger/api.yaml +++ b/.docs/.swagger/api.yaml @@ -16,7 +16,7 @@ info: name: Apache 2.0 url: 'https://www.apache.org/licenses/LICENSE-2.0' title: DBRepo REST API - version: 1.5.1 + version: 1.5.2 servers: - description: Test Instance url: 'https://test.dbrepo.tuwien.ac.at' diff --git a/.docs/changelog.md b/.docs/changelog.md index f2a35ee8f9..9b555ce4f0 100644 --- a/.docs/changelog.md +++ b/.docs/changelog.md @@ -2,6 +2,22 @@ author: Martin Weise --- +## v1.5.2 (2024-11-19) + +[:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.5.2) + +### What's Changed + +#### Changes + +* Require authentication for uploading files + in [#466](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/466). + +#### Fixes + +* Fixed the `dist.tar.gz` file not being found in the CI/CD pipeline on `release-` branches + in [#465](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/465). + ## v1.5.1 (2024-11-09) [:simple-gitlab: GitLab Release](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/tags/v1.5.1) @@ -12,7 +28,7 @@ author: Martin Weise * Bug where the data volume could not be calculated when the data length column in the Metadata Database is `null` in [#462](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/462). -* Bug where the schema could not be created manually +* Bug where the schema could not be created manually in [#461](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/issues/461). ## v1.5.0 (2024-11-06) diff --git a/.docs/index.md b/.docs/index.md index b0a47b3c6f..8265da0102 100644 --- a/.docs/index.md +++ b/.docs/index.md @@ -14,7 +14,7 @@ author: Martin Weise   -Documentation for version: [v1.5.1](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). +Documentation for version: [v1.5.2](https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/releases). DBRepo is a repository for data in databases that are used from the beginning until the end of a research project supporting data evolution, -citation and -versioning. It implements the query store of the @@ -37,8 +37,8 @@ Installing DBRepo is very easy or ## Who is using DBRepo? - [TU Wien](https://dbrepo1.ec.tuwien.ac.at) -- TU Graz -- TU Darmstadt +- [TU Graz](https://dbrepo.cyverse.at) +- [TU Darmstadt](https://tudatabases.ulb.tu-darmstadt.de) - [Universität Hamburg](https://dbrepo.fdm.uni-hamburg.de/) - [Universiti Teknikal Malaysia Melaka](https://dbrepo.utem.edu.my/) - University of the Philippines diff --git a/.docs/kubernetes.md b/.docs/kubernetes.md index 6e66817d98..150e3ffb5e 100644 --- a/.docs/kubernetes.md +++ b/.docs/kubernetes.md @@ -13,7 +13,7 @@ helm upgrade --install dbrepo \ -n dbrepo \ "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" \ --values ./values.yaml \ - --version "1.5.1" \ + --version "1.5.2" \ --create-namespace \ --cleanup-on-fail ``` diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 336daf1eb3..3a5d8368d1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,8 +4,8 @@ variables: TESTCONTAINERS_RYUK_DISABLED: "false" PYTHON_VERSION: "3.11" DOC_VERSION: "1.5" - APP_VERSION: "1.5.1" - CHART_VERSION: "1.5.1" + APP_VERSION: "1.5.2" + CHART_VERSION: "1.5.2" CACHE_FALLBACK_KEY: ${CI_DEFAULT_BRANCH} # This will supress any download for dependencies and plugins or upload messages which would clutter the console log. # `showDateTime` will show the passed time in milliseconds. You need to specify `--batch-mode` to make this work. @@ -104,12 +104,13 @@ build-search-service: build-docker: image: docker.io/docker:24-dind stage: build + variables: + DOCKER_BUILDKIT: 0 before_script: + - "apk add --no-cache make" - echo "$CI_REGISTRY_PASSWORD" | docker login --username "$CI_REGISTRY_USER" --password-stdin $CI_REGISTRY_URL script: - - "docker build -t dbrepo-metadata-service:build --target build dbrepo-metadata-service" - - "docker build -t dbrepo-data-service:build --target build dbrepo-data-service" - - "docker compose build --parallel" + - "make build-images" build-helm: image: docker.io/docker:24-dind @@ -161,10 +162,21 @@ verify-install-script: - /^release-.*/ variables: SKIP_CHECKS: 1 + before_script: + - "apk add bash curl" + script: + - "curl -sSL https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services/-/raw/release-${DOC_VERSION}/install.sh | bash | grep 'Success!'" + +verify-dist: + image: docker.io/alpine:3.20 + stage: verify + only: + refs: + - /^release-.*/ + before_script: + - "apk add curl" script: - - apk add bash curl - - bash install.sh - - exit 0 + - "curl -v --output /dev/null --fail https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/${APP_VERSION}/dist.tar.gz" lint-helm-chart: image: docker.io/alpine:3.20 @@ -218,6 +230,12 @@ test-data-service: junit: ./dbrepo-data-service/rest-service/target/surefire-reports/TEST-*.xml coverage: '/Total.*?([0-9]{1,3})%/' +test-upload-service: + image: maven:3-openjdk-17 + stage: test + script: + - "mvn -f ./dbrepo-upload-service/pom.xml clean test $MAVEN_OPTS" + test-analyse-service: image: docker.io/python:3.11-alpine stage: test @@ -325,7 +343,7 @@ test-ui: dependencies: - build-ui before_script: - - "apk add bash apache2-utils" + - "apk add --no-cache bash apache2-utils" - "docker compose build dbrepo-ui" - "docker run --name dbrepo-ui -e NODE_OPTIONS='--max_old_space_size=256' -p 3000:3000 -d dbrepo-ui:latest" script: @@ -382,7 +400,7 @@ release-images: - "docker logout ${CI_REGISTRY2_URL}" - "echo ${CI_REGISTRY2_PASSWORD} | docker login --username ${CI_REGISTRY2_USER} --password-stdin ${CI_REGISTRY2_URL}" - "ifconfig eth0 mtu 1450 up" - - "apk add make bash" + - "apk add --no-cache make bash" script: - "make release-images" diff --git a/Makefile b/Makefile index d1152b6c47..91994bda3b 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ .PHONY: all -APP_VERSION ?= 1.5.1 -CHART_VERSION ?= 1.5.1 +APP_VERSION ?= 1.5.2 +CHART_VERSION ?= 1.5.2 REPOSITORY_URL ?= registry.datalab.tuwien.ac.at/dbrepo .PHONY: all diff --git a/dbrepo-analyse-service/Pipfile b/dbrepo-analyse-service/Pipfile index 92babfc950..150d5811a6 100644 --- a/dbrepo-analyse-service/Pipfile +++ b/dbrepo-analyse-service/Pipfile @@ -21,7 +21,7 @@ numpy = "*" pandas = "*" minio = "*" pydantic = "*" -dbrepo = {path = "./lib/dbrepo-1.5.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.5.2.tar.gz"} opensearch-py = "*" [dev-packages] diff --git a/dbrepo-analyse-service/Pipfile.lock b/dbrepo-analyse-service/Pipfile.lock index 2e085f73ec..5e40ca189e 100644 --- a/dbrepo-analyse-service/Pipfile.lock +++ b/dbrepo-analyse-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "709cb1821cee885939edb97b82142e417a8afc795f07ca9fdb569ce7ce82e565" + "sha256": "3df8e885e462132896bafc8d6c82c70226fc2352f2088eac67186d3e171b8308" }, "pipfile-spec": 6, "requires": { @@ -26,100 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138", - "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c", - "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24", - "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480", - "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2", - "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5", - "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", - "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8", - "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf", - "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871", - "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486", - "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9", - "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d", - "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb", - "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68", - "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1", - "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d", - "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd", - "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1", - "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8", - "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7", - "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959", - "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7", - "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42", - "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79", - "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38", - "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a", - "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8", - "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8", - "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151", - "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6", - "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e", - "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7", - "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce", - "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b", - "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8", - "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628", - "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f", - "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a", - "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7", - "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc", - "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab", - "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b", - "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911", - "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9", - "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572", - "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554", - "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d", - "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257", - "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c", - "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b", - "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742", - "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090", - "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6", - "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc", - "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142", - "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16", - "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a", - "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28", - "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e", - "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94", - "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026", - "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb", - "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28", - "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9", - "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3", - "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f", - "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983", - "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205", - "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f", - "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa", - "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c", - "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2", - "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb", - "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67", - "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762", - "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a", - "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8", - "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a", - "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a", - "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc", - "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91", - "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23", - "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527", - "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6", - "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c", - "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7", - "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f", - "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a", - "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092", - "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414" + "sha256:010bc9606f798eda8ef071759c7b163893071502bcaedc7d5dc49f9d8f12e553", + "sha256:03d53b0888f984f4f0c216a37577ee7e7b1ed1dac89cdd2fde61bf2ccb32009b", + "sha256:06defa9017ab50d215446ebbee294e07eb2fcee72d9a909a08192cfacbd43a08", + "sha256:0ccbe8ece8a7796ef41b86a3240034c5918d9b324c2ae48fa0be33565e297c64", + "sha256:0d2cea21ec05b832e9f6a2390b23d32ce5575f6cf4812bd171d4493f59c101fe", + "sha256:12bf9c139dfa004b65d2d71906abc593dcafe78a508f33d56c1ca9d87b18337f", + "sha256:1dd5b7947e23a08c70d4c1924809b91211f14136ffd13d303dc487913cfebfeb", + "sha256:1e32517c01905e0f4e665c3f3a495868ad996a32c243fcd917587d740253d589", + "sha256:1ff7afc3c461bd9217e2b8a90ddbe5edd94687d5a331c4ae6166dca5876d1a4b", + "sha256:262e45dbd7f1829bcb024259f65b2cf69d1ef5b37626af6955a1c487613aeb3a", + "sha256:2d978a95e4b58ef1fd937fbe347ab397c79ba24e17912595b54faafb88b9b937", + "sha256:365df6cf2ad144479ba0e0b58abdc5276923676d34da4c1c45613a80d2aac130", + "sha256:3e9fd9c11299d6d230eb2669fd1ed0238d33970e36b495b0432ace7f157fc931", + "sha256:4275160583df18158e0d6789797ad314a14ae611b98933fbe7d7a1c3dcc6bad4", + "sha256:474f7266a61d1c3218ef4ec0325747884b2d5a13fab5bff5dd3b55d9c849406a", + "sha256:49eb5a0338f141ef32299d48f1415486f47953d37b0c7fa6d778b73b66f3a7e2", + "sha256:4bc936d10b8fa3f2aa66e59e034085208b588442263400ddb042703d0db99421", + "sha256:4c0b3378dc294ad6ec6c038ed57164165e0b83ef5f61eee72f6eefccd7df34b8", + "sha256:4ef6eb1367046fb22085f10c5c84ea2efd0d836ad8088306d652ab1d743faf9e", + "sha256:4ff6105856ae688b29d5daaede1256f5e02e9d5cb3059f8f5ef55d975c2e6992", + "sha256:518578d6821c942362daa14a56f26b739abeede6e408b0b83e27dfcde17730f7", + "sha256:542a4610571b0affc6e13dda9357235f5f1f2ad9859acc69b188eb53901292d6", + "sha256:5cd60673be31449c63f59886f3581478bbdfaddd87e7394a4d73ad134d9be9b9", + "sha256:5ecdf43ddde709c336a655c8b3858c56af8f7402de2572001a5a99f7bebf2f78", + "sha256:635397b5b4de2397f8136f8fd15c8ebee560e36473195c7aa992ffb8e46acdd3", + "sha256:66e83a9a1131f0060aaedcc57f1a7e489898b6c3607eededccc7a9f80b95bdb4", + "sha256:696adff3594bd449e0fe287441062bdc6f5300928426275b39ed27884ba083a7", + "sha256:6dd1411ecfc070af4df129e81fe42c799d95d81c29c22d2c3e4341d974c38f1a", + "sha256:6ec84106c8b7ff347be06bf579c298a23b6d1d2225c57273a8cd502f257125d4", + "sha256:769457243dc4bc902d376cd14c5c7ec234a4faadb4f283dc2738f004cce9a9e1", + "sha256:7a360c18b2cb391fec9585ba1efc55150e2fbc6100308113117dfea521e810d8", + "sha256:7be4efe60e9bddf78ee165a296e80170147282081e1366f0580cf4cc0fb1182f", + "sha256:821c9c640d3dc456c6a7b005e38bc5af05326b6a08ce91a068719934d108a1bb", + "sha256:822dedad93947fcb1096cc41ee8fd32e9f652777561a37c740e5335699f01cea", + "sha256:83bd5aa621b732a0ca1aa3490abd2b010247c4677371a804431935aeedf26e74", + "sha256:88e681c0d17bb285d2ccbb73ae77ef86339b632ee7967044c2284411120b9730", + "sha256:89261fee04715083ef3b5a0d222b094021793c1728b8ff21da361c79f6384095", + "sha256:8ae8480148d696dae49126e97568333fc01493069ad46a94b82f69c7a33197ea", + "sha256:8feffa8396724116be5bc05bf4fcba0c738cbe908c82a95f71371e32b28cd2ca", + "sha256:94acecf2eee13a45f627ed25a28f5a7f2db66b90ff94cd7a1e9cc1ad32cddd43", + "sha256:9788781f57fb732426ae74b9955b899e677ce42b848e60a11be29358fb20c976", + "sha256:9a8b6b3c788a8a6f88f5ce23d729cfde7a2ccebbeb09db0822ef266de0445a27", + "sha256:9b41e0fb3b415beccd6d0c6e5f3ee34b7952cd76120a1db3e45507b83dc5ef81", + "sha256:9d95cce8bb010597b3f2217155befe4708e0538d3548aa08d640ebf54e3f57cb", + "sha256:a34c30e1461da3a69c5bdcfce44418b6f969e1e68ebf367edfa5eaab380abf7a", + "sha256:a468b1b9d5499cbfd0411f5d28adbe651c90508540fdaefb4b7a2171a837a88d", + "sha256:a51f983d91edae7777b5a2af8e5d83224ba01284502c6874a17647ad6cbf0211", + "sha256:a54424050d1eb36edfef913b1bc8552d52a37864c0ea7df3e1e764663e11053a", + "sha256:a550b4ff70d06c15057d75ddad89a3e7c496e0609d28c567c20b61cd1265c0a6", + "sha256:a60f8206818e3582c999c999c799ab068e14f1870ade47d1fe8536dbfd88010b", + "sha256:a7986fb988314fd2225c1ecab45fd457e1f2c097dcc3c0aacd2a7aec7486beb6", + "sha256:ab5c6a521b156edef13a57a6d524903c547573ff8101e3d1bbe9ee1b97267973", + "sha256:aef239c307f3a3f830933d612c0aef4ad4b3aa9ce5233a0954262a00f5c379f1", + "sha256:b10b316413c80a4dcc5228c092a8d019e4b75d4efbca8988cb5b67ae9fa56881", + "sha256:b169507c98b924fd68b82ae366c285daf6d22456835294c329c3226d61e1f69d", + "sha256:b71aab89800fa2eaeb28923ee05e7e56c28dab4ebdba524db06e963431bf6192", + "sha256:beaed1b2d03033dd301a7b67430f03c8255d6856a269c20995a0292de596519e", + "sha256:cb2d5a24586b508f658ddd710f7d4b7e4f5656cb5d569aeb1f432c1c3704347a", + "sha256:cb4c676ab99ca2dd231928d481e19cd540155dff36e70e613179c4927bd520b8", + "sha256:cbe3e356523d0b336543996f92a0e65f760be82447db21c95c60392c8075ff5c", + "sha256:cc2d64b1747efa183ced57b6bce53c9ea8e16e53419e389051b2a214ad0ed051", + "sha256:cfe8646a24856624c1eb7649da99333f0d7e75d9cf7c155ea870957d24b7c63c", + "sha256:d0fd6510c6d67d08ec80d9ba10cd340a8cfb0dd33436c858ed38d4564abb27c7", + "sha256:d40d9a740053cb7fef72442fa7bd699060ff4c710971ebdb8dd7c8b36417570f", + "sha256:d60255f3ed71aa14a2e75383543ca31bd362fdc7f0d2eafc060d85a9051598df", + "sha256:d68bb99bc6a4b0a3eceb95a246f5a0262e600e094b5178c2b1ab0f4bcbae6729", + "sha256:d97668595bf03299148ea968fed2195cc76ad063aeec8161731aa6a5dbc2f675", + "sha256:e0898a77298dc24eef368511d98e551e0b2db293fa9b40c982f4d5ab4d8d2a3a", + "sha256:e1e09bc44a1abbd96f55d15330d6cab80459cb8b06a0b656efd712ce47a3710d", + "sha256:e5786e5926f888ce3a996d38d9c9b8f9306f399edb1f1ca3ce7760dab9b1043c", + "sha256:e69d9869df50dd591228c62fbb3923d6124517d6bfc47a804492813888b497be", + "sha256:e7d182164aebad4e2faf2742ee7486d4af73d933461adbd8f183ac9b1837323c", + "sha256:eb4f1fe110332651c00d2df160978cf1be70896ed9e612ff7c7e67955091b2c4", + "sha256:ee081375d10fa2f3f7b0d050c8b9c1ae23190e1d9be256035bf8a41059c4df3a", + "sha256:f307632f3eaa676f8c2f5df11e4c00ad47dfa79b06cb2fa39156a4e9c6821bdb", + "sha256:f37ece590451ecffc815f2eb41f07191d1a31a0404361d1ae2ed532e05c86da4" ], - "markers": "python_version >= '3.8'", - "version": "==3.10.10" + "markers": "python_version >= '3.9'", + "version": "==3.11.4" }, "aiosignal": { "hashes": [ @@ -182,28 +167,28 @@ }, "blinker": { "hashes": [ - "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01", - "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83" + "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", + "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" + "markers": "python_version >= '3.9'", + "version": "==1.9.0" }, "boto3": { "hashes": [ - "sha256:82fa8cdb00731aeffe7a5829821ae78d75c7ae959b638c15ff3b4681192ace90", - "sha256:c7a0a0bc5ae3bed5d38e8bfe5a56b31621e79bdd7c1ea6e5ba4326d820cde3a5" + "sha256:bc3fc12b41fa2c91e51ab140f74fb1544408a2b1e00f88a4c2369a66d18ddf20", + "sha256:cdacf03fc750caa3aa0dbf6158166def9922c9d67b4160999ff8fc350662facc" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==1.35.55" + "version": "==1.35.64" }, "botocore": { "hashes": [ - "sha256:3d54739e498534c9d7a6e9732ae2d17ed29c7d5e29fe36c956d8488b859538b0", - "sha256:61ae18f688250372d7b6046e35c86f8fd09a7c0f0064b52688f3490b4d6c9d6b" + "sha256:2f95c83f31c9e38a66995c88810fc638c829790e125032ba00ab081a2cf48cb9", + "sha256:bbd96bf7f442b1d5e35b36f501076e4a588c83d8d84a1952e9ee1d767e5efb3e" ], "markers": "python_version >= '3.8'", - "version": "==1.35.55" + "version": "==1.35.64" }, "certifi": { "hashes": [ @@ -440,9 +425,9 @@ }, "dbrepo": { "hashes": [ - "sha256:d60be1e9261bde6b9d4ebe5db46896b1bfaed918eff7b98194e4224d94511497" + "sha256:77c1023a6508b68661c1c7ff286321bdc6e6d3bd4b3189b953b82567aab8e8fe" ], - "path": "./lib/dbrepo-1.5.1.tar.gz" + "path": "./lib/dbrepo-1.5.2.tar.gz" }, "events": { "hashes": [ @@ -468,12 +453,12 @@ }, "flask": { "hashes": [ - "sha256:34e815dfaa43340d1d15a5c3a02b8476004037eb4840b34910c6e21679d288f3", - "sha256:ceb27b0af3823ea2737928a4d99d125a06175b8512c445cbd9a9ce200ef76842" + "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac", + "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136" ], "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.0.3" + "markers": "python_version >= '3.9'", + "version": "==3.1.0" }, "flask-cors": { "hashes": [ @@ -493,12 +478,12 @@ }, "flask-jwt-extended": { "hashes": [ - "sha256:63a28fc9731bcc6c4b8815b6f954b5904caa534fc2ae9b93b1d3ef12930dca95", - "sha256:9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2" + "sha256:4d8939ca006c92209fad82e591471db897f33b6a85561f8e792c5aa6816ef39c", + "sha256:be5785e2e3ef4d8773ba6d10247e78827dcf0b111efbfcd7a0794b5f7c750d90" ], "index": "pypi", - "markers": "python_version >= '3.7' and python_version < '4'", - "version": "==4.6.0" + "markers": "python_version >= '3.9' and python_version < '4'", + "version": "==4.7.0" }, "frozenlist": { "hashes": [ @@ -600,48 +585,48 @@ }, "gevent": { "hashes": [ - "sha256:051b22e2758accfddb0457728bfc9abf8c3f2ce6bca43f1ff6e07b5ed9e49bf4", - "sha256:0de6eb3d55c03138fda567d9bfed28487ce5d0928c5107549767a93efdf2be26", - "sha256:18e6984ec96fc95fd67488555c38ece3015be1f38b1bcceb27b7d6c36b343008", - "sha256:1c3a828b033fb02b7c31da4d75014a1f82e6c072fc0523456569a57f8b025861", - "sha256:1ce6dab94c0b0d24425ba55712de2f8c9cb21267150ca63f5bb3a0e1f165da99", - "sha256:1e24ffea72e27987979c009536fd0868e52239b44afe6cf7135ce8aafd0f108e", - "sha256:26ca7a6b42d35129617025ac801135118333cad75856ffc3217b38e707383eba", - "sha256:34aea15f9c79f27a8faeaa361bc1e72c773a9b54a1996a2ec4eefc8bcd59a824", - "sha256:385710355eadecdb70428a5ae3e7e5a45dcf888baa1426884588be9d25ac4290", - "sha256:3ac83b74304487afa211a01909c7dd257e574db0cd429d866c298e21df7aeedf", - "sha256:3ad8fb70aa0ebc935729c9699ac31b210a49b689a7b27b7ac9f91676475f3f53", - "sha256:40ea3e40e8bb4fdb143c2a8edf2ccfdebd56016c7317c341ce8094c7bee08818", - "sha256:57a5c4e0bdac482c5f02f240d0354e61362df73501ef6ebafce8ef635cad7527", - "sha256:5d850a453d66336272be4f1d3a8126777f3efdaea62d053b4829857f91e09755", - "sha256:68c3a0d8402755eba7f69022e42e8021192a721ca8341908acc222ea597029b6", - "sha256:7021e26d70189b33c27173d4173f27bf4685d6b6f1c0ea50e5335f8491cb110c", - "sha256:70e9ed7ecb70e0df7dc97c3bc420de9a45a7c76bd5861c6cfec8c549700e681e", - "sha256:89c4115e3f5ada55f92b61701a46043fe42f702b5af863b029e4c1a76f6cc2d4", - "sha256:8af65a4d4feaec6042c666d22c322a310fba3b47e841ad52f724b9c3ce5da48e", - "sha256:8e58ee3723f1fbe07d66892f1caa7481c306f653a6829b6fd16cb23d618a5915", - "sha256:9ca2266e08f43c0e22c028801dff7d92a0b102ef20e4caeb6a46abfb95f6a328", - "sha256:9e1210334a9bc9f76c3d008e0785ca62214f8a54e1325f6c2ecab3b6a572a015", - "sha256:a9a89d6e396ef6f1e3968521bf56e8c4bee25b193bbf5d428b7782d582410822", - "sha256:aa7ee1bd5cabb2b7ef35105f863b386c8d5e332f754b60cfc354148bd70d35d1", - "sha256:b52382124eca13135a3abe4f65c6bd428656975980a48e51b17aeab68bdb14db", - "sha256:c1d80090485da1ea3d99205fe97908b31188c1f4857f08b333ffaf2de2e89d18", - "sha256:ce417bcaaab496bc9c77f75566531e9d93816262037b8b2dbb88b0fdcd66587c", - "sha256:d67daed8383326dc8b5e58d88e148d29b6b52274a489e383530b0969ae7b9cb9", - "sha256:d758f0d4dbf32502ec87bb9b536ca8055090a16f8305f0ada3ce6f34e70f2fd7", - "sha256:d7a1ad0f2da582f5bd238bca067e1c6c482c30c15a6e4d14aaa3215cbb2232f3", - "sha256:e534e6a968d74463b11de6c9c67f4b4bf61775fb00f2e6e0f7fcdd412ceade18", - "sha256:eb5edb6433764119a664bbb148d2aea9990950aa89cc3498f475c2408d523ea3", - "sha256:f0c129f81d60cda614acb4b0c5731997ca05b031fb406fcb58ad53a7ade53b13", - "sha256:f147e38423fbe96e8731f60a63475b3d2cab2f3d10578d8ee9d10c507c58a2ff", - "sha256:f18689f7a70d2ed0e75bad5036ec3c89690a493d4cfac8d7cdb258ac04b132bd", - "sha256:f2ae3efbbd120cdf4a68b7abc27a37e61e6f443c5a06ec2c6ad94c37cd8471ec", - "sha256:f4e526fdc279c655c1e809b0c34b45844182c2a6b219802da5e411bd2cf5a8ad", - "sha256:f7f4f171d4d2018170454d84c934842e1b5f6ce7468ba298f6e7f7cff15000a3" + "sha256:1c3443b0ed23dcb7c36a748d42587168672953d368f2956b17fad36d43b58836", + "sha256:1d4fadc319b13ef0a3c44d2792f7918cf1bca27cacd4d41431c22e6b46668026", + "sha256:1ea50009ecb7f1327347c37e9eb6561bdbc7de290769ee1404107b9a9cba7cf1", + "sha256:2142704c2adce9cd92f6600f371afb2860a446bfd0be5bd86cca5b3e12130766", + "sha256:351d1c0e4ef2b618ace74c91b9b28b3eaa0dd45141878a964e03c7873af09f62", + "sha256:356b73d52a227d3313f8f828025b665deada57a43d02b1cf54e5d39028dbcf8d", + "sha256:3d882faa24f347f761f934786dde6c73aa6c9187ee710189f12dcc3a63ed4a50", + "sha256:58851f23c4bdb70390f10fc020c973ffcf409eb1664086792c8b1e20f25eef43", + "sha256:68bee86b6e1c041a187347ef84cf03a792f0b6c7238378bf6ba4118af11feaae", + "sha256:7398c629d43b1b6fd785db8ebd46c0a353880a6fab03d1cf9b6788e7240ee32e", + "sha256:816b3883fa6842c1cf9d2786722014a0fd31b6312cca1f749890b9803000bad6", + "sha256:81d918e952954675f93fb39001da02113ec4d5f4921bf5a0cc29719af6824e5d", + "sha256:85329d556aaedced90a993226d7d1186a539c843100d393f2349b28c55131c85", + "sha256:8619d5c888cb7aebf9aec6703e410620ef5ad48cdc2d813dd606f8aa7ace675f", + "sha256:8bd1419114e9e4a3ed33a5bad766afff9a3cf765cb440a582a1b3a9bc80c1aca", + "sha256:92e0d7759de2450a501effd99374256b26359e801b2d8bf3eedd3751973e87f5", + "sha256:92fe5dfee4e671c74ffaa431fd7ffd0ebb4b339363d24d0d944de532409b935e", + "sha256:97e2f3999a5c0656f42065d02939d64fffaf55861f7d62b0107a08f52c984897", + "sha256:9d3b249e4e1f40c598ab8393fc01ae6a3b4d51fc1adae56d9ba5b315f6b2d758", + "sha256:a3d75fa387b69c751a3d7c5c3ce7092a171555126e136c1d21ecd8b50c7a6e46", + "sha256:a5f1701ce0f7832f333dd2faf624484cbac99e60656bfbb72504decd42970f0f", + "sha256:b24d800328c39456534e3bc3e1684a28747729082684634789c2f5a8febe7671", + "sha256:b5efe72e99b7243e222ba0c2c2ce9618d7d36644c166d63373af239da1036bab", + "sha256:b7bfcfe08d038e1fa6de458891bca65c1ada6d145474274285822896a858c870", + "sha256:beede1d1cff0c6fafae3ab58a0c470d7526196ef4cd6cc18e7769f207f2ea4eb", + "sha256:c6b775381f805ff5faf250e3a07c0819529571d19bb2a9d474bee8c3f90d66af", + "sha256:c9c935b83d40c748b6421625465b7308d87c7b3717275acd587eef2bd1c39546", + "sha256:ca845138965c8c56d1550499d6b923eb1a2331acfa9e13b817ad8305dde83d11", + "sha256:d618e118fdb7af1d6c1a96597a5cd6ac84a9f3732b5be8515c6a66e098d498b6", + "sha256:d6c0a065e31ef04658f799215dddae8752d636de2bed61365c358f9c91e7af61", + "sha256:d740206e69dfdfdcd34510c20adcb9777ce2cc18973b3441ab9767cd8948ca8a", + "sha256:d7886b63ebfb865178ab28784accd32f287d5349b3ed71094c86e4d3ca738af5", + "sha256:d9347690f4e53de2c4af74e62d6fabc940b6d4a6cad555b5a379f61e7d3f2a8e", + "sha256:d9ca80711e6553880974898d99357fb649e062f9058418a92120ca06c18c3c59", + "sha256:e24181d172f50097ac8fc272c8c5b030149b630df02d1c639ee9f878a470ba2b", + "sha256:ec68e270543ecd532c4c1d70fca020f90aa5486ad49c4f3b8b2e64a66f5c9274", + "sha256:f43f47e702d0c8e1b8b997c00f1601486f9f976f84ab704f8f11536e3fa144c9", + "sha256:ff96c5739834c9a594db0e12bf59cb3fa0e5102fc7b893972118a3166733d61c" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==24.10.3" + "version": "==24.11.1" }, "greenlet": { "hashes": [ @@ -1043,11 +1028,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pandas": { "hashes": [ @@ -1378,11 +1363,11 @@ }, "pyjwt": { "hashes": [ - "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850", - "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c" + "sha256:543b77207db656de204372350926bed5a86201c4cbff159f623f79c7bb487a15", + "sha256:7628a7eb7938959ac1b26e819a1df0fd3259505627b575e4bad6d08f76db695c" ], - "markers": "python_version >= '3.8'", - "version": "==2.9.0" + "markers": "python_version >= '3.9'", + "version": "==2.10.0" }, "python-dateutil": { "hashes": [ @@ -1581,11 +1566,11 @@ }, "setuptools": { "hashes": [ - "sha256:f2504966861356aa38616760c0f66568e535562374995367b4e69c7143cf6bcd", - "sha256:fba5dd4d766e97be1b1681d98712680ae8f2f26d7881245f2ce9e40714f1a686" + "sha256:5c4ccb41111392671f02bb5f8436dfc5a9a7185e80500531b133f5775c4163ef", + "sha256:87cb777c3b96d638ca02031192d40390e0ad97737e27b6b4fa831bea86f2f829" ], - "markers": "python_version >= '3.8'", - "version": "==75.3.0" + "markers": "python_version >= '3.9'", + "version": "==75.5.0" }, "six": { "hashes": [ @@ -1632,104 +1617,104 @@ "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '3.8'", "version": "==2.2.3" }, "werkzeug": { "hashes": [ - "sha256:4f7d1a5de312c810a8a2c6f0b47e9f6a7cffb7c8322def35e4d4d9841ff85597", - "sha256:f471a4cd167233077e9d2a8190c3471c5bc520c636a9e3c1e9300c33bced03bc" + "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", + "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746" ], "markers": "python_version >= '3.9'", - "version": "==3.1.2" + "version": "==3.1.3" }, "yarl": { "hashes": [ - "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac", - "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47", - "sha256:0b1794853124e2f663f0ea54efb0340b457f08d40a1cef78edfa086576179c91", - "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5", - "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df", - "sha256:14bc88baa44e1f84164a392827b5defb4fa8e56b93fecac3d15315e7c8e5d8b3", - "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463", - "sha256:16bca6678a83657dd48df84b51bd56a6c6bd401853aef6d09dc2506a78484c7b", - "sha256:1a3b91c44efa29e6c8ef8a9a2b583347998e2ba52c5d8280dbd5919c02dfc3b5", - "sha256:1a52a1ffdd824fb1835272e125385c32fd8b17fbdefeedcb4d543cc23b332d74", - "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3", - "sha256:299f11b44d8d3a588234adbe01112126010bd96d9139c3ba7b3badd9829261c3", - "sha256:2b24ec55fad43e476905eceaf14f41f6478780b870eda5d08b4d6de9a60b65b4", - "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0", - "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299", - "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2", - "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac", - "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61", - "sha256:380e6c38ef692b8fd5a0f6d1fa8774d81ebc08cfbd624b1bca62a4d4af2f9931", - "sha256:3b74ff4767d3ef47ffe0cd1d89379dc4d828d4873e5528976ced3b44fe5b0a21", - "sha256:3e844be8d536afa129366d9af76ed7cb8dfefec99f5f1c9e4f8ae542279a6dc3", - "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7", - "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96", - "sha256:482c122b72e3c5ec98f11457aeb436ae4aecca75de19b3d1de7cf88bc40db82f", - "sha256:561c87fea99545ef7d692403c110b2f99dced6dff93056d6e04384ad3bc46243", - "sha256:578d00c9b7fccfa1745a44f4eddfdc99d723d157dad26764538fbdda37209857", - "sha256:58c8e9620eb82a189c6c40cb6b59b4e35b2ee68b1f2afa6597732a2b467d7e8f", - "sha256:5b29beab10211a746f9846baa39275e80034e065460d99eb51e45c9a9495bcca", - "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488", - "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da", - "sha256:62a91aefff3d11bf60e5956d340eb507a983a7ec802b19072bb989ce120cd948", - "sha256:64cc6e97f14cf8a275d79c5002281f3040c12e2e4220623b5759ea7f9868d6a5", - "sha256:6f4c9156c4d1eb490fe374fb294deeb7bc7eaccda50e23775b2354b6a6739934", - "sha256:7294e38f9aa2e9f05f765b28ffdc5d81378508ce6dadbe93f6d464a8c9594473", - "sha256:7615058aabad54416ddac99ade09a5510cf77039a3b903e94e8922f25ed203d7", - "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685", - "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e", - "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147", - "sha256:7fac95714b09da9278a0b52e492466f773cfe37651cf467a83a1b659be24bf71", - "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67", - "sha256:846dd2e1243407133d3195d2d7e4ceefcaa5f5bf7278f0a9bda00967e6326b04", - "sha256:84c063af19ef5130084db70ada40ce63a84f6c1ef4d3dbc34e5e8c4febb20822", - "sha256:881764d610e3269964fc4bb3c19bb6fce55422828e152b885609ec176b41cf11", - "sha256:8994b29c462de9a8fce2d591028b986dbbe1b32f3ad600b2d3e1c482c93abad6", - "sha256:8c79e9d7e3d8a32d4824250a9c6401194fb4c2ad9a0cec8f6a96e09a582c2cc0", - "sha256:8ee427208c675f1b6e344a1f89376a9613fc30b52646a04ac0c1f6587c7e46ec", - "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda", - "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556", - "sha256:9fb815155aac6bfa8d86184079652c9715c812d506b22cfa369196ef4e99d1b4", - "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c", - "sha256:a7ac5b4984c468ce4f4a553df281450df0a34aefae02e58d77a0847be8d1e11f", - "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8", - "sha256:ae3476e934b9d714aa8000d2e4c01eb2590eee10b9d8cd03e7983ad65dfbfcba", - "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258", - "sha256:b40d1bf6e6f74f7c0a567a9e5e778bbd4699d1d3d2c0fe46f4b717eef9e96b95", - "sha256:b5c4804e4039f487e942c13381e6c27b4b4e66066d94ef1fae3f6ba8b953f383", - "sha256:b5d6a6c9602fd4598fa07e0389e19fe199ae96449008d8304bf5d47cb745462e", - "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938", - "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374", - "sha256:c180ac742a083e109c1a18151f4dd8675f32679985a1c750d2ff806796165b55", - "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139", - "sha256:c7e177c619342e407415d4f35dec63d2d134d951e24b5166afcdfd1362828e17", - "sha256:cbad927ea8ed814622305d842c93412cb47bd39a496ed0f96bfd42b922b4a217", - "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d", - "sha256:cc7c92c1baa629cb03ecb0c3d12564f172218fb1739f54bf5f3881844daadc6d", - "sha256:cc7d768260f4ba4ea01741c1b5fe3d3a6c70eb91c87f4c8761bbcce5181beafe", - "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199", - "sha256:d216e5d9b8749563c7f2c6f7a0831057ec844c68b4c11cb10fc62d4fd373c26d", - "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8", - "sha256:d6324274b4e0e2fa1b3eccb25997b1c9ed134ff61d296448ab8269f5ac068c4c", - "sha256:d8a8b74d843c2638f3864a17d97a4acda58e40d3e44b6303b8cc3d3c44ae2d29", - "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172", - "sha256:de599af166970d6a61accde358ec9ded821234cbbc8c6413acfec06056b8e860", - "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7", - "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170", - "sha256:eb6dce402734575e1a8cc0bb1509afca508a400a57ce13d306ea2c663bad1138", - "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06", - "sha256:f5efe0661b9fcd6246f27957f6ae1c0eb29bc60552820f01e970b4996e016004", - "sha256:f9cbfbc5faca235fbdf531b93aa0f9f005ec7d267d9d738761a4d42b744ea159", - "sha256:fbea1751729afe607d84acfd01efd95e3b31db148a181a441984ce9b3d3469da", - "sha256:fca4b4307ebe9c3ec77a084da3a9d1999d164693d16492ca2b64594340999988", - "sha256:ff5c6771c7e3511a06555afa317879b7db8d640137ba55d6ab0d0c50425cab75" + "sha256:0c8e589379ef0407b10bed16cc26e7392ef8f86961a706ade0a22309a45414d7", + "sha256:0d41c684f286ce41fa05ab6af70f32d6da1b6f0457459a56cf9e393c1c0b2217", + "sha256:1056cadd5e850a1c026f28e0704ab0a94daaa8f887ece8dfed30f88befb87bb0", + "sha256:11d86c6145ac5c706c53d484784cf504d7d10fa407cb73b9d20f09ff986059ef", + "sha256:170ed4971bf9058582b01a8338605f4d8c849bd88834061e60e83b52d0c76870", + "sha256:17791acaa0c0f89323c57da7b9a79f2174e26d5debbc8c02d84ebd80c2b7bff8", + "sha256:17931dfbb84ae18b287279c1f92b76a3abcd9a49cd69b92e946035cff06bcd20", + "sha256:18662443c6c3707e2fc7fad184b4dc32dd428710bbe72e1bce7fe1988d4aa654", + "sha256:187df91395c11e9f9dc69b38d12406df85aa5865f1766a47907b1cc9855b6303", + "sha256:1fee66b32e79264f428dc8da18396ad59cc48eef3c9c13844adec890cd339db5", + "sha256:2270d590997445a0dc29afa92e5534bfea76ba3aea026289e811bf9ed4b65a7f", + "sha256:2654caaf5584449d49c94a6b382b3cb4a246c090e72453493ea168b931206a4d", + "sha256:26bfb6226e0c157af5da16d2d62258f1ac578d2899130a50433ffee4a5dfa673", + "sha256:2941756754a10e799e5b87e2319bbec481ed0957421fba0e7b9fb1c11e40509f", + "sha256:3294f787a437cb5d81846de3a6697f0c35ecff37a932d73b1fe62490bef69211", + "sha256:358dc7ddf25e79e1cc8ee16d970c23faee84d532b873519c5036dbb858965795", + "sha256:38bc4ed5cae853409cb193c87c86cd0bc8d3a70fd2268a9807217b9176093ac6", + "sha256:3a0baff7827a632204060f48dca9e63fbd6a5a0b8790c1a2adfb25dc2c9c0d50", + "sha256:3a3ede8c248f36b60227eb777eac1dbc2f1022dc4d741b177c4379ca8e75571a", + "sha256:3a58a2f2ca7aaf22b265388d40232f453f67a6def7355a840b98c2d547bd037f", + "sha256:4434b739a8a101a837caeaa0137e0e38cb4ea561f39cb8960f3b1e7f4967a3fc", + "sha256:460024cacfc3246cc4d9f47a7fc860e4fcea7d1dc651e1256510d8c3c9c7cde0", + "sha256:46c465ad06971abcf46dd532f77560181387b4eea59084434bdff97524444032", + "sha256:48e424347a45568413deec6f6ee2d720de2cc0385019bedf44cd93e8638aa0ed", + "sha256:4a8c83f6fcdc327783bdc737e8e45b2e909b7bd108c4da1892d3bc59c04a6d84", + "sha256:4c840cc11163d3c01a9d8aad227683c48cd3e5be5a785921bcc2a8b4b758c4f3", + "sha256:4d486ddcaca8c68455aa01cf53d28d413fb41a35afc9f6594a730c9779545876", + "sha256:4e76381be3d8ff96a4e6c77815653063e87555981329cf8f85e5be5abf449021", + "sha256:50d866f7b1a3f16f98603e095f24c0eeba25eb508c85a2c5939c8b3870ba2df8", + "sha256:52492b87d5877ec405542f43cd3da80bdcb2d0c2fbc73236526e5f2c28e6db28", + "sha256:56afb44a12b0864d17b597210d63a5b88915d680f6484d8d202ed68ade38673d", + "sha256:585ce7cd97be8f538345de47b279b879e091c8b86d9dbc6d98a96a7ad78876a3", + "sha256:5870d620b23b956f72bafed6a0ba9a62edb5f2ef78a8849b7615bd9433384171", + "sha256:5c6ea72fe619fee5e6b5d4040a451d45d8175f560b11b3d3e044cd24b2720526", + "sha256:688058e89f512fb7541cb85c2f149c292d3fa22f981d5a5453b40c5da49eb9e8", + "sha256:6a3f47930fbbed0f6377639503848134c4aa25426b08778d641491131351c2c8", + "sha256:6b981316fcd940f085f646b822c2ff2b8b813cbd61281acad229ea3cbaabeb6b", + "sha256:734144cd2bd633a1516948e477ff6c835041c0536cef1d5b9a823ae29899665b", + "sha256:736bb076f7299c5c55dfef3eb9e96071a795cb08052822c2bb349b06f4cb2e0a", + "sha256:752485cbbb50c1e20908450ff4f94217acba9358ebdce0d8106510859d6eb19a", + "sha256:753eaaa0c7195244c84b5cc159dc8204b7fd99f716f11198f999f2332a86b178", + "sha256:75ac158560dec3ed72f6d604c81090ec44529cfb8169b05ae6fcb3e986b325d9", + "sha256:76499469dcc24759399accd85ec27f237d52dec300daaca46a5352fcbebb1071", + "sha256:782ca9c58f5c491c7afa55518542b2b005caedaf4685ec814fadfcee51f02493", + "sha256:792155279dc093839e43f85ff7b9b6493a8eaa0af1f94f1f9c6e8f4de8c63500", + "sha256:7a1606ba68e311576bcb1672b2a1543417e7e0aa4c85e9e718ba6466952476c0", + "sha256:8281db240a1616af2f9c5f71d355057e73a1409c4648c8949901396dc0a3c151", + "sha256:871e1b47eec7b6df76b23c642a81db5dd6536cbef26b7e80e7c56c2fd371382e", + "sha256:8b9c4643e7d843a0dca9cd9d610a0876e90a1b2cbc4c5ba7930a0d90baf6903f", + "sha256:8c6d5fed96f0646bfdf698b0a1cebf32b8aae6892d1bec0c5d2d6e2df44e1e2d", + "sha256:8e1bf59e035534ba4077f5361d8d5d9194149f9ed4f823d1ee29ef3e8964ace3", + "sha256:8fd51299e21da709eabcd5b2dd60e39090804431292daacbee8d3dabe39a6bc0", + "sha256:91c012dceadc695ccf69301bfdccd1fc4472ad714fe2dd3c5ab4d2046afddf29", + "sha256:93771146ef048b34201bfa382c2bf74c524980870bb278e6df515efaf93699ff", + "sha256:93d1c8cc5bf5df401015c5e2a3ce75a5254a9839e5039c881365d2a9dcfc6dc2", + "sha256:9611b83810a74a46be88847e0ea616794c406dbcb4e25405e52bff8f4bee2d0a", + "sha256:9bc27dd5cfdbe3dc7f381b05e6260ca6da41931a6e582267d5ca540270afeeb2", + "sha256:ac8eda86cc75859093e9ce390d423aba968f50cf0e481e6c7d7d63f90bae5c9c", + "sha256:bc3003710e335e3f842ae3fd78efa55f11a863a89a72e9a07da214db3bf7e1f8", + "sha256:bc61b005f6521fcc00ca0d1243559a5850b9dd1e1fe07b891410ee8fe192d0c0", + "sha256:be4c7b1c49d9917c6e95258d3d07f43cfba2c69a6929816e77daf322aaba6628", + "sha256:c019abc2eca67dfa4d8fb72ba924871d764ec3c92b86d5b53b405ad3d6aa56b0", + "sha256:c42774d1d1508ec48c3ed29e7b110e33f5e74a20957ea16197dbcce8be6b52ba", + "sha256:c556fbc6820b6e2cda1ca675c5fa5589cf188f8da6b33e9fc05b002e603e44fa", + "sha256:c6e659b9a24d145e271c2faf3fa6dd1fcb3e5d3f4e17273d9e0350b6ab0fe6e2", + "sha256:c74f0b0472ac40b04e6d28532f55cac8090e34c3e81f118d12843e6df14d0909", + "sha256:cd7e35818d2328b679a13268d9ea505c85cd773572ebb7a0da7ccbca77b6a52e", + "sha256:d17832ba39374134c10e82d137e372b5f7478c4cceeb19d02ae3e3d1daed8721", + "sha256:d1fa68a3c921365c5745b4bd3af6221ae1f0ea1bf04b69e94eda60e57958907f", + "sha256:d63123bfd0dce5f91101e77c8a5427c3872501acece8c90df457b486bc1acd47", + "sha256:da9d3061e61e5ae3f753654813bc1cd1c70e02fb72cf871bd6daf78443e9e2b1", + "sha256:db5ac3871ed76340210fe028f535392f097fb31b875354bcb69162bba2632ef4", + "sha256:dd7abf4f717e33b7487121faf23560b3a50924f80e4bef62b22dab441ded8f3b", + "sha256:dd90238d3a77a0e07d4d6ffdebc0c21a9787c5953a508a2231b5f191455f31e9", + "sha256:ef6eee1a61638d29cd7c85f7fd3ac7b22b4c0fabc8fd00a712b727a3e73b0685", + "sha256:f11fd61d72d93ac23718d393d2a64469af40be2116b24da0a4ca6922df26807e", + "sha256:f1e7fedb09c059efee2533119666ca7e1a2610072076926fa028c2ba5dfeb78c", + "sha256:f25b7e93f5414b9a983e1a6c1820142c13e1782cc9ed354c25e933aebe97fcf2", + "sha256:f2f44a4247461965fed18b2573f3a9eb5e2c3cad225201ee858726cde610daca", + "sha256:f5ffc6b7ace5b22d9e73b2a4c7305740a339fbd55301d52735f73e21d9eb3130", + "sha256:ff6af03cac0d1a4c3c19e5dcc4c05252411bf44ccaa2485e20d0a7c77892ab6e", + "sha256:ff8d95e06546c3a8c188f68040e9d0360feb67ba8498baf018918f669f7bc39b" ], "markers": "python_version >= '3.9'", - "version": "==1.17.1" + "version": "==1.17.2" }, "zope.event": { "hashes": [ @@ -2013,72 +1998,72 @@ }, "coverage": { "hashes": [ - "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376", - "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", - "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111", - "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", - "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", - "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", - "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", - "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", - "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", - "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c", - "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", - "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", - "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", - "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0", - "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", - "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", - "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", - "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", - "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", - "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", - "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", - "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", - "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", - "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", - "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", - "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", - "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", - "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", - "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", - "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901", - "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", - "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", - "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", - "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", - "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", - "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", - "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", - "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", - "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3", - "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", - "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076", - "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", - "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", - "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", - "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", - "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", - "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", - "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09", - "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", - "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", - "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f", - "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", - "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", - "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", - "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", - "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", - "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", - "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", - "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", - "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", - "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", - "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858" + "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433", + "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529", + "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671", + "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e", + "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42", + "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99", + "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327", + "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8", + "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06", + "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874", + "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4", + "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354", + "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1", + "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab", + "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3", + "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b", + "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37", + "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd", + "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f", + "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b", + "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c", + "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b", + "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7", + "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3", + "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808", + "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a", + "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76", + "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469", + "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55", + "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289", + "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc", + "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13", + "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2", + "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30", + "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163", + "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d", + "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c", + "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1", + "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c", + "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2", + "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3", + "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314", + "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0", + "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384", + "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb", + "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c", + "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45", + "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a", + "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24", + "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8", + "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec", + "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56", + "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777", + "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b", + "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f", + "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a", + "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d", + "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9", + "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413", + "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c", + "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b", + "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.4" + "version": "==7.6.7" }, "docker": { "hashes": [ @@ -2130,11 +2115,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pluggy": { "hashes": [ @@ -2269,7 +2254,7 @@ "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9" ], - "markers": "python_version >= '3.10'", + "markers": "python_version >= '3.8'", "version": "==2.2.3" }, "wrapt": { diff --git a/dbrepo-analyse-service/lib/dbrepo-1.5.2.tar.gz b/dbrepo-analyse-service/lib/dbrepo-1.5.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b3bf6edf397fecc982380b4d0fef711462110b56 GIT binary patch literal 39300 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ℜ`aeH}P?J0jVE)RL(c9}1;jvxB_W{2&J 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 Y9slQ%`2M&TU;i^YC2UV(s9<FP0PG-i1poj5 literal 0 HcmV?d00001 diff --git a/dbrepo-data-service/pom.xml b/dbrepo-data-service/pom.xml index c017193c5f..5f813b94c7 100644 --- a/dbrepo-data-service/pom.xml +++ b/dbrepo-data-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> <name>dbrepo-data-service</name> - <version>1.5.1</version> + <version>1.5.2</version> <description>Service that manages the data</description> diff --git a/dbrepo-data-service/querystore/pom.xml b/dbrepo-data-service/querystore/pom.xml index 3abf3e22b7..a508c88343 100644 --- a/dbrepo-data-service/querystore/pom.xml +++ b/dbrepo-data-service/querystore/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>dbrepo-data-service-querystore</artifactId> <name>dbrepo-data-service-querystore</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies/> diff --git a/dbrepo-data-service/report/pom.xml b/dbrepo-data-service/report/pom.xml index 11338807b8..da3d605405 100644 --- a/dbrepo-data-service/report/pom.xml +++ b/dbrepo-data-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>report</artifactId> <name>dbrepo-data-service-report</name> - <version>1.5.1</version> + <version>1.5.2</version> <description> This module is only intended for the pipeline coverage report. See the detailed report in the respective modules diff --git a/dbrepo-data-service/rest-service/pom.xml b/dbrepo-data-service/rest-service/pom.xml index 143c920e5c..0859d43724 100644 --- a/dbrepo-data-service/rest-service/pom.xml +++ b/dbrepo-data-service/rest-service/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>rest-service</artifactId> <name>dbrepo-data-service-rest-service</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>services</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java index 29b7dfa67c..f13b02caa2 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/TableEndpointUnitTest.java @@ -2,7 +2,6 @@ package at.tuwien.endpoint; import at.tuwien.ExportResourceDto; import at.tuwien.api.database.DatabaseAccessDto; -import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.query.ImportDto; import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.*; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java index 1f4beb8afa..2e856b2d2f 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/endpoint/ViewEndpointUnitTest.java @@ -17,7 +17,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.access.AccessDeniedException; import org.springframework.security.test.context.support.WithAnonymousUser; import org.springframework.security.test.context.support.WithMockUser; import org.springframework.test.context.junit.jupiter.SpringExtension; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java index c89d53282c..f1dc40b5af 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/DatabaseServiceIntegrationTest.java @@ -4,9 +4,8 @@ import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; -import at.tuwien.exception.*; +import at.tuwien.exception.DatabaseMalformedException; import at.tuwien.mapper.MariaDbMapper; -import at.tuwien.mapper.MariaDbMapperImpl; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeAll; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java index 63f69734f3..0f0820926f 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/SubsetServiceIntegrationTest.java @@ -14,7 +14,6 @@ import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang3.RandomStringUtils; import org.apache.spark.sql.Dataset; -import org.apache.spark.sql.Row; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java index e24af574cb..3b59dac2c1 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/TableServiceIntegrationTest.java @@ -42,7 +42,7 @@ import java.util.*; import static at.tuwien.service.SchemaServiceIntegrationTest.assertColumn; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; diff --git a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java index 670c9c66a5..4018c95334 100644 --- a/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java +++ b/dbrepo-data-service/rest-service/src/test/java/at/tuwien/service/ViewServiceIntegrationTest.java @@ -5,7 +5,9 @@ import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.config.MariaDbConfig; import at.tuwien.config.MariaDbContainerConfig; -import at.tuwien.exception.*; +import at.tuwien.exception.DatabaseMalformedException; +import at.tuwien.exception.ViewMalformedException; +import at.tuwien.exception.ViewNotFoundException; import at.tuwien.test.AbstractUnitTest; import lombok.extern.log4j.Log4j2; import org.junit.jupiter.api.BeforeEach; @@ -24,7 +26,6 @@ import java.util.List; import java.util.Map; import static org.junit.jupiter.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.assertTrue; @Log4j2 @SpringBootTest diff --git a/dbrepo-data-service/services/pom.xml b/dbrepo-data-service/services/pom.xml index a50d327e18..ee3c9b2b6c 100644 --- a/dbrepo-data-service/services/pom.xml +++ b/dbrepo-data-service/services/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>services</artifactId> <name>dbrepo-data-service-services</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>dbrepo-data-service-querystore</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> </dependency> </dependencies> diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java index ff3ab95a44..7a268f5248 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/DataMapper.java @@ -1,6 +1,5 @@ package at.tuwien.mapper; -import at.tuwien.ExportResourceDto; import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.ViewDto; @@ -33,18 +32,15 @@ import net.sf.jsqlparser.statement.select.*; import org.apache.hadoop.shaded.com.google.common.hash.Hashing; import org.apache.hadoop.shaded.org.apache.commons.codec.binary.Hex; import org.apache.hadoop.shaded.org.apache.commons.io.FileUtils; -import org.apache.spark.Partition; -import org.apache.spark.api.java.JavaRDD; -import org.apache.spark.sql.Dataset; -import org.apache.spark.sql.Row; -import org.apache.spark.sql.SaveMode; import org.jetbrains.annotations.NotNull; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.Mappings; -import org.springframework.core.io.InputStreamResource; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.io.StringReader; import java.math.BigInteger; import java.nio.charset.StandardCharsets; import java.sql.*; @@ -217,20 +213,20 @@ public interface DataMapper { /** * Parse columns from a SQL statement of a known database. * - * @param database The database. - * @param query The SQL statement. + * @param databaseId The database id. + * @param tables The list of tables. + * @param query The SQL statement. * @return The list of columns. * @throws JSQLParserException The table/view or column was not found in the database. */ - default List<ColumnDto> parseColumns(DatabaseDto database, String query) throws JSQLParserException { + default List<ColumnDto> parseColumns(Long databaseId, List<TableDto> tables, String query) throws JSQLParserException { final List<ColumnDto> columns = new ArrayList<>(); final CCJSqlParserManager parserRealSql = new CCJSqlParserManager(); final net.sf.jsqlparser.statement.Statement statement = parserRealSql.parse(new StringReader(query)); log.trace("parse columns from query: {}", query); /* bi-directional mapping */ - database.getTables() - .forEach(table -> table.getColumns() - .forEach(column -> column.setTable(table))); + tables.forEach(table -> table.getColumns() + .forEach(column -> column.setTable(table))); /* check */ if (!(statement instanceof Select selectStatement)) { log.error("Query attempts to update the dataset, not a SELECT statement"); @@ -250,8 +246,7 @@ public interface DataMapper { } } } - final List<ColumnDto> allColumns = database.getTables() - .stream() + final List<ColumnDto> allColumns = tables.stream() .map(TableDto::getColumns) .flatMap(List::stream) .toList(); @@ -310,7 +305,7 @@ public interface DataMapper { if (item.getAlias() != null) { resultColumn.setAlias(item.getAlias().getName().replace("`", "")); } - resultColumn.setDatabaseId(database.getId()); + resultColumn.setDatabaseId(databaseId); resultColumn.setTable(resultColumn.getTable()); resultColumn.setTableId(resultColumn.getTable().getId()); log.trace("found column with internal name {} and alias {}", resultColumn.getInternalName(), resultColumn.getAlias()); @@ -509,7 +504,6 @@ public interface DataMapper { .columns(new LinkedList<>()) .identifiers(new LinkedList<>()) .creator(database.getOwner()) - .createdBy(database.getOwner().getId()) .owner(database.getOwner()) .constraints(ConstraintsDto.builder() .foreignKeys(new LinkedList<>()) diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java index fca56314af..a585f2e98a 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/mapper/MetadataMapper.java @@ -3,6 +3,7 @@ package at.tuwien.mapper; import at.tuwien.api.container.ContainerDto; import at.tuwien.api.container.image.ImageDto; import at.tuwien.api.container.internal.PrivilegedContainerDto; +import at.tuwien.api.database.DatabaseBriefDto; import at.tuwien.api.database.DatabaseDto; import at.tuwien.api.database.ViewColumnDto; import at.tuwien.api.database.ViewDto; @@ -10,10 +11,10 @@ import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; import at.tuwien.api.database.table.TableBriefDto; import at.tuwien.api.database.table.TableDto; -import at.tuwien.api.database.table.columns.ColumnBriefDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.user.PrivilegedUserDto; +import at.tuwien.api.user.UserBriefDto; import at.tuwien.api.user.UserDto; import org.mapstruct.Mapper; import org.mapstruct.Mapping; @@ -28,6 +29,8 @@ public interface MetadataMapper { DatabaseDto privilegedDatabaseDtoToDatabaseDto(PrivilegedDatabaseDto data); + DatabaseBriefDto privilegedDatabaseDtoToDatabaseBriefDto(PrivilegedDatabaseDto data); + TableDto privilegedTableDtoToTableDto(PrivilegedTableDto data); ColumnDto viewColumnDtoToColumnDto(ViewColumnDto data); @@ -45,6 +48,8 @@ public interface MetadataMapper { PrivilegedUserDto userDtoToPrivilegedUserDto(UserDto data); + UserBriefDto userDtoToUserBriefDto(UserDto data); + @Mappings({ @Mapping(target = "databaseId", source = "tdbid") }) diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java index 4fdb8c32a6..7ed5150095 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/AccessServiceMariaDbImpl.java @@ -4,7 +4,7 @@ import at.tuwien.api.database.AccessTypeDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.user.PrivilegedUserDto; import at.tuwien.api.user.UserDto; -import at.tuwien.exception.*; +import at.tuwien.exception.DatabaseMalformedException; import at.tuwien.mapper.MariaDbMapper; import at.tuwien.service.AccessService; import com.mchange.v2.c3p0.ComboPooledDataSource; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java index 2d58744a21..b2a9b0c840 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/DatabaseServiceMariaDbImpl.java @@ -1,26 +1,20 @@ package at.tuwien.service.impl; import at.tuwien.api.container.internal.PrivilegedContainerDto; -import at.tuwien.api.database.DatabaseDto; -import at.tuwien.api.database.ViewDto; import at.tuwien.api.database.internal.CreateDatabaseDto; import at.tuwien.api.database.internal.PrivilegedDatabaseDto; -import at.tuwien.api.database.table.TableDto; import at.tuwien.api.user.UserDto; import at.tuwien.api.user.internal.UpdateUserPasswordDto; import at.tuwien.config.RabbitConfig; -import at.tuwien.exception.*; +import at.tuwien.exception.DatabaseMalformedException; import at.tuwien.mapper.MariaDbMapper; import at.tuwien.service.DatabaseService; -import at.tuwien.service.SchemaService; import com.mchange.v2.c3p0.ComboPooledDataSource; import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.sql.SQLException; @Log4j2 diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java index a0fbd1434c..1aba3c6b99 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SchemaServiceMariaDbImpl.java @@ -140,11 +140,11 @@ public class SchemaServiceMariaDbImpl extends HibernateConnector implements Sche if (!resultSet1.next()) { throw new ViewNotFoundException("Failed to find view in the information schema"); } - ViewDto view = dataMapper.schemaResultSetToView(metadataMapper.privilegedDatabaseDtoToDatabaseDto(privilegedDatabase), resultSet1); + ViewDto view = dataMapper.schemaResultSetToView(database, resultSet1); view.setDatabase(database); view.setVdbid(database.getId()); - view.setCreator(database.getCreator()); - view.setCreatedBy(database.getCreator().getId()); + view.setCreator(database.getOwner()); + view.setCreatedBy(privilegedDatabase.getOwner().getId()); /* obtain view columns */ start = System.currentTimeMillis(); final PreparedStatement statement2 = connection.prepareStatement(mariaDbMapper.databaseTableColumnsSelectRawQuery()); diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java index 55f513f339..8c5cc6d601 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/SubsetServiceMariaDbImpl.java @@ -10,8 +10,6 @@ import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.columns.ColumnDto; import at.tuwien.api.identifier.IdentifierDto; import at.tuwien.api.identifier.IdentifierTypeDto; -import at.tuwien.api.user.UserDto; -import at.tuwien.config.SparkConfig; import at.tuwien.exception.*; import at.tuwien.gateway.MetadataServiceGateway; import at.tuwien.mapper.DataMapper; @@ -126,7 +124,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs SQLException { final List<ColumnDto> columns; try { - columns = dataMapper.parseColumns(metadataMapper.privilegedDatabaseDtoToDatabaseDto(database), query.getQuery()); + columns = dataMapper.parseColumns(database.getId(), database.getTables(), query.getQuery()); } catch (JSQLParserException e) { log.error("Failed to map/parse columns: {}", e.getMessage()); throw new TableMalformedException("Failed to map/parse columns: " + e.getMessage(), e); @@ -277,9 +275,7 @@ public class SubsetServiceMariaDbImpl extends HibernateConnector implements Subs } final QueryDto query = dataMapper.resultSetToQueryDto(resultSet); query.setIdentifiers(metadataServiceGateway.getIdentifiers(database.getId(), queryId)); - final UserDto creator = metadataServiceGateway.getUserById(query.getCreatedBy()); - log.debug("retrieved creator from metadata service: creator.id={}, creator.username={}", creator.getId(), creator.getUsername()); - query.setCreator(creator); + query.setCreator(database.getOwner()); query.setDatabaseId(database.getId()); return query; } catch (SQLException e) { diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java index 531897706b..0eea223f7e 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/TableServiceMariaDbImpl.java @@ -10,8 +10,6 @@ import at.tuwien.api.database.table.columns.ColumnStatisticDto; import at.tuwien.api.database.table.columns.ColumnTypeDto; import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.api.database.table.internal.TableCreateDto; -import at.tuwien.config.S3Config; -import at.tuwien.config.SparkConfig; import at.tuwien.exception.*; import at.tuwien.mapper.DataMapper; import at.tuwien.mapper.MariaDbMapper; @@ -23,15 +21,15 @@ import com.mchange.v2.c3p0.ComboPooledDataSource; import io.micrometer.core.instrument.Counter; import jakarta.validation.constraints.NotNull; import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.RandomStringUtils; import org.apache.spark.sql.*; import org.apache.spark.sql.catalyst.ExtendedAnalysisException; -import org.apache.spark.sql.types.StructField; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.io.ByteArrayInputStream; -import java.sql.*; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.time.Instant; import java.util.*; diff --git a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java index 77e065bc93..7ca776ff8a 100644 --- a/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java +++ b/dbrepo-data-service/services/src/main/java/at/tuwien/service/impl/ViewServiceMariaDbImpl.java @@ -8,10 +8,7 @@ import at.tuwien.api.database.internal.PrivilegedDatabaseDto; import at.tuwien.api.database.internal.PrivilegedViewDto; import at.tuwien.api.database.query.QueryResultDto; import at.tuwien.api.database.table.columns.ColumnDto; -import at.tuwien.api.database.table.internal.PrivilegedTableDto; import at.tuwien.config.QueryConfig; -import at.tuwien.config.S3Config; -import at.tuwien.config.SparkConfig; import at.tuwien.exception.*; import at.tuwien.mapper.DataMapper; import at.tuwien.mapper.MariaDbMapper; @@ -24,7 +21,6 @@ import com.mchange.v2.c3p0.ComboPooledDataSource; import io.micrometer.core.instrument.Counter; import jakarta.validation.constraints.NotNull; import lombok.extern.log4j.Log4j2; -import org.apache.commons.lang3.RandomStringUtils; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; @@ -32,7 +28,6 @@ import org.apache.spark.sql.catalyst.ExtendedAnalysisException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.io.File; import java.nio.charset.StandardCharsets; import java.sql.Connection; import java.sql.PreparedStatement; diff --git a/dbrepo-metadata-service/api/pom.xml b/dbrepo-metadata-service/api/pom.xml index 38ec447978..9196e2d228 100644 --- a/dbrepo-metadata-service/api/pom.xml +++ b/dbrepo-metadata-service/api/pom.xml @@ -6,18 +6,18 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>dbrepo-metadata-service-api</artifactId> <name>dbrepo-metadata-service-api</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies> <dependency> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service-entities</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> <scope>compile</scope> </dependency> </dependencies> diff --git a/dbrepo-metadata-service/entities/pom.xml b/dbrepo-metadata-service/entities/pom.xml index 05308a9ac3..c308f0163b 100644 --- a/dbrepo-metadata-service/entities/pom.xml +++ b/dbrepo-metadata-service/entities/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>dbrepo-metadata-service-entities</artifactId> <name>dbrepo-metadata-service-entity</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies/> diff --git a/dbrepo-metadata-service/oai/pom.xml b/dbrepo-metadata-service/oai/pom.xml index cf4763dc9e..fddf87ecb4 100644 --- a/dbrepo-metadata-service/oai/pom.xml +++ b/dbrepo-metadata-service/oai/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>dbrepo-metadata-service-oai</artifactId> <name>dbrepo-metadata-service-oai</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies/> diff --git a/dbrepo-metadata-service/pom.xml b/dbrepo-metadata-service/pom.xml index b29d6ff38f..56ab43349a 100644 --- a/dbrepo-metadata-service/pom.xml +++ b/dbrepo-metadata-service/pom.xml @@ -11,7 +11,7 @@ <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> <name>dbrepo-metadata-service</name> - <version>1.5.1</version> + <version>1.5.2</version> <description>Service that manages the metadata</description> diff --git a/dbrepo-metadata-service/report/pom.xml b/dbrepo-metadata-service/report/pom.xml index 2c6a39e535..95ea8b8b97 100644 --- a/dbrepo-metadata-service/report/pom.xml +++ b/dbrepo-metadata-service/report/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>dbrepo-metadata-service-report</artifactId> <name>dbrepo-metadata-service-report</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/repositories/pom.xml b/dbrepo-metadata-service/repositories/pom.xml index 8c1456e7f8..816f71a1cb 100644 --- a/dbrepo-metadata-service/repositories/pom.xml +++ b/dbrepo-metadata-service/repositories/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>dbrepo-metadata-service-repositories</artifactId> <name>dbrepo-metadata-service-repositories</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/rest-service/pom.xml b/dbrepo-metadata-service/rest-service/pom.xml index aaff5b79ef..613d4c4d4a 100644 --- a/dbrepo-metadata-service/rest-service/pom.xml +++ b/dbrepo-metadata-service/rest-service/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>dbrepo-metadata-service-rest-service</artifactId> <name>dbrepo-metadata-service-rest</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/services/pom.xml b/dbrepo-metadata-service/services/pom.xml index eb7370452c..d98e575eb9 100644 --- a/dbrepo-metadata-service/services/pom.xml +++ b/dbrepo-metadata-service/services/pom.xml @@ -6,12 +6,12 @@ <parent> <artifactId>dbrepo-metadata-service</artifactId> <groupId>at.tuwien</groupId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>dbrepo-metadata-service-services</artifactId> <name>dbrepo-metadata-service-services</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies> <dependency> diff --git a/dbrepo-metadata-service/test/pom.xml b/dbrepo-metadata-service/test/pom.xml index 566a06af48..dcccbef8f8 100644 --- a/dbrepo-metadata-service/test/pom.xml +++ b/dbrepo-metadata-service/test/pom.xml @@ -6,12 +6,12 @@ <parent> <groupId>at.tuwien</groupId> <artifactId>dbrepo-metadata-service</artifactId> - <version>1.5.1</version> + <version>1.5.2</version> </parent> <artifactId>dbrepo-metadata-service-test</artifactId> <name>dbrepo-metadata-service-test</name> - <version>1.5.1</version> + <version>1.5.2</version> <dependencies> <dependency> diff --git a/dbrepo-search-service/Pipfile b/dbrepo-search-service/Pipfile index f5d92986eb..e081ac7bb3 100644 --- a/dbrepo-search-service/Pipfile +++ b/dbrepo-search-service/Pipfile @@ -18,7 +18,7 @@ jwt = "~=1.3" testcontainers-opensearch = "*" pytest = "*" rdflib = "*" -dbrepo = {path = "./lib/dbrepo-1.5.1.tar.gz"} +dbrepo = {path = "./lib/dbrepo-1.5.2.tar.gz"} gunicorn = "*" [dev-packages] diff --git a/dbrepo-search-service/Pipfile.lock b/dbrepo-search-service/Pipfile.lock index 51f85d6b5f..a18319ab1d 100644 --- a/dbrepo-search-service/Pipfile.lock +++ b/dbrepo-search-service/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "be9fdeaf34d7833ea27b3671252f40ab07f573db3b9b99f8c99033e43ec25ffe" + "sha256": "5f8f989adc3210e3d07474d3a6c1d5a8bc7352195b75ef07feaf135d9388c60c" }, "pipfile-spec": 6, "requires": { @@ -26,100 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138", - "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c", - "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24", - "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480", - "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2", - "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5", - "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", - "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8", - "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf", - "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871", - "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486", - "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9", - "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d", - "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb", - "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68", - "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1", - "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d", - "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd", - "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1", - "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8", - "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7", - "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959", - "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7", - "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42", - "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79", - "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38", - "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a", - "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8", - "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8", - "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151", - "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6", - "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e", - "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7", - "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce", - "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b", - "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8", - "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628", - "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f", - "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a", - "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7", - "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc", - "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab", - "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b", - "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911", - "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9", - "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572", - "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554", - "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d", - "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257", - "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c", - "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b", - "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742", - "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090", - "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6", - "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc", - "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142", - "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16", - "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a", - "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28", - "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e", - "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94", - "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026", - "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb", - "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28", - "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9", - "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3", - "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f", - "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983", - "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205", - "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f", - "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa", - "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c", - "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2", - "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb", - "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67", - "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762", - "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a", - "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8", - "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a", - "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a", - "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc", - "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91", - "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23", - "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527", - "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6", - "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c", - "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7", - "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f", - "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a", - "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092", - "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414" + "sha256:010bc9606f798eda8ef071759c7b163893071502bcaedc7d5dc49f9d8f12e553", + "sha256:03d53b0888f984f4f0c216a37577ee7e7b1ed1dac89cdd2fde61bf2ccb32009b", + "sha256:06defa9017ab50d215446ebbee294e07eb2fcee72d9a909a08192cfacbd43a08", + "sha256:0ccbe8ece8a7796ef41b86a3240034c5918d9b324c2ae48fa0be33565e297c64", + "sha256:0d2cea21ec05b832e9f6a2390b23d32ce5575f6cf4812bd171d4493f59c101fe", + "sha256:12bf9c139dfa004b65d2d71906abc593dcafe78a508f33d56c1ca9d87b18337f", + "sha256:1dd5b7947e23a08c70d4c1924809b91211f14136ffd13d303dc487913cfebfeb", + "sha256:1e32517c01905e0f4e665c3f3a495868ad996a32c243fcd917587d740253d589", + "sha256:1ff7afc3c461bd9217e2b8a90ddbe5edd94687d5a331c4ae6166dca5876d1a4b", + "sha256:262e45dbd7f1829bcb024259f65b2cf69d1ef5b37626af6955a1c487613aeb3a", + "sha256:2d978a95e4b58ef1fd937fbe347ab397c79ba24e17912595b54faafb88b9b937", + "sha256:365df6cf2ad144479ba0e0b58abdc5276923676d34da4c1c45613a80d2aac130", + "sha256:3e9fd9c11299d6d230eb2669fd1ed0238d33970e36b495b0432ace7f157fc931", + "sha256:4275160583df18158e0d6789797ad314a14ae611b98933fbe7d7a1c3dcc6bad4", + "sha256:474f7266a61d1c3218ef4ec0325747884b2d5a13fab5bff5dd3b55d9c849406a", + "sha256:49eb5a0338f141ef32299d48f1415486f47953d37b0c7fa6d778b73b66f3a7e2", + "sha256:4bc936d10b8fa3f2aa66e59e034085208b588442263400ddb042703d0db99421", + "sha256:4c0b3378dc294ad6ec6c038ed57164165e0b83ef5f61eee72f6eefccd7df34b8", + "sha256:4ef6eb1367046fb22085f10c5c84ea2efd0d836ad8088306d652ab1d743faf9e", + "sha256:4ff6105856ae688b29d5daaede1256f5e02e9d5cb3059f8f5ef55d975c2e6992", + "sha256:518578d6821c942362daa14a56f26b739abeede6e408b0b83e27dfcde17730f7", + "sha256:542a4610571b0affc6e13dda9357235f5f1f2ad9859acc69b188eb53901292d6", + "sha256:5cd60673be31449c63f59886f3581478bbdfaddd87e7394a4d73ad134d9be9b9", + "sha256:5ecdf43ddde709c336a655c8b3858c56af8f7402de2572001a5a99f7bebf2f78", + "sha256:635397b5b4de2397f8136f8fd15c8ebee560e36473195c7aa992ffb8e46acdd3", + "sha256:66e83a9a1131f0060aaedcc57f1a7e489898b6c3607eededccc7a9f80b95bdb4", + "sha256:696adff3594bd449e0fe287441062bdc6f5300928426275b39ed27884ba083a7", + "sha256:6dd1411ecfc070af4df129e81fe42c799d95d81c29c22d2c3e4341d974c38f1a", + "sha256:6ec84106c8b7ff347be06bf579c298a23b6d1d2225c57273a8cd502f257125d4", + "sha256:769457243dc4bc902d376cd14c5c7ec234a4faadb4f283dc2738f004cce9a9e1", + "sha256:7a360c18b2cb391fec9585ba1efc55150e2fbc6100308113117dfea521e810d8", + "sha256:7be4efe60e9bddf78ee165a296e80170147282081e1366f0580cf4cc0fb1182f", + "sha256:821c9c640d3dc456c6a7b005e38bc5af05326b6a08ce91a068719934d108a1bb", + "sha256:822dedad93947fcb1096cc41ee8fd32e9f652777561a37c740e5335699f01cea", + "sha256:83bd5aa621b732a0ca1aa3490abd2b010247c4677371a804431935aeedf26e74", + "sha256:88e681c0d17bb285d2ccbb73ae77ef86339b632ee7967044c2284411120b9730", + "sha256:89261fee04715083ef3b5a0d222b094021793c1728b8ff21da361c79f6384095", + "sha256:8ae8480148d696dae49126e97568333fc01493069ad46a94b82f69c7a33197ea", + "sha256:8feffa8396724116be5bc05bf4fcba0c738cbe908c82a95f71371e32b28cd2ca", + "sha256:94acecf2eee13a45f627ed25a28f5a7f2db66b90ff94cd7a1e9cc1ad32cddd43", + "sha256:9788781f57fb732426ae74b9955b899e677ce42b848e60a11be29358fb20c976", + "sha256:9a8b6b3c788a8a6f88f5ce23d729cfde7a2ccebbeb09db0822ef266de0445a27", + "sha256:9b41e0fb3b415beccd6d0c6e5f3ee34b7952cd76120a1db3e45507b83dc5ef81", + "sha256:9d95cce8bb010597b3f2217155befe4708e0538d3548aa08d640ebf54e3f57cb", + "sha256:a34c30e1461da3a69c5bdcfce44418b6f969e1e68ebf367edfa5eaab380abf7a", + "sha256:a468b1b9d5499cbfd0411f5d28adbe651c90508540fdaefb4b7a2171a837a88d", + "sha256:a51f983d91edae7777b5a2af8e5d83224ba01284502c6874a17647ad6cbf0211", + "sha256:a54424050d1eb36edfef913b1bc8552d52a37864c0ea7df3e1e764663e11053a", + "sha256:a550b4ff70d06c15057d75ddad89a3e7c496e0609d28c567c20b61cd1265c0a6", + "sha256:a60f8206818e3582c999c999c799ab068e14f1870ade47d1fe8536dbfd88010b", + "sha256:a7986fb988314fd2225c1ecab45fd457e1f2c097dcc3c0aacd2a7aec7486beb6", + "sha256:ab5c6a521b156edef13a57a6d524903c547573ff8101e3d1bbe9ee1b97267973", + "sha256:aef239c307f3a3f830933d612c0aef4ad4b3aa9ce5233a0954262a00f5c379f1", + "sha256:b10b316413c80a4dcc5228c092a8d019e4b75d4efbca8988cb5b67ae9fa56881", + "sha256:b169507c98b924fd68b82ae366c285daf6d22456835294c329c3226d61e1f69d", + "sha256:b71aab89800fa2eaeb28923ee05e7e56c28dab4ebdba524db06e963431bf6192", + "sha256:beaed1b2d03033dd301a7b67430f03c8255d6856a269c20995a0292de596519e", + "sha256:cb2d5a24586b508f658ddd710f7d4b7e4f5656cb5d569aeb1f432c1c3704347a", + "sha256:cb4c676ab99ca2dd231928d481e19cd540155dff36e70e613179c4927bd520b8", + "sha256:cbe3e356523d0b336543996f92a0e65f760be82447db21c95c60392c8075ff5c", + "sha256:cc2d64b1747efa183ced57b6bce53c9ea8e16e53419e389051b2a214ad0ed051", + "sha256:cfe8646a24856624c1eb7649da99333f0d7e75d9cf7c155ea870957d24b7c63c", + "sha256:d0fd6510c6d67d08ec80d9ba10cd340a8cfb0dd33436c858ed38d4564abb27c7", + "sha256:d40d9a740053cb7fef72442fa7bd699060ff4c710971ebdb8dd7c8b36417570f", + "sha256:d60255f3ed71aa14a2e75383543ca31bd362fdc7f0d2eafc060d85a9051598df", + "sha256:d68bb99bc6a4b0a3eceb95a246f5a0262e600e094b5178c2b1ab0f4bcbae6729", + "sha256:d97668595bf03299148ea968fed2195cc76ad063aeec8161731aa6a5dbc2f675", + "sha256:e0898a77298dc24eef368511d98e551e0b2db293fa9b40c982f4d5ab4d8d2a3a", + "sha256:e1e09bc44a1abbd96f55d15330d6cab80459cb8b06a0b656efd712ce47a3710d", + "sha256:e5786e5926f888ce3a996d38d9c9b8f9306f399edb1f1ca3ce7760dab9b1043c", + "sha256:e69d9869df50dd591228c62fbb3923d6124517d6bfc47a804492813888b497be", + "sha256:e7d182164aebad4e2faf2742ee7486d4af73d933461adbd8f183ac9b1837323c", + "sha256:eb4f1fe110332651c00d2df160978cf1be70896ed9e612ff7c7e67955091b2c4", + "sha256:ee081375d10fa2f3f7b0d050c8b9c1ae23190e1d9be256035bf8a41059c4df3a", + "sha256:f307632f3eaa676f8c2f5df11e4c00ad47dfa79b06cb2fa39156a4e9c6821bdb", + "sha256:f37ece590451ecffc815f2eb41f07191d1a31a0404361d1ae2ed532e05c86da4" ], - "markers": "python_version >= '3.8'", - "version": "==3.10.10" + "markers": "python_version >= '3.9'", + "version": "==3.11.4" }, "aiosignal": { "hashes": [ @@ -147,11 +132,11 @@ }, "blinker": { "hashes": [ - "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01", - "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83" + "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", + "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" + "markers": "python_version >= '3.9'", + "version": "==1.9.0" }, "certifi": { "hashes": [ @@ -388,9 +373,9 @@ }, "dbrepo": { "hashes": [ - "sha256:d60be1e9261bde6b9d4ebe5db46896b1bfaed918eff7b98194e4224d94511497" + "sha256:77c1023a6508b68661c1c7ff286321bdc6e6d3bd4b3189b953b82567aab8e8fe" ], - "path": "./lib/dbrepo-1.5.1.tar.gz" + "path": "./lib/dbrepo-1.5.2.tar.gz" }, "docker": { "hashes": [ @@ -440,12 +425,12 @@ }, "flask-jwt-extended": { "hashes": [ - "sha256:63a28fc9731bcc6c4b8815b6f954b5904caa534fc2ae9b93b1d3ef12930dca95", - "sha256:9215d05a9413d3855764bcd67035e75819d23af2fafb6b55197eb5a3313fdfb2" + "sha256:4d8939ca006c92209fad82e591471db897f33b6a85561f8e792c5aa6816ef39c", + "sha256:be5785e2e3ef4d8773ba6d10247e78827dcf0b111efbfcd7a0794b5f7c750d90" ], "index": "pypi", - "markers": "python_version >= '3.7' and python_version < '4'", - "version": "==4.6.0" + "markers": "python_version >= '3.9' and python_version < '4'", + "version": "==4.7.0" }, "flask-sqlalchemy": { "hashes": [ @@ -943,11 +928,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pandas": { "hashes": [ @@ -1246,11 +1231,11 @@ }, "pyjwt": { "hashes": [ - "sha256:3b02fb0f44517787776cf48f2ae25d8e14f300e6d7545a4315cee571a415e850", - "sha256:7e1e5b56cc735432a7369cbfa0efe50fa113ebecdc04ae6922deba8b84582d0c" + "sha256:543b77207db656de204372350926bed5a86201c4cbff159f623f79c7bb487a15", + "sha256:7628a7eb7938959ac1b26e819a1df0fd3259505627b575e4bad6d08f76db695c" ], - "markers": "python_version >= '3.8'", - "version": "==2.9.0" + "markers": "python_version >= '3.9'", + "version": "==2.10.0" }, "pyparsing": { "hashes": [ @@ -1610,11 +1595,11 @@ }, "werkzeug": { "hashes": [ - "sha256:4f7d1a5de312c810a8a2c6f0b47e9f6a7cffb7c8322def35e4d4d9841ff85597", - "sha256:f471a4cd167233077e9d2a8190c3471c5bc520c636a9e3c1e9300c33bced03bc" + "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", + "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746" ], "markers": "python_version >= '3.9'", - "version": "==3.1.2" + "version": "==3.1.3" }, "wrapt": { "hashes": [ @@ -1694,91 +1679,91 @@ }, "yarl": { "hashes": [ - "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac", - "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47", - "sha256:0b1794853124e2f663f0ea54efb0340b457f08d40a1cef78edfa086576179c91", - "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5", - "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df", - "sha256:14bc88baa44e1f84164a392827b5defb4fa8e56b93fecac3d15315e7c8e5d8b3", - "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463", - "sha256:16bca6678a83657dd48df84b51bd56a6c6bd401853aef6d09dc2506a78484c7b", - "sha256:1a3b91c44efa29e6c8ef8a9a2b583347998e2ba52c5d8280dbd5919c02dfc3b5", - "sha256:1a52a1ffdd824fb1835272e125385c32fd8b17fbdefeedcb4d543cc23b332d74", - "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3", - "sha256:299f11b44d8d3a588234adbe01112126010bd96d9139c3ba7b3badd9829261c3", - "sha256:2b24ec55fad43e476905eceaf14f41f6478780b870eda5d08b4d6de9a60b65b4", - "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0", - "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299", - "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2", - "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac", - "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61", - "sha256:380e6c38ef692b8fd5a0f6d1fa8774d81ebc08cfbd624b1bca62a4d4af2f9931", - "sha256:3b74ff4767d3ef47ffe0cd1d89379dc4d828d4873e5528976ced3b44fe5b0a21", - "sha256:3e844be8d536afa129366d9af76ed7cb8dfefec99f5f1c9e4f8ae542279a6dc3", - "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7", - "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96", - "sha256:482c122b72e3c5ec98f11457aeb436ae4aecca75de19b3d1de7cf88bc40db82f", - "sha256:561c87fea99545ef7d692403c110b2f99dced6dff93056d6e04384ad3bc46243", - "sha256:578d00c9b7fccfa1745a44f4eddfdc99d723d157dad26764538fbdda37209857", - "sha256:58c8e9620eb82a189c6c40cb6b59b4e35b2ee68b1f2afa6597732a2b467d7e8f", - "sha256:5b29beab10211a746f9846baa39275e80034e065460d99eb51e45c9a9495bcca", - "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488", - "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da", - "sha256:62a91aefff3d11bf60e5956d340eb507a983a7ec802b19072bb989ce120cd948", - "sha256:64cc6e97f14cf8a275d79c5002281f3040c12e2e4220623b5759ea7f9868d6a5", - "sha256:6f4c9156c4d1eb490fe374fb294deeb7bc7eaccda50e23775b2354b6a6739934", - "sha256:7294e38f9aa2e9f05f765b28ffdc5d81378508ce6dadbe93f6d464a8c9594473", - "sha256:7615058aabad54416ddac99ade09a5510cf77039a3b903e94e8922f25ed203d7", - "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685", - "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e", - "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147", - "sha256:7fac95714b09da9278a0b52e492466f773cfe37651cf467a83a1b659be24bf71", - "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67", - "sha256:846dd2e1243407133d3195d2d7e4ceefcaa5f5bf7278f0a9bda00967e6326b04", - "sha256:84c063af19ef5130084db70ada40ce63a84f6c1ef4d3dbc34e5e8c4febb20822", - "sha256:881764d610e3269964fc4bb3c19bb6fce55422828e152b885609ec176b41cf11", - "sha256:8994b29c462de9a8fce2d591028b986dbbe1b32f3ad600b2d3e1c482c93abad6", - "sha256:8c79e9d7e3d8a32d4824250a9c6401194fb4c2ad9a0cec8f6a96e09a582c2cc0", - "sha256:8ee427208c675f1b6e344a1f89376a9613fc30b52646a04ac0c1f6587c7e46ec", - "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda", - "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556", - "sha256:9fb815155aac6bfa8d86184079652c9715c812d506b22cfa369196ef4e99d1b4", - "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c", - "sha256:a7ac5b4984c468ce4f4a553df281450df0a34aefae02e58d77a0847be8d1e11f", - "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8", - "sha256:ae3476e934b9d714aa8000d2e4c01eb2590eee10b9d8cd03e7983ad65dfbfcba", - "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258", - "sha256:b40d1bf6e6f74f7c0a567a9e5e778bbd4699d1d3d2c0fe46f4b717eef9e96b95", - "sha256:b5c4804e4039f487e942c13381e6c27b4b4e66066d94ef1fae3f6ba8b953f383", - "sha256:b5d6a6c9602fd4598fa07e0389e19fe199ae96449008d8304bf5d47cb745462e", - "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938", - "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374", - "sha256:c180ac742a083e109c1a18151f4dd8675f32679985a1c750d2ff806796165b55", - "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139", - "sha256:c7e177c619342e407415d4f35dec63d2d134d951e24b5166afcdfd1362828e17", - "sha256:cbad927ea8ed814622305d842c93412cb47bd39a496ed0f96bfd42b922b4a217", - "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d", - "sha256:cc7c92c1baa629cb03ecb0c3d12564f172218fb1739f54bf5f3881844daadc6d", - "sha256:cc7d768260f4ba4ea01741c1b5fe3d3a6c70eb91c87f4c8761bbcce5181beafe", - "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199", - "sha256:d216e5d9b8749563c7f2c6f7a0831057ec844c68b4c11cb10fc62d4fd373c26d", - "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8", - "sha256:d6324274b4e0e2fa1b3eccb25997b1c9ed134ff61d296448ab8269f5ac068c4c", - "sha256:d8a8b74d843c2638f3864a17d97a4acda58e40d3e44b6303b8cc3d3c44ae2d29", - "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172", - "sha256:de599af166970d6a61accde358ec9ded821234cbbc8c6413acfec06056b8e860", - "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7", - "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170", - "sha256:eb6dce402734575e1a8cc0bb1509afca508a400a57ce13d306ea2c663bad1138", - "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06", - "sha256:f5efe0661b9fcd6246f27957f6ae1c0eb29bc60552820f01e970b4996e016004", - "sha256:f9cbfbc5faca235fbdf531b93aa0f9f005ec7d267d9d738761a4d42b744ea159", - "sha256:fbea1751729afe607d84acfd01efd95e3b31db148a181a441984ce9b3d3469da", - "sha256:fca4b4307ebe9c3ec77a084da3a9d1999d164693d16492ca2b64594340999988", - "sha256:ff5c6771c7e3511a06555afa317879b7db8d640137ba55d6ab0d0c50425cab75" + "sha256:0c8e589379ef0407b10bed16cc26e7392ef8f86961a706ade0a22309a45414d7", + "sha256:0d41c684f286ce41fa05ab6af70f32d6da1b6f0457459a56cf9e393c1c0b2217", + "sha256:1056cadd5e850a1c026f28e0704ab0a94daaa8f887ece8dfed30f88befb87bb0", + "sha256:11d86c6145ac5c706c53d484784cf504d7d10fa407cb73b9d20f09ff986059ef", + "sha256:170ed4971bf9058582b01a8338605f4d8c849bd88834061e60e83b52d0c76870", + "sha256:17791acaa0c0f89323c57da7b9a79f2174e26d5debbc8c02d84ebd80c2b7bff8", + "sha256:17931dfbb84ae18b287279c1f92b76a3abcd9a49cd69b92e946035cff06bcd20", + "sha256:18662443c6c3707e2fc7fad184b4dc32dd428710bbe72e1bce7fe1988d4aa654", + "sha256:187df91395c11e9f9dc69b38d12406df85aa5865f1766a47907b1cc9855b6303", + "sha256:1fee66b32e79264f428dc8da18396ad59cc48eef3c9c13844adec890cd339db5", + "sha256:2270d590997445a0dc29afa92e5534bfea76ba3aea026289e811bf9ed4b65a7f", + "sha256:2654caaf5584449d49c94a6b382b3cb4a246c090e72453493ea168b931206a4d", + "sha256:26bfb6226e0c157af5da16d2d62258f1ac578d2899130a50433ffee4a5dfa673", + "sha256:2941756754a10e799e5b87e2319bbec481ed0957421fba0e7b9fb1c11e40509f", + "sha256:3294f787a437cb5d81846de3a6697f0c35ecff37a932d73b1fe62490bef69211", + "sha256:358dc7ddf25e79e1cc8ee16d970c23faee84d532b873519c5036dbb858965795", + "sha256:38bc4ed5cae853409cb193c87c86cd0bc8d3a70fd2268a9807217b9176093ac6", + "sha256:3a0baff7827a632204060f48dca9e63fbd6a5a0b8790c1a2adfb25dc2c9c0d50", + "sha256:3a3ede8c248f36b60227eb777eac1dbc2f1022dc4d741b177c4379ca8e75571a", + "sha256:3a58a2f2ca7aaf22b265388d40232f453f67a6def7355a840b98c2d547bd037f", + "sha256:4434b739a8a101a837caeaa0137e0e38cb4ea561f39cb8960f3b1e7f4967a3fc", + "sha256:460024cacfc3246cc4d9f47a7fc860e4fcea7d1dc651e1256510d8c3c9c7cde0", + "sha256:46c465ad06971abcf46dd532f77560181387b4eea59084434bdff97524444032", + "sha256:48e424347a45568413deec6f6ee2d720de2cc0385019bedf44cd93e8638aa0ed", + "sha256:4a8c83f6fcdc327783bdc737e8e45b2e909b7bd108c4da1892d3bc59c04a6d84", + "sha256:4c840cc11163d3c01a9d8aad227683c48cd3e5be5a785921bcc2a8b4b758c4f3", + "sha256:4d486ddcaca8c68455aa01cf53d28d413fb41a35afc9f6594a730c9779545876", + "sha256:4e76381be3d8ff96a4e6c77815653063e87555981329cf8f85e5be5abf449021", + "sha256:50d866f7b1a3f16f98603e095f24c0eeba25eb508c85a2c5939c8b3870ba2df8", + "sha256:52492b87d5877ec405542f43cd3da80bdcb2d0c2fbc73236526e5f2c28e6db28", + "sha256:56afb44a12b0864d17b597210d63a5b88915d680f6484d8d202ed68ade38673d", + "sha256:585ce7cd97be8f538345de47b279b879e091c8b86d9dbc6d98a96a7ad78876a3", + "sha256:5870d620b23b956f72bafed6a0ba9a62edb5f2ef78a8849b7615bd9433384171", + "sha256:5c6ea72fe619fee5e6b5d4040a451d45d8175f560b11b3d3e044cd24b2720526", + "sha256:688058e89f512fb7541cb85c2f149c292d3fa22f981d5a5453b40c5da49eb9e8", + "sha256:6a3f47930fbbed0f6377639503848134c4aa25426b08778d641491131351c2c8", + "sha256:6b981316fcd940f085f646b822c2ff2b8b813cbd61281acad229ea3cbaabeb6b", + "sha256:734144cd2bd633a1516948e477ff6c835041c0536cef1d5b9a823ae29899665b", + "sha256:736bb076f7299c5c55dfef3eb9e96071a795cb08052822c2bb349b06f4cb2e0a", + "sha256:752485cbbb50c1e20908450ff4f94217acba9358ebdce0d8106510859d6eb19a", + "sha256:753eaaa0c7195244c84b5cc159dc8204b7fd99f716f11198f999f2332a86b178", + "sha256:75ac158560dec3ed72f6d604c81090ec44529cfb8169b05ae6fcb3e986b325d9", + "sha256:76499469dcc24759399accd85ec27f237d52dec300daaca46a5352fcbebb1071", + "sha256:782ca9c58f5c491c7afa55518542b2b005caedaf4685ec814fadfcee51f02493", + "sha256:792155279dc093839e43f85ff7b9b6493a8eaa0af1f94f1f9c6e8f4de8c63500", + "sha256:7a1606ba68e311576bcb1672b2a1543417e7e0aa4c85e9e718ba6466952476c0", + "sha256:8281db240a1616af2f9c5f71d355057e73a1409c4648c8949901396dc0a3c151", + "sha256:871e1b47eec7b6df76b23c642a81db5dd6536cbef26b7e80e7c56c2fd371382e", + "sha256:8b9c4643e7d843a0dca9cd9d610a0876e90a1b2cbc4c5ba7930a0d90baf6903f", + "sha256:8c6d5fed96f0646bfdf698b0a1cebf32b8aae6892d1bec0c5d2d6e2df44e1e2d", + "sha256:8e1bf59e035534ba4077f5361d8d5d9194149f9ed4f823d1ee29ef3e8964ace3", + "sha256:8fd51299e21da709eabcd5b2dd60e39090804431292daacbee8d3dabe39a6bc0", + "sha256:91c012dceadc695ccf69301bfdccd1fc4472ad714fe2dd3c5ab4d2046afddf29", + "sha256:93771146ef048b34201bfa382c2bf74c524980870bb278e6df515efaf93699ff", + "sha256:93d1c8cc5bf5df401015c5e2a3ce75a5254a9839e5039c881365d2a9dcfc6dc2", + "sha256:9611b83810a74a46be88847e0ea616794c406dbcb4e25405e52bff8f4bee2d0a", + "sha256:9bc27dd5cfdbe3dc7f381b05e6260ca6da41931a6e582267d5ca540270afeeb2", + "sha256:ac8eda86cc75859093e9ce390d423aba968f50cf0e481e6c7d7d63f90bae5c9c", + "sha256:bc3003710e335e3f842ae3fd78efa55f11a863a89a72e9a07da214db3bf7e1f8", + "sha256:bc61b005f6521fcc00ca0d1243559a5850b9dd1e1fe07b891410ee8fe192d0c0", + "sha256:be4c7b1c49d9917c6e95258d3d07f43cfba2c69a6929816e77daf322aaba6628", + "sha256:c019abc2eca67dfa4d8fb72ba924871d764ec3c92b86d5b53b405ad3d6aa56b0", + "sha256:c42774d1d1508ec48c3ed29e7b110e33f5e74a20957ea16197dbcce8be6b52ba", + "sha256:c556fbc6820b6e2cda1ca675c5fa5589cf188f8da6b33e9fc05b002e603e44fa", + "sha256:c6e659b9a24d145e271c2faf3fa6dd1fcb3e5d3f4e17273d9e0350b6ab0fe6e2", + "sha256:c74f0b0472ac40b04e6d28532f55cac8090e34c3e81f118d12843e6df14d0909", + "sha256:cd7e35818d2328b679a13268d9ea505c85cd773572ebb7a0da7ccbca77b6a52e", + "sha256:d17832ba39374134c10e82d137e372b5f7478c4cceeb19d02ae3e3d1daed8721", + "sha256:d1fa68a3c921365c5745b4bd3af6221ae1f0ea1bf04b69e94eda60e57958907f", + "sha256:d63123bfd0dce5f91101e77c8a5427c3872501acece8c90df457b486bc1acd47", + "sha256:da9d3061e61e5ae3f753654813bc1cd1c70e02fb72cf871bd6daf78443e9e2b1", + "sha256:db5ac3871ed76340210fe028f535392f097fb31b875354bcb69162bba2632ef4", + "sha256:dd7abf4f717e33b7487121faf23560b3a50924f80e4bef62b22dab441ded8f3b", + "sha256:dd90238d3a77a0e07d4d6ffdebc0c21a9787c5953a508a2231b5f191455f31e9", + "sha256:ef6eee1a61638d29cd7c85f7fd3ac7b22b4c0fabc8fd00a712b727a3e73b0685", + "sha256:f11fd61d72d93ac23718d393d2a64469af40be2116b24da0a4ca6922df26807e", + "sha256:f1e7fedb09c059efee2533119666ca7e1a2610072076926fa028c2ba5dfeb78c", + "sha256:f25b7e93f5414b9a983e1a6c1820142c13e1782cc9ed354c25e933aebe97fcf2", + "sha256:f2f44a4247461965fed18b2573f3a9eb5e2c3cad225201ee858726cde610daca", + "sha256:f5ffc6b7ace5b22d9e73b2a4c7305740a339fbd55301d52735f73e21d9eb3130", + "sha256:ff6af03cac0d1a4c3c19e5dcc4c05252411bf44ccaa2485e20d0a7c77892ab6e", + "sha256:ff8d95e06546c3a8c188f68040e9d0360feb67ba8498baf018918f669f7bc39b" ], "markers": "python_version >= '3.9'", - "version": "==1.17.1" + "version": "==1.17.2" } }, "develop": { @@ -1903,72 +1888,72 @@ }, "coverage": { "hashes": [ - "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376", - "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", - "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111", - "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", - "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", - "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", - "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", - "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", - "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", - "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c", - "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", - "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", - "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", - "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0", - "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", - "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", - "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", - "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", - "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", - "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", - "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", - "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", - "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", - "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", - "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", - "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", - "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", - "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", - "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", - "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901", - "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", - "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", - "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", - "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", - "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", - "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", - "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", - "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", - "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3", - "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", - "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076", - "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", - "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", - "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", - "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", - "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", - "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", - "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09", - "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", - "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", - "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f", - "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", - "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", - "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", - "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", - "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", - "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", - "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", - "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", - "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", - "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", - "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858" + "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433", + "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529", + "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671", + "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e", + "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42", + "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99", + "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327", + "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8", + "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06", + "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874", + "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4", + "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354", + "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1", + "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab", + "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3", + "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b", + "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37", + "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd", + "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f", + "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b", + "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c", + "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b", + "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7", + "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3", + "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808", + "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a", + "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76", + "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469", + "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55", + "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289", + "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc", + "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13", + "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2", + "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30", + "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163", + "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d", + "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c", + "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1", + "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c", + "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2", + "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3", + "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314", + "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0", + "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384", + "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb", + "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c", + "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45", + "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a", + "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24", + "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8", + "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec", + "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56", + "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777", + "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b", + "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f", + "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a", + "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d", + "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9", + "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413", + "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c", + "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b", + "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.4" + "version": "==7.6.7" }, "idna": { "hashes": [ @@ -1988,11 +1973,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pluggy": { "hashes": [ diff --git a/dbrepo-search-service/init/Pipfile.lock b/dbrepo-search-service/init/Pipfile.lock index e4cc71be85..9b30b06f5a 100644 --- a/dbrepo-search-service/init/Pipfile.lock +++ b/dbrepo-search-service/init/Pipfile.lock @@ -26,100 +26,85 @@ }, "aiohttp": { "hashes": [ - "sha256:007ec22fbc573e5eb2fb7dec4198ef8f6bf2fe4ce20020798b2eb5d0abda6138", - "sha256:00819de9e45d42584bed046314c40ea7e9aea95411b38971082cad449392b08c", - "sha256:01948b1d570f83ee7bbf5a60ea2375a89dfb09fd419170e7f5af029510033d24", - "sha256:038f514fe39e235e9fef6717fbf944057bfa24f9b3db9ee551a7ecf584b5b480", - "sha256:03a42ac7895406220124c88911ebee31ba8b2d24c98507f4a8bf826b2937c7f2", - "sha256:05646ebe6b94cc93407b3bf34b9eb26c20722384d068eb7339de802154d61bc5", - "sha256:0631dd7c9f0822cc61c88586ca76d5b5ada26538097d0f1df510b082bad3411a", - "sha256:0b00807e2605f16e1e198f33a53ce3c4523114059b0c09c337209ae55e3823a8", - "sha256:0e1b370d8007c4ae31ee6db7f9a2fe801a42b146cec80a86766e7ad5c4a259cf", - "sha256:15ecd889a709b0080f02721255b3f80bb261c2293d3c748151274dfea93ac871", - "sha256:1b66ccafef7336a1e1f0e389901f60c1d920102315a56df85e49552308fc0486", - "sha256:1bbb122c557a16fafc10354b9d99ebf2f2808a660d78202f10ba9d50786384b9", - "sha256:1eb89d3d29adaf533588f209768a9c02e44e4baf832b08118749c5fad191781d", - "sha256:258c5dd01afc10015866114e210fb7365f0d02d9d059c3c3415382ab633fcbcb", - "sha256:2609e9ab08474702cc67b7702dbb8a80e392c54613ebe80db7e8dbdb79837c68", - "sha256:274cfa632350225ce3fdeb318c23b4a10ec25c0e2c880eff951a3842cf358ac1", - "sha256:28529e08fde6f12eba8677f5a8608500ed33c086f974de68cc65ab218713a59d", - "sha256:2b606353da03edcc71130b52388d25f9a30a126e04caef1fd637e31683033abd", - "sha256:30ca7c3b94708a9d7ae76ff281b2f47d8eaf2579cd05971b5dc681db8caac6e1", - "sha256:333cf6cf8e65f6a1e06e9eb3e643a0c515bb850d470902274239fea02033e9a8", - "sha256:3455522392fb15ff549d92fbf4b73b559d5e43dc522588f7eb3e54c3f38beee7", - "sha256:362f641f9071e5f3ee6f8e7d37d5ed0d95aae656adf4ef578313ee585b585959", - "sha256:3bcd391d083f636c06a68715e69467963d1f9600f85ef556ea82e9ef25f043f7", - "sha256:3dffb610a30d643983aeb185ce134f97f290f8935f0abccdd32c77bed9388b42", - "sha256:3fe407bf93533a6fa82dece0e74dbcaaf5d684e5a51862887f9eaebe6372cd79", - "sha256:413251f6fcf552a33c981c4709a6bba37b12710982fec8e558ae944bfb2abd38", - "sha256:438cd072f75bb6612f2aca29f8bd7cdf6e35e8f160bc312e49fbecab77c99e3a", - "sha256:4470c73c12cd9109db8277287d11f9dd98f77fc54155fc71a7738a83ffcc8ea8", - "sha256:45c3b868724137f713a38376fef8120c166d1eadd50da1855c112fe97954aed8", - "sha256:486f7aabfa292719a2753c016cc3a8f8172965cabb3ea2e7f7436c7f5a22a151", - "sha256:4f05e9727ce409358baa615dbeb9b969db94324a79b5a5cea45d39bdb01d82e6", - "sha256:50aed5155f819873d23520919e16703fc8925e509abbb1a1491b0087d1cd969e", - "sha256:50edbcad60d8f0e3eccc68da67f37268b5144ecc34d59f27a02f9611c1d4eec7", - "sha256:54ca74df1be3c7ca1cf7f4c971c79c2daf48d9aa65dea1a662ae18926f5bc8ce", - "sha256:578a4b875af3e0daaf1ac6fa983d93e0bbfec3ead753b6d6f33d467100cdc67b", - "sha256:597a079284b7ee65ee102bc3a6ea226a37d2b96d0418cc9047490f231dc09fe8", - "sha256:59bb3c54aa420521dc4ce3cc2c3fe2ad82adf7b09403fa1f48ae45c0cbde6628", - "sha256:5c6a5b8c7926ba5d8545c7dd22961a107526562da31a7a32fa2456baf040939f", - "sha256:64f6c17757251e2b8d885d728b6433d9d970573586a78b78ba8929b0f41d045a", - "sha256:679abe5d3858b33c2cf74faec299fda60ea9de62916e8b67e625d65bf069a3b7", - "sha256:741a46d58677d8c733175d7e5aa618d277cd9d880301a380fd296975a9cdd7bc", - "sha256:7789050d9e5d0c309c706953e5e8876e38662d57d45f936902e176d19f1c58ab", - "sha256:77abf6665ae54000b98b3c742bc6ea1d1fb31c394bcabf8b5d2c1ac3ebfe7f3b", - "sha256:79019094f87c9fb44f8d769e41dbb664d6e8fcfd62f665ccce36762deaa0e911", - "sha256:7b06b7843929e41a94ea09eb1ce3927865387e3e23ebe108e0d0d09b08d25be9", - "sha256:7e338c0523d024fad378b376a79faff37fafb3c001872a618cde1d322400a572", - "sha256:7ea7ffc6d6d6f8a11e6f40091a1040995cdff02cfc9ba4c2f30a516cb2633554", - "sha256:8105fd8a890df77b76dd3054cddf01a879fc13e8af576805d667e0fa0224c35d", - "sha256:84afcdea18eda514c25bc68b9af2a2b1adea7c08899175a51fe7c4fb6d551257", - "sha256:9294bbb581f92770e6ed5c19559e1e99255e4ca604a22c5c6397b2f9dd3ee42c", - "sha256:93429602396f3383a797a2a70e5f1de5df8e35535d7806c9f91df06f297e109b", - "sha256:9627cc1a10c8c409b5822a92d57a77f383b554463d1884008e051c32ab1b3742", - "sha256:998f3bd3cfc95e9424a6acd7840cbdd39e45bc09ef87533c006f94ac47296090", - "sha256:9c72109213eb9d3874f7ac8c0c5fa90e072d678e117d9061c06e30c85b4cf0e6", - "sha256:9fc1500fd2a952c5c8e3b29aaf7e3cc6e27e9cfc0a8819b3bce48cc1b849e4cc", - "sha256:a3f00003de6eba42d6e94fabb4125600d6e484846dbf90ea8e48a800430cc142", - "sha256:a45d85cf20b5e0d0aa5a8dca27cce8eddef3292bc29d72dcad1641f4ed50aa16", - "sha256:a7d8d14fe962153fc681f6366bdec33d4356f98a3e3567782aac1b6e0e40109a", - "sha256:a8fa23fe62c436ccf23ff930149c047f060c7126eae3ccea005f0483f27b2e28", - "sha256:aa6658732517ddabe22c9036479eabce6036655ba87a0224c612e1ae6af2087e", - "sha256:aafc8ee9b742ce75044ae9a4d3e60e3d918d15a4c2e08a6c3c3e38fa59b92d94", - "sha256:ab5a5a0c7a7991d90446a198689c0535be89bbd6b410a1f9a66688f0880ec026", - "sha256:acd48d5b80ee80f9432a165c0ac8cbf9253eaddb6113269a5e18699b33958dbb", - "sha256:ad7593bb24b2ab09e65e8a1d385606f0f47c65b5a2ae6c551db67d6653e78c28", - "sha256:baa42524a82f75303f714108fea528ccacf0386af429b69fff141ffef1c534f9", - "sha256:bdfcf6443637c148c4e1a20c48c566aa694fa5e288d34b20fcdc58507882fed3", - "sha256:be7443669ae9c016b71f402e43208e13ddf00912f47f623ee5994e12fc7d4b3f", - "sha256:c02a30b904282777d872266b87b20ed8cc0d1501855e27f831320f471d54d983", - "sha256:c1277cd707c465cd09572a774559a3cc7c7a28802eb3a2a9472588f062097205", - "sha256:c30a0eafc89d28e7f959281b58198a9fa5e99405f716c0289b7892ca345fe45f", - "sha256:c5ce2ce7c997e1971b7184ee37deb6ea9922ef5163c6ee5aa3c274b05f9e12fa", - "sha256:c823bc3971c44ab93e611ab1a46b1eafeae474c0c844aff4b7474287b75fe49c", - "sha256:ce0cdc074d540265bfeb31336e678b4e37316849d13b308607efa527e981f5c2", - "sha256:d1720b4f14c78a3089562b8875b53e36b51c97c51adc53325a69b79b4b48ebcb", - "sha256:d183cf9c797a5291e8301790ed6d053480ed94070637bfaad914dd38b0981f67", - "sha256:d9010c31cd6fa59438da4e58a7f19e4753f7f264300cd152e7f90d4602449762", - "sha256:d9e5e4a85bdb56d224f412d9c98ae4cbd032cc4f3161818f692cd81766eee65a", - "sha256:da1dee8948d2137bb51fbb8a53cce6b1bcc86003c6b42565f008438b806cccd8", - "sha256:df9270660711670e68803107d55c2b5949c2e0f2e4896da176e1ecfc068b974a", - "sha256:e00e3505cd80440f6c98c6d69269dcc2a119f86ad0a9fd70bccc59504bebd68a", - "sha256:e48d5021a84d341bcaf95c8460b152cfbad770d28e5fe14a768988c461b821bc", - "sha256:e7f8b04d83483577fd9200461b057c9f14ced334dcb053090cea1da9c8321a91", - "sha256:edfe3341033a6b53a5c522c802deb2079eee5cbfbb0af032a55064bd65c73a23", - "sha256:ef9c33cc5cbca35808f6c74be11eb7f5f6b14d2311be84a15b594bd3e58b5527", - "sha256:f2d4324a98062be0525d16f768a03e0bbb3b9fe301ceee99611dc9a7953124e6", - "sha256:f3935f82f6f4a3820270842e90456ebad3af15810cf65932bd24da4463bc0a4c", - "sha256:f614ab0c76397661b90b6851a030004dac502e48260ea10f2441abd2207fbcc7", - "sha256:f7db54c7914cc99d901d93a34704833568d86c20925b2762f9fa779f9cd2e70f", - "sha256:fbc6264158392bad9df19537e872d476f7c57adf718944cc1e4495cbabf38e2a", - "sha256:fe2fb38c2ed905a2582948e2de560675e9dfbee94c6d5ccdb1301c6d0a5bf092", - "sha256:ffe595f10566f8276b76dc3a11ae4bb7eba1aac8ddd75811736a15b0d5311414" + "sha256:010bc9606f798eda8ef071759c7b163893071502bcaedc7d5dc49f9d8f12e553", + "sha256:03d53b0888f984f4f0c216a37577ee7e7b1ed1dac89cdd2fde61bf2ccb32009b", + "sha256:06defa9017ab50d215446ebbee294e07eb2fcee72d9a909a08192cfacbd43a08", + "sha256:0ccbe8ece8a7796ef41b86a3240034c5918d9b324c2ae48fa0be33565e297c64", + "sha256:0d2cea21ec05b832e9f6a2390b23d32ce5575f6cf4812bd171d4493f59c101fe", + "sha256:12bf9c139dfa004b65d2d71906abc593dcafe78a508f33d56c1ca9d87b18337f", + "sha256:1dd5b7947e23a08c70d4c1924809b91211f14136ffd13d303dc487913cfebfeb", + "sha256:1e32517c01905e0f4e665c3f3a495868ad996a32c243fcd917587d740253d589", + "sha256:1ff7afc3c461bd9217e2b8a90ddbe5edd94687d5a331c4ae6166dca5876d1a4b", + "sha256:262e45dbd7f1829bcb024259f65b2cf69d1ef5b37626af6955a1c487613aeb3a", + "sha256:2d978a95e4b58ef1fd937fbe347ab397c79ba24e17912595b54faafb88b9b937", + "sha256:365df6cf2ad144479ba0e0b58abdc5276923676d34da4c1c45613a80d2aac130", + "sha256:3e9fd9c11299d6d230eb2669fd1ed0238d33970e36b495b0432ace7f157fc931", + "sha256:4275160583df18158e0d6789797ad314a14ae611b98933fbe7d7a1c3dcc6bad4", + "sha256:474f7266a61d1c3218ef4ec0325747884b2d5a13fab5bff5dd3b55d9c849406a", + "sha256:49eb5a0338f141ef32299d48f1415486f47953d37b0c7fa6d778b73b66f3a7e2", + "sha256:4bc936d10b8fa3f2aa66e59e034085208b588442263400ddb042703d0db99421", + "sha256:4c0b3378dc294ad6ec6c038ed57164165e0b83ef5f61eee72f6eefccd7df34b8", + "sha256:4ef6eb1367046fb22085f10c5c84ea2efd0d836ad8088306d652ab1d743faf9e", + "sha256:4ff6105856ae688b29d5daaede1256f5e02e9d5cb3059f8f5ef55d975c2e6992", + "sha256:518578d6821c942362daa14a56f26b739abeede6e408b0b83e27dfcde17730f7", + "sha256:542a4610571b0affc6e13dda9357235f5f1f2ad9859acc69b188eb53901292d6", + "sha256:5cd60673be31449c63f59886f3581478bbdfaddd87e7394a4d73ad134d9be9b9", + "sha256:5ecdf43ddde709c336a655c8b3858c56af8f7402de2572001a5a99f7bebf2f78", + "sha256:635397b5b4de2397f8136f8fd15c8ebee560e36473195c7aa992ffb8e46acdd3", + "sha256:66e83a9a1131f0060aaedcc57f1a7e489898b6c3607eededccc7a9f80b95bdb4", + "sha256:696adff3594bd449e0fe287441062bdc6f5300928426275b39ed27884ba083a7", + "sha256:6dd1411ecfc070af4df129e81fe42c799d95d81c29c22d2c3e4341d974c38f1a", + "sha256:6ec84106c8b7ff347be06bf579c298a23b6d1d2225c57273a8cd502f257125d4", + "sha256:769457243dc4bc902d376cd14c5c7ec234a4faadb4f283dc2738f004cce9a9e1", + "sha256:7a360c18b2cb391fec9585ba1efc55150e2fbc6100308113117dfea521e810d8", + "sha256:7be4efe60e9bddf78ee165a296e80170147282081e1366f0580cf4cc0fb1182f", + "sha256:821c9c640d3dc456c6a7b005e38bc5af05326b6a08ce91a068719934d108a1bb", + "sha256:822dedad93947fcb1096cc41ee8fd32e9f652777561a37c740e5335699f01cea", + "sha256:83bd5aa621b732a0ca1aa3490abd2b010247c4677371a804431935aeedf26e74", + "sha256:88e681c0d17bb285d2ccbb73ae77ef86339b632ee7967044c2284411120b9730", + "sha256:89261fee04715083ef3b5a0d222b094021793c1728b8ff21da361c79f6384095", + "sha256:8ae8480148d696dae49126e97568333fc01493069ad46a94b82f69c7a33197ea", + "sha256:8feffa8396724116be5bc05bf4fcba0c738cbe908c82a95f71371e32b28cd2ca", + "sha256:94acecf2eee13a45f627ed25a28f5a7f2db66b90ff94cd7a1e9cc1ad32cddd43", + "sha256:9788781f57fb732426ae74b9955b899e677ce42b848e60a11be29358fb20c976", + "sha256:9a8b6b3c788a8a6f88f5ce23d729cfde7a2ccebbeb09db0822ef266de0445a27", + "sha256:9b41e0fb3b415beccd6d0c6e5f3ee34b7952cd76120a1db3e45507b83dc5ef81", + "sha256:9d95cce8bb010597b3f2217155befe4708e0538d3548aa08d640ebf54e3f57cb", + "sha256:a34c30e1461da3a69c5bdcfce44418b6f969e1e68ebf367edfa5eaab380abf7a", + "sha256:a468b1b9d5499cbfd0411f5d28adbe651c90508540fdaefb4b7a2171a837a88d", + "sha256:a51f983d91edae7777b5a2af8e5d83224ba01284502c6874a17647ad6cbf0211", + "sha256:a54424050d1eb36edfef913b1bc8552d52a37864c0ea7df3e1e764663e11053a", + "sha256:a550b4ff70d06c15057d75ddad89a3e7c496e0609d28c567c20b61cd1265c0a6", + "sha256:a60f8206818e3582c999c999c799ab068e14f1870ade47d1fe8536dbfd88010b", + "sha256:a7986fb988314fd2225c1ecab45fd457e1f2c097dcc3c0aacd2a7aec7486beb6", + "sha256:ab5c6a521b156edef13a57a6d524903c547573ff8101e3d1bbe9ee1b97267973", + "sha256:aef239c307f3a3f830933d612c0aef4ad4b3aa9ce5233a0954262a00f5c379f1", + "sha256:b10b316413c80a4dcc5228c092a8d019e4b75d4efbca8988cb5b67ae9fa56881", + "sha256:b169507c98b924fd68b82ae366c285daf6d22456835294c329c3226d61e1f69d", + "sha256:b71aab89800fa2eaeb28923ee05e7e56c28dab4ebdba524db06e963431bf6192", + "sha256:beaed1b2d03033dd301a7b67430f03c8255d6856a269c20995a0292de596519e", + "sha256:cb2d5a24586b508f658ddd710f7d4b7e4f5656cb5d569aeb1f432c1c3704347a", + "sha256:cb4c676ab99ca2dd231928d481e19cd540155dff36e70e613179c4927bd520b8", + "sha256:cbe3e356523d0b336543996f92a0e65f760be82447db21c95c60392c8075ff5c", + "sha256:cc2d64b1747efa183ced57b6bce53c9ea8e16e53419e389051b2a214ad0ed051", + "sha256:cfe8646a24856624c1eb7649da99333f0d7e75d9cf7c155ea870957d24b7c63c", + "sha256:d0fd6510c6d67d08ec80d9ba10cd340a8cfb0dd33436c858ed38d4564abb27c7", + "sha256:d40d9a740053cb7fef72442fa7bd699060ff4c710971ebdb8dd7c8b36417570f", + "sha256:d60255f3ed71aa14a2e75383543ca31bd362fdc7f0d2eafc060d85a9051598df", + "sha256:d68bb99bc6a4b0a3eceb95a246f5a0262e600e094b5178c2b1ab0f4bcbae6729", + "sha256:d97668595bf03299148ea968fed2195cc76ad063aeec8161731aa6a5dbc2f675", + "sha256:e0898a77298dc24eef368511d98e551e0b2db293fa9b40c982f4d5ab4d8d2a3a", + "sha256:e1e09bc44a1abbd96f55d15330d6cab80459cb8b06a0b656efd712ce47a3710d", + "sha256:e5786e5926f888ce3a996d38d9c9b8f9306f399edb1f1ca3ce7760dab9b1043c", + "sha256:e69d9869df50dd591228c62fbb3923d6124517d6bfc47a804492813888b497be", + "sha256:e7d182164aebad4e2faf2742ee7486d4af73d933461adbd8f183ac9b1837323c", + "sha256:eb4f1fe110332651c00d2df160978cf1be70896ed9e612ff7c7e67955091b2c4", + "sha256:ee081375d10fa2f3f7b0d050c8b9c1ae23190e1d9be256035bf8a41059c4df3a", + "sha256:f307632f3eaa676f8c2f5df11e4c00ad47dfa79b06cb2fa39156a4e9c6821bdb", + "sha256:f37ece590451ecffc815f2eb41f07191d1a31a0404361d1ae2ed532e05c86da4" ], - "markers": "python_version >= '3.8'", - "version": "==3.10.10" + "markers": "python_version >= '3.9'", + "version": "==3.11.4" }, "aiosignal": { "hashes": [ @@ -147,11 +132,11 @@ }, "blinker": { "hashes": [ - "sha256:1779309f71bf239144b9399d06ae925637cf6634cf6bd131104184531bf67c01", - "sha256:8f77b09d3bf7c795e969e9486f39c2c5e9c39d4ee07424be2bc594ece9642d83" + "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", + "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc" ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" + "markers": "python_version >= '3.9'", + "version": "==1.9.0" }, "certifi": { "hashes": [ @@ -678,11 +663,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pandas": { "hashes": [ @@ -1078,11 +1063,11 @@ }, "werkzeug": { "hashes": [ - "sha256:4f7d1a5de312c810a8a2c6f0b47e9f6a7cffb7c8322def35e4d4d9841ff85597", - "sha256:f471a4cd167233077e9d2a8190c3471c5bc520c636a9e3c1e9300c33bced03bc" + "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e", + "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746" ], "markers": "python_version >= '3.9'", - "version": "==3.1.2" + "version": "==3.1.3" }, "wrapt": { "hashes": [ @@ -1162,162 +1147,162 @@ }, "yarl": { "hashes": [ - "sha256:06157fb3c58f2736a5e47c8fcbe1afc8b5de6fb28b14d25574af9e62150fcaac", - "sha256:067a63fcfda82da6b198fa73079b1ca40b7c9b7994995b6ee38acda728b64d47", - "sha256:0b1794853124e2f663f0ea54efb0340b457f08d40a1cef78edfa086576179c91", - "sha256:0bdff5e0995522706c53078f531fb586f56de9c4c81c243865dd5c66c132c3b5", - "sha256:117ed8b3732528a1e41af3aa6d4e08483c2f0f2e3d3d7dca7cf538b3516d93df", - "sha256:14bc88baa44e1f84164a392827b5defb4fa8e56b93fecac3d15315e7c8e5d8b3", - "sha256:1654ec814b18be1af2c857aa9000de7a601400bd4c9ca24629b18486c2e35463", - "sha256:16bca6678a83657dd48df84b51bd56a6c6bd401853aef6d09dc2506a78484c7b", - "sha256:1a3b91c44efa29e6c8ef8a9a2b583347998e2ba52c5d8280dbd5919c02dfc3b5", - "sha256:1a52a1ffdd824fb1835272e125385c32fd8b17fbdefeedcb4d543cc23b332d74", - "sha256:1ce36ded585f45b1e9bb36d0ae94765c6608b43bd2e7f5f88079f7a85c61a4d3", - "sha256:299f11b44d8d3a588234adbe01112126010bd96d9139c3ba7b3badd9829261c3", - "sha256:2b24ec55fad43e476905eceaf14f41f6478780b870eda5d08b4d6de9a60b65b4", - "sha256:2d374d70fdc36f5863b84e54775452f68639bc862918602d028f89310a034ab0", - "sha256:2d9f0606baaec5dd54cb99667fcf85183a7477f3766fbddbe3f385e7fc253299", - "sha256:2e7ba4c9377e48fb7b20dedbd473cbcbc13e72e1826917c185157a137dac9df2", - "sha256:2f0a6423295a0d282d00e8701fe763eeefba8037e984ad5de44aa349002562ac", - "sha256:327828786da2006085a4d1feb2594de6f6d26f8af48b81eb1ae950c788d97f61", - "sha256:380e6c38ef692b8fd5a0f6d1fa8774d81ebc08cfbd624b1bca62a4d4af2f9931", - "sha256:3b74ff4767d3ef47ffe0cd1d89379dc4d828d4873e5528976ced3b44fe5b0a21", - "sha256:3e844be8d536afa129366d9af76ed7cb8dfefec99f5f1c9e4f8ae542279a6dc3", - "sha256:459e81c2fb920b5f5df744262d1498ec2c8081acdcfe18181da44c50f51312f7", - "sha256:46ddf6e0b975cd680eb83318aa1d321cb2bf8d288d50f1754526230fcf59ba96", - "sha256:482c122b72e3c5ec98f11457aeb436ae4aecca75de19b3d1de7cf88bc40db82f", - "sha256:561c87fea99545ef7d692403c110b2f99dced6dff93056d6e04384ad3bc46243", - "sha256:578d00c9b7fccfa1745a44f4eddfdc99d723d157dad26764538fbdda37209857", - "sha256:58c8e9620eb82a189c6c40cb6b59b4e35b2ee68b1f2afa6597732a2b467d7e8f", - "sha256:5b29beab10211a746f9846baa39275e80034e065460d99eb51e45c9a9495bcca", - "sha256:5d1d42556b063d579cae59e37a38c61f4402b47d70c29f0ef15cee1acaa64488", - "sha256:5f236cb5999ccd23a0ab1bd219cfe0ee3e1c1b65aaf6dd3320e972f7ec3a39da", - "sha256:62a91aefff3d11bf60e5956d340eb507a983a7ec802b19072bb989ce120cd948", - "sha256:64cc6e97f14cf8a275d79c5002281f3040c12e2e4220623b5759ea7f9868d6a5", - "sha256:6f4c9156c4d1eb490fe374fb294deeb7bc7eaccda50e23775b2354b6a6739934", - "sha256:7294e38f9aa2e9f05f765b28ffdc5d81378508ce6dadbe93f6d464a8c9594473", - "sha256:7615058aabad54416ddac99ade09a5510cf77039a3b903e94e8922f25ed203d7", - "sha256:7e48cdb8226644e2fbd0bdb0a0f87906a3db07087f4de77a1b1b1ccfd9e93685", - "sha256:7f63d176a81555984e91f2c84c2a574a61cab7111cc907e176f0f01538e9ff6e", - "sha256:7f6595c852ca544aaeeb32d357e62c9c780eac69dcd34e40cae7b55bc4fb1147", - "sha256:7fac95714b09da9278a0b52e492466f773cfe37651cf467a83a1b659be24bf71", - "sha256:81713b70bea5c1386dc2f32a8f0dab4148a2928c7495c808c541ee0aae614d67", - "sha256:846dd2e1243407133d3195d2d7e4ceefcaa5f5bf7278f0a9bda00967e6326b04", - "sha256:84c063af19ef5130084db70ada40ce63a84f6c1ef4d3dbc34e5e8c4febb20822", - "sha256:881764d610e3269964fc4bb3c19bb6fce55422828e152b885609ec176b41cf11", - "sha256:8994b29c462de9a8fce2d591028b986dbbe1b32f3ad600b2d3e1c482c93abad6", - "sha256:8c79e9d7e3d8a32d4824250a9c6401194fb4c2ad9a0cec8f6a96e09a582c2cc0", - "sha256:8ee427208c675f1b6e344a1f89376a9613fc30b52646a04ac0c1f6587c7e46ec", - "sha256:949681f68e0e3c25377462be4b658500e85ca24323d9619fdc41f68d46a1ffda", - "sha256:9e275792097c9f7e80741c36de3b61917aebecc08a67ae62899b074566ff8556", - "sha256:9fb815155aac6bfa8d86184079652c9715c812d506b22cfa369196ef4e99d1b4", - "sha256:a2a64e62c7a0edd07c1c917b0586655f3362d2c2d37d474db1a509efb96fea1c", - "sha256:a7ac5b4984c468ce4f4a553df281450df0a34aefae02e58d77a0847be8d1e11f", - "sha256:aa46dce75078fceaf7cecac5817422febb4355fbdda440db55206e3bd288cfb8", - "sha256:ae3476e934b9d714aa8000d2e4c01eb2590eee10b9d8cd03e7983ad65dfbfcba", - "sha256:b0341e6d9a0c0e3cdc65857ef518bb05b410dbd70d749a0d33ac0f39e81a4258", - "sha256:b40d1bf6e6f74f7c0a567a9e5e778bbd4699d1d3d2c0fe46f4b717eef9e96b95", - "sha256:b5c4804e4039f487e942c13381e6c27b4b4e66066d94ef1fae3f6ba8b953f383", - "sha256:b5d6a6c9602fd4598fa07e0389e19fe199ae96449008d8304bf5d47cb745462e", - "sha256:b5f1ac7359e17efe0b6e5fec21de34145caef22b260e978336f325d5c84e6938", - "sha256:c0167540094838ee9093ef6cc2c69d0074bbf84a432b4995835e8e5a0d984374", - "sha256:c180ac742a083e109c1a18151f4dd8675f32679985a1c750d2ff806796165b55", - "sha256:c73df5b6e8fabe2ddb74876fb82d9dd44cbace0ca12e8861ce9155ad3c886139", - "sha256:c7e177c619342e407415d4f35dec63d2d134d951e24b5166afcdfd1362828e17", - "sha256:cbad927ea8ed814622305d842c93412cb47bd39a496ed0f96bfd42b922b4a217", - "sha256:cc353841428d56b683a123a813e6a686e07026d6b1c5757970a877195f880c2d", - "sha256:cc7c92c1baa629cb03ecb0c3d12564f172218fb1739f54bf5f3881844daadc6d", - "sha256:cc7d768260f4ba4ea01741c1b5fe3d3a6c70eb91c87f4c8761bbcce5181beafe", - "sha256:d0eea830b591dbc68e030c86a9569826145df485b2b4554874b07fea1275a199", - "sha256:d216e5d9b8749563c7f2c6f7a0831057ec844c68b4c11cb10fc62d4fd373c26d", - "sha256:d401f07261dc5aa36c2e4efc308548f6ae943bfff20fcadb0a07517a26b196d8", - "sha256:d6324274b4e0e2fa1b3eccb25997b1c9ed134ff61d296448ab8269f5ac068c4c", - "sha256:d8a8b74d843c2638f3864a17d97a4acda58e40d3e44b6303b8cc3d3c44ae2d29", - "sha256:d9b6b28a57feb51605d6ae5e61a9044a31742db557a3b851a74c13bc61de5172", - "sha256:de599af166970d6a61accde358ec9ded821234cbbc8c6413acfec06056b8e860", - "sha256:e594b22688d5747b06e957f1ef822060cb5cb35b493066e33ceac0cf882188b7", - "sha256:e5b078134f48552c4d9527db2f7da0b5359abd49393cdf9794017baec7506170", - "sha256:eb6dce402734575e1a8cc0bb1509afca508a400a57ce13d306ea2c663bad1138", - "sha256:f1790a4b1e8e8e028c391175433b9c8122c39b46e1663228158e61e6f915bf06", - "sha256:f5efe0661b9fcd6246f27957f6ae1c0eb29bc60552820f01e970b4996e016004", - "sha256:f9cbfbc5faca235fbdf531b93aa0f9f005ec7d267d9d738761a4d42b744ea159", - "sha256:fbea1751729afe607d84acfd01efd95e3b31db148a181a441984ce9b3d3469da", - "sha256:fca4b4307ebe9c3ec77a084da3a9d1999d164693d16492ca2b64594340999988", - "sha256:ff5c6771c7e3511a06555afa317879b7db8d640137ba55d6ab0d0c50425cab75" + "sha256:0c8e589379ef0407b10bed16cc26e7392ef8f86961a706ade0a22309a45414d7", + "sha256:0d41c684f286ce41fa05ab6af70f32d6da1b6f0457459a56cf9e393c1c0b2217", + "sha256:1056cadd5e850a1c026f28e0704ab0a94daaa8f887ece8dfed30f88befb87bb0", + "sha256:11d86c6145ac5c706c53d484784cf504d7d10fa407cb73b9d20f09ff986059ef", + "sha256:170ed4971bf9058582b01a8338605f4d8c849bd88834061e60e83b52d0c76870", + "sha256:17791acaa0c0f89323c57da7b9a79f2174e26d5debbc8c02d84ebd80c2b7bff8", + "sha256:17931dfbb84ae18b287279c1f92b76a3abcd9a49cd69b92e946035cff06bcd20", + "sha256:18662443c6c3707e2fc7fad184b4dc32dd428710bbe72e1bce7fe1988d4aa654", + "sha256:187df91395c11e9f9dc69b38d12406df85aa5865f1766a47907b1cc9855b6303", + "sha256:1fee66b32e79264f428dc8da18396ad59cc48eef3c9c13844adec890cd339db5", + "sha256:2270d590997445a0dc29afa92e5534bfea76ba3aea026289e811bf9ed4b65a7f", + "sha256:2654caaf5584449d49c94a6b382b3cb4a246c090e72453493ea168b931206a4d", + "sha256:26bfb6226e0c157af5da16d2d62258f1ac578d2899130a50433ffee4a5dfa673", + "sha256:2941756754a10e799e5b87e2319bbec481ed0957421fba0e7b9fb1c11e40509f", + "sha256:3294f787a437cb5d81846de3a6697f0c35ecff37a932d73b1fe62490bef69211", + "sha256:358dc7ddf25e79e1cc8ee16d970c23faee84d532b873519c5036dbb858965795", + "sha256:38bc4ed5cae853409cb193c87c86cd0bc8d3a70fd2268a9807217b9176093ac6", + "sha256:3a0baff7827a632204060f48dca9e63fbd6a5a0b8790c1a2adfb25dc2c9c0d50", + "sha256:3a3ede8c248f36b60227eb777eac1dbc2f1022dc4d741b177c4379ca8e75571a", + "sha256:3a58a2f2ca7aaf22b265388d40232f453f67a6def7355a840b98c2d547bd037f", + "sha256:4434b739a8a101a837caeaa0137e0e38cb4ea561f39cb8960f3b1e7f4967a3fc", + "sha256:460024cacfc3246cc4d9f47a7fc860e4fcea7d1dc651e1256510d8c3c9c7cde0", + "sha256:46c465ad06971abcf46dd532f77560181387b4eea59084434bdff97524444032", + "sha256:48e424347a45568413deec6f6ee2d720de2cc0385019bedf44cd93e8638aa0ed", + "sha256:4a8c83f6fcdc327783bdc737e8e45b2e909b7bd108c4da1892d3bc59c04a6d84", + "sha256:4c840cc11163d3c01a9d8aad227683c48cd3e5be5a785921bcc2a8b4b758c4f3", + "sha256:4d486ddcaca8c68455aa01cf53d28d413fb41a35afc9f6594a730c9779545876", + "sha256:4e76381be3d8ff96a4e6c77815653063e87555981329cf8f85e5be5abf449021", + "sha256:50d866f7b1a3f16f98603e095f24c0eeba25eb508c85a2c5939c8b3870ba2df8", + "sha256:52492b87d5877ec405542f43cd3da80bdcb2d0c2fbc73236526e5f2c28e6db28", + "sha256:56afb44a12b0864d17b597210d63a5b88915d680f6484d8d202ed68ade38673d", + "sha256:585ce7cd97be8f538345de47b279b879e091c8b86d9dbc6d98a96a7ad78876a3", + "sha256:5870d620b23b956f72bafed6a0ba9a62edb5f2ef78a8849b7615bd9433384171", + "sha256:5c6ea72fe619fee5e6b5d4040a451d45d8175f560b11b3d3e044cd24b2720526", + "sha256:688058e89f512fb7541cb85c2f149c292d3fa22f981d5a5453b40c5da49eb9e8", + "sha256:6a3f47930fbbed0f6377639503848134c4aa25426b08778d641491131351c2c8", + "sha256:6b981316fcd940f085f646b822c2ff2b8b813cbd61281acad229ea3cbaabeb6b", + "sha256:734144cd2bd633a1516948e477ff6c835041c0536cef1d5b9a823ae29899665b", + "sha256:736bb076f7299c5c55dfef3eb9e96071a795cb08052822c2bb349b06f4cb2e0a", + "sha256:752485cbbb50c1e20908450ff4f94217acba9358ebdce0d8106510859d6eb19a", + "sha256:753eaaa0c7195244c84b5cc159dc8204b7fd99f716f11198f999f2332a86b178", + "sha256:75ac158560dec3ed72f6d604c81090ec44529cfb8169b05ae6fcb3e986b325d9", + "sha256:76499469dcc24759399accd85ec27f237d52dec300daaca46a5352fcbebb1071", + "sha256:782ca9c58f5c491c7afa55518542b2b005caedaf4685ec814fadfcee51f02493", + "sha256:792155279dc093839e43f85ff7b9b6493a8eaa0af1f94f1f9c6e8f4de8c63500", + "sha256:7a1606ba68e311576bcb1672b2a1543417e7e0aa4c85e9e718ba6466952476c0", + "sha256:8281db240a1616af2f9c5f71d355057e73a1409c4648c8949901396dc0a3c151", + "sha256:871e1b47eec7b6df76b23c642a81db5dd6536cbef26b7e80e7c56c2fd371382e", + "sha256:8b9c4643e7d843a0dca9cd9d610a0876e90a1b2cbc4c5ba7930a0d90baf6903f", + "sha256:8c6d5fed96f0646bfdf698b0a1cebf32b8aae6892d1bec0c5d2d6e2df44e1e2d", + "sha256:8e1bf59e035534ba4077f5361d8d5d9194149f9ed4f823d1ee29ef3e8964ace3", + "sha256:8fd51299e21da709eabcd5b2dd60e39090804431292daacbee8d3dabe39a6bc0", + "sha256:91c012dceadc695ccf69301bfdccd1fc4472ad714fe2dd3c5ab4d2046afddf29", + "sha256:93771146ef048b34201bfa382c2bf74c524980870bb278e6df515efaf93699ff", + "sha256:93d1c8cc5bf5df401015c5e2a3ce75a5254a9839e5039c881365d2a9dcfc6dc2", + "sha256:9611b83810a74a46be88847e0ea616794c406dbcb4e25405e52bff8f4bee2d0a", + "sha256:9bc27dd5cfdbe3dc7f381b05e6260ca6da41931a6e582267d5ca540270afeeb2", + "sha256:ac8eda86cc75859093e9ce390d423aba968f50cf0e481e6c7d7d63f90bae5c9c", + "sha256:bc3003710e335e3f842ae3fd78efa55f11a863a89a72e9a07da214db3bf7e1f8", + "sha256:bc61b005f6521fcc00ca0d1243559a5850b9dd1e1fe07b891410ee8fe192d0c0", + "sha256:be4c7b1c49d9917c6e95258d3d07f43cfba2c69a6929816e77daf322aaba6628", + "sha256:c019abc2eca67dfa4d8fb72ba924871d764ec3c92b86d5b53b405ad3d6aa56b0", + "sha256:c42774d1d1508ec48c3ed29e7b110e33f5e74a20957ea16197dbcce8be6b52ba", + "sha256:c556fbc6820b6e2cda1ca675c5fa5589cf188f8da6b33e9fc05b002e603e44fa", + "sha256:c6e659b9a24d145e271c2faf3fa6dd1fcb3e5d3f4e17273d9e0350b6ab0fe6e2", + "sha256:c74f0b0472ac40b04e6d28532f55cac8090e34c3e81f118d12843e6df14d0909", + "sha256:cd7e35818d2328b679a13268d9ea505c85cd773572ebb7a0da7ccbca77b6a52e", + "sha256:d17832ba39374134c10e82d137e372b5f7478c4cceeb19d02ae3e3d1daed8721", + "sha256:d1fa68a3c921365c5745b4bd3af6221ae1f0ea1bf04b69e94eda60e57958907f", + "sha256:d63123bfd0dce5f91101e77c8a5427c3872501acece8c90df457b486bc1acd47", + "sha256:da9d3061e61e5ae3f753654813bc1cd1c70e02fb72cf871bd6daf78443e9e2b1", + "sha256:db5ac3871ed76340210fe028f535392f097fb31b875354bcb69162bba2632ef4", + "sha256:dd7abf4f717e33b7487121faf23560b3a50924f80e4bef62b22dab441ded8f3b", + "sha256:dd90238d3a77a0e07d4d6ffdebc0c21a9787c5953a508a2231b5f191455f31e9", + "sha256:ef6eee1a61638d29cd7c85f7fd3ac7b22b4c0fabc8fd00a712b727a3e73b0685", + "sha256:f11fd61d72d93ac23718d393d2a64469af40be2116b24da0a4ca6922df26807e", + "sha256:f1e7fedb09c059efee2533119666ca7e1a2610072076926fa028c2ba5dfeb78c", + "sha256:f25b7e93f5414b9a983e1a6c1820142c13e1782cc9ed354c25e933aebe97fcf2", + "sha256:f2f44a4247461965fed18b2573f3a9eb5e2c3cad225201ee858726cde610daca", + "sha256:f5ffc6b7ace5b22d9e73b2a4c7305740a339fbd55301d52735f73e21d9eb3130", + "sha256:ff6af03cac0d1a4c3c19e5dcc4c05252411bf44ccaa2485e20d0a7c77892ab6e", + "sha256:ff8d95e06546c3a8c188f68040e9d0360feb67ba8498baf018918f669f7bc39b" ], "markers": "python_version >= '3.9'", - "version": "==1.17.1" + "version": "==1.17.2" } }, "develop": { "coverage": { "hashes": [ - "sha256:00a1d69c112ff5149cabe60d2e2ee948752c975d95f1e1096742e6077affd376", - "sha256:023bf8ee3ec6d35af9c1c6ccc1d18fa69afa1cb29eaac57cb064dbb262a517f9", - "sha256:0294ca37f1ba500667b1aef631e48d875ced93ad5e06fa665a3295bdd1d95111", - "sha256:06babbb8f4e74b063dbaeb74ad68dfce9186c595a15f11f5d5683f748fa1d172", - "sha256:0809082ee480bb8f7416507538243c8863ac74fd8a5d2485c46f0f7499f2b491", - "sha256:0b3fb02fe73bed561fa12d279a417b432e5b50fe03e8d663d61b3d5990f29546", - "sha256:0b58c672d14f16ed92a48db984612f5ce3836ae7d72cdd161001cc54512571f2", - "sha256:0bcd1069e710600e8e4cf27f65c90c7843fa8edfb4520fb0ccb88894cad08b11", - "sha256:1032e178b76a4e2b5b32e19d0fd0abbce4b58e77a1ca695820d10e491fa32b08", - "sha256:11a223a14e91a4693d2d0755c7a043db43d96a7450b4f356d506c2562c48642c", - "sha256:12394842a3a8affa3ba62b0d4ab7e9e210c5e366fbac3e8b2a68636fb19892c2", - "sha256:182e6cd5c040cec0a1c8d415a87b67ed01193ed9ad458ee427741c7d8513d963", - "sha256:1d5b8007f81b88696d06f7df0cb9af0d3b835fe0c8dbf489bad70b45f0e45613", - "sha256:1f76846299ba5c54d12c91d776d9605ae33f8ae2b9d1d3c3703cf2db1a67f2c0", - "sha256:27fb4a050aaf18772db513091c9c13f6cb94ed40eacdef8dad8411d92d9992db", - "sha256:29155cd511ee058e260db648b6182c419422a0d2e9a4fa44501898cf918866cf", - "sha256:29fc0f17b1d3fea332f8001d4558f8214af7f1d87a345f3a133c901d60347c73", - "sha256:2b6b4c83d8e8ea79f27ab80778c19bc037759aea298da4b56621f4474ffeb117", - "sha256:2fdef0d83a2d08d69b1f2210a93c416d54e14d9eb398f6ab2f0a209433db19e1", - "sha256:3c65d37f3a9ebb703e710befdc489a38683a5b152242664b973a7b7b22348a4e", - "sha256:4f704f0998911abf728a7783799444fcbbe8261c4a6c166f667937ae6a8aa522", - "sha256:51b44306032045b383a7a8a2c13878de375117946d68dcb54308111f39775a25", - "sha256:53d202fd109416ce011578f321460795abfe10bb901b883cafd9b3ef851bacfc", - "sha256:58809e238a8a12a625c70450b48e8767cff9eb67c62e6154a642b21ddf79baea", - "sha256:5915fcdec0e54ee229926868e9b08586376cae1f5faa9bbaf8faf3561b393d52", - "sha256:5beb1ee382ad32afe424097de57134175fea3faf847b9af002cc7895be4e2a5a", - "sha256:5f8ae553cba74085db385d489c7a792ad66f7f9ba2ee85bfa508aeb84cf0ba07", - "sha256:5fbd612f8a091954a0c8dd4c0b571b973487277d26476f8480bfa4b2a65b5d06", - "sha256:6bd818b7ea14bc6e1f06e241e8234508b21edf1b242d49831831a9450e2f35fa", - "sha256:6f01ba56b1c0e9d149f9ac85a2f999724895229eb36bd997b61e62999e9b0901", - "sha256:73d2b73584446e66ee633eaad1a56aad577c077f46c35ca3283cd687b7715b0b", - "sha256:7bb92c539a624cf86296dd0c68cd5cc286c9eef2d0c3b8b192b604ce9de20a17", - "sha256:8165b796df0bd42e10527a3f493c592ba494f16ef3c8b531288e3d0d72c1f6f0", - "sha256:862264b12ebb65ad8d863d51f17758b1684560b66ab02770d4f0baf2ff75da21", - "sha256:8902dd6a30173d4ef09954bfcb24b5d7b5190cf14a43170e386979651e09ba19", - "sha256:8cf717ee42012be8c0cb205dbbf18ffa9003c4cbf4ad078db47b95e10748eec5", - "sha256:8ed9281d1b52628e81393f5eaee24a45cbd64965f41857559c2b7ff19385df51", - "sha256:99b41d18e6b2a48ba949418db48159d7a2e81c5cc290fc934b7d2380515bd0e3", - "sha256:9cb7fa111d21a6b55cbf633039f7bc2749e74932e3aa7cb7333f675a58a58bf3", - "sha256:a181e99301a0ae128493a24cfe5cfb5b488c4e0bf2f8702091473d033494d04f", - "sha256:a413a096c4cbac202433c850ee43fa326d2e871b24554da8327b01632673a076", - "sha256:a6b1e54712ba3474f34b7ef7a41e65bd9037ad47916ccb1cc78769bae324c01a", - "sha256:ade3ca1e5f0ff46b678b66201f7ff477e8fa11fb537f3b55c3f0568fbfe6e718", - "sha256:b0ac3d42cb51c4b12df9c5f0dd2f13a4f24f01943627120ec4d293c9181219ba", - "sha256:b369ead6527d025a0fe7bd3864e46dbee3aa8f652d48df6174f8d0bac9e26e0e", - "sha256:b57b768feb866f44eeed9f46975f3d6406380275c5ddfe22f531a2bf187eda27", - "sha256:b8d3a03d9bfcaf5b0141d07a88456bb6a4c3ce55c080712fec8418ef3610230e", - "sha256:bc66f0bf1d7730a17430a50163bb264ba9ded56739112368ba985ddaa9c3bd09", - "sha256:bf20494da9653f6410213424f5f8ad0ed885e01f7e8e59811f572bdb20b8972e", - "sha256:c48167910a8f644671de9f2083a23630fbf7a1cb70ce939440cd3328e0919f70", - "sha256:c481b47f6b5845064c65a7bc78bc0860e635a9b055af0df46fdf1c58cebf8e8f", - "sha256:c7c8b95bf47db6d19096a5e052ffca0a05f335bc63cef281a6e8fe864d450a72", - "sha256:c9b8e184898ed014884ca84c70562b4a82cbc63b044d366fedc68bc2b2f3394a", - "sha256:cc8ff50b50ce532de2fa7a7daae9dd12f0a699bfcd47f20945364e5c31799fef", - "sha256:d541423cdd416b78626b55f123412fcf979d22a2c39fce251b350de38c15c15b", - "sha256:dab4d16dfef34b185032580e2f2f89253d302facba093d5fa9dbe04f569c4f4b", - "sha256:dacbc52de979f2823a819571f2e3a350a7e36b8cb7484cdb1e289bceaf35305f", - "sha256:df57bdbeffe694e7842092c5e2e0bc80fff7f43379d465f932ef36f027179806", - "sha256:ed8fe9189d2beb6edc14d3ad19800626e1d9f2d975e436f84e19efb7fa19469b", - "sha256:f3ddf056d3ebcf6ce47bdaf56142af51bb7fad09e4af310241e9db7a3a8022e1", - "sha256:f8fe4984b431f8621ca53d9380901f62bfb54ff759a1348cd140490ada7b693c", - "sha256:fe439416eb6380de434886b00c859304338f8b19f6f54811984f3420a2e03858" + "sha256:0266b62cbea568bd5e93a4da364d05de422110cbed5056d69339bd5af5685433", + "sha256:0573f5cbf39114270842d01872952d301027d2d6e2d84013f30966313cadb529", + "sha256:0ddcb70b3a3a57581b450571b31cb774f23eb9519c2aaa6176d3a84c9fc57671", + "sha256:108bb458827765d538abcbf8288599fee07d2743357bdd9b9dad456c287e121e", + "sha256:14045b8bfd5909196a90da145a37f9d335a5d988a83db34e80f41e965fb7cb42", + "sha256:1a5407a75ca4abc20d6252efeb238377a71ce7bda849c26c7a9bece8680a5d99", + "sha256:2bc3e45c16564cc72de09e37413262b9f99167803e5e48c6156bccdfb22c8327", + "sha256:2d608a7808793e3615e54e9267519351c3ae204a6d85764d8337bd95993581a8", + "sha256:34d23e28ccb26236718a3a78ba72744212aa383141961dd6825f6595005c8b06", + "sha256:37a15573f988b67f7348916077c6d8ad43adb75e478d0910957394df397d2874", + "sha256:3c0317288f032221d35fa4cbc35d9f4923ff0dfd176c79c9b356e8ef8ef2dff4", + "sha256:3c42ec2c522e3ddd683dec5cdce8e62817afb648caedad9da725001fa530d354", + "sha256:3c6b24007c4bcd0b19fac25763a7cac5035c735ae017e9a349b927cfc88f31c1", + "sha256:40cca284c7c310d622a1677f105e8507441d1bb7c226f41978ba7c86979609ab", + "sha256:46f21663e358beae6b368429ffadf14ed0a329996248a847a4322fb2e35d64d3", + "sha256:49ed5ee4109258973630c1f9d099c7e72c5c36605029f3a91fe9982c6076c82b", + "sha256:5c95e0fa3d1547cb6f021ab72f5c23402da2358beec0a8e6d19a368bd7b0fb37", + "sha256:5dd4e4a49d9c72a38d18d641135d2fb0bdf7b726ca60a103836b3d00a1182acd", + "sha256:5e444b8e88339a2a67ce07d41faabb1d60d1004820cee5a2c2b54e2d8e429a0f", + "sha256:60dcf7605c50ea72a14490d0756daffef77a5be15ed1b9fea468b1c7bda1bc3b", + "sha256:623e6965dcf4e28a3debaa6fcf4b99ee06d27218f46d43befe4db1c70841551c", + "sha256:673184b3156cba06154825f25af33baa2671ddae6343f23175764e65a8c4c30b", + "sha256:6cf96ceaa275f071f1bea3067f8fd43bec184a25a962c754024c973af871e1b7", + "sha256:70a56a2ec1869e6e9fa69ef6b76b1a8a7ef709972b9cc473f9ce9d26b5997ce3", + "sha256:77256ad2345c29fe59ae861aa11cfc74579c88d4e8dbf121cbe46b8e32aec808", + "sha256:796c9b107d11d2d69e1849b2dfe41730134b526a49d3acb98ca02f4985eeff7a", + "sha256:7c07de0d2a110f02af30883cd7dddbe704887617d5c27cf373362667445a4c76", + "sha256:7e61b0e77ff4dddebb35a0e8bb5a68bf0f8b872407d8d9f0c726b65dfabe2469", + "sha256:82c809a62e953867cf57e0548c2b8464207f5f3a6ff0e1e961683e79b89f2c55", + "sha256:850cfd2d6fc26f8346f422920ac204e1d28814e32e3a58c19c91980fa74d8289", + "sha256:87ea64b9fa52bf395272e54020537990a28078478167ade6c61da7ac04dc14bc", + "sha256:90746521206c88bdb305a4bf3342b1b7316ab80f804d40c536fc7d329301ee13", + "sha256:951aade8297358f3618a6e0660dc74f6b52233c42089d28525749fc8267dccd2", + "sha256:963e4a08cbb0af6623e61492c0ec4c0ec5c5cf74db5f6564f98248d27ee57d30", + "sha256:987a8e3da7da4eed10a20491cf790589a8e5e07656b6dc22d3814c4d88faf163", + "sha256:9c2eb378bebb2c8f65befcb5147877fc1c9fbc640fc0aad3add759b5df79d55d", + "sha256:a1ab9763d291a17b527ac6fd11d1a9a9c358280adb320e9c2672a97af346ac2c", + "sha256:a3b925300484a3294d1c70f6b2b810d6526f2929de954e5b6be2bf8caa1f12c1", + "sha256:acbb8af78f8f91b3b51f58f288c0994ba63c646bc1a8a22ad072e4e7e0a49f1c", + "sha256:ad32a981bcdedb8d2ace03b05e4fd8dace8901eec64a532b00b15217d3677dd2", + "sha256:aee9cf6b0134d6f932d219ce253ef0e624f4fa588ee64830fcba193269e4daa3", + "sha256:af05bbba896c4472a29408455fe31b3797b4d8648ed0a2ccac03e074a77e2314", + "sha256:b6cce5c76985f81da3769c52203ee94722cd5d5889731cd70d31fee939b74bf0", + "sha256:bb684694e99d0b791a43e9fc0fa58efc15ec357ac48d25b619f207c41f2fd384", + "sha256:c132b5a22821f9b143f87446805e13580b67c670a548b96da945a8f6b4f2efbb", + "sha256:c296263093f099da4f51b3dff1eff5d4959b527d4f2f419e16508c5da9e15e8c", + "sha256:c973b2fe4dc445cb865ab369df7521df9c27bf40715c837a113edaa2aa9faf45", + "sha256:cdd94501d65adc5c24f8a1a0eda110452ba62b3f4aeaba01e021c1ed9cb8f34a", + "sha256:d79d4826e41441c9a118ff045e4bccb9fdbdcb1d02413e7ea6eb5c87b5439d24", + "sha256:dbba8210f5067398b2c4d96b4e64d8fb943644d5eb70be0d989067c8ca40c0f8", + "sha256:df002e59f2d29e889c37abd0b9ee0d0e6e38c24f5f55d71ff0e09e3412a340ec", + "sha256:dfd14bcae0c94004baba5184d1c935ae0d1231b8409eb6c103a5fd75e8ecdc56", + "sha256:e25bacb53a8c7325e34d45dddd2f2fbae0dbc230d0e2642e264a64e17322a777", + "sha256:e2c8e3384c12dfa19fa9a52f23eb091a8fad93b5b81a41b14c17c78e23dd1d8b", + "sha256:e5f2a0f161d126ccc7038f1f3029184dbdf8f018230af17ef6fd6a707a5b881f", + "sha256:e69ad502f1a2243f739f5bd60565d14a278be58be4c137d90799f2c263e7049a", + "sha256:ead9b9605c54d15be228687552916c89c9683c215370c4a44f1f217d2adcc34d", + "sha256:f07ff574986bc3edb80e2c36391678a271d555f91fd1d332a1e0f4b5ea4b6ea9", + "sha256:f2c7a045eef561e9544359a0bf5784b44e55cefc7261a20e730baa9220c83413", + "sha256:f3e8796434a8106b3ac025fd15417315d7a58ee3e600ad4dbcfddc3f4b14342c", + "sha256:f63e21ed474edd23f7501f89b53280014436e383a14b9bd77a648366c81dce7b", + "sha256:fd49c01e5057a451c30c9b892948976f5d38f2cbd04dc556a82743ba8e27ed8c" ], "index": "pypi", "markers": "python_version >= '3.9'", - "version": "==7.6.4" + "version": "==7.6.7" }, "iniconfig": { "hashes": [ @@ -1329,11 +1314,11 @@ }, "packaging": { "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" + "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759", + "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f" ], "markers": "python_version >= '3.8'", - "version": "==24.1" + "version": "==24.2" }, "pluggy": { "hashes": [ diff --git a/dbrepo-search-service/init/lib/dbrepo-1.5.2.tar.gz b/dbrepo-search-service/init/lib/dbrepo-1.5.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b3bf6edf397fecc982380b4d0fef711462110b56 GIT binary patch literal 39300 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ℜ`aeH}P?J0jVE)RL(c9}1;jvxB_W{2&J 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 Y9slQ%`2M&TU;i^YC2UV(s9<FP0PG-i1poj5 literal 0 HcmV?d00001 diff --git a/dbrepo-search-service/lib/dbrepo-1.5.2.tar.gz b/dbrepo-search-service/lib/dbrepo-1.5.2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b3bf6edf397fecc982380b4d0fef711462110b56 GIT binary patch literal 39300 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ℜ`aeH}P?J0jVE)RL(c9}1;jvxB_W{2&J zw3lVaqSV)#pM4!%_-~?tuC}Db{9~^!n?8$>5t46WF?#mPS&>!q^VIMorB#YM4W~R6 zn!WeO!byAy%;r+dru7}S6Ya70d-{oCpUDf&EgVWdS8LxG#%@YklDRo@&$`dk&b{#r z@7Y>&!n-&~XwIg~>xzU{FS=M8As@Vd-~Ytg|A&A5oBwtBpWpHhyLMC*mr9m9`0W1w z{DDE~|MRE!9{&25fAx<K)uMIZ4gLFKzc{!Auq&;QZq(L`^O(&io_zV`g{RMT-Lyk< zmi)VZ?x<z`gbT~pGh1mpBwuw@z0h%@V7pZQ)amMBkLEsmd#?4{<A?9&9Xq7AfZ<Q_ z&soW{DtLdLZP|4_;{QY~J-#pE?Z3i5hTNR>?B1VqiHfQj47!mEj=jj}J+M2<#A@k` zqHwDzE2H<FPFT5YUC{T#hCOzz{Zex?cZZ5^P!Kuaw|U*u|55+egNWr%{;S^!J$U8d z)6fRZPydhpTRolg=l`tt9};x`hku-?8J#>M>$AiYF>l+<&Y%ACGTA5Hdc0KgF3ZwQ ziM%Hi1vB2vS{`k4KQHH-A<KnQA@=hRUw+*<o8iLRE5BH_?X};VU1-SAT643a<u^-z zS^M!7!Y}%|A5IQgwcxT?+#{px{%2;>u9X~aNc`>nwc75u!$RY(n^)!5JP<SJ+Qr{@ zd&w`?xjPR2seNI0kAwA8*b52P-2H`nrB569q*vWOlj*4?ZQ}F$jBCLBmu6Yv%MACX zTE)rVlI_%DJsb2PSiQh@^PMtRFNUha1~F$|`Y$VII8vDZb?Q<@zJi`D(GFK7(pbZS zKI$|`aecnChyB!&x6dPYy}dj)@4~+7{DYf#B^Vo$x?0ZEE&R^M$gFu_fx`3hi(ZeG zN0g}r<eOM?{mRRbHo3FUTB=ooN7f@KobULTm3NsKKIoZ>#rNBu^O<IIh3i_;nmR{! zSvE_b9m(I)UwiYEEl7@HiZabe4mhBlcmG4#vhO=R{1YZ92&z8|oqz4|*BfPDC9frT zJXN{>!THv9>6S9b+u=MtkvD`yMOdnvAD@m9$bS1)dgK4NJwCVVe`o*BSN(Rs|Ki{M zzZXpZzvKU^x*x(T9@)#Txqkh7=Krf_9~Rs$VteP;`TGCWg9o?#zW+V$?Y=vAU9Ah> zKVbcHk?-2K`?vmYfA)X%r~jV+_J8}o_NV>F|EJ^Y?j2il)&1-Ly?3l@N>_aNFTUk} z`G$M{qffe57;UQ;4flV4{kz#Y%}d=A54Y7gyKK71=`PVwykzd4eNESIJyqGkI{DX? zT^}EOJQiJ^lGm@v6LKf@<A)Cc+u7=DIplRNuYCP?m)skM#>!pt6^Zis^S-yfm;80( zro(Ev$Ia(U^f$=7l}(ywf9ILGLHLz&)3w!W_cm|SzE$7<qH=E9>-sBl|Mwj9@3+2` zR9(|L|5?QQX3taE=Ysl^xi9R9zWi^MwW5M6^SNI|S*b4K$EW$-y);+;k;Wd`$oSk9 zw|7~+&N%y7*v9hllHR~(SziBjJKk-{x)u8R)2l~MW;JnUhrC+STiCUJ{YTHV=IYY7 zM`SKIhP?QFUZ=Ut;<$(F=lqX+zGvPh?B21=Jn4J(x7gzeYcIs*cU*4iQ@ze{k~h%X zq_dP~&o|lirLH`$?D8H*@!fv^)}Xv|{aZ)-dD49OTj#%c<y+F*b>(p8hh1@851?oF zCv4m-mFvyE!+)*t!Nel<FY`0>S1<eUh}Ty3yl&#|TQdHv4KtnZUW>Yt%C+Nypm<Nw zebFsi3yNQSyW~=QhTqrKKzF*sp@2mAnf=YH9%g*hlzr>5&*Hl0mJ`|>&t<k8XIQaV ze$oS}_Io#2xq8!_g#wEDwD)Y~;=Oo%)itr~L$wF~79IYSFilY7bmIN&7iV6*ev#f@ z)OjsJ@X&<iy(R23_=Fe_J#7CQ&6nX@y~C7K*TMD5e!tq3#CMG|IJbmtWiXl*20E_4 zn>m{yLVk9f{O%QUZ$QWO@0xc~UE^kgL_!DSQS$>^nEHivoiBq<>wgt(@O5LH$d1pR z&&<u&WQ1mL@2{MyJ2mUWD#aI{?-@De+`b(0%gZFCuIXZe#u0(zrkiT!i%DG6k1jEp z8|*n_u3pf>h+Y-eeoeV+&Cg!EZAg2?w>w4i(wUF1)H#oWkLqVmbFg!}EtRNbf2sLB zUlY4Z^uF50+W}iEeibgV4BMdg<I(}CHk%FA4aW~X;eQJ{r+?#@3nl4?<{64xF?mJD zD+_NH`jFGFa`?dJJx?T+EDRa#?{=>*h)vE|l9pY_qH@b?!Q%7$`wkk2#@O-5IxjHj z_iOJ`RO^1t<W_NOdjDHPIj55qSu3i=s_yN)7u%I-d%#&r@T32dHyNBwN1h$_(RFCc zvil<#v3Qo=H*<^npdXpMOPPhL;-4>Bwfx7l2j?2}O8U6JoiXTMo_5jXg=52}X$G1L z{7phz8)we{a`DEpTK9d;NgcJ5pH<{AsmxCZy#4NQnBBG)3*@YX{G5;coT}oQc>m^( zM>jmToG4IbYm?O5ao=mr!Gv}u!B8W)?$}EukELpMZ2h%e(udpsbiv12sl5Kvl_nhs zW!8A|I>b29Eyn*((=v;lD^^=xTye*5QRL-?#n+b|<+yrN(@WB1@-%(Ve^wnEm(QB! zqJLa(otWM8E4<UY<g_Mf+BqH%QaY-5FQY>FvhiC^IonG2j=hYloU0Dsy`k%9GDXAW z!fzFpY{^|sE_GZUN9Mic`?Qj6^Q9KQDV~NWx2i?Dv&jfOtU1Vi*XdAu@3Ci-u5}zV z-I>y@cUbjmTTx~6YRztbf44<CY}T56e?G8PNTp{v#Vcnm6%^c2b26}9Wqwdr#3V19 zZI1B@qM@$*OSu~xU%xoUlETm6dU@*pn_CpE0$O`FPRf}4(m802L+a%=*7rLVe6lQ} z&3E~J>9~HAnQv-u@Dc8H>(-n!RCZC4W47P6y}IAZbK(l$k0D$Af9N*_I&bEYJ}6?E z5h{2#s5NEx&bnzFOm~${0#&|wnm<sLyt!aW`mMQFBCnoYnYv-4#8-{YO%<%ti{*bU z`MSZmy<>iH>0jBx2U|{<+H<NLEmU|RwR!FFF#8f``5CM?7L=dp+Uv2}XVp5;(fnl< zi=B(TgeQ1jJYk~!T*7tX$~_C>W}Y(=`qt;t9r4n5b(hwmiS_+L2Qs!ZJn7ARbgk;X z%1P$tz~A2bW%A!E=N@n~_@#G-KREotg@9?5X32NfXWK8H)%8HeyM)s>^mU8R%m>*D zmo?5tTw7&g=%{@`#3k#*sRW-TvXkeroH9>fG<m*Jl7Ve<3h$bmW^y`Lj>=rWsmAq* z(fCKP^cI)=4z`Wf7vCmqvi;!mBeii+&HHbG3{SI+@5nbWaAZqm9hxQg*vhl;!4``o z&y@|Obu0XJs}3z@%d)WE7P2K|x6Nsu$(x#cri-vhX7PO7@ustOq0gJ8eTN=N&%3JC zy=h7EC#Hiu90~I!w?*HY@z7yrslogO7o-2)Q_;2LRQMSg({o%oG3{1a@Bh<EKX0~p z?K{FNye?Mww|AdJ;E`ux4h#E_o9z;hVee>5W3JR@-<tng><qW|Y{QHLW~R%|H9h&< z*V(ADD_t;LqT+yPt7=x1=goCS3s&u4`f}Ur88MHTXYYHsyro$7_@_ytlbA&xy1QI3 z&{?K(yzyzQ?S{#`Gj-Nyzh%7Sd#deg<K#!PCQg=!aAuoicjcq0VdA?BE8UtbQcqW` zd!H|yR9I1K?ovDXFI(3|)9CsS&e{$lH=a%4G(I&eq1p4b3+KDoBMmn_l}rTY?~b|j z_Uq!4b2=V&{gj^gtiLeK<c@`_dZ^dKng`l}5_K1)o+-s<%=OvTY5Z{VmSw-44j!$E zc05ufwjgxN|K6OiFPqlI&Rpfb$xos8i|3Kb$#(>QY*8)Q?_(FaK=pFSqF=mo+YYpJ z$^|}d-k;~C+_~F-hSuc6nb{LhdUbeDes#h`aw|_v&y|#_z6UGaE34c>?<YxcHco1{ zkYkyDv)MsSYys2ERar?(*3?=3H0TtV`y}?#q2KFgNKI^c>ekq5$)g<1_BP?mXM^-b z?J8W)<~~)BHG1DLpHXa6%FZbpa?2jH9297ME9!hDT;Y?CP2>`_H{wUH9)8C@f60Ui zj1yQ?ly*q1`{7}|;^Wm&=WTg2R<vI;nxY>i<+$aKCEubKZ&_+87b&ijG}ctOrIf%s z{pglia(wa^&s#9e)tzm5XbV?xPf9ZP%=Jt3^Ij-(hMv>k_4aWX>x{$88=iUFUcbh* z$zaX8vewkpH8-yKT(C(u(Tw5W)fV{pNpwfY?K5-O3RQfsZ7F=_GpC1lLR;AER5_zr zr{~Q)Q>pN%bz4sG_lq{?Zt*@2Rn}wTQj--pc<>tQnTvB=B+e`e+Apx|e^6^^PsZjS zK6eDWDjO#0FM4IrW71G!zb^dreBRg>m%6S`y<H?3A@gL7N6?mc9~<sYs41S7p7Z#D zdXe7E!o>@u8ky2w#mzmG`uoq8mw#Rcyl9!C^DJoMxr_}zm6o$+mE3&rajTC^snG4) zlad0>dH%dxcz0D$nOk;}hfMS4H5;U6tIDhCWUon4UmVRNEYee;a;8P%C@0(TH#LTT zEB8!ObF$da;5)NB)J=1<@byDBR%soxOXCfMmrfMbcyIo&E9em8Y{S+YGdli;x3#QG znz>hbZ4b|Bt+!R@Zd^(|t69C{odWZ&sH#f76P^Yq4HZMzZ;aV=MXzbX!`wawueVyq zw+LpkK9u8{Y2wj8^POF0qMFXuL!CAXi>JO{V;Jwcr1W>`+glqAS8}M|{=>rXMYp6q zfd5om%BgrW&#d=d!J&nVpY8IyEGFqRp+v&y>MysuwUI}jJbR_xxK=<eyK5$&o6)U? z+H-dqv`@!|Oqy=4XS{7<F3-st_d<^aL2}#jrPOZEIQn#&;nY3J%Su01uQ+pJi)_<b zKkn>9;R=zr9=ZJ1nH;Ee#<+dg@o&|W&63Z_-BR38uyDoC6X!&&j~Dn(i*;0+xXHO& z_^A1jnX{(fk-Osl;`&r6g{tJrCXWA{8$OvH;_7x)bPMvXw%<A1X-=Te7FMoa{^Cw8 z-ia(44ti~Df+YspZ{}=~wky?KELg4-^qW8FYuC?bmvo({q$Ym}jkVrbW7KOnBYDAI z=34m=<`cVp`5vYnl97Be(^1&!?6eN46B509wrtHfWU2pYv0_Le&x@2(#i1*<UXYbn zo}~L_a}&pE6YHqm!58Dqt>5|;8QsHjF2CuY=Sb)BXDvLc<Yd>YS!-zO)cs@L!W?E7 z?P=c_OAfk!%wl&^mD~}xFN0ypWzjIx8EcDs<o9IF|L+sda&^n*Yga!;H|+YktM=Br ze{M^DEW2x)Um9^E$oQhzy|Bx6`|NV#9_o5e7oRJ3+3d!<{k_)3HquuY#aiF`nR2fo zXH&D}chG_SGhH|&8MY<`E_&_}r16{aO!T|o3#^r-COta#$<yg)-u+4Mgw^I$)Udv_ zTEQrmx!lc6_kTqD_av?j6NA0?FEloJ6(wydz<b5D{ch!fTP^NpmLD0*uFp={@#)C9 zqK5V=4L$YaGPkY?oEN#h>ZHcZs2pzPr<rqh&0FQuc*xe^_AbSvGa6(U*=uk8ukOHM zaOvdo7qi}cJ-(yXhiB1ceaoxcTpJ4fg(kN3Jr6$iZO;Z#!7LG0*`LY6$;C#Cf?lw= z?-On3lD~cU0B`ZV9TRk3aJLmc_||(oDJP)Y^QG35hM5H=0@s{Res=nHr0B;J?LYRX z4~OXX%oPk!vdWpR+pzGp6#uljPhan2PCX)<Y?0nuvP6KrC9`ee@g-}(hw}gPI3ez` z?BP2}JucCBo(cc=@72%ElQ}MQ=lm~GnXAV<W=+%#T>exxwC8kL*-q>An~Zl?9eN!Q zsFb=nSm>(C)W}y|e?o<Svp<`zE5|VJk?({_#s^=V+vFj@ATM{XwS0w|lg)wjfC)`( zj~wF9B~D&bb8W-r!;^MRTqx_-m|`7#G4W9O4HprGr!U0bm(LD9(4!aYcy#m2x>`2T zQ~qj;_<kq%AI^PQ_i@eZBdhv#zb!mx`NN0t<bH3_%iGQT7VSEEGW&#kUT5U|py#&7 zl1uk8Uf=HQtQ*-j^{;P}U3_4+#<bT~4s4Ex72Ic8Y`a;Me8IUtaw5}@&Hq?U!jqH= z7`h(5mpt${?@i<O$ksVVR=fCY^NzHOelZiMnSST-&t%UFwsUQsxU6%%)a>_#hovMo z*YgLbfRt0Z!JBF98-lN>25Fz1?I9fK)Hf+5xmR=1+A|gbb}Gu&hYS2SzwG3Eq`0c_ zaLLJs4!=LlN!hpD>H5R=cZ^PYZ)8(nb+fOweYD+p`-k4b&)=k;bQpYpbm80d_xBfv z=lw5ZT+y)BvqSjJ%IYcCTczebTv^v?bDMShvnjG$R{oxL|CLBce#w^XUfn5POQNc8 zZ~gMXX17|(A}5y)gN>FIiYqeMugJ^2Za<|Ou|;G0{o5yAt=;ov<C+eq&r$bHWd1J} zh)U%DrmrjXr{}E5GvmJg_E)ao_N@5!OfcT5#yDa9tm-54>&j*1H(YG@;kc-O<>0B7 z=HyGW=CQNv6sl`~u+;OiUxMka-~wJ1saHXU;jz=L-UtfLnaL@8<>Hc$2l+lsvijh( ze>rpMrNfa2Q-ZBOJl<%m9=xCX_?zcaClx-6RcvWdp88tl!v^>3i$65%=dN`>aQl(r zm(s49E_d;7i&JmE{-JNOu<^0-{a^O?*5&LK;t)@K{6*qa*yb&~rtS$s?-O1%u6VIg z=w)%v(W$k|QmYT22)knD&1G59Te5chck}cYlbv>ZEDm%%S#YI&yI5N7_k%b8@ytm- zmOEjIrfA6IoTDe$-&Kcx^*wnnB_hUUN2guo=Pk}0eJ)x@_{<&8ziJ3QcXj=l!|z42 z-}B1$eK==#Z!g=XU16OP(~MWSz4>9i=bQB5&&OWn6n^nv@ILy(Go!nH^G&i<&mVoe zd5vaUPa)6A3CAS)Y$la&Sn+A5k$rQVZ-K+z@@ZW)ZfnKTp08>Cd)Vi{#`h~LXJ6IW zx_?FWkr0u~e7RY-D<8L7Kc9L_RKPXL`kxf1t#)nqOFhk%>M=1K%nyBjcy3LJzs&zj z?BQ|NGqbGLSI6($vEXB{$M$b~+w6XvoNzt+z>@1`MGLQ)yx{tKRb2Jt_fxxd{i6Ef z6e1%RT(sWeEzs0B-^hZiYWD3NJ<)fYj5jZA{w?;)S96YWvNhMKb?jAcX@!b^ERJse zaOI25VpD_jb`ReCIdIh~p(aS6ckAN~=i)LaG|Uo`+<rYfW=2mMqhbA=Z%6it)a<%y zcar`4H?9bEv4g)eBDei+K9-?>DsAmIXBUa+w|6HUOV<gL+SvP;z2dz6gmSsrKg-TK zyeXfs>2cV*)jKsjZ2~rW@GsIkr|xO9J3FI{-z?<L!tKA;wiVWTe{(yY$K-5t!=N)W z-~8ZP!!=1#kDt#C<9*V|9?`O+@8V-WZx@4qjEVC*x1<#ati4+I`>pu}-3bQqzwa|G zls|M+O82GM?lTQ}{>uD;r=xhKT?N(Zn64~eVEFba)1KeuMo09mb3bx6S+0$G>%Yo% z?=6og^_q9i+Io|WT_b8An%{V^{=&bY`rQXUD{cPx)N!x#hCNCe4#5j|l`CxJtuy+1 zCufoGwyP627_Ys(Krz;H(XJ1P9(!9a@GsNiekN6KcIGO}H*T9h?;lts*fu9Im1bt0 z66$qk6PX{<tupWU)U;XiUg=yeysdfPXzH(AodVz8xiLF4yXv%0zhqBdzAY<4DO<~X z25Zdz^I}#?^>Lj-nNc4qmn@p3(6Pv)>!09#j@reVH#UkaatTn6b)4Y#XoLBrV@)5t zj&|>y&3*QJ{t`W*{QuAY+m>GY|M~tB>4oZwmYxE;F0r;SPZq4N`>g%S?bH=t`&F~! zmgTt#-d)fq_e<j6q4!N!Hos=H5xTQSRl+f-J=fvw!pyIGZ@64+dnA)EKS;7|>)f8o z%fEuIzkYi`Bjm&~mO1%R^G~xK^6JTqb}iY)?zZ8jJa3m$FE{&^+=UMxaPGRx!L;jQ zUr%)|L(oC%5>2Vxi0<{ezfLMKx<#3=b4p#$ocWSXbN`l>nf{FXKSn7E75cAWf0VaA zL{d2QVZ7jKv$dPQC#*hP=djiIA#a)4@d>LR&N6+FuWlkQQk(c}=}+f5p`Y1<x}Ngv zvRf>>J?h*9)9vRbMON&Y+gWA9Y$=lU%fk6Kb46Pz+tRO<E%j?16%~$8Iriyv?cvF9 zo%i1gkvur#!CA?-!u&3$YHo!3d#-6&F2+B*&~aJSEsOYyZC6EXe(+jaubH@L<E&E| z7E4wiNT2j5s6rt@Rd2WQ)CE>M76i9XTX1OigDy6QRa<YVTJ$TP?VYh<qjB?s{JD!$ z=2V@1#lR<N@m~3&+tst_XD^sX6#eZ<39}Kf-Rtr{c;(lcR(_`GyG7?%KQN9eU>D7* zzo&SpW6Ip^yOy3S{X4nyZ)sv{$3w2bpq`qJ(En<SHr6ekr|t2iVNLOkV@ZNs(apQ8 zH=q8#ee>+?*Wcg2yYKG=AECSDcK7bz*}J!<*x6%o_5Z(5|NdS7{@prG%aZr^@5j{c zabDY4do6o<eqCjM{{KJk?9OiR`~Cg>yMW&hGwyu8!*k|n?wk4D#sAlDFPFEA+qbNF zvg6AT`+fC)-+i*ObuqA-*i$F_=30b0i|}rnMNb`~%r8Fwx?EjqY14*7mP*dsTSZ?O zSsY&YLxpR<<GBfQghcl`A76Fxf771NQh!%Uot@UfR?qv`^liIA%<8rZca6<1-(&d- z+U<&T^BYf1j(HoQq&l1FRp!;K|7=#*gGA)?%(-qvwOSuJ6LR?O8nH{Re?Ks9YASi~ zFXf7@`24kBSACWD@cTRQ*^(dqe19DN#@$~Ow>MKe=*vxO`Tpv?C;Te^sn7f0`Mmy7 zxaZIL@9x*`*}ZG0_}cqxKYg+<Rn5G^`=s8<r2l#SswYKj^3A7T&(AxuHR$%cm5lCN zzI<KPw&QJ{cHVbWt@^li|2L}6xmtWVb^E;8Dl<PEe0!7U(86@%@7EF!ZH(ekle5|U zc2@Uao<(2IUT`Zr_WVNow0(0E1&@6e@pf%5KDu4hoBvMXY1ONXx-_on<V<a@Phar! z+=O>qZ_UoSp}brp_l9%yL5}KYTBeEqFAw_NP!90@mdL+g*3+DaI!PZ4uNfVZdl2(O z@w=mZVo+#Tyv=|0>Hl~9IllhVll=zgPR0Feo?rKKy*jT-=jr;;n3~na|IYukfBt{Y z|Kfl5JA-GP-u%C0_u;q;|BU5IEdQ^6#I++balh8_iCq<bf#I6_!Y%$k|1<w{eO;~j zpZn?J`V;?`A7}h4fA?kKzxcbqKJ!A&D&IYM;*p>Kzn}X5*ZsfG_j;cH?>+hczwiGQ z%Xz(i3fr9j;f1yrMC;c)thllA!H-F|M42w=_Q-ynWzHaRmzQ_Ws_S+aHLR{YX}pr7 z#+&)Z(N<-}y142!7rEHZMb~qDYdNG{yOlMDlSj&B+MiY2@qy<jlu!Kf#A4@_?6Q5! zHKjOqi!VNYMV#$kl!ai?z4slw-#72quU#_#uiGvK``x8QHS_NpRcFXo2|sXEewvXZ z*2Kg4fthCkd((rX?+zT@rpRgU$GSo3=Hq6=lRszQn)2rUjV(`Xj)<upXu5T{X8GDF z#z71R=5||4d~@GaQrp_joX7fp;`V0(-unX+j^!B(+Rt8_*ctHOto62}_UDah?N<+J z?_|z?Z5nTo+qmyd!L6#^mJ3z8lSEyj*I#s*$@6<%vD>Mq|NnflU;n?(=I8wD_0K=; z*ZnUXfB)#G&cFZqxBlmKYy9=TIj(>H|4`-stNs0r4Zhi3)A^a%ma3{E`9OY0+M$pa z*DO>Y{F#6I|Bk=?@%Nekr_0Tmc;vtP-?#(+%qJxLFa8(*@9W|HC1uMl&di?Ox9g|R z<&R%7_iRgxvi6Ri`G{#%%;gI?Ju0R`;@4DWx~@2R!SAc1ZhLT+`Ih|ZGwqjuE!AH* zY59spv2BObO+;GeZk+XO+bWB_0?LoCqz9GA1x;3%C2iK{cy0HAZsVMyImaYq-hMNQ zpJ-Y8VW~Z*)2Z_CDcfhw&HuD9RFL=CFZ=8NcY@N~v;Qh#o2UG>m*Y$RQ@@Mx?|yq3 zkN@5hMgPu!wfFnK`qKZZ$rlS$zN*Fi|Gn>JeMDQ6(O3JG_vM-Xx;q`;VSeP-{R)#O z-|l<qt-5ls=<u%FKexY8{(CbjzGhSYp-h9ao(7Z7m&OrQ(MqE3Aqt`vncu`q>pKg5 zoNa}cb2r`zuwNuu>#*14?aIy%uepNQ<E~_FQEF}|oVw`co5{P()1T#S3<y1%GwW5> z&7$n<NlPz%k9;Kkg+E0^`RY%x`FdIZ7KKMAzM7jT{A>Qdix(9Br*79ZnKmmiY5}9O zozE9(-~0b={(iMy?=Q35f@k^<x|e-e5_OjCoT!uiBIah3TZiuZE>T^q*^wO^7;c=p z{hnEL?ws<{^m7U~Pi(pVmX-aWw}gfP^Hrmedao_hUa&?AFF$wZ)V0rBHp-N@f2vql zBK~=vQONJ)%6qf<FRXjhe{SizJK0;_PRjJ?&D)Z^soE`0<?@{`Q};M|zpR!G^HB*k z$osc(a=7o8zq!waqd1(mEHzN}v`ar!qID(Rc*%tPw9QtLR_vh<@-`p6DFG@hrbqpI z?d|c)`u*o0@_PSUmn_us|0mtg7V&R#TXW*}_J8k`&Z+V4{8P^JQ{R&zq%k68!oQ@J z{o2yIZykCoHQlW6-Jg_<SCj57t8cz-ATrtF#YNvu&m`r%dBQ!sb{X=l`2IC)dtTl3 z3*R5y?_2YdXNKdgmMg!{9WzLORh9krrsv#~O^b}T>8je<JQHL7d;gM;z;QXb+Dj2K zArjsX`Pq|}$%oFGz+x9DrrI8wuaNxptAEoKQB}`3*M;MocZIS|nx6jTuj!ukXVQbp z)jT(gyqDh18^UxbR9r}UvdPO+SMFsk`s*$%c+@fa#rD>FD|*%X|Mi#j>HV93S>oT% z<@*AU&fS`!S}&2ae&z0ymmCe5)`;kQee-_z@z%`nCl7w@Hi~a(|Gs(M4r5QY1DkW~ z{9m8`e9tBD+|$pW8%yp5@9L_tlhFOWc;TW|LF?6ZMKevDPW78a%<=yG`Dx0{**w#| zGp|VVtG(I~{XKv7@k75QAO3OvesTHF(5*+CrNZyXwHqx66}H*`&)TD<EA@>&-v$No z6&Z!wnC}(cunoD~(JYhw=*5IXBEQY~IdxqAUlQJ*es{~VQklXD9&Qb1{g=ko8}#I- zXLaqG&^vSed*iC@^WMeUgzdlYE3wMx(A$N#BssS&v~y(KYum))rX6_M_`<C{Df<{I z-G95^TdR}K=_VO>^~uy-4&Cdd{T~^N%)h4)(fwtcNBIHMpEFav+S=?g+K#$kvTW_( zu<_V)tl#*H_^F*nKI~j~9eyrdu-x-fYWHPdSL5y4mHy`6|DL`3_UY@Y*;6WKT@y@q zP&jpP;>kCA5(C%$?&ICqy6;`htnw?q>FaD2wJx8u?n^uOZ{y{}?}@9Er1KK|(>(lq zR>j(?y;&9H(#W%Ct+K0R?ahLJ%TCudWEcoDr%B(PrTg`++sZh(0|uYHSek=Wn<4~) zJ|0+~?sk$*J>~ebZ}EBmpMnV9t^cdEc&C*AvzPgPJm|td?v#ex_5OGMWgq`?e$Tsy z^;5%VHL==dWu+!+Z7X)$(%P?fqnqFNc)|Zmi>@9#yY2Ha)pZ#+#7@*ZJ}R9bc>2@- zqc-AJ8V9f35sQ0yOh)|t;{EqetX`V8Cbae6zB`fU1GXeTWR=?Lf7|$M#=NpFkFfl? z+uGAo=9KMQvLg2utEY&;A)T{!KACbJ#SdSZUt1z&P}EV~@{cv~?G;C}3lF59FaGy) zk@buDyh{&$$T0{%fBwlnD~I}C^~s$k?!S($c)0S(Erl&B1Q%V>@sQjt#O`5G?D3;M z_Wb`#w=DjoEo1xmW~TlW0R^S6eIez`ruOjrt`AKxD>lx}O7RalKgVh3#}j#rx65zl z-)JSY*wE|+%Y5#{sGcG{>yX-4>YsdF%olb~{q`ltG>UObk$IG*@M%lk_iVO?9aA@N z6+B-v&D>w>?zNWLY-#h0UjN=+%Ms(KG-KDZ4?bURZR`B+8Mm@c$77O4=U+FanTxiq znb3CQ*_{Pu&nG-Lbn~5mbC;k&wE3dj$7ihaUUFNmx<tdzO?stlbID;t5BCS9LL2tB zJ!6a7J?}<$Myhn1bSBT?z}kx51HBx|1xI$rHRm5<Uusgnd=sPb_V3dYZ~G=6w|#N+ zy!PGrwOTEWlg?}_`|jI0Qzc;U+-vNMFP+^IsK9M{=8*czmHv6M5?Qm)FSvVdLYfrc z(dJ0@Cu_oV4c0bnlQCMq#PY3~idp3E<yAu7+M)Zluv=C9x~dv8vHNsP%(F*E;?sBT z_><dt`nZVbb`Ei69(T{c*po6-rX+vc?A8A0YO2aP=Jm}wXD<J;c`*4w;+8F|iW@l1 z_P+7{Fu!uUvTy#vODk=sal~$8y_Bxq$lkm_Ykk<S>6f0){9yX2+xTzIBcF+)T9s2* zTzO(Y?S#Hj=+f{dk!uca-xX20b^3+9tyfy7?+y#BV#@AlpL1#{`|rHfKMwqhG~T*% z+ohzwM?2aMn)0kmEZ}X<mWVm*aWbX+W$(qC!tNVF4Hro!T{c}Oc0qs6_FGJqx~BH) z0&d?}x?$eDo?Qpijyje0E>a3fl{&s|&*UEA_zfj_Z)SdrV2wJy?$>1XWdZybEsGlE zyl=%^-k`2_e(KLpHAZ&9?UPU5bdWujk#zdq&59ed=gj91*{SWhuk+=K@@8$Rn2Qg( z*uqVAED}5xZaw4JK9N#pf3p)47XFUR`Zpm=_@Hy=tV?2-zRhl%E+6h)DE7Pcg;wI} zx%wL<k_@>Qa9V#o?%JH3X(#Am@W5jNAE(5M5V@!VncOa2z9m;z&RD0i`Rke0Ykto8 zo+2}KT2QF6Vvg^JFLQT2%uy0C^=ojiRC>S|ayoc-(Q7MFOQ!M@Nz-2O`v@M}FB#OO zc2B~i$7HR@jL5kU1o?y1Cb27XJb(TwP{3|le3?iM`*Mc+GCamF-W@pk`n1Y=#ed3t zo63UfDt07Eef)YnH2m;IvlZ)~Ih-*%GGF2!(}lLkZI^OSZ<XbU-)kO}mh<WI@pqlS zW=`$5>}g4_=W9{g^0z`R_xQnuQ~u>&O*nLM>Pm|x7Sp&39rwH_z7@1{t1eq_-;-N0 z0-bC!oqc(0AD=qT9couL^_AT6(x7i^SIP;_-ehz&`TN=|xv9$MKAQA%$XI=v`Nmu^ zd0&W5Qo*9=tvx$`hq<1a-sSwp<xKKC4td7bOY@}b<<$gK5>`oG;Y+*Wa4fY`Ak};S zl(-h=H7m*^R=KY9dXuu>%zd(rcdUuor^F*k;p+0!Hs1OBK6z&`N0H&_*j9z`V@dq` z`j4JdEIj)5?I+cB!cp1tmxSKzN)_m;$SsKb-+H}XGwA<Pb4gzJp!`Fx_kZ}MzvN%{ zGKP<_S*+X*$FJ8rc9_3%{yY8M3hQ^gyM?aQzvQp@`#yiszw(&S>Cx<aZ_V59**i_U zX3fi;t0PxWxE-#-byM$=(5D9rxW6CUnx)6XD_&yx=H~YgTlZAndT3>wGAH42xW~KW zrI{c8T9>lAZ@PEhdPi&igMIvRf($Zcer<d&?*#8Uwzsx_>AoqcIZdXSO{UpRrn!%@ zuI&gu5wNxG7v~O^_R@(l<zYKAvdj-YnXY>4$>wEsjb(r1oScOY^*EZ{UcJfisQMSp zdxrBvlW+a_5cos%?aE`B7Ay<4ZWH(++K~COIdSpY`u2|cy?cL}7WSpw_IvwR``#Yk zsEYF2voE&?6ftmI$*zuGwAJy3M#U|YsD97+ELTpLvn=z!P`TfC-le>cf1mJ8pW*YP zN@WW3E*Eddd6yr24d1`d>)l0#CC4^v2ZzqIT@YZ<xG^?q0b^>z!Xo3Kc=28{NtOf& zPo<-)Z}Xdf-<k78BHxK~O~v1LW`YbR$6NWAP1$(BocDGaH`i6|n=@9oZOrGczvk;( z=f`Gv@$B-%l<1oOAD3U>{@wn5%<|c)t7rMIU1OK6S2d@iExLSB`%A7vew{&rGS%|! zTsmh<ep~dMSpHP(WyTz5nM116)3hE5c=0Q_%u9Qbr(bq1OlzfvlgS?+Ww%K=Y3WjW zyj>G&XLp*c@Zg>3eDDoNqO=`X@vVgtg(k}c<|evkb3MvVneUnrp;-}Uapg$!XLnAG zj)TAKj#u@4EsU6N&!N=tRrI+1kq3Vo9@`xMX)))#yn)=3FH?^RyDj=Np>!T|-;U*- zJ6wZKR+JcCQ@h;WV|Llc?edqf%Q0z}Wy&tE;#qz*%J1_mzt1=PRvXXTw0+*R1UugC z(^EF}iGB56cO~!8i5F3gSEqK~oVxSwSHomEdH$%Q*OugSpTDv5_?&-%?8m>a4c#yB z>Qh;E@KwG&(f^|~oTsK6MXtVHd|vn6|D%8R@Axmi-|y^yZbJ^yNmAm4|Gd8ZfAwwG z<Bj+KdrS4R*}nT<YV|KZ=g;0a;gTYo);CYYCI7TITv-s2dG5+rvt^6oX3i9TDI&A+ z^~MQrQtAUHJ^1oLqSo&@Gf%cNL+p-a+D{Z${(kjl`F|_vj#z;--rQRi+t#eDy!bL< zW5n+@dSAXuoejCtt1cavmcH-(f^e&kvwGt#Yr;CCWnTsDP^#rBa}v1Xw4j#zN6j&p z`Q^(TG8unw+!OdfZqjzvTFnz>#jZaVNzZ4wa=?jM=S%ORhtIBU&Y2kPvP;|~*kRG8 zh55X^nkK7lZ5(n#U2{^V-BA9h?vt~gW$6x`b5HB_{ulq0fAW7{%aZ?}|IIl4KjxqM zCwn20p4z~d_MZRV^Zvf8c;f%10)sc-*qkT)|DD`<`u}~WKkRusT%BgTVUcdQ@&D9> z=DRFYSg#z<OWoQU&%o~4!~FBQFPppkvz|hZV<s%gas~Ild$5GO<Q1y_=(aUw!sB%T z*I(q8ZoaXcqwB!j)c$sZ@?v4n;-06KOi?H1wf!@${jqqVW-qrzZq|*k%rBcaUio_L z`ZkC8-<bTLZ@TzHDm{IB?zyt>vGwdhZ%)rLs$HFbC9LtwOqLS$cN2ZoBzflCJG4={ zY5K~)!M=rWUhOwHJMY^2{J8ruwE_zSrrLTxyn1)HdDBYen{vF{gIeS3_wC&6=-YC8 zyHjx1_oz~~d5c6+`)A*|9r@>SnHX>EzccLxJmGsboL7nco2;JD7xCXN{(s2p`S+_Y zZ2our^c<OuznJ&^S{Y`)Uw&@+_hx?C>Ct`4+f}&q?k}v^bVb1Q(BjQ*-a5CN-yheI z5(y1C{VmRt+wr%(Uu=SKRi|Fo)7^JMpXRuK*fo)Ry)@@trKT)}N~v7)*1sG#qEBC3 zd^Fzf-krbUC9kKP>GJs<X*Pdh$Jc_LGQDEVl@@Yyzc1am<lD5<t-D@0{!$N>oy+g` zJk~X6_us(%`va<;FMhhjT1tDdXTE~=bHifwISqZr61>Nn-^Ivz?v2a0nE31SPLny` z-Mm-cm+wD*_hX8|O#b#)88@u$!_TXC|NB&97tzDExO0u(v*sCv3;tM4nPJ8l9)D6h z*mut5wC(d&vpr)o{97f<EFb;z^$tO&yOL9bY7FLZ2gLEG^b1DX6|HsT=kZ=|HbZd9 z&!e9hD*D4R41{(x2Q%jJtrTZtzLE8&R`A8a-^qa;#-9Qf#Lry$F5}I%?@fKC7cQMh zp30q~qq51%Ws}w+1+DG|4NtAr4mzhbrZ4T=yVApGwU5bZmD#C6=bA1_T1TC^b9;Hn zry8N8NKvOqE)6m5zi(P!OjO;d^<=}B4`(#111IwR`mg8PtIQ^)yf1vwt&Z^JDt8S# zm_M8slHtCQ$Sn1%HK{o|Uf_3B#{&gJ<14Ls3L6&af7Jcr+*}j=c%rEntNSX3r4#1t zm{Vs^mSvRJ`D`=KNwc?(C*Pm=zTomQ?jX@!hRhbTT9&9MJ>4L_QYqNo%qXDeEZf4` zlEv;8YuMFUv)Obi8Xugw6TWgf*B=M#$q(PR95nk^R>nHnHRb9So*M_&u3y6;%;@YY z)8DYiYSJXWbD@`}^gKv&kBqqx?il}xp{}5*!QVZtLWHaT|AUY6HveYFAMgEdupwW( zkW)*5b&|+`TZek~SM@xCo)13CUp-p?LalSb2Fum5CW-7CTQ*8G{d46p_co~rSyEo| zfLX{^CwY6r7rVe!E)J7A%L}XpHoO*CQFHO7&B<xMT<^_as6KydYgGR2bNR2_Zoay8 zjO*>=Yc0Xe%VMi%+)58J**e$7d3MrarreBG-E$MY|NZy0VNK2csH1i3P}VE8S@+Y= zHk?wdw}`#^KJT6V8NK`W&*j~V+h1S)`y2C;9~+f7ZCv3p{q(I`$Hg6=oTjX;vR=~M z|J}SiU;q9c2X^mR{@l<1KK=W5y}bPTg)}|sg}LwY*V)~h822EcZQH`Euop#_-$$)B zj8bV{+TZS>rLtge;s=h*fX00diK<H+Icg?|b_p(A&^)8WVvSS2DC6Af9lF}tyy@;+ zVrNT#2w%J<*Y#IHn=gN`(fSex-n*%uyN;Q!ODgy|A5`u=|5U%?PygMpQ+@yCcz55e zGx#su(o+2MKgY-W5nI|PTSw1oPqzMCa_EpfgV(LrZy)-#b=Vd4a%Z+PK2pi~;}!q* zTEOG;x2N1uIr{BQLUGhx|N9Lah4%I?xTNOn)D&=b%a+#9%Ziul?lIr8HRsL$Mej0S zo8Mx)8+p@r?))E$x>uhs;niJecR!lN?S5}Z!nX+%zHTe{yqh)Y`m4J9s8_e-kN4Rt zRLfYasZ5-tY5DSC?Bp*87CyhDa*xk#mHILs^|v0=1J_QLeI_t3!C`{U=2Gpd7g~Eg zxveI>iZ{y=71p&lTeLU8wD_Ck9JWAh*4<o3{F2P>FJ}$WJ@mY2`K6Sj4K9Lbd1})$ zXD`30F3Ov(y?h79-riLcB%^v>GS(;-Zu+t#zbNy;6=(iLedf&hb~b6;FPuv}ug)_w zc>P9Sf8N!j%ipZe<=lI8LRCR$zHvND?uzfa0evf{PrKcDy7pX74qJ4Bn&H=vU23}f z8aUHU0#k~9?qB&;Vyo)MKMQ^_{!?b&!ufa4-gV2f=P4^$Y0qI=5*r-k=X)>m*Beh) z6_McOFLK4Unc7Co{^!c{RkDn|+*R!3^4s>HnTxtNDw_m8olDyub+eB3$mUzGm&FwE z*vDNEK7X(2xr7bl_b$zgN}aoBZklK(|CMiQW3yh_&Ph8aye+vSqi4o8r;Ka5@&gAu z8;v=)S|1$QXuP{6*>!%htKymy^FKVDvN7qv#zg{QPyAV&H!|^shTJ*KnRv7%+0}5( zhuhPNgu1=F-%M>4=4}1ew`CLS_3a*}R)3Bj_c<dUAj8$Rck=m@B4IP9ES~SwQF>-~ zc0}H?z$W3`m6dB(Sx)`&W!g0Z=d_QHq9eacbSL~Pa88+MkZk|TxZmj9MromD$w&Nb zMeo{{Om4Yitzi9b`H^2aKmIXIZVxRzbs%Hc)8~6UDjyyAa7FR(N#@y?+jW+?U0W{D z>aWB#$1S8-De&jYBbsx3QY_|blsQd&JVoibr|Z1ST}tX=t$w;(b7Ksw_MWJ2n)pgY zd4A8;ms2MhDu%?D6t?!RDSh&zSiEkjduJL``o;qR;#=Ig&H9<%JTPIHeRx_&+0<Dt ztdH=lNZGQbz%?mxWqRKgmlv##G6#|w!td6dXFIr9_ErjuuC!9&29?kYool#_Dpqm_ zP1zBWGI3poZOxZm3?baoP5bYkiFw)0aOA@$&&r)U?>y~1(#a`ZI9dG}mt)(j;^Njs zk;_+NG7VmR5h|`M*rJub+~oA(BTqZu{yYEPPNd<p=ZpE1PX&oSZ7Wgq{qkey`J{(7 z7K#?neQKUHem?osmixfIJzLTp6+)DJ1Pa1k*9AN7aH^Wid*RHAZ<#8ytmQtQWBv9> z<&VguGqU}Yo-<i#SMfO<uYbs{&i>=%Nk%)B9FyJo3enw;eAf>YR7{sm5_%*!Yl-(# zYv$(ff{(YC-nD<dOwE3AfA$Igf@A}idb^d<D)I-CkAz%3c0KG7(_DuHj^t;jPqdw^ zWBjb2#CcF&RJ*`(+Wzy??W=xvyH$p)3VjywhcW)oi=*ci#ouo8dOD|a`c%X4BED*d z&cz1Lro<-yH@_`Xci=3)_*SF5ebtd?=KNhWeb0x)?(=S37A~{6mNwiyEyT1hbjwLa z+m^+?s+SJGOXcLhuXRb}>zNg9uR6-lSS))`$k4On^3{rC^&Hn%N!0UwkemHoyvbU6 zUiFT+<&RF4Ps*A8wM(@0)9NXApGK`eXudVh$KtG~1=FV3bsqT+Vh-nDE4>gd&*<TJ z%>1Q9(IGRb?h@P2C0(yhiX5A)o2MSV!0+CPIad~1a8GhA_1e7B%($)VEl+ON^C{ua zqC+pH1e(vYidNZOwobriUP;Tl_q?SGb4|G)$G3H?&{{R8{qd~&V}<XX%dToZiSp&Q z(!a2;=BHBKMZ3&~eG)|*0@v0)7x$bshu?kjK?~VETCF0D7rmTk9}(HMN^!>j8z<Ye z)(GA-N?Ir?_bN0b@=fUpyO$oB#TUP7opTj;@>=|N&)YppoA(s1w9u`Pj1cp)NvmAp zAQ->c;8+RMw?KKRd24#N*u2q}eS71fw6d~x>lM!#k;xm@pWpaiWaIi3Yp*rex^KI7 z?7_W;$M-ZJ#a(Pp(|@{J!8>N^iszS)YKz{{nsj@Ha&R1Tb5F>dy)Rk%t&duJd73`G z#+G^Q(AAvcU+gP>i66YAc=r6KtZmoKf<0ZTg#Ri2x0`#Qf2&shGUrd?O!9wkZ<#W4 zQQf?6M+*O6sI=F#Yj#rQxf(05F}P&W9N)!a%jaAXpSU8R_DFct595g+W;WUE50U2l z_v-NEPmT2jRu7(Ez5Mg&Yx_^X`uF@(-oI+ae~zrekDvNEzsfIs^4K8af1uR&%D=~x zuhjGCf0?myLvqDSx1esrHBQO5j5^9gj_h}uB&i$rV`5ZZ%~ihq2`QUDiM#NKc&I$( zZ%!3)KCQ@>t$%Owp=<wkbr|&Wqzdl0dHpGhTf8PWIwT-l>AlHgud}<qZgOt#zEt}; z>WGc;Qn!seEH4>7ybycEMv+T!Ug&H`yFCS#*CY~*dWudyexD_FMvi~3!Fk#G1#VNO zZnHED+^i%$U#ii@r2mchq{_4}A=$HMJZ8|(W8GC?G{dX^BOkNG)k6LZo0^5QR3p~* z_#Rqz#zEWpNwimrUYwNv!VXTJYc_Wt>Un3(_}hAM`vqOm8|&^qvA=r%>DRKQUEH;I z69Ojjt$!60mR9mn;_Vdiy?f3S_fFaVY$4l`n&{i}ByL{{(w7lb)8`R%dh)I2Mnm4I z-BV4COJ<#zoa~ypW_QV&534hO3NZ0!7MT=WbdcI_V8Ze0{Y$}xI;t!8c$w{-vPkJu z?Q#!a$!{w&WOZgOWz!dSU47}XyP0=TZ(LZ0A=jnCSHi`!tRpHe*{zn2@_pHx6LD+V zqTJrOQ@jo=jN5*^Wd8I=H|H^{-#!#%?4y0xt2IWu^7EF-^Dms%stWutT~Pa7?7Iu| zxooSw7dog1m;J6-F^M<U>2C4oiO0Qai~T$6Yro$(+_W?7Wo$IpC!U*J_Qzct=X3}Z z#mwZFe#3h>b)8Va_GIVpOS$6ts#5MsR+c$ls8Gn=b*w7E^DeLP$<qhFiEA{uDqhY! zl{7WUPwh>jM#s+!FI_!TE}k%XaAJz=%!m`Id`7iF-@B*k)mOdTVe+I!lV7iL?iq;* zOQ);6GCsaU#Hjx1j|u$Ro4Eei2(`r9{A)g5|KSIJ-P6whKh~^__v-)uqI~JW9|r%N zAAOWR-tqr{qeMc(rewVXzf#;<T5tGf>|4JkQ7O7|@d>|z_TYV+r-`@-@yKU#*SmJy zT6Q(zq`pwbeX%=N$}}H&H+@t%xME_0hDV3ZGnbYFDn>3X2VPp|Y|nC*Z|c-fVC#7# z`{DSH$FsTF>;*n-=&Nfe^*SNs8RB=~{ERsgjYs;tYF<yVR5fiemwF{^H#cQVcV73t zJ2(7ae>Y#Bzs`<hmeQVG)!*GB-WU4p{P6m`dAT{qJpV)ePTS{QIQ=HlZ2t1ECld_i zda9ondroqnyv}OMl#2;EzUSPZKi_+BhkZ=h`K2Fi^ny9cL@)PdR{jf?>}PmU=;fn! za0{p2+cR?fdOH;>RCcViJ$$K_?V8<;C&r0WH!uIhQy1W}?8xyJR~=Jkl|?heZf)+` zcEwB9J-8uevEza{-;-ZY6kM7j7cgaRg__k~!B>@6W*rboTUxzQ)oFdiN{<)wOr<yN z46qj}zihD3$3{bz`_zHP83qd5{wz=W7Ch(ok`z1j!_{7Cwo8lWbxHU)ycbbkIJa)f z{rbdt!e`uDJY^@Sirra$=<~OV8&l)Vt(Y~sr*_#1E|X)rdQj8Bl)ZWRM%_8bi{;K& z+C2ZL`uWEPrR{NdH&xWwNAGvwujRRvr2o|`UTuj$XX1o#hTvb1#Z36GcJE&P$Sn9@ zmw5EoLtD>kPxCc?;4uHOgPP2V_y>0mHa?zemYym5JI`>zf+O)$*T=l%m>{q#{*#eW z)R{de?`KZ6-ewhZEvjx|RpHjqWMPqK84F~08|1Y3K2-5Kl(yaJ$@;%h8&f6~TK>{6 zw)`Yswsw+h$Y!y`qmG-MP4wrM@f^-sT_c<=UC5Rt^~3%$`|iHX=!_dD*i6q)-*xZD zEwLAu;~u<>F_Vf<<~!D!{>C)h>Tda8S&xnS$`wx6t{qy=Shn*<Q6G!b=_8wL#Sfh3 z|F3iKZ?~+{g2s3~B>|nXIgeaE#Lbp`#dOhC*zVZ&Q~bQ2Dtq0x-4KycH#LjhVSK(l zBG)l8>87#dVVBR5_g3l6n|OcXd&lLz;_I|ZlGzMQ<w95M%LwoETAJ2;#+m8UX`4EU z`9~rZFI#<Ab=Y}erDEeJr~A1&*XDe$F_8Fvd}RWEiZSO8v&_GXKW^WwJwt!d@@1(9 z`fS%UOzqz*Xc2PY3CEt*i{vvGM9VUsWJw82X<^u7l{88A$zNgSN~>9il(~N%)vx>5 Y9slQ%`2M&TU;i^YC2UV(s9<FP0PG-i1poj5 literal 0 HcmV?d00001 diff --git a/dbrepo-ui/composables/upload-service.ts b/dbrepo-ui/composables/upload-service.ts index 2697131610..f7a6964d58 100644 --- a/dbrepo-ui/composables/upload-service.ts +++ b/dbrepo-ui/composables/upload-service.ts @@ -1,9 +1,11 @@ import * as tus from 'tus-js-client' import {useCacheStore} from '@/stores/cache' +import {useUserStore} from '@/stores/user' export const useUploadService = (): any => { function create (data: File) { + const userStore = useUserStore() const config = useRuntimeConfig() const endpoint = config.public.upload.client return new Promise<string>((resolve, reject) => { @@ -13,6 +15,9 @@ export const useUploadService = (): any => { } const uploadClient: tus.Upload = new tus.Upload(data, { endpoint, + headers: { + 'Authorization': `Bearer ${userStore.getToken}` + }, retryDelays: [0, 3000, 5000, 10000, 20000], onError (error) { console.error('Failed to upload:', error) diff --git a/dbrepo-upload-service/.gitignore b/dbrepo-upload-service/.gitignore new file mode 100644 index 0000000000..a5aee567d4 --- /dev/null +++ b/dbrepo-upload-service/.gitignore @@ -0,0 +1,2 @@ +# environment +venv/ \ No newline at end of file diff --git a/dbrepo-upload-service/mvnw b/dbrepo-upload-service/mvnw new file mode 100755 index 0000000000..a16b5431b4 --- /dev/null +++ b/dbrepo-upload-service/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/dbrepo-upload-service/mvnw.cmd b/dbrepo-upload-service/mvnw.cmd new file mode 100644 index 0000000000..c8d43372c9 --- /dev/null +++ b/dbrepo-upload-service/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/dbrepo-upload-service/pom.xml b/dbrepo-upload-service/pom.xml new file mode 100644 index 0000000000..9684d60454 --- /dev/null +++ b/dbrepo-upload-service/pom.xml @@ -0,0 +1,168 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-parent</artifactId> + <version>3.1.12</version> + </parent> + + <groupId>at.tuwien</groupId> + <artifactId>dbrepo-upload-service</artifactId> + <name>dbrepo-upload-service</name> + <version>1.5.2</version> + + <url>https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/</url> + <developers> + <developer> + <name>Martin Weise</name> + <email>martin.weise@tuwien.ac.at</email> + <organization>TU Wien</organization> + </developer> + </developers> + + <properties> + <java.version>17</java.version> + <spring-cloud.version>4.0.2</spring-cloud.version> + <mapstruct.version>1.5.5.Final</mapstruct.version> + <rabbitmq.version>5.20.0</rabbitmq.version> + <jackson-datatype.version>2.15.0</jackson-datatype.version> + <commons-io.version>2.15.0</commons-io.version> + <commons-validator.version>1.8.0</commons-validator.version> + <guava.version>33.0.0-jre</guava.version> + <jacoco.version>0.8.12</jacoco.version> + <jwt.version>4.3.0</jwt.version> + <c3p0.version>0.9.5.5</c3p0.version> + <c3p0-hibernate.version>6.2.2.Final</c3p0-hibernate.version> + <apache-jena.version>4.10.0</apache-jena.version> + <opencsv.version>5.7.1</opencsv.version> + <super-csv.version>2.4.0</super-csv.version> + <keycloak.version>21.0.2</keycloak.version> + <springdoc-openapi.version>2.3.0</springdoc-openapi.version> + <testcontainers.version>1.19.1</testcontainers.version> + <keycloak-testcontainer.version>3.2.0</keycloak-testcontainer.version> + <aws-s3.version>2.25.23</aws-s3.version> + <jackson.version>2.15.2</jackson.version> + <minio.version>8.5.7</minio.version> + </properties> + + <dependencies> + <dependency> + <groupId>at.tuwien</groupId> + <artifactId>dbrepo-metadata-service-api</artifactId> + <version>${version}</version> + </dependency> + <dependency> + <groupId>at.tuwien</groupId> + <artifactId>dbrepo-metadata-service-repositories</artifactId> + <version>${version}</version> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-validation</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.security</groupId> + <artifactId>spring-security-test</artifactId> + <scope>test</scope> + </dependency> + <!-- IDE --> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + <scope>compile</scope> + </dependency> + <!-- Mapping --> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct-processor</artifactId> + <version>${mapstruct.version}</version> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.mapstruct</groupId> + <artifactId>mapstruct</artifactId> + <version>${mapstruct.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-jsr310</artifactId> + <version>${jackson-datatype.version}</version> + </dependency> + <dependency> + <groupId>commons-io</groupId> + <artifactId>commons-io</artifactId> + <version>${commons-io.version}</version> + </dependency> + <dependency> + <groupId>commons-validator</groupId> + <artifactId>commons-validator</artifactId> + <version>${commons-validator.version}</version> + </dependency> + <dependency> + <groupId>com.fasterxml.jackson.datatype</groupId> + <artifactId>jackson-datatype-hibernate6</artifactId> + <version>${jackson-datatype.version}</version> + </dependency> + <!-- Authentication --> + <dependency> + <groupId>org.keycloak</groupId> + <artifactId>keycloak-common</artifactId> + <version>${keycloak.version}</version> + </dependency> + <!-- Testing --> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>com.h2database</groupId> + <artifactId>h2</artifactId> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>junit-jupiter</artifactId> + <version>${testcontainers.version}</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.testcontainers</groupId> + <artifactId>minio</artifactId> + <version>${testcontainers.version}</version> + </dependency> + <dependency> + <groupId>com.github.dasniko</groupId> + <artifactId>testcontainers-keycloak</artifactId> + <version>${keycloak-testcontainer.version}</version> + <scope>test</scope> + </dependency> + </dependencies> + + <build> + <resources> + <resource> + <directory>${basedir}/src/main/resources</directory> + <filtering>true</filtering> + <includes> + <include>**/application*.yml</include> + <include>**/init/dbrepo-realm.json</include> + </includes> + </resource> + </resources> + </build> + +</project> diff --git a/dbrepo-upload-service/pre-create.sh b/dbrepo-upload-service/pre-create.sh new file mode 100755 index 0000000000..b166023fb5 --- /dev/null +++ b/dbrepo-upload-service/pre-create.sh @@ -0,0 +1,45 @@ +#!/bin/bash +REQUEST_RAW=$(cat /dev/stdin) +AUTH_SERVICE_ENDPOINT="${AUTH_SERVICE_ENDPOINT:-http://data-service:8080}" + +echo "[DEBUG] [pre-create hook] request started" >&2 +if [ "$(echo "$REQUEST_RAW" | jq '.Event.HTTPRequest.Header | has("Authorization")')" == "false" ]; then + echo "[ERROR] [pre-create hook] Missing header 'Authorization'" >&2 + echo "[DEBUG] [pre-create hook] raw request: ${REQUEST_RAW}" >&2 + cat <<END + { + "RejectUpload": true, + "HTTPResponse": { + "StatusCode": 400, + "Header": { + "Content-Type": "application/json" + }, + "Body": "{\"code\":\"error.upload.malformed\",\"message\":\"Missing header 'Authorization'\",\"status\":\"BAD_REQUEST\"}" + } + } +END + exit 0 +fi + +echo "[DEBUG] [pre-create hook] request has 'Authorization' header present" >&2 + +BEARER="$(echo "$REQUEST_RAW" | jq -r '.Event.HTTPRequest.Header.Authorization[0]')" +echo "[DEBUG] [pre-create hook] attempting to contact ${AUTH_SERVICE_ENDPOINT}" >&2 +if [ ! "$(wget -O- --quiet --header "Authorization: ${BEARER}" ${AUTH_SERVICE_ENDPOINT}/realms/dbrepo/protocol/openid-connect/userinfo)" ]; then + echo "[ERROR] [pre-create hook] Unauthorized" >&2 + cat <<END + { + "RejectUpload": true, + "HTTPResponse": { + "StatusCode": 401, + "Header": { + "Content-Type": "application/json" + }, + "Body": "{\"code\":\"error.upload.unauthorized\",\"message\":\"Authentication required\",\"status\":\"UNAUTHORIZED\"}" + } + } +END + exit 0 +fi + +echo "[INFO] [pre-create hook] Authorized" >&2 \ No newline at end of file diff --git a/dbrepo-upload-service/src/main/java/at/tuwien/Application.java b/dbrepo-upload-service/src/main/java/at/tuwien/Application.java new file mode 100644 index 0000000000..08ff7e84e7 --- /dev/null +++ b/dbrepo-upload-service/src/main/java/at/tuwien/Application.java @@ -0,0 +1,13 @@ +package at.tuwien; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/dbrepo-upload-service/src/main/resources/application-local.yml b/dbrepo-upload-service/src/main/resources/application-local.yml new file mode 100644 index 0000000000..34573c21f4 --- /dev/null +++ b/dbrepo-upload-service/src/main/resources/application-local.yml @@ -0,0 +1,82 @@ +spring: + datasource: + url: jdbc:h2:mem:fda;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS FDA;NON_KEYWORDS=value + driver-class-name: org.h2.Driver + username: sa + password: password + jpa: + show-sql: false + open-in-view: false + properties: + hibernate: + default_schema: dbrepo + jdbc: + time_zone: UTC + format_sql: false + application: + name: metadata-service + rabbitmq: + host: localhost + virtual-host: dbrepo + username: admin + password: admin + port: 5672 +management: + endpoints: + web: + exposure: + include: health,info,prometheus + endpoint: + health: + probes: + enabled: true + health: + readinessState: + enabled: true + livenessState: + enabled: true +server: + port: 19099 +logging: + pattern.console: "%d %highlight(%-5level) %msg%n" + level: + root: warn + at.tuwien.: trace + org.springframework.security.web.FilterChainProxy: debug +# org.hibernate.resource.jdbc: trace + org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug +dbrepo: + repository-name: Database Repository + base-url: http://localhost + admin-email: noreply@example.com + deleted-record: persistent + granularity: YYYY-MM-DDThh:mm:ssZ + exchangeName: dbrepo + queueName: dbrepo + connectionTimeout: 10000 + s3: + accessKeyId: seaweedfsadmin + secretAccessKey: seaweedfsadmin + bucket: dbrepo + system: + username: admin + password: admin + endpoints: + searchService: http://localhost + analyseService: http://localhost + dataService: http://localhost:9093 + brokerService: http://localhost:15672 + authService: http://localhost/api/auth + storageService: http://localhost/api/storage + rorService: https://api.ror.org + crossRefService: http://data.crossref.org + pid: + base: http://localhost/pid/ + jwt: + public_key: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB + keycloak: + username: admin + password: admin + client: dbrepo-client + clientSecret: MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG + website: http://localhost diff --git a/dbrepo-upload-service/src/main/resources/application.yml b/dbrepo-upload-service/src/main/resources/application.yml new file mode 100644 index 0000000000..2d79e7cfae --- /dev/null +++ b/dbrepo-upload-service/src/main/resources/application.yml @@ -0,0 +1,84 @@ +application: + title: DBRepo + version: '@project.version@' +spring: + datasource: + url: "jdbc:mariadb://${METADATA_HOST:metadata-db}:${METADATA_PORT:3306}/${METADATA_DB:dbrepo}${METADATA_JDBC_EXTRA_ARGS}" + driver-class-name: org.mariadb.jdbc.Driver + username: "${METADATA_USERNAME:root}" + password: "${METADATA_DB_PASSWORD:dbrepo}" + jpa: + show-sql: false + open-in-view: false + properties: + hibernate: + default_schema: "${METADATA_DB:dbrepo}" + jdbc: + time_zone: UTC + application: + name: metadata-service + rabbitmq: + host: "${BROKER_HOST:broker-service}" + virtual-host: "${BROKER_VIRTUALHOST:dbrepo}" + username: "${BROKER_USERNAME:admin}" + password: "${BROKER_PASSWORD:admin}" + port: ${BROKER_PORT:5672} + main: + banner-mode: off +management: + endpoints: + web: + exposure: + include: health,info,prometheus + endpoint: + health: + probes: + enabled: true + health: + readinessState: + enabled: true + livenessState: + enabled: true +server: + port: 8080 +logging: + pattern.console: "%d %highlight(%-5level) %msg%n" + level: + root: warn + at.tuwien.: "${LOG_LEVEL:info}" + org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver: debug +dbrepo: + repository-name: "${REPOSITORY_NAME:Database Repository}" + base-url: "${BASE_URL:http://localhost}" + admin-email: "${ADMIN_EMAIL:noreply@example.com}" + deleted-record: "${DELETED_RECORD:persistent}" + granularity: "${GRANULARITY:YYYY-MM-DDThh:mm:ssZ}" + exchangeName: "${BROKER_EXCHANGE_NAME:dbrepo}" + queueName: "${BROKER_QUEUE_NAME:dbrepo}" + connectionTimeout: "${SPARQL_CONNECTION_TIMEOUT:10000}" + s3: + accessKeyId: "${S3_ACCESS_KEY_ID:seaweedfsadmin}" + secretAccessKey: "${S3_SECRET_ACCESS_KEY:seaweedfsadmin}" + bucket: "${S3_BUCKET:dbrepo}" + system: + username: "${SYSTEM_USERNAME:admin}" + password: "${SYSTEM_PASSWORD:admin}" + endpoints: + analyseService: "${ANALYSE_SERVICE_ENDPOINT:http://analyse-service:8080}" + searchService: "${SEARCH_SERVICE_ENDPOINT:http://search-service:8080}" + dataService: "${DATA_SERVICE_ENDPOINT:http://data-service:8080}" + brokerService: "${BROKER_SERVICE_ENDPOINT:http://broker-service:15672}" + authService: "${AUTH_SERVICE_ENDPOINT:http://auth-service:8080}" + storageService: "${S3_ENDPOINT:http://storage-service:9000}" + rorService: "${ROR_ENDPOINT:https://api.ror.org}" + crossRefService: "${CROSSREF_ENDPOINT:http://data.crossref.org}" + pid: + base: "${BASE_URL:http://localhost}/pid/" + jwt: + public_key: "${JWT_PUBKEY:MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQAB}" + keycloak: + username: "${AUTH_SERVICE_ADMIN:admin}" + password: "${AUTH_SERVICE_ADMIN_PASSWORD:admin}" + client: "${AUTH_SERVICE_CLIENT:dbrepo-client}" + clientSecret: "${AUTH_SERVICE_CLIENT_SECRET:MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG}" + website: "${BASE_URL:http://localhost}" diff --git a/dbrepo-upload-service/src/test/java/at/tuwien/config/GatewayConfig.java b/dbrepo-upload-service/src/test/java/at/tuwien/config/GatewayConfig.java new file mode 100644 index 0000000000..e360cecfdc --- /dev/null +++ b/dbrepo-upload-service/src/test/java/at/tuwien/config/GatewayConfig.java @@ -0,0 +1,40 @@ +package at.tuwien.config; + +import at.tuwien.interceptor.KeycloakInterceptor; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.DefaultUriBuilderFactory; + +@Log4j2 +@Getter +@Configuration +public class GatewayConfig { + + @Value("${dbrepo.endpoints.keycloak}") + private String keycloakEndpoint; + + @Value("${dbrepo.keycloak.username}") + private String keycloakUsername; + + @Value("${dbrepo.keycloak.password}") + private String keycloakPassword; + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + @Bean("keycloakRestTemplate") + public RestTemplate keycloakRestTemplate() { + final RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(keycloakEndpoint)); + restTemplate.getInterceptors() + .add(new KeycloakInterceptor(restTemplate(), keycloakUsername, keycloakPassword, keycloakEndpoint)); + return restTemplate; + } + +} diff --git a/dbrepo-upload-service/src/test/java/at/tuwien/config/KeycloakConfig.java b/dbrepo-upload-service/src/test/java/at/tuwien/config/KeycloakConfig.java new file mode 100644 index 0000000000..01be743daa --- /dev/null +++ b/dbrepo-upload-service/src/test/java/at/tuwien/config/KeycloakConfig.java @@ -0,0 +1,83 @@ +package at.tuwien.config; + +import at.tuwien.api.auth.KeycloakErrorDto; +import at.tuwien.api.keycloak.UserCreateDto; +import at.tuwien.api.keycloak.UserDto; +import at.tuwien.exception.AuthServiceConnectionException; +import at.tuwien.exception.AuthServiceException; +import at.tuwien.exception.EmailExistsException; +import at.tuwien.exception.UserExistsException; +import lombok.Getter; +import lombok.extern.log4j.Log4j2; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.HttpServerErrorException; +import org.springframework.web.client.RestTemplate; + +@Log4j2 +@Getter +@Configuration +public class KeycloakConfig { + + @Value("${dbrepo.endpoints.keycloak}") + private String keycloakEndpoint; + + @Autowired + @Qualifier("keycloakRestTemplate") + private RestTemplate keycloakRestTemplate; + + public Boolean existsByUsername(String username) throws AuthServiceException, AuthServiceConnectionException { + final String path = "/admin/realms/dbrepo/users/?username=" + username; + final ResponseEntity<UserDto[]> response; + try { + response = keycloakRestTemplate.exchange(path, HttpMethod.GET, HttpEntity.EMPTY, UserDto[].class); + } catch (HttpServerErrorException e) { + log.error("Failed to find user: {}", e.getMessage()); + throw new AuthServiceConnectionException("Service unavailable", e); + } catch (Exception e) { + log.error("Failed to find user: unexpected response: {}", e.getMessage()); + throw new AuthServiceException("Unexpected result", e); + } + final UserDto[] body = response.getBody(); + if (body == null || body.length != 1) { + log.error("Failed to find user with username {}", username); + return false; + } + return true; + } + + public void createUser(UserCreateDto data) throws UserExistsException, EmailExistsException, + AuthServiceConnectionException, AuthServiceException { + final String path = "/admin/realms/dbrepo/users"; + final ResponseEntity<Void> response; + try { + response = keycloakRestTemplate.exchange(path, HttpMethod.POST, new HttpEntity<>(data), Void.class); + } catch (HttpServerErrorException e) { + log.error("Failed to create user: {}", e.getMessage()); + throw new AuthServiceConnectionException("Service unavailable", e); + } catch (HttpClientErrorException.Conflict e) { + if (e.getResponseBodyAsByteArray() != null && e.getResponseBodyAsByteArray().length > 0) { + final KeycloakErrorDto error = e.getResponseBodyAs(KeycloakErrorDto.class); + if (error != null && error.getErrorMessage().contains("same email")) { + log.error("Failed to create user: email exists: {}", e.getMessage()); + throw new EmailExistsException("E-Mail exists", e); + } + } + log.error("Failed to create user: user exists: {}", e.getMessage()); + throw new UserExistsException("User exists", e); + } + if (!response.getStatusCode().equals(HttpStatus.CREATED)) { + log.error("Failed to create user: unexpected status: {}", response.getStatusCode().value()); + throw new AuthServiceException("Unexpected status: " + response.getStatusCode().value()); + } + log.debug("Created user {} at auth service", data.getUsername()); + } + +} diff --git a/dbrepo-upload-service/src/test/java/at/tuwien/config/TusdConfig.java b/dbrepo-upload-service/src/test/java/at/tuwien/config/TusdConfig.java new file mode 100644 index 0000000000..af678238de --- /dev/null +++ b/dbrepo-upload-service/src/test/java/at/tuwien/config/TusdConfig.java @@ -0,0 +1,16 @@ +package at.tuwien.config; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestTemplate; + +@Getter +@Configuration +public class TusdConfig { + + @Value("${dbrepo.endpoints.tusd}") + private String tusdEndpoint; + +} diff --git a/dbrepo-upload-service/src/test/java/at/tuwien/config/TusdContainerConfig.java b/dbrepo-upload-service/src/test/java/at/tuwien/config/TusdContainerConfig.java new file mode 100644 index 0000000000..f862df28e9 --- /dev/null +++ b/dbrepo-upload-service/src/test/java/at/tuwien/config/TusdContainerConfig.java @@ -0,0 +1,71 @@ +package at.tuwien.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.testcontainers.containers.BindMode; +import org.testcontainers.containers.GenericContainer; +import org.testcontainers.images.PullPolicy; + +import java.io.File; + +@Configuration +public class TusdContainerConfig { + + public static TusdContainer getContainer() { + return TusdContainer.getInstance(); + } + + @Bean + public TusdContainer tusdContainer() { + return getContainer(); + } + + /** + * This class represents the customized MariaDB container. It is a singleton to avoid the recreation of containers + * which can be very time-consuming. + */ + public static class TusdContainer extends GenericContainer<TusdContainer> { + + private static TusdContainer instance; + + private boolean started = false; + + public static synchronized TusdContainer getInstance() { + final File filePath = new File("pre-create.sh"); + if (instance == null) { + instance = new TusdContainer("tusproject/tusd:v2.4.0"); + instance.withFileSystemBind(filePath.getAbsolutePath(), "/srv/tusd-hooks/pre-create", BindMode.READ_ONLY); + instance.withExposedPorts(8080); + instance.withCommand("-max-size=2000000000", + "-base-path=/api/upload/files/", + "-hooks-dir=/srv/tusd-hooks/"); + instance.withImagePullPolicy(PullPolicy.alwaysPull()); + } + return instance; + } + + private TusdContainer(String dockerImageName) { + super(dockerImageName); + } + + @Override + protected void configure() { + super.configure(); + } + + @Override + public synchronized void start() { + if (!started) { + super.stop(); + super.start(); + started = true; + } + } + + @Override + public void stop() { + // do nothing, JVM handles shut down + } + } +} diff --git a/dbrepo-upload-service/src/test/java/at/tuwien/interceptor/KeycloakInterceptor.java b/dbrepo-upload-service/src/test/java/at/tuwien/interceptor/KeycloakInterceptor.java new file mode 100644 index 0000000000..569653a104 --- /dev/null +++ b/dbrepo-upload-service/src/test/java/at/tuwien/interceptor/KeycloakInterceptor.java @@ -0,0 +1,61 @@ +package at.tuwien.interceptor; + +import at.tuwien.api.keycloak.TokenDto; +import lombok.extern.log4j.Log4j2; +import org.springframework.http.*; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.util.LinkedMultiValueMap; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.HttpServerErrorException; +import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.DefaultUriBuilderFactory; + +import java.io.IOException; + +@Log4j2 +public class KeycloakInterceptor implements ClientHttpRequestInterceptor { + + private final String adminUsername; + private final String adminPassword; + private final String keycloakEndpoint; + private final RestTemplate restTemplate; + + public KeycloakInterceptor(RestTemplate restTemplate, String adminUsername, String adminPassword, + String keycloakEndpoint) { + this.adminUsername = adminUsername; + this.adminPassword = adminPassword; + this.keycloakEndpoint = keycloakEndpoint; + this.restTemplate = restTemplate; + } + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) + throws IOException { + restTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(keycloakEndpoint)); + final HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + final MultiValueMap<String, String> payload = new LinkedMultiValueMap<>(); + payload.add("username", adminUsername); + payload.add("password", adminPassword); + payload.add("grant_type", "password"); + payload.add("client_id", "admin-cli"); + final String path = "/realms/master/protocol/openid-connect/token"; + log.trace("obtain admin token at endpoint {} with path {}", keycloakEndpoint, path); + final ResponseEntity<TokenDto> response; + try { + response = restTemplate.exchange(path, HttpMethod.POST, new HttpEntity<>(payload, headers), TokenDto.class); + } catch (ResourceAccessException | HttpServerErrorException.ServiceUnavailable e) { + log.error("Failed to obtain admin token: {}", e.getMessage()); + return execution.execute(request, body); + } + if (response.getBody() == null) { + return execution.execute(request, body); + } + request.getHeaders().set("Authorization", "Bearer " + response.getBody().getAccessToken()); + log.trace("set header: Authorization {} (shortened)", response.getBody().getAccessToken().substring(0, 5)); + return execution.execute(request, body); + } +} diff --git a/dbrepo-upload-service/src/test/java/at/tuwien/service/UploadServiceIntegrationTest.java b/dbrepo-upload-service/src/test/java/at/tuwien/service/UploadServiceIntegrationTest.java new file mode 100644 index 0000000000..30fd6752c3 --- /dev/null +++ b/dbrepo-upload-service/src/test/java/at/tuwien/service/UploadServiceIntegrationTest.java @@ -0,0 +1,138 @@ +package at.tuwien.service; + +import at.tuwien.api.error.ApiErrorDto; +import at.tuwien.api.keycloak.CredentialDto; +import at.tuwien.api.keycloak.CredentialTypeDto; +import at.tuwien.api.keycloak.UserCreateDto; +import at.tuwien.config.KeycloakConfig; +import at.tuwien.config.TusdConfig; +import at.tuwien.config.TusdContainerConfig; +import at.tuwien.exception.AuthServiceConnectionException; +import at.tuwien.exception.AuthServiceException; +import at.tuwien.exception.EmailExistsException; +import at.tuwien.exception.UserExistsException; +import at.tuwien.interceptor.KeycloakInterceptor; +import com.github.dockerjava.api.model.ExposedPort; +import dasniko.testcontainers.keycloak.KeycloakContainer; +import lombok.extern.log4j.Log4j2; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.*; +import org.springframework.test.context.DynamicPropertyRegistry; +import org.springframework.test.context.DynamicPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; +import org.springframework.web.client.HttpClientErrorException; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.DefaultUriBuilderFactory; +import org.testcontainers.images.PullPolicy; +import org.testcontainers.junit.jupiter.Container; +import org.testcontainers.junit.jupiter.Testcontainers; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; + +@Log4j2 +@Testcontainers +@SpringBootTest +@ExtendWith(SpringExtension.class) +public class UploadServiceIntegrationTest { + + @Autowired + private RestTemplate restTemplate; + + @Autowired + private TusdConfig tusdConfig; + + @Autowired + private KeycloakConfig keycloakConfig; + + @Container + private static TusdContainerConfig.TusdContainer tusdContainer = TusdContainerConfig.TusdContainer.getInstance(); + + @Container + private static KeycloakContainer keycloakContainer = new KeycloakContainer("quay.io/keycloak/keycloak:24.0") + .withImagePullPolicy(PullPolicy.alwaysPull()) + .withRealmImportFile("init/dbrepo-realm.json") + .withEnv("KC_HOSTNAME_STRICT_HTTPS", "false") + .withCreateContainerCmdModifier(it -> it.withName("auth-service") + .withExposedPorts(ExposedPort.tcp(8080))); + + @DynamicPropertySource + static void dynamicProperties(DynamicPropertyRegistry registry) { + registry.add("dbrepo.endpoints.tusd", () -> "http://localhost:" + tusdContainer.getMappedPort(8080) + "/api/upload/files"); + registry.add("dbrepo.endpoints.keycloak", () -> keycloakContainer.getAuthServerUrl()); + } + + @BeforeEach + public void beforeEach() throws UserExistsException, AuthServiceException, AuthServiceConnectionException, + EmailExistsException { + if (keycloakConfig.existsByUsername(keycloakContainer.getAdminUsername())) { + return; + } + final UserCreateDto payload = UserCreateDto.builder() + .username(keycloakContainer.getAdminUsername()) + .credentials(List.of(CredentialDto.builder() + .temporary(false) + .type(CredentialTypeDto.PASSWORD) + .value(keycloakContainer.getAdminPassword()) + .build())) + .build(); + keycloakConfig.createUser(payload); + } + + @Test + public void upload_missingAuthentication_fails() { + final HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.set("Tus-Resumable", "1.0.0"); + requestHeaders.set("Upload-Length", "100"); + requestHeaders.set("Content-Type", "application/offset+octet-stream"); + + /* test */ + assertThrows(HttpClientErrorException.BadRequest.class, () -> { + restTemplate.exchange(tusdConfig.getTusdEndpoint(), HttpMethod.POST, new HttpEntity<>("Hello this is a test aaa", requestHeaders), ApiErrorDto.class); + }); + } + + @Test + public void upload_invalidAuthentication_fails() { + final HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.set("Tus-Resumable", "1.0.0"); + requestHeaders.set("Upload-Length", "100"); + requestHeaders.set("Content-Type", "application/offset+octet-stream"); + requestHeaders.set("Authorization", "ey12345"); + + /* test */ + assertThrows(HttpClientErrorException.Unauthorized.class, () -> { + restTemplate.exchange(tusdConfig.getTusdEndpoint(), HttpMethod.POST, new HttpEntity<>("Hello this is a test aaa", requestHeaders), ApiErrorDto.class); + }); + } + + @Test + public void upload_succeeds() { + final RestTemplate uploadRestTemplate = new RestTemplate(); + uploadRestTemplate.setUriTemplateHandler(new DefaultUriBuilderFactory(tusdConfig.getTusdEndpoint())); + uploadRestTemplate.getInterceptors() + .add(new KeycloakInterceptor(restTemplate, keycloakContainer.getAdminUsername(), + keycloakContainer.getAdminPassword(), keycloakConfig.getKeycloakEndpoint())); + + /* test */ + final HttpHeaders requestHeaders = new HttpHeaders(); + requestHeaders.set("Tus-Resumable", "1.0.0"); + requestHeaders.set("Upload-Length", "100"); + requestHeaders.set("Content-Type", "application/offset+octet-stream"); + try { + final ResponseEntity<Void> response = uploadRestTemplate.exchange("", HttpMethod.POST, new HttpEntity<>( + "Hello this is a test aaa", requestHeaders), Void.class); + } catch (Exception e) { + /* ignore */ + } + System.out.println(""); +// assertEquals(HttpStatus.OK, response.getStatusCode()); + } + +} diff --git a/dbrepo-upload-service/src/test/resources/application.properties b/dbrepo-upload-service/src/test/resources/application.properties new file mode 100644 index 0000000000..088fec498b --- /dev/null +++ b/dbrepo-upload-service/src/test/resources/application.properties @@ -0,0 +1,23 @@ +# enable local spring profile +spring.profiles.active=local,junit + +# disable discovery +spring.cloud.discovery.enabled=false + +# internal datasource +spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_ON_EXIT=FALSE;INIT=CREATE SCHEMA IF NOT EXISTS DBREPO;NON_KEYWORDS=value +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.username=sa +spring.datasource.password=password +spring.jpa.database-platform=org.hibernate.dialect.H2Dialect +spring.sql.init.mode=always +spring.sql.init.schema-locations=classpath*:init/schema.sql +spring.jpa.hibernate.ddl-auto=create + +# logging +logging.level.root=error +logging.level.at.tuwien.=trace +logging.level.org.testcontainers.=info +logging.level.tc.=info +logging.level.com.github.dockerjava.=warn +logging.level.com.github.dockerjava.zerodep.shaded.org.apache.hc.client5.http.wire.=off diff --git a/dbrepo-upload-service/src/test/resources/init/dbrepo-realm.json b/dbrepo-upload-service/src/test/resources/init/dbrepo-realm.json new file mode 100644 index 0000000000..588053e15f --- /dev/null +++ b/dbrepo-upload-service/src/test/resources/init/dbrepo-realm.json @@ -0,0 +1,2822 @@ +{ + "id" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "realm" : "dbrepo", + "notBefore" : 0, + "defaultSignatureAlgorithm" : "RS256", + "revokeRefreshToken" : false, + "refreshTokenMaxReuse" : 1, + "accessTokenLifespan" : 900, + "accessTokenLifespanForImplicitFlow" : 900, + "ssoSessionIdleTimeout" : 864000, + "ssoSessionMaxLifespan" : 2592000, + "ssoSessionIdleTimeoutRememberMe" : 0, + "ssoSessionMaxLifespanRememberMe" : 0, + "offlineSessionIdleTimeout" : 2592000, + "offlineSessionMaxLifespanEnabled" : false, + "offlineSessionMaxLifespan" : 5184000, + "clientSessionIdleTimeout" : 0, + "clientSessionMaxLifespan" : 0, + "clientOfflineSessionIdleTimeout" : 0, + "clientOfflineSessionMaxLifespan" : 0, + "accessCodeLifespan" : 60, + "accessCodeLifespanUserAction" : 300, + "accessCodeLifespanLogin" : 1800, + "actionTokenGeneratedByAdminLifespan" : 43200, + "actionTokenGeneratedByUserLifespan" : 1800, + "oauth2DeviceCodeLifespan" : 600, + "oauth2DevicePollingInterval" : 5, + "enabled" : true, + "sslRequired" : "none", + "registrationAllowed" : false, + "registrationEmailAsUsername" : false, + "rememberMe" : false, + "verifyEmail" : true, + "loginWithEmailAllowed" : false, + "duplicateEmailsAllowed" : false, + "resetPasswordAllowed" : false, + "editUsernameAllowed" : false, + "bruteForceProtected" : false, + "permanentLockout" : false, + "maxFailureWaitSeconds" : 900, + "minimumQuickLoginWaitSeconds" : 60, + "waitIncrementSeconds" : 60, + "quickLoginCheckMilliSeconds" : 1000, + "maxDeltaTimeSeconds" : 43200, + "failureFactor" : 30, + "roles" : { + "realm" : [ { + "id" : "48f38342-1e3f-427a-995d-c436eaee65cb", + "name" : "default-user-handling", + "description" : "${default-user-handling}", + "composite" : true, + "composites" : { + "realm" : [ "modify-user-theme", "modify-user-information" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "9bb4a8dc-28e0-4645-b62f-cc94425f0cb0", + "name" : "default-maintenance-handling", + "description" : "${default-maintenance-handling}", + "composite" : true, + "composites" : { + "realm" : [ "create-maintenance-message", "find-maintenance-message", "update-maintenance-message", "delete-maintenance-message", "list-maintenance-messages" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "7ee1c424-11b0-46a9-b0ed-725e9b7fc40c", + "name" : "default-system-roles", + "description" : "${default-system-roles}", + "composite" : true, + "composites" : { + "realm" : [ "delete-database-view", "update-semantic-unit", "export-query-data", "default-data-steward-roles", "execute-query", "default-user-handling", "delete-table-data", "find-query", "list-database-views", "persist-query", "update-search-index", "delete-database-access", "view-table-history", "create-ontology", "update-ontology", "modify-user-theme", "default-system-roles", "create-semantic-concept", "default-container-handling", "create-container", "create-table", "default-broker-handling", "default-maintenance-handling", "execute-semantic-query", "uma_authorization", "table-semantic-analyse", "list-containers", "check-database-access", "escalated-query-handling", "delete-identifier", "modify-database-owner", "list-tables", "export-table-data", "create-database-access", "delete-container", "re-execute-query", "create-semantic-unit", "escalated-identifier-handling", "system", "update-table-statistic", "escalated-semantics-handling", "default-database-handling", "delete-ontology", "find-database", "find-database-view", "update-semantic-concept", "find-user", "import-database-data", "publish-identifier", "default-roles-dbrepo", "find-foreign-user", "create-database", "create-maintenance-message", "find-maintenance-message", "escalated-container-handling", "default-researcher-roles", "default-identifier-handling", "escalated-user-handling", "modify-user-information", "create-database-view", "update-maintenance-message", "delete-foreign-table", "offline_access", "modify-foreign-table-column-semantics", "delete-maintenance-message", "find-container", "insert-table-data", "modify-identifier-metadata", "modify-database-image", "escalated-broker-handling", "modify-table-column-semantics", "escalated-database-handling", "default-semantics-handling", "update-database-access", "default-query-handling", "find-table", "list-queries", "default-developer-roles", "create-identifier", "escalated-table-handling", "find-identifier", "view-database-view-data", "view-table-data", "list-licenses", "default-table-handling", "list-identifiers", "create-foreign-identifier", "list-databases", "list-ontologies", "modify-database-visibility", "list-maintenance-messages", "delete-table" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "143ba359-5fa2-451e-8296-43ecf20bb251", + "name" : "update-semantic-concept", + "description" : "${update-semantic-concept}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "5136d7a3-e3f0-4585-bacd-15cb8a56095c", + "name" : "escalated-container-handling", + "description" : "${escalated-container-handling}", + "composite" : true, + "composites" : { + "realm" : [ "create-container", "delete-container" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "b0bc8649-7d84-4dd3-84f0-7f174425babe", + "name" : "list-tables", + "description" : "${list-tables}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "bfd85d9c-2772-4660-a8f0-cdc0cd8252b3", + "name" : "default-database-handling", + "description" : "${default-database-handling}", + "composite" : true, + "composites" : { + "realm" : [ "modify-database-image", "modify-database-owner", "update-database-access", "create-database", "list-databases", "create-database-access", "find-database", "modify-database-visibility", "import-database-data", "delete-database-access", "check-database-access" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "74648f9a-777e-4ef9-b97b-4c5d749d862f", + "name" : "update-search-index", + "description" : "${update-search-index}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "22492b64-c633-48a0-9678-b28669f2885b", + "name" : "execute-semantic-query", + "description" : "${execute-semantic-query}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "4ed919fa-edc5-44e5-9411-607786e4a86d", + "name" : "view-table-history", + "description" : "${view-table-history}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "d89a2881-b642-4abb-b990-196e71372f6b", + "name" : "default-table-handling", + "description" : "${default-table-handling}", + "composite" : true, + "composites" : { + "realm" : [ "modify-table-column-semantics", "list-tables", "update-table-statistic", "find-table", "create-table", "delete-table" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "b0d66d3d-59b4-4aae-aa66-e3d5a49f28e3", + "name" : "view-database-view-data", + "description" : "${view-database-view-data}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "f5ea431a-9b2c-4195-bcb4-9511f38e4b44", + "name" : "create-database-view", + "description" : "${create-database-view}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "a5ffc20e-8b11-498c-9f3b-b5740aec24c7", + "name" : "default-semantics-handling", + "description" : "${default-semantics-handling}", + "composite" : true, + "composites" : { + "realm" : [ "create-semantic-unit", "create-semantic-concept", "execute-semantic-query", "table-semantic-analyse" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "fe4a01f3-6590-4df6-9ade-5a9c1fae4736", + "name" : "create-semantic-unit", + "description" : "${create-semantic-unit}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "0e12eedf-545d-4d32-ac4d-2821dcb118b8", + "name" : "update-table-statistic", + "description" : "${update-table-statistic}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "e63e61a2-d852-4ad3-bfb5-92d9ceafef6a", + "name" : "escalated-user-handling", + "description" : "${escalated-user-handling}", + "composite" : true, + "composites" : { + "realm" : [ "find-user" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "be4e1aba-e276-4241-b6ea-01dce6c52f8b", + "name" : "find-container", + "description" : "${find-container}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "3a801b48-f3c2-4bc6-aa25-c7a91d5b32a7", + "name" : "default-researcher-roles", + "description" : "${default-researcher-roles}", + "composite" : true, + "composites" : { + "realm" : [ "default-table-handling", "default-semantics-handling", "default-container-handling", "default-query-handling", "default-user-handling", "default-database-handling", "default-broker-handling", "default-identifier-handling" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "3d8104fb-8307-40f0-b4b2-c3e518957110", + "name" : "view-table-data", + "description" : "${view-table-data}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "fe71b907-7020-44ab-9964-da2b87264582", + "name" : "create-database", + "description" : "${create-database}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "e51b63c2-48dd-4bd6-95fb-d257d21b26ba", + "name" : "import-database-data", + "description" : "${import-database-data}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "1f0a9b13-c2b8-474c-bc08-59dbd71835a6", + "name" : "modify-database-image", + "description" : "${modify-database-image}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "a7ad038c-5c06-42fc-951c-15ac09d4df66", + "name" : "modify-database-owner", + "description" : "${modify-database-owner}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "c12c1f4e-186f-4153-a795-26e79fb623d6", + "name" : "create-ontology", + "description" : "${create-ontology}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "b60a5694-4099-4f7d-a7e9-4c433e0eb9c9", + "name" : "update-semantic-unit", + "description" : "${update-semantic-unit}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "e9854bbb-4580-4757-b1ae-305934173249", + "name" : "create-database-access", + "description" : "${create-database-access}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "50c604c1-7c6e-43f3-9c43-2398f5eff66e", + "name" : "list-databases", + "description" : "${list-databases}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "535f1484-4514-4d24-8d97-e3f6c11a426b", + "name" : "create-container", + "description" : "${create-container}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "f4116230-8642-4bb7-bbc8-db9c5c07b558", + "name" : "create-maintenance-message", + "description" : "${create-maintenance-message}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "973f0999-cc70-4b28-9f43-979c470bea8e", + "name" : "default-data-steward-roles", + "description" : "${default-data-steward-roles}", + "composite" : true, + "composites" : { + "realm" : [ "escalated-identifier-handling", "default-semantics-handling", "escalated-semantics-handling", "default-user-handling" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "e1383fb7-d54c-4732-9146-93030eb2ca50", + "name" : "escalated-query-handling", + "description" : "${escalated-query-handling}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "993b5c69-9eb2-42af-ac28-b4a46c6b61f2", + "name" : "find-user", + "description" : "${find-user}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "e4cfdc4d-2373-477b-a8df-161db99aba00", + "name" : "create-foreign-identifier", + "description" : "${create-foreign-identifier}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "6a5872a5-2b51-415d-ae2d-25a6db4a35df", + "name" : "escalated-semantics-handling", + "description" : "${escalated-semantics-handling}", + "composite" : true, + "composites" : { + "realm" : [ "update-semantic-unit", "create-ontology", "update-ontology", "list-ontologies", "delete-ontology", "modify-foreign-table-column-semantics", "update-semantic-concept" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "09147c48-273b-450b-8b11-7ef9b9245244", + "name" : "export-table-data", + "description" : "${export-table-data}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "d14af590-60a8-4d75-b864-40ee0165bd7f", + "name" : "delete-database-access", + "description" : "${delete-database-access}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "be051d45-cd74-4b13-8a45-f2d3351bd995", + "name" : "table-semantic-analyse", + "description" : "${table-semantic-analyse}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "272a79a7-e282-4261-8f7d-5d5d1364243a", + "name" : "update-maintenance-message", + "description" : "${update-maintenance-message}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "64c16bfb-2015-48ad-a23f-637ff24419cb", + "name" : "default-query-handling", + "description" : "${default-query-handling}", + "composite" : true, + "composites" : { + "realm" : [ "delete-database-view", "export-query-data", "execute-query", "delete-table-data", "export-table-data", "list-queries", "find-query", "list-database-views", "persist-query", "view-database-view-data", "view-table-data", "re-execute-query", "view-table-history", "create-database-view", "find-database-view", "insert-table-data" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "c047d521-cec3-4444-86c4-aef098489b7b", + "name" : "delete-maintenance-message", + "description" : "${delete-maintenance-message}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "88f82262-be80-4d18-9fb4-5529da031f33", + "name" : "system", + "description" : "${system}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "e14ab76b-1c24-484d-ae2d-478b8457edea", + "name" : "list-licenses", + "description" : "${list-licenses}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "d4f29937-3ca0-41e9-9786-2b7b921b6cdd", + "name" : "modify-foreign-table-column-semantics", + "description" : "${modify-foreign-table-column-semantics}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "8eda9f5c-938c-4915-bed5-6a81a1de15a8", + "name" : "list-database-views", + "description" : "${list-database-views}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "b372f8f7-d203-4293-b991-ad93fb505917", + "name" : "escalated-database-handling", + "description" : "${escalated-database-handling}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "abd2d9ee-ebc4-4d0a-839e-6b588a6d442a", + "name" : "default-roles-dbrepo", + "description" : "${role_default-roles}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "3293799a-82b9-4f47-8f25-1aad2e0222fd", + "name" : "find-identifier", + "description" : "${find-identifier}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "aaa3f804-38a0-4474-b8e9-f1020c4b3f62", + "name" : "list-queries", + "description" : "${list-queries}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "76e38f7b-99bf-4d12-8d74-1c7d8812f443", + "name" : "update-ontology", + "description" : "${update-ontology}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "11f7973e-d1eb-42cb-a35d-c59dfc122775", + "name" : "modify-user-theme", + "description" : "${modify-user-theme}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "f392bfcb-0be5-4fad-9ce4-8ac6396f176d", + "name" : "export-query-data", + "description" : "${export-query-data}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "da493b7e-fb9b-43ca-82a5-e274ad2e6b39", + "name" : "find-query", + "description" : "${find-query}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "a4d4a788-ebcf-4d32-baed-4a85616ca037", + "name" : "escalated-identifier-handling", + "description" : "${escalated-identifier-handling}", + "composite" : true, + "composites" : { + "realm" : [ "create-foreign-identifier", "modify-identifier-metadata" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "ea38d69d-17b8-4c65-95e8-1c3501b83618", + "name" : "default-container-handling", + "description" : "${default-container-handling}", + "composite" : true, + "composites" : { + "realm" : [ "find-container", "list-containers" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "8b8813e0-af07-4d04-a8c1-e3f37192bace", + "name" : "publish-identifier", + "description" : "${publish-identifier}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "47f5eee7-9821-4bf8-b434-0da1f81c3e5a", + "name" : "default-broker-handling", + "description" : "${default-broker-handling}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "71874bde-64a5-4a69-8685-d8998303a80c", + "name" : "delete-table-data", + "description" : "${delete-table-data}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "7c0306fc-3b03-4c64-87d1-9a34f2073977", + "name" : "modify-table-column-semantics", + "description" : "${modify-table-column-semantics}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "cd0ee04c-4a5e-4035-a11b-f6a1165f7829", + "name" : "delete-container", + "description" : "${delete-container}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "67ee39c0-d601-4a67-a0fe-c4f0021d557e", + "name" : "list-containers", + "description" : "${list-containers}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "795c7bb8-3502-414a-a97b-2ba1cfd6a79c", + "name" : "persist-query", + "description" : "${persist-query}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "d05e7698-ddf5-4f20-9027-771afb2cc3c7", + "name" : "list-identifiers", + "description" : "${list-identifiers}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "e4bfaf36-9a5d-43e0-9fa3-0f4ea7bad8d0", + "name" : "default-developer-roles", + "description" : "${default-developer-roles}", + "composite" : true, + "composites" : { + "realm" : [ "escalated-query-handling", "escalated-broker-handling", "default-table-handling", "escalated-database-handling", "default-container-handling", "default-query-handling", "default-user-handling", "default-database-handling", "default-maintenance-handling", "escalated-container-handling", "escalated-table-handling", "default-identifier-handling" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "e2cb054e-ea41-4ab0-881b-e6f576f7424e", + "name" : "create-semantic-concept", + "description" : "${create-semantic-concept}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "feb612cc-96a6-4ed2-aaa5-01f39b25beb5", + "name" : "insert-table-data", + "description" : "${insert-table-data}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "a0942e33-441b-4343-9f02-4353d03f7bbb", + "name" : "find-database", + "description" : "${find-database}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "6a0bb740-4448-49be-aee8-6dd183325be5", + "name" : "delete-foreign-table", + "description" : "${delete-foreign-table}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "7f3652c7-3073-4566-ab63-25385495ebc3", + "name" : "modify-database-visibility", + "description" : "${modify-database-visibility}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "4a5df51d-f14d-41a2-ad70-6521df5a5b4f", + "name" : "offline_access", + "description" : "${role_offline-access}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "fd41c4c3-d2f8-4f49-84c7-dba84e9a5575", + "name" : "execute-query", + "description" : "${execute-query}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "2963c2bb-b129-4224-b98f-c8eeab8e72d1", + "name" : "create-table", + "description" : "${create-table}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "0c487c93-448f-4a82-8b9f-ebd8a0904bf8", + "name" : "find-foreign-user", + "description" : "${find-foreign-user}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "cf9735a9-fb70-4cc5-b5f4-75afc4e5654b", + "name" : "modify-identifier-metadata", + "description" : "${modify-identifier-metadata}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "64c2b8f2-1527-4928-81ea-b2651512d028", + "name" : "delete-ontology", + "description" : "${delete-ontology}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "d6e38368-b40f-423b-82e4-e8aa595237c9", + "name" : "find-maintenance-message", + "description" : "${find-maintenance-message}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "fd1cc463-3e67-49d9-81b8-2cd90c1daa9c", + "name" : "check-database-access", + "description" : "${check-database-access}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "74013867-e426-46cc-ab98-2f4a9225ad1e", + "name" : "find-table", + "description" : "${find-table}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "a2cc60df-d280-46c5-a539-92e2aa249b4a", + "name" : "modify-user-information", + "description" : "${modify-user-information}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "c367241f-b5b5-491f-84d5-07fe1bef3877", + "name" : "default-identifier-handling", + "description" : "${default-identifier-handling}", + "composite" : true, + "composites" : { + "realm" : [ "delete-identifier", "list-identifiers", "create-identifier", "find-identifier", "publish-identifier" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "ba1ad8f2-39aa-487d-987f-645e8a459559", + "name" : "delete-table", + "description" : "${delete-table}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "09f7bdb0-296f-46c8-a3a3-8f9254fb17e4", + "name" : "list-maintenance-messages", + "description" : "${list-maintenance-messages}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "fe3bc45c-61c2-4ece-bcaf-d410dc7de501", + "name" : "update-database-access", + "description" : "${update-database-access}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "f43e86ed-76de-4ca8-9b5e-c292c9359bfe", + "name" : "escalated-broker-handling", + "description" : "${escalated-broker-handling}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "916b1e65-f60c-42cd-96e4-5c98ffc1ba3c", + "name" : "uma_authorization", + "description" : "${role_uma_authorization}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "d1afa3ed-bf4f-469a-a061-ad7325fb8d9e", + "name" : "delete-database-view", + "description" : "${delete-database-view}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "6f044bad-6651-4408-bffa-20c2d8f92eee", + "name" : "create-identifier", + "description" : "${create-identifier}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "be91195a-e30a-4d15-a8da-0aca0a68782f", + "name" : "escalated-table-handling", + "description" : "${escalated-table-handling}", + "composite" : true, + "composites" : { + "realm" : [ "delete-foreign-table" ] + }, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "98bee7d6-d78c-4e7f-b6a3-3705968b248c", + "name" : "list-ontologies", + "description" : "${list-ontologies}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "15720c6b-027d-4d53-a0ff-0124bfab7c4c", + "name" : "re-execute-query", + "description" : "${re-execute-query}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "a9b5181a-8135-41d3-9862-ef80af42211d", + "name" : "delete-identifier", + "description" : "${delete-identifier}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + }, { + "id" : "469c2e63-cda6-48d4-ab8f-eb59a2c69798", + "name" : "find-database-view", + "description" : "${find-database-view}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0", + "attributes" : { } + } ], + "client" : { + "realm-management" : [ { + "id" : "4628f654-f8f3-483b-8f92-2a7fc5930b14", + "name" : "query-realms", + "description" : "${role_query-realms}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "95c2cc47-12f5-4d73-8b74-67e270c45ade", + "name" : "manage-authorization", + "description" : "${role_manage-authorization}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "824791f3-c345-42f8-b103-b7e6d7e40114", + "name" : "manage-identity-providers", + "description" : "${role_manage-identity-providers}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "1f840202-b7e2-4195-bac9-64e64dad2037", + "name" : "view-identity-providers", + "description" : "${role_view-identity-providers}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "3c32c096-bb13-44c9-a080-d756a48a9ea3", + "name" : "query-clients", + "description" : "${role_query-clients}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "e4b85a68-7f31-4fcf-89a2-f10d7df358e9", + "name" : "view-authorization", + "description" : "${role_view-authorization}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "7d317752-ae56-46f2-a2ce-67c64d1b35f6", + "name" : "view-users", + "description" : "${role_view-users}", + "composite" : true, + "composites" : { + "client" : { + "realm-management" : [ "query-users", "query-groups" ] + } + }, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "28824208-976e-4622-b4d7-3d18efbb46fa", + "name" : "realm-admin", + "description" : "${role_realm-admin}", + "composite" : true, + "composites" : { + "client" : { + "realm-management" : [ "query-realms", "view-identity-providers", "manage-identity-providers", "manage-authorization", "query-clients", "view-authorization", "view-users", "manage-users", "view-realm", "query-users", "view-clients", "query-groups", "create-client", "manage-clients", "manage-events", "impersonation", "view-events", "manage-realm" ] + } + }, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "57e846a2-930d-4621-819d-c35086507146", + "name" : "manage-users", + "description" : "${role_manage-users}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "7fad9cde-bf96-475a-9174-14a87da51f95", + "name" : "view-realm", + "description" : "${role_view-realm}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "bbcac294-d78a-4ea1-a4bf-0384266d2fe1", + "name" : "query-users", + "description" : "${role_query-users}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "480e1437-ab9e-47de-b47a-edc6b6e285de", + "name" : "view-clients", + "description" : "${role_view-clients}", + "composite" : true, + "composites" : { + "client" : { + "realm-management" : [ "query-clients" ] + } + }, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "b9a9a8f5-f91e-4e73-9e88-1cdf42bd49f9", + "name" : "create-client", + "description" : "${role_create-client}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "4d1397fb-247c-436f-b26f-124cd89afb08", + "name" : "query-groups", + "description" : "${role_query-groups}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "e31f522b-b283-4ae1-b875-52afcd98b1d2", + "name" : "impersonation", + "description" : "${role_impersonation}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "51822d02-fa28-4a49-89da-bc534719d8a8", + "name" : "manage-clients", + "description" : "${role_manage-clients}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "b2743ce5-0ce8-4157-ae00-f693560f0b39", + "name" : "manage-events", + "description" : "${role_manage-events}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "7ea3d7e0-9bf4-438a-b773-243daf622aaa", + "name" : "view-events", + "description" : "${role_view-events}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + }, { + "id" : "fb73f6f5-0ed5-41d0-852c-0eb3b195b15a", + "name" : "manage-realm", + "description" : "${role_manage-realm}", + "composite" : false, + "clientRole" : true, + "containerId" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "attributes" : { } + } ], + "security-admin-console" : [ ], + "dbrepo-client" : [ ], + "admin-cli" : [ ], + "rabbitmq-client" : [ ], + "account-console" : [ ], + "broker" : [ { + "id" : "de0cfd5e-c2fe-4082-ac39-e3b092139a0f", + "name" : "read-token", + "description" : "${role_read-token}", + "composite" : false, + "clientRole" : true, + "containerId" : "88694c91-753d-4c44-9740-ec9ac06bba45", + "attributes" : { } + } ], + "account" : [ { + "id" : "acd78c04-eefc-4344-a5b4-3fc83d848936", + "name" : "delete-account", + "description" : "${role_delete-account}", + "composite" : false, + "clientRole" : true, + "containerId" : "e767a4a6-79e9-4e08-82b7-1076e1a09142", + "attributes" : { } + }, { + "id" : "939be844-8c49-45b3-9ca1-4b10a454b346", + "name" : "view-profile", + "description" : "${role_view-profile}", + "composite" : false, + "clientRole" : true, + "containerId" : "e767a4a6-79e9-4e08-82b7-1076e1a09142", + "attributes" : { } + }, { + "id" : "e52fdf00-3e73-4c17-bc1c-643493710a6b", + "name" : "view-applications", + "description" : "${role_view-applications}", + "composite" : false, + "clientRole" : true, + "containerId" : "e767a4a6-79e9-4e08-82b7-1076e1a09142", + "attributes" : { } + }, { + "id" : "b02a822e-a708-420a-bddc-1a315033fd7c", + "name" : "view-consent", + "description" : "${role_view-consent}", + "composite" : false, + "clientRole" : true, + "containerId" : "e767a4a6-79e9-4e08-82b7-1076e1a09142", + "attributes" : { } + }, { + "id" : "c590e5f5-2cbf-4151-b1dc-96c454f1f654", + "name" : "view-groups", + "description" : "${role_view-groups}", + "composite" : false, + "clientRole" : true, + "containerId" : "e767a4a6-79e9-4e08-82b7-1076e1a09142", + "attributes" : { } + }, { + "id" : "15974151-6c13-426b-8cc3-7683dd1311e1", + "name" : "manage-account-links", + "description" : "${role_manage-account-links}", + "composite" : false, + "clientRole" : true, + "containerId" : "e767a4a6-79e9-4e08-82b7-1076e1a09142", + "attributes" : { } + }, { + "id" : "c12d8d94-c2df-498e-bbe4-2f934a83ae92", + "name" : "manage-consent", + "description" : "${role_manage-consent}", + "composite" : true, + "composites" : { + "client" : { + "account" : [ "view-consent" ] + } + }, + "clientRole" : true, + "containerId" : "e767a4a6-79e9-4e08-82b7-1076e1a09142", + "attributes" : { } + }, { + "id" : "55f85811-bded-4d6b-8f7b-45844b963875", + "name" : "manage-account", + "description" : "${role_manage-account}", + "composite" : true, + "composites" : { + "client" : { + "account" : [ "manage-account-links" ] + } + }, + "clientRole" : true, + "containerId" : "e767a4a6-79e9-4e08-82b7-1076e1a09142", + "attributes" : { } + } ] + } + }, + "groups" : [ { + "id" : "f2ce17fe-7b15-47a4-bbf8-86f415298fa9", + "name" : "data-stewards", + "path" : "/data-stewards", + "attributes" : { }, + "realmRoles" : [ "default-data-steward-roles" ], + "clientRoles" : { }, + "subGroups" : [ ] + }, { + "id" : "124d9888-0b6e-46aa-8225-077dcedaf16e", + "name" : "developers", + "path" : "/developers", + "attributes" : { }, + "realmRoles" : [ "default-developer-roles" ], + "clientRoles" : { }, + "subGroups" : [ ] + }, { + "id" : "f467c38e-9041-4faa-ae0b-39cec65ff4db", + "name" : "researchers", + "path" : "/researchers", + "attributes" : { }, + "realmRoles" : [ "default-researcher-roles" ], + "clientRoles" : { }, + "subGroups" : [ ] + }, { + "id" : "2b9f94b4-d434-4a98-8eab-25678cfee983", + "name" : "system", + "path" : "/system", + "attributes" : { }, + "realmRoles" : [ "default-system-roles" ], + "clientRoles" : { }, + "subGroups" : [ ] + } ], + "defaultRole" : { + "id" : "abd2d9ee-ebc4-4d0a-839e-6b588a6d442a", + "name" : "default-roles-dbrepo", + "description" : "${role_default-roles}", + "composite" : false, + "clientRole" : false, + "containerId" : "82c39861-d877-4667-a0f3-4daa2ee230e0" + }, + "defaultGroups" : [ "/researchers" ], + "requiredCredentials" : [ "password" ], + "otpPolicyType" : "totp", + "otpPolicyAlgorithm" : "HmacSHA1", + "otpPolicyInitialCounter" : 0, + "otpPolicyDigits" : 6, + "otpPolicyLookAheadWindow" : 1, + "otpPolicyPeriod" : 30, + "otpPolicyCodeReusable" : false, + "otpSupportedApplications" : [ "totpAppGoogleName", "totpAppFreeOTPName", "totpAppMicrosoftAuthenticatorName" ], + "webAuthnPolicyRpEntityName" : "keycloak", + "webAuthnPolicySignatureAlgorithms" : [ "ES256" ], + "webAuthnPolicyRpId" : "", + "webAuthnPolicyAttestationConveyancePreference" : "not specified", + "webAuthnPolicyAuthenticatorAttachment" : "not specified", + "webAuthnPolicyRequireResidentKey" : "not specified", + "webAuthnPolicyUserVerificationRequirement" : "not specified", + "webAuthnPolicyCreateTimeout" : 0, + "webAuthnPolicyAvoidSameAuthenticatorRegister" : false, + "webAuthnPolicyAcceptableAaguids" : [ ], + "webAuthnPolicyPasswordlessRpEntityName" : "keycloak", + "webAuthnPolicyPasswordlessSignatureAlgorithms" : [ "ES256" ], + "webAuthnPolicyPasswordlessRpId" : "", + "webAuthnPolicyPasswordlessAttestationConveyancePreference" : "not specified", + "webAuthnPolicyPasswordlessAuthenticatorAttachment" : "not specified", + "webAuthnPolicyPasswordlessRequireResidentKey" : "not specified", + "webAuthnPolicyPasswordlessUserVerificationRequirement" : "not specified", + "webAuthnPolicyPasswordlessCreateTimeout" : 0, + "webAuthnPolicyPasswordlessAvoidSameAuthenticatorRegister" : false, + "webAuthnPolicyPasswordlessAcceptableAaguids" : [ ], + "scopeMappings" : [ { + "clientScope" : "rabbitmq.tag:administrator", + "roles" : [ "escalated-broker-handling" ] + }, { + "clientScope" : "rabbitmq.tag:management", + "roles" : [ "default-broker-handling" ] + } ], + "clientScopeMappings" : { + "account" : [ { + "client" : "account-console", + "roles" : [ "manage-account", "view-groups" ] + } ] + }, + "clients" : [ { + "id" : "e767a4a6-79e9-4e08-82b7-1076e1a09142", + "clientId" : "account", + "name" : "${client_account}", + "rootUrl" : "${authBaseUrl}", + "baseUrl" : "/realms/dbrepo/account/", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ "/realms/dbrepo/account/*" ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "post.logout.redirect.uris" : "+" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "d3c4a04e-39ce-4549-a34a-11e25774cd96", + "clientId" : "account-console", + "name" : "${client_account-console}", + "rootUrl" : "${authBaseUrl}", + "baseUrl" : "/realms/dbrepo/account/", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ "/realms/dbrepo/account/*" ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "post.logout.redirect.uris" : "+", + "pkce.code.challenge.method" : "S256" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "protocolMappers" : [ { + "id" : "22d90d9c-9881-474c-8dfd-a62c808a9f1c", + "name" : "audience resolve", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-audience-resolve-mapper", + "consentRequired" : false, + "config" : { } + } ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "81ef0f59-a5ca-4be4-a1d1-0c32edf1cfd6", + "clientId" : "admin-cli", + "name" : "${client_admin-cli}", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : false, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : true, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "post.logout.redirect.uris" : "+" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "88694c91-753d-4c44-9740-ec9ac06bba45", + "clientId" : "broker", + "name" : "${client_broker}", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : true, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : false, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "post.logout.redirect.uris" : "+" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "6b7ef364-4132-4831-b4e2-b6e9e9dc63ee", + "clientId" : "dbrepo-client", + "name" : "${dbrepo-client}", + "description" : "", + "rootUrl" : "", + "adminUrl" : "", + "baseUrl" : "", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : true, + "clientAuthenticatorType" : "client-secret", + "secret" : "MUwRc7yfXSJwX8AdRMWaQC3Nep1VjwgG", + "redirectUris" : [ "*" ], + "webOrigins" : [ "*" ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : true, + "serviceAccountsEnabled" : false, + "publicClient" : false, + "frontchannelLogout" : true, + "protocol" : "openid-connect", + "attributes" : { + "oidc.ciba.grant.enabled" : "false", + "client.secret.creation.time" : "1680085365", + "backchannel.logout.session.required" : "true", + "post.logout.redirect.uris" : "*", + "oauth2.device.authorization.grant.enabled" : "false", + "backchannel.logout.revoke.offline.tokens" : "false" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : true, + "nodeReRegistrationTimeout" : -1, + "protocolMappers" : [ { + "id" : "da0b27c1-ae2e-4baa-bf78-db233e15c78d", + "name" : "preferred_username", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "username", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "preferred_username", + "userinfo.token.claim" : "true" + } + }, { + "id" : "7c94de93-f60f-487b-b4b7-1891c67f74cc", + "name" : "aud", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-hardcoded-claim-mapper", + "consentRequired" : false, + "config" : { + "claim.value" : "dbrepo", + "userinfo.token.claim" : "true", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "aud", + "access.tokenResponse.claim" : "false" + } + }, { + "id" : "030a1cd9-53d1-4a62-a375-94d50a2dc6fc", + "name" : "uid", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "aggregate.attrs" : "false", + "multivalued" : "false", + "userinfo.token.claim" : "true", + "user.attribute" : "LDAP_ID", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "uid" + } + } ], + "defaultClientScopes" : [ "roles", "attributes" ], + "optionalClientScopes" : [ "rabbitmq.read:*/*", "web-origins", "acr", "rabbitmq.write:*/*", "address", "phone", "offline_access", "profile", "microprofile-jwt", "email", "rabbitmq.configure:*/*" ] + }, { + "id" : "25741f6b-4867-4138-8238-6345c6ba8702", + "clientId" : "rabbitmq-client", + "name" : "${rabbitmq-client}", + "description" : "", + "rootUrl" : "", + "adminUrl" : "", + "baseUrl" : "", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "secret" : "JEC2FexxrX4N65fLeDGukAl6R3Lc9y0u", + "redirectUris" : [ "*" ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : true, + "serviceAccountsEnabled" : false, + "publicClient" : false, + "frontchannelLogout" : true, + "protocol" : "openid-connect", + "attributes" : { + "oidc.ciba.grant.enabled" : "false", + "client.secret.creation.time" : "1680000860", + "backchannel.logout.session.required" : "true", + "post.logout.redirect.uris" : "*", + "oauth2.device.authorization.grant.enabled" : "false", + "backchannel.logout.revoke.offline.tokens" : "false" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : -1, + "protocolMappers" : [ { + "id" : "01a937ed-f0e8-4137-80f3-3be3c447f7fb", + "name" : "username", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "false", + "user.attribute" : "username", + "id.token.claim" : "false", + "access.token.claim" : "true", + "claim.name" : "client_id", + "jsonType.label" : "String" + } + }, { + "id" : "f1afc22d-f595-403b-ba2e-6ab19d98205e", + "name" : "Audience", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-hardcoded-claim-mapper", + "consentRequired" : false, + "config" : { + "claim.value" : "rabbitmq", + "userinfo.token.claim" : "false", + "id.token.claim" : "false", + "access.token.claim" : "true", + "claim.name" : "aud", + "access.tokenResponse.claim" : "false" + } + } ], + "defaultClientScopes" : [ "web-origins", "acr", "rabbitmq.tag:management" ], + "optionalClientScopes" : [ "rabbitmq.read:*/*", "rabbitmq.write:*/*", "address", "phone", "offline_access", "profile", "roles", "microprofile-jwt", "email", "rabbitmq.configure:*/*" ] + }, { + "id" : "cfffd5d0-aa19-4057-8ca0-f2c51ca0e930", + "clientId" : "realm-management", + "name" : "${client_realm-management}", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ ], + "webOrigins" : [ ], + "notBefore" : 0, + "bearerOnly" : true, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : false, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "post.logout.redirect.uris" : "+" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + }, { + "id" : "f205c451-9524-4380-acc3-947f7ecb6b7c", + "clientId" : "security-admin-console", + "name" : "${client_security-admin-console}", + "rootUrl" : "${authAdminUrl}", + "baseUrl" : "/admin/dbrepo/console/", + "surrogateAuthRequired" : false, + "enabled" : true, + "alwaysDisplayInConsole" : false, + "clientAuthenticatorType" : "client-secret", + "redirectUris" : [ "/admin/dbrepo/console/*" ], + "webOrigins" : [ "+" ], + "notBefore" : 0, + "bearerOnly" : false, + "consentRequired" : false, + "standardFlowEnabled" : true, + "implicitFlowEnabled" : false, + "directAccessGrantsEnabled" : false, + "serviceAccountsEnabled" : false, + "publicClient" : true, + "frontchannelLogout" : false, + "protocol" : "openid-connect", + "attributes" : { + "post.logout.redirect.uris" : "+", + "pkce.code.challenge.method" : "S256" + }, + "authenticationFlowBindingOverrides" : { }, + "fullScopeAllowed" : false, + "nodeReRegistrationTimeout" : 0, + "protocolMappers" : [ { + "id" : "c4d54410-3f22-4259-9571-94da2c43b752", + "name" : "locale", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "locale", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "locale", + "jsonType.label" : "String" + } + } ], + "defaultClientScopes" : [ "web-origins", "acr", "profile", "roles", "email" ], + "optionalClientScopes" : [ "address", "phone", "offline_access", "microprofile-jwt" ] + } ], + "clientScopes" : [ { + "id" : "69f4ecf0-4165-49ab-bf0d-38409b15b706", + "name" : "rabbitmq.tag:administrator", + "description" : "administrator", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "true", + "gui.order" : "", + "consent.screen.text" : "" + } + }, { + "id" : "7f6e9b44-e2eb-417d-b0fe-db820c9a6564", + "name" : "email", + "description" : "OpenID Connect built-in scope: email", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "true", + "consent.screen.text" : "${emailScopeConsentText}" + }, + "protocolMappers" : [ { + "id" : "782819fe-ba5d-4ddb-9f95-cabb69d79c8d", + "name" : "email verified", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "emailVerified", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "email_verified", + "jsonType.label" : "boolean" + } + }, { + "id" : "ca613fc8-bbf2-4240-8b33-a1874f1559f3", + "name" : "email", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "email", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "email", + "jsonType.label" : "String" + } + } ] + }, { + "id" : "b9da268f-6745-49dc-a764-3c54e385accc", + "name" : "profile", + "description" : "OpenID Connect built-in scope: profile", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "true", + "consent.screen.text" : "${profileScopeConsentText}" + }, + "protocolMappers" : [ { + "id" : "84f0487a-1d7d-470c-9b8e-5835294ae235", + "name" : "username", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "username", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "preferred_username", + "jsonType.label" : "String" + } + }, { + "id" : "bbdcdb36-3ec0-443d-b1af-9993d40f0567", + "name" : "gender", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "gender", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "gender", + "jsonType.label" : "String" + } + }, { + "id" : "9faa870b-5491-4ce9-b27d-c9ce07d6a95e", + "name" : "birthdate", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "birthdate", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "birthdate", + "jsonType.label" : "String" + } + }, { + "id" : "f0e3c012-9523-4076-83ae-e466e2d08220", + "name" : "full name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-full-name-mapper", + "consentRequired" : false, + "config" : { + "id.token.claim" : "true", + "access.token.claim" : "true", + "userinfo.token.claim" : "true" + } + }, { + "id" : "f757d8ec-e181-429c-9287-9ad0600b061f", + "name" : "profile", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "profile", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "profile", + "jsonType.label" : "String" + } + }, { + "id" : "18cfbf4b-0a8e-45c7-a832-c0f72c92f3f3", + "name" : "updated at", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "updatedAt", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "updated_at", + "jsonType.label" : "long" + } + }, { + "id" : "841ea785-26ab-429a-a420-09ce3948924d", + "name" : "family name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "lastName", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "family_name", + "jsonType.label" : "String" + } + }, { + "id" : "bfba13ff-f952-4e89-bbb1-a693fdebfae8", + "name" : "website", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "website", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "website", + "jsonType.label" : "String" + } + }, { + "id" : "475f071d-5149-4379-b928-76482f5f519c", + "name" : "zoneinfo", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "zoneinfo", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "zoneinfo", + "jsonType.label" : "String" + } + }, { + "id" : "b8bebfed-b5e9-4604-a0ee-9817f7d439ac", + "name" : "middle name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "middleName", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "middle_name", + "jsonType.label" : "String" + } + }, { + "id" : "445232c8-6830-476c-a6f1-8bbef167595a", + "name" : "picture", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "picture", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "picture", + "jsonType.label" : "String" + } + }, { + "id" : "65f2e474-6ede-4872-86e4-e49504dd0f2a", + "name" : "locale", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "locale", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "locale", + "jsonType.label" : "String" + } + }, { + "id" : "16cd5a27-ccf3-453c-ae1e-8621813ab73c", + "name" : "given name", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "firstName", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "given_name", + "jsonType.label" : "String" + } + }, { + "id" : "f9efedfc-3388-457c-b10a-1dff4525ff9b", + "name" : "nickname", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "nickname", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "nickname", + "jsonType.label" : "String" + } + } ] + }, { + "id" : "627fa054-08eb-4206-af71-9e838e984b8b", + "name" : "microprofile-jwt", + "description" : "Microprofile - JWT built-in scope", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "false" + }, + "protocolMappers" : [ { + "id" : "e6cc53e5-5d7e-468e-88c8-0737dd3dc759", + "name" : "groups", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-realm-role-mapper", + "consentRequired" : false, + "config" : { + "multivalued" : "true", + "userinfo.token.claim" : "true", + "user.attribute" : "foo", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "groups", + "jsonType.label" : "String" + } + }, { + "id" : "83b4444c-10fc-44e8-a0c0-0c1da1f9bba3", + "name" : "upn", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-property-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "username", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "upn", + "jsonType.label" : "String" + } + } ] + }, { + "id" : "4122ff9e-ad3c-4142-afc6-9aefdecfc86d", + "name" : "role_list", + "description" : "SAML role list", + "protocol" : "saml", + "attributes" : { + "consent.screen.text" : "${samlRoleListScopeConsentText}", + "display.on.consent.screen" : "true" + }, + "protocolMappers" : [ { + "id" : "bb0747fa-c008-4af3-93be-e7739650ebd5", + "name" : "role list", + "protocol" : "saml", + "protocolMapper" : "saml-role-list-mapper", + "consentRequired" : false, + "config" : { + "single" : "false", + "attribute.nameformat" : "Basic", + "attribute.name" : "Role" + } + } ] + }, { + "id" : "2e76447d-fbe7-4fa7-a16c-54a381b960ae", + "name" : "rabbitmq.configure:*/*", + "description" : "", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "false", + "gui.order" : "", + "consent.screen.text" : "" + } + }, { + "id" : "52aad832-c6c4-49df-8a04-6ad4a406fdfa", + "name" : "phone", + "description" : "OpenID Connect built-in scope: phone", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "true", + "consent.screen.text" : "${phoneScopeConsentText}" + }, + "protocolMappers" : [ { + "id" : "dae802fb-9138-408a-b80e-a40eb0f56814", + "name" : "phone number", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "phoneNumber", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "phone_number", + "jsonType.label" : "String" + } + }, { + "id" : "feb06a8d-b0eb-4911-8464-368d93f566fa", + "name" : "phone number verified", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "userinfo.token.claim" : "true", + "user.attribute" : "phoneNumberVerified", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "phone_number_verified", + "jsonType.label" : "boolean" + } + } ] + }, { + "id" : "f64d64e8-57ce-4eb2-b99e-9f02fdbd99f9", + "name" : "web-origins", + "description" : "OpenID Connect scope for add allowed web origins to the access token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "display.on.consent.screen" : "false", + "consent.screen.text" : "" + }, + "protocolMappers" : [ { + "id" : "c6411e3b-6478-453d-b530-5fe175a4d786", + "name" : "allowed web origins", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-allowed-origins-mapper", + "consentRequired" : false, + "config" : { } + } ] + }, { + "id" : "55341d34-0086-4173-ae61-d9b175b179d8", + "name" : "acr", + "description" : "OpenID Connect scope for add acr (authentication context class reference) to the token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "display.on.consent.screen" : "false" + }, + "protocolMappers" : [ { + "id" : "58ea3217-0fff-4207-9d08-919f5493b629", + "name" : "acr loa level", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-acr-mapper", + "consentRequired" : false, + "config" : { + "id.token.claim" : "true", + "access.token.claim" : "true", + "userinfo.token.claim" : "true" + } + } ] + }, { + "id" : "a02c2c38-923c-46ec-9899-321412b388e5", + "name" : "attributes", + "description" : "User Attributes", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "display.on.consent.screen" : "false", + "gui.order" : "", + "consent.screen.text" : "" + }, + "protocolMappers" : [ { + "id" : "78c461c1-f3f9-4d10-8835-097f13bdcd60", + "name" : "Theme", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-attribute-mapper", + "consentRequired" : false, + "config" : { + "aggregate.attrs" : "false", + "multivalued" : "false", + "userinfo.token.claim" : "true", + "user.attribute" : "theme_dark", + "id.token.claim" : "true", + "access.token.claim" : "true", + "claim.name" : "attributes.theme_dark" + } + } ] + }, { + "id" : "06062e22-89c0-4e1d-a25b-2483903b02d5", + "name" : "rabbitmq.write:*/*", + "description" : "", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "false", + "gui.order" : "", + "consent.screen.text" : "" + } + }, { + "id" : "db63e03b-7918-492f-997b-f2dda98f3b39", + "name" : "rabbitmq.tag:management", + "description" : "management", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "true", + "gui.order" : "", + "consent.screen.text" : "" + } + }, { + "id" : "210cc792-6c07-45a6-a77e-827cdf3b41ba", + "name" : "offline_access", + "description" : "OpenID Connect built-in scope: offline_access", + "protocol" : "openid-connect", + "attributes" : { + "consent.screen.text" : "${offlineAccessScopeConsentText}", + "display.on.consent.screen" : "true" + } + }, { + "id" : "425abf4a-2ee2-431d-aa92-e373a36fe556", + "name" : "address", + "description" : "OpenID Connect built-in scope: address", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "true", + "consent.screen.text" : "${addressScopeConsentText}" + }, + "protocolMappers" : [ { + "id" : "8d4ffe4d-1d01-4ca1-8ff4-44eacca61b30", + "name" : "address", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-address-mapper", + "consentRequired" : false, + "config" : { + "user.attribute.formatted" : "formatted", + "user.attribute.country" : "country", + "user.attribute.postal_code" : "postal_code", + "userinfo.token.claim" : "true", + "user.attribute.street" : "street", + "id.token.claim" : "true", + "user.attribute.region" : "region", + "access.token.claim" : "true", + "user.attribute.locality" : "locality" + } + } ] + }, { + "id" : "c96f0b73-ea79-4b46-93ef-d1092297f855", + "name" : "rabbitmq.read:*/*", + "description" : "", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "true", + "display.on.consent.screen" : "false", + "gui.order" : "", + "consent.screen.text" : "" + } + }, { + "id" : "37f61543-dad7-4a82-8e10-77acdd1eefdc", + "name" : "roles", + "description" : "OpenID Connect scope for add user roles to the access token", + "protocol" : "openid-connect", + "attributes" : { + "include.in.token.scope" : "false", + "display.on.consent.screen" : "true", + "consent.screen.text" : "${rolesScopeConsentText}" + }, + "protocolMappers" : [ { + "id" : "3b6b6914-8ad1-4a71-88ec-444f754aaacb", + "name" : "audience resolve", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-audience-resolve-mapper", + "consentRequired" : false, + "config" : { } + }, { + "id" : "2defedf5-9af3-4531-822c-a879dedcd29d", + "name" : "realm roles", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-realm-role-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "foo", + "access.token.claim" : "true", + "claim.name" : "realm_access.roles", + "jsonType.label" : "String", + "multivalued" : "true" + } + }, { + "id" : "a7bd6723-e58e-47f7-95c0-2925ce99283d", + "name" : "client roles", + "protocol" : "openid-connect", + "protocolMapper" : "oidc-usermodel-client-role-mapper", + "consentRequired" : false, + "config" : { + "user.attribute" : "foo", + "access.token.claim" : "true", + "claim.name" : "resource_access.${client_id}.roles", + "jsonType.label" : "String", + "multivalued" : "true" + } + } ] + } ], + "defaultDefaultClientScopes" : [ "rabbitmq.tag:administrator", "rabbitmq.tag:management" ], + "defaultOptionalClientScopes" : [ "rabbitmq.write:*/*", "offline_access", "rabbitmq.configure:*/*", "roles", "role_list", "address", "phone", "acr", "microprofile-jwt", "email", "attributes", "profile", "rabbitmq.read:*/*", "web-origins" ], + "browserSecurityHeaders" : { + "contentSecurityPolicyReportOnly" : "", + "xContentTypeOptions" : "nosniff", + "xRobotsTag" : "none", + "xFrameOptions" : "SAMEORIGIN", + "contentSecurityPolicy" : "frame-src 'self'; frame-ancestors 'self'; object-src 'none';", + "xXSSProtection" : "1; mode=block", + "strictTransportSecurity" : "max-age=31536000; includeSubDomains" + }, + "smtpServer" : { }, + "eventsEnabled" : false, + "eventsListeners" : [ "jboss-logging" ], + "enabledEventTypes" : [ "SEND_RESET_PASSWORD", "UPDATE_CONSENT_ERROR", "GRANT_CONSENT", "VERIFY_PROFILE_ERROR", "REMOVE_TOTP", "REVOKE_GRANT", "UPDATE_TOTP", "LOGIN_ERROR", "CLIENT_LOGIN", "RESET_PASSWORD_ERROR", "IMPERSONATE_ERROR", "CODE_TO_TOKEN_ERROR", "CUSTOM_REQUIRED_ACTION", "OAUTH2_DEVICE_CODE_TO_TOKEN_ERROR", "RESTART_AUTHENTICATION", "IMPERSONATE", "UPDATE_PROFILE_ERROR", "LOGIN", "OAUTH2_DEVICE_VERIFY_USER_CODE", "UPDATE_PASSWORD_ERROR", "CLIENT_INITIATED_ACCOUNT_LINKING", "TOKEN_EXCHANGE", "AUTHREQID_TO_TOKEN", "LOGOUT", "REGISTER", "DELETE_ACCOUNT_ERROR", "CLIENT_REGISTER", "IDENTITY_PROVIDER_LINK_ACCOUNT", "DELETE_ACCOUNT", "UPDATE_PASSWORD", "CLIENT_DELETE", "FEDERATED_IDENTITY_LINK_ERROR", "IDENTITY_PROVIDER_FIRST_LOGIN", "CLIENT_DELETE_ERROR", "VERIFY_EMAIL", "CLIENT_LOGIN_ERROR", "RESTART_AUTHENTICATION_ERROR", "EXECUTE_ACTIONS", "REMOVE_FEDERATED_IDENTITY_ERROR", "TOKEN_EXCHANGE_ERROR", "PERMISSION_TOKEN", "SEND_IDENTITY_PROVIDER_LINK_ERROR", "EXECUTE_ACTION_TOKEN_ERROR", "SEND_VERIFY_EMAIL", "OAUTH2_DEVICE_AUTH", "EXECUTE_ACTIONS_ERROR", "REMOVE_FEDERATED_IDENTITY", "OAUTH2_DEVICE_CODE_TO_TOKEN", "IDENTITY_PROVIDER_POST_LOGIN", "IDENTITY_PROVIDER_LINK_ACCOUNT_ERROR", "OAUTH2_DEVICE_VERIFY_USER_CODE_ERROR", "UPDATE_EMAIL", "REGISTER_ERROR", "REVOKE_GRANT_ERROR", "EXECUTE_ACTION_TOKEN", "LOGOUT_ERROR", "UPDATE_EMAIL_ERROR", "CLIENT_UPDATE_ERROR", "AUTHREQID_TO_TOKEN_ERROR", "UPDATE_PROFILE", "CLIENT_REGISTER_ERROR", "FEDERATED_IDENTITY_LINK", "SEND_IDENTITY_PROVIDER_LINK", "SEND_VERIFY_EMAIL_ERROR", "RESET_PASSWORD", "CLIENT_INITIATED_ACCOUNT_LINKING_ERROR", "OAUTH2_DEVICE_AUTH_ERROR", "UPDATE_CONSENT", "REMOVE_TOTP_ERROR", "VERIFY_EMAIL_ERROR", "SEND_RESET_PASSWORD_ERROR", "CLIENT_UPDATE", "CUSTOM_REQUIRED_ACTION_ERROR", "IDENTITY_PROVIDER_POST_LOGIN_ERROR", "UPDATE_TOTP_ERROR", "CODE_TO_TOKEN", "VERIFY_PROFILE", "GRANT_CONSENT_ERROR", "IDENTITY_PROVIDER_FIRST_LOGIN_ERROR" ], + "adminEventsEnabled" : false, + "adminEventsDetailsEnabled" : false, + "identityProviders" : [ ], + "identityProviderMappers" : [ ], + "components" : { + "org.keycloak.services.clientregistration.policy.ClientRegistrationPolicy" : [ { + "id" : "4d3f9f14-f5d2-4b0c-8ea7-e6d078aa2191", + "name" : "Max Clients Limit", + "providerId" : "max-clients", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "max-clients" : [ "200" ] + } + }, { + "id" : "f35bce67-1e75-408b-b065-52183368d4fd", + "name" : "Allowed Client Scopes", + "providerId" : "allowed-client-templates", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "allow-default-scopes" : [ "true" ] + } + }, { + "id" : "1849e52a-b8c9-44a8-af3d-ee19376a1ed1", + "name" : "Trusted Hosts", + "providerId" : "trusted-hosts", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "host-sending-registration-request-must-match" : [ "true" ], + "client-uris-must-match" : [ "true" ] + } + }, { + "id" : "f565cb47-3bcf-4078-8f94-eb4179c375b8", + "name" : "Full Scope Disabled", + "providerId" : "scope", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { } + }, { + "id" : "0efa669d-1017-4b4a-82e1-c2eaf72de2c9", + "name" : "Allowed Client Scopes", + "providerId" : "allowed-client-templates", + "subType" : "authenticated", + "subComponents" : { }, + "config" : { + "allow-default-scopes" : [ "true" ] + } + }, { + "id" : "528fb423-d66e-472e-9120-1f03ba9e0f18", + "name" : "Consent Required", + "providerId" : "consent-required", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { } + }, { + "id" : "104ec5a9-025b-4c44-8ac0-82d22887ca3e", + "name" : "Allowed Protocol Mapper Types", + "providerId" : "allowed-protocol-mappers", + "subType" : "authenticated", + "subComponents" : { }, + "config" : { + "allowed-protocol-mapper-types" : [ "oidc-address-mapper", "saml-user-property-mapper", "saml-role-list-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-user-attribute-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-full-name-mapper" ] + } + }, { + "id" : "3ab11d74-5e76-408a-b85a-26bf8950f979", + "name" : "Allowed Protocol Mapper Types", + "providerId" : "allowed-protocol-mappers", + "subType" : "anonymous", + "subComponents" : { }, + "config" : { + "allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-usermodel-attribute-mapper", "saml-role-list-mapper", "oidc-address-mapper", "oidc-usermodel-property-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper" ] + } + } ], + "org.keycloak.keys.KeyProvider" : [ { + "id" : "28ca0b6d-b2e2-4785-b04b-2391e6344e30", + "name" : "aes-generated", + "providerId" : "aes-generated", + "subComponents" : { }, + "config" : { + "kid" : [ "6dc4834f-a1de-4cfe-a29d-e84ac8e9b1a8" ], + "secret" : [ "HpuzG_jWYKwypLeoPEMC4A" ], + "priority" : [ "100" ] + } + }, { + "id" : "bd7945cf-6d35-4e03-9c3a-197f2dc76973", + "name" : "hmac-generated", + "providerId" : "hmac-generated", + "subComponents" : { }, + "config" : { + "kid" : [ "c8500166-5cc4-4085-ad0f-853c3b0b0233" ], + "secret" : [ "TI3xg__G2Qy8C47DracpYir2X4ItQZSrhgr5KSlwRNISDbBqZ-ky3OcAyokSXMcpweSOaCPvbivpvzJNklUBvw" ], + "priority" : [ "100" ], + "algorithm" : [ "HS256" ] + } + }, { + "id" : "2f53ccf3-37b0-4d34-83e7-ed497499ee51", + "name" : "rsa-enc-generated", + "providerId" : "rsa-enc-generated", + "subComponents" : { }, + "config" : { + "privateKey" : [ "MIIEowIBAAKCAQEA3b1tNLfcjFLUw9UShVDNf+ZD8sQqb4YBaIXcSJTX/zDQUPiCp176BBGI3s4VplDArnOW+LumozmKogeoHEnGEIDW8ovgK5uMU9tSA2p0qqGBUMOdR8YATTIfCJe7qGiiuGa3WZy3sQLM70SuRzx02YU8gvUcvl2Js4KyqAziOUX/w3Wa59H9jjGNUXYyqaPWJp73eHzbVYWySzyLG22mVlcUtBx5siL5T2/Xu0p9z4l7/bapwwmOVi1ZrcHjbEAwdGEiSMGI/uWqAF+r1BRpmJLR7HNXcL3eK4/56VYLaiwSejfyYeRFMITEn/UxGYhcXZ5xMUUCG0TxjBhLYpTBuwIDAQABAoIBAA4dwebcxkrH99Poa8+WkiE7JgaS9sahx9OBI2xwJANoIU2TpzGuNLQZ76uLgB+rPWZTD9Xm5a1iJjwOyQ9/937TzPCk91D0tpgcusRikb8jx/6TGB9acL4kBjYUVCCHr3BA2G75MKKGtJ2OMvAbCQSosZj+r2VDwYFEPUkV2jheE5JHSBkwyIRrus3JCwu8gu5fyCg9z8ljcxJxI5HIsi4v8Z21aCw/cLj7h5cMt44wCjQz4rOfYNBEFeHDtlfR1QtWKgjm4ZHHJbKrzf9b2kQXclziceEbSM0tYbROEXKi+s0Zc+z3HEG89vv0vfN400clmzzIAijKY6gg3pPRWdECgYEA+lnWYbSlXDMNYx6RBXm1RnlMUYIm4oy4/9ljgnoGJ6WCn3SjFkgaDtiKfGIG1BSB85r04pAPANgcWHf5tWDnq0ARvBVG0BX2bKd++7B3D4d3CRYKCwm88SslJXv9dfHVhq4+zViFPiUWwT20A72jCuUCvL88y5fh/YBecfdh+jECgYEA4r5RD0NB9dMaeg5/jk/GEHIo4Z9KLc6FrSoOFo2xFkPOy1sgDpDOiNtypuWvniO7k7Ose3DS3hlfTMsKzIW/CgQJ20+Y4cvBWDaOsRxfjj7w3d+jH5OSJdKKSzTrgLKc9ZhlRzVXy0J0hipIA6HG5kdVdLXmh85ITmf1CbJhE6sCgYBjPVeBNbXTHZ2x6/z62aslO5IoQVqetb/kE82hfDOSZcao5Ph9Lam+ttH2ynkAevykj4mBgi+gWwqpey2uW7KaLPSaxShj9kDQA3mP1fzsV/u0y1rB02Nlin/YIxVvOqU1FT9p8SwoXVVu1sHUNck62VtDbN9xqUx5S/ikXrclEQKBgQCoTssOwEcK+Vty9KYcdfy4onTUHZBLdjxl8Iyqkxy7QTQUYRznkvesQPDXEDGO+kk3dyx2KKZt9Hl4IFNww2quPZcvcuMx4DQxjbXXpA8OIIxcta95NepLJwA+mRai3nKCH1A2TlNP7pFeMa5o+8IPly3Ix2lKr4Wepa4PN5i1pwKBgCZ1QP6XAOERl9NznNmU0rXVcvYNP4PIIfQWfvGsldZ4QKkmjjAGiS0/oYqdWs+UDRZyCRChaVjDXO9fk0PEG5OGKAj9nyiYCT/M8xtJ3UeP5ffZZvJ/vnye3QdDIo1e38ZzsWwJHmLYw7fRqY9W5Vxo0Vsy22U3CJY70KTxVdTy" ], + "keyUse" : [ "ENC" ], + "certificate" : [ "MIICmzCCAYMCBgGG3GWycDANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZkYnJlcG8wHhcNMjMwMzEzMTkxMzE3WhcNMzMwMzEzMTkxNDU3WjARMQ8wDQYDVQQDDAZkYnJlcG8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDdvW00t9yMUtTD1RKFUM1/5kPyxCpvhgFohdxIlNf/MNBQ+IKnXvoEEYjezhWmUMCuc5b4u6ajOYqiB6gcScYQgNbyi+Arm4xT21IDanSqoYFQw51HxgBNMh8Il7uoaKK4ZrdZnLexAszvRK5HPHTZhTyC9Ry+XYmzgrKoDOI5Rf/DdZrn0f2OMY1RdjKpo9Ymnvd4fNtVhbJLPIsbbaZWVxS0HHmyIvlPb9e7Sn3PiXv9tqnDCY5WLVmtweNsQDB0YSJIwYj+5aoAX6vUFGmYktHsc1dwvd4rj/npVgtqLBJ6N/Jh5EUwhMSf9TEZiFxdnnExRQIbRPGMGEtilMG7AgMBAAEwDQYJKoZIhvcNAQELBQADggEBAK3kQ1VkQrzvSWvmXmazmNoA1ZiPzRDs1XhGUWxgsxzgPylr3dGBuqQbKvgnLUBQLSqlJHpI4fZflHswu1qrvVZYtekPcGef4WhcKAu2i1RwxrKa6RJQ1tRbrLuVYCzPv5p/DWgltWVn88aoLnqQn0SK/0PB/o4a4Cm7Kq2ZzCr1dACBr06LvOHsc7249OySmbG4HH+pLK6jVURhZ9VaObqAHe2FJBVVoIzURbdiRRURqumrIvbnpeaU1aFyg6ED5wTnXvmMPmVPt9F79mcB33bASO5wyu00X8t1hyN2Show2l2vxLACGUzVkTQt15s7uDLKE7qLmKSR3EuSGXWv3wA=" ], + "priority" : [ "100" ], + "algorithm" : [ "RSA-OAEP" ] + } + }, { + "id" : "2293ff99-3c6d-46d1-8635-5e679d5b134a", + "name" : "rsa-generated", + "providerId" : "rsa-generated", + "subComponents" : { }, + "config" : { + "privateKey" : [ "MIIEpAIBAAKCAQEAqqnHQ2BWWW9vDNLRCcxD++xZg/16oqMo/c1l+lcFEjjAIJjJp/HqrPYU/U9GvquGE6PbVFtTzW1KcKawOW+FJNOA3CGo8Q1TFEfz43B8rZpKsFbJKvQGVv1Z4HaKPvLUm7iMm8Hv91cLduuoWx6Q3DPe2vg13GKKEZe7UFghF+0T9u8EKzA/XqQ0OiICmsmYPbwvf9N3bCKsB/Y10EYmZRb8IhCoV9mmO5TxgWgiuNeCTtNCv2ePYqL/U0WvyGFW0reasIK8eg3KrAUj8DpyOgPOVBn3lBGf+3KFSYi+0bwZbJZWqbC/Xlk20Go1YfeJPRIt7ImxD27R/lNjgDO/MwIDAQABAoIBADNcMt6hAHub4JTAYS6Mra0EPRBO2XhWmACBrv3+8ETClXd5475KPLDewgRVtlmtbwU8G8awUXESQgPS9lfiqvQhPreA3cHlm6oP2WMKOEtakr2s8I+frsTBLCo0Ini9RaSzjoVVgS0zofyhASKi+T970MafSj5P3XNb8YBFdXgoYDiA7FXLH6a/+m7LScL+wGcFMAAeYESxZbMQLfH3v8L+4EcTraiwjLG17ZdlF3dpybMyUSse6ZQ/PdlyvBuzzLXhN6Ce2gd9ATfS+YWTzo7Yf+GU+ex5bIpVOfHqtuM/hyq7YGKENClsXwNZIAoFnvGCbvECAfgyapVrD30IfykCgYEA0rgsSZ82pxT40NxwgBD1g9lbNVBKXphRB/3S078qusUzJjT7AldEj4imGPhAbI7bI8gAeWJsp1XJWkjM8ktaVrh+NQl7p8e9OPh0pQF/5Bdg8ajbjXESpjnaU66pVYRQy/d+jNli/YRAHX5RUfsBl+6W4+WSVMGmKBiqJsur+ecCgYEAz1YVXClcmUnyZem5B+2E9noIzjF6ROE+jIb6rawM85P3Xd0lXtECQavtxw+Qk7I32qOwrxl1UpK2foVel3pazi+4OpMfmqtYGenRP1Zk1cZwrDo0cIemTDGjj3kJ8tYn12CGolFQpJZgK6OHzvG0tOxI5VZgjIViWNPe1PGWXtUCgYEAxXGNDe8BZs1f11S2lUlOw5yGug3hoYFXbAWJ5p7Ziuf8ZXB/QlJDC7se54a11wKEk6Jzz0lKRgE8CjzszJuOqnN0zn10QGIIC7nCklo1W6QMUmPGVWH994N976tZP6gbjQL6sT+AYcvpx7j0ubxYYeRNvnz+ACzzY964kGGHY0ECgYEAumlwPPNnMN7+VEjGNm2D7UMdJZ3wi3tkjF5ThdA5uMohTsAk+FG80KSu3RmOaGyEsUwY7+VYyYvlDm4E9PZqLBVVczyR3rMNPAcwPd0EPfvzk7WlLkOX7ct3fehaXH3VRlyfz9KCSeh1wOZ/lT1VtpD2nVOC7PSDzs92+kfXZZ0CgYAnrD1y4skgXkdwolZ3unn3EFyGm2d+X5aMTHwQPdWxqoNIAl/9wdghlzihwnPhhsxq1WzlxuC3V2IMrNPtRx70Mi+FbSmR5m4Xx5RptgMtMlwno+L40PzNJgMjHGjt0wcx3Vel8wuohDtnqMyS7P5nG1/TQx0Cyzwn7QOXlNpgbQ==" ], + "keyUse" : [ "SIG" ], + "certificate" : [ "MIICmzCCAYMCBgGG3GWyBTANBgkqhkiG9w0BAQsFADARMQ8wDQYDVQQDDAZkYnJlcG8wHhcNMjMwMzEzMTkxMzE3WhcNMzMwMzEzMTkxNDU3WjARMQ8wDQYDVQQDDAZkYnJlcG8wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCqqcdDYFZZb28M0tEJzEP77FmD/Xqioyj9zWX6VwUSOMAgmMmn8eqs9hT9T0a+q4YTo9tUW1PNbUpwprA5b4Uk04DcIajxDVMUR/PjcHytmkqwVskq9AZW/Vngdoo+8tSbuIybwe/3Vwt266hbHpDcM97a+DXcYooRl7tQWCEX7RP27wQrMD9epDQ6IgKayZg9vC9/03dsIqwH9jXQRiZlFvwiEKhX2aY7lPGBaCK414JO00K/Z49iov9TRa/IYVbSt5qwgrx6DcqsBSPwOnI6A85UGfeUEZ/7coVJiL7RvBlsllapsL9eWTbQajVh94k9Ei3sibEPbtH+U2OAM78zAgMBAAEwDQYJKoZIhvcNAQELBQADggEBAASnN1Cuif1sdfEK2kWAURSXGJCohCROLWdKFjaeHPRaEfpbFJsgxW0Yj3nwX5O3bUlOWoTyENwnXSsXMQsqnNi+At32CKaKO8+AkhAbgQL9F0B+KeJwmYv3cUj5N/LYkJjBvZBzUZ4Ugu5dcxH0k7AktLAIwimkyEnxTNolOA3UyrGGpREr8MCKWVr10RFuOpF/0CsJNNwbHXzalO9D756EUcRWZ9VSg6QVNso0YYRKTnILWDn9hcTRnqGy3SHo3anFTqQZ+BB57YbgFWy6udC0LYRB3zdp6zNti87eu/VEymiDY/mmo1AB8Tm0b6vxFz4AKcL3ax5qS6YnZ9efSzk=" ], + "priority" : [ "100" ] + } + } ] + }, + "internationalizationEnabled" : false, + "supportedLocales" : [ ], + "authenticationFlows" : [ { + "id" : "88e5d526-2298-413c-a904-133ad839d47f", + "alias" : "Account verification options", + "description" : "Method with which to verity the existing account", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "idp-email-verification", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "ALTERNATIVE", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "Verify Existing Account by Re-authentication", + "userSetupAllowed" : false + } ] + }, { + "id" : "bc0b483f-4a3f-4c15-bf65-b26f5320e6c9", + "alias" : "Authentication Options", + "description" : "Authentication options.", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "basic-auth", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "basic-auth-otp", + "authenticatorFlow" : false, + "requirement" : "DISABLED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "auth-spnego", + "authenticatorFlow" : false, + "requirement" : "DISABLED", + "priority" : 30, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "a690c715-fbae-4c20-b680-bd4010718761", + "alias" : "Browser - Conditional OTP", + "description" : "Flow to determine if the OTP is required for the authentication", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "auth-otp-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "ad6d407e-c73e-4439-baf3-d7c99c6cb6ad", + "alias" : "Direct Grant - Conditional OTP", + "description" : "Flow to determine if the OTP is required for the authentication", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "direct-grant-validate-otp", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "e5d03405-e10a-408a-adb2-41dbb4f24515", + "alias" : "First broker login - Conditional OTP", + "description" : "Flow to determine if the OTP is required for the authentication", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "auth-otp-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "96b93843-62d0-44f1-84dd-21cc5f95f523", + "alias" : "Handle Existing Account", + "description" : "Handle what to do if there is existing account with same email/username like authenticated identity provider", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "idp-confirm-link", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "Account verification options", + "userSetupAllowed" : false + } ] + }, { + "id" : "088f4051-36ab-4952-a4f2-4ba53c408083", + "alias" : "Reset - Conditional OTP", + "description" : "Flow to determine if the OTP should be reset or not. Set to REQUIRED to force.", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "conditional-user-configured", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "reset-otp", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "05f37bb2-779d-4e3f-ad1b-f6eb33bb3de4", + "alias" : "User creation or linking", + "description" : "Flow for the existing/non-existing user alternatives", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticatorConfig" : "create unique user config", + "authenticator" : "idp-create-user-if-unique", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "ALTERNATIVE", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "Handle Existing Account", + "userSetupAllowed" : false + } ] + }, { + "id" : "300a5647-7d2c-4348-9f1f-51504bfda1c4", + "alias" : "Verify Existing Account by Re-authentication", + "description" : "Reauthentication of existing account", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "idp-username-password-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "First broker login - Conditional OTP", + "userSetupAllowed" : false + } ] + }, { + "id" : "26afc672-314b-4ad9-9711-7aaeafd7c00c", + "alias" : "browser", + "description" : "browser based authentication", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "auth-cookie", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "auth-spnego", + "authenticatorFlow" : false, + "requirement" : "DISABLED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "identity-provider-redirector", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 25, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "ALTERNATIVE", + "priority" : 30, + "autheticatorFlow" : true, + "flowAlias" : "forms", + "userSetupAllowed" : false + } ] + }, { + "id" : "9b301f6c-eda7-4da0-ba09-1a6454ff910d", + "alias" : "clients", + "description" : "Base authentication for clients", + "providerId" : "client-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "client-secret", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "client-jwt", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "client-secret-jwt", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 30, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "client-x509", + "authenticatorFlow" : false, + "requirement" : "ALTERNATIVE", + "priority" : 40, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "6e54f1be-dbad-4b6d-8eee-8e048d413c63", + "alias" : "direct grant", + "description" : "OpenID Connect Resource Owner Grant", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "direct-grant-validate-username", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "direct-grant-validate-password", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 30, + "autheticatorFlow" : true, + "flowAlias" : "Direct Grant - Conditional OTP", + "userSetupAllowed" : false + } ] + }, { + "id" : "31da4b94-03c4-4d79-9ac3-5df1445c0781", + "alias" : "docker auth", + "description" : "Used by Docker clients to authenticate against the IDP", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "docker-http-basic-authenticator", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "2e16651d-681f-4d9b-9dd4-9acdb465cd43", + "alias" : "first broker login", + "description" : "Actions taken after first broker login with identity provider account, which is not yet linked to any Keycloak account", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticatorConfig" : "review profile config", + "authenticator" : "idp-review-profile", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "User creation or linking", + "userSetupAllowed" : false + } ] + }, { + "id" : "da109a26-fefa-48a4-ae8e-1d49627c2db8", + "alias" : "forms", + "description" : "Username, password, otp and other auth forms.", + "providerId" : "basic-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "auth-username-password-form", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "Browser - Conditional OTP", + "userSetupAllowed" : false + } ] + }, { + "id" : "b8f1f963-6813-4875-bae8-ce48a813763b", + "alias" : "http challenge", + "description" : "An authentication flow based on challenge-response HTTP Authentication Schemes", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "no-cookie-redirect", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : true, + "flowAlias" : "Authentication Options", + "userSetupAllowed" : false + } ] + }, { + "id" : "4c983c77-241f-41c5-8b8a-e2cd6fc08914", + "alias" : "registration", + "description" : "registration flow", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "registration-page-form", + "authenticatorFlow" : true, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : true, + "flowAlias" : "registration form", + "userSetupAllowed" : false + } ] + }, { + "id" : "d62c8dd6-633c-408a-aa99-43071510efb4", + "alias" : "registration form", + "description" : "registration form", + "providerId" : "form-flow", + "topLevel" : false, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "registration-user-creation", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "registration-profile-action", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 40, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "registration-password-action", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 50, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "registration-recaptcha-action", + "authenticatorFlow" : false, + "requirement" : "DISABLED", + "priority" : 60, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + }, { + "id" : "c8ca5be7-e76d-4e16-b5ca-3ced99d92dbb", + "alias" : "reset credentials", + "description" : "Reset credentials for a user if they forgot their password or something", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "reset-credentials-choose-user", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "reset-credential-email", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 20, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticator" : "reset-password", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 30, + "autheticatorFlow" : false, + "userSetupAllowed" : false + }, { + "authenticatorFlow" : true, + "requirement" : "CONDITIONAL", + "priority" : 40, + "autheticatorFlow" : true, + "flowAlias" : "Reset - Conditional OTP", + "userSetupAllowed" : false + } ] + }, { + "id" : "389c1c37-e8af-4610-a507-e1257f55b954", + "alias" : "saml ecp", + "description" : "SAML ECP Profile Authentication Flow", + "providerId" : "basic-flow", + "topLevel" : true, + "builtIn" : true, + "authenticationExecutions" : [ { + "authenticator" : "http-basic-authenticator", + "authenticatorFlow" : false, + "requirement" : "REQUIRED", + "priority" : 10, + "autheticatorFlow" : false, + "userSetupAllowed" : false + } ] + } ], + "authenticatorConfig" : [ { + "id" : "d66ca9d0-1645-4c84-abfe-c0a696f17de4", + "alias" : "create unique user config", + "config" : { + "require.password.update.after.registration" : "false" + } + }, { + "id" : "061cc6b8-90be-4423-9bf9-974ead709b5d", + "alias" : "review profile config", + "config" : { + "update.profile.on.first.login" : "missing" + } + } ], + "requiredActions" : [ { + "alias" : "CONFIGURE_TOTP", + "name" : "Configure OTP", + "providerId" : "CONFIGURE_TOTP", + "enabled" : true, + "defaultAction" : false, + "priority" : 10, + "config" : { } + }, { + "alias" : "TERMS_AND_CONDITIONS", + "name" : "Terms and Conditions", + "providerId" : "TERMS_AND_CONDITIONS", + "enabled" : false, + "defaultAction" : false, + "priority" : 20, + "config" : { } + }, { + "alias" : "UPDATE_PASSWORD", + "name" : "Update Password", + "providerId" : "UPDATE_PASSWORD", + "enabled" : false, + "defaultAction" : false, + "priority" : 30, + "config" : { } + }, { + "alias" : "UPDATE_PROFILE", + "name" : "Update Profile", + "providerId" : "UPDATE_PROFILE", + "enabled" : true, + "defaultAction" : false, + "priority" : 40, + "config" : { } + }, { + "alias" : "VERIFY_EMAIL", + "name" : "Verify Email", + "providerId" : "VERIFY_EMAIL", + "enabled" : false, + "defaultAction" : false, + "priority" : 50, + "config" : { } + }, { + "alias" : "delete_account", + "name" : "Delete Account", + "providerId" : "delete_account", + "enabled" : false, + "defaultAction" : false, + "priority" : 60, + "config" : { } + }, { + "alias" : "webauthn-register", + "name" : "Webauthn Register", + "providerId" : "webauthn-register", + "enabled" : true, + "defaultAction" : false, + "priority" : 70, + "config" : { } + }, { + "alias" : "webauthn-register-passwordless", + "name" : "Webauthn Register Passwordless", + "providerId" : "webauthn-register-passwordless", + "enabled" : true, + "defaultAction" : false, + "priority" : 80, + "config" : { } + }, { + "alias" : "update_user_locale", + "name" : "Update User Locale", + "providerId" : "update_user_locale", + "enabled" : true, + "defaultAction" : false, + "priority" : 1000, + "config" : { } + } ], + "browserFlow" : "browser", + "registrationFlow" : "registration", + "directGrantFlow" : "direct grant", + "resetCredentialsFlow" : "reset credentials", + "clientAuthenticationFlow" : "clients", + "dockerAuthenticationFlow" : "docker auth", + "attributes" : { + "cibaBackchannelTokenDeliveryMode" : "poll", + "cibaAuthRequestedUserHint" : "login_hint", + "clientOfflineSessionMaxLifespan" : "0", + "oauth2DevicePollingInterval" : "5", + "clientSessionIdleTimeout" : "0", + "actionTokenGeneratedByUserLifespan-execute-actions" : "", + "actionTokenGeneratedByUserLifespan-verify-email" : "", + "clientOfflineSessionIdleTimeout" : "0", + "actionTokenGeneratedByUserLifespan-reset-credentials" : "", + "cibaInterval" : "5", + "realmReusableOtpCode" : "false", + "cibaExpiresIn" : "120", + "oauth2DeviceCodeLifespan" : "600", + "actionTokenGeneratedByUserLifespan-idp-verify-account-via-email" : "", + "parRequestUriLifespan" : "60", + "clientSessionMaxLifespan" : "0", + "shortVerificationUri" : "" + }, + "keycloakVersion" : "21.0.2", + "userManagedAccessAllowed" : false, + "clientProfiles" : { + "profiles" : [ ] + }, + "clientPolicies" : { + "policies" : [ ] + } +} \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index c09ab11a82..8462f0639f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -327,7 +327,6 @@ services: image: docker.io/nginx:1.27.0-alpine3.19-slim ports: - "80:80" - - "443:443" volumes: - ./dbrepo-gateway-service/dbrepo.conf:/etc/nginx/conf.d/default.conf depends_on: @@ -483,10 +482,13 @@ services: container_name: dbrepo-upload-service hostname: upload-service image: docker.io/tusproject/tusd:v2.4.0 + volumes: + - "./dbrepo-upload-service/pre-create.sh:/srv/tusd-hooks/pre-create:ro" command: - "-behind-proxy" - "-max-size=2000000000" - "-base-path=/api/upload/files/" + - "-hooks-dir=/srv/tusd-hooks/" - "-s3-endpoint=${STORAGE_ENDPOINT:-http://storage-service:9000}" - "-s3-bucket=dbrepo" environment: diff --git a/helm/dbrepo/Chart.yaml b/helm/dbrepo/Chart.yaml index d837f1148f..29488f7214 100644 --- a/helm/dbrepo/Chart.yaml +++ b/helm/dbrepo/Chart.yaml @@ -6,8 +6,8 @@ description: Helm Chart for installing DBRepo sources: - https://gitlab.phaidra.org/fair-data-austria-db-repository/fda-services type: application -version: "1.5.1" -appVersion: "1.5.1" +version: "1.5.2" +appVersion: "1.5.2" keywords: - dbrepo maintainers: diff --git a/helm/dbrepo/README.md b/helm/dbrepo/README.md index 44abf5b9c9..0452c93f8e 100644 --- a/helm/dbrepo/README.md +++ b/helm/dbrepo/README.md @@ -11,7 +11,7 @@ sample [ for your deployment and update the variables, especially `hostname`. ```bash -helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.5.1" +helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" --values ./values.yaml --version "1.5.2" ``` ## Prerequisites @@ -28,7 +28,7 @@ helm install my-release "oci://registry.datalab.tuwien.ac.at/dbrepo/helm/dbrepo" To install the chart with the release name `my-release`: ```bash -helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.5.1" +helm install my-release "oci://oci://registry.datalab.tuwien.ac.at/dbrepo/helm" --values ./values.yaml --version "1.5.2" ``` The command deploys DBRepo on the Kubernetes cluster in the default configuration. The Parameters section lists the diff --git a/helm/dbrepo/templates/metadata-secret.yaml b/helm/dbrepo/templates/metadata-secret.yaml index 684adf0269..6807fae861 100644 --- a/helm/dbrepo/templates/metadata-secret.yaml +++ b/helm/dbrepo/templates/metadata-secret.yaml @@ -44,8 +44,8 @@ stringData: SPARQL_CONNECTION_TIMEOUT: "{{ .Values.metadataservice.sparql.connectionTimeout }}" SPRING_PROFILES_ACTIVE: "{{ ternary "doi" "" .Values.metadataservice.datacite.enabled }}" S3_ENDPOINT: "{{ .Values.metadataservice.s3.endpoint }}" - S3_ACCESS_KEY_ID: "{{ .Values.metadataservice.s3.auth.username }}" + S3_ACCESS_KEY_ID: "{{ .Values.storageservice.s3.auth.adminAccessKeyId }}" S3_BUCKET: "{{ .Values.metadataservice.s3.bucket }}" - S3_SECRET_ACCESS_KEY: "{{ .Values.metadataservice.s3.auth.password }}" + S3_SECRET_ACCESS_KEY: "{{ .Values.storageservice.s3.auth.adminSecretAccessKey }}" SYSTEM_USERNAME: "{{ .Values.identityservice.users }}" SYSTEM_PASSWORD: "{{ .Values.identityservice.userPasswords }}" diff --git a/helm/dbrepo/templates/upload-configmap.yaml b/helm/dbrepo/templates/upload-configmap.yaml new file mode 100644 index 0000000000..3dbde251a8 --- /dev/null +++ b/helm/dbrepo/templates/upload-configmap.yaml @@ -0,0 +1,54 @@ +{{- if .Values.uploadservice.enabled }} +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: upload-service-setup + namespace: {{ include "common.names.namespace" . | quote }} +data: + pre-create: | + #!/bin/bash + REQUEST_RAW=$(cat /dev/stdin) + + echo "[DEBUG] [pre-create hook] request started" >&2 + if [ "$(echo "$REQUEST_RAW" | jq '.HTTPRequest.Header | has("Authorization")')" == "false" ]; then + echo "[ERROR] [pre-create hook] Missing header 'Authorization'" >&2 + echo "[DEBUG] [pre-create hook] raw request: ${REQUEST_RAW}" >&2 + cat <<END + { + "RejectUpload": true, + "HTTPResponse": { + "StatusCode": 400, + "Header": { + "Content-Type": "application/json" + }, + "Body": "{\"code\":\"error.upload.malformed\",\"message\":\"Missing header 'Authorization'\",\"status\":\"BAD_REQUEST\"}" + } + } + END + exit 1 + fi + + echo "[DEBUG] [pre-create hook] request has 'Authorization' header present" >&2 + + BEARER="$(echo "$REQUEST_RAW" | jq -r '.HTTPRequest.Header.Authorization[0]')" + echo "[DEBUG] [pre-create hook] attempting to contact {{ .Values.authservice.endpoint }}" >&2 + if [ ! "$(wget -O- --quiet --header "Authorization: ${BEARER}" {{ .Values.authservice.endpoint }}/realms/dbrepo/protocol/openid-connect/userinfo)" ]; then + echo "[ERROR] [pre-create hook] Unauthorized" >&2 + cat <<END + { + "RejectUpload": true, + "HTTPResponse": { + "StatusCode": 401, + "Header": { + "Content-Type": "application/json" + }, + "Body": "{\"code\":\"error.upload.unauthorized\",\"message\":\"Authentication required\",\"status\":\"UNAUTHORIZED\"}" + } + } + END + exit 1 + fi + + echo "[INFO] [pre-create hook] Authorized" >&2 +{{- end }} diff --git a/helm/dbrepo/values.yaml b/helm/dbrepo/values.yaml index 9ba172ec34..8b6459ba8a 100644 --- a/helm/dbrepo/values.yaml +++ b/helm/dbrepo/values.yaml @@ -201,12 +201,24 @@ uploadservice: - "-behind-proxy" - "-max-size=2000000000" - "-base-path=/api/upload/files/" + - "-hooks-dir=/srv/tusd-hooks/" - "-s3-endpoint=http://storage-service-s3:8333" - "-s3-bucket=dbrepo" ## @skip uploadservice.envFrom envFrom: - secretRef: name: upload-service-secret + ## @skip uploadservice.volumes + volumes: + - name: config + configMap: + name: upload-service-setup + defaultMode: 0777 + ## @skip uploadservice.volumeMounts + volumeMounts: + - name: config + mountPath: /srv/tusd-hooks/pre-create + subPath: pre-create ## @param uploadservice.replicaCount The number of replicas. replicaCount: 2 @@ -296,7 +308,7 @@ analyseservice: enabled: true image: ## @skip analyseservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.5.1 + name: registry.datalab.tuwien.ac.at/dbrepo/analyse-service:1.5.2 ## @skip analyseservice.image.pullPolicy pullPolicy: Always ## @param analyseservice.image.debug Set the logging level to `trace`. Otherwise, set to `info`. @@ -360,7 +372,7 @@ metadataservice: enabled: true image: ## @skip metadataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.5.1 + name: registry.datalab.tuwien.ac.at/dbrepo/metadata-service:1.5.2 ## @skip metadataservice.image.pullPolicy pullPolicy: Always ## @param metadataservice.image.debug Set the logging level to `trace`. Otherwise, set to `info`. @@ -459,7 +471,7 @@ dataservice: endpoint: http://data-service image: ## @skip dataservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.5.1 + name: registry.datalab.tuwien.ac.at/dbrepo/data-service:1.5.2 ## @skip dataservice.image.pullPolicy pullPolicy: Always ## @param dataservice.image.debug Set the logging level to `trace`. Otherwise, set to `info`. @@ -539,7 +551,7 @@ searchservice: endpoint: http://search-service image: ## @skip searchservice.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.5.1 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service:1.5.2 ## @skip searchservice.image.pullPolicy pullPolicy: Always ## @param searchservice.image.debug Set the logging level to `trace`. Otherwise, set to `info`. @@ -588,7 +600,7 @@ searchservice: ## @skip searchservice.init init: image: - name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.5.1 + name: registry.datalab.tuwien.ac.at/dbrepo/search-service-init:1.5.2 pullPolicy: Always ## @param searchservice.replicaCount The number of replicas. replicaCount: 2 @@ -636,7 +648,7 @@ storageservice: adminSecretAccessKey: seaweedfsadmin ## @skip storageservice.init init: - image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.5.1 + image: registry.datalab.tuwien.ac.at/dbrepo/storage-service-init:1.5.2 pullPolicy: Always ## @section Identity Service @@ -702,7 +714,7 @@ ui: enabled: true image: ## @skip ui.image.name - name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.5.1 + name: registry.datalab.tuwien.ac.at/dbrepo/ui:1.5.2 ## @skip ui.image.pullPolicy pullPolicy: Always ## @param ui.image.debug Set the logging level to `trace`. Otherwise, set to `info`. diff --git a/install.sh b/install.sh index 74206b9e02..12a20e9868 100644 --- a/install.sh +++ b/install.sh @@ -1,7 +1,7 @@ #!/bin/bash # preset -VERSION="1.5.1" +VERSION="1.5.2" MIN_CPU=8 MIN_RAM=4 MIN_MAP_COUNT=262144 @@ -43,12 +43,18 @@ if [[ $SKIP_CHECKS -eq 0 ]] && [[ $DOWNLOAD_ONLY -ne 1 ]]; then fi MAX_MAP_COUNT=$(cat /proc/sys/vm/max_map_count) if [[ $MAX_MAP_COUNT -lt $MIN_MAP_COUNT ]]; then - echo "You do not have enough max. map counts:" - echo "" - echo " - we found max. ${MAX_MAP_COUNT} map count instead of necessary ${MIN_MAP_COUNT}" - echo " - update your /etc/sysctl.conf file and add the line 'vm.max_map_count=${MIN_MAP_COUNT}' at the end and apply it with 'sysctl -p'" - echo " - if you believe this is a mistake, skip startup checks with the SKIP_CHECKS=1 flag" - exit 4 + echo "You do not have enough max. map counts: found ${MAX_MAP_COUNT} instead of minimum ${MIN_MAP_COUNT}" + if [ $(id -u) -eq 0 ]; then + echo " - attempt to update the /etc/sysctl.conf file and add the line 'vm.max_map_count=${MIN_MAP_COUNT}' at the end" + echo "vm.max_map_count=${MIN_MAP_COUNT}" >> /etc/sysctl.conf + sysctl -p + if [[ $MAX_MAP_COUNT -lt $MIN_MAP_COUNT ]]; then + exit 4 + fi + else + echo " - you need to re-run the install.sh script as root to fix this" + exit 4 + fi else echo "MAP COUNT ${MAX_MAP_COUNT} OK" fi diff --git a/lib/python/pyproject.toml b/lib/python/pyproject.toml index aa93d2b8c1..9ed92b3d0b 100644 --- a/lib/python/pyproject.toml +++ b/lib/python/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "dbrepo" -version = "1.5.1" +version = "1.5.2" description = "DBRepo Python Library" keywords = [ "DBRepo", diff --git a/lib/python/setup.py b/lib/python/setup.py index 2f9386d289..50be6c428a 100644 --- a/lib/python/setup.py +++ b/lib/python/setup.py @@ -2,7 +2,7 @@ from distutils.core import setup setup(name="dbrepo", - version="1.5.1", + version="1.5.2", description="A library for communicating with DBRepo", url="https://www.ifs.tuwien.ac.at/infrastructures/dbrepo/1.5/", author="Martin Weise", diff --git a/make/dev.mk b/make/dev.mk index ce7b88e7de..1d9b179df8 100644 --- a/make/dev.mk +++ b/make/dev.mk @@ -30,4 +30,5 @@ package-config: ## Package the config files cp ./dbrepo-gateway-service/dbrepo.conf ./.docker/config cp ./dbrepo-metric-db/prometheus.yml ./.docker/config cp ./dbrepo-storage-service/s3_config.json ./.docker/config + cp ./dbrepo-upload-service/pre-create.sh ./.docker/config cd ./.docker && tar czf ./dist.tar.gz ./docker-compose.yml ./.env ./config diff --git a/make/test.mk b/make/test.mk index 36d44d42f5..666ab576c5 100644 --- a/make/test.mk +++ b/make/test.mk @@ -23,3 +23,7 @@ test-lib: ## Test the Python Library. .PHONY: test-ui test-ui: ## Test the UI. bash ./dbrepo-ui/test/test_heap.sh + +.PHONY: test-upload-service +test-upload-service: ## Test the Upload Service + mvn -f ./dbrepo-upload-service/pom.xml clean test \ No newline at end of file diff --git a/sonar-project.properties b/sonar-project.properties index 0d048c0f3c..54228d8d4c 100644 --- a/sonar-project.properties +++ b/sonar-project.properties @@ -2,7 +2,7 @@ sonar.projectKey=fair-data-austria-db-repository_fda-services_a57fa043-ab99-4cdd-a721-162d9a916d77 sonar.host.url=https://s39.datalab.tuwien.ac.at # project -sonar.projectVersion=1.5.1 +sonar.projectVersion=1.5.2 # general sonar.qualitygate.wait=true sonar.projectCreation.mainBranchName=master -- GitLab