From 4b71c0ebbf4ecaa406736a263c96b8349edda95d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Maciej=20Kara=C5=9B?= Date: Mon, 2 Jun 2025 13:28:56 +0200 Subject: [PATCH 1/8] Combined Dockerfiles Combined Dockerfiles for MongoDB Kubernetes Operator Combined Dockerfiles for Init Ops Manager image Combined Dockerfiles for Init Database and Init AppDB Combined Dockerfiles for Database Combined Dockerfiles for upgrade-hook and readinessprobe Added agent Dockerfiles Created Dockerfile for OpsManager Removed Dockerfile.dcar and README.md about how to build it Add more gitgraphs --- .gitignore | 5 - docker/mongodb-agent-non-matrix/Dockerfile | 13 ++- docker/mongodb-agent-non-matrix/README.md | 17 +++ docker/mongodb-agent/Dockerfile | 39 ++++++- docker/mongodb-agent/README.md | 20 +++- .../mongodb-enterprise-ops-manager/Dockerfile | 95 ++++++++++++++++ .../Dockerfile.dcar | 25 ----- .../Dockerfile.plain | 84 +++++++++++++++ docker/mongodb-enterprise-ops-manager/LICENSE | 3 - .../mongodb-enterprise-ops-manager/README.md | 11 ++ docker/mongodb-kubernetes-database/Dockerfile | 71 ++++++++++++ .../Dockerfile.plain | 87 +++++++++++++++ docker/mongodb-kubernetes-database/README.md | 9 +- .../mongodb-kubernetes-init-appdb/Dockerfile | 52 +++++++++ .../Dockerfile.builder | 22 ++++ .../Dockerfile.plain | 35 ++++++ .../Dockerfile.template | 42 ++++++++ .../Dockerfile.ubi_minimal | 11 ++ .../mongodb-kubernetes-init-appdb/README.md | 11 ++ .../Dockerfile | 50 +++++++++ .../Dockerfile.plain | 34 ++++++ .../README.md | 11 ++ .../Dockerfile | 31 ++++++ .../Dockerfile.plain | 26 +++++ .../README.md | 9 ++ docker/mongodb-kubernetes-operator/Dockerfile | 72 +++++++++++++ .../Dockerfile.plain | 38 +++++++ docker/mongodb-kubernetes-operator/README.md | 10 +- .../Dockerfile | 11 +- .../README.md | 10 ++ .../Dockerfile | 11 +- .../mongodb-kubernetes-upgrade-hook/README.md | 10 ++ ideal_release_flow.md | 66 ++++++++++++ ideal_release_flow.mmd | 28 +++++ ideal_release_flow.png | Bin 0 -> 14467 bytes ideal_release_flow_backport.mmd | 37 +++++++ ideal_release_flow_backport.png | Bin 0 -> 28617 bytes ideal_release_flow_versioning_complex.mmd | 27 +++++ ideal_release_flow_versioning_complex.png | Bin 0 -> 22061 bytes ideal_release_flow_versioning_easy.mmd | 26 +++++ ideal_release_flow_versioning_easy.png | Bin 0 -> 18829 bytes inventories/database.yaml | 8 +- inventories/init_appdb.yaml | 7 +- inventories/init_database.yaml | 3 +- inventories/init_om.yaml | 3 +- inventories/om.yaml | 3 +- inventory.yaml | 1 + lib/sonar/sonar.py | 0 lib/sonar/test/test_final_dockerfiles.py | 101 ++++++++++++++++++ 49 files changed, 1225 insertions(+), 60 deletions(-) create mode 100644 docker/mongodb-agent-non-matrix/README.md create mode 100644 docker/mongodb-enterprise-ops-manager/Dockerfile delete mode 100644 docker/mongodb-enterprise-ops-manager/Dockerfile.dcar create mode 100644 docker/mongodb-enterprise-ops-manager/Dockerfile.plain delete mode 100644 docker/mongodb-enterprise-ops-manager/LICENSE create mode 100644 docker/mongodb-enterprise-ops-manager/README.md create mode 100644 docker/mongodb-kubernetes-database/Dockerfile create mode 100644 docker/mongodb-kubernetes-database/Dockerfile.plain create mode 100644 docker/mongodb-kubernetes-init-appdb/Dockerfile create mode 100644 docker/mongodb-kubernetes-init-appdb/Dockerfile.builder create mode 100644 docker/mongodb-kubernetes-init-appdb/Dockerfile.plain create mode 100644 docker/mongodb-kubernetes-init-appdb/Dockerfile.template create mode 100644 docker/mongodb-kubernetes-init-appdb/Dockerfile.ubi_minimal create mode 100644 docker/mongodb-kubernetes-init-appdb/README.md create mode 100644 docker/mongodb-kubernetes-init-database/Dockerfile create mode 100644 docker/mongodb-kubernetes-init-database/Dockerfile.plain create mode 100644 docker/mongodb-kubernetes-init-database/README.md create mode 100644 docker/mongodb-kubernetes-init-ops-manager/Dockerfile create mode 100644 docker/mongodb-kubernetes-init-ops-manager/Dockerfile.plain create mode 100644 docker/mongodb-kubernetes-init-ops-manager/README.md create mode 100644 docker/mongodb-kubernetes-operator/Dockerfile create mode 100644 docker/mongodb-kubernetes-operator/Dockerfile.plain create mode 100644 docker/mongodb-kubernetes-readinessprobe/README.md create mode 100644 docker/mongodb-kubernetes-upgrade-hook/README.md create mode 100644 ideal_release_flow.md create mode 100644 ideal_release_flow.mmd create mode 100644 ideal_release_flow.png create mode 100644 ideal_release_flow_backport.mmd create mode 100644 ideal_release_flow_backport.png create mode 100644 ideal_release_flow_versioning_complex.mmd create mode 100644 ideal_release_flow_versioning_complex.png create mode 100644 ideal_release_flow_versioning_easy.mmd create mode 100644 ideal_release_flow_versioning_easy.png mode change 100644 => 100755 lib/sonar/sonar.py create mode 100644 lib/sonar/test/test_final_dockerfiles.py diff --git a/.gitignore b/.gitignore index 5f644de46..ec7ebbab0 100644 --- a/.gitignore +++ b/.gitignore @@ -43,11 +43,6 @@ public/architectures/**/secrets/* docker/mongodb-kubernetes-appdb/content/readinessprobe mongodb-kubernetes -docker/mongodb-kubernetes-operator/Dockerfile -docker/mongodb-kubernetes-database/Dockerfile -docker/mongodb-enterprise-ops-manager/Dockerfile -docker/mongodb-kubernetes-init-database/Dockerfile -docker/mongodb-kubernetes-init-ops-manager/Dockerfile docker/mongodb-kubernetes-operator/content/mongodb-kubernetes-operator.tar docker/mongodb-kubernetes-tests/helm_chart/ docker/mongodb-kubernetes-tests/public/ diff --git a/docker/mongodb-agent-non-matrix/Dockerfile b/docker/mongodb-agent-non-matrix/Dockerfile index e1c1caff2..0677126fd 100644 --- a/docker/mongodb-agent-non-matrix/Dockerfile +++ b/docker/mongodb-agent-non-matrix/Dockerfile @@ -1,5 +1,14 @@ -ARG imagebase -FROM ${imagebase} as base +FROM scratch AS base + +ARG agent_version +ARG agent_distro +ARG tools_version +ARG tools_distro + +ADD https://mciuploads.s3.amazonaws.com/mms-automation/mongodb-mms-build-agent/builds/automation-agent/prod/mongodb-mms-automation-agent-${agent_version}.${agent_distro}.tar.gz /data/mongodb-agent.tar.gz +ADD https://downloads.mongodb.org/tools/db/mongodb-database-tools-${tools_distro}-${tools_version}.tgz /data/mongodb-tools.tgz + +COPY ./docker/mongodb-kubernetes-init-database/content/LICENSE /data/LICENSE FROM registry.access.redhat.com/ubi9/ubi-minimal diff --git a/docker/mongodb-agent-non-matrix/README.md b/docker/mongodb-agent-non-matrix/README.md new file mode 100644 index 000000000..79dc0d2d5 --- /dev/null +++ b/docker/mongodb-agent-non-matrix/README.md @@ -0,0 +1,17 @@ +### Building locally + +For building the MongoDB Agent (non-static) image locally use the example command: + +TODO: What to do with label quay.expires-after=48h? +```bash +AGENT_VERSION="108.0.7.8810-1" +TOOLS_VERSION="100.12.0" +AGENT_DISTRO="rhel9_x86_64" +TOOLS_DISTRO="rhel93-x86_64" +docker buildx build --load --progress plain . -f docker/mongodb-agent/Dockerfile -t "mongodb-agent:${AGENT_VERSION}" \ + --build-arg version="${VERSION}" \ + --build-arg agent_version="${AGENT_VERSION}" \ + --build-arg tools_version="${TOOLS_VERSION}" \ + --build-arg agent_distro="${AGENT_DISTRO}" \ + --build-arg tools_distro="${TOOLS_DISTRO}" +``` diff --git a/docker/mongodb-agent/Dockerfile b/docker/mongodb-agent/Dockerfile index 08d8746d8..5ec4e127b 100644 --- a/docker/mongodb-agent/Dockerfile +++ b/docker/mongodb-agent/Dockerfile @@ -1,5 +1,40 @@ -ARG imagebase -FROM ${imagebase} as base +# the init database image gets supplied by pipeline.py and corresponds to the operator version we want to release +# the agent with. This enables us to release the agent for older operator. +ARG init_database_image +FROM ${init_database_image} AS init_database + +FROM public.ecr.aws/docker/library/golang:1.24 AS dependency_downloader + +WORKDIR /go/src/github.com/mongodb/mongodb-kubernetes/ + +COPY go.mod go.sum ./ + +RUN go mod download + +FROM public.ecr.aws/docker/library/golang:1.24 AS readiness_builder + +WORKDIR /go/src/github.com/mongodb/mongodb-kubernetes/ + +COPY --from=dependency_downloader /go/pkg /go/pkg +COPY . /go/src/github.com/mongodb/mongodb-kubernetes + +RUN CGO_ENABLED=0 GOFLAGS=-buildvcs=false go build -o /readinessprobe ./mongodb-community-operator/cmd/readiness/main.go +RUN CGO_ENABLED=0 GOFLAGS=-buildvcs=false go build -o /version-upgrade-hook ./mongodb-community-operator/cmd/versionhook/main.go + +FROM scratch AS base +ARG mongodb_tools_url_ubi +ARG mongodb_agent_url_ubi + +COPY --from=readiness_builder /readinessprobe /data/ +COPY --from=readiness_builder /version-upgrade-hook /data/ + +ADD ${mongodb_tools_url_ubi} /data/mongodb_tools_ubi.tgz +ADD ${mongodb_agent_url_ubi} /data/mongodb_agent_ubi.tgz + +COPY --from=init_database /probes/probe.sh /data/probe.sh +COPY --from=init_database /scripts/agent-launcher-lib.sh /data/ +COPY --from=init_database /scripts/agent-launcher.sh /data/ +COPY --from=init_database /licenses/LICENSE /data/ FROM registry.access.redhat.com/ubi9/ubi-minimal diff --git a/docker/mongodb-agent/README.md b/docker/mongodb-agent/README.md index 377f4b938..a447d60f0 100644 --- a/docker/mongodb-agent/README.md +++ b/docker/mongodb-agent/README.md @@ -1,4 +1,20 @@ # Mongodb-Agent The agent gets released in a matrix style with the init-database image, which gets tagged with the operator version. -This works by using the multi-stage pattern and build-args. First - retrieve the `init-database:` and retrieve the -binaries from there. Then we continue with the other steps to fully build the image. \ No newline at end of file +This works by using the multi-stage pattern and build-args. First - retrieve the `init-database:` and retrieve the +binaries from there. Then we continue with the other steps to fully build the image. + +### Building locally + +For building the MongoDB Agent image locally use the example command: + +```bash +VERSION="108.0.7.8810-1" +INIT_DATABASE_IMAGE="268558157000.dkr.ecr.us-east-1.amazonaws.com/dev/mongodb-kubernetes-init-database:1.1.0" +MONGODB_TOOLS_URL_UBI="https://downloads.mongodb.org/tools/db/mongodb-database-tools-rhel93-x86_64-100.12.0.tgz" +MONGODB_AGENT_URL_UBI="https://mciuploads.s3.amazonaws.com/mms-automation/mongodb-mms-build-agent/builds/automation-agent/prod/mongodb-mms-automation-agent-108.0.7.8810-1.rhel9_x86_64.tar.gz" +docker buildx build --load --progress plain . -f docker/mongodb-agent/Dockerfile -t "mongodb-agent:${VERSION}_1.1.0" \ + --build-arg version="${VERSION}" \ + --build-arg init_database_image="${INIT_DATABASE_IMAGE}" \ + --build-arg mongodb_tools_url_ubi="${MONGODB_TOOLS_URL_UBI}" \ + --build-arg mongodb_agent_url_ubi="${MONGODB_AGENT_URL_UBI}" +``` diff --git a/docker/mongodb-enterprise-ops-manager/Dockerfile b/docker/mongodb-enterprise-ops-manager/Dockerfile new file mode 100644 index 000000000..aa95b4bee --- /dev/null +++ b/docker/mongodb-enterprise-ops-manager/Dockerfile @@ -0,0 +1,95 @@ +# Build compilable stuff + +FROM public.ecr.aws/docker/library/golang:1.24 AS readiness_builder +COPY . /go/src/github.com/mongodb/mongodb-kubernetes +WORKDIR /go/src/github.com/mongodb/mongodb-kubernetes + +RUN CGO_ENABLED=0 go build -a -buildvcs=false -o /data/scripts/mmsconfiguration ./docker/mongodb-kubernetes-init-ops-manager/mmsconfiguration/edit_mms_configuration.go +RUN CGO_ENABLED=0 go build -a -buildvcs=false -o /data/scripts/backup-daemon-readiness-probe ./docker/mongodb-kubernetes-init-ops-manager/backupdaemon_readinessprobe/backupdaemon_readiness.go + +# Move binaries and scripts +FROM scratch AS base + +COPY --from=readiness_builder /data/scripts/mmsconfiguration /data/scripts/mmsconfiguration +COPY --from=readiness_builder /data/scripts/backup-daemon-readiness-probe /data/scripts/backup-daemon-readiness-probe + +# After v2.0, when non-Static Agent images will be removed, please ensure to copy those files +# into ./docker/mongodb-enterprise-ops-manager directory. Leaving it this way will make the maintenance easier. +COPY ./docker/mongodb-kubernetes-init-ops-manager/scripts/docker-entry-point.sh /data/scripts +COPY ./docker/mongodb-kubernetes-init-ops-manager/scripts/backup-daemon-liveness-probe.sh /data/scripts +COPY ./docker/mongodb-kubernetes-init-ops-manager/LICENSE /data/licenses/mongodb-enterprise-ops-manager + +FROM registry.access.redhat.com/ubi9/ubi-minimal + +ARG version +ARG om_download_url + +LABEL name="MongoDB Enterprise Ops Manager" \ + maintainer="support@mongodb.com" \ + vendor="MongoDB" \ + version=${version} \ + release="1" \ + summary="MongoDB Enterprise Ops Manager Image" \ + description="MongoDB Enterprise Ops Manager" + +ENV MMS_HOME=/mongodb-ops-manager +ENV MMS_PROP_FILE=${MMS_HOME}/conf/conf-mms.properties +ENV MMS_CONF_FILE=${MMS_HOME}/conf/mms.conf +ENV MMS_LOG_DIR=${MMS_HOME}/logs +ENV MMS_TMP_DIR=${MMS_HOME}/tmp + +EXPOSE 8080 + +# OpsManager docker image needs to have the MongoDB dependencies because the +# backup daemon is running its database locally + +# Replace libcurl-minimal and curl-minimal with the full versions +# https://bugzilla.redhat.com/show_bug.cgi?id=1994521 +RUN microdnf install -y libssh libpsl libbrotli \ + && microdnf download curl libcurl \ + && rpm -Uvh --nodeps --replacefiles "*curl*$( uname -i ).rpm" \ + && microdnf remove -y libcurl-minimal curl-minimal + +RUN microdnf install --disableplugin=subscription-manager -y \ + cyrus-sasl \ + cyrus-sasl-gssapi \ + cyrus-sasl-plain \ + krb5-libs \ + libpcap \ + lm_sensors-libs \ + net-snmp \ + net-snmp-agent-libs \ + openldap \ + openssl \ + tar \ + rpm-libs \ + net-tools \ + procps-ng \ + ncurses + +COPY --from=base /data/licenses /licenses/ +COPY --from=base /data/scripts /opt/scripts + +RUN curl --fail -L -o ops_manager.tar.gz ${om_download_url} \ + && tar -xzf ops_manager.tar.gz \ + && rm ops_manager.tar.gz \ + && mv mongodb-mms* "${MMS_HOME}" + +# permissions +RUN chmod -R 0777 "${MMS_LOG_DIR}" \ + && chmod -R 0777 "${MMS_TMP_DIR}" \ + && chmod -R 0775 "${MMS_HOME}/conf" \ + && chmod -R 0775 "${MMS_HOME}/jdk" \ + && mkdir "${MMS_HOME}/mongodb-releases/" \ + && chmod -R 0775 "${MMS_HOME}/mongodb-releases" \ + && chmod -R 0777 "${MMS_CONF_FILE}" \ + && chmod -R 0777 "${MMS_PROP_FILE}" + +# The "${MMS_HOME}/conf" will be populated by the docker-entry-point.sh. +# For now we need to move into the templates directory. +RUN cp -r "${MMS_HOME}/conf" "${MMS_HOME}/conf-template" + +USER 2000 + +# operator to change the entrypoint to: /mongodb-ops-manager/bin/mongodb-mms start_mms (or a wrapper around this) +ENTRYPOINT [ "sleep infinity" ] diff --git a/docker/mongodb-enterprise-ops-manager/Dockerfile.dcar b/docker/mongodb-enterprise-ops-manager/Dockerfile.dcar deleted file mode 100644 index 639c7930b..000000000 --- a/docker/mongodb-enterprise-ops-manager/Dockerfile.dcar +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "Dockerfile.ubi" %} - - -{% block packages %} -RUN yum install --disableplugin=subscription-manager \ - cyrus-sasl \ - cyrus-sasl-gssapi \ - cyrus-sasl-plain \ - krb5-libs \ - libcurl \ - libpcap \ - lm_sensors-libs \ - net-snmp \ - net-snmp-agent-libs \ - openldap \ - openssl \ - rpm-libs \ - net-tools \ - procps-ng \ - ncurses -{% endblock %} - -{% block healthcheck %} -HEALTHCHECK --timeout=30s CMD ls /mongodb-ops-manager/bin/mongodb-mms || exit 1 -{% endblock %} diff --git a/docker/mongodb-enterprise-ops-manager/Dockerfile.plain b/docker/mongodb-enterprise-ops-manager/Dockerfile.plain new file mode 100644 index 000000000..717014b97 --- /dev/null +++ b/docker/mongodb-enterprise-ops-manager/Dockerfile.plain @@ -0,0 +1,84 @@ +ARG imagebase +FROM ${imagebase} as base + +FROM registry.access.redhat.com/ubi9/ubi-minimal + + +LABEL name="MongoDB Enterprise Ops Manager" \ + maintainer="support@mongodb.com" \ + vendor="MongoDB" \ + version="8.0.7" \ + release="1" \ + summary="MongoDB Enterprise Ops Manager Image" \ + description="MongoDB Enterprise Ops Manager" + + +ENV MMS_HOME /mongodb-ops-manager +ENV MMS_PROP_FILE ${MMS_HOME}/conf/conf-mms.properties +ENV MMS_CONF_FILE ${MMS_HOME}/conf/mms.conf +ENV MMS_LOG_DIR ${MMS_HOME}/logs +ENV MMS_TMP_DIR ${MMS_HOME}/tmp + +EXPOSE 8080 + +# OpsManager docker image needs to have the MongoDB dependencies because the +# backup daemon is running its database locally + + +# Replace libcurl-minimal and curl-minimal with the full versions +# https://bugzilla.redhat.com/show_bug.cgi?id=1994521 +RUN microdnf install -y libssh libpsl libbrotli \ + && microdnf download curl libcurl \ + && rpm -Uvh --nodeps --replacefiles "*curl*$( uname -i ).rpm" \ + && microdnf remove -y libcurl-minimal curl-minimal + +RUN microdnf install --disableplugin=subscription-manager -y \ + cyrus-sasl \ + cyrus-sasl-gssapi \ + cyrus-sasl-plain \ + krb5-libs \ + libpcap \ + lm_sensors-libs \ + net-snmp \ + net-snmp-agent-libs \ + openldap \ + openssl \ + tar \ + rpm-libs \ + net-tools \ + procps-ng \ + ncurses + + +COPY --from=base /data/licenses /licenses/ + +COPY --from=base /data/scripts /opt/scripts + + + +RUN curl --fail -L -o ops_manager.tar.gz https://downloads.mongodb.com/on-prem-mms/tar/mongodb-mms-8.0.7.500.20250505T1426Z.tar.gz \ + && tar -xzf ops_manager.tar.gz \ + && rm ops_manager.tar.gz \ + && mv mongodb-mms* "${MMS_HOME}" + + +# permissions +RUN chmod -R 0777 "${MMS_LOG_DIR}" \ + && chmod -R 0777 "${MMS_TMP_DIR}" \ + && chmod -R 0775 "${MMS_HOME}/conf" \ + && chmod -R 0775 "${MMS_HOME}/jdk" \ + && mkdir "${MMS_HOME}/mongodb-releases/" \ + && chmod -R 0775 "${MMS_HOME}/mongodb-releases" \ + && chmod -R 0777 "${MMS_CONF_FILE}" \ + && chmod -R 0777 "${MMS_PROP_FILE}" + +# The "${MMS_HOME}/conf" will be populated by the docker-entry-point.sh. +# For now we need to move into the templates directory. +RUN cp -r "${MMS_HOME}/conf" "${MMS_HOME}/conf-template" + +USER 2000 + +# operator to change the entrypoint to: /mongodb-ops-manager/bin/mongodb-mms start_mms (or a wrapper around this) +ENTRYPOINT [ "sleep infinity" ] + + diff --git a/docker/mongodb-enterprise-ops-manager/LICENSE b/docker/mongodb-enterprise-ops-manager/LICENSE deleted file mode 100644 index dc71da876..000000000 --- a/docker/mongodb-enterprise-ops-manager/LICENSE +++ /dev/null @@ -1,3 +0,0 @@ -Usage of the MongoDB Enterprise Operator for Kubernetes indicates agreement with the MongoDB Customer Agreement. - -* https://www.mongodb.com/customer-agreement/ diff --git a/docker/mongodb-enterprise-ops-manager/README.md b/docker/mongodb-enterprise-ops-manager/README.md new file mode 100644 index 000000000..440e839bc --- /dev/null +++ b/docker/mongodb-enterprise-ops-manager/README.md @@ -0,0 +1,11 @@ +### Building locally + +For building the MongoDB Enterprise Ops Manager Docker image locally use the example command: + +```bash +VERSION="8.0.7" +OM_DOWNLOAD_URL="https://downloads.mongodb.com/on-prem-mms/tar/mongodb-mms-8.0.7.500.20250505T1426Z.tar.gz" +docker buildx build --load --progress plain . -f docker/mongodb-enterprise-ops-manager/Dockerfile -t "mongodb-enterprise-ops-manager:${VERSION}" \ + --build-arg version="${VERSION}" \ + --build-arg om_download_url="${OM_DOWNLOAD_URL}" +``` diff --git a/docker/mongodb-kubernetes-database/Dockerfile b/docker/mongodb-kubernetes-database/Dockerfile new file mode 100644 index 000000000..97fbda8d0 --- /dev/null +++ b/docker/mongodb-kubernetes-database/Dockerfile @@ -0,0 +1,71 @@ +FROM scratch AS base + +COPY ./docker/mongodb-kubernetes-database/LICENSE /data/licenses/mongodb-kubernetes-database + +FROM registry.access.redhat.com/ubi8/ubi-minimal + +ARG VERSION + +LABEL name="MongoDB Kubernetes Database" \ + version="${VERSION}" \ + summary="MongoDB Kubernetes Database Image" \ + description="MongoDB Kubernetes Database Image" \ + vendor="MongoDB" \ + release="1" \ + maintainer="support@mongodb.com" + +ENV MMS_HOME=/mongodb-automation +ENV MMS_LOG_DIR=/var/log/mongodb-mms-automation + +RUN microdnf update -y && rm -rf /var/cache/yum + +# these are the packages needed for the agent +RUN microdnf install -y --disableplugin=subscription-manager --setopt=install_weak_deps=0 nss_wrapper +RUN microdnf install -y --disableplugin=subscription-manager \ + hostname \ + procps + +# these are the packages needed for MongoDB +# (https://docs.mongodb.com/manual/tutorial/install-mongodb-enterprise-on-red-hat-tarball/ "RHEL/CentOS 8" tab) +RUN microdnf install -y --disableplugin=subscription-manager \ + cyrus-sasl \ + cyrus-sasl-gssapi \ + cyrus-sasl-plain \ + krb5-libs \ + libcurl \ + lm_sensors-libs \ + net-snmp \ + net-snmp-agent-libs \ + openldap \ + openssl \ + jq \ + tar \ + xz-libs \ + findutils + +RUN ln -s /usr/lib64/libsasl2.so.3 /usr/lib64/libsasl2.so.2 + +# Set the required perms +RUN mkdir -p "${MMS_LOG_DIR}" \ + && chmod 0775 "${MMS_LOG_DIR}" \ + && mkdir -p /var/lib/mongodb-mms-automation \ + && chmod 0775 /var/lib/mongodb-mms-automation \ + && mkdir -p /data \ + && chmod 0775 /data \ + && mkdir -p /journal \ + && chmod 0775 /journal \ + && mkdir -p "${MMS_HOME}" \ + && chmod -R 0775 "${MMS_HOME}" + +# USER needs to be set for this image to pass RedHat verification. Some customers have these requirements as well +# It does not matter what number it is, as long as it is set to something. +# However, OpenShift will run the container as a random user, +# and the number in this configuration is not relevant. +USER 2000 + +# The docker image doesn't have any scripts so by default does nothing +# The script will be copied in runtime from init containers and the operator is expected +# to override the COMMAND +ENTRYPOINT ["sleep infinity"] + +COPY --from=base /data/licenses/mongodb-kubernetes-database /licenses/mongodb-kubernetes-database diff --git a/docker/mongodb-kubernetes-database/Dockerfile.plain b/docker/mongodb-kubernetes-database/Dockerfile.plain new file mode 100644 index 000000000..ea7b4a8e7 --- /dev/null +++ b/docker/mongodb-kubernetes-database/Dockerfile.plain @@ -0,0 +1,87 @@ +ARG imagebase +FROM ${imagebase} as base + +FROM registry.access.redhat.com/ubi8/ubi-minimal + + + +LABEL name="MongoDB Kubernetes Database" \ + version="1.1.0" \ + summary="MongoDB Kubernetes Database Image" \ + description="MongoDB Kubernetes Database Image" \ + vendor="MongoDB" \ + release="1" \ + maintainer="support@mongodb.com" + + + + + +ENV MMS_HOME /mongodb-automation +ENV MMS_LOG_DIR /var/log/mongodb-mms-automation + + + +RUN microdnf update -y && rm -rf /var/cache/yum + +# these are the packages needed for the agent +RUN microdnf install -y --disableplugin=subscription-manager --setopt=install_weak_deps=0 nss_wrapper +RUN microdnf install -y --disableplugin=subscription-manager \ + hostname \ + procps + + +# these are the packages needed for MongoDB +# (https://docs.mongodb.com/manual/tutorial/install-mongodb-enterprise-on-red-hat-tarball/ "RHEL/CentOS 8" tab) +RUN microdnf install -y --disableplugin=subscription-manager \ + cyrus-sasl \ + cyrus-sasl-gssapi \ + cyrus-sasl-plain \ + krb5-libs \ + libcurl \ + lm_sensors-libs \ + net-snmp \ + net-snmp-agent-libs \ + openldap \ + openssl \ + jq \ + tar \ + xz-libs \ + findutils + + + +RUN ln -s /usr/lib64/libsasl2.so.3 /usr/lib64/libsasl2.so.2 + + +# Set the required perms +RUN mkdir -p "${MMS_LOG_DIR}" \ + && chmod 0775 "${MMS_LOG_DIR}" \ + && mkdir -p /var/lib/mongodb-mms-automation \ + && chmod 0775 /var/lib/mongodb-mms-automation \ + && mkdir -p /data \ + && chmod 0775 /data \ + && mkdir -p /journal \ + && chmod 0775 /journal \ + && mkdir -p "${MMS_HOME}" \ + && chmod -R 0775 "${MMS_HOME}" + + + + +# USER needs to be set for this image to pass RedHat verification. Some customers have these requirements as well +# It does not matter what number it is, as long as it is set to something. +# However, OpenShift will run the container as a random user, +# and the number in this configuration is not relevant. +USER 2000 + + +# The docker image doesn't have any scripts so by default does nothing +# The script will be copied in runtime from init containers and the operator is expected +# to override the COMMAND +ENTRYPOINT ["sleep infinity"] + + +COPY --from=base /data/licenses/mongodb-kubernetes-database /licenses/mongodb-kubernetes-database + + diff --git a/docker/mongodb-kubernetes-database/README.md b/docker/mongodb-kubernetes-database/README.md index a6abf56a9..e7b937e0e 100644 --- a/docker/mongodb-kubernetes-database/README.md +++ b/docker/mongodb-kubernetes-database/README.md @@ -34,11 +34,12 @@ This image can't be built in any host, because it will require the use of a subs host, with subscription service enabled, is required. That's the reason behind using the Redhat build service to build this images with. -## Building the DCAR database image +### Building locally -The dcar image needs to be built manually. +For building the MongoDB Database image locally use the example command: ```bash -docker build . -t 268558157000.dkr.ecr.us-east-1.amazonaws.com/dev/usaf/mongodb-kubernetes-database:1.5.3 -docker push 268558157000.dkr.ecr.us-east-1.amazonaws.com/dev/usaf/mongodb-kubernetes-database:1.5.3 +VERSION="1.0.1" +docker buildx build --load --progress plain . -f docker/mongodb-kubernetes-database/Dockerfile -t "mongodb-kubernetes-database:${VERSION}" \ + --build-arg VERSION="${VERSION}" ``` diff --git a/docker/mongodb-kubernetes-init-appdb/Dockerfile b/docker/mongodb-kubernetes-init-appdb/Dockerfile new file mode 100644 index 000000000..ed0cea9dd --- /dev/null +++ b/docker/mongodb-kubernetes-init-appdb/Dockerfile @@ -0,0 +1,52 @@ +FROM public.ecr.aws/docker/library/golang:1.24 AS readiness_builder + +COPY . /go/src/github.com/mongodb/mongodb-kubernetes +WORKDIR /go/src/github.com/mongodb/mongodb-kubernetes +RUN CGO_ENABLED=0 GOFLAGS=-buildvcs=false go build -o /readinessprobe ./mongodb-community-operator/cmd/readiness/main.go +RUN CGO_ENABLED=0 GOFLAGS=-buildvcs=false go build -o /version-upgrade-hook ./mongodb-community-operator/cmd/versionhook/main.go + +FROM scratch AS base + +ARG mongodb_tools_url_ubi + +COPY --from=readiness_builder /readinessprobe /data/ +COPY --from=readiness_builder /version-upgrade-hook /data/version-upgrade-hook + +ADD ${mongodb_tools_url_ubi} /data/mongodb_tools_ubi.tgz + +COPY ./docker/mongodb-kubernetes-init-database/content/probe.sh /data/probe.sh + +COPY ./docker/mongodb-kubernetes-init-database/content/agent-launcher-lib.sh /data/scripts/ +COPY ./docker/mongodb-kubernetes-init-database/content/agent-launcher.sh /data/scripts/ + +COPY ./docker/mongodb-kubernetes-init-database/content/LICENSE /data/licenses/ + +FROM registry.access.redhat.com/ubi8/ubi-minimal + +ARG version +LABEL name="MongoDB Kubernetes Init AppDB" \ + version="mongodb-kubernetes-init-appdb-${version}" \ + summary="MongoDB Kubernetes AppDB Init Image" \ + description="Startup Scripts for MongoDB Enterprise Application Database for Ops Manager" \ + release="1" \ + vendor="MongoDB" \ + maintainer="support@mongodb.com" + +COPY --from=base /data/readinessprobe /probes/readinessprobe +COPY --from=base /data/probe.sh /probes/probe.sh +COPY --from=base /data/scripts/ /scripts/ +COPY --from=base /data/licenses /licenses/ +COPY --from=base /data/version-upgrade-hook /probes/version-upgrade-hook + +RUN microdnf -y update --nodocs \ + && microdnf -y install --nodocs tar gzip \ + && microdnf clean all + +COPY --from=base /data/mongodb_tools_ubi.tgz /tools/mongodb_tools.tgz + +RUN tar xfz /tools/mongodb_tools.tgz --directory /tools \ + && rm /tools/mongodb_tools.tgz + +USER 2000 + +ENTRYPOINT [ "/bin/cp", "-f", "-r", "/scripts/agent-launcher.sh", "/scripts/agent-launcher-lib.sh", "/probes/readinessprobe", "/probes/probe.sh", "/tools", "/opt/scripts/" ] diff --git a/docker/mongodb-kubernetes-init-appdb/Dockerfile.builder b/docker/mongodb-kubernetes-init-appdb/Dockerfile.builder new file mode 100644 index 000000000..69dc6d6af --- /dev/null +++ b/docker/mongodb-kubernetes-init-appdb/Dockerfile.builder @@ -0,0 +1,22 @@ +# Build compilable stuff + +FROM public.ecr.aws/docker/library/golang:1.24 as readiness_builder +COPY . /go/src/github.com/mongodb/mongodb-kubernetes +WORKDIR /go/src/github.com/mongodb/mongodb-kubernetes +RUN CGO_ENABLED=0 GOFLAGS=-buildvcs=false go build -o /readinessprobe ./mongodb-community-operator/cmd/readiness/main.go +RUN CGO_ENABLED=0 GOFLAGS=-buildvcs=false go build -o /version-upgrade-hook ./mongodb-community-operator/cmd/versionhook/main.go + +FROM scratch +ARG mongodb_tools_url_ubi + +COPY --from=readiness_builder /readinessprobe /data/ +COPY --from=readiness_builder /version-upgrade-hook /data/version-upgrade-hook + +ADD ${mongodb_tools_url_ubi} /data/mongodb_tools_ubi.tgz + +COPY ./docker/mongodb-kubernetes-init-database/content/probe.sh /data/probe.sh + +COPY ./docker/mongodb-kubernetes-init-database/content/agent-launcher-lib.sh /data/scripts/ +COPY ./docker/mongodb-kubernetes-init-database/content/agent-launcher.sh /data/scripts/ + +COPY ./docker/mongodb-kubernetes-init-database/content/LICENSE /data/licenses/ diff --git a/docker/mongodb-kubernetes-init-appdb/Dockerfile.plain b/docker/mongodb-kubernetes-init-appdb/Dockerfile.plain new file mode 100644 index 000000000..d0c5d967a --- /dev/null +++ b/docker/mongodb-kubernetes-init-appdb/Dockerfile.plain @@ -0,0 +1,35 @@ +ARG imagebase +FROM ${imagebase} as base + +FROM registry.access.redhat.com/ubi8/ubi-minimal + +ARG version +LABEL name="MongoDB Kubernetes Init AppDB" \ + version="mongodb-kubernetes-init-appdb-${version}" \ + summary="MongoDB Kubernetes AppDB Init Image" \ + description="Startup Scripts for MongoDB Enterprise Application Database for Ops Manager" \ + release="1" \ + vendor="MongoDB" \ + maintainer="support@mongodb.com" + +COPY --from=base /data/readinessprobe /probes/readinessprobe +COPY --from=base /data/probe.sh /probes/probe.sh +COPY --from=base /data/scripts/ /scripts/ +COPY --from=base /data/licenses /licenses/ +COPY --from=base /data/version-upgrade-hook /probes/version-upgrade-hook + + +RUN microdnf -y update --nodocs \ + && microdnf -y install --nodocs tar gzip \ + && microdnf clean all + +COPY --from=base /data/mongodb_tools_ubi.tgz /tools/mongodb_tools.tgz + + +RUN tar xfz /tools/mongodb_tools.tgz --directory /tools \ + && rm /tools/mongodb_tools.tgz + +USER 2000 +ENTRYPOINT [ "/bin/cp", "-f", "-r", "/scripts/agent-launcher.sh", "/scripts/agent-launcher-lib.sh", "/probes/readinessprobe", "/probes/probe.sh", "/tools", "/opt/scripts/" ] + + diff --git a/docker/mongodb-kubernetes-init-appdb/Dockerfile.template b/docker/mongodb-kubernetes-init-appdb/Dockerfile.template new file mode 100644 index 000000000..3c0d45ee4 --- /dev/null +++ b/docker/mongodb-kubernetes-init-appdb/Dockerfile.template @@ -0,0 +1,42 @@ +ARG imagebase +FROM ${imagebase} as base + +FROM {{ base_image }} + +ARG version + +{%- if is_appdb %} +LABEL name="MongoDB Kubernetes Init AppDB" \ + version="mongodb-kubernetes-init-appdb-${version}" \ + summary="MongoDB Kubernetes AppDB Init Image" \ + description="Startup Scripts for MongoDB Enterprise Application Database for Ops Manager" \ +{%- else %} +LABEL name="MongoDB Kubernetes Init Database" \ + version="mongodb-kubernetes-init-database-${version}" \ + summary="MongoDB Kubernetes Database Init Image" \ + description="Startup Scripts for MongoDB Enterprise Database" \ +{%- endif %} + release="1" \ + vendor="MongoDB" \ + maintainer="support@mongodb.com" + +COPY --from=base /data/readinessprobe /probes/readinessprobe +COPY --from=base /data/probe.sh /probes/probe.sh +COPY --from=base /data/scripts/ /scripts/ +COPY --from=base /data/licenses /licenses/ + +{%- if is_appdb %} +COPY --from=base /data/version-upgrade-hook /probes/version-upgrade-hook +{%- endif %} + +{% block mongodb_tools %} +{% endblock %} + +RUN tar xfz /tools/mongodb_tools.tgz --directory /tools \ + && rm /tools/mongodb_tools.tgz + +USER 2000 +ENTRYPOINT [ "/bin/cp", "-f", "-r", "/scripts/agent-launcher.sh", "/scripts/agent-launcher-lib.sh", "/probes/readinessprobe", "/probes/probe.sh", "/tools", "/opt/scripts/" ] + +{% block healthcheck %} +{% endblock %} diff --git a/docker/mongodb-kubernetes-init-appdb/Dockerfile.ubi_minimal b/docker/mongodb-kubernetes-init-appdb/Dockerfile.ubi_minimal new file mode 100644 index 000000000..b5400b147 --- /dev/null +++ b/docker/mongodb-kubernetes-init-appdb/Dockerfile.ubi_minimal @@ -0,0 +1,11 @@ +{% extends "Dockerfile.template" %} + +{% set base_image = "registry.access.redhat.com/ubi8/ubi-minimal" %} + +{% block mongodb_tools %} +RUN microdnf -y update --nodocs \ + && microdnf -y install --nodocs tar gzip \ + && microdnf clean all + +COPY --from=base /data/mongodb_tools_ubi.tgz /tools/mongodb_tools.tgz +{% endblock %} diff --git a/docker/mongodb-kubernetes-init-appdb/README.md b/docker/mongodb-kubernetes-init-appdb/README.md new file mode 100644 index 000000000..d49ca4b3a --- /dev/null +++ b/docker/mongodb-kubernetes-init-appdb/README.md @@ -0,0 +1,11 @@ +### Building locally + +For building the MongoDB Init AppDB image locally use the example command: + +```bash +VERSION="1.0.1" +MONGODB_TOOLS_URL_UBI="https://downloads.mongodb.org/tools/db/mongodb-database-tools-rhel93-x86_64-100.12.0.tgz" +docker buildx build --load --progress plain . -f docker/mongodb-kubernetes-init-appdb/Dockerfile -t "mongodb-kubernetes-init-appdb:${VERSION}" \ + --build-arg version="${VERSION}" \ + --build-arg mongodb_tools_url_ubi="${MONGODB_TOOLS_URL_UBI}" +``` diff --git a/docker/mongodb-kubernetes-init-database/Dockerfile b/docker/mongodb-kubernetes-init-database/Dockerfile new file mode 100644 index 000000000..6c861fb6a --- /dev/null +++ b/docker/mongodb-kubernetes-init-database/Dockerfile @@ -0,0 +1,50 @@ +FROM public.ecr.aws/docker/library/golang:1.24 AS readiness_builder + +COPY . /go/src/github.com/mongodb/mongodb-kubernetes +WORKDIR /go/src/github.com/mongodb/mongodb-kubernetes +RUN CGO_ENABLED=0 GOFLAGS=-buildvcs=false go build -o /readinessprobe ./mongodb-community-operator/cmd/readiness/main.go +RUN CGO_ENABLED=0 GOFLAGS=-buildvcs=false go build -o /version-upgrade-hook ./mongodb-community-operator/cmd/versionhook/main.go + +FROM scratch AS base + +ARG mongodb_tools_url_ubi + +COPY --from=readiness_builder /readinessprobe /data/ +COPY --from=readiness_builder /version-upgrade-hook /data/version-upgrade-hook + +ADD ${mongodb_tools_url_ubi} /data/mongodb_tools_ubi.tgz + +COPY ./docker/mongodb-kubernetes-init-database/content/probe.sh /data/probe.sh + +COPY ./docker/mongodb-kubernetes-init-database/content/agent-launcher-lib.sh /data/scripts/ +COPY ./docker/mongodb-kubernetes-init-database/content/agent-launcher.sh /data/scripts/ + +COPY ./docker/mongodb-kubernetes-init-database/content/LICENSE /data/licenses/ + +FROM registry.access.redhat.com/ubi8/ubi-minimal + +ARG version +LABEL name="MongoDB Kubernetes Init Database" \ + version="mongodb-kubernetes-init-database-${version}" \ + summary="MongoDB Kubernetes Database Init Image" \ + description="Startup Scripts for MongoDB Enterprise Database" \ + release="1" \ + vendor="MongoDB" \ + maintainer="support@mongodb.com" + +COPY --from=base /data/readinessprobe /probes/readinessprobe +COPY --from=base /data/probe.sh /probes/probe.sh +COPY --from=base /data/scripts/ /scripts/ +COPY --from=base /data/licenses /licenses/ + +RUN microdnf -y update --nodocs \ + && microdnf -y install --nodocs tar gzip \ + && microdnf clean all + +COPY --from=base /data/mongodb_tools_ubi.tgz /tools/mongodb_tools.tgz + +RUN tar xfz /tools/mongodb_tools.tgz --directory /tools \ + && rm /tools/mongodb_tools.tgz + +USER 2000 +ENTRYPOINT [ "/bin/cp", "-f", "-r", "/scripts/agent-launcher.sh", "/scripts/agent-launcher-lib.sh", "/probes/readinessprobe", "/probes/probe.sh", "/tools", "/opt/scripts/" ] diff --git a/docker/mongodb-kubernetes-init-database/Dockerfile.plain b/docker/mongodb-kubernetes-init-database/Dockerfile.plain new file mode 100644 index 000000000..ecf2e32ae --- /dev/null +++ b/docker/mongodb-kubernetes-init-database/Dockerfile.plain @@ -0,0 +1,34 @@ +ARG imagebase +FROM ${imagebase} as base + +FROM registry.access.redhat.com/ubi8/ubi-minimal + +ARG version +LABEL name="MongoDB Kubernetes Init Database" \ + version="mongodb-kubernetes-init-database-${version}" \ + summary="MongoDB Kubernetes Database Init Image" \ + description="Startup Scripts for MongoDB Enterprise Database" \ + release="1" \ + vendor="MongoDB" \ + maintainer="support@mongodb.com" + +COPY --from=base /data/readinessprobe /probes/readinessprobe +COPY --from=base /data/probe.sh /probes/probe.sh +COPY --from=base /data/scripts/ /scripts/ +COPY --from=base /data/licenses /licenses/ + + +RUN microdnf -y update --nodocs \ + && microdnf -y install --nodocs tar gzip \ + && microdnf clean all + +COPY --from=base /data/mongodb_tools_ubi.tgz /tools/mongodb_tools.tgz + + +RUN tar xfz /tools/mongodb_tools.tgz --directory /tools \ + && rm /tools/mongodb_tools.tgz + +USER 2000 +ENTRYPOINT [ "/bin/cp", "-f", "-r", "/scripts/agent-launcher.sh", "/scripts/agent-launcher-lib.sh", "/probes/readinessprobe", "/probes/probe.sh", "/tools", "/opt/scripts/" ] + + diff --git a/docker/mongodb-kubernetes-init-database/README.md b/docker/mongodb-kubernetes-init-database/README.md new file mode 100644 index 000000000..0e6657531 --- /dev/null +++ b/docker/mongodb-kubernetes-init-database/README.md @@ -0,0 +1,11 @@ +### Building locally + +For building the MongoDB Init AppDB image locally use the example command: + +```bash +VERSION="1.0.1" +MONGODB_TOOLS_URL_UBI="https://downloads.mongodb.org/tools/db/mongodb-database-tools-rhel93-x86_64-100.12.0.tgz" +docker buildx build --load --progress plain . -f docker/mongodb-kubernetes-init-database/Dockerfile -t "mongodb-kubernetes-init-database:${VERSION}" \ + --build-arg version="${VERSION}" \ + --build-arg mongodb_tools_url_ubi="${MONGODB_TOOLS_URL_UBI}" +``` diff --git a/docker/mongodb-kubernetes-init-ops-manager/Dockerfile b/docker/mongodb-kubernetes-init-ops-manager/Dockerfile new file mode 100644 index 000000000..1229ec929 --- /dev/null +++ b/docker/mongodb-kubernetes-init-ops-manager/Dockerfile @@ -0,0 +1,31 @@ +FROM public.ecr.aws/docker/library/golang:1.24 AS base + +WORKDIR /go/src +ADD ./docker/mongodb-kubernetes-init-ops-manager . +RUN CGO_ENABLED=0 go build -a -buildvcs=false -o /data/scripts/mmsconfiguration ./mmsconfiguration +RUN CGO_ENABLED=0 go build -a -buildvcs=false -o /data/scripts/backup-daemon-readiness-probe ./backupdaemon_readinessprobe/ + +COPY ./docker/mongodb-kubernetes-init-ops-manager/scripts/docker-entry-point.sh /data/scripts/ +COPY ./docker/mongodb-kubernetes-init-ops-manager/scripts/backup-daemon-liveness-probe.sh /data/scripts/ +COPY ./docker/mongodb-kubernetes-init-ops-manager/LICENSE /data/licenses/mongodb-enterprise-ops-manager + +FROM registry.access.redhat.com/ubi9/ubi-minimal + +ARG version + +LABEL name="MongoDB Kubernetes Ops Manager Init" \ + maintainer="support@mongodb.com" \ + vendor="MongoDB" \ + version="mongodb-kubernetes-init-ops-manager-${version}" \ + release="1" \ + summary="MongoDB Kubernetes Ops Manager Init Image" \ + description="Startup Scripts for MongoDB Enterprise Ops Manager" + +COPY --from=base /data/scripts /scripts +COPY --from=base /data/licenses /licenses + +RUN microdnf -y update --nodocs \ + && microdnf clean all + +USER 2000 +ENTRYPOINT [ "/bin/cp", "-f", "/scripts/docker-entry-point.sh", "/scripts/backup-daemon-liveness-probe.sh", "/scripts/mmsconfiguration", "/scripts/backup-daemon-readiness-probe", "/opt/scripts/" ] diff --git a/docker/mongodb-kubernetes-init-ops-manager/Dockerfile.plain b/docker/mongodb-kubernetes-init-ops-manager/Dockerfile.plain new file mode 100644 index 000000000..f841b9e35 --- /dev/null +++ b/docker/mongodb-kubernetes-init-ops-manager/Dockerfile.plain @@ -0,0 +1,26 @@ +ARG imagebase +FROM ${imagebase} as base + +FROM registry.access.redhat.com/ubi9/ubi-minimal + +LABEL name="MongoDB Kubernetes Ops Manager Init" \ + maintainer="support@mongodb.com" \ + vendor="MongoDB" \ + version="mongodb-kubernetes-init-ops-manager-1.1.0" \ + release="1" \ + summary="MongoDB Kubernetes Ops Manager Init Image" \ + description="Startup Scripts for MongoDB Enterprise Ops Manager" + + +COPY --from=base /data/scripts /scripts +COPY --from=base /data/licenses /licenses + + +RUN microdnf -y update --nodocs \ + && microdnf clean all + + +USER 2000 +ENTRYPOINT [ "/bin/cp", "-f", "/scripts/docker-entry-point.sh", "/scripts/backup-daemon-liveness-probe.sh", "/scripts/mmsconfiguration", "/scripts/backup-daemon-readiness-probe", "/opt/scripts/" ] + + diff --git a/docker/mongodb-kubernetes-init-ops-manager/README.md b/docker/mongodb-kubernetes-init-ops-manager/README.md new file mode 100644 index 000000000..71d02da75 --- /dev/null +++ b/docker/mongodb-kubernetes-init-ops-manager/README.md @@ -0,0 +1,9 @@ +### Building locally + +For building the MongoDB Init Ops Manager image locally use the example command: + +```bash +VERSION="1.1.0" +docker buildx build --load --progress plain . -f docker/mongodb-kubernetes-init-ops-manager/Dockerfile -t "mongodb-kubernetes-init-ops-manager:${VERSION}" \ + --build-arg version="${VERSION}" +``` diff --git a/docker/mongodb-kubernetes-operator/Dockerfile b/docker/mongodb-kubernetes-operator/Dockerfile new file mode 100644 index 000000000..dcd3af35c --- /dev/null +++ b/docker/mongodb-kubernetes-operator/Dockerfile @@ -0,0 +1,72 @@ +FROM public.ecr.aws/docker/library/golang:1.24 AS builder + +ARG version +ARG log_automation_config_diff +ARG use_race + +COPY go.sum go.mod /go/src/github.com/mongodb/mongodb-kubernetes/ + +WORKDIR /go/src/github.com/mongodb/mongodb-kubernetes +RUN go mod download + +COPY . /go/src/github.com/mongodb/mongodb-kubernetes + +RUN go version +RUN git version +RUN mkdir /build && \ + if [ $use_race = "true" ]; then \ + echo "Building with race detector" && \ + CGO_ENABLED=1 go build -o /build/mongodb-kubernetes-operator \ + -buildvcs=false \ + -race \ + -ldflags=" -X github.com/mongodb/mongodb-kubernetes/pkg/util.OperatorVersion=${version} \ + -X github.com/mongodb/mongodb-kubernetes/pkg/util.LogAutomationConfigDiff=${log_automation_config_diff}"; \ + else \ + echo "Building without race detector" && \ + CGO_ENABLED=0 go build -o /build/mongodb-kubernetes-operator \ + -buildvcs=false \ + -ldflags="-s -w -X github.com/mongodb/mongodb-kubernetes/pkg/util.OperatorVersion=${version} \ + -X github.com/mongodb/mongodb-kubernetes/pkg/util.LogAutomationConfigDiff=${log_automation_config_diff}"; \ + fi + + +ADD https://github.com/stedolan/jq/releases/download/jq-1.6/jq-linux64 /usr/local/bin/jq +RUN chmod +x /usr/local/bin/jq + +RUN mkdir -p /data +RUN cat release.json | jq -r '.supportedImages."mongodb-agent" | { "supportedImages": { "mongodb-agent": . } }' > /data/om_version_mapping.json +RUN chmod +r /data/om_version_mapping.json + +FROM scratch AS base + +COPY --from=builder /build/mongodb-kubernetes-operator /data/ +COPY --from=builder /data/om_version_mapping.json /data/om_version_mapping.json + +ADD docker/mongodb-kubernetes-operator/licenses /data/licenses/ + +FROM registry.access.redhat.com/ubi9/ubi-minimal + +ARG version + +LABEL name="MongoDB Kubernetes Operator" \ + maintainer="support@mongodb.com" \ + vendor="MongoDB" \ + version="${version}" \ + release="1" \ + summary="MongoDB Kubernetes Operator Image" \ + description="MongoDB Kubernetes Operator Image" + +# Building an UBI-based image: https://red.ht/3n6b9y0 +RUN microdnf update \ + --disableplugin=subscription-manager \ + --disablerepo=* --enablerepo=ubi-9-appstream-rpms --enablerepo=ubi-9-baseos-rpms -y \ + && rm -rf /var/cache/yum +RUN microdnf install -y glibc-langpack-en + +COPY --from=base /data/mongodb-kubernetes-operator /usr/local/bin/mongodb-kubernetes-operator +COPY --from=base /data/om_version_mapping.json /usr/local/om_version_mapping.json +COPY --from=base /data/licenses /licenses/ + +USER 2000 + +ENTRYPOINT exec /usr/local/bin/mongodb-kubernetes-operator diff --git a/docker/mongodb-kubernetes-operator/Dockerfile.plain b/docker/mongodb-kubernetes-operator/Dockerfile.plain new file mode 100644 index 000000000..7466187f7 --- /dev/null +++ b/docker/mongodb-kubernetes-operator/Dockerfile.plain @@ -0,0 +1,38 @@ +# +# Base Template Dockerfile for Operator Image. +# + +ARG imagebase +FROM ${imagebase} as base + +FROM registry.access.redhat.com/ubi9/ubi-minimal + + +LABEL name="MongoDB Kubernetes Operator" \ + maintainer="support@mongodb.com" \ + vendor="MongoDB" \ + version="1.1.0" \ + release="1" \ + summary="MongoDB Kubernetes Operator Image" \ + description="MongoDB Kubernetes Operator Image" + + +# Building an UBI-based image: https://red.ht/3n6b9y0 +RUN microdnf update \ + --disableplugin=subscription-manager \ + --disablerepo=* --enablerepo=ubi-9-appstream-rpms --enablerepo=ubi-9-baseos-rpms -y \ + && rm -rf /var/cache/yum +RUN microdnf install -y glibc-langpack-en + + + + +COPY --from=base /data/mongodb-kubernetes-operator /usr/local/bin/mongodb-kubernetes-operator +COPY --from=base /data/om_version_mapping.json /usr/local/om_version_mapping.json +COPY --from=base /data/licenses /licenses/ + +USER 2000 + +ENTRYPOINT exec /usr/local/bin/mongodb-kubernetes-operator + + diff --git a/docker/mongodb-kubernetes-operator/README.md b/docker/mongodb-kubernetes-operator/README.md index 4dc971f03..8335c1d79 100644 --- a/docker/mongodb-kubernetes-operator/README.md +++ b/docker/mongodb-kubernetes-operator/README.md @@ -10,8 +10,16 @@ CGO_ENABLED=0 GOOS=linux GOFLAGS="-mod=vendor" go build -i -o mongodb-kubernetes ### Building the image +For building the MongoDB Init Ops Manager image locally use the example command: + ```bash -docker build -t mongodb-kubernetes-operator:0.1 . +VERSION="1.1.0" +LOG_AUTOMATION_CONFIG_DIFF="false" +USE_RACE="false" +docker buildx build --load --progress plain . -f docker/mongodb-kubernetes-operator/Dockerfile -t "mongodb-kubernetes-operator:${VERSION}" \ + --build-arg version="${VERSION}" \ + --build-arg log_automation_config_diff="${LOG_AUTOMATION_CONFIG_DIFF}" \ + --build-arg use_race="${USE_RACE}" ``` ### Running locally diff --git a/docker/mongodb-kubernetes-readinessprobe/Dockerfile b/docker/mongodb-kubernetes-readinessprobe/Dockerfile index 17c590526..a2f3159b4 100644 --- a/docker/mongodb-kubernetes-readinessprobe/Dockerfile +++ b/docker/mongodb-kubernetes-readinessprobe/Dockerfile @@ -1,6 +1,11 @@ -ARG imagebase -FROM ${imagebase} as base +FROM public.ecr.aws/docker/library/golang:1.24 AS builder + +WORKDIR /go/src +ADD . . + +ARG TARGETARCH +RUN CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build -a -o /data/scripts/readinessprobe ./mongodb-community-operator/cmd/readiness/main.go FROM registry.access.redhat.com/ubi9/ubi-minimal -COPY --from=base /probes/readinessprobe /probes/readinessprobe +COPY --from=builder /data/scripts/readinessprobe /probes/readinessprobe diff --git a/docker/mongodb-kubernetes-readinessprobe/README.md b/docker/mongodb-kubernetes-readinessprobe/README.md new file mode 100644 index 000000000..1dd56bae8 --- /dev/null +++ b/docker/mongodb-kubernetes-readinessprobe/README.md @@ -0,0 +1,10 @@ +### Building locally + +For building the readiness probe image locally use the example command: + +```bash +VERSION="1.0.22" +TARGETARCH="amd64" +docker buildx build --load --progress plain . -f docker/mongodb-kubernetes-readinessprobe/Dockerfile -t "mongodb-kubernetes-readinessprobe:${VERSION}" \ + --build-arg TARGETARCH="${TARGETARCH}" +``` diff --git a/docker/mongodb-kubernetes-upgrade-hook/Dockerfile b/docker/mongodb-kubernetes-upgrade-hook/Dockerfile index 362831582..5005f5801 100644 --- a/docker/mongodb-kubernetes-upgrade-hook/Dockerfile +++ b/docker/mongodb-kubernetes-upgrade-hook/Dockerfile @@ -1,6 +1,11 @@ -ARG imagebase -FROM ${imagebase} as base +FROM public.ecr.aws/docker/library/golang:1.24 AS builder + +WORKDIR /go/src +ADD . . + +ARG TARGETARCH +RUN CGO_ENABLED=0 GOOS=linux GOARCH=${TARGETARCH} go build -a -o /data/scripts/version-upgrade-hook ./mongodb-community-operator/cmd/versionhook/main.go FROM registry.access.redhat.com/ubi9/ubi-minimal -COPY --from=base /version-upgrade-hook /version-upgrade-hook +COPY --from=builder /data/scripts/version-upgrade-hook /version-upgrade-hook diff --git a/docker/mongodb-kubernetes-upgrade-hook/README.md b/docker/mongodb-kubernetes-upgrade-hook/README.md new file mode 100644 index 000000000..9205118c2 --- /dev/null +++ b/docker/mongodb-kubernetes-upgrade-hook/README.md @@ -0,0 +1,10 @@ +### Building locally + +For building the readiness probe image locally use the example command: + +```bash +VERSION="1.0.9" +TARGETARCH="amd64" +docker buildx build --load --progress plain . -f docker/mongodb-kubernetes-upgrade-hook/Dockerfile -t "mongodb-kubernetes-upgrade-hook:${VERSION}" \ + --build-arg TARGETARCH="${TARGETARCH}" +``` diff --git a/ideal_release_flow.md b/ideal_release_flow.md new file mode 100644 index 000000000..6ce43a0fb --- /dev/null +++ b/ideal_release_flow.md @@ -0,0 +1,66 @@ +## Release from master + +```mermaid +%%{ + init: { + 'logLevel': 'debug', + 'theme': 'dark', + 'gitGraph': { + 'showBranches': true, + 'mainBranchName': 'master', + 'parallelCommits': 'true' + } + } +}%% +gitGraph + checkout master + commit id: "A1" tag:"v1.0.0" + commit id: "A2" + commit id: "A3" tag:"v1.1.0" + commit id: "A4" tag:"v1.2.0" + commit id: "A5" + commit id: "A6" + commit id: "A7" tag:"v2.0.0" + commit id: "A8" + commit id: "A9" tag:"v2.1.0" + commit id: "A10" + commit id: "A11" tag: "v3.0.0" +``` + +## Patching previous versions + +```mermaid +%%{ + init: { + 'logLevel': 'debug', + 'theme': 'dark', + 'gitGraph': { + 'showBranches': true, + 'mainBranchName': 'master', + 'parallelCommits': 'true' + } + } +}%% +gitGraph + checkout master + commit id: "A1" tag: "v1.0.0" + commit id: "A2" + commit id: "A3" tag: "v1.1.0" + commit id: "A4" tag: "v1.2.0" + branch release-1.x + commit id: "B1" tag: "v1.2.1" + commit id: "B2" + commit id: "B3" tag: "v1.2.2" + checkout master + commit id: "A5" + commit id: "A6" + commit id: "A7" tag:"v2.0.0" + commit id: "A8" + commit id: "A9" tag:"v2.1.0" + branch release-2.x + commit id: "C1" tag: "v2.1.1" + commit id: "C2" tag: "v2.1.2" + checkout master + commit id: "A10" + commit id: "A11" tag: "v3.0.0" +``` diff --git a/ideal_release_flow.mmd b/ideal_release_flow.mmd new file mode 100644 index 000000000..c883bac17 --- /dev/null +++ b/ideal_release_flow.mmd @@ -0,0 +1,28 @@ +%%{ + init: { + 'theme': 'dark', + 'logLevel': 'debug', + 'gitGraph': { + 'showBranches': true, + 'mainBranchName': 'master', + 'parallelCommits': true + }, + 'themeVariables': { + 'commitLabelColor': '#ffffff', + 'commitLabelBackground': '#333333' + } + } +}%% +gitGraph + checkout master + commit id: "A1" tag:"v1.0.0" + commit id: "A2" + commit id: "A3" tag:"v1.1.0" + commit id: "A4" tag:"v1.2.0" + commit id: "A5" + commit id: "A6" + commit id: "A7" tag:"v2.0.0" + commit id: "A8" + commit id: "A9" tag:"v2.1.0" + commit id: "A10" + commit id: "A11" tag: "v3.0.0" diff --git a/ideal_release_flow.png b/ideal_release_flow.png new file mode 100644 index 0000000000000000000000000000000000000000..55deaaf5288516a802f85e5ff91f8610a2f20274 GIT binary patch literal 14467 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 uGa#yN8Oi?N#R1f literal 0 HcmV?d00001 diff --git a/ideal_release_flow_versioning_complex.mmd b/ideal_release_flow_versioning_complex.mmd new file mode 100644 index 000000000..baec7cace --- /dev/null +++ b/ideal_release_flow_versioning_complex.mmd @@ -0,0 +1,27 @@ +%%{ + init: { + 'theme': 'dark', + 'logLevel': 'debug', + 'gitGraph': { + 'showBranches': true, + 'mainBranchName': 'master', + 'parallelCommits': true + }, + 'themeVariables': { + 'commitLabelColor': '#ffffff', + 'commitLabelBackground': '#333333' + } + } +}%% +gitGraph + checkout master + commit id: "A1" tag:"v1.0.0" + commit id: "A2: fix v1.0.1" + commit id: "A3: feature v1.1.0" + commit id: "A4: fix v1.1.0" + commit id: "A5: fix v1.1.0" tag:"v1.1.0" + commit id: "A6: feature v1.2.0" + commit id: "A7: feature v1.2.0" + commit id: "A8: breaking v2.0.0" + commit id: "A9: breaking v2.0.0" tag:"v2.0.0" + commit id: "A10: feature v2.1.0" diff --git a/ideal_release_flow_versioning_complex.png b/ideal_release_flow_versioning_complex.png new file mode 100644 index 0000000000000000000000000000000000000000..71422202e5ffb37e363064a458a778ab12b4a457 GIT binary patch literal 22061 zcmX6_cRZEt8%OpI**n?0lF%^{l8~KEva+({*n|*5k~l`PSIFK8AuB7J?45P&-{t-J z<9+*ZJm>a2*L_{zb)Rr`RYej)dO{2g43dXR@){TzSTEq;{`gq%-*M6Earhsmi-w{c zM$s?E6$}hkjEC~FTArWQQ#=d}N0JV=_HeIU8T^2Ce@l3e^NozCj_lCakIxNM-By!( zHkW!f8%`X)K16I;dN5^+hkHGeLl8Ia*dyjjicXe*$4ME9qkv9`Z~W)XkQ1* z*CMQ&Oa&9uCQe&)i%z}OOWwa+Qg@}Wi${oNTSACv1P!Znc+7M7{Qvu>lMh=6CDr9O zoo4kToC4?m|B@G1Rn;%Q)e`bTpoQSg|6f}8KwS3af7d9g2xD9&M8^Jgl^C+EXrFJM zsqL`%s>H!gj!%oEDN?ub_4T!}AxPeO6B!v97S^;_>lC7_oHelF{%qGsBR5{@)W9TY z7TYNIx9$G&^0K4fp(K6O>*kS-KNb1zyOv_fQOzE+Eyl*hm9@1e2OHy)_wLamnUZ@D zuG^+IHaxh~A$%PAhK7uEbVvIPjxn8jk*nGX36k#XGdrHN$Poo<)xO@u_W707)f$hj zDZlyydP@_1U4w`*xT>B+ii3s4-wM=4T}8#UWJfA|Y&?`7bMjV8Nd58gaZOFl`3mZS zuFO$IRrSYut=QM|;gJ~>U!l&)a(^bv1-hN@J6D3-)rhw9kt~Xbt-n$*v+ZOZX1$Jo zPY$~5%(X3%F&nZW=I7>g+#*ysM;xXMjdczzhQ9B&#dKQO+S~h_(KPB2ASfv*QVWa8 ztRFlp8@q z`JOsn97MoNz8=s0S=QJ)G->obL+{MrahO0)v?!9Y_^y%pp;vVqy*7R(MDDr%6=06` zSlnCLLY|CY>@Ft5D-@<$@N#Ba2Q2e@I;EDBRby)msUP48`c_ZO+ zd<)fkDD>*@_U!oM$CC8)@yZK3iN^Y~0)}dFUS8hC#`VVoT|(0hK9Z)G%+Zw|z0BJ# zsfMXsi5G)pzS}*H$RK(4BO2q)_gd^%w~tOzy*K^NCZ`uV7l?7Mg!tj;E-yHVZ%#K} zEG9epUTj@VnOETQ&)<|WYH(g)m_A)>I6Jvb-xGUXG3JKHom;fTudON_rTu0Dqbpcg z(gKONtTFDU{5m<@V)5Q-TU=Z$DJk(x;-BHx(KI@9ls;v{mOVM#@Lp-7VIpmh_C0-; zpuAurDkxY~T}>C57Tf9ftF-6c9=1vxpa1m%69#hWrK`(6+Hq=TAgc8?H)Rqx)tI}gAt9yzHhjA}DybHt&m zb(+N{;jbKjoUYDDikGBvzTxP*YjUw~BGiD+@GG6JKl-B14fXAPxLNNs8#rc%Yt&<+ z#p~woP96CUA#8j=jhMRk;Op2%TwEME_PyQin~k1l`xi%B7YCKv9}?f!)Yh6vxEGXv z4wg$tdLFwDW~2VtfAjZqsy6tF_KX`N_C4^F8bwFVw-~!h`1txV2d4R59Qs}KUZA75 ze73yLpCfU(opu3Zx;$|q!|}4$tz&BGCB1l=XmG;RL$)kQIvY#?bW-$$ z8*87P9OUKk3KwlmG#K$yFD)%#l64pR?&mkf4qQ+dW$QWC?fe*eF{1iOYHW0L*-y8B z+EJKxU|_)aa54GZW6bX0;&{{J%AYmSfx+ndZLHBCZ1>*! zP7u`Zxi&1oo8a}gFWrcQXRN*qhlSYkn6e(|-Rtxw-^IrlsBT z8XHY2tCs!pb4r}HQtx4&v5_%Jp$8&_v%cS4M&R;6BBq_ zjY0{^eiy?AvOfg7FGivSvCfSJvI7DFrlzJYc7-m?4J?HSxg*;|g(yFe=nWVO(x4OC z%$wOJtZ&gfkG-kG*&9TieojxvjDEQHyTiP6Z*LE|-HgZL_wQkhIW|^6r-dNRYIL)y zUgFC-`2%kHs6|(aSR(ZRnQiEhLak)shzIm6EG*2-=ZP05eoKpsfm869L2V4ydp{6 zuz8_lzmWFZxXl??Z75Pa!tnVff2bOY`FZ8|%aaYwVl*24^XE^K^En#mO=KE&_E)r^ zwa2t%9^+6Z_XzUvmj_eaYaF&Ub8W_|hcMxH%Z?=*D!;`~QXa(WSIk~mtMbl)(Knc#x?n-1^Wt z>?sxH^#rAX!2yndf1ReRp{*~AvmV^OnW>SBj~&=)x47%6k*mc^P4jmt^s_QKc11;{ zTE5oc;GhfrV^2?UY*~s@J$?%9_=FJKsY0#XV?5k12|ts@#)PT6Om7k51nTA9GUj~r z=rPH|1Xlc-i;NZFu@>v;`|D3>U zbniPL4CV+w$`xjsO{aA|e-w6d~q&yatHp*Oa|3TFI=2 zY+L!`{8N-`cfyvco`yb8yyaeZ1ZvH96w><<0S(S5R{-er40yPA{LX&d$y*FCr33 z%Ggw;JWolv)o{ohA}5mE(;*V9#PK>LFgzSU(LsU(S|3 zGpBRBV%z@B{@Q42K&|V(t+%40(;#C+XSb5tbglOtG3^2C3dhq;kB&j3^Nc}jV%&Mj z=~GV2Sgq;fL6qgt>cW6B#*^IN^|c;LmR8R+vwm%EmM!(3)HNZ@MQPb%m#-DP(;Bt= zW&-1!I{$V@ml9_j0d`BJu}?z#g1KgXbZ?60-r)&rv!V)T8LN<^fzLfLZK#veO~3O{ z8CG<+cMQBM%&2LveQi5p0^{OCzbUUrnf-c+((0uy}W)8yC1C% z%{-Hg>x@_C5Q6b0ru|iqzwx-oaoxSv=SVkNg)>g+v!mZU!xKhQu?qckCF#>yva{lk z-HTr&J>;IC+^D%kDQ+?(j;#4Wl}JiR`cS_*ca}&gv#rp``q}eKVcc|JWaMy(k_-83 z@)D5aj3(6zmq=7W4HT zuQrVE@=b}=B;$=p0vEz*t z!(5FXn_Exm=&U{d6>V~&e2i6+lgM`E&85f-`(UJ5eqJo)#DouTgzeL z;RGN4aBC5sx^}2Vj5ELAEVvRB)O!6opH%1Oz86>a7q5P@Q=i3&YSx>QEMw~jn%QcZ zhSzg;79VH!SGAbx2_~)?KZ@wLmakBb@H#ugBMU6(kNxLWFHwJPsY#iq9mu*I6pbKc zCL`jhZQbc_XSw|C+H5N?FRu{$r5#V)(ANqIiv2}HNo7_{C`BASo&5dQn^x*YS6x?D zhqT@P89aX6ydk0{xN&+qf8egGuHFn+uW4)hQtR=gkYZG@yl8aPrfj?yn`9-VUQAtu zeX^y+)Xy*HMX7s=l$))#yJK>XJM;>zOx{$4%c9FtveK*isk>2&m>+jCtt_orDk=(N zv}IJYcMH>U9a9Y*>(AVs<_n_@RhL>7qkqe0=H5#O7+o+N-TU?*dd|I8&F^&QXF91= z+d1+dhu7sF`1fS1SPWyZTw`o(C`3OhExfZcb!tj`=;wlS{r`w3$eC>^b3bsE*dXFUutho*T1OHUrT*u z$#h})%4X%)#`wq%nP7JQNO5KPw<1Da89Oma30}e|-lz88LPA1rYlX|DhnbtJf1T>i z8_K5-4Ct_M#!ikJkiC=HZ!Ju(i{r+Mn<7X>*q`&ReLg8E#mHd%WoG7+udPD-{Iorm z)(I{MEbP+j?CO6SzUmjkB41cb!qiO799&;7u-{kZun@f~%FfQ1a-9)3v)@!0yD}b^ zDy~z$lWuUqId^GsxUVxrZq~*7@Qt~7Uk;FS>g(BU=1C*AZ4}|QUS2jf;n%1+DI)B} zk`)R8yqkvy?~L7LtL+iX)=BQMq>ti!ue6Lx$%mdzq+e)UOlDP|spDlaKXGco+@Brd`x5s8^! z+~`MQgh@QToWxyEUjCYdJG52g?(Gl-pJBrriCq<|_Uq|hrPjjEWEFP(S zALOIDRG=TF8Z|uXZj3KVON<+YnZ+yn!b@E>o3j3!L9(IX$Y~3f@{5Lw3Z}5I2y-qI z%|Za5S~qW+m^i~<7+JHgaqHR{ zGgRpxPfkhZd!)4ODb@4%@nY}KUF^VtfB)zb2u~|!)7kI?(Q<4da{b*s_Z;j)mL3yQ z_lL=T^y<~2ii)OV+rG8I zn>Q)r;z)2?C&w$bm2a4^vXbME-Mwp!Pk|ru=+UD?#FXE_OB*tm)qlxEs;FqdkkZ^C#QP>JtWSWye5!G}fB4(N%?r=Uc1=y)c2m**1L_mQ zp6*{7xxa7Ias{ZCA0`)g& z`POtC`gYoA=g4tEU&>j*iY9ZkmANy8aLa=8lUyy)B)iJ-NryX83fE(mV1Uo>u=;(0 z$;#euTj5o2{I?e#r3|Y-YJ}R{W@9~8Da%4MNrjW>nK>&y#Ul=EEH+V5C~vvlq|gv0 z_F3oZKh<|9Po*N-oNFgZLxVcaWyx>dxl@@l_&`BHL16x4!H_khd#w!jo|n{d+XMDk z+G|YqW%{$3@4uqaPGZR_oS~o6IOA+cBt>L$0?m3*4_2af5Y6a@erl0EE6u1V&OPMd z@DxUlw#}6!Gk5uFx`G}qiJ zD)0Cm=dyBgDhiSeWQ{}bO^7orYNBZ6Usbx8ab_ea(_!U zhTj?sp_7!eEG?ctG=C=W=#gplLylPfM~}9Z1wZw?W>w14qBz%I)2UFpsrdLC3y(j4bc`3HZlKhVKawxE65B2q5D=O%`*!ePOEm`Rp9T_Q~sSFd7 zPq!GCz?fd0gMvrkMiy~}ilkL9%A~a!S0d%SWww=D*45N$`=$4Z?Y+euEnDCtbtNf7(ppFR9NT8UT_d6~_720+H zKU#SH{OHxIWo;YTZ13%v=AW%Bf#kc2WGo7~z>|Cy5_FAE7KC)K@q{;slDZ($+nB}%awXo=mel@=u-oOEy z@}8lgyE!+WpdWEL+8Yh!x0{!$KR(&bns4_z8=o$+eczil7|kqE{xUK)r=8=Ur&QA{ z?diI!xV39duiNK!cga{Kd3T5C_Ggu2)~?6&NC%OKhuC|5zUbBj%6J*p)4!q8^0j}P0`i)%x?0sbG~oS$EF zPEp9*_)~q8Y=O!RrUWpXDZ*+%iEZXPl?~@^TKU+reZ9us_6z9(Ia;fi-xB;;O^5(Z zMn`jyu(dx%>GNDm%WEb{^}>O?;N!dG?6LUIfU*xDTxuT}E5hzM>Lv-7pHmRutEM=c z*}Cuzk>{WYzc@LWZa3xJKRrJiXmoEQ%oun_QNBYU8>7eJ<$K}V@{>Nk&BFI&NVmTT zYHs>$@lFz|t(#B~E5K=Q+wAg{>JOfd{UoveS|v{WZy{FcvmbiuP-oQfA;$pO`7BFc z5k*M_NDh3nTmdpUxdrkJsIch6$tZ?#3~_=Mn(R+ ztlRVF4ywNhiLyCv*mENVlP9|uoF{D@NFVqNKh+55xN(=RtoX{okJ#9&p@Y>EU!xT= zcd8~Xc?dU7)1I!ZZ$tb1ll&ps0a3U!XWj=|I$EZhHv|)t-^KsVR%eaoItr7`&i?Wl zxw~f4Zut-HMLsVdaM+tIDLslXy;QUPpjd@na8y*4-$aJd(le8OZOZ7k9!f~~u)qSd z586a)X6CQ76hl^WzrVbKyv`Dg`i1V*->&$E0a4`^1e+giIc3V${uT*mj~LwjffjcTvnxem!+eF*!7jm%FYT24T-{@#L9e< zTXFmL@{v`+(=N-=^XL)d!A#1Z6puEhYb!A-&dOM8Mg}gmfFWDA+DTJ}cdFUIvFQ`^ z4Yjl?Y$y+aY~D&NGEULq1q~o%(#&bn9oKTd_!g~{W_Jq4TR z?Z;?sa)2tv^}a^A8nH?o`9rG*p4=9q0NuwoY;tqq?%{Wyk8v&is_<|Jv=}bLK@suiCx-S>Lq7mR;9)7hHUTc zc5+>R_DqYg&9bsqhAVr}$f1&7&|%~)(?c4vMz#X({&N zX?tF0DUu%F?8fA>2ccP%+3xS{-HPjsOi+Fn+`{epZ>T_iMi#IpT?G&|fZ9q~8c$S+ zy^d@Vx-Kp*Po6wsH6v0oVCtDw;&?}!PJUygXXfje9T+;?JUroV-VFTe?adpy)b;~d zBO)jXLi+pr*;f8Wvq-;Y%_%AAvk>j^S1lR|dQBN2k9io`H@vs!>gc#NTxb9)LH9a; zj<%=X2QBvStAzIhv9kwXfjb9sCy3A~s(12r)Kt}gfa~RIQBhJ}r+WQ4?(pCMNbtXZ z&iO+U`8q+Wzark^rbuZ$Lo1i_%ciI<9YxTLOGpS84;*s`_V_wXH+&BcjzQLfDQ0V% zmz&$%t;Jw?|Ni|-$7$7v4|8*K$M7BOyz0-vkfe^dAu9ScJ>AUyD$j@!_$9fyHrCcT z85!(+e0;x$jv~HfXBQjQ{#bDKSRcJgAsG;DCpMn-C~!FdUn!Czqr3*;%+kIS z!^60;>aw!3Y_{1#Iyd^994ZaiV}Fl~#C38rBlXguOc%NmK@ECsTMJ4vi14!H@hK@r z#>UL6s|BiE6jU86uC}*6YQH)PHDr|%!b>R&;*0IHsQJ%bA-!a4*7$ejXGsZV)s>Z% z-Q3))C%>8^15NJW%bWfGf3r_$16c!P$eqJl(AbR*F#)tcxcU_QxxdcJ5Ld_Cr~1K# zb_*(Ja&`@5RT4~0Oxxxlc+W6e

eI%Z~AwS=_v*1p$$QSy^Jj9=qIu`>WLv!D?6q4(s^ z6tiP0C;tRfy88T$R-*{VHs}EB@9$rZ_vHIqX-}U%#R|X(KEab}{rCK!-OAGw-Jhv= z{rYu){`JN}9UGw{@@G2_IpfHfrS!D4pjz%pO4gQ_2cLDVOA~@~usK?KU0NE|IvW`k zg&FqKLe!2~O9t6c@d*op0sqeeY_||$1+d<^bBB}D($jNv!#x`Acw3tp?h`+xrG*95 zr%Uz3+?;uZzP)IYu!H2q>)oxtwD*56I2+Zvlc->u9aS>@Am3+6k(+XV0p7P;Opm3c z-+5i{Y8eROf{A2gWI-mS!PZSfR$xb(nWeYR`m?tgKlG7y1d-=V0|npDe2=! zdftRQE#CjX^yN#D6ji^i`a|nm`fhIfEiHk~rXNyLa9)n|6%9CxHNAfQS~FX9e}DfP z4Gk9;7atX2{?MDAAi^*;V03Yvs;N@B>fFFGG&MA+2tx)}z7uC)MpeS=1q1{hKYk4E z(w8rm4i2PU0pg~uIO~5u)O%o{l(Q&aiI|R?5%l|KYFdwPKHS5>PpE9hc}?p#FOZ^| zsKhaT^~tNpoP%u9>To>w_(|}rpMCz;_UD#zs`dPICkOv#fb4AdF2yR z*^>@<$-~g>$yg8*-|QL0-~WM@^Y%?f_QC-oaqaI+y@9=Qk~R-3BB(rN(xK6FC&SO6 zxcEIoirlEX8aI;USRU)XN>kY1SFc_%F)`WL*Z?{!OR$cqR|{?J9~prf(bd$vLdp}c zrjYs4(vnj|C<$;foIwf7GX zYYhcUETSVK?q^C0gsNe@24@KDw1x&mbbF>2FLdDX@$rB`!aTlycoPYOSFfrSGDYa4 zU_ucP5b#q!%F;;R_(bt}Hqg~sOE;ry_NM1}dOd}`qod#UjBJxZx@|2NjcQ*7A3g%8 zTCNu81WryRpFd+WgdObdO*H!XRo8mePi?p}5WhY;dc_hJIN4BMUcO%#ZCotvcYf-; z!Xw2Tt(^6z+(y&Yb?^K4U@cy_16QtGnJH>B2g#pc8T)&c+Zy!*BjW4$25D&K*RKN> zqARWvV##0wdwY8~8-@^g>$sx>KSBBNqep9K{^K`;D_Z$ObaZrUdMs%N2M4Tt z6mgxPKIP}<%TE95?*6^vYI=%u1$-alLzm~x41%6qcj%+!*(LAT9yx z;3UWAj9Y0XlMW6_$b9)z*t8Y%3eUfv&MAyhlo^;iD<)YBf8MHaIzl{TQq2jcl#w;$ z`FLTXQ(%$N{QPBDMF!DSRaI4JQ0XPboY_A*Fo0D+ZmJTioD~!lG&9oC(P2OSt#Cg6 zCkqPPQg~0>isR$`wdP8LzNYL>3kmOo0x|>xJ$;dJJ-t)!HGjJUMRytD;ir!1{Y%V^KmZ)Qa+8%D7i}R-3sW7S*WubL2Bvh==HK*5Zc<>+Mp2~ak%fV{2iT%Q{iM0 zcVgw|@1Austaio`lf*nKXR<_Fl`H> zDD`jl<1mCYH8lesQ-t>dhRk@=3*aqW-WeVyZqUp1Q4w@4tOZ#TOo6ykgaAo+wly@i z0rsmKBm{2J3uvLSx0c)+8P}ohgCM>$-)=qcf<#XEU4`*qX4T8g935K6O^zQdH;YD# z|3C+`TEi28o&$TcsED-ssj-0pA4NE5t}|>O6f(_%dcnW``t_@%$L6+Y-Ri0>+RMSA z$WRb3g}fnbY_$x2R93bN0i&Qv2fx`68X1DBPtndxglcULrqN$syi6jhi7MJ zwH{kOG^=3Os8oLGU)FF$DgstACU49hGf*$8D?qRWqiA{vokk0 z7Z!$(7HnFQm}5)Z(E-ix7JY@j&tf;2sbfAT2LbfMzkjnbz3gwzZfu0P<{{1q1AyQO zZ^F-6rFQy~q`Qoyqg8>$X`#IgcO1|Rj_@9x7XJdQA3SLL(y00- zG->C(3g>jSOLj%Y(26U7&(@J@L&2|(LD|7kJ1~KGsoubvzI_u*Qo%KWNYp0Ed+B=j7= zx0aO^*XdicaJ8BAlJfH36BD1{3xz6%010z+>+JR`1nrg&P$1l({?SoAeSJdJ#Gvev z{{GVPa_paJZ+iWCLaGfnK{%*0c64*QtyB!y+0U<0F5SP&wEA#tXb8s_`UrSkfZAb4 zU}L41l~Hbx?{;nYsH&<43Q$BTXliNw9v>&tNOSe@07%%}R`Q)|dk0bhOtiF45-DIS z!`xEMb}==@IFP?jfC5<+HY=u4==)uPt+lnFanh5^A^x?bWE;Kn?5}raNr^vF-2@*w zhi$}CI%Y?kVO*TpwNNwZ;OW9_J-I{oy|TypmUHz)Mn*<||C7*GSypllP0i+~`05zX zkXX?4OB594s2Uh3M%ZRvExStK;o-#!-8@YzY3CB>Uv?6YSH6*;{6LOsxQ0v+)^)=Q z6WXSiSB*yQM5QCjxHz=FPvl2-wCK&7g*q>QNa*P3czE1FGQq_^wSWH}|NgzIiVAqH z!NHI+5x#vJhen0~l_+QwIH}`9HBl+0Rdk;;wADiNsL`XOfg8%X#sQ0*iG}6RQ;I(7 zOIlhQ+`@(kTtv{xHwat&^Q?QEELJ+U4m}*mn|dMQEK8jm)EI@#0J56k;azIt`_T5F zudu#jsiLJovS(@W2HdC2%U2_JpJ;FANK@g|eEISvFsv6Z_zbi9<|sd4-@JKq#q~H> zGrQ!lZohwf+sOj7zUR-)&CM+=I7IERywIPLlZiAGGW+=j1hjQ^v$L`w+%`O{IcIoD9N#t$0}`c7ikgDed*H7Vll&ZXTeZ~Y%We0cZnU3kRX zfwVWFOy^gHy0;&)$Fg6)o+#P4cD;MM+Hf3)N*TRJAj$lB!`N#j>)^n>O7e0`oOi;u zb*?`BovT@rd`ApTJV(rU?b?mFPKcz5{NO_M78e%odrJKmIf>|KId52iek#KnpO^?p zl#G~|pGFlkSBM(%QZ2)cdX#}Hu2UERyGBIM2L=+WQLsNqV=yY(S^OgJA+8)(L4NA* zUkjAEUJ(LfS`9uYNTgwN(7)=yh1IgWyr0u_qm9ZRW^ac1i3Z4s`yAgoKpXy&rbEAn zw=#|HUHB9r%Qdp%3IG!Nh-&toTen=@-0r5Rq84`#1={WQ2|oF5P1VD!j)+{sL3a5d z&O=(cRQvX6{JFP<;5ko~KEuQPVSp7dL%IFFb(T@um+|hLX?U+cq6mNlbGW(?Xc>AEF(?V&z~{6!mUjQ9wa5xCxG`Y%U%JtUrD_wEe(#z?01aOEg$HVsJkvd+EH@(LvP={ZHb`m-lo&P z_{-{z!aR$MZCHSQB)CK@B`oZ}{#S3)hdxTdNoRD{>GPK_5{#sUI(*a-;3a(B0I~8d zlcezY$@<#bm8gpH^7y#8!LczQVMoaGOvPyR$;oyVaoHzV<2qFyK787KhpS_;PM+Py z-hQ9VlL%>2+HM6q0&p8l&OmfkMzC69m)q`Qk3Sk)GbtbdlZ8c>oR2oXnHeRTw0?ee za!&Ts`qpb~6hHNg_P0!|u2etHJ7u>oAs5VtQ9CizxBJIVrt1<~CMH|160*HJFL6l; z5VGSSm=MWmv69O_cmOetKY#wr&YGc{Xv5|6ii=GSrF>)+vV-u*NQsF(>y69CK!*dS zcX+znTc*cfPR3-$Iq~KMM?Hp=o|+mL>y-@ot=qTV{?lMI0%R~~nx=MjGW$7h+z3Dk zP{ES+>xk&h4$ll7Y7X zqQdhQdKTI1Z%@O(@ZuJ|kVykE%}K^QCD*coE;({|WMpY+iGdh5L0Q|-kl0(Pg_Zg_ebnMj`S1awat1Ht9wPCD zWcDB(1yYV2N?7yh)1-IrM8(A3$HoRo^$-W2t!i?{Y3t}LE-XCdrv}2TlW+FE6&8B+ z>eXa1dtS%{mW_cpCLsa(px4WnrInR;w9v$(?x0A*M4d`)^4+H^*%1D4Y%26AjX}3r z7X@mdnVH#*8#iDosBlt#-wxV(&0*Kl*Qc(grUrumR;{O}2gFg7@==Zs3cw(HY))O> zC*>?cY%K9>?BvR(wDj~ffT*1FduKpCK{U4%)z?q1?E{7mk}~Yj%wrRoT6L}Y^-Hx- zCmH;0I=W8FGM{%D&m8M2#y6l8K|6sr*T}ua%bQnLHaNf2M8fp0gaC7#)OTObypCkl zy`z6-rHPCAiP^mE!pnP~HEfP-v0-$rdevy&4lAA6#x5%)3g?50VbCKzdtt zH1dxi2YTj^42XX3-jQ6hzIOfLtA&Iv1ACN z*gTQQ)5V@-%$+0{R21QYMm1D_=V|9}^7GqWoS$vMNspLK_?7!Z?rc<>5w){`*%&#P zjkkjg;YD0rRsg}xOVPjyyPivtbgoix%%VBI0(t0 zy}%IosPY9m?giH9<=|9QR74?s=s%cYz3=?>3o@@yr+INalHPYMu=t{9;n;%};PY;5 zVj}N(d(cL_y-&g^xgcKV_qjV}#^r|n;odCZ=0AF%dP3$nR%!g3{o2|Z5gA!Dyi-&Z z2@z3OXJ;osWEGX)wiQlZl#x3;iCtibfYt?P7CfauJIc?=N$a zuL;qZmS*bYBn;0SLgH*}5Fm!l4D$>?ci^YHX~LG5F9X7f8`SJjx$7wfj2$YUfgw2| zA>q@f^&QWcvF|0{vsE~+Q-t&I@Gz1pvd1F#`W0atK>9r?l;|0f0zY_S!VnZIW>pW5 zO1bn=D0omIojq7VP^_y%`sD9b=Q;zcgN_EuYjpcf`Y0fZ(4(DPTVvLJoW(yyMiS=_ zeT<1oQ|AW22l6EHHOVt%QOQQCG9czjnSUleh>O!*P}PC(DMmBzd)0#&2U3Zv#H3{z z3{uvh1GC1%r$$EigoT?dM4yX3H84n4;`rIq1NS>%a-*fS6}WRtOUrPna#tZDn)%+J zfq{&XH4s0=MMVeT28@g(e)uptJS-+5kq0Rk1 zp%!m~3TLhB%DXmmIwmHPq2>e_$AF%}fv+}1h>I`pc#1hrO^l4-S?$WK@Q@G_L-Yf$ z4$2ppIULi05(2{R;o$*iEl|CR4pyd-y{D(A8{?IavIbxpMKLN(Y;h@JxmV2IM&7T%4WD_3e#~rvUr;`Xa>rq2pdwQTZHY<(vc6(LCiS8zeiD zdoJN_lx|sB89cW_omLSo-~g8~{N=vizvEkH(R+hx*9dXY2N5(vEtD?)y$kLNBL)86 zC=id~@qilIV|jRZ=s5n3`O}vd!Wq^DhiG_ z0mX-`Xm`?0Cps8QSsH@_1HV%5J<1;R*!VLvIw~$A!WP$wI7dHA?0SBS{{Givem=h1 zSG!*nGGA?0FCCwp08)KsZVvk%qQA1D-0RR$zj?pe2``qt6MVWuFqH+v6GSlxyurSL z#sI=GVTh=d6hArs%nm6DQlJ0*?ouz_cL*3B!%+k+EiELnPA=W4+7L7gP)C8|Z`*kA z?+_?Gg{}}A+yCbeY%AMRz17v#Tl7(r4wZWRC0SI@M%V-sL7}F*dbR)e@6YPopteB= z1`evu9h{AzorhQlAa|fY@$vECF~oI#9$W#20AFTTSo6?(9w*uT*0AH@xDB)m^HSPR z#B}uZtINwWxWnzZC~PcHB8-<;R?;XI7l#7Ng2h-uU>_7 zZ#boTkt7H>PX^&R5TMiVheEai_UMlvKR|8;MO#s^{p{orP&oWLL_f{T#)N-xg;BB8 zZKOKD_9LkWFNFL0^&r)32>W&a`t`?74C6_KK1n+^a6~wQhf!wd2U>b!d^{YzV}t2f zP+(_j+O$MYq>OfzNEs3I(^S0%GM3lY!5$Ot)S!Ffep2 zI0FKknMoU2!y%7)^QPwIJgy-w@Bt(eX=KDCzGMufPAA`o^C1;s7Mzi|iNsPYg9$ba zzIlxsA85>MY|Ycz1YJYf&8FlLZMZ>ZmX=>~ayo1)01HAPgQN@Ww^R@8vYzBSFyJin z)gXh&83$xfQbNMn#RV#Sbo7IA7JFRhE&9j#Ltav;fI#*6si7V@<6yD8u}V;qwT9#O z_JIV`o8vTd(Ry)mazfhz3DG|XLIq9rNNq!iSJqfG_-$k(DJ;m zbqSu3rIpo{DWHPzh+!8M6**X1;>u{Ht2aITb>G?PL9UiNoOYt724L7qo|2kM+BwB# zEg7XS?_7-`4h4DFEraNom!E%yoQatkS2nX;UjPOhg!=Az9{^*?)5?Pmn~<2;N{%Dq z=qAAwATtUy?>(I^*axk%a4-vIB1Xo!{b8lQ+NZR1Ehi+Fm>&OoP?~8owgbt$k<60r zD#as0f`TB$x3{;`P*WRMIhldOSVWPBCT5Ono4-seg|=eerz+CU$si3-awH7FBIsAI zCS^h(X(Jr~${H7Y0I`8Bcj@|a(P5xq7c%8jA@`xN8|dlfsB;4ofH_uaH#X-g;W$|n zLR=6{f&d3+G!DitWF?>{f%I_g+BJ*}m}O4#-th+rd$I8ZKHZpmj79HcSYepj+1VND z>;HEzV4eUI4Dca^1A#!&hU+&1XKwQFaxsp(;4z*)dw ziUAY|(C-sn-t1iU&r#uIU||WB{kjRPIB*RSw_#!JCQh}!sG%2}*$x3MVEsf(ny1T2ZOux`n zx!FP#AQ*-`h}htTZ*L1TM$b9o0lvDQ$%@9t(~Xg>$D9Hc3R~7r%zJIP5bpWm*0hP9 zUfgUfKqn$($LWgs= zFdf!Lid)5lalZ0_X92J2H5G>MYw75G0q4!i3N|_!DQTcNZ872zwADwC@NjVf)ld;$ zhARQ0>+636)D6ywA@R+5ff8ek7XlG&Z{EHI`v?;Ka3^{!*Y>^8b+^6H!IM>{QIU}t zFA5bhAF8UtE4Fc^<2r-!@FI1AMB8<}7ciY9(6|o10z6j{+Q?|>bJ}|5hGsZ?{NiZ- zrj(Qvl)0VL*Rl1L6`KowRT%m{$xPE8G(7W5bx;<~yt zDXNYyUIcXkEdjU4PAs{7o`;ICcw~HJ#HvCc4v@BnlFf>OAORu-#uLz3EX!_+ih`X9 zgVAB4>M8{?@EZdoBfpT)l9M$IdkU%kX0pPMBQ#$grSbtiDae(HC>ooN{2AEGpxBvhFDhoEO69?YOVK70sDR~=a2uqU@) zM2a8)DFKUmT5aecngqoS%^5Zf_|+h1%URdCNu+=-0NN9K><1`}F%ZEFO-!OAeFNzb zxmv3b@?eqnwJX(g-}sY&LOI@|Z*GOuY++;b zFn=iHqo5={0#Ge@LEwe_+ua5J0!(zl`7T(}3=Ba_7Nhf&W9~4zEJUl}c%Z20KcJ|7 z$=)cXS?o4B3>4xhAOIh`*w|P>;RhP+32@unTk>C26DazIS z(9m#v>?M&xdg5gosb-4t+xnJVdW;gsxAJnk$r^1A3bwUqIt1ON`10V(HxU0JUfn(q z)=jL^@9F92dx+U@S5i9}Ntb|VgM4wBk{YP&w+_B!dJz#3Bc+Jus7edbF^5WUTNaj< z{NP+D++Kj{m#EYf6pa8NC*W&e)>Gv;fNeMxG;l(260^hVuL=ndE#7->t6Fefm=>U_ zODTS5Mv-HKbPB;BfI}#$R~npgupdC48jT?LMq=SO);2x|iKjgE?24`ojMkE`^0t7{ z;Vc7o#uZ&q>LT8}SzTK@LLvr)u0BF4bG!rl0!*)>q9Op4kgEcslb{R=<>M-1KI;Bfg}jjx-zRWO*Pr0PK4wiBx?FZah-24}*&)UeJ|L~98FXoigA!X+W`QHB-peP%zpUy-Hxx$qAw6%`e5jiAjs zI_MNKt9+`E53?eOu>3-+@&TzdlDBWyq zX12D3!JjcdqENj*f0_%^f;R&F9hU1*dD0Pk9nQlg3Yom-Yuq&5Zs$tw;fz&+tRi^1 zcbzTZNGF^Q6%(VzF75=%Y;UiftCc1!cBu`(5oOm8_d`ixEK!7OL1*vpZ(iDk4hM%@ z2D~Y~N78}P!c-K8=w7qwW$S_tARw>-Ra|mK>L9-tB)7>1pYiz}z?R=CDhNVaz*Bwu zmef-&oCFbTuM2)Gbp-qlRQDR6^@jO*}GCSV-3N3&c;dgkWm zfs+Hzl1pce>vRefwu`I;Q4w0?-IsI0;~Nl)@dIR~p+OO=ROh}yFP!mb!`+iZ?i#8D z=#Ilw9f4o2633q!x3$`>2B40M06Zev{w?=k|9qcX`G>*hQ`9(22_SWlafIFsAz#4K zFm>}RJN@%}6T$2m$a=K9y9+HC-WM#>J9iEfPoK6BAh>f zKOeFgTNBm0{}#G1nBj>iH9iM~#z6su3yi#2CF~R_PR<`(`W!#da1H1(y;8d>-rf*j zk@h)u1#$iKRO;*bhr-JSG3CUimI{s@OUL2Lw7WPWV0+z?HoR+LbD}y9yfu@1%+VUT z1)%+@sp)c4HHDtT-=H@~iMEH179USlGO1@|M56FMFffow(p|4m2S%=}I(%@0_$NGH zfWJFl_28=m-?SK$f9pUC>4&F~3`n(RVl?6CGe41aTxd zz5*YjBEwoTz5#n50|kY4`8f{b8$Xy)O;LuqS^(3>?Zn^==lm{6fUXkIp}Tu}d=`_e zpc7G0Qo1iAqFo?DS^y=bh%Cc`1$h%i28sm1EIS*-8WflB+mHxZY2l=xw!<`zZE3sm1UlAQ+>Xxn>~1q zimF7ffK2+-2|gSqNsxg7iACulCnpD7yRWYgf~7h-)UZxrS`fEw9UVha6hFLCtkmy} zi%}mwguQ*c=v)oq&x{PL;CcTDv&dcmvoKrW!)f683nuapP(X@`clxjk24DC{CcfDeEFiY%o95waY2eG3c-$5j9~~cO0Afl<_v+-pezcmvyLTK+ z;mOGfY~fF;*-9L%o14DdGnj_B@Z-8VsQ?*aQBe>UU}QGuCj9uJ;Aw=jO<;f+ ze$ae~0ErEtZii7$zcsAONDz`@loP|FwWMt0q*eQ{Qwnvw_g9A+n`3tPs2a%Vv6{Uz z0M*^STU}au)v*11hLAk53*e$7Y?_PwYZSonOi@)uB1iQd z+qc6n0FU(1%P4{wSwh3<2s#mJyn#Q9CIfY8?idejN@RjLoXq!)Q8@EqdD-Or3RlLy z@4Uj8R?+AwraW=S%aV0R9PVt< zM9TC((s0NI9^w9fI$xFL%>LNm8y9l7Ngg@^!p17Q?)=12M3UnIxZpcdw;&q=m(E6% zK_-)%^!dnZaZNy^!IA)?YlNY_eS4x)!L^*6O~rzzOWAXF&+BnzWUOt_U#zq$fO~yASoYJLpTJVgp*T5=US3_eRl^S^e4O&VxM?e8n`$4WVicW3&e8$Vo1Px!+8bT9z#(JDt-~r0D!?S2RmR7U zcS((x_bqpCl3G*YV#eOR+FDuwQPJ|yazynkeWY|63r zP)h!;Qgn1D0|KI>JR%nuu)7Ynn#nc$g@=bjB04%=;)+H_N8zTd)lO^=*KPHaF5szj zI52SLdlWdz?~(~>89l|=&4dVpqo6?l?g8|LR@q7dqnN6BV+)9SdM^%DI_;0ISBr5% zMPansYpO`=Jlqw~p6@*iyA{MZI9T2$*AwZ6WiZm9SaEiv`Q!HY|61uqph7bR*yva# z1(k>w$dVo%X;;UD4gcA~nnU`HD^!%aVH5*A>b-g~ExctJBAp7LGv(F)K+RN?mKM01 z_-s5#Qi+a@{U#7S9g{q4T5d+!gP{Q+DhN%|+t5|jF(s$b)WEdGA`yq3uCAApJq4Fr zgaeURt^Yv|uf`&(s*b%2?$QIM5Pb>ZG0L@5=VN3NHq$U*af?9QBKqt8IE9u?Tn=|w zP|?e`UcWxO&DWrU!kiW(l*Vs2_MFKosgXW;j0lTx_*E&aaN7opqln?p`fR%fYCCv{ zhO-S&H>dI5F|M(%n=ad2^|#*#MXC+Ax*o}vj*N_8OGSJOhEE613-!SJ7^?A76& z!};s>-@9*LYU4E~5Wx#!VJZ3+Bn7N%qnvtw(WwCQ(AXtH^6L}`iuwc5WKr{-ZKLyX ztI)>A2ID%@&I{4?J-aUNw1`d3F-DUG+xKMs>=&HaU?Sg>s$qqLm}aQiF(F|Gga%QK zKC3j*iDD5J{Do!VlRFO``p|A!Uw3kV+UvGZp;h=tbcG{ZEyy+({^ImILoXG)_p%=B zm_d>c;s$jCtYkL#G%B%4-pk-DXlf$bMEQUPT6Y59HM;%$AxMkf zHsHCiP0WdLaG`N>B)4+=`r;F4EPilR(^p5fnI!i-W&tARBtq=5vsWh)1%rc_D0L^0 zlXXt6OL}#DN{ZFD?oLAQ3vV;!Y@7r5R0~oy*S%#$3Ri^EU}g2|G)xQ>&ZTx?lfaNL zkAN!40OH{NQ`#PiBvamJ`!DetXN>w zx^0}StlPQq%M;4Aq%7fAM&{(Irw!a{>);{X+WsfCwdUWnVkX?k8LowGzE=3wC|#dN zN85^N%h^?pnhy#&9%57Vc=;&DTU_9PS?yC|u}X5QNN14ax2@ZM4NQd9_Q<^&^*RIE#QjaO7x9(4xS!~Z%O0`ku#5tt^O7}2PF$# zW}&`(Q%5M}&g+lslP;V;k5ZUTyBvPQBJRV`(9v*usW-W{KafFv{rWY;9)B$Kp*OC4 zn{hg}!>PxE(0Xp%Y-7Sk)&jn9*7!9`)=a&395ncLq?Q+c-ohBO!<=YIR`K)J`}!tUK> zF7oi-vPT%(*97ignJ;{kX&h1KE(pFCM!axhp5(Tc;@eAGoZGk>ydx}T3OFM?vsp;6?O(X-Pl@YXSdxml%$A_6%9Hx~ z2};+q!XSxna;NJgra*Y7a`W>~>#no4g`;bvAk+89<)QSFBrF10BFh^Y>F{5J4+;0! zty?QL#V9`46M#xmdlIhD`2gHyB)b% z>MBgPo8j^F^(a_G2$kTL26Nz{ZAh1u+_;-$cCM_Ebok{CV+9#KmH~Uz`D%|9`(CPl>25U_u+Ql&7ymtIulU*2+4Tl~>yzK=$;5GnhKYY{p{fhDPdU*a zE+2Qotz@^E_D-V-x4WvDhHXBpCa0ze!({480yYaggUto$X@;gM3czBEb@Tq|Tq3KVO|uDU&9vWqQi#BR zO&I>nX!FHPicL=DeiQJ%b#?DDejcWnm=GRly|L~t7N+~KSvGcT*+i4sqE9+aKL+oT z$#^b_k1mO%An5bp_<4H1h8%eNR$KCD$+(+`QQzCQQa!#;aR1XPdAW;!;@wiZs-38& z^#c*X!CXa25ogP8q6?mOcPIFJ-rU9F*BoWX*8^2Amvv&xctR#D$WF<}gB}-?e7VE(yyZrBU z6sy?^;mP=FCm{(qlD6@{Bp!5akRgf8S?{`dI?KI=4Mx3}hk34g8c ze(W|ApfxL|?Xr|26in*0E~D=vBo0Lb+5<9$;rvh z?XaL?BI90VN;i`zD;dEDRZckeVit;9K|$gC@Hc~F;ljE1iJK&IQs;i}Z&QI5^KTUs zJ`5!J+uPgAE6blWZU%J|T9ALKs`#R9qoXr8Tw*!twZdz~;;~t|kmfybk0+^fV0hU5 z{PgJJs4q3mdvU@t#eZLqw3v}Z(b94u>p{HFN%f@MNl*6v>ejfao12@d=@h=qX}WfP z@DmLsC4!Hngidh$kXfgr#l^)apVOJJuq(bJea}iA(^0u-55}n1uT>sAw5#(PKH(i6 z9_FCP&Cj=qQ03gM*Wjki%*>QIYE@TIP&|89PdIs5gQ(6Zq_-jW}u^c_UzfwZ;|>X zt{f$fKixjZeJ1BC^&X5D{k~^|{66P9EN3$^DN-+9sh)?g4;~~dgqrsM(LltBI82=O zM){sr51N=1cBYJ1yGt^=(T^A!v@h()i1|ng3jV2{tFuh4{X14uTj%rm@pSOLkfLmB z8=H%zW*PgTVs=46r}p{IL$4&o2i9d(Wo3INmnXlN7illkyEf^);W>Gd^wl>RnLf26 z#eBcBvva)a<;sH0#gXsnf-m3TZ{Nv&`;pzz$LudaU(WoFAeBCxn$t1X za~gZas-)oIao=6ct@dgAd+y@HMs`KSEkupM`E-=;*v@X>OJZVG&KFM}67Ro@l87K{ z$jf>vm{4d^Uw84tzphSNIyLp}+oIXnL0HUn$J^}$0jE=*llcx-j+KToXT#l}KYy-? z?WCZf(AU?OEs_vN5K1xAFtn%j8R+ZV3MZ*$KTuX~xM-J}g-{$UH1c$rtXp5VH}no+ zZ7CQSU^$&AFwWKU1euV24Tc9T^Ke5RXdjQHYL_|*#* zT?a=-j>ApPw+kvJKld$Z|=ZRs4)UcJfUn%GRR+DrNT%KNvC(?t@D1Ob~zr!r^V7cifvibh7st|d{C zO!>LF>3vIjdU{{$&#Tn3tDW|iV=msRWe0Kz#ty&flzRB^;Y(3QR=PoplHPQ4TIn$- z@#HCwZ@N5F)yWdB9wODgunxDIvL0BJ&{cfhZfRX|#u6>o{UUOH*zD`OR(7&$AZ-^Nrmr86Ti>&_z zuC!{BiPop-_peZSwvCbq%Wmn)7nUzy?lBxB)_ct_WkZVa-HuIlW8_*Fnq<>0E0q;- zg>+Rh>Avu99G_Cc>+osUnR^Cl}W&@wt#k9V(4nrQ2{E$qar60?A|>Dw)R0aWC>sQz2*MY+T%QxtZnI& zc>{;ACbOi@dGcZGHYIi6^&glxazAkbbc}tDGM_YCSXwsZu8o#!>FDsgXOsVYZQ4&^ zRx(_C`}WMzbq&=i19#+SwBm6NQC^zQ?^$j3gmZ7Uw7Sm6{LE*L^OIR~UqCH**YbOGrqF ziytp{`%d)r%`|dQhd(XTkDqCC((YYyj&Be4(OXT%+x>M--D_s!A|=N_?oIxCEj2Z@ zd){Y?ic!?ml!sR3W2AVJ)@S!0bnu2s&AC*2A9x38=Y9NmIhdK|$T+^c)Beln-ilV8 zaR~{PFINWGS-ensdP|uJ7j*{f?=I@ATUuITVq#d%`eeM%Y)p1~J8XqdXfb#X^n{a$ zA3P;Rkt6RHwZ#V^A1f=j9>A?|@Le(RFAwf%qhw|_HZ(j<-tbzGm^@NTv%6j@cm*c_ z4(5BfU*UTg$bvKS{(>qPdGqE?_xS|N3HOsV$Z)brJKV6&q~zJ6U%!6svNp1JKHUh# z$X__5rwxrp@6L85D@q@--eG6&DJRoU*xuQ3T^)M9+erH2g%g%t`vpQ;x-KK*-@?~A zLW&y%4V1S{=DsqLG_Q?TP!Tr8gkugG8uC@t)G(T_Q&g$@JLx%9j=7$#mQjQ^<>lqE zX}1@I8S)Lnr<;E_-xFmdU}-ihM%=o!A*L=VD(ZHyZX~Mpl#U1xje@hY&?R0O57asf z474sAsa|~|5RObII6RdP!=W_OGoXw39aq?1qF>-F?wz%P9Q2*y2y7s;-Ake=)0ZaU zy9cFtc+CY7M{ir#x3Xu*M^k@MPbei+mxwMN~q_dKEtEjzsc&7kBa_^qX?WT4R!SOKYz}q($rMTh7TwZ1Q!<< zZxt8cXllZ|eMRo==-Qf7FtQNUk%#tT?w)r3Ew9-8``5epxMHk#rNYv;du0Szb-3T% zxl_}Ff@B)``gM3%v`W^JfB1LfXV0QSk76%0fH#Pr;*ZZT6zdy9rT-Q%i zH=t;D;(6)l8#3ltMk-g?YQ-_;UQxm|E zb=j*cIM0iV;osA&EPufzHO1ynhJ5kumRbnRREIKs$f!@An7t+>JoNIBRZUDxTwYs= zZJ+DYooxE8LP7CO@D8@wAE`2){0S*9H&ZKuDk+qX94nDEiH=O;n)Ezc@XPTju z_L?IF;^S30Lted#X`Q`?PeKrk{J^D~Doe%!pW$M3t0dHVXZnclh4A|smgx@v z?urUIAGVNFhnIcY_{cZ7gHPi2cev3&JAW^^F(iUB7V_#QQ*7%e4Q__K{9E-r9#~{F#!1F=J0{$f%M+H0~d_%%bU^c z*REaTOnv(AgX;YIkr5|dQV%03DK52?($O_(B(<%ugdp3$IU19oCo!$&$9o$-mSy?{ z?HgYpJ+_)}Px`FcOh10?_(goXR}pRrXKbq?19iBTkyhE`GY?VDy}bh#DW9=v$HPsg z@TS*fg!RXN9ysRxhM70HSa-DuZ)*OF!EJdU0{Af_lz@QqI)T&bOcZ{|E3b?7As%ga zJ-xNx5ss?#^vu#;v!U&C+tDpu7A3e|=O*>rgddkng_G7q>Mv@0O^bLoBnX55xm4Gm z>-bXLpuQ*2>ig*YDD`6aWO3~Dv@9f}B}9oM=BJ7P0Frv&nTX=8Eli1ywzNo%c_VJQK|;M$5#<$Gf^R0v7Ew{kI~Q~zhlnIyIDMfJFSMRiI3gC7gw z@gvV}p!DhINgr0?d~kQx`D&z@-|wSVAtV=kI6HHH{=9i7_oyu{I5?O}sxPr~zFRH% zXE#T!vF~&^zxKOT>vG)*F)vz~STY>3ei8LWscN*DZe*1hIma8O%~L=aCNh_ z;SMbkeZfHScG5?+?B=PG(6%`z=t{NT{iY6+-y1Ez!F6N$alcAgB0=u3xki5f?c(A- zO-+SB|7#Q!R7`foy68K12m<7re+kqZ^4gT?0`!Z(!wzf+4U2f{8P^ue#9#V zdU|T+E_1=TYu5+@7E4FAif=;!W1zv;w=UD)Tm90vL^SQx^yrZ(;(m4?Z%21{lUam9 zrjg<7*3lz>W9~r_fuh&0Vn&5WaQj#dXibatq0T-(Ua+t5q|(F%fKs{ExM7lir*+PS zpND6vBBwEeHUGn-V!YH1TNeqR;`M%`8zKQbe0+Qr?my3L;_6CzgicB=bNV&d_lXV(H)2frHjT9?u3>HV3VZE9+I zKR>^en@bQ4?Z(r&+3(})O2tFwf=1O|l@H;$(UsJ`YHF0G&Apn zV)Au#AMEYF&deo z)?7A6%!)-BNjPJbvosoPsKf84qdF`~pp4d8lnk2-($&m6igHl2nhRDM@@Y(r9-$Hf&#RBxC>j$;%;m#}<151uM{nlhcg7gu< zi*a0|C&Jq;Q_F@NYRU&cGQQrWkI*l`+v%IS`yn7XHB~3S|CV>1$;lfZyx1^4p;&b_ zm(mJ$0;HvYtN(LfS49eDClQ>n7X>gN>R?0trwBsh}O!}?} zUi>ukSA&tIhmi!Dt@q#P$-OD42=`_>cq;z$b#2F%PUbCzabCO&*vYl4}39^H?pOTTaAR_eD^L>qOh*2hCLIt`$V3 zD(9zEVMKK|Q1cKYC#MPX`i-~^n-?1vtF>+sK(SLsBGVoonoQG5Y38B{0zQ4p3U;i# z5aDpDZmgLUP5(gu?~Qmb znW&GV)@4#xBXNl9qyyyj=PabY+i#UDFLf)nx#qjbk{w4jnEv|xYs$3CI%wuQf{hJJ z?(NOWkH~aLJ<|66u*4Ki#3l z@@Kt$^O>!={6OCmA$r`$kC%t_0vk|ekMBAD%lnq`Z#(YRIsXzqkffu`zKq#eNRPnj zzHVuQr2tyO;BS0)%WA$5kwQH=+AZmxr=iw92IjQPcf;6=2U+FmvF_qhxQo0^`=(jg z;dgFi!LY6Lek<24qfiCTSWQihJOpA>0HAklw%TK^H)oWwtzPz%((u*e;}eInicy_K z3Gw8*ta9pX4_ClAP*@9`?HChO->Y!kWe}cvOp$XqM4K)B)j$WOYKa$= z=T^GkuN6q@oVZvmIZW8?k2m&Mt3S7a_hMU5+jhEVN>wT3$ex*Hm|0s}dyHIEpmP77 zju{%}lRES-b&1?9u%dX^V9NNb1i3$G>^`?}vF~teIarTppyBM~+P|6Sg35^>L~~Kx zl!OK!=Lq<=`oC1;wECGx5qDE*`@l- z#Mrxk$yI|cyy-Z5!RO$dg<)q<8oY@igP2jwQ_h^ zeQhElU-=fr`j*ftbFR6dd+VUC|1Ymqa{7o@n*Q(0sN&ntMs9sQe1MBLW8iyna0uh+ zG&$4C@%3zpQTlY|d4SCMV))2-{le$L(z9o7frMi(eGkgM0;q%8gudvS!{t)Wk2jeQ zes$azBhR+xy?m2E^D6X+aX!tou~`~5a=2q#q?5u5R2 z4*&a#$G=l?V_h-fFJUehZsQA1Si^FU2vjF{bmyK|w*Y3v+v< zBmup%F?O^>3f3xZlip`5j+_&~@g29RbpFdw$kemv#~=*;`MBh=X*g`MmVEc|9VIh0 z=ZPS{vvRLhX+e|}9wu7WR=7H+$kEZN#lC`n0iq`5kvb6?LOP1ud4IdYeMvP5A4>uxKjL{P{cNH^WLOmW-cFI zYkxW`xah2m{8>@IMJ!r(kL**%mkx8`{Ql)RRjlq6xXUqsugncib1 zRNYBUPF|c|CC*x15)~08VpJt0CH2r!02rWgd&^>7=s3)Z-^IVT_dI=mc&Wh5aH%;T z>;^fC+T+|#=;YyyRpkUqp!Dxw2ocQTq-ESdS-u)J{0*I*w9&-_|uQ@#-ol-~U{ac&VX=Uyprg@xn>t z&$X8?MYYWL3-Wn+3o0B83bYA>&C2vaDN0tW7+r(u)tZ~bRKA8%eF)h8Q6b9Id%>mp zA*bf^=UedA&C70RMqQ?Mw6}ry%5(P6VYA0QOKBbQ-_ZIMb_TRx#vkf@daC#GxFcaj z!~t1h$=h_5_-tRK&i{bKqP=y_iI<0m+tR{93qcr6!9+#HMAfv%&sZ`4ZFDU;Ir;wm z`wE$l#O~a=D`i(P97ImuYgSCK9=WRf($)0=2L(yUodUGltvK=I$i`{EtGF*_Zhrw` zOCeKPO>MwRsP7H{`4UP&F-~!D6&{kynbz1WpPMQ{S5RgPb1)vT`C#twf$BeLUE!kgGA2{V8FleK#ix;I{`0buBEcsL^o z7o0IHk|cEF^zXMX-}DPoMT95nUf@?L+ps^9|CM4?ja4RUYHwdyR#sMCE=+4Nvg&e@ za0e#J;*-WRJ3G6#9A}et-qp3W$?bE(LP9u%)69uUNfO@2rJWY}g@wi;7v=Q_lo&vM zvxdnNQpCzyx~`9jW%tq1&>RdsiNamhBZG#|dHHW{Q`3Fnr174fAI+8}QE_=$Sy>eo zG;(i=8H90?Hq4$pVeviPGTltR(4ULBhm;l)5jg;s)}UYjNLyePfBYlFr8?9^#DT6Q zHszj!fu4H#c8buC@K>!e$DjGmq%4hR7;AEJxaUL^hUv*nhj;k+>|yTxy^sIzn`wml zlTwb~^~Ea!dh+hxxzl$z_lK}#_zQ{~hMHziK#KAwjKK@M4llp&KLZHABr~$G#4B+S zd6jGID(a#zBch_N;$Zpv<{H}Yk)kjks;N1NGL{lBc)2^fq**P%J%m@9Jr^9v)5q49 z=kh?^q3}iA>br>e);d-QCbZv=0I{3l96GNHFWnQ zBgYSGXwKc$MV3B-6LtAE%JlghF(Qq1cRVooR)CfbCkA3;4Cr%M z2eC0RrvI$P;Dm%a4+03eQQ!3`(6X2f{V{34L$XB^tjaOIg%RC0L-H^B4DNxK7-{_Gkd;utUp&#vZ!n11 z3(-g9C~sa~jc}5Yfq{giB++?LRQ?S)EfW(NVPU-Yx^lna)Fa=XJ}@>;K_fa_T4?F% zVb0!GOKx=WNlAe$Q9w>ke&fcCzP>)ZKup2H_c;CMXD2|;y>N2+WwzDRL*``&CnxZx zp`dV@`hh8(YGP=(>Qo8qlbQ1J(y)2OGDgbnlH}RsB+LREFz|KSBXVAchwp4}&pNrw zI+o3bB7}rWGcwpf0JO3qVDt~mpHo1y+T?%zN_u%dssz=E(r1018?~+rT~KH>w6%eQ zGIeo(@G6QKmgK;|z=L=`NSP4~B3&IFi+dhcm&2!kk{nleaegA0@FgdQ`^JqdI38zV zjU3g-I)i$j+FmP3_w7#_xntj-vqvZ-B_?{XI#SiVm*Upv+if-#$jB^q|90?yy#SdN zj|ZLwl!nJqcN<501)YmBs`>g}bR|p3oq4AD`}?=Y^Uow-tukEX=j2q#(gmd}oGi!}kb;M8C#qfftA4l7If0fE5gGZ7C6@rQa!5_ zLj*R+X7@o_YBD?8Y$UBTw7-8JcZ7Lk^jWJ|-qdb#uNBS%?>LpY)>tmMbwBt*fl3>z zeDVEwUHbl;{PhRz{)E4j)joXWZNiELYPPE`Gzuk#f&(D{XhMmnP-rOz0oQj6?IJv}IQ_oJa9 z+93(XL9X37aS0qbY8skb2n0|KFU7}KS0OH*mJGuJbIaD}!ACeEKp2pcs;#IPoO5cO z+Xg8`!gbwm61OmLZ!YF$K%Z+#NeQ&bw!)rHPJhe=p(4L|^9Jw- z?dX`8Z}Ycd0s72$B+TKBdDKoUIol5vHP~0=qw~Ie`4SwAo27B3%UXz@Gq!U6?p-*P zm7AL=KR-VNn48;&2GdVjS>v^yG#|eW+d`#UT3WKPp#Vyt(8z!UjS1>j8dhd4qyx|? zpcmZQ+5&q9*>g-w8XB5hv^5(2cO@QLxTb@%JFe~(>5>)xa!6i-&m?EP!9UfyIX(AM5QY`d>NjO~1|K0aFEaMDLH zg}8C!Da7L%3tZA5W9p)yoiBa6If#{_aVk%RlN!j2bw8%2*1tO3mC8Wg6%qmw4AkY+ z)Kr<MT<0SGCnWR)xz zS69!9>|U$1k9;2HU`NQcG0O04?JBIRJBR3dpjHM*W7QUAX7&$CMZ>F)nsR?03Tc#8t(4y&~*9w)*nRiq3XiJ!$G5eE}p#5m5hyv z{RMgN-b-<&W6QTX-v|_Zq`9&7dWzJCK>`p?DgeF3!@~o{4gat!*mXBCN2Z7on|F#v z*W&q%RMgcc%WP;oB%$=qJfoq{`Jie6=hD>d8yg!-k@DoAxFVYJ@#CsgN+34kZTCR` z<*V#j-{)`N1RdXYT5xf3dDbwI$IqtXLEfm9A>b?cZA$J}M&rWydzwBOpl z#1AzoC7Z^k`?7xfcbqC`eooHY_BmF$w9-;aiCRodwCS@!z$1r;htrKAVvK4=MqqNm z@=wdlLr6+8+TjtSO@BQr8HO~)XH?~UcD%=HQ0`~`DKU{g%7>0V2ckN*m64Wqadq`{ zw@)1sjsFcgIy%VIL+^WJgIPnBfKZ_aS+LRgeNmABsYnA(e@tbxBy)G*H37LYL*slD z_pkN)Sj6b5On#F(NqE632psm}@T+?wK+D9$1l6dzT0%(3xjRKFjWfMsBY*|{%d4NB zKokH8k-R1VI|KspZ)Qg3Y_~5uI=ZlsuQWUe8)2$pY;0_4ncY4Igig+vFCSAYvD=vj5O!3=zk4@iD-1|fJAc^L#mC1-U0q#KF$9?|n*gVwpax*8ct0@NO$^1i-n+>>IABt0?&I9L>6LU-GYTgdZ93(pMWL;)>5%9Pn=4!8kaB^p>)mG;_F!|B^y5kv$zMcZ9A#H=}f-@bhVcidm=y~-C0J%RpvObM!d z+}xp2Q8J$UJjdMo82+zYunnK2C-^&yGd;A73JcR~WH3`k-Itf=Ng&fQG-PC87#$dR z^?NwY-&!p8XJcc-;xeQdtGX+Us4F;Ffelm19ly;5^Yii+ojo2rxGFwMgpY=ZJv%$| zc`xYSHw<+ZkgtryQ>(PL?ruez2S?OGD5$$2?A>tKe)S43yU!gU@~+YkZ;;AeR)>1W z#@@Ivky7V`KJTZ$%4C#&HR!q@q1;=`RPTXlM>m}CMdvC*zKx9y#S@bc?0JBYpmTG! zTf%{KNN-77RMHEHu?q|bqYr)Eh@}EUVbrb`-SxEI|9>sH7 zBz<@97xnQyve~JIz`41(A$Ea#zLLyQ4W@3h#v3DLHc&N(EZ{xU>EsaQiOOh!Mn$%0 zNG9%MYH@LKQ1#%ia=?;AnUTAgV& zfhuTv4a#l(F@T??x_0fw-m=yz`V=_t93G63AE}v;s4r$?)g=*Jx&6!0(d5oOSKK2J zyu54MbM4?q97+d&RL9|=Xt^M6hgcruL(Ob8cMcx6Sp{Uuf@!fXeFRXHj~%iBG_A^F zZZlFvC_E|FrQtLDF`-5sj+-<{=o_iRO=(>1LQE9d+p9%(Z13SgpEP*v7x3DY%J|=w z8?0rUy(jyah++n}hmq}Km;YLwWQwIcDM41Z%J#c^@W%?(#MP`q3#g+^S3Nxr)nzh7jFt3a8v!+=Ta*Bw;y0R`naPeyub=bEMsZ`ssAA4W zZ7@5d$iEO;AE|vFs&Fvz@sW1hRE0uOeZTY~tJey^A5ECNjZIt>dH;J}17Z6yS_+Ck z!^3*o+F-#A^NE)Af8D*XFGnnJsvqblE=ve6?cOw_4JGyMx$(2q`WuhL%!KPj6y#%Bk|@ z%a;(cq&XYRSSa$9`~aPE+nwll@6fusEzl8|Zznm_g>`!3rC}vi6sE6NPJyQ+fR!T{ zDfVKX$R&*|2e;l_P)tNb<^vKQAa5ePna$}&T>;0+F-UxT@zt+5 z;Xnrs+vAOwB~31mYE7|e+EL}f1MmU&oE2l?BG8nCS!rodAxsAy@Nm$&_Z1YNuevKN zoPi>x%t3){Fgt5*yFk0yMhUoz$gC%y68>u{3qnP2KN=H;B4BLzzM|sJk=Lqx zcm-?VYh?QD{5%OU@#6~mEix|@Zu-V|Lwi`=;I?);iIFh}Y&LuSh@Lb82+0j{EobM_ zs0w^@c?e%liZHLCH~2Zwvw6SCfjR;XR8nm@yh|G3A?LN!ZXHCNWp|3vH{#hYd$>x| zlQ%$u9ZYySv{u~1i<4y?f(kY^W(ba7fZ*{Q`2U^#TS>`PLP9tu#2h%It2hRs2$PGg zG~5Vje13lF9;L=&`#>qXPsDEIT}sNjOLcrZmLFc;hYz%G1$FfF5>hWMLd9agn15bD zXR9S|=j`Fn4?&~S-qr>=HtMEpOBy6epdxJT?Oj9}p<#Vc-jG?sz`$ToSn@R+RGc|*zr4I^WLZPsyn%3)c`^US_^Sih95*(ag&VJ+Y50u|1qG6ll57MM{OYT! zt35qE!5??~_HF+NPDl;%Y}ccee&~T2t2v4#Dm=Wss|%pK{OA-;-u%1;scRYw4fo^` zhL*kkIzT{WF7I^9ROs@g z`kuQ3=4@#p7@;M}0nnT3wcR=}0QNAC#h!FPza^I4%wkTzrX4?uKF zcp1nv;B16HuAY+lq!9{F9;IZqwYGxA`QE*IX>N)D8T9oNHFD)gCBLMx{nnDZ?tlWr ze{Af%%-+x0*>psB!N}IOwv1jYfX+hnykcTUfT}j-f>~SOH>@vcIsjA3%gaM_K^NX? z4t3e?*|UVCq{f#_aUwagzPAMgpaz4_v2TfopC4aB)#B+>a8W;0RZXiEFh{KomvHg$ zd?_yO1?N&!RCZR@Qws|Kr$&`dxHgiiC>X?ewQCeGL4dl6h`>5IyRZOOUYM(lKm;V! z*w${Di<)u!diR~rFqKQr(0@^c%?=b8EIPA8^tHK4%K{kx^$RDw3Bk<`2^SWRJpbxF zB1mQagE5d->vYg)b93|E-AiiaO+-Zh-@iRprRnMEEiFpUhgf0>NN!3n#-}vT+!YZ4 zQUE#xzgtmf^lAQtw#RioXUFf}y#tRRK$CQouAZKlfB+c|z8v2W$16e^)QIVaEjpEuhu-kMZrn$v-KYBEXXk&>iG&MMIh7tm?xKAmS2J zQ%y`ve1UJTG^}&oFy6?=l-Z>rC*K0^ZbxTlS!wCt{(kp`?>|`{!Ck3~z4=LF34GD~ zMpdOBH<&#xk%epD0_mg_A@uB20!MgM(5^%G z=~B(qL^X1OmnVqJ{SfpAu>7J7ammm*S^$mUO1TTMun;(M!geEI{pE;l1+ODAeW=F0 z1d^V;y+W$MR3Ji3tTH|Qv6~w-y$5@HfFhcH{|<0_mWK2-<+5Rp5)l&`=~zA)gN99y_}NG~zy){N<*t^0#lv z{^lv-qva#AFj_=%_BSRc;cjPg(|Mt!&JUr^eUxzRY90kV3G!INEOZAoH8rp^=124B z6bEA(p6jRF}1&>R{G|5}^AKY!-u z=XH6g%RTrz$YDv0)%(hX$sYq{vaqmFX}GSbE(P%me$)PZonGhbE$n$1$M%)vaUmQ3 ziB@Z4V;^N%MV)2|68UzO{2?}fz8AS9Uxp4%Jv>0g2j@$rVdVV28v%U|aFf8pz;Su0 zuLd^2)+*~VkIIUB43A)ULUwj`V9-54phn!w*IUwMK<%8_3PPsCHlFHnD9jcmdRZE< zPw1);YiuhtfY71=6NNyiu#&xrjMOg}fNfyGNIA|}e#7r%IcGW05kT654P$`~v@9$Y z!?sX@RXM>}Cb7tm<+HevQWwZ_ytA3Ckh!$70y{|{Ye&t85{A<1H1x%==LO=Ec6E2d zf{#$xft^WoQou*_4oQ&-q3l2uV`KYiD-8P7>N(Z~ryR){Y*T^E4dE)ZMz&kRoP5_D z^@y9YXGU`GFI1Mb+16ONViEf>*%C4Uy-;0%!y9a4W(8*ZVO~y-5}*M0ZH}P|0l!wt z94$tYg#^o#gpVI!psm?9e7D;X=y&b^;mW3 zgydvi1fmKOteZ0#0S-P1<7E$iV)G%r9$*YC!#4A8kYtPc`E?5~eqQB=J%6i+SXem_ z*kyNHn;D_#0&@=u7hnba1icsD&}igB%LF?=UP3MHcT;`|&EchY1OE&b%aED1U+&l`PO7 z!SV4sf&o$<*#Cd}1p5V@f6-n6(oIgT0ltKW9bpLxSKd?m;cd#jRG-8(Z`hFXKHv^~ zJycKl3RIt3*Jn0XR-jYCUO-@4@k%owh#fo0x-s`SRkPTw7&o09@`DPYiL+A zH8qkT9%g0T;NXC;hn=Ue>F;>=nX?SdVH(!UzR}T9MFjt6y1w>5fByW(z!uJV9fSq~_H7{J z-VqlUe@$HR$4UrDzGx*F-;YF-l3`FnE{_EHv-GkUf+mxg1nN_k#?tI8M|ssgG(e!M zC3W)g^OIh=l8}<(QfUbB2F?&rdF~}m;~+M}%Z6=XCz@1-c0NdKMtnLj18DR+m8|8p zH6|7oe5w@F$Q*9U*C=irZdesx8%!am0owu@qNTO^$q5s`|r zvX|D@gmy%j=v&)NLa6k*SS1c1<-pDjXCw)^SD@{A5{W_8fKUQ5i1~YBLIS3z2S|V* zQNe5qCXDs>2ixBc(Oe`2ZfWO7T$7pd!-s1SWb5mEK;{CI85$~j*{P2%)XdO2(@ zpvGZ#562+F)TNI;<>f8!uZYFDfFV zqdOY5Oa(%-t4l3G6^~Hs2jioo4GF8XpU3uqY5*9$j*1#w*#lkcV4n#S!J1)@%K?nQ zWlgn8$A?KoasLRoo}lV7*G5GjAuKLV*!7PX!TLWN#llW6JFw+2VW35S9Sk%#TRry# zTUHKe-4YTEXC-B2KnDnOa=vOXh5iQXosn!e^6D9ov%$#d_wOyr^nu3r_C5o*2Sk^N z+cYlpHug3+cXnx5SU_aMETjsP_kbN#KYoY7u+1$jI6n~M@}~R0?z8}dCfI0TH*cB# z%)fs>NXiZQ4uHE<%f99<5I}dl)8`7MP#3l#?L!m@CU~unRYKQZRVDsqg8-Edeb46X z?JB@&un!eDD}ba_j1PG6cZa>a)wrG=jfEb?vRc3s?VBBHFy)cyIB|+89^IpYs1ny0^S;~IgliN znkK6@dxN$6(PM9*-Cn$S!9)VPK-yYbM19Xs*$onYRuE{*QBms%C-L6A36^C4E3~X1 z(vULb;kSTXrKZN?O86O4^c?~kI5is^o5uaYwdl+gjSc*3$liC>2m%a@ zEBu$w1?cUC0EZNZLp;T$344j6m43}^!S!-+a)P1_JwU(p9we^ms2mjBdMHZiC;;X? zpo~yZu#pjf?i4gn*3f-ioxK4EF!ingAqi0E<(_!%*Uj4=o0v(JJj78hE-rd{!u073Y2yp95XX>emzIj@yF*<(PftAs=b0JD~wdP(M2e~|SjH17}G z{Rd6T?sa~@G^}XzBAYjce9ac8_=IRvKI&EaYb-2LwRxC0{cs-E9IwMjjQ$vC2xwuk z``y|sxx$m3I$zdS{+dlJmpgaT05?>RlNdK*YRSw0Y6!${SOFEF z?#q{s8D5eQ>~mojtCTepEPXb0qn)Y!-LI<*mf-@ zivSz}4!H$_a>2*JF*{WJ#J<9SmF%q&$7*?zZiC^b0Se{!{=GWT%yd({R%s)ZFSr6& zfr!7Hcrm7l9a-5P*)rIk34CQ{?;$iG+ecn3b%A(!kV*lXL82WQ85te*RG+jPDGkHu zcY@Hxd=Ew@1j@fxs|fntw~*}!(m(@;2Lk}f4?GiaInFLX;M)o_j8e>pB7}vhy+A$& zH-M}q(Boi)keVR5h6c_I5HvJV1OedE#mEC7KoJ(?Eg^(b=7<4JLFQ~pod}Qp#*LSj%a$MHOZjuo| zRsc!^YCad4AS)8IOu5rF=dN8p_lff2dzGf&*AjxsiY(0M4hMZ{UF6FQu^B;P?!z*uU`|!sr3K( z1K>lBE*f^&gNj-DPQWJ(tG1|_JiosR{7BGzjf{v(N_wpf@D}Tyj=kviZyLFry9XbV zjo>*TK0fEr^uykC+2|7h(BQTUlMg7U4ZzRwTVJXM7fkhdo$rN@V1lHybmV*ArYq|N#MgNAKkBbDjb zFH1|$vioxTmH?UenDyY~XaiXWYsuZ!9g6B|izAqS;O+zB0wo)aP#M#lhH|*G5w|G9 zIHHwc{jkNUKx6^w{Z3_Wb5r1$x<*36!4O0m%KyO5!NCCy6%{ajDjYGupCU1+-pbUq zL!a)lMqjl<5JVm)QV5TA0DbIoow7v>-nj!P5dea(uMB412{}9^ChB8NbqzF3K(m9e z3Vx*RS>=-9H}-RY;$)e>Lp6t)fkX$L;u-A9w=RQz^6i3H&2!v=J6{Yc)ztC3LKt%;O>1ZVmppHSR!%NBy_ze@lbvXg|-JRW`XoI9>D;y~P z(@KVb`0`{F1US$WDn>FsuO0_Zmi5{;TmT{t0vztL={pQMw5-oD$vh*B>W#t^XfTSO zH1B%UwwklazPw=Lqf1vrr+LJp5xBlC&dyL|ZLwR@u#mSLVDsqAZ({n0c}$GMWTu=N z+z!|Y0Bi_F7|tjLcmj&zD&FrhnWHctA7}z-uFx-79LJUSTlSHElTRR31%n6+3j>V= z^t1x)l409QLlQMy9JK7>VjDca!m1R~qF=Ts?4W+T3i${~j*n_wg$!KB?5m4yjjouO zRBxN{UIHDlXwD3?PFYO-p(hi(d%%wd*>_RsqSEP^nCz^rw{@MVhPu?g4yKB~BpfG# z`iX>1_?L8{kv^F$Dm|us4%D2X!n;#-o&^70+A`XZQ<~d?H~xFpPy-*_ z(aR?baSz=udVTq*Ap+d$|M#)~&j%3|UXY5B`WyE3VK>0@l`xd=tH~E4O#}W9NmvH! literal 0 HcmV?d00001 diff --git a/inventories/database.yaml b/inventories/database.yaml index 05d123f31..b179a30cf 100644 --- a/inventories/database.yaml +++ b/inventories/database.yaml @@ -11,6 +11,7 @@ images: stages: - name: database-build-context task_type: docker_build + tags: ["final_dockerfile"] dockerfile: Dockerfile.builder output: - registry: $(inputs.params.registry)/mongodb-kubernetes-database-context @@ -19,7 +20,7 @@ images: - name: init-appdb-template-ubi task_type: dockerfile_template distro: ubi - tags: ["ubi"] + tags: ["ubi", "final_dockerfile"] inputs: - version output: @@ -28,12 +29,11 @@ images: - name: database-build-ubi task_type: docker_build dockerfile: $(stages['init-appdb-template-ubi'].outputs[0].dockerfile) - tags: ["ubi"] + tags: ["ubi", "final_dockerfile"] buildargs: imagebase: $(inputs.params.registry)/mongodb-kubernetes-database-context:$(inputs.params.version_id) output: - - registry: $(inputs.params.registry)/mongodb-kubernetes-database - tag: $(inputs.params.version_id) + - dockerfile: $(functions.tempfile) - name: master-latest task_type: tag_image diff --git a/inventories/init_appdb.yaml b/inventories/init_appdb.yaml index 50d5d4199..228968135 100644 --- a/inventories/init_appdb.yaml +++ b/inventories/init_appdb.yaml @@ -6,13 +6,14 @@ images: - name: init-appdb vars: context: . - template_context: docker/mongodb-kubernetes-init-database + template_context: docker/mongodb-kubernetes-init-appdb platform: linux/amd64 stages: - name: init-appdb-build-context task_type: docker_build - dockerfile: docker/mongodb-kubernetes-init-database/Dockerfile.builder + tags: ["final_dockerfile"] + dockerfile: docker/mongodb-kubernetes-init-appdb/Dockerfile.builder buildargs: mongodb_tools_url_ubi: $(inputs.params.mongodb_tools_url_ubi) output: @@ -22,7 +23,7 @@ images: - name: init-appdb-template-ubi task_type: dockerfile_template template_file_extension: ubi_minimal - tags: ["ubi"] + tags: ["final_dockerfile"] inputs: - is_appdb output: diff --git a/inventories/init_database.yaml b/inventories/init_database.yaml index 57ab81679..15901536c 100644 --- a/inventories/init_database.yaml +++ b/inventories/init_database.yaml @@ -12,6 +12,7 @@ images: stages: - name: init-database-build-context task_type: docker_build + tags: ["final_dockerfile"] dockerfile: docker/mongodb-kubernetes-init-database/Dockerfile.builder buildargs: mongodb_tools_url_ubi: $(inputs.params.mongodb_tools_url_ubi) @@ -24,7 +25,7 @@ images: - name: init-database-template-ubi task_type: dockerfile_template template_file_extension: ubi_minimal - tags: ["ubi"] + tags: ["ubi", "final_dockerfile"] inputs: - is_appdb output: diff --git a/inventories/init_om.yaml b/inventories/init_om.yaml index f3d310470..c05d34c3c 100644 --- a/inventories/init_om.yaml +++ b/inventories/init_om.yaml @@ -11,6 +11,7 @@ images: stages: - name: init-ops-manager-build-context task_type: docker_build + tags: ["final_dockerfile"] dockerfile: Dockerfile.builder output: - registry: $(inputs.params.registry)/mongodb-kubernetes-init-ops-manager-context @@ -19,7 +20,7 @@ images: - name: init-ops-manager-template-ubi task_type: dockerfile_template template_file_extension: ubi_minimal - tags: ["ubi"] + tags: ["ubi", "final_dockerfile"] inputs: - version output: diff --git a/inventories/om.yaml b/inventories/om.yaml index e4daf3103..d9b802376 100644 --- a/inventories/om.yaml +++ b/inventories/om.yaml @@ -13,6 +13,7 @@ images: stages: - name: ops-manager-context task_type: docker_build + tags: ["final_dockerfile"] dockerfile: docker/mongodb-enterprise-ops-manager/Dockerfile.builder output: - registry: $(inputs.params.registry)/ops-manager-context @@ -21,7 +22,7 @@ images: - name: ops-manager-template-ubi task_type: dockerfile_template template_file_extension: ubi - tags: ["ubi"] + tags: ["ubi", "final_dockerfile"] inputs: - om_download_url - version diff --git a/inventory.yaml b/inventory.yaml index 23690c328..ba92a1504 100644 --- a/inventory.yaml +++ b/inventory.yaml @@ -44,6 +44,7 @@ images: - name: operator-template-ubi task_type: dockerfile_template + tags: ["final_dockerfile"] distro: ubi inputs: - version diff --git a/lib/sonar/sonar.py b/lib/sonar/sonar.py old mode 100644 new mode 100755 diff --git a/lib/sonar/test/test_final_dockerfiles.py b/lib/sonar/test/test_final_dockerfiles.py new file mode 100644 index 000000000..f4516baea --- /dev/null +++ b/lib/sonar/test/test_final_dockerfiles.py @@ -0,0 +1,101 @@ +from unittest import skip + +from ..sonar import process_image + + +@skip("This test case is only used to generate the final Dockerfile for ops-manager") +def test_build_om_dockerfile(): + process_image( + image_name="ops-manager", + skip_tags=["release"], + include_tags=["final_dockerfile"], + build_args={ + "registry": "localhost:5000", + "version": "8.0.7", + "om_download_url": "https://downloads.mongodb.com/on-prem-mms/tar/mongodb-mms-8.0.7.500.20250505T1426Z.tar.gz", + }, + build_options={}, + inventory="inventories/om.yaml", + ) + + +@skip("This test case is only used to generate the final Dockerfile for database") +def test_build_database_dockerfile(): + process_image( + image_name="database", + skip_tags=["release"], + include_tags=["final_dockerfile"], + build_args={ + "registry": "localhost:5000", + "version": "1.1.0", + }, + build_options={}, + inventory="inventories/database.yaml", + ) + + +@skip("This test case is only used to generate the final Dockerfile for init appdb") +def test_build_init_appdb_dockerfile(): + process_image( + image_name="init-appdb", + skip_tags=["release"], + include_tags=["final_dockerfile"], + build_args={ + "registry": "localhost:5000", + "version": "1.1.0", + "is_appdb": True, + "mongodb_tools_url_ubi": "https://downloads.mongodb.org/tools/db/mongodb-database-tools-rhel93-x86_64-100.12.0.tgz", + }, + build_options={}, + inventory="inventories/init_appdb.yaml", + ) + + +@skip("This test case is only used to generate the final Dockerfile for init database") +def test_build_init_database_dockerfile(): + process_image( + image_name="init-database", + skip_tags=["release"], + include_tags=["final_dockerfile"], + build_args={ + "registry": "localhost:5000", + "version": "1.1.0", + "is_appdb": False, + "mongodb_tools_url_ubi": "https://downloads.mongodb.org/tools/db/mongodb-database-tools-rhel93-x86_64-100.12.0.tgz", + }, + build_options={}, + inventory="inventories/init_database.yaml", + ) + + +@skip("This test case is only used to generate the final Dockerfile for init ops manager") +def test_build_init_ops_manager_dockerfile(): + process_image( + image_name="init-ops-manager", + skip_tags=["release"], + include_tags=["final_dockerfile"], + build_args={ + "registry": "localhost:5000", + "version": "1.1.0", + }, + build_options={}, + inventory="inventories/init_om.yaml", + ) + + +def test_build_operator_dockerfile(): + process_image( + image_name="mongodb-kubernetes", + skip_tags=["release"], + include_tags=["final_dockerfile"], + build_args={ + "version": "1.1.0", + "registry": "localhost:5000", + "release_version": "1.1.0", + "log_automation_config_diff": "false", + "use_race": "false", + "debug": False, + }, + build_options={}, + inventory="inventory.yaml", + ) From c15bd7cbe610988c041b6dda9188856604aeaf90 Mon Sep 17 00:00:00 2001 From: Julien Benhaim Date: Wed, 23 Jul 2025 10:48:00 +0200 Subject: [PATCH 2/8] Remove local documentation --- ideal_release_flow.md | 66 ---------------------- ideal_release_flow.mmd | 28 --------- ideal_release_flow.png | Bin 14467 -> 0 bytes ideal_release_flow_backport.mmd | 37 ------------ ideal_release_flow_backport.png | Bin 28617 -> 0 bytes ideal_release_flow_versioning_complex.mmd | 27 --------- ideal_release_flow_versioning_complex.png | Bin 22061 -> 0 bytes ideal_release_flow_versioning_easy.mmd | 26 --------- ideal_release_flow_versioning_easy.png | Bin 18829 -> 0 bytes 9 files changed, 184 deletions(-) delete mode 100644 ideal_release_flow.md delete mode 100644 ideal_release_flow.mmd delete mode 100644 ideal_release_flow.png delete mode 100644 ideal_release_flow_backport.mmd delete mode 100644 ideal_release_flow_backport.png delete mode 100644 ideal_release_flow_versioning_complex.mmd delete mode 100644 ideal_release_flow_versioning_complex.png delete mode 100644 ideal_release_flow_versioning_easy.mmd delete mode 100644 ideal_release_flow_versioning_easy.png diff --git a/ideal_release_flow.md b/ideal_release_flow.md deleted file mode 100644 index 6ce43a0fb..000000000 --- a/ideal_release_flow.md +++ /dev/null @@ -1,66 +0,0 @@ -## Release from master - -```mermaid -%%{ - init: { - 'logLevel': 'debug', - 'theme': 'dark', - 'gitGraph': { - 'showBranches': true, - 'mainBranchName': 'master', - 'parallelCommits': 'true' - } - } -}%% -gitGraph - checkout master - commit id: "A1" tag:"v1.0.0" - commit id: "A2" - commit id: "A3" tag:"v1.1.0" - commit id: "A4" tag:"v1.2.0" - commit id: "A5" - commit id: "A6" - commit id: "A7" tag:"v2.0.0" - commit id: "A8" - commit id: "A9" tag:"v2.1.0" - commit id: "A10" - commit id: "A11" tag: "v3.0.0" -``` - -## Patching previous versions - -```mermaid -%%{ - init: { - 'logLevel': 'debug', - 'theme': 'dark', - 'gitGraph': { - 'showBranches': true, - 'mainBranchName': 'master', - 'parallelCommits': 'true' - } - } -}%% -gitGraph - checkout master - commit id: "A1" tag: "v1.0.0" - commit id: "A2" - commit id: "A3" tag: "v1.1.0" - commit id: "A4" tag: "v1.2.0" - branch release-1.x - commit id: "B1" tag: "v1.2.1" - commit id: "B2" - commit id: "B3" tag: "v1.2.2" - checkout master - commit id: "A5" - commit id: "A6" - commit id: "A7" tag:"v2.0.0" - commit id: "A8" - commit id: "A9" tag:"v2.1.0" - branch release-2.x - commit id: "C1" tag: "v2.1.1" - commit id: "C2" tag: "v2.1.2" - checkout master - commit id: "A10" - commit id: "A11" tag: "v3.0.0" -``` diff --git a/ideal_release_flow.mmd b/ideal_release_flow.mmd deleted file mode 100644 index c883bac17..000000000 --- a/ideal_release_flow.mmd +++ /dev/null @@ -1,28 +0,0 @@ -%%{ - init: { - 'theme': 'dark', - 'logLevel': 'debug', - 'gitGraph': { - 'showBranches': true, - 'mainBranchName': 'master', - 'parallelCommits': true - }, - 'themeVariables': { - 'commitLabelColor': '#ffffff', - 'commitLabelBackground': '#333333' - } - } -}%% -gitGraph - checkout master - commit id: "A1" tag:"v1.0.0" - commit id: "A2" - commit id: "A3" tag:"v1.1.0" - commit id: "A4" tag:"v1.2.0" - commit id: "A5" - commit id: "A6" - commit id: "A7" tag:"v2.0.0" - commit id: "A8" - commit id: "A9" tag:"v2.1.0" - commit id: "A10" - commit id: "A11" tag: "v3.0.0" diff --git a/ideal_release_flow.png b/ideal_release_flow.png deleted file mode 100644 index 55deaaf5288516a802f85e5ff91f8610a2f20274..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14467 zcma)jWmHse^zP7zlysL!mw?33-6;anT~gAGfG{F0CEX=b0@B?L3ew$;bPfDpfA_9+ z*Zp+w`M}KLoH?=I9nXIDbHdeC<*+cwFdz^JmV&&rCIo_*0lurDBZ9vSOS=}}1Hn~O zP7+c+O0f%p&_EQVCA7TK4>PV9Kj z*yFwk-}8hYHumo|4t?9#(a=hI^Ow~n93ACZkme{NyMryWh^-I($W)C={Fdm}RUg|K zWjt>_Esw&iH#~7vc*O5?_{?u8iz&XjIX+^_Gn&qQ}hij4dmqfdA8{Pw3d#y(@3I>dSoxcXn*l)W-URJT;jKFsb-` zFAoZol7GzFV`gsZZ@75J$k)7^=72_pb*!_nuxyQG9WS+g9oYigw{I+=l0iWV1{`&{ zxw+ZdkPvG)I-k=L#j|It3Q8}>ZES5DoL4)`^y|31h~ftf>KqN< zzki83cFIl^Q2@4Y-xL|*O-}^)(hT3e4X@&FcVB$&xZJw<>(}Yy!wK4OCJ8Zh%xtw^ z=%S-jqxad|ROxZ+6_piE2ESA09WpRDUEEHT!@M-zGd_lq{^9S%#qC>faroBP*Xx{? zm+nUR`(mj34sz1?oq7-6wwhU3NYmrBJU-mj>QtDWbyrqa*1nrIJ7c2;29~Cq$XfQR zE-ihU##or2ucfUGc6?UO5@QD*L_3D+Pod+HAR#@0r?pT7mS zx9Qv2bU{}?>mPwO4et9JF=C>PRwE)ZBHY|AJ*S%*8XEX7oZmiBM@Aw_ROVFuJz4FF zaa!f{ znYq3+e%v$lA&RK=oi6V!EIbT+Z0agIuc^TiyIzT@Xfx6QCl;NJ{4!wS@9!T7pI;WH zPVzgSkPEyxsK!Z5e$MGQQ@J{8ok>bb2|v~`_WxUutf#NPs_$sTItn-8B}+?9jiwax zSXq%!`$aA2H{)3Mx_C0^;lVo7pU8W^cG^h4(W|P%#OwV~(q>{}|0`=P{`N{3%B;Z2g?De%VBC-YQm&fz`@BXlDC$Q>#Cm|=-*VA}^K2!B7M)Y%Y ztttF=FE#ZuA!~O?h?>X^y`303JGh^V{prWQ4|k5zi?n&UbkA|9p#+qahv_cB1LTA} z)JwFs_2UPNZ*On&Ir{@jP1yqK`CFhofE`rjnBx2L^79SB*q z?fuuIc7GQMu>~^gSFWh(*J+mN**RU*ol99gYXDAq-5XU~Tl>3E1s@}ngZMns$=%2h>cqx}G$jZIN=v!9nmw|!On0J5KGlwynD=I2>6jnXLv1%;EcQy7(I=@jth zy7@VA+(<%nt{Z>RytcN-?!W8m6;d>~($dlbMK9Bo+XDXf1gG#IK(2@MonE|P__JJ( z01DiFv_tN&foar4<)1Sgd7&TX0l8`fo2ty8AwzSjK&0#VI?Zk|4UPDd98 zgCRi1?P}@qo_I&d77T8>Kp>dVjIOfwKD*j4^7N%spbCfq54>9P_v{M88XchER?M3) zXm#n?BwlKCS7M8+Z+>MeD_ExgbM_F9gamaOLe03&RE1U@O;r{-Zqy7#mXQTPO&$HG0cBNHk5=E)$&xpv+9O%~$62bPqe1oc z^@Kyof%WFFE_Yz3ZPB2onvRa;XNyia)P?Fy^GjY*1)379><_n>^FA#BV>-sP@mM%G z@dFn9H{4%`!@^Lnll024aj;Mz5HeG{4hts|vi6(xAA2C9>d4CW{%*VOxjEaGz@^6v zcXFK9*4Lk3UOryE65}F8@kU|^{gRTh>o-lCm%Y@lA9yn~SNksRcQ7bc+06*$`$r@o z>)svKaT+yWU(P!Fd zGPU>Fa>z^AD8RA2ORp=PA6q{OyQj`~fO5HS03qw*GTsuWo1+@r-$u6=6*(;M7|&(GaB0TC`)7@bnMs%3 zy-^&-tkD(Mpzybf`JCV7$>C5!H~gj@>x^4n3i9)j^)h(dYIuc&?qULO@zWtJd>Mv@ zH0Yv#uh)BIWK45%03PYAs4XdB27r=L=&pxdpO*}a?`6XH%5OC>k&EAIpagG$v^wfJ zKQ}*R=Wb`WSCr+C3TfXDynmjkxOlmhHg0G^>j~l5z)_ZkUsME^iF!J2k7lT-sEm42 za@#E}G+?44VW>$Ls4oztwV$Kbmp6Tor~e|KA4SfO2pON5JYS8bY!Rc53Tp8Bo2y;A z*x<_Ohk^`QIVv9FN#hrTPlB-c7aR=+0nU#PGcz-WO`gx4;P4Djy1d-W!$qOOiS!

ZP?@nUHpsB2!UJ&R@UV6wSCii|+gVwrNR14SmV2osx%n!0V9 z{gd&-Y4Vu;lJJYQky?Ov78);Z_bZy5hI}(MwU;F_`gJNw2gznYl zW$V=v0Bgpc=6E3;Tq(-ay{JQVu*YEAXM=F2PZe z;1uNB-}1=!80B|k{>pL@(`rHGpbu&$P9UcA`kbZQB$;-_(#|A{rU ztwP(`)zx6&*fE^KP(3?RkKqC@L*h%rdW#<`g2P`&b9#1mc6!Pc&2m5qY%EOWwAvYp z7cR}+@vTn5k^paL>~TmiZ*Xu>Q&V%t4SEVN{)S6KczF2VzkhWYbo0>4?p%MD*DBj{ zohDT)9PI4;`t>V3_h_XaCQbL(tGRw==F68aw~dYA3G@EpE?%DfVsTl9L?3`B46gr0 zG@dTeV#ykdiHR8-8EFBYJ7o3pBkaZO2>W)V85ap5Az^SyrEq4432>hL{QU0j?ucZL z28HnZ0c@TyN0+V^{!fvSY^eK^uof;+1V>s zkMQO3Pc|Q7)6$xJroQ>#T^1A--OUrF4?Lr$7PB5r#}U15Kh_UIN}rsZgi-nIlvcFr zRhk5~IXtoX@#6=;Yu+Z04+jVKf%C!8`ts$p$jC^U2qOPlYqeeEcTLVTE-o%q0oSYW zyUPZH_j|-M_8uCht66mpzNTUb63*R(lRw&{UZk7<>zeKaMB+~iFv;NEGH*NMn(pNJ6IN4T3Qm}xB(O8hO*q) zXjvJVmMZsm*4Eaz46PvJ&A^x5*qc?%IQikRG3)ACfRD75RTm0l2ROP? za|T8JjJUgdvckd^y7$q=(UB1&de+XoC+Y zV?@b@sMIpX$x~&zIr5UVIM1Ty#l5^?CSiyVH_9iA=m~Bqs%P{G3EJJWp)g*Rnc_)N zHsX!8X|8PkI$oEK6gPrU@kK~SwnmAcsF*g**TXja2utp_ z`f@O^GeI#0GfcY_Fae07ViHX0(dbp-FWvbaKfS=K()~_BMu&?Y_v~2}B7!juQ>x%^ zV}^@!uw7zfV#;rx#>V2dsP?V@MfMA@vt!|8=rz_hZ1Hdqr+cPEFPjGd>yNxV6vUtp zeM4hIXUPfxU!r!eJp>^%7*J8*nN{fmFq+jjG&Jy@v=Sc)6IIGzs_TQUuz-L(eO!&6 z111cg6}KA$ndhEgWYX=7;Q;F^CTfZ@(aDXUXyE9<>;t#LOJ29TONT0HZUF&+BYFS( z4KX=6HF5G9OEf;;-{M4_ zq3S6R{7IfZ?BhrElF1@|2bY;$7=keHf6;|msfBkw9BNA4nfDvjow$zfnc=U^W#{MTGzhk#36kfI7cYJEZ(5oljRyO=oo70gAj0Lrq@YHX(8I@zB=ZJl&l6%KJ?_u*S7$ z%F4Cc@{?i#H)*7?)9hN0bGj#mfLrnYDCL!_DM$<8U!l5(afkc+ciY6qxadb#e{Fd6 zv@A9%0&bL&Ef6r;@Cu1?IR0Lb zF*pA*YyWWlTdh{F%yvz~1{48$JY&Cyn_@tQeTNzv`XAo9UxlWt7LE1y>(;uw;9~&M zN}1&c{CS~Xg(Xq3Xu@djM^9IY_^@+J;3DW3E?2~t+Zow-c}3W%zCdNjkobY~7#z`9Rsud8ZOKK)chBSH zNif$lO3FpuZ_hh45{9_-Q7QdPptLf5(J zJt&Hd+#$8>uM@c5D>B^*{4>RXgOnmYE-vWj{K4V=e64TYgiUi1KUd0#`^5z_Gc!W1 zWtaO=tb9J&bL@;wBkTznW{KAH{=SHz`IBHNmZ_d_slw~ea2PfzCMpho+Q=3-JM4#y zxUZa?j%OV#s89lz;NlWW&ARJ~O(A*^Z~_URuvvIKtYgwgHfRYjWQh0H1^)JKF^Zgo zjZ94Mjr*7fDsqrG$@K1moYdJ9M%B#8=osIb(`sEdu?&&@p41YBm*2FF%gZkEGY|+} z5*6K-9Qp~eDj!!Q#)u`r4RkFB#(*1$k)NEM6=Zh$&@sycYrPvC@d`tdjkkU52w~Fa z6-2aoyzM`6w)SmmD?7;?yE;gjba@xi3>>1h-*_+G1`)jT^12S5uS~cK*De)#Z75O_Rs#IfZ;a|(84BqGDP~yc=BDWVC}~Q{3>&1uZF6vQPLK2F8rN54Z0K`Ck0wKwc<-v} z2+162S?O#7V<#^!-SsJ>4%^>_G9O`iCeKW`Q^K@Zj=4W~S*dxT<-wR>Va+p@()75x zY}z(9Ok@lI|Ep9!He5nFOt{H>W#~XVfQV4TqggS{YQY`S(T<5><|;7GANj6UN=hpI z>(_}@(^@@BGP1$VGyhcf_$^hn7*GBA3#g%!F*ODe{7#;iv#?;q>da#PB6IyBbFvD= zq`?Q6mv!Q-87STwsn=Jd^l6Ktx!QRIDagnY$I*q{X(LR8F2_8BR^*x`>U-2uFsP3y zAn9=goJ^|vk%q}X&=i9xJFBA#XyZRtEh0}CD6A|855%sb;@Q}E?sG1}v zs%w{94F%p2rF9`loOCw0ZZ(;+Ih2+0{HR{X$2;)2+dSLuJ1&edtB$Z9OHwEpuUp*R z157ABzEqBS0!B~N{`BfY2Rnp`gE{5pob@s35S-?fg4NWfny?%Bz#_oh?ByFSt1tYKSsJ8ps#H8u7h% zwB5FB+O}^=c>_cXwTmn*=vA}Ir))UVg%}g%XDG0P#J|R6U*a4P1Z{m|QUCmJMP4$EgvP7(E5k5Nd_SpCeZ_N?x<$!$j zQbpSOQ)EEzDKog5nL!{cr(Vd2rT__IV7*x~Oc>hyOZWVFB1TW8B1#VtSDNy0HVqR- z$4);wI3mj=)k406H%-|d8?9!3DlZQikyemD!Sx6l_zQ1si=~D#o!m>`(e3zp)C(p#fpa6wQ!`d>^qb)<1>?25s!u! zh`S?b2VvF;ij(k2_VQJu0mc1WCW6NM13{+D?ZV%? z;BG1bjW>T8 z^H%g3Q?v;Vb0P$y+(!NhjqJ?_pLvg_48?*%Yb%VkwR0$CO%_a^4mhH~hD?8rEubzH z=|5(LWOiI3;hb@8?L4#LAbI)_FPuE>b-eb7q%;|VIJZOtA;(&R8*zu?h3w?r5fj|) z10DbZk?%I+P7yBD_Vn~Xgk&cS-BeX=mzLt=;qPMhRw~L^b7lL#r@*$B&#`fEj5e!g zCQ#%}qkKkMk}y0+Y?`(7PqX%$m^0y8iek6WDPO0ekkfKuDdVr|36PKUoM!yAr1b(=*qw+9bR&Rm0%jJR~0PwSh z7nsl%mm8M^?2OkeiAANQjK0mU!le}zRArBw`|{qrF*?}K(=1W5pZV~Mtner^v#}A{ zMbGnDv0!U+!y>o(lmfW}fCNE`%8e(Wl^~&x2~#jyi7IcpyjCR+2@cl${kus>Xj79p zqoaRd?AYdAyh4G7{Ut9^X<02H1Om#Aiye!WO}*bkrQ!=J5?mb26O>>ZK3^--)kFO{ zdb27`4m1c29XH+-m(*1Vm#8TFi%lz~p?pNL@tyOFchkAnQ~!8L7n@Z65{R}EHYN*-!z zY+{^x7ZVvNeZf}D$Y+1O?9`f~1yO`%JX|-r2k|h4`ZNocPGLkfN(Jh%5izYqE;`of zm7Tbg>@0|HxHm02a+BG*H4>L2RC~GN2F|uFx;g;1Zp>k6Si*Z}tFu69o73pLl1Gs) zj{DcIKRM~-nk`l~09 z4~NIC``$J((5Rm`B}HC4m^JMNjV=X^g}qX?uwEQ>2Rre5(|zqRe9-Ak8~G;+4)`0# zZ{C^rrKYBdT%ZytzBgU{B@V45ydbl!!iPXeUjEYpP?}kAlQRFR^kl#bAI-%s$>?&Y z18ABX-kLIkZ{&Sri4nRMZuTs^yKlNoN`Ddo!jvJzFT^^8A1@ABdEa0Y0o~v>m*&fY0=1a zHCXK6@5_T78#W|J+`xvn>(=?@MauA2_?(Zr)b=i8mhy=mQV4N=VLn&NaBHjRd^bWV zshiJxjb~QoPB>mveoJNu70L3cA6?;iZVxrkf%7?A9755ZzPORNrw2W zfYSl#$=*gvc?DH4ej~cLY-H~vaFK0!$)Xf%XAenjZA-PwyO-z>udh9q138Hz1_(YIRn*PeOVhpl zG*B~pNWtg3yVgVEMw~9_`QZ0^B+V+K$F8IVoh z@WS(d?*bV|xHQQ9+NFtO>tzAgrbN()vIW=k>%a334nTTf&nH#Q0@xvWdQ>zNLP8=U zLIM*fO&!mxhO_OQ&=jARCG21zC{Qf|y-fGVkN=weOWQS$SsHYq4~7cGeqkBzOHiev4vN zO*&ZI`VfE%Spx%4Gqc>hTpQk0>M}A?%EUncY24i0cv)CJljCTzLGpT>VYAeCV+OyLl)dt z>aicjVpg5OHSTS`EIR72ByxwEnV7U&aR0sW!%iEC3jbTd4@Q~b2Q2Z-iG$Kw^K z;KI9;(l|lUuj2o@iUm&(Qa z+NBp8C9kLV_PF>5_>s}jbU2JNQ!VDHQxyDZkhqCT+E$+^=u+-iVbox#Ys;$#7~T(BTlzrP)8a!2`7k^@3@I7b zE4#e@3p65WRs<^9wry zDorCVba0$4hSag&k&6u{r7^-Ga^F!C&1$n4z(lZ89$v5e$f$aD zVS1XFn)v8V!6@%skaPW91w5tr5$p{11$G4rjnarNxMRH+UCK*dvbZSqZ1b|U__HOdT9MqsA>$F7zyZNzvS6#NhKH2_rBtPRPj~p=orB@hYO27Ce9CEe>Xjc3M(XOZ z85xUZivZs4&`)VR#9d&hej4xiOr17bgX`3^H z1)-v(1QNivIy#<*bG2)0W?p6}Jhs5uQc_aD6RdQEl$4ZMReO7RkswR3wFK$1iMnn@ zcH!-Q{`|QMhBG}iWocmn=4|3+cEimLkQ zIoa7XfS?r+(51lzPX*==9UT((%|X(1f*@2}Cue}*C2fQueqhF)57reov^fsd#%%78 zcHN`EW@KO}tgUtT^D|&08cX9>%Tc$f)x*qR97%`5x&S!?iXnKyG!|gC#;f{gz~fQT z(7;p*%<(ido+bS{(wxjOod=_l;^V~FSaBL$3+}fH3Iiu6l|5z>wcKj-d*kf=>pO0Z zO355xPzB=AMguzcD*%j|L3(Ubh)qi3(#o*Z~V?g?qpFw>Qku20w(*Qm;wwz4^~I; z`E#Tn7;pYL@6FB4IMa8<0x}AUk1P*baUl9ywhv~jk&ux3SwWblgW3A^b-i9$7!f{z zWa$}U#_pcvV_dy2R<&0 z;{**efvL&d97fA`pf$z_MdT;C0E0A(&k+%4WeVfMGOn&Xrx-tCrP!+h#sVZ%tzJe- z3Nv1Kb`~UfrM+ETPcL` zxRe!;#;TW22?`39m6g$;TUl7}zIr8bK_KFkt~%u3usbk3Ed3l6peh=?@Nsp7$O)Tapd$u)9Yw`oHlP^+0vF)X!&zc&KYtR97RScM zo}Rk!-tH?iRJXM)n-1B7RaI724hRTPS07(lp@DS)g94HntjOC#>ygw=*KNcoS}DqA1vUdwWYtb^-`x`ba`bDj4|S$J@xQ%*j$Z!`_~)#s^!H26s61)zhd4Xol+X?ydy3 zClF3b(}hPzXM)oJ)faHs?5*cDO#ZvS3T(WPpcw$#=M18R3^S!Dquvw);V>xCx)KNw zd5|Xt2L6_bsH-jBoL>RID^3Fpyv#pYs~UJjQ&ZZA9;oLL#e!h;r%z0*tY;3iSvJ@I zC>Kjh6ciL%m>#XI+^C6Uhh1)7p1;i(HJ~K-1(OLaEdot|JA^>4Q!D_*9pF`92VOE2 zhIk3MDihYXmqqgQnxLrwC_=GGvn2hcc`p!XgQrzeR0O&A_U_JGcqvB;7MmMwG+ff( z-@meAl3(*r`)XyC33dN0O*fJ$A|xULhK4~jGqbZ#4%dUF{clb;nPjr_)R~?(sE9ncOhR})+ES78LDEw zm*2bCSa{1({b_K~aYW8zaZA^KGNP34UxilJ;9y~mWC&dWH6N%+hK7bfn<1O`%tM?2 z!xC7i81;)=l1D@j9RUWI9SvCIYL@7g@x6L=0jm88gc3D~KBFK*GRMNw(%sDs9XVLY z^Jw_%%XQ#Y>cI#LBay<0B{)~Q2?4?N=mFcp2{bz`)uH;0TM(zCX{|N zNt<4$Ry$be(3bV79RaH$$OllY!?)*FS6%>kLO+XLoAeu=0zoTVAZRvOn zjw*(QhJrakzk?kwS^qzK$5 z15WtnvcK8v)R{2D&K&P)^mv;K*tj z$N}HIn%j<$D0~hX;+gsQ{?IaD0{P2Nds4osnTF}|DLWo+;5kr=LMM%Hz4$=~wIMVh z+t^mmQb_*bNg3W8N;W5&>CTx3U9+o;i=CYv1u7=caRDJ$<;#JbX;BT?(6BHL#?{!0qvOS;etH-T6W($%LqSIAC6_2LAiU104C7V}dST1kKe9+oKmWOo^_LEo6+6RdPG1XIc;g7fSAh|oolkJtD z{U}}sT~zEZ5Jg`yGQis@tD{)Gz*T4t!Mui+7NNoPiMa+${9lRyG9#Fdo?02Nr3E@*z+1#p=)=Q5rOLLlIMm)}KdeZT0@ zY&|(PK>suQ!;*wkM^>@PRW?pOAEbAx7+8S<_OGLK4Isnr2u5M@MoLzq%l<^hsG8mn zdh4+cz#i#H@A>bQ$qu3^z)Ci8f9R0Ha9oNOVIvf`GCL<941*;__=r;?oN$#HMgp{ zmi$u?uYMZLGqCxUG#t`=5f|RUh+kamOvbf%Sm=H|I5-FnMhr~(cu?C#x@oK-cR3gL znlOOC-NIA7K(ixsp)EK10J~G4<(_p9yTv1)zg>JX!}oA}MpsX7ZnX;rbhCh9_*S~i z*qJj8D$(|E%5$O!PQylC5c-@K8IrjG*d9w@_usXUNeN)~1IBYPgd(5nKix z)^G_H;cd0m%``m>;bvuJC6QI5yy2$m!I2o@djnf%d5U^1Oa#`=s9by9=x&XK}X>Md=QW<4}56iioOa8;mb0V zh<`AdbV+*U;Ht>^q%AEiLF-sFwt#&yH8lnHC-Ftfui1BN1nDwd8ZicL!nublZwoq9 zP?Jtjrk`&>@Y4NJ*D;H`3i9DGgH60@4lAB}k`qw{&;IzW)BZ`+dLd ze9+;}og43c@|^Qbn4-KSItmdA1Oh?-ASI>@fxxza_s>YM;NSF!ug~B=7$;>(QAqg+ z$u0y!4*4MVPSrjAAj8dF_2bj?XolXKe(LxS#}uttut5wILDBxs@Pi6&>Qx86GrBG= zue{vK$oEjfQ33*_ALNbvF$mf6WyO_UQ`v13a9q$k4|9t9zYC-fr z-)VTkiT*!dUJO`2gpjw7FD#UdS$z30I66AIvXb@fXAeoRX!gYJmk$xW8>j9qX?kYd zX{H=0bJn!v)YxITcz6<&@0x|p`ZgU~^%P{aY`35*L2TKIxadeoC+Fu>aZmH|11@mSjACQSI-jks;jF@^8ZPI))RtGoG+gtEuv+N8lIE*@gto= zrnRLlEjb@vM6K;oQyNO1B2-ITyWVbP#DERyOY!&b2FooTpFe+w|KYM=%$>%_$QVN= zygWAcPQ>vo>2Z1U5m8J`X1_^saWTL1POKOu1v#HkR=eZoKz}?PPVDro5hqbeNr~Ux zE?tVOgoq>TXM^2pQEy*ZHB^@A&<&xAv^@b1pjNI5b(TCd9J1-oSwg>uo)+SK@6S{;JGCl8)A>yYrmSX2 zh|_gV(iT?7RG_%8U%$3%xi!<&Oc9uA#zZleB^4wSqm6fQb#1$wxBB?;z3Krj(7h3L5&Z7r?zq*r2K4e<+0i$7Ug%-(gPYL!ht+Lh_m?y>qkoiBQv zA4EUz7Zq%cW>t(?koxXq(+nnQGU4qPRkYnPK-n-M|5j&nOtSX~A5+ZqSofJVMV0H7W%P;Lc-u?~l#15|fhKpYHbSdfQj(N3FRhb}q_~ zju1)Re_c(23*CNtv`dt}oXw39YB81Zc^`P+|4t$YJm&m-vwc+71`i)m(N1##S2Q%V zhs)F6>*JO7!*~Vj(WXA`jmI%y^Cjiwz8!~kf-|BNNN0P4ti3(mWllQ;ua8A_n_bI* zdDN~5&y>$ycH;vx)nU2*v-aDS8HcKf0u!n2@y@DdZpeV`>AoAkx&6sg)~{>F-?%a? zzqahKHxMz)dyl?MjhK*d*BK8kYgFH5Mt62QjE~PFo>uVuVgf_>0y9O{wdE$7&*|xL z(MjgGC0-(zS*ziX=UWB_X#$cK$Eo68Qopx?f*HTfHg0QrGV}BE$$W3tiVCv0iK52F z#_Cxnr3x1D2P`=Cnw)n(Ba-sE+;N8f4vPwNNLB1e=lk&C0|bH+Ty6O1`B~)TvCZe* zyLZv*Le~%HGD*x{M~&Oq8yl9Y#fL?g`_mcxPG|5?2qM7RD9M{S=u~hLNa`F!H=pMg{lmp zAt8Hv`%1V`;o+Uny-_rtt)#>gZQi$MZYv(!=c7W#RT{1{4Xn5jgC8nKsHWU$^tj<# zW%-KG1)--K5FS9(tl2QFF(39c+*gDA(q&Y)ZMwHDlQ@5vE{m3ngZS^~9=J7xDw7O4=Yr7GewmlPU!Eoi-)Smmlj7Do#ByR|i+L8Ml~ zSW?2X1T5#bCoA1CJyEKwxHHSu_EL*$N2iQ zdb^Yhi`+4KdV0%c;4HkZ4-FIdD`uiqnoK;w1N{SM=jR|BRJV=?6M+oo!gH)*_SGnxdrvfqS*#>5&cGq zbFz{oiVU|;PqU695dY%6Pm8`NZ7t8hrMtWJ4;DR6*Ts8lY*97?l#qkD5Y$vvTb?@* z%||nRCgx7OtPLhto{yj5-@OC7?($!%>wAdjjvd^c$uw`^MbJ=Cz@**sjenQ_V%~Cp z)LbB+^<>f;Z8cNQmsvZgM2)@MU8W6^NMx(GwnLnaZJOlql)Ap4%iTrY;Q}KA1IcI; zeFCa2UG_+(;QbRKSpyaBmEP(2AZvwQ?Z7l)gW~%#HOZh*I0$&?2nYyY?lea}=YO^U zHl|jg1$-<)dh<#_h|l|`a$<0gnCR~QK0ZFa-e%>JEXe%CpuCDvb)AqeV%0J=IsmPm^qZ`?qomP~7EK2dV&a$42jkI-3Id3`ftD zG*Ld^G3M-^_d>lvozo9D;G!f_Ax3nQr73SxWND`v^u*vYguzhF8}zzn8d0eEj|9J z7Fe5BjprqCMZ53Xx_GNzyX$bO7q=Y(Bwfg9YdlZp+2eYtS*_gJn(e{|9=79PuEx#x zR6MT61GBDyDq({jBZx9i>h|_F#(M5-i`Y&PT5d*~A>byTr|ffa+B;2EH+lsJOl`?; z1=xB)mM042WDJokA)W91OonyL;wSq4%u1s*A!K#9ei;P~~B2=|FzPtO^mPGlK zf25d(#_VFF)AiBZ8>=nZ8FeiuRcGgm#Q<2MDA)Dbs;_U%w}#Wqhn1q|dNN4Fy|IpA zu&}V4wnvt(m)s@_6x@9B1Vjzh=bx9h-{orLeK z0Fmsi{mE*j)}eg#{8c|4M~d}vrl69NQkL%>y;A!qUtdFCS3ON_Z7mlU*XY~(11VNY zq<~5drsh2S(#kpOefnlb8wK_h*;YNfGnO6*4F;`@p7nUG}`&| zy=WuvCR9~KDPvaimeE|)RzUVV-)uGb0yw@z5if*1(5*VMDz-Q8^^jm3* zL&3TZc69ipDtdc=uP`#`wH`+IBv_qD*v}4updkdR^sW+==@P;a;&8lqlgzArwY1zi zr>QB=YA-A~XPUNfF!noWzS(?KDk2%@dFPgvkB^U0z4YcP%}!ZaIbF|yE}_gA?0PF@ zDYD$;Qc`bxv(ah7@%#7h4e(lDAJK0Rk!+m1!S zZ;Dg@eiIhW7G6q9qaUb2qJ}0WCTok0%*@PP2MTbIZ`?Lo5)vUBI`8@l4Ql4VQsU6c zBB7!-J8q(|hdDMb-inKF?1O8RmX=0AMsAdz4BvfvdOF`4b~@d;B?r-llarH%kB^P5 z^5@TlZ(_IJzVF__bclAmqG(lcb#=9{urM+*5~lcV^nrT3LBp^oEE6Rsl4GPZwn zX=&*_!_*Ct>bru8;EoO)Y@FVQ5!(0<1rt$M+7h{AfebQcDLpap63^@RQ3WPO(Cmc^)JDkPMq=VdRC5jAxh|IFp(rn@`aI4Np8 zl_J$L2^=CKqF023IIlCl#jYmCLLi&3UKxe`C~4L%R|L(ZuyA|fmwzvM9%A)KGRNSY zw(RWI-1n66>=vA5^7wfFeVZ7^xY?PuBOx()0cCS^LtI=!LQG6Hle1r&;=_;ep8R}p zKBl-oyUw7*1>YdV!onve#wXq{E0i7_V9Ul86r{$cCnqOoprquWq#X4U4eMUdPr^GG zGiD?Brl=GbhwR`mE2deYsHH}W9nmb7lbJ~h5h2eaBgMnRd6l@`Dp^s|+?-eYYETIc z;r;bOZZZMcarbhHRbHM^Rf9IQ^2G%N67V9Ru&?i=l8tq%aHO0?78)kjX~5yauj{Ts zK$|dnHR9gE$yxvN;9-w30Oz$6#~Y66GCeu(CYtRL-Bw@S+^PAawV)hmqICD(E?2vL zN;(7q5wZQ|Os2KtyK)f|^wYgipHY=8?S!D)%4=er_x7rE@)-=wj1v}|W;JtnU&E2R zH%^Uma*wsz(pO{e?(W@uZ}a+1l+iI31l_E;7p%Egnk`ju*TnbwRSFo2izh$Tb{JH? z3YW-rXk5IRoqgrD{J~zTwY62i?U*}7_IEoz$~#Q%2-7-^qotqpUr#76Z~Ei8YHN$v z3?;K48Ww>gf(n_2m%353>U@xu8CtAXa_EQ~(Jdk3C^1Q%SqKY{QlrIo|9(p5|Z^4lwG~cGn$Gc-RD9HixXFQqD4n=4FU)?6} zTQP^K4%1wk_ztNLA2e%0D^5We)pITU3s0bRKS@xF{gOU#x{9Td529Tpiq^;_F;zOzd8y zmzJ8!Bw^xwl`ptASm2J5*tq*=P%(lJY{{|N%n<*L?r!yRJ(sbMp|B#k%5-MtI9q0% zM8k+=ex*~NbT4**gU|+^_Wj1dsS}(UGwv->#Ai>DC{xkf-arL?S7P~Z*D@n-{u#J#fT2T7Nj zDvntW)z4BU4$1&BOn)mWX!sLIy?LM?NzENHtI?pulA+$Uv~)+Mi62~fzA>)V z@|lnv1-&9GV+81Z7Q%9%P0znRgLb9d2^ZGC+Xzc0&oP)%kQx1WZ4^7~Z|>p36j9Xv zZ9HCtxE-4gBeUF>7`G*Op94Yiw`Y_KJ~GL;@2 z6sH_3Y%^jbxH?)0)fR(5PP)r=bBUyFI8vfX1@d1%qG4S(I&X%n(h^Ta1gI4VoJ=U( z1j9pSZ>Q9A2fPq+PeaN4E(|Ve@6+4et0c1t5*0s1Z56x^JwZi=R9amhDGf)k6GYwn z-oVVbe3s7=T$ouAX2=c+4aFc64A+-}_%E&a3KWx=auT)AHRF$d`4zTqw7I%k*v7%j z>D=k+<4kg6cDy{c2@PD^7xX%bL?RJzFtWF>P}NsrNbD|9*uWbrB&=}Kk_gtI{$ynt z77>G(oAqbi1r6ahXq{rK&*sOVe;&BNQpRmQs z9n;X$i#u_HbkuYzmYknOeqEm5 z*FI}7siC8T^vv|?U_ayV&>10c*lh5Ja_$&GR;&n_;rv~Vg79#s-xq0Zulwc4dqE8m z+?k?7XgF-lQMA6QhWyp)mOJX^-0o5Y6~R^Eh3?J zQ7^NsEG?`o$1FGzS~DdIh%fGX?mW3eb4f{QV2|GvXl75f+Zp^0{3XkJ17+&%TnJ zo|^hC0Upwzr1IXJ?SlU`#9um>rXb(*BL;b5eiD19%j(5VO6*aA|A&LzKFp1KMgC4W<$kiE2F^ecQ-+HA==*lahHRr-DO*4H;pqCinhMPTq8h>8Nu% z$6rOiG)l6iL0SwCTPVHgsCX;x+pcihfH)K0OXap%bGAOuu%RgfN7`|7hWEEnvO*gn zw+d826*C}3V27D-qzsw8xtg=!)MCP08092Fe}}m+iVz5+{nT-nB41$avobw;v=ISE zF-IbApoj?(As`B8J{~pT_&}|!AqLO=5e>51yCE(ij?R#%Tt%S0gTH`26w~`Vl@Vb3 zF<>Nu&k%IMuyXed5b;P#7{ z3ZWt1wJJs4qykcx_0=f5EhvWmcZV-Q-_pDydzsOByBtea_lgDYJCFjakNO#x*kdno;~Z zdkj!8lSUoI)9DpVq;-ZBuTZr4i?P3HC=(9NydgIH1o8-$o4Kfy3Ix2bSNS4WhNtaQ(M0q zT9!V~CWk^#>m5od{(H@CS5~s^bJZ~_EU?VjH1~Lv4tJhZkuqZoXUYb?is)9>)cW*i zzhE@=)vs-gi)-x?KcXmZ8sYYe`ugIWoa$0Eh`}ZLG)d557TznI_{8{)izlIv2;xDZ z>f^hl)?KFHs5w8&dXA!UswOXuY>cLFdbwfX4GpyH#Og_T{q^X7oX^;y1h zQ4u}8M`NRV5Ip4OY4u&6GT*!%J3(aB{`A@;#nj}YcWdd;qc{Wm4kth>=erK9-->qP z5nLLSqQ!U2`ll&I$;styZjvG;W@cu_Ck9J`qT}d!EtDeh(@%ZiGW#>79UlroGjcXC zFec>5NyJRY$VeslIwn>T_tEzG$*|V*r~co{Il!#+^z%@NU$8R6QBiP@k0u;^4E+3to$&DQi1zkA zm6X6hNM44D(k}Ff48^#_qgzdT|MY3Tm-%VrwaBdb6Us-AToAi%WK5%MDPy%?sAVsM*c?>9#N&885!^VMO56i+sb#xXOn|f@}WE{&wj8lU^FP_02IT42rV> zWh0#){I$=-#>OU>qxUT-#>|p5Pq}{kzg&;pZB#W~t`%IONLi&pjTiHYen>=!Y{sT! zxU80mn}r*1A#LHYB36p}o#LPI?g$4IP&4=rrwZO*MGf$P zMxCof?RJDsAWM6(-$xO5YTwxz0j^}DR*QL~eiSsD61j6l)*!0U;zY^UF9oRGa>8+eTZH$M=KQ?Am%h$W3+Bc4^PI9~5Gwo+s~G>c<#_eD2ma z2aiy>DA*k)LeLvR;34i?x7$m8e|9+MjkW9GS6l8DSn1?-T3v^Sr@r)?IBI=jSoZ4B zW=isFKj|zCy4yF7S!;dVTGRKXXJmA8ntzib+Ak}k?K7j>5MshcpyzqWb!`JWvd3*u z?Dm+ii8Bh5@~a;8Oe+$YaCjKGaxXWRTh-3bEPD<<;uCYEJRGPfM7g4@TiiaacI>4R z@#N+x6#*PwC!`>Tkh#rB?=9pVCPKWW3q&?;6x2Cm$x2Y%lHZlfpZkqGwg`~6qBUzc zmTa{ELqz=xz$}^G>&W3=dvX1LhlzRC4+$WU;1@3}>FI6N-gd4Uz>>g0R>_{P{cO$N zV5fLL`&_U6+XXcu{41@jy-Fbn0xhrMt}?H?R-U%X6{*LwNZtMY(VLT*bO`YAxAPU1 zu&~?(5K1f7>|zABq7|VK6YSl%_J7#hTz_MYlk) z(l)Hoh^Ld&sy9Ptr(jPRioCc82|>UWmmJte3Io^q^spL8A!_r&e*OPw0Vvp&Hciaa zhPN`8_3%Zjz76f(-j=ABQ`1u8MIl`vVjW_MfF&4 zewCu;PKzQ(is?;LS6odzyWEuC$Wu?(W{6{>ff$6T%Mrp;jVCJ5eDDgNcb*`MnT2PYf5NkjejX=Fj(; z-BP~rZX-~CqNJo_lC@j+W3RveI=CrJ#y7q&6H5L?tBgBsSS=eM*qyiM$WC5$pcTle zD*9jtFeU^m1-@WWLpB1C4F*q1dfBkCi=40B?h)<~6(Lf;0?HCiV31(_{UCnlOn;n-CU+tp8wY&R|B54SiY&lIpy3E-w}W`B zFHchlaq0k=0L2XlSitN|zIs%W<{L96D8rfBUaOCfa*8Zv+{NW307FhHEC2jaJRa#+ zvf@MmAsvv?E}*yU>+8eJW)p*6{BDPtdjWtF?3B{%Dy51U#GCt2@Inb*_QAa#@%T`r zvI{FUF9J_PF(ia){7aNr?3mdrO7?pG*IxiE73r|xMIa_f3$yT0zI{tg9aPDqS^%mf za3+R-XVPR!+9`xGNv{1I&QF7SdV*9Y#iaJ~<=MkSB?-+%u_6FqN)%~p__+D`nK)IU zxQ=`zcEQejp4~A8(tUV1{U+4ec&MV)iiKv_rn|4-MC7k?dFU)h>|c(PtA7;z+x;{&2=Ef|-#bRRnJvsrPLuL`P6lQW`vlQ@ctqea zkyqPw;-$#uk6En$GqENWCOjEHfts1+*K<0A>#(R7sUqJTIPMdI9<6oP4;A2hFMo$| zPq!X1Pmp7W4VgLp94#dcMAt4aEgc#exeCr(EOT~qTPUmDcJWpzJdP$2cF2qDsP!{! za8hflmkpGqWn^W|;<3v-PEZ2Jyx5&MJw44V8`@!Ri67+{pLjDq;dOtf3h>WQj^8IN zIyyS^hFm#P4tB6c$3 z8f@P0P82l%5#pQrYK`V_fv)$C8vC`dFA0Rr@96=_jT_gTvL99I?H*1>4do!@W54^9!2pfqh%1B|4y(w^itWWijw zT^M${G)C_6n}A#Sj87ofzVS0IN^skWY`9oXJe`6TBB5O7TR!6Y;IE5aT5U5v4kNs! z8{aHk!BLsfzZw5}3r&%|3f}v}fO|E1a$>Jv_|iua3Tn0WE@XY2VsNI0h6XvNGP`3~ zB%^KOmho`|ZRqUuP{o#zn zAgKX&7uau7J$Og3>_dAv;KrEDs(+PaXJ3lM-m*`ej&Fxp4uEtCMG6Ee%Ws+-f-F-N=SmYMNDMrxb72}s|XkhO-)U` z3qX{Q$wP^v%!ZY~jdq3Mbg74Gh+EK2rgB+HQGdk`u69C03ZSN=Gj1MoSBGl%{xagA z>*|Iru_K_J=i%i?KnebunAmMr)4EBV&X2G^ud>n2<8J6c*H>tNC(+=rAps(j?rv*t z?r)&V@;8NNCt(zQ8Cql19S-D7z1`gaT7rQ9pv9C!Q%8ry5Y?6+g$wZMIXO9i>#o&W znwdd_>>M2YwdW0DUR$4Jzfg5vzTLS4te(f(y-|FJ1$oLx>enknBl8?FVicWS0%b@w z)zvII4gQJQ(D1t2+82n3INZ8;B}jS7MTZ@oo#5=og1nrZlM@p-#KbbQln>Fb4CUqJ zZEef-D(W?uP=Y(PMd$cJhSPXZgF8RO(}F7mpsPM6gMh$&9O4mUx}cMTVMn)B9#NT^ zz>gp7n!91hr&xyYL4S7$8g!0;9t;p?Alt)3Vx{vw)oL*$_Vo7Rs7Ua+paIgQM6K+T zg+--M%;Djow@_AP=OUbeOrXLWWn+O1dHp(TO?!K`D+TMlm+Xh=@{FB1Ie?!0>9j5H z=l2{LiFWW^mX@ltwL=Mt5Ez%5+T?Y8#He2W_wQegnB;^6%!%dIn>}msDd8`$&iio~ z;E5-`Q;EBb;^bo&<>L>Tot&tjC!T0bq${`MmUVBQi5f|I8W(*hm?o1Tsi zk@0=iEoxVbM9g0T--pxQfdT1#Z;}es#H6HrwUYM7D{UZ+A|s0-d_fuf>C-32gGA^z zu5-I*Ux%fvx}A$V^(+r;gF|%PLmxpDSW(A$Mt0KyTyPV1D{a3+F}A_QZg1nvEwd?C zz(;h0cmsI(T3gA3`$P1~ybd=&xmC^`+}zxRgoJ3;n1zW^mbL;B1nfMq#GcDbR8$Zp zXLg-+Kt7?&X=@`DkeBreG#39NmS97w^PKm=CWNkklp}f z9`L1j5yAd5J8_@{B?l?2cVlyV+leRT=k^1OuMh!@~m^85vM*92^`10%;PtShT7tDifOKgZF?c*h3E?j*_$d zfb$i5ok&~DG@KOTFJAH?JO)S?Z-P0;c@eS|3GndLw6z7^z6F>8m(?^=uqZnxr zZz)in0=?b$F^fJEM|t@XcS{f>IwZkL8f;oiN=j;LgSM7toG0=xK_yf4VRE5zk)xv{ z0|NtK>?X#?sj-ol|3#74JPTq(%xnscd&(6+@R0=@Ie~FH6xY9Yw(@==SK7q+j zk%~WLep|)&C9B^=knip7Wba}D@dqNZ_H{v0KTxB* z{!ImdroS3(3n;<0uFftl=-`Ecp*`q~D}IWzm#ptwRf4oVloFqkV)9vdN{9Dkb=H|eF0A7;lrM)W3xE)YpxCc#+jjf478G%YHEG(=}@&pG(d@NTo#wgIS zbQWc5W=36Cci4cV{bN{EwQ_s^3-EF2mFEs^`p$r^Bd5Pz}5fb`L3h4ZhYho$B2w@{NR4fzcI z&DoyV`1l(4Q=@~Jh|NPd#FvFrdq9<{^_o;oLh~Bu^fd^RtepmIl{B$77_>Arrsn1a z`T0O(wl5G0y7m1_?69so2s|R9xw-jOL=2154dqfXhOePskKRvA+lBHFljMG32GU7!64R;cYE-*N7L8h%}!r9=)GZX>R3yKJkE@f$J zwr*ZzlXu3XeLZDz_w z0AlnH<)S(+Id^w=2?+#JJD}^C3RVP~*~UgqC@zpFFmrL$=HztFFTJOYKR-V|buTk# zBcO~!vdZnW$3=mBS7iWM4UkKsr|t5d=|Q5HL1L7e+FWc0LBKIUG5E%OL{>(Ik(oKM z-(=Qw8C#lGowKes!juCdqU!Fh>OR~5^&H|)?nk;3LyUtHpPv45 zOkiQ!ZKM45!)_qr;8Vm&f$9e&&}p8F>+9a09=%3K(}4tfpu|;W_{fl$1D&6kFm^#} zU~$F6#Qe2=ZX@Fn*nvq*tgWuzYgPjqL(*5TfYE{XX{o8!uYUvKjDyxeq%3W3Z?7?2 zb{XR9V9*+ZEZQ4GcAcb%5=;q%qzw(cK-<}$rFM^cyV82rsFz#wsHWk&9uSObKM(0F zQUo-zHMemq1Qfyi8S>eR_Ppu;YS7^DFJGVx44sx4?@B{0sI!5Jdtm#VRi{A_KyV*F zn(h;vXvfBhW_NXW&wUJy7QF<)>-yTw*%^~cRZ$T$d9b$3Hyveaa#B@I4dl*Bs}`s# zkg<%VYrZdDi?&s&7YpD+7~=eEW;y}{Mb;(TAc2_K0>Rkc-k#ZLCg84`nwo&vB`qxt z$YE^v33^&M?b)M0i)R1Xy#QSYy-NPv z29SUOP!Y%qgoK1RIWK^Ws!KJ90CWKis*a9;AQ~AQw6d|OotA}XT078q&Ht(xC`qKU zL54Z>2IZ!Ui_5fdxm)mfnk>)_zRCZaM=J+ybnd=OO!)gF%1Ui*sRx(?Is)8uZ%~wf z$5YHLLZeP}ZI}_}76CjgjF}2(sNCG@$1JQt!Eu2ubVRVajMEmqH2ZsU5-8~MzYTAJ zh=GQI0XT$x6ADUv)p}xj*HOW1@IiERG%7yJYzT-ts3<63`tMxd@97}DA|=&RRTXPd zWWuxh9fI!J>U$iKl|;%vYVgKoPd`EnJ6x6xURdW|2*yic7P;19Ea%rRkutUW-x$IM zejHY7G9uy@d1YmXAcnY#>NePCx3(^^NMhCP!f{{ynZG;|Ed2bd0p;SnbxR>oG1PA%9STs$Py4Krl_tPX&BZlG3e>|XAcS~%-FHXe zyEHx5ZUYSn9xm>|ax3xibto`@GQWqh@=aqP-~l45`C6-45*9QtZs2*jx6vE3a4GHX zqe6lID+wX1r@S@0pn#5t=X!6dL<9B5VZ;b5Z2exHR}_GxMYB)-WWTSYFx(U{Y-V0) zl>jhKT~UmB5NLDQ+1UY6zM7`5iAEcLIs^N{3GFTF8z&hGmHL*;;0_WiTvQ; zV0v7XA$~MakKou>4xV_8f#MNV06<1qXUtrr`pMqj9_XUv<)d8=0>&&#i;JtH&%5Ud zyyw_OCfHt9o}=rq;1f$2wEC}xWB#t=2MHmbR&MX$fVvue4y*ZJ7lyQq@JFo>gi}!4 zkv<>4i|AMeg~blXjMHt8ZSXPrrF}o zZulyjOUcS*M-0 zR@=n9Brk(S`J8tYB_t$lZCPADACi!?q?z%NL}%Cm;Sh+Q_g9C&v;lTDIx+%~9*~CX zgu9ZxXuw1YxV1}k;DQW^TA?TI4#GNCE?;t>+~`CCN8M3@HYM-LaHaEd2Ig1R2Q$XA=6(?51!oJ$GM&)jck}5f77g#?rF=uDz$?54c_qY2$zMZZUe77Xv(eMd$2_`&N3nG}_ z`=e#;F~+U|_pA7KN5{Jr+~R_q2_v>RCaJF!-$FUcW-u*@tb>)IxNVA9M&Ns_szK9` z%Du|^`Wd&N>N|uIMQ47Wwa#E6O4SO-N_D<3d?EfTByhg@9b-Ho6o3*8RH(=8&w53w zpxwqfAYeQ24iwG)#%?U(=5~F14mc--o?K)92!SX%DDD72K!8ZE%FnZvvg=D!6f+Z( z7-knf2^_+7ft5{mR8-V|P{6AB20=?ehN4~t68qP$UqNh-^0{g<{sj=q2z=H$mh3Gm zQMqqyYtaHnzk~n}1-$w`Rk58P0iJ@^1v^X?AW=9tfsf|{iHt}AvoC|FXW0!v&B>(o z6N%9e6biq7`Rk4l>PN%WaYnu=Jw*5Q_5FAI1{GtJabNlzK9yIsNg#qQmrs6}>ziWU zN-{Ot`Rmtk9n9ziYT01E3M>+VhF72%<>`xFe?yf9CvY7aHR_-*a^_= zBu@qY)3{R|OwGx8pNt8(p6-p}m-C^xY?nUd6g9dR966`J+wmbVM(=-!lYgEin-Nw6AV-w}R7opd&yT>Nu;Yz@rurd=(r7$D#QxvH{=Ld> zYiqmei89ah=rLe(7r@Kf>WLz*<*|MHcrk$&(Y;V5LcW2_i-`@}_!?NXdWGIno6o)Q z(<#RFYamSx*yupUp=Hu+0d!`}p7usCP@N}Vf?j~O)K*b3_HrGqUqJ~B z+(Zdpsy{ehkLTp#I$UXgt{D|}a~S@H1ZKT9e85RwSOcd(dO;E8P@An*A~QGufdKt` zv+I%fb%tA^YVi^mLhDl;vo`JaCJaQ+cQ+4!F%iiug0~kF(Qd?~q_)=9K(?!=*bp>q)n|^7Uq3A;+V0K<>zBQ8=(2UJkUmFR8OXrFi$XbBRL~Qm zd(i`l%qmyP7Cnv@8^Ks5&`K5*sH>{ZX8zyl7#M4Pz`D)O5%d^kDcI7&Zm21m?`HgH6Ri4e{Nn`#B0K3mj77LHps zE~@WBLV$OGKG)`@@f`#LBDJ5-g9A|%0>pj0tR7_AXcEEj3~9L!bI#XGncZ6|C+=^p zQ-Z+w9qDrQX6yBeo9Em&BvUsO*hZUwo&J!6Ht=C|`1|E1d#~WS! z#_i@~Ae6X6M5y%BQk?W;up9sJYA~6OhQ-52c?0pUwVGb6@u<0! zo}A0bAidxM-31=2-oqi!%Hq$^O}t>ox27+|dxKRm`@WE~;k+jo8~6Nvu`YbYPm2Fn zjP>D3DaOvKN@HMPfJLu`cN~?I+c^se$EH3Nn9o_)Ar@4=qFC`dZhdg5=C7W!W&yHv zJ~!KizH>QyYz8K#gN*u>k=*ekU(f%vM5nfI6^AXKkaTTXlEG&~De`YYrn;kSP z@95c5kfSmqY~0c?aQqK?CfK^T+r~Q!tu8PTt|Q;RLPgstam+3Zg%bN z>EUlh03jq2{@*}wHXB?c485Ve0@ne*Ujz?OY-Vwo4wO{1oNWs~?&8_Gc;UQym6(b0fD>XCMH@`2ss-SrMq$|8>{V) zOkCIMm9_%(wL1Y=V@YV_#&LJrL4{U29m#j*gPk?Nk$7F4SDI z&Hf$XjWRDix5+11Rwdp#rFZ0Q{apAOkPUa!CEqCqb> zB6GkA>ep7Mwo8?lrAF7+ZK>Lbv=y$=c*i+=$+S=gHlma5kQI!TVgZ!747Y zk5Ak9wX&Ae#4u+IJt{~LB({CI-|L_6SVtZ?pXCCjL#?Rme){@7-tV$rO@+Dm{4RX) zVtNc430CpD`lpcQI}BEzdRIgTFMbWQtz1Uo!n@TVtsKt%bYvQ$hEtFJQPdUgm%lT0 z`fQ?|CJYG1iIACSd#EH5N7#N`y5hz<4E^0sZsyf)KY!@=66&t1lNbwpQNhT-kN&>= zE88cu_hsSlBbKKzFxgWocNYd{^zOz=-!y8mpuqGP`V9Bdl?XF|iS~%GhmDpQFRLb9 z;bVzJ`8lS0k2P%s8Z2W53QW7TMNW;#ttx5qho_eGW1jOf%HF*YQXGwMPz}x`ID%7O ztf0kZcv+<3r+sgH{5}@0XU^lOo(k5ewR4Nj$w#OJA^HE&0z6OkA$}(IAQ1nomGic3 zd1`vWSky10;h`+owyl(SDkOw;6z9*Xo8$S*TGicXMF`HP-1zPSir58&#Tm=*ckGx9 zVM9Mx0+I{@j%6c!otyOK8{B^Ti&*!2JL@fG;OOdnKUC87dHU56FjL-sp>o|nU-jwP zN;dqI$aH75x}&ClLZR+%hp-AkDG<9>#%h|kujz-c5B=W#3lA9C^GTz5eNJPh6p zBDl|sq>E4coUwC1gZ%KTRRUUHBf+l+5gyxu&!N%_x;nW@(0#XziWL`9$gh{EtKEp_ z*g>2uOEtK|{KgY*>ga*F`#Nu4?(VrJS$KsIP#t7AL`aSD>`Jaw#-uWbCbtmtVI(g# z$!Qs%yQ%BAt?(MD?xtSpMC*O)k9yfj#eme+>~2J4Au4|(7@v^L5A{WRD&?(No;`a2 z!@&aVP(#NFo8o8NT^M?Yo$J~5yK#Q~JPcepqvamtSn%sYFS3^XynokyMko@%FQI|^)bIb- zJ9m565GP-voh05+ap7i|2BU4qRTYU~vsDRoUZ3vBtxkEGAoy>X;_n<7aZ5x_^w3y9Ci>{RWR7tYo{Oa>sxMj#+{ zX5qvr_BXMZc89ZS>kBeJRii;LH8?w1=@$Q#*xoFRCR(*0@lAhGl&X4e_-&cK&MH$D zMaaT-QP|xqjfIVUtz&qzrK5(Xzcfp=q`p}tWc(sL2cQE+Rgrsd>K;N4%_F)UBeJU8 zCGM=b(@t+99}DAzylA6y74`5#J9CDYeHHHBzc9}5N%x0zZD6&yf85_GTO!OV^R%O& z{#lWKAM@}f>gNN7Zw#^gIsmd*6U2|+{~KW2P>P?n->9jf@(Cr~>dks>r~C;l2OOkw zM=pE6ny*@Tr5U}){ zFyNxZNr{2sceD^$TAYY(X8=1F$berR5d%|ymYk`8UX#uPEtEtqz(xB_IJnc~@{|Px z1U4P{lK)q8U)dMM`-i)PNJ|MwBaIRQ(t<7^At5O#A)?fRpmZ23NFyBr($Xc}Ez&L0 zARsN>aK8Nh=M|hsXCKV?S=otu?!0O`0g(Yv-l6hK`#h-6_V=AWB1uU|z(xn)yt|v* zp@)>8tQ86c=Ox0&N0Ow0g%*e(PEK68{J_0TgsGWTsW=nU{mjAAvN9_n8gFm!pofDaBN@Y1c}aV2_dqCp3ID;wl{+#U?%77z zv2p?cv7R1P3OO;l9>5~BVcA!=v4L6>WGD8MEyf2jEk-#5u(g0zP?|KFD5Ps#y21GW zzOK@}9i@~W^BB-7&_C*M8oUBF2rNeI!EnW~$|zXvEH5{rt$+rCyCEc$B}uESj1Bvn z#DBMTC)&!;kplm5OG)&xF%?Hc-h+lziHqM1Z#A_T@IO8leLX;dvH!`m^2a`Dv%}|g z7K``*LuoTz-eS*|LPK-U79b;GnGN5A#@eH$us89ZnXVrCo>}p`MjgKi^_Xun4S#;U z91V$)cuwlu43I)uh_1Z6FEY6S4Ts=Q&JEGEvn#j{1K%&dR4wkjIlvvajyzKPe@#qC zN=nj^kbv1D4{2HYdt^jM8I%gP96g6T-{e16C+H)MrvKG-sCHrd7^7U89Csp~RR4Z@ z_9pZn`U$1|fDB!M&6pb*t!v*_PvyCzZKHFB+(goni=Oc-$0c8?)blXL@BDc2{}fX~ z5$}bh-e?&W;MTtgvzMc}PZF*%ema3?yL5jfF~~eh#x^Krp|f7u%lpPHpODEkhhfxe zM?)oEe@HiV&B)~OPcABl$1Z_ge507ymR{%R>}_`XbnDKiX(!dC%6!oO(=40pmCZ$+ zjsA{l9l3YQY8{lcSxV@Ona+#9 zFTM2aA}@jNL2>hTmf_i5D*>$gwx>&^Z=Qurdg>=iygR}h`jh?Hgtcj8$s}D3#!VV- z@BJBKk{>)x_zNnY%lTct1lFKlI^1KE47-o9^4Yq`pv-OOwhaac6FlqL`7emOE8e!2hK2<(( z5#!?%*qdKyzUxpwVec+-K-e5))C7RG@e5j01kdP~cw9?I`t2d(}2 zg9yaeSJaBMI~|9C^UHZ_5yrNH%kl@f;md!%cKryo^m9R@_4|DI_*@FZM1nd$aVoU3 zu;R9?x|q}4Za|SfA9^o*diHoOU}u@xu<<=B;;p5E?_+pw+NE0BYzr1X*w@+j>GJJ7 zm$gpo@lV-(u6BL8g82HdMDJO{Z*H7U*&4su&)1Y6szfCk)4X5gIC}28=W`V6yH}$~ zia?Z%aGostJdh$py!70A-8F4-=jQ1R(sP8|o4E)0@fOtSmi()M6x{UI;h!#^V8qHn zk>Ate#X)?pbrUyTt*PKx8k#srP`o0N{LY0@;KK^lt$zX6Cyw)w8ET>@efjD<8L~Ui zl*g(BMi!1E%YV$KZ|+Z%gqXd?#Q*EjbGpgU$j3VSry@+=Da0y4DUR{kfMBP6u@1?n z(JgbPGy(-e{Ci(A*Z*FvH+G3^N)HzkvXQ%*JN=HdQ$)eHizapbxw&xAoP0YkOF!3l zli+*}M1a%Y6)vFCpd6pcgsQBRG&orc`KiGUE#D)CPfa8`02p zAdJKMvFi7mL45p*{s(<`?xXDNrwj2h-yO0O>`R9gx(R%=l;$3z#Q#8}9$H-d$G8RE zq86h2Z<0kzn4T7UodO#J_v7pK;FFt+WI`yDj@gRMlCbH+4Yk5%Op|GB^BTeRpwcTz)4jw5h+luMta;M3N~Lz0Ywig@cX!Jd2jD0eAC!!B-POH3%&7AwuzE%okWlR=Y`n(~b5@@(s`5AYv1JfgsP{t)N6+!a<|H@39C z8{|5P?hn24RMe;XpWG6#CS(<7Bw4aMpT53Wq;ivh zxHjv+mo%I<$GajUs;;ObllZ1@`>!7!+Fp%RnPkNjn#YCMCD5jnj0G|&*yO6^ zK709}^kaBx3Q$0>#&Sj!>8UPKE^lmrh6Ee&_1ia20kZr_?4u73;hCSCGOk)Qv}0jb z-fN@-MI|PJf{KcYlG1HbM3){5ai5heLG)DK2^RaDD zlll0;x6Jf})H3#QEX>Z~q3+`0>peCWRn7;olf;$+YMU1OW2yqn9e2V*h43(t1I$y|%vorH0U#!HrWygsKu_kpqqM)|J)7%%pzMZoI5Jo|au)lY|)Kpwx1Z zJx`|^G<-m7&&`=RB|l8{(?wBFt0R*OA=2*R{EUj%P`BzeS2YP7h87NUWR}vxL>Z8$ z1Hu5?KaS0^?f`LBI<3cbF2IbhqvL3+WAt+e5r)LiS^LZApl8pXp+fyU zfO>m`lZ;{Vl$wriSAs+-eE`H(1lX7Xt=k{IdRN5sauf}M1jIDB%rLD6-H7+a*#YG7jM4IarZqXg{}K^%0s@g2 zNuG=DOt-nX#ws0OI5=!iI!~+MnuhdEO@Q#_m&MwvTA^ET3aGFeP3? z3STN@d{epKj$y$)ZUh7et3G%83D#k#j2McpnMUzcPk`2Kx&d!ZB9=sX>Fax9g>co93|L3H4n;cxKR zfzfsoWZzDwhp+79(=#$4^Qr5wE3!mZz97Fyu%RQaW_Rccm!hCLsq$s@a%~h5agj`f zHIG~XWqM{NB+S*rg2k$o68eN|UAcwqI8k<}zSTXbS0Ec)Us(YupGM9w9#BQ;-|VeuL%0EL9;$MIk`;#!?IT8*$$?meY{!v2gZ8Pw z8HY+@dU5koedo1b57f0lIBZ}LZ#R$2inAHaee2d33ra?&88QYTCDX?z*Cv9YmV zW=<}nqoY&tD8@2llFYuwbgcNfht$PRuk?X%fUcQI5ThOE zty`U)oz?cU@1GVN=s+YF!@HK5$;rblpBtOsXs(TLWzRiOkGUfu<|pgmoia#F zBO@b8rAUH%i6ET|B!yFPEV0xz5__FQCCRBMTwEeYYE?BvmxR|67YO|~UW<=u3%W4v zN~oznd9suzyzTdH!8y?^>NQ0JArjg~h==2c(LhFAPe&|k9CEBqDD!R?d5kWK%O~)Y zPXrp;m_5^OH<4f>wXRnsh9AbF;N?|y#?u02n^!(1{)iZDgPPenDq+4;So7Z>h)u9# z^A{9VHqP4PV!w~gUyui>$&~wMf;Jm`x$eYrr@_Og55YgJPH{JfxHnf%mrP|)D5zgA zX7t}xNGnA!KX?h-x1mfzu)D87LIXP{R$L<3k&vNrV26u`#DX0fI~fCZ$oGA){r}=; z6R{9ThcNL685p&XUqdj|U_;((>FJOpHNHMu@QDOzE^s5MH>9gh_ws)1=YcVYMZ3Jz z;eER6*WXP-tG1b}dZUpgA1SQm_{~l-PW>{~fvQt4>b*@XGYrhBK%mq{m`XzG>&^;9YrN(E9~XQ~?59 zK&UuolQ_gJt&_6{9F8wB{qf(w{g0<0A`Q8mtxc7a15q&zIDn*pcqiPALOABtYjnTP8n8BNPd276wxhkQx%`it>rXo!Aq;9INS6AtYIIo< z`_6*`_F^}Fy2kmRNvH+wNI`FRHyhf%a^hs8_8@Zf>A34s0_3(X?YPi(c6u71Zu5CB zw^CtEIg^-2CPBXgS~^LH-va4aiZJkn!3h#$Nzpt;+yOynnbYU{`w|;4%<_TG`jn>L zdFH<5*BlySx1$BWDO@>qX}zUgXkUo8%R=k&0=~_rC1c<9d7?YdMwgNr?bcU!%Y$+)zh#ttbLx| z>%tTH1BQV}r3G5My5-S|mBTG2cf7-gH?Li`)(p+p5u7vI{i}5)Uo$cmL1}n)b_SB2 z^TSf{g#4VGRmLPQ{ToyVi*=sp(CW>qTVi5IW3QgzDHnhO5TZ}!IaEPo6li?%JEws1 z`t^HYXEgRcD{Y@owmd#?-~S@*EoCzAC%YJg#{A#uzKi~|dBh%IYeoBK=LiHZU<5>m zQa$z9+D!5&uB;R@=@i*tH>fmgU5KLrmqc_21Kc(^8QeEDzfBZBH~Pwqzwa(teb%SQ z8dh9tJ=W-FEVb3LT2RkWsP{}0jEX-xJ5LUtJY`0o_IjVckV?9MD79kibd6ywUC;bM){$-Zhpwd`q(ZmnB5e_pI%Y)aiU%#cKgc>jUQ0o;=GFRORMQnY5 zbq(8tMe6RuV`62iHoIeN#M?@=Y0PxZE~Bvf+e#X5$BTp;et4Qw#rk92LOgr(PVN?tl@>P55pQK0f|W5gV8F;U^-tzl8=%(Nr0qaR6@6 ziHW7OuNA`WTIaF+NjAl5sk)msbNj8F?mk{y?w59&6~#({GwiB(ao;=TPM#_ zGnW(?|IGO;U#49>dnRLPDMXX-S^Q;NOAA`SbwMbOUx+Xy&REJrON3&8VtOY?iTPyM zXgqUO<{E1nqQBC@?pWjWY2>AO+7WoXdMauZyO`~goI?su=#n1LCx?; z|B2lQg{aw18+uJ=YlG5z>-WSnJG+-&m4uO(XohVMXv#HxdibtSg_>sS^zbk}BkI$r zW3z5z^v=JsZb73fh=$t>rZKe_M;i@=cV>RKis^-{|00W(=ct(2kY+e6^#1koWE|$l zNHp@D60iGl-S~$jH(X!GCo3VInzm(Qh78wCapg#TV6#>6h4Y=s`0wGIfE^Y?4bDpi zI$p(GLT~-+%1P3KC7(Ms0(QJcQiDJ-b!kw@ahavmTN9oxluYyI-k>&&Na(=ZagllR z;rQb8=wD$6-M>$Z4wb$tsoGS$Y@Ftbulx&j=2}U%o7@?nezPtP4!T1qL)v7);h(~Z zlw@ezcrEm%=v-b0hmIOyEBH9$;Q=e?5a_}=fvspyyd zW{&y|S|Mfk8(vSv5Bm!{D3l)gm=dyNcuQ|9Ry>M}C`@W4-FBsmn|sCL))+8ae8qAh zU`KP#y#M9{Q~iN^)=%<(bi{mCLLe5IYMRu z^up=zZ(7@j_O;+>Vo#x4{u%;H_((A<07htzb*ksbqf|FLTajMsZVttU!u)0$2m9Bk>x~n` zBSPc9G%Pt>mG2&22`;){5_s3@nC7nMTJPSZrwA4ApT2kPk^*zr3Bt+6k9~i+p(Uq& zr_kk0zRFL2gKvZlQVzBwG4_Ck4}866=8pnwbBi<`&)m&p`s#ZxAiMqh!S0(~p9Rw} zLT0pShJEv=4l~=80p6Yte0lBgyODiN;j%mmfohuEE{4QA&4a4Z=IK$3JYR85an;*o z`4j@Br-z)(M#5Lo~cLWGndik$3@7yJC zrO=5|>cHuEYkgH^(IATIc~(R%PU`cnI@@8hk6Ideb@`S97@$H*HdizZ-0fCVMZ0`% zeDmy@KuO2YdqQSZNM>#3CJr&tZHDNb(Y6t5dVP!}jvz949IldG9k+<+#XX-|nd!Yk zS)xXUiSwp&xF7k82^r;WR18efGv3O(&7~R?p3b!}>DD|<%%h@t*LLz}%-^43bGa=p z*%_v$4w$|fL>8UNg3}hPEq;fRNCht|vuq7i*_d>_mV{YRUXStPn5gfTmW|cMMuZyw zRE`L6nWM+6F!S$*jP;6?=5_Sem8Mk~*gaNYJ8RB(l=qGn3(;WC^Rwf4{mi+}V`sn&Hw#v(k(*MFREb(!yF}vs9z2jWVAoupydk`K=qEW|c+_F@@ zOGJYF({GkD`I(`BfsnbFxJ8y?lrv_K}^`gmR#)1ztK9kA^~F@P;3AMN+nIhSqBGMC<7p#)ZN`(O)W%=d%>X+RuJF^ z2fqTC^7C{K_V$2KCH5U08Um3b1^yM4L0AOC3{ojQEae**Zh#;?Jaq9fU0GcP%`_x2 zjjy9#zJzQBa4xB4mJ}7inSsBpo}3yQ0x}nT*xeS^C=_Hm0EKB*^ljKGp!H^W2dr@P z^UB6-pbTu}$JY0uAf|g@tp-pRs$4=`JZ>FE0APIWmH_8*2K%BA{q^e$MIK*Xuh5O{>1VoOU{@Dcu zFC=_PG@d-k99@Ov*n13Wo}OoYeW6g`m4SX`Vtx)VS+ zM@PYNF&lZkJRLY;QVQhE0&%&oDFlAfkr5apYZ98h{CC}I%N>6Or*Qt<)EpWgUp?R= z!^H+eQn@4eGE4RI?3TbIT;F3VEeAJFN8DZx*Xnyl;VR*~&Ns8ei5+_P23t@Z(K1zq!Alyvor>=9u46T>f*8qWBo}br;__)Rh}< zFn8;Wd%GV6`8^HKh?uT2Q>ewG(Q`|;`J9r4T-h`(XD?m_l zmoN*Mrrv3uqqlgxFNY zN^dw3`h-3S@q9Ddt3;uJSN(Z3r>8JS)?*5bR%cM?Y}T0XfcC@W>dm+Q%NRXT>ka+vNl0^KYN0}`65GD!EoS^o$UsaefuVq3KNlVPd<=u(uBD@> zd~O+OPWNeZxA2uL#h)=RVc3>a`C$Ca^}DF_-To5-|y)iyA8Icq#oF{nPRTV&!K_`dp;bm3h5SJ61y)4G&oi0=~Bbj{4kMygUY`d0o*Vp=qi8EU|oT3Ys>8SrWR(9a)rDh!1 zcs}}&;cV)FL>2$EaL#DyAX~VD4xQUI4}W7bTBRM=Xd3?Jwz$#{5&G}|9dwujcehi)J0zSv}n5uPtTHrw@yqmv7`;3Q4{abU!pZFBIgOMrerS5h<|2| zFuS_-h>{dp_sx=;KX|I%bT1_^BC&C{=iTxb8<;knrm=Hsl1I=!;blVy#_+VM2lU$r z2kYM!9*@YJv|Sl;T0Q1C!DeF!36BaT$yjTw#0 z3Dms|onwxao<5&ZXOFWrUTHokYoE_rUExxGq@?}xS+#rnm;7CqE6gpk4o2&Jfxp{u znYE{fqxiT&6`*h)4vdd2IT@vDOw?ZHqTdJ|1Vq#7O2ycG0%4IK&- ziLJ^nJ?9Vhw>z>s-@p{)Ov8Iy63}Z|O<$ElpF5U3{S?I=S&6+|`5RhNF0`-#hwPYN6OOGAxOx8QVpN>RQW&Wv8o> z-woD-xj1mj0$~G{ygMwy|EgWy*Q`)tMsTCabGB?Q6u-u4L3cr1*!Hcv~0t zo3^C+E2GYK(#GSvW0eHWsTP}pT))O;xsYb8bK|2IxvbJ0P1+xC{<}+r4iyR3F+#PK z#Ib*up=)cf~l~v}N2c3?5q@uO6Dz zSE-*`cG#(y7(!P}><-PX5n_ahXlh>(nY|J#F_O1TPd7kx){^^aCtQiS+Vf21a!rar zw=6gW5%1cqGz(E~RhjB!-#_!Di+jF!|1HCr1d*9_ zfSrn08sl)c;X5FU)HIZ!RQ&Y_Hplc0iRO z-ip0H8)5jDD{E+I2v!zwtg$4~VkSm@3J4ISCbTL&2A?p<+zy*5noA@_?DyBk1PAXz zAsF(7v^xSv2ePrvFo1a0$IF4rOHh4LK28fBhLaP(7r_d0@Xbbu2GXT~Iq`fEllX9+ zTn46Pa&oOer~ulH%M95q;OGvVFQdDHlkp(fH>)b(U4vu_HZsiLC4=Y;GBoZjyk_&h%IXMzYhNfy?ix4 zGxG!9XyCfutd2mI{n)ybut-{FW`JypWx#eUmWK1>z!I<3&i z+U1?K2P68dn|Q=D;^C`TTj`IY0p<6gvMT)zwAsMG0OTq_T!E7*r10C=*u-SV30#7G z6|?<9Mo*t^Na#246Z$sKI(U1ugdH5_^}mD=g4Xk{S$kpI-w_a26r2qvdZ>MNM1;+U zau{(L0O;c}Lmm-59i2H9yrSsgc296$ch&pLO4q%^O}$u@;E?S&{IzpKMr6%rBThZn=O3@ck8nC_ZCgl^{M1>fcA? zEJR);NJ~U)IOE)ZZp8QJInlZ&Hlkdfu`YD zX^0MmhG$`J-X~-$94~!-_zYh8R2IA7hjH2J7Mbefxhf2K-M?GNN!=*~>h3TbUbO%v zB@|DN^&h~mf??P6rSZSpeJUbr*6XXdc$YmN%xKLkP-d@r|j#0*_ubfsE zKyLAgOx*v!#}}}JFSBcEJle>y0=kJHw}qK`7DtJ&BIEMxQX%bv{QN+4SX719L((3s uGa#yN8Oi?N#R1f diff --git a/ideal_release_flow_versioning_complex.mmd b/ideal_release_flow_versioning_complex.mmd deleted file mode 100644 index baec7cace..000000000 --- a/ideal_release_flow_versioning_complex.mmd +++ /dev/null @@ -1,27 +0,0 @@ -%%{ - init: { - 'theme': 'dark', - 'logLevel': 'debug', - 'gitGraph': { - 'showBranches': true, - 'mainBranchName': 'master', - 'parallelCommits': true - }, - 'themeVariables': { - 'commitLabelColor': '#ffffff', - 'commitLabelBackground': '#333333' - } - } -}%% -gitGraph - checkout master - commit id: "A1" tag:"v1.0.0" - commit id: "A2: fix v1.0.1" - commit id: "A3: feature v1.1.0" - commit id: "A4: fix v1.1.0" - commit id: "A5: fix v1.1.0" tag:"v1.1.0" - commit id: "A6: feature v1.2.0" - commit id: "A7: feature v1.2.0" - commit id: "A8: breaking v2.0.0" - commit id: "A9: breaking v2.0.0" tag:"v2.0.0" - commit id: "A10: feature v2.1.0" diff --git a/ideal_release_flow_versioning_complex.png b/ideal_release_flow_versioning_complex.png deleted file mode 100644 index 71422202e5ffb37e363064a458a778ab12b4a457..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22061 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 From 3a707e6e0a5252beffa843a8022de5d506c7b19e Mon Sep 17 00:00:00 2001 From: Julien Benhaim Date: Thu, 24 Jul 2025 17:47:11 +0200 Subject: [PATCH 3/8] Preserve old Dockerfiles --- .../mongodb-agent-non-matrix/Dockerfile.old | 60 +++++++++++++++++ docker/mongodb-agent/Dockerfile.old | 64 +++++++++++++++++++ .../Dockerfile.old | 6 ++ .../Dockerfile.old | 6 ++ inventories/agent.yaml | 2 +- inventories/agent_non_matrix.yaml | 4 +- inventories/database.yaml | 3 +- inventories/readiness_probe.yaml | 2 +- inventories/upgrade_hook.yaml | 2 +- 9 files changed, 143 insertions(+), 6 deletions(-) create mode 100644 docker/mongodb-agent-non-matrix/Dockerfile.old create mode 100644 docker/mongodb-agent/Dockerfile.old create mode 100644 docker/mongodb-kubernetes-readinessprobe/Dockerfile.old create mode 100644 docker/mongodb-kubernetes-upgrade-hook/Dockerfile.old diff --git a/docker/mongodb-agent-non-matrix/Dockerfile.old b/docker/mongodb-agent-non-matrix/Dockerfile.old new file mode 100644 index 000000000..e1c1caff2 --- /dev/null +++ b/docker/mongodb-agent-non-matrix/Dockerfile.old @@ -0,0 +1,60 @@ +ARG imagebase +FROM ${imagebase} as base + +FROM registry.access.redhat.com/ubi9/ubi-minimal + +ARG version + +LABEL name="MongoDB Agent" \ + version="${version}" \ + summary="MongoDB Agent" \ + description="MongoDB Agent" \ + vendor="MongoDB" \ + release="1" \ + maintainer="support@mongodb.com" + +# Replace libcurl-minimal and curl-minimal with the full versions +# https://bugzilla.redhat.com/show_bug.cgi?id=1994521 +RUN microdnf install -y libssh libpsl libbrotli \ + && microdnf download curl libcurl \ + && rpm -Uvh --nodeps --replacefiles "*curl*$( uname -i ).rpm" \ + && microdnf remove -y libcurl-minimal curl-minimal + +RUN microdnf install -y --disableplugin=subscription-manager --setopt=install_weak_deps=0 nss_wrapper +# Copy-pasted from https://www.mongodb.com/docs/manual/tutorial/install-mongodb-enterprise-on-red-hat-tarball/ +RUN microdnf install -y --disableplugin=subscription-manager \ + cyrus-sasl cyrus-sasl-gssapi cyrus-sasl-plain krb5-libs openldap openssl xz-libs +# Dependencies for the Agent +RUN microdnf install -y --disableplugin=subscription-manager --setopt=install_weak_deps=0 \ + net-snmp \ + net-snmp-agent-libs +RUN microdnf install -y --disableplugin=subscription-manager \ + hostname tar gzip procps jq \ + && microdnf upgrade -y \ + && rm -rf /var/lib/apt/lists/* + +RUN mkdir -p /agent \ + && mkdir -p /var/lib/mongodb-mms-automation \ + && mkdir -p /var/log/mongodb-mms-automation/ \ + && chmod -R +wr /var/log/mongodb-mms-automation/ \ + # ensure that the agent user can write the logs in OpenShift + && touch /var/log/mongodb-mms-automation/readiness.log \ + && chmod ugo+rw /var/log/mongodb-mms-automation/readiness.log + + +COPY --from=base /data/mongodb-agent.tar.gz /agent +COPY --from=base /data/mongodb-tools.tgz /agent +COPY --from=base /data/LICENSE /licenses/LICENSE + +RUN tar xfz /agent/mongodb-agent.tar.gz \ + && mv mongodb-mms-automation-agent-*/mongodb-mms-automation-agent /agent/mongodb-agent \ + && chmod +x /agent/mongodb-agent \ + && mkdir -p /var/lib/automation/config \ + && chmod -R +r /var/lib/automation/config \ + && rm /agent/mongodb-agent.tar.gz \ + && rm -r mongodb-mms-automation-agent-* + +RUN tar xfz /agent/mongodb-tools.tgz --directory /var/lib/mongodb-mms-automation/ && rm /agent/mongodb-tools.tgz + +USER 2000 +CMD ["/agent/mongodb-agent", "-cluster=/var/lib/automation/config/automation-config.json"] diff --git a/docker/mongodb-agent/Dockerfile.old b/docker/mongodb-agent/Dockerfile.old new file mode 100644 index 000000000..08d8746d8 --- /dev/null +++ b/docker/mongodb-agent/Dockerfile.old @@ -0,0 +1,64 @@ +ARG imagebase +FROM ${imagebase} as base + +FROM registry.access.redhat.com/ubi9/ubi-minimal + +ARG version + +LABEL name="MongoDB Agent" \ + version="${version}" \ + summary="MongoDB Agent" \ + description="MongoDB Agent" \ + vendor="MongoDB" \ + release="1" \ + maintainer="support@mongodb.com" + +COPY --from=base /data/probe.sh /opt/scripts/probe.sh +COPY --from=base /data/readinessprobe /opt/scripts/readinessprobe +COPY --from=base /data/version-upgrade-hook /opt/scripts/version-upgrade-hook +COPY --from=base /data/agent-launcher-lib.sh /opt/scripts/agent-launcher-lib.sh +COPY --from=base /data/agent-launcher.sh /opt/scripts/agent-launcher.sh +COPY --from=base /data/LICENSE /licenses/LICENSE + +# Replace libcurl-minimal and curl-minimal with the full versions +# https://bugzilla.redhat.com/show_bug.cgi?id=1994521 +RUN microdnf install -y libssh libpsl libbrotli \ + && microdnf download curl libcurl \ + && rpm -Uvh --nodeps --replacefiles "*curl*$( uname -i ).rpm" \ + && microdnf remove -y libcurl-minimal curl-minimal + +RUN microdnf install -y --disableplugin=subscription-manager --setopt=install_weak_deps=0 nss_wrapper +# Copy-pasted from https://www.mongodb.com/docs/manual/tutorial/install-mongodb-enterprise-on-red-hat-tarball/ +RUN microdnf install -y --disableplugin=subscription-manager \ + cyrus-sasl cyrus-sasl-gssapi cyrus-sasl-plain krb5-libs openldap openssl xz-libs +# Dependencies for the Agent +RUN microdnf install -y --disableplugin=subscription-manager --setopt=install_weak_deps=0 \ + net-snmp \ + net-snmp-agent-libs +RUN microdnf install -y --disableplugin=subscription-manager \ + hostname tar gzip procps jq \ + && microdnf upgrade -y \ + && rm -rf /var/lib/apt/lists/* + + +COPY --from=base /data/mongodb_tools_ubi.tgz /tools/mongodb_tools.tgz +COPY --from=base /data/mongodb_agent_ubi.tgz /agent/mongodb_agent.tgz + +RUN tar xfz /tools/mongodb_tools.tgz +RUN mv mongodb-database-tools-*/bin/* /tools +RUN chmod +x /tools/* +RUN rm /tools/mongodb_tools.tgz +RUN rm -rf /mongodb-database-tools-* + +RUN tar xfz /agent/mongodb_agent.tgz +RUN mv mongodb-mms-automation-agent-*/mongodb-mms-automation-agent /agent/mongodb-agent +RUN chmod +x /agent/mongodb-agent +RUN rm /agent/mongodb_agent.tgz +RUN rm -rf mongodb-mms-automation-agent-* + +RUN mkdir -p /var/lib/automation/config +RUN chmod -R +r /var/lib/automation/config + +USER 2000 + +HEALTHCHECK --timeout=30s CMD ls /opt/scripts/readinessprobe || exit 1 diff --git a/docker/mongodb-kubernetes-readinessprobe/Dockerfile.old b/docker/mongodb-kubernetes-readinessprobe/Dockerfile.old new file mode 100644 index 000000000..17c590526 --- /dev/null +++ b/docker/mongodb-kubernetes-readinessprobe/Dockerfile.old @@ -0,0 +1,6 @@ +ARG imagebase +FROM ${imagebase} as base + +FROM registry.access.redhat.com/ubi9/ubi-minimal + +COPY --from=base /probes/readinessprobe /probes/readinessprobe diff --git a/docker/mongodb-kubernetes-upgrade-hook/Dockerfile.old b/docker/mongodb-kubernetes-upgrade-hook/Dockerfile.old new file mode 100644 index 000000000..362831582 --- /dev/null +++ b/docker/mongodb-kubernetes-upgrade-hook/Dockerfile.old @@ -0,0 +1,6 @@ +ARG imagebase +FROM ${imagebase} as base + +FROM registry.access.redhat.com/ubi9/ubi-minimal + +COPY --from=base /version-upgrade-hook /version-upgrade-hook diff --git a/inventories/agent.yaml b/inventories/agent.yaml index 3e7fa7d00..42f5eaa21 100644 --- a/inventories/agent.yaml +++ b/inventories/agent.yaml @@ -38,7 +38,7 @@ images: buildargs: imagebase: $(inputs.params.registry)/mongodb-agent-ubi:$(inputs.params.version)-context version: $(inputs.params.version) - dockerfile: docker/mongodb-agent/Dockerfile + dockerfile: docker/mongodb-agent/Dockerfile.old output: - registry: $(inputs.params.registry)/mongodb-agent-ubi tag: $(inputs.params.version) diff --git a/inventories/agent_non_matrix.yaml b/inventories/agent_non_matrix.yaml index 21df88d92..08531d9ed 100644 --- a/inventories/agent_non_matrix.yaml +++ b/inventories/agent_non_matrix.yaml @@ -46,7 +46,7 @@ images: buildargs: imagebase: $(inputs.params.registry)/mongodb-agent-ubi:$(inputs.params.version)-context-$(inputs.params.architecture) version: $(inputs.params.version) - dockerfile: docker/mongodb-agent-non-matrix/Dockerfile + dockerfile: docker/mongodb-agent-non-matrix/Dockerfile.old labels: quay.expires-after: 48h @@ -61,4 +61,4 @@ images: task_type: dockerfile_template tags: ["release"] output: - - dockerfile: $(inputs.params.s3_bucket)/$(inputs.params.version)/ubi/Dockerfile \ No newline at end of file + - dockerfile: $(inputs.params.s3_bucket)/$(inputs.params.version)/ubi/Dockerfile diff --git a/inventories/database.yaml b/inventories/database.yaml index b179a30cf..f4a8692c0 100644 --- a/inventories/database.yaml +++ b/inventories/database.yaml @@ -33,7 +33,8 @@ images: buildargs: imagebase: $(inputs.params.registry)/mongodb-kubernetes-database-context:$(inputs.params.version_id) output: - - dockerfile: $(functions.tempfile) + - registry: $(inputs.params.registry)/mongodb-kubernetes-database + tag: $(inputs.params.version_id) - name: master-latest task_type: tag_image diff --git a/inventories/readiness_probe.yaml b/inventories/readiness_probe.yaml index 3ca2e5cb7..c871ac093 100644 --- a/inventories/readiness_probe.yaml +++ b/inventories/readiness_probe.yaml @@ -44,7 +44,7 @@ images: buildargs: imagebase: $(inputs.params.registry)/mongodb-kubernetes-readinessprobe:$(inputs.params.version_id)-context-$(inputs.params.architecture) version: $(inputs.params.version) - dockerfile: docker/mongodb-kubernetes-readinessprobe/Dockerfile + dockerfile: docker/mongodb-kubernetes-readinessprobe/Dockerfile.old labels: quay.expires-after: 48h diff --git a/inventories/upgrade_hook.yaml b/inventories/upgrade_hook.yaml index 9407d0427..0540fb8e8 100644 --- a/inventories/upgrade_hook.yaml +++ b/inventories/upgrade_hook.yaml @@ -44,7 +44,7 @@ images: buildargs: imagebase: $(inputs.params.registry)/mongodb-kubernetes-operator-version-upgrade-post-start-hook:$(inputs.params.version_id)-context-$(inputs.params.architecture) version: $(inputs.params.version) - dockerfile: docker/mongodb-kubernetes-upgrade-hook/Dockerfile + dockerfile: docker/mongodb-kubernetes-upgrade-hook/Dockerfile.old labels: quay.expires-after: 48h From ede644729a8259b460aa6619c9e5708454fbb8da Mon Sep 17 00:00:00 2001 From: Julien Benhaim Date: Thu, 24 Jul 2025 18:08:39 +0200 Subject: [PATCH 4/8] Remove code used to generate the dockerfiles --- inventories/database.yaml | 5 +- inventories/init_appdb.yaml | 2 - inventories/init_database.yaml | 3 +- inventories/init_om.yaml | 3 +- inventories/om.yaml | 3 +- inventory.yaml | 1 - lib/sonar/test/test_final_dockerfiles.py | 101 ----------------------- 7 files changed, 5 insertions(+), 113 deletions(-) delete mode 100644 lib/sonar/test/test_final_dockerfiles.py diff --git a/inventories/database.yaml b/inventories/database.yaml index f4a8692c0..05d123f31 100644 --- a/inventories/database.yaml +++ b/inventories/database.yaml @@ -11,7 +11,6 @@ images: stages: - name: database-build-context task_type: docker_build - tags: ["final_dockerfile"] dockerfile: Dockerfile.builder output: - registry: $(inputs.params.registry)/mongodb-kubernetes-database-context @@ -20,7 +19,7 @@ images: - name: init-appdb-template-ubi task_type: dockerfile_template distro: ubi - tags: ["ubi", "final_dockerfile"] + tags: ["ubi"] inputs: - version output: @@ -29,7 +28,7 @@ images: - name: database-build-ubi task_type: docker_build dockerfile: $(stages['init-appdb-template-ubi'].outputs[0].dockerfile) - tags: ["ubi", "final_dockerfile"] + tags: ["ubi"] buildargs: imagebase: $(inputs.params.registry)/mongodb-kubernetes-database-context:$(inputs.params.version_id) output: diff --git a/inventories/init_appdb.yaml b/inventories/init_appdb.yaml index 228968135..18cb6db0f 100644 --- a/inventories/init_appdb.yaml +++ b/inventories/init_appdb.yaml @@ -12,7 +12,6 @@ images: stages: - name: init-appdb-build-context task_type: docker_build - tags: ["final_dockerfile"] dockerfile: docker/mongodb-kubernetes-init-appdb/Dockerfile.builder buildargs: mongodb_tools_url_ubi: $(inputs.params.mongodb_tools_url_ubi) @@ -23,7 +22,6 @@ images: - name: init-appdb-template-ubi task_type: dockerfile_template template_file_extension: ubi_minimal - tags: ["final_dockerfile"] inputs: - is_appdb output: diff --git a/inventories/init_database.yaml b/inventories/init_database.yaml index 15901536c..57ab81679 100644 --- a/inventories/init_database.yaml +++ b/inventories/init_database.yaml @@ -12,7 +12,6 @@ images: stages: - name: init-database-build-context task_type: docker_build - tags: ["final_dockerfile"] dockerfile: docker/mongodb-kubernetes-init-database/Dockerfile.builder buildargs: mongodb_tools_url_ubi: $(inputs.params.mongodb_tools_url_ubi) @@ -25,7 +24,7 @@ images: - name: init-database-template-ubi task_type: dockerfile_template template_file_extension: ubi_minimal - tags: ["ubi", "final_dockerfile"] + tags: ["ubi"] inputs: - is_appdb output: diff --git a/inventories/init_om.yaml b/inventories/init_om.yaml index c05d34c3c..f3d310470 100644 --- a/inventories/init_om.yaml +++ b/inventories/init_om.yaml @@ -11,7 +11,6 @@ images: stages: - name: init-ops-manager-build-context task_type: docker_build - tags: ["final_dockerfile"] dockerfile: Dockerfile.builder output: - registry: $(inputs.params.registry)/mongodb-kubernetes-init-ops-manager-context @@ -20,7 +19,7 @@ images: - name: init-ops-manager-template-ubi task_type: dockerfile_template template_file_extension: ubi_minimal - tags: ["ubi", "final_dockerfile"] + tags: ["ubi"] inputs: - version output: diff --git a/inventories/om.yaml b/inventories/om.yaml index d9b802376..e4daf3103 100644 --- a/inventories/om.yaml +++ b/inventories/om.yaml @@ -13,7 +13,6 @@ images: stages: - name: ops-manager-context task_type: docker_build - tags: ["final_dockerfile"] dockerfile: docker/mongodb-enterprise-ops-manager/Dockerfile.builder output: - registry: $(inputs.params.registry)/ops-manager-context @@ -22,7 +21,7 @@ images: - name: ops-manager-template-ubi task_type: dockerfile_template template_file_extension: ubi - tags: ["ubi", "final_dockerfile"] + tags: ["ubi"] inputs: - om_download_url - version diff --git a/inventory.yaml b/inventory.yaml index ba92a1504..23690c328 100644 --- a/inventory.yaml +++ b/inventory.yaml @@ -44,7 +44,6 @@ images: - name: operator-template-ubi task_type: dockerfile_template - tags: ["final_dockerfile"] distro: ubi inputs: - version diff --git a/lib/sonar/test/test_final_dockerfiles.py b/lib/sonar/test/test_final_dockerfiles.py deleted file mode 100644 index f4516baea..000000000 --- a/lib/sonar/test/test_final_dockerfiles.py +++ /dev/null @@ -1,101 +0,0 @@ -from unittest import skip - -from ..sonar import process_image - - -@skip("This test case is only used to generate the final Dockerfile for ops-manager") -def test_build_om_dockerfile(): - process_image( - image_name="ops-manager", - skip_tags=["release"], - include_tags=["final_dockerfile"], - build_args={ - "registry": "localhost:5000", - "version": "8.0.7", - "om_download_url": "https://downloads.mongodb.com/on-prem-mms/tar/mongodb-mms-8.0.7.500.20250505T1426Z.tar.gz", - }, - build_options={}, - inventory="inventories/om.yaml", - ) - - -@skip("This test case is only used to generate the final Dockerfile for database") -def test_build_database_dockerfile(): - process_image( - image_name="database", - skip_tags=["release"], - include_tags=["final_dockerfile"], - build_args={ - "registry": "localhost:5000", - "version": "1.1.0", - }, - build_options={}, - inventory="inventories/database.yaml", - ) - - -@skip("This test case is only used to generate the final Dockerfile for init appdb") -def test_build_init_appdb_dockerfile(): - process_image( - image_name="init-appdb", - skip_tags=["release"], - include_tags=["final_dockerfile"], - build_args={ - "registry": "localhost:5000", - "version": "1.1.0", - "is_appdb": True, - "mongodb_tools_url_ubi": "https://downloads.mongodb.org/tools/db/mongodb-database-tools-rhel93-x86_64-100.12.0.tgz", - }, - build_options={}, - inventory="inventories/init_appdb.yaml", - ) - - -@skip("This test case is only used to generate the final Dockerfile for init database") -def test_build_init_database_dockerfile(): - process_image( - image_name="init-database", - skip_tags=["release"], - include_tags=["final_dockerfile"], - build_args={ - "registry": "localhost:5000", - "version": "1.1.0", - "is_appdb": False, - "mongodb_tools_url_ubi": "https://downloads.mongodb.org/tools/db/mongodb-database-tools-rhel93-x86_64-100.12.0.tgz", - }, - build_options={}, - inventory="inventories/init_database.yaml", - ) - - -@skip("This test case is only used to generate the final Dockerfile for init ops manager") -def test_build_init_ops_manager_dockerfile(): - process_image( - image_name="init-ops-manager", - skip_tags=["release"], - include_tags=["final_dockerfile"], - build_args={ - "registry": "localhost:5000", - "version": "1.1.0", - }, - build_options={}, - inventory="inventories/init_om.yaml", - ) - - -def test_build_operator_dockerfile(): - process_image( - image_name="mongodb-kubernetes", - skip_tags=["release"], - include_tags=["final_dockerfile"], - build_args={ - "version": "1.1.0", - "registry": "localhost:5000", - "release_version": "1.1.0", - "log_automation_config_diff": "false", - "use_race": "false", - "debug": False, - }, - build_options={}, - inventory="inventory.yaml", - ) From b6a36ca0b7c7302b17e23d1f41fe106aba5212c1 Mon Sep 17 00:00:00 2001 From: Julien Benhaim Date: Thu, 24 Jul 2025 18:11:29 +0200 Subject: [PATCH 5/8] Revert permissions change --- lib/sonar/sonar.py | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 lib/sonar/sonar.py diff --git a/lib/sonar/sonar.py b/lib/sonar/sonar.py old mode 100755 new mode 100644 From 5ccc233aaaf979933d87e25b6889855c30c37e76 Mon Sep 17 00:00:00 2001 From: Julien Benhaim Date: Fri, 25 Jul 2025 14:20:19 +0200 Subject: [PATCH 6/8] Remove .plain files --- .../Dockerfile.plain | 84 ------------------ .../Dockerfile.plain | 87 ------------------- .../Dockerfile.plain | 35 -------- .../Dockerfile.plain | 34 -------- .../Dockerfile.plain | 26 ------ .../Dockerfile.plain | 38 -------- 6 files changed, 304 deletions(-) delete mode 100644 docker/mongodb-enterprise-ops-manager/Dockerfile.plain delete mode 100644 docker/mongodb-kubernetes-database/Dockerfile.plain delete mode 100644 docker/mongodb-kubernetes-init-appdb/Dockerfile.plain delete mode 100644 docker/mongodb-kubernetes-init-database/Dockerfile.plain delete mode 100644 docker/mongodb-kubernetes-init-ops-manager/Dockerfile.plain delete mode 100644 docker/mongodb-kubernetes-operator/Dockerfile.plain diff --git a/docker/mongodb-enterprise-ops-manager/Dockerfile.plain b/docker/mongodb-enterprise-ops-manager/Dockerfile.plain deleted file mode 100644 index 717014b97..000000000 --- a/docker/mongodb-enterprise-ops-manager/Dockerfile.plain +++ /dev/null @@ -1,84 +0,0 @@ -ARG imagebase -FROM ${imagebase} as base - -FROM registry.access.redhat.com/ubi9/ubi-minimal - - -LABEL name="MongoDB Enterprise Ops Manager" \ - maintainer="support@mongodb.com" \ - vendor="MongoDB" \ - version="8.0.7" \ - release="1" \ - summary="MongoDB Enterprise Ops Manager Image" \ - description="MongoDB Enterprise Ops Manager" - - -ENV MMS_HOME /mongodb-ops-manager -ENV MMS_PROP_FILE ${MMS_HOME}/conf/conf-mms.properties -ENV MMS_CONF_FILE ${MMS_HOME}/conf/mms.conf -ENV MMS_LOG_DIR ${MMS_HOME}/logs -ENV MMS_TMP_DIR ${MMS_HOME}/tmp - -EXPOSE 8080 - -# OpsManager docker image needs to have the MongoDB dependencies because the -# backup daemon is running its database locally - - -# Replace libcurl-minimal and curl-minimal with the full versions -# https://bugzilla.redhat.com/show_bug.cgi?id=1994521 -RUN microdnf install -y libssh libpsl libbrotli \ - && microdnf download curl libcurl \ - && rpm -Uvh --nodeps --replacefiles "*curl*$( uname -i ).rpm" \ - && microdnf remove -y libcurl-minimal curl-minimal - -RUN microdnf install --disableplugin=subscription-manager -y \ - cyrus-sasl \ - cyrus-sasl-gssapi \ - cyrus-sasl-plain \ - krb5-libs \ - libpcap \ - lm_sensors-libs \ - net-snmp \ - net-snmp-agent-libs \ - openldap \ - openssl \ - tar \ - rpm-libs \ - net-tools \ - procps-ng \ - ncurses - - -COPY --from=base /data/licenses /licenses/ - -COPY --from=base /data/scripts /opt/scripts - - - -RUN curl --fail -L -o ops_manager.tar.gz https://downloads.mongodb.com/on-prem-mms/tar/mongodb-mms-8.0.7.500.20250505T1426Z.tar.gz \ - && tar -xzf ops_manager.tar.gz \ - && rm ops_manager.tar.gz \ - && mv mongodb-mms* "${MMS_HOME}" - - -# permissions -RUN chmod -R 0777 "${MMS_LOG_DIR}" \ - && chmod -R 0777 "${MMS_TMP_DIR}" \ - && chmod -R 0775 "${MMS_HOME}/conf" \ - && chmod -R 0775 "${MMS_HOME}/jdk" \ - && mkdir "${MMS_HOME}/mongodb-releases/" \ - && chmod -R 0775 "${MMS_HOME}/mongodb-releases" \ - && chmod -R 0777 "${MMS_CONF_FILE}" \ - && chmod -R 0777 "${MMS_PROP_FILE}" - -# The "${MMS_HOME}/conf" will be populated by the docker-entry-point.sh. -# For now we need to move into the templates directory. -RUN cp -r "${MMS_HOME}/conf" "${MMS_HOME}/conf-template" - -USER 2000 - -# operator to change the entrypoint to: /mongodb-ops-manager/bin/mongodb-mms start_mms (or a wrapper around this) -ENTRYPOINT [ "sleep infinity" ] - - diff --git a/docker/mongodb-kubernetes-database/Dockerfile.plain b/docker/mongodb-kubernetes-database/Dockerfile.plain deleted file mode 100644 index ea7b4a8e7..000000000 --- a/docker/mongodb-kubernetes-database/Dockerfile.plain +++ /dev/null @@ -1,87 +0,0 @@ -ARG imagebase -FROM ${imagebase} as base - -FROM registry.access.redhat.com/ubi8/ubi-minimal - - - -LABEL name="MongoDB Kubernetes Database" \ - version="1.1.0" \ - summary="MongoDB Kubernetes Database Image" \ - description="MongoDB Kubernetes Database Image" \ - vendor="MongoDB" \ - release="1" \ - maintainer="support@mongodb.com" - - - - - -ENV MMS_HOME /mongodb-automation -ENV MMS_LOG_DIR /var/log/mongodb-mms-automation - - - -RUN microdnf update -y && rm -rf /var/cache/yum - -# these are the packages needed for the agent -RUN microdnf install -y --disableplugin=subscription-manager --setopt=install_weak_deps=0 nss_wrapper -RUN microdnf install -y --disableplugin=subscription-manager \ - hostname \ - procps - - -# these are the packages needed for MongoDB -# (https://docs.mongodb.com/manual/tutorial/install-mongodb-enterprise-on-red-hat-tarball/ "RHEL/CentOS 8" tab) -RUN microdnf install -y --disableplugin=subscription-manager \ - cyrus-sasl \ - cyrus-sasl-gssapi \ - cyrus-sasl-plain \ - krb5-libs \ - libcurl \ - lm_sensors-libs \ - net-snmp \ - net-snmp-agent-libs \ - openldap \ - openssl \ - jq \ - tar \ - xz-libs \ - findutils - - - -RUN ln -s /usr/lib64/libsasl2.so.3 /usr/lib64/libsasl2.so.2 - - -# Set the required perms -RUN mkdir -p "${MMS_LOG_DIR}" \ - && chmod 0775 "${MMS_LOG_DIR}" \ - && mkdir -p /var/lib/mongodb-mms-automation \ - && chmod 0775 /var/lib/mongodb-mms-automation \ - && mkdir -p /data \ - && chmod 0775 /data \ - && mkdir -p /journal \ - && chmod 0775 /journal \ - && mkdir -p "${MMS_HOME}" \ - && chmod -R 0775 "${MMS_HOME}" - - - - -# USER needs to be set for this image to pass RedHat verification. Some customers have these requirements as well -# It does not matter what number it is, as long as it is set to something. -# However, OpenShift will run the container as a random user, -# and the number in this configuration is not relevant. -USER 2000 - - -# The docker image doesn't have any scripts so by default does nothing -# The script will be copied in runtime from init containers and the operator is expected -# to override the COMMAND -ENTRYPOINT ["sleep infinity"] - - -COPY --from=base /data/licenses/mongodb-kubernetes-database /licenses/mongodb-kubernetes-database - - diff --git a/docker/mongodb-kubernetes-init-appdb/Dockerfile.plain b/docker/mongodb-kubernetes-init-appdb/Dockerfile.plain deleted file mode 100644 index d0c5d967a..000000000 --- a/docker/mongodb-kubernetes-init-appdb/Dockerfile.plain +++ /dev/null @@ -1,35 +0,0 @@ -ARG imagebase -FROM ${imagebase} as base - -FROM registry.access.redhat.com/ubi8/ubi-minimal - -ARG version -LABEL name="MongoDB Kubernetes Init AppDB" \ - version="mongodb-kubernetes-init-appdb-${version}" \ - summary="MongoDB Kubernetes AppDB Init Image" \ - description="Startup Scripts for MongoDB Enterprise Application Database for Ops Manager" \ - release="1" \ - vendor="MongoDB" \ - maintainer="support@mongodb.com" - -COPY --from=base /data/readinessprobe /probes/readinessprobe -COPY --from=base /data/probe.sh /probes/probe.sh -COPY --from=base /data/scripts/ /scripts/ -COPY --from=base /data/licenses /licenses/ -COPY --from=base /data/version-upgrade-hook /probes/version-upgrade-hook - - -RUN microdnf -y update --nodocs \ - && microdnf -y install --nodocs tar gzip \ - && microdnf clean all - -COPY --from=base /data/mongodb_tools_ubi.tgz /tools/mongodb_tools.tgz - - -RUN tar xfz /tools/mongodb_tools.tgz --directory /tools \ - && rm /tools/mongodb_tools.tgz - -USER 2000 -ENTRYPOINT [ "/bin/cp", "-f", "-r", "/scripts/agent-launcher.sh", "/scripts/agent-launcher-lib.sh", "/probes/readinessprobe", "/probes/probe.sh", "/tools", "/opt/scripts/" ] - - diff --git a/docker/mongodb-kubernetes-init-database/Dockerfile.plain b/docker/mongodb-kubernetes-init-database/Dockerfile.plain deleted file mode 100644 index ecf2e32ae..000000000 --- a/docker/mongodb-kubernetes-init-database/Dockerfile.plain +++ /dev/null @@ -1,34 +0,0 @@ -ARG imagebase -FROM ${imagebase} as base - -FROM registry.access.redhat.com/ubi8/ubi-minimal - -ARG version -LABEL name="MongoDB Kubernetes Init Database" \ - version="mongodb-kubernetes-init-database-${version}" \ - summary="MongoDB Kubernetes Database Init Image" \ - description="Startup Scripts for MongoDB Enterprise Database" \ - release="1" \ - vendor="MongoDB" \ - maintainer="support@mongodb.com" - -COPY --from=base /data/readinessprobe /probes/readinessprobe -COPY --from=base /data/probe.sh /probes/probe.sh -COPY --from=base /data/scripts/ /scripts/ -COPY --from=base /data/licenses /licenses/ - - -RUN microdnf -y update --nodocs \ - && microdnf -y install --nodocs tar gzip \ - && microdnf clean all - -COPY --from=base /data/mongodb_tools_ubi.tgz /tools/mongodb_tools.tgz - - -RUN tar xfz /tools/mongodb_tools.tgz --directory /tools \ - && rm /tools/mongodb_tools.tgz - -USER 2000 -ENTRYPOINT [ "/bin/cp", "-f", "-r", "/scripts/agent-launcher.sh", "/scripts/agent-launcher-lib.sh", "/probes/readinessprobe", "/probes/probe.sh", "/tools", "/opt/scripts/" ] - - diff --git a/docker/mongodb-kubernetes-init-ops-manager/Dockerfile.plain b/docker/mongodb-kubernetes-init-ops-manager/Dockerfile.plain deleted file mode 100644 index f841b9e35..000000000 --- a/docker/mongodb-kubernetes-init-ops-manager/Dockerfile.plain +++ /dev/null @@ -1,26 +0,0 @@ -ARG imagebase -FROM ${imagebase} as base - -FROM registry.access.redhat.com/ubi9/ubi-minimal - -LABEL name="MongoDB Kubernetes Ops Manager Init" \ - maintainer="support@mongodb.com" \ - vendor="MongoDB" \ - version="mongodb-kubernetes-init-ops-manager-1.1.0" \ - release="1" \ - summary="MongoDB Kubernetes Ops Manager Init Image" \ - description="Startup Scripts for MongoDB Enterprise Ops Manager" - - -COPY --from=base /data/scripts /scripts -COPY --from=base /data/licenses /licenses - - -RUN microdnf -y update --nodocs \ - && microdnf clean all - - -USER 2000 -ENTRYPOINT [ "/bin/cp", "-f", "/scripts/docker-entry-point.sh", "/scripts/backup-daemon-liveness-probe.sh", "/scripts/mmsconfiguration", "/scripts/backup-daemon-readiness-probe", "/opt/scripts/" ] - - diff --git a/docker/mongodb-kubernetes-operator/Dockerfile.plain b/docker/mongodb-kubernetes-operator/Dockerfile.plain deleted file mode 100644 index 7466187f7..000000000 --- a/docker/mongodb-kubernetes-operator/Dockerfile.plain +++ /dev/null @@ -1,38 +0,0 @@ -# -# Base Template Dockerfile for Operator Image. -# - -ARG imagebase -FROM ${imagebase} as base - -FROM registry.access.redhat.com/ubi9/ubi-minimal - - -LABEL name="MongoDB Kubernetes Operator" \ - maintainer="support@mongodb.com" \ - vendor="MongoDB" \ - version="1.1.0" \ - release="1" \ - summary="MongoDB Kubernetes Operator Image" \ - description="MongoDB Kubernetes Operator Image" - - -# Building an UBI-based image: https://red.ht/3n6b9y0 -RUN microdnf update \ - --disableplugin=subscription-manager \ - --disablerepo=* --enablerepo=ubi-9-appstream-rpms --enablerepo=ubi-9-baseos-rpms -y \ - && rm -rf /var/cache/yum -RUN microdnf install -y glibc-langpack-en - - - - -COPY --from=base /data/mongodb-kubernetes-operator /usr/local/bin/mongodb-kubernetes-operator -COPY --from=base /data/om_version_mapping.json /usr/local/om_version_mapping.json -COPY --from=base /data/licenses /licenses/ - -USER 2000 - -ENTRYPOINT exec /usr/local/bin/mongodb-kubernetes-operator - - From d027dfce4de27845844fdb13ec8a7cae054ff5c5 Mon Sep 17 00:00:00 2001 From: Julien Benhaim Date: Fri, 25 Jul 2025 14:23:42 +0200 Subject: [PATCH 7/8] Add tag back --- inventories/init_appdb.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/inventories/init_appdb.yaml b/inventories/init_appdb.yaml index 18cb6db0f..d810e7f46 100644 --- a/inventories/init_appdb.yaml +++ b/inventories/init_appdb.yaml @@ -22,6 +22,7 @@ images: - name: init-appdb-template-ubi task_type: dockerfile_template template_file_extension: ubi_minimal + tags: ["ubi"] inputs: - is_appdb output: From b11c684db5f3bc367653763d3c93f6efa3d671ac Mon Sep 17 00:00:00 2001 From: Julien Benhaim Date: Mon, 28 Jul 2025 10:10:31 +0200 Subject: [PATCH 8/8] Revert to initial file --- inventories/init_appdb.yaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/inventories/init_appdb.yaml b/inventories/init_appdb.yaml index d810e7f46..50d5d4199 100644 --- a/inventories/init_appdb.yaml +++ b/inventories/init_appdb.yaml @@ -6,13 +6,13 @@ images: - name: init-appdb vars: context: . - template_context: docker/mongodb-kubernetes-init-appdb + template_context: docker/mongodb-kubernetes-init-database platform: linux/amd64 stages: - name: init-appdb-build-context task_type: docker_build - dockerfile: docker/mongodb-kubernetes-init-appdb/Dockerfile.builder + dockerfile: docker/mongodb-kubernetes-init-database/Dockerfile.builder buildargs: mongodb_tools_url_ubi: $(inputs.params.mongodb_tools_url_ubi) output: