diff --git a/src/test/docker/directory/Dockerfile b/src/test/docker/directory/Dockerfile
index 3b2b3ec..ee92085 100644
--- a/src/test/docker/directory/Dockerfile
+++ b/src/test/docker/directory/Dockerfile
@@ -1,4 +1,4 @@
 FROM osixia/openldap:1.3.0
 
 COPY 001_eduperson.ldif /container/service/slapd/assets/config/bootstrap/ldif
-COPY 999_users.ldif /container/service/slapd/assets/config/bootstrap/ldif
\ No newline at end of file
+COPY 999_users.ldif /container/service/slapd/assets/config/bootstrap/ldif
diff --git a/src/test/docker/docker-compose.yml b/src/test/docker/docker-compose.yml
index 0d70151..c0de9bc 100644
--- a/src/test/docker/docker-compose.yml
+++ b/src/test/docker/docker-compose.yml
@@ -8,7 +8,8 @@ services:
       - "--entrypoints.web-secure.address=:443"
       - "--providers.file.directory=/configuration/"
       - "--providers.file.watch=true"
-      # - "--log.level=DEBUG"
+      - "--log.level=DEBUG"
+      - "--serversTransport.insecureSkipVerify=true"
     networks:
       reverse-proxy:
         aliases:
@@ -28,15 +29,21 @@ services:
     networks:
       - idp
       - grouper
+    ports:
+      - 389:389
     volumes:
       - directory_data:/var/lib/ldap
       - directory_config:/etc/ldap/slapd.d
-      - ./directory/certs:/container/service/slapd/assets/certs
+      - ./directory/certs:/tmp/certs:ro
     environment:
       LDAP_BASE_DN: "dc=unicon,dc=local"
       LDAP_DOMAIN: "unicon.local"
       HOSTNAME: "directory"
       LDAP_TLS_VERIFY_CLIENT: "try"
+      LDAP_SEED_INTERNAL_LDAP_TLS_CRT_FILE: /tmp/certs/ldap.crt
+      LDAP_SEED_INTERNAL_LDAP_TLS_KEY_FILE: /tmp/certs/ldap.key
+      LDAP_SEED_INTERNAL_LDAP_TLS_CA_CRT_FILE: /tmp/certs/ca.crt
+      LDAP_SEED_INTERNAL_LDAP_TLS_DH_PARAM_FILE: /tmp/certs/dhparam.pem
   database:
     image: postgres
     networks:
@@ -61,9 +68,11 @@ services:
     networks:
       - idp
       - reverse-proxy
+    #ports:
+    #  - 8443:443
     volumes:
-      - ./directory/certs/ca.crt:/opt/shibboleth-idp/credentials/ldap-server.crt
-      - ./grouper/config/sp-metadata.xml:/opt/shibboleth-idp/metadata/sp-metadata.xml
+      - ./directory/certs/ca.crt:/opt/shibboleth-idp/credentials/ldap-server.crt:ro
+      - ./grouper/config/sp-metadata.xml:/opt/shibboleth-idp/metadata/sp-metadata.xml:ro
     healthcheck:
       disable: true
   grouper-ui:
@@ -85,11 +94,17 @@ services:
     volumes:
       - ../../../target/grouper-authentication-plugin-0.0.1-SNAPSHOT.jar:/opt/grouper/plugins/grouper-authentication-plugin.jar
       - ./grouper/config/grouper.properties:/opt/grouper/grouperWebapp/WEB-INF/classes/grouper.properties
-      - ./grouper/config/grouper-ui.properties:/opt/grouper/grouperWebapp/WEB-INF/classes/grouper-ui.properties
+      ## Uncomment one of the grouper-ui.properties below depending on the authentication method
+      ##   -- OIDC --
+      - ./grouper/config/grouper-ui.properties.oidc:/opt/grouper/grouperWebapp/WEB-INF/classes/grouper-ui.properties
+      ##   -- SAML --
+      #- ./grouper/config/grouper-ui.properties.saml:/opt/grouper/grouperWebapp/WEB-INF/classes/grouper-ui.properties
+      ##   -- CAS --
+      #- ./grouper/config/grouper-ui.properties.cas:/opt/grouper/grouperWebapp/WEB-INF/classes/grouper-ui.properties
       - ./grouper/config/grouper-loader.properties:/opt/grouper/grouperWebapp/WEB-INF/classes/grouper-loader.properties
       - ./grouper/config/subject.properties:/opt/grouper/grouperWebapp/WEB-INF/classes/subject.properties
       - ./shibboleth-idp/opt-shibboleth-idp/metadata/idp-metadata.xml:/opt/grouper/idp-metadata.xml
-      - ./grouper/cacerts:/usr/lib/jvm/java-17-amazon-corretto/lib/security/cacerts
+      - ./grouper/certs/unicon.local.pem:/opt/grouper/certs/client/unicon.local.pem
     environment:
       GROUPER_DATABASE_URL: "jdbc:postgresql://database/grouper"
       GROUPER_DATABASE_USERNAME: "grouper"
diff --git a/src/test/docker/grouper/cacerts b/src/test/docker/grouper/cacerts
deleted file mode 100644
index fc55fe3..0000000
Binary files a/src/test/docker/grouper/cacerts and /dev/null differ
diff --git a/src/test/docker/grouper/certs/unicon.local.pem b/src/test/docker/grouper/certs/unicon.local.pem
new file mode 100644
index 0000000..8d45927
--- /dev/null
+++ b/src/test/docker/grouper/certs/unicon.local.pem
@@ -0,0 +1,19 @@
+-----BEGIN CERTIFICATE-----
+MIIDCDCCAfCgAwIBAgIJANdpvkovSXs6MA0GCSqGSIb3DQEBCwUAMBkxFzAVBgNV
+BAMMDioudW5pY29uLmxvY2FsMB4XDTIwMDUyNzE3MzE1OVoXDTMwMDUyNzE3MzE1
+OVowGTEXMBUGA1UEAwwOKi51bmljb24ubG9jYWwwggEiMA0GCSqGSIb3DQEBAQUA
+A4IBDwAwggEKAoIBAQCh9zduMpOqWDPfx5vHSBoWDwk44cc8XdFCD7nqi9EPHewO
+jAKCVihWKGa3OX6kQ4g6VIE7PCqdvtjq6eJ54FKuJ7FiFQweuaUXlXx5tdiWYfVe
++BV7jaLJGy0iniPgx8Pu9ajQOOINcmLwixYkTe+OBfeMgeivk0+o58/Lmkl2FyAv
+IvGA2Glxf8QtxQwHgtQLU3aHRlgi6YHSIxolvX+CuDvj4xsgLBdCphYkJtUXmaKO
+frQRxnHVxUUptWptqbwJPxrOMnIIdteRnduo+/i0RZ33+tC5W61Cr2uyoDGUzmKE
+HKgfTMxLeqJLtm+sB74xmI3Fsnq3qfWajZLqUyz5AgMBAAGjUzBRMB0GA1UdDgQW
+BBROeSN15J2wAW9OMZAdPIz84DEOsjAfBgNVHSMEGDAWgBROeSN15J2wAW9OMZAd
+PIz84DEOsjAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQASo38W
+sqw8vijAs3DSYUCjFjlAvlwjsXU0y4IpelmgYSWD0Lqfb9/5jEu06F8hzLMSzmAL
+4UKIX6TwtLQb3HLvYObbjhaSSYG0Tl702dANW499QlHF/gYsCb9C6oA+5jzfHd7Y
+LS8bUv6gZkC3rP1E0kCGLJGrtvdMniAPuZ8W25SFedpR0iR7+d+lg9oOBsgjkWGc
+eKNtSJvic5dyZQCDlEzXVa3lyBOrawW9J/Sqhm0v3Tar1CVKoeXU3QV/bx7s8TWH
+YvaxQ82dOsGwZDMmPHhnJQDIQqjt2H9RJjrJy440RwyLiDr1A3/AJxrqpz98QONG
+FOhuJQXDH3YGDP7B
+-----END CERTIFICATE-----
diff --git a/src/test/docker/grouper/config/grouper-ui.properties b/src/test/docker/grouper/config/grouper-ui.properties
deleted file mode 100644
index c0c5d69..0000000
--- a/src/test/docker/grouper/config/grouper-ui.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-grouper.is.extAuth.enabled = true
-external.authentication.grouperContextUrl = https://grouper-ui.unicon.local/grouper
-
-external.authentication.provider = oidc
-external.authentication.oidc.clientId = grouper
-external.authentication.oidc.discoveryURI = https://idp.unicon.local/idp/profile/oidc/configuration
-external.authentication.oidc.secret = thisisverysecret
-external.authentication.oidc.claimAsUsername = preferred_username
-
-#external.authentication.provider = saml
-#external.authentication.saml.identityProviderEntityId = https://idp.unicon.local/idp/shibboleth
-#external.authentication.saml.serviceProviderEntityId = http://localhost:8080/grouper
-#external.authentication.saml.serviceProviderMetadataPath = file:/opt/grouper/sp-metadata.xml
-#external.authentication.saml.identityProviderMetadataPath = file:/opt/grouper/idp-metadata.xml
-#external.authentication.saml.keystorePath = file:/opt/grouper/here.key
-#external.authentication.saml.keystorePassword = testme
-#external.authentication.saml.privateKeyPassword = testme
-#external.authentication.saml.attributeAsId = urn:oid:0.9.2342.19200300.100.1.1
-
-# Note for CAS: you'll need to make sure that the CAS server SSL certificate is available in the trust store
-#external.authentication.provider = cas
-#external.authentication.cas.prefixUrl = https://idp.unicon.local/idp/profile/cas
-#external.authentication.cas.protocol = CAS20
\ No newline at end of file
diff --git a/src/test/docker/grouper/config/grouper-ui.properties.cas b/src/test/docker/grouper/config/grouper-ui.properties.cas
new file mode 100644
index 0000000..214520d
--- /dev/null
+++ b/src/test/docker/grouper/config/grouper-ui.properties.cas
@@ -0,0 +1,7 @@
+grouper.is.extAuth.enabled = true
+external.authentication.grouperContextUrl = https://grouper-ui.unicon.local/grouper
+
+# Note for CAS: you'll need to make sure that the CAS server SSL certificate is available in the trust store
+external.authentication.provider = cas
+external.authentication.cas.prefixUrl = https://idp.unicon.local/idp/profile/cas
+external.authentication.cas.protocol = CAS20
diff --git a/src/test/docker/grouper/config/grouper-ui.properties.oidc b/src/test/docker/grouper/config/grouper-ui.properties.oidc
new file mode 100644
index 0000000..d491c90
--- /dev/null
+++ b/src/test/docker/grouper/config/grouper-ui.properties.oidc
@@ -0,0 +1,8 @@
+grouper.is.extAuth.enabled = true
+external.authentication.grouperContextUrl = https://grouper-ui.unicon.local/grouper
+
+external.authentication.provider = oidc
+external.authentication.oidc.clientId = grouper
+external.authentication.oidc.discoveryURI = https://idp.unicon.local/idp/profile/oidc/configuration
+external.authentication.oidc.secret = thisisverysecret
+external.authentication.oidc.claimAsUsername = preferred_username
diff --git a/src/test/docker/grouper/config/grouper-ui.properties.saml b/src/test/docker/grouper/config/grouper-ui.properties.saml
new file mode 100644
index 0000000..5416ec1
--- /dev/null
+++ b/src/test/docker/grouper/config/grouper-ui.properties.saml
@@ -0,0 +1,12 @@
+grouper.is.extAuth.enabled = true
+external.authentication.grouperContextUrl = https://grouper-ui.unicon.local/grouper
+
+external.authentication.provider = saml
+external.authentication.saml.identityProviderEntityId = https://idp.unicon.local/idp/shibboleth
+external.authentication.saml.serviceProviderEntityId = http://localhost:8080/grouper
+external.authentication.saml.serviceProviderMetadataPath = file:/opt/grouper/sp-metadata.xml
+external.authentication.saml.identityProviderMetadataPath = file:/opt/grouper/idp-metadata.xml
+external.authentication.saml.keystorePath = file:/opt/grouper/here.key
+external.authentication.saml.keystorePassword = testme
+external.authentication.saml.privateKeyPassword = testme
+external.authentication.saml.attributeAsId = urn:oid:0.9.2342.19200300.100.1.1
diff --git a/src/test/docker/shibboleth-idp/Dockerfile b/src/test/docker/shibboleth-idp/Dockerfile
index 4099cc3..36d46a0 100644
--- a/src/test/docker/shibboleth-idp/Dockerfile
+++ b/src/test/docker/shibboleth-idp/Dockerfile
@@ -1,42 +1,61 @@
-FROM amazoncorretto:17 as install
-
-ARG TOMCAT_VERSION=10.1.15
-
-COPY keys/* /tmp/keys/
-
-RUN yum install -y tar gzip
-
-RUN gpg --import /tmp/keys/TOMCAT_PGP_KEYS
-
-RUN curl -L https://archive.apache.org/dist/tomcat/tomcat-10/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz -o apache-tomcat-$TOMCAT_VERSION.tar.gz \
-    && curl https://archive.apache.org/dist/tomcat/tomcat-10/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc -o apache-tomcat-$TOMCAT_VERSION.tar.gz.asc \
-    && gpg --verify apache-tomcat-$TOMCAT_VERSION.tar.gz.asc apache-tomcat-$TOMCAT_VERSION.tar.gz \
-    && tar -zxvf apache-tomcat-$TOMCAT_VERSION.tar.gz -C /opt \
-    && rm apache-tomcat-$TOMCAT_VERSION.tar.gz \
-    && mv /opt/apache-tomcat-$TOMCAT_VERSION/ /opt/tomcat \
-    && rm -rf /opt/tomcat/webapps/*
-
-FROM amazoncorretto:17 as shib-setup
-
-RUN yum install -y dos2unix
-
-COPY opt-shibboleth-idp /opt/shibboleth-idp/
-
-RUN dos2unix /opt/shibboleth-idp/bin/*.sh \
-    && chmod +x /opt/shibboleth-idp/bin/*.sh
-
-FROM amazoncorretto:17 as prod
-
-COPY --from=install /opt/tomcat /opt/tomcat/
-
-COPY --from=shib-setup /opt/shibboleth-idp /opt/shibboleth-idp/
-
-COPY tomcat/idp.xml /opt/tomcat/conf/Catalina/localhost/
-COPY tomcat/server.xml /opt/tomcat/conf/
-COPY tomcat/setenv.sh /opt/tomcat/bin/
-
-ENTRYPOINT /opt/shibboleth-idp/bin/build.sh && /opt/tomcat/bin/catalina.sh run
-
-FROM prod as dev
-
-FROM prod
\ No newline at end of file
+FROM tier/shib-idp:4.3.1_20231218
+
+WORKDIR /opt/shibboleth-idp
+
+COPY plugin-truststore/net.shibboleth.oidc.common/truststore.asc /opt/shibboleth-idp/credentials/net.shibboleth.oidc.common/
+COPY plugin-truststore/net.shibboleth.idp.plugin.oidc.config/truststore.asc /opt/shibboleth-idp/credentials/net.shibboleth.idp.plugin.oidc.config/
+COPY plugin-truststore/net.shibboleth.idp.plugin.oidc.op/truststore.asc /opt/shibboleth-idp/credentials/net.shibboleth.idp.plugin.oidc.op/
+
+RUN bin/plugin.sh --noPrompt -I net.shibboleth.oidc.common \
+    && bin/plugin.sh --noPrompt -I net.shibboleth.idp.plugin.oidc.config \
+    && bin/plugin.sh --noPrompt -I net.shibboleth.idp.plugin.oidc.op
+
+COPY tomcat/server.xml /usr/local/tomcat/conf/
+
+COPY opt-shibboleth-idp/ /opt/shibboleth-idp/
+
+EXPOSE 8080
+
+
+#FROM amazoncorretto:17 as install
+#
+#ARG TOMCAT_VERSION=10.1.15
+#
+#COPY keys/* /tmp/keys/
+#
+#RUN yum install -y tar gzip
+#
+#RUN gpg --import /tmp/keys/TOMCAT_PGP_KEYS
+#
+#RUN curl -L https://archive.apache.org/dist/tomcat/tomcat-10/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz -o apache-tomcat-$TOMCAT_VERSION.tar.gz \
+#    && curl https://archive.apache.org/dist/tomcat/tomcat-10/v$TOMCAT_VERSION/bin/apache-tomcat-$TOMCAT_VERSION.tar.gz.asc -o apache-tomcat-$TOMCAT_VERSION.tar.gz.asc \
+#    && gpg --verify apache-tomcat-$TOMCAT_VERSION.tar.gz.asc apache-tomcat-$TOMCAT_VERSION.tar.gz \
+#    && tar -zxvf apache-tomcat-$TOMCAT_VERSION.tar.gz -C /opt \
+#    && rm apache-tomcat-$TOMCAT_VERSION.tar.gz \
+#    && mv /opt/apache-tomcat-$TOMCAT_VERSION/ /opt/tomcat \
+#    && rm -rf /opt/tomcat/webapps/*
+#
+#FROM amazoncorretto:17 as shib-setup
+#
+#RUN yum install -y dos2unix
+#
+#COPY opt-shibboleth-idp /opt/shibboleth-idp/
+#
+#RUN dos2unix /opt/shibboleth-idp/bin/*.sh \
+#    && chmod +x /opt/shibboleth-idp/bin/*.sh
+#
+#FROM amazoncorretto:17 as prod
+#
+#COPY --from=install /opt/tomcat /opt/tomcat/
+#
+#COPY --from=shib-setup /opt/shibboleth-idp /opt/shibboleth-idp/
+#
+#COPY tomcat/idp.xml /opt/tomcat/conf/Catalina/localhost/
+#COPY tomcat/server.xml /opt/tomcat/conf/
+#COPY tomcat/setenv.sh /opt/tomcat/bin/
+#
+#ENTRYPOINT /opt/shibboleth-idp/bin/build.sh && /opt/tomcat/bin/catalina.sh run
+#
+#FROM prod as dev
+#
+#FROM prod
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/aacli.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/aacli.sh
deleted file mode 100644
index cad1f70..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/aacli.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh -Dnet.shibboleth.idp.cli.arguments=net.shibboleth.idp.cli.ResolverTestArguments \
-    net.shibboleth.idp.cli.CLI "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/build.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/build.sh
deleted file mode 100644
index bd703f9..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/build.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh net.shibboleth.idp.installer.impl.IdPBuildWar --ansi --home "$LOCATION/.." "$@"
-
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/dumpconfig.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/dumpconfig.sh
deleted file mode 100644
index 3591267..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/dumpconfig.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh -Dnet.shibboleth.idp.cli.arguments=net.shibboleth.idp.cli.DumpConfigArguments \
-    net.shibboleth.idp.cli.CLI "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/issue-access-token.bat b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/issue-access-token.bat
deleted file mode 100644
index 8c84d60..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/issue-access-token.bat
+++ /dev/null
@@ -1,4 +0,0 @@
-@echo off
-setlocal
-
-"%~dp0\runclass.bat" -Dnet.shibboleth.idp.cli.arguments=net.shibboleth.idp.plugin.oidc.op.cli.IssueRegistrationAccessTokenArguments net.shibboleth.idp.cli.CLI %*
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/issue-access-token.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/issue-access-token.sh
deleted file mode 100644
index 2419aab..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/issue-access-token.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh \
-    -Dnet.shibboleth.idp.cli.arguments=net.shibboleth.idp.plugin.oidc.op.cli.IssueRegistrationAccessTokenArguments \
-    net.shibboleth.idp.cli.CLI "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/jwtgen.bat b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/jwtgen.bat
deleted file mode 100644
index 8dd753f..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/jwtgen.bat
+++ /dev/null
@@ -1,4 +0,0 @@
-@echo off
-setlocal
-
-"%~dp0\runclass.bat" -jar %~dp0\lib\json-web-key-generator-0.8.2-jar-with-dependencies.jar %*
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/jwtgen.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/jwtgen.sh
deleted file mode 100644
index d7b97b7..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/jwtgen.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh '-jar' $LOCATION/lib/json-web-key-generator-0.8.2-jar-with-dependencies.jar  "$@"
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/keygen.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/keygen.sh
deleted file mode 100644
index 7e4ad7a..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/keygen.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh net.shibboleth.shared.security.impl.SelfSignedCertificateGenerator "$@"
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/lib/json-web-key-generator-0.8.2-jar-with-dependencies.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/lib/json-web-key-generator-0.8.2-jar-with-dependencies.jar
deleted file mode 100644
index c697d8a..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/lib/json-web-key-generator-0.8.2-jar-with-dependencies.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/mdquery.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/mdquery.sh
deleted file mode 100644
index 06c64a0..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/mdquery.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh -Dnet.shibboleth.idp.cli.arguments=net.shibboleth.idp.cli.MetadataQueryArguments \
-    net.shibboleth.idp.cli.CLI "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/module.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/module.sh
deleted file mode 100644
index a0b872a..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/module.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh net.shibboleth.idp.cli.impl.ModuleManagerCLI --ansi --home "$LOCATION/.." "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/oidc-clients.bat b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/oidc-clients.bat
deleted file mode 100644
index e427988..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/oidc-clients.bat
+++ /dev/null
@@ -1,4 +0,0 @@
-@echo off
-setlocal
-
-"%~dp0\runclass.bat" -Dnet.shibboleth.idp.cli.arguments=net.shibboleth.idp.plugin.oidc.op.cli.ClientManagementArguments net.shibboleth.idp.cli.CLI %*
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/oidc-clients.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/oidc-clients.sh
deleted file mode 100644
index b6b6b35..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/oidc-clients.sh
+++ /dev/null
@@ -1,9 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh \
-    -Dnet.shibboleth.idp.cli.arguments=net.shibboleth.idp.plugin.oidc.op.cli.ClientManagementArguments \
-    net.shibboleth.idp.cli.CLI "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/plugin.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/plugin.sh
deleted file mode 100644
index bed28d8..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/plugin.sh
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-declare NO_PLUGIN_WEBAPP
-
-LOCATION=$(dirname $0)
-NO_PLUGIN_WEBAPP="TRUE"
-export NO_PLUGIN_WEBAPP
-
-$LOCATION/runclass.sh net.shibboleth.idp.installer.plugin.impl.PluginInstallerCLI --home "$LOCATION/.." "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/reload-metadata.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/reload-metadata.sh
deleted file mode 100644
index 381ee3d..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/reload-metadata.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh -Dnet.shibboleth.idp.cli.arguments=net.shibboleth.idp.cli.ReloadMetadataArguments \
-    net.shibboleth.idp.cli.CLI "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/reload-service.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/reload-service.sh
deleted file mode 100644
index b572187..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/reload-service.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh -Dnet.shibboleth.idp.cli.arguments=net.shibboleth.idp.cli.ReloadServiceArguments \
-    net.shibboleth.idp.cli.CLI "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/runclass.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/runclass.sh
deleted file mode 100644
index 807fbc3..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/runclass.sh
+++ /dev/null
@@ -1,57 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-declare COMMAND
-declare JAVACMD
-declare LOCALCLASSPATH
-declare LIBDIR
-
-LOCATION=$(dirname $0)
-
-if [ -z "$JAVACMD" ] ; then 
-  if [ -n "$JAVA_HOME"  ] ; then
-    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 
-      # IBM's JDK on AIX uses strange locations for the executables
-      JAVACMD=$JAVA_HOME/jre/sh/java
-    else
-      JAVACMD=$JAVA_HOME/bin/java
-    fi
-  else
-    JAVACMD=$(which java)
-  fi
-fi
-
-if [ ! -x "$JAVACMD" ] ; then
-  echo "Error: JAVA_HOME is not defined correctly."
-  echo "  We cannot execute $JAVACMD"
-  exit 1
-fi
-
-if [ -n "$CLASSPATH" ] ; then
-  LOCALCLASSPATH=$CLASSPATH
-fi
-
-if [ -z "$IDP_BASE_URL" ] ; then
-  IDP_BASE_URL="http://localhost/idp"
-fi
-
-# add in the dependency .jar files
-
-LOCALCLASSPATH="$LOCATION/../dist/webapp/WEB-INF/lib/*":$LOCALCLASSPATH
-if [ -z "$NO_PLUGIN_WEBAPP" ] ; then
-  LOCALCLASSPATH="$LOCATION/../dist/plugin-webapp/WEB-INF/lib/*":$LOCALCLASSPATH
-fi
-LOCALCLASSPATH="$LOCATION/../edit-webapp/WEB-INF/lib/*":$LOCALCLASSPATH
-LOCALCLASSPATH="$LOCATION/../dist/binlib/*":$LOCALCLASSPATH
-
-if [ -n "$JAVA_HOME" ] ; then
-  if [ -f "$JAVA_HOME/lib/tools.jar" ] ; then
-    LOCALCLASSPATH=$LOCALCLASSPATH:$JAVA_HOME/lib/tools.jar
-  fi
-
-  if [ -f "$JAVA_HOME/lib/classes.zip" ] ; then
-    LOCALCLASSPATH=$LOCALCLASSPATH:$JAVA_HOME/lib/classes.zip
-  fi
-fi
-
-"$JAVACMD" '-classpath' "$LOCALCLASSPATH" $JAVA_OPTS -Dnet.shibboleth.idp.cli.baseURL=$IDP_BASE_URL "$@" $SHIB_OPTS
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/sealer.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/sealer.sh
deleted file mode 100644
index 1f09ed0..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/sealer.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh net.shibboleth.idp.cli.DataSealerCLI "$@"
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/seckeygen.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/seckeygen.sh
deleted file mode 100644
index 67b22f9..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/seckeygen.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh net.shibboleth.shared.security.impl.BasicKeystoreKeyStrategyTool "$@"
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/status.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/status.sh
deleted file mode 100644
index ddbe171..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/status.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh -Dnet.shibboleth.idp.cli.arguments=net.shibboleth.idp.cli.StatusArguments \
-    net.shibboleth.idp.cli.CLI "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/update.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/update.sh
deleted file mode 100644
index 42e7699..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/update.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh net.shibboleth.idp.installer.impl.UpdateIdPCLI --ansi --home "$LOCATION/.." "$@"
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/version.sh b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/version.sh
deleted file mode 100644
index 6a49ceb..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/bin/version.sh
+++ /dev/null
@@ -1,7 +0,0 @@
-#!/usr/bin/env bash
-
-declare LOCATION
-
-LOCATION=$(dirname $0)
-
-$LOCATION/runclass.sh net.shibboleth.idp.Version
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/admin/admin.properties b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/admin/admin.properties
deleted file mode 100644
index efda4ce..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/admin/admin.properties
+++ /dev/null
@@ -1,89 +0,0 @@
-# Configure properties controlling administrative features
-
-#idp.status.logging = Status
-#idp.status.accessPolicy = AccessByIPAddress
-#idp.status.authenticated = false
-#idp.status.nonBrowserSupported = false
-#idp.status.defaultAuthenticationMethods =
-#idp.status.resolveAttributes = false
-#idp.status.postAuthenticationFlows =
-
-#idp.reload.logging = Reload
-#idp.reload.accessPolicy = AccessByIPAddress
-#idp.reload.authenticated = false
-#idp.reload.nonBrowserSupported = false
-#idp.reload.defaultAuthenticationMethods =
-#idp.reload.resolveAttributes = false
-#idp.reload.postAuthenticationFlows =
-
-#idp.resolvertest.logging = ResolverTest
-#idp.resolvertest.accessPolicy = AccessByIPAddress
-#idp.resolvertest.authenticated = false
-#idp.resolvertest.nonBrowserSupported = false
-#idp.resolvertest.defaultAuthenticationMethods =
-#idp.resolvertest.resolveAttributes = false
-#idp.resolvertest.postAuthenticationFlows =
-
-#idp.dumpconfig.logging = DumpConfig
-#idp.dumpconfig.accessPolicy = AccessByIPAddress
-#idp.dumpconfig.authenticated = false
-#idp.dumpconfig.nonBrowserSupported = false
-#idp.dumpconfig.defaultAuthenticationMethods =
-#idp.dumpconfig.resolveAttributes = false
-#idp.dumpconfig.postAuthenticationFlows =
-
-#idp.mdquery.logging = MetadataQuery
-#idp.mdquery.accessPolicy = AccessByIPAddress
-#idp.mdquery.authenticated = false
-#idp.mdquery.nonBrowserSupported = false
-#idp.mdquery.defaultAuthenticationMethods =
-#idp.mdquery.resolveAttributes = false
-#idp.mdquery.postAuthenticationFlows =
-
-#idp.metrics.logging = Metrics
-#idp.metrics.authenticated = false
-#idp.metrics.nonBrowserSupported = false
-#idp.metrics.defaultAuthenticationMethods =
-#idp.metrics.resolveAttributes = false
-#idp.metrics.postAuthenticationFlows =
-# See admin/metrics.xml for other configuration
-
-#idp.hello.logging = Hello
-idp.hello.accessPolicy = AccessByIPAddress
-#idp.hello.authenticated = true
-#idp.hello.nonBrowserSupported = false
-#idp.hello.defaultAuthenticationMethods =
-#idp.hello.resolveAttributes = true
-#idp.hello.postAuthenticationFlows =
-
-#idp.lockout.logging = Lockout
-#idp.lockout.accessPolicy = AccessDenied
-#idp.lockout.authenticated = false
-#idp.lockout.nonBrowserSupported = false
-#idp.lockout.defaultAuthenticationMethods =
-#idp.lockout.resolveAttributes = false
-#idp.lockout.postAuthenticationFlows =
-
-#idp.revocation.logging = Revocation
-#idp.revocation.accessPolicy = AccessDenied
-#idp.revocation.authenticated = false
-#idp.revocation.nonBrowserSupported = false
-#idp.revocation.defaultAuthenticationMethods =
-#idp.revocation.resolveAttributes = false
-#idp.revocation.postAuthenticationFlows =
-
-#idp.storage.logging = Storage
-#idp.storage.accessPolicy = AccessDenied
-#idp.storage.authenticated = false
-#idp.storage.nonBrowserSupported = false
-#idp.storage.defaultAuthenticationMethods =
-#idp.storage.resolveAttributes = false
-#idp.storage.postAuthenticationFlows =
-
-#idp.unlock-keys.logging = UnlockKeys
-#idp.unlock-keys.accessPolicy = AccessDenied
-#idp.unlock-keys.authenticated = true
-#idp.unlock-keys.nonBrowserSupported = false
-#idp.unlock-keys.defaultAuthenticationMethods =
-#idp.unlock-keys.resolveAttributes = false
-#idp.unlock-keys.postAuthenticationFlows =
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/admin/metrics.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/admin/metrics.xml
deleted file mode 100644
index 7ac0735..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/admin/metrics.xml
+++ /dev/null
@@ -1,147 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-    xmlns:context="http://www.springframework.org/schema/context"
-    xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
-    xmlns:c="http://www.springframework.org/schema/c" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-
-    default-init-method="initialize"
-    default-destroy-method="destroy">
-    
-    <!-- Metrics enablement / activation. -->
-
-    <!--
-    Register one or more of the built-in system metric sets available.
-    -->
-
-    <bean parent="shibboleth.metrics.RegisterMetricSets">
-        <property name="arguments">
-            <list>
-                <ref bean="shibboleth.metrics.CoreGaugeSet" />
-                <ref bean="shibboleth.metrics.IdPGaugeSet" />
-                <ref bean="shibboleth.metrics.LoggingGaugeSet" />
-                <ref bean="shibboleth.metrics.AccessControlGaugeSet" />
-                <ref bean="shibboleth.metrics.MetadataGaugeSet" />
-                <ref bean="shibboleth.metrics.NameIdentifierGaugeSet" />
-                <ref bean="shibboleth.metrics.RelyingPartyGaugeSet" />
-                <ref bean="shibboleth.metrics.AttributeRegistryGaugeSet" />
-                <ref bean="shibboleth.metrics.AttributeResolverGaugeSet" />
-                <ref bean="shibboleth.metrics.AttributeFilterGaugeSet" />
-                <ref bean="shibboleth.metrics.CASServiceRegistryGaugeSet" />
-                <ref bean="shibboleth.metrics.ManagedBeanGaugeSet" />
-                <ref bean="shibboleth.metrics.ModuleGaugeSet" />
-                
-                <!-- Note that this accesses remote "state" regarding IdP and plugin updates. -->
-                <ref bean="shibboleth.metrics.InstallableComponents" />
-
-                <!--
-                <bean class="com.codahale.metrics.jvm.CachedThreadStatesGaugeSet"
-                    c:_0="1" c:_1="#{T(java.util.concurrent.TimeUnit).MINUTES}" />
-                <bean class="com.codahale.metrics.jvm.ClassLoadingGaugeSet" />
-                <bean class="com.codahale.metrics.jvm.GarbageCollectorMetricSet" />
-                <bean class="com.codahale.metrics.jvm.MemoryUsageGaugeSet" />
-                -->
-            </list>
-        </property>
-    </bean>
-
-    <!-- Metrics REST API Configuration -->
-
-    <!--
-    The global metric set is available by default at /idp/profile/admin/metrics
-    
-    Any pathinfo after that is assumed to identify specific named metrics. You can
-    create mappings here between a logical "group" name and an implementation of the
-    com.codahale.metrics.MetricFilter interface to specify which metrics to include.
-    -->
-    <util:map id="shibboleth.metrics.MetricGroups">
-        <entry key="core" value-ref="shibboleth.metrics.CoreGaugeSet" />
-        <entry key="idp" value-ref="shibboleth.metrics.IdPGaugeSet" />
-        <entry key="updates" value-ref="shibboleth.metrics.InstallableComponents" />
-        <entry key="logging" value-ref="shibboleth.metrics.LoggingGaugeSet" />
-        <entry key="access" value-ref="shibboleth.metrics.AccessControlGaugeSet" />
-        <entry key="metadata" value-ref="shibboleth.metrics.MetadataGaugeSet" />
-        <entry key="nameid" value-ref="shibboleth.metrics.NameIdentifierGaugeSet" />
-        <entry key="relyingparty" value-ref="shibboleth.metrics.RelyingPartyGaugeSet" />
-        <entry key="registry" value-ref="shibboleth.metrics.AttributeRegistryGaugeSet" />
-        <entry key="resolver" value-ref="shibboleth.metrics.AttributeResolverGaugeSet" />
-        <entry key="filter" value-ref="shibboleth.metrics.AttributeFilterGaugeSet" />
-        <entry key="cas" value-ref="shibboleth.metrics.CASServiceRegistryGaugeSet" />
-        <entry key="bean" value-ref="shibboleth.metrics.ManagedBeanGaugeSet" />
-    </util:map>
-
-    <!-- Add any desired properties into set to expose them as IdP metrics. -->
-    <!--
-    <util:set id="shibboleth.metrics.ExposedProperties">
-        <value>idp.entityID</value>
-    </util:set>
-    -->
-    
-    <!-- If you don't specify an alternate access policy, this named policy will be enforced. -->
-    <bean id="shibboleth.metrics.DefaultAccessPolicy" class="java.lang.String" c:_0="AccessByIPAddress" />
-    
-    <!--
-    To override the default access policy, map a metric name or
-    mapped group above to an alternative policy name.
-    -->
-    <util:map id="shibboleth.metrics.AccessPolicyMap">
-    
-    </util:map>
-        
-    <!--
-    In addition to the "pull" REST API for accessing metrics, a "push" reporter is also
-    available to upload a JSON feed to a URL. The example shown relies on standard JVM
-    trust configuration for TLS server verification.
-    
-    The "start" method triggers the timer thread; the example pushes every 30 minutes.
-    -->
-    <!--
-    <bean id="PushReporter" parent="shibboleth.metrics.HTTPReporter" c:name="MyCollector"
-        p:collectorURL="https://log.example.org/cgi-bin/collector.cgi" />
-                
-    <bean class="org.springframework.beans.factory.config.MethodInvokingBean"
-            p:targetObject-ref="PushReporter"
-            p:targetMethod="start">
-        <property name="arguments">
-            <list>
-                <value>30</value>
-                <util:constant static-field="java.util.concurrent.TimeUnit.MINUTES" />
-            </list>
-        </property>
-    </bean>
-    -->
-
-    <!-- IdP Metrics Configuration -->
-    
-    <!--
-    A bean named shibboleth.metrics.MetricStrategy of type Function<ProfileRequestContext,Boolean>
-    can be defined to add timers and counters to a large range of objects in the system. Each timer is
-    defined by a triple (timer name, start object, stop object). Counters are just object/counter pairs.
-    
-    The most common example is to start a timer when a particular flow action bean starts and
-    stop it when the same or different action bean stops, to measure how long the execution takes.
-    
-    If you want to leave a timer in place but disabled to prevent overhead, you can turn off a
-    logging category named "metrics.<timername>" in your logging configuration.
-    -->
-    <!--
-    <bean id="shibboleth.metrics.MetricStrategy" parent="shibboleth.ContextFunctions.Scripted"
-            factory-method="inlineScript">
-        <constructor-arg>
-            <value>
-            <![CDATA[
-                metricCtx = input.getSubcontext("org.opensaml.profile.context.MetricContext");
-                metricCtx.addTimer("idp.attribute.resolution",
-                    "ResolveAttributes",
-                    "FilterAttributes"
-                    );                                
-                true; // Signals success.
-            ]]>
-            </value>
-        </constructor-arg>
-    </bean>
-    -->
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attribute-registry.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attribute-registry.xml
deleted file mode 100644
index 133930b..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attribute-registry.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-
-    <!--
-    The system comes preconfigured to load rules directly from resource files
-    configured in services.xml so they're monitored for changes.
-    
-    You can add mappings here, add more XML resource files, or drop property
-    files into the directory noted below, but they won't be monitored for changes
-    themselves.
-    -->
-
-    <!-- Default directory for custom mappings. -->
-    <bean parent="shibboleth.TranscodingRuleLoader"
-        c:dir="%{idp.home}/conf/attributes/custom"
-        c:extensions="#{{'.txt', '.props', '.properties', '.rule'}}" />
-   
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/custom/README b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/custom/README
deleted file mode 100644
index 98977b0..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/custom/README
+++ /dev/null
@@ -1,9 +0,0 @@
-# You can create custom attribute mapping rules using
-# simple property files stored in this directory tree.
-# Spring property replacement is NOT supported.
-
-# As an example, a default SAML 2 rule for eduPersonPrincipalName would be:
-
-#id=eduPersonPrincipalName
-#transcoder=SAML2ScopedStringTranscoder
-#saml2.name=urn:oid:1.3.6.1.4.1.5923.1.1.1.6
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/eduCourse.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/eduCourse.xml
deleted file mode 100644
index 96341c3..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/eduCourse.xml
+++ /dev/null
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-
-    <!--
-    Note that all built-in rules rely on URI-naming and thus include the implied settings:
-    
-    <prop key="saml2.nameFormat">urn:oasis:names:tc:SAML:2.0:attrname-format:uri</prop>
-    <prop key="saml1.namespace">urn:mace:shibboleth:1.0:attributeNamespace:uri</prop>
-    -->
-
-    <bean parent="shibboleth.TranscodingRuleLoader">
-    <constructor-arg>
-    <list>
-        
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduCourseOffering</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.6.1.1</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.5923.1.6.1.1</prop>
-                    <prop key="displayName.en">Course offering</prop>
-                    <prop key="description.en">Unique identifier for a course offering</prop>
-                </props>
-            </property>
-        </bean>
-        
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduCourseMember</prop>
-                    <prop key="transcoder">SAML2ScopedStringTranscoder SAML1ScopedStringTranscoder CASScopedStringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.6.1.2</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.5923.1.6.1.2</prop>
-                    <prop key="saml1.encodeType">false</prop>
-                    <prop key="displayName.en">Course role</prop>
-                    <prop key="description.en">Specifies the person's role within a particular course offering</prop>
-                </props>
-            </property>
-        </bean>
-
-    </list>
-    </constructor-arg>
-    </bean>
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/eduPerson.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/eduPerson.xml
deleted file mode 100644
index 115967c..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/eduPerson.xml
+++ /dev/null
@@ -1,309 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-
-    <!--
-    Note that all built-in rules rely on URI-naming and thus include the implied settings:
-    
-    <prop key="saml2.nameFormat">urn:oasis:names:tc:SAML:2.0:attrname-format:uri</prop>
-    <prop key="saml1.namespace">urn:mace:shibboleth:1.0:attributeNamespace:uri</prop>
-    -->
-       
-    <bean parent="shibboleth.TranscodingRuleLoader">
-    <constructor-arg>
-    <list>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonAffiliation</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.1</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:eduPersonAffiliation</prop>
-                    <prop key="displayName.en">Affiliation</prop>
-                    <prop key="displayName.de">Zugehörigkeit</prop>
-                    <prop key="displayName.fr">Affiliation</prop>
-                    <prop key="displayName.it">Affiliazione</prop>
-                    <prop key="displayName.ja">職位</prop>
-                    <prop key="description.en">Affiliation: Type of affiliation with Home Organization</prop>
-                    <prop key="description.de">Art der Zugehörigkeit zur Heimatorganisation</prop>
-                    <prop key="description.de-ch">Art der Zugehörigkeit zur Heimorganisation</prop>
-                    <prop key="description.fr">Type d'affiliation dans l'organisation</prop>
-                    <prop key="description.it">Affiliazione: Tipo di affiliazione presso l'organizzazione</prop>
-                    <prop key="description.ja">所属機関における職位(faculty,staff,student,memberなど)</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonAssurance</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.11</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:eduPersonAssurance</prop>
-                    <prop key="displayName.en">Assurance level</prop>
-                    <prop key="displayName.de">Vertrauensgrad</prop>
-                    <prop key="displayName.fr">Niveau de confiance</prop>
-                    <prop key="displayName.it">Livello di garanzia dell'identita'</prop>
-                    <prop key="displayName.ja">保証レベル</prop>
-                    <prop key="description.en">Set of URIs that assert compliance with specific standards for identity assurance</prop>
-                    <prop key="description.de">URIs die eine gewisse Zusicherung für spezifische Standards des Vertrauens beinhalten</prop>
-                    <prop key="description.fr">Un ensemble d'URI qui attestent la conformité selon un standard pour les niveaux d'assurance d'identités</prop>
-                    <prop key="description.it">Un insieme di URI che asseriscono l'osservanza dei livelli di garanzia dell'identita'</prop>
-                    <prop key="description.ja">IDの保証レベルに関して特定の基準に準拠していることを示すURI</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonEntitlement</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.7</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:eduPersonEntitlement</prop>
-                    <prop key="displayName.en">Entitlement</prop>
-                    <prop key="displayName.de">Berechtigung</prop>
-                    <prop key="displayName.fr">Membre de</prop>
-                    <prop key="displayName.it">Diritti</prop>
-                    <prop key="displayName.ja">資格情報</prop>
-                    <prop key="description.en">Member of: URI (either URL or URN) that indicates a set of rights to specific resources based on an agreement across the releavant community</prop>
-                    <prop key="description.de">Zeichenkette, die Rechte für spezifische Ressourcen beschreibt</prop>
-                    <prop key="description.fr">Membre de: URI (soit une URL ou une URN) décrivant un droit spécific d'accès</prop>
-                    <prop key="description.it">Membro di: URI (sia URL, sia URN) che rappresentano diritti su specifiche risorse e basati su accordi tra le comunità interessate</prop>
-                    <prop key="description.ja">特定のアプリケーションもしくはコミュニティ内の複数リソースへのアクセス権限を持つことを示すURI(URLもしくはURN)</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonNickname</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.2</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:eduPersonNickname</prop>
-                    <prop key="displayName.en">Nickname</prop>
-                    <prop key="displayName.de">Kurzname</prop>
-                    <prop key="displayName.de-ch">Übername</prop>
-                    <prop key="displayName.fr">Surnom</prop>
-                    <prop key="displayName.it">Soprannome</prop>
-                    <prop key="displayName.ja">ニックネーム</prop>
-                    <prop key="description.en">Person's nickname, or the informal name by which they are accustomed to be hailed</prop>
-                    <prop key="description.de">Kurzname einer Person, oder üblicher Rufname zur Begrüßung</prop>
-                    <prop key="description.de-ch">Übername einer Person, oder üblicher Rufname zur Begrüssung</prop>
-                    <prop key="description.fr">Nom personnalisable pour un usage informel</prop>
-                    <prop key="description.it">Soprannome della persona</prop>
-                    <prop key="description.ja">利用者のニックネームもしくは通称</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonOrgDN</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.3</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:eduPersonOrgDN</prop>
-                    <prop key="displayName.en">Organization distinguished name</prop>
-                    <prop key="description.en">Distinguished name (DN) of the directory entry representing the institution with which the person is associated</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonOrgUnitDN</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.4</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:eduPersonOrgUnitDN</prop>
-                    <prop key="displayName.en">Organization unit distinguished name</prop>
-                    <prop key="displayName.fr">Structures de rattachement</prop>
-                    <prop key="description.en">Distinguished name(s) (DN) of the directory entries representing the person's Organizational Unit(s)</prop>
-                    <prop key="description.fr">Structures d'affectation (composante, service...) de la personne dans l'annuaire</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonOrcid</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.16</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.16</prop>
-                    <prop key="displayName.en">ORCID</prop>
-                    <prop key="displayName.fr">identifiants ORCID</prop>
-                    <prop key="description.en">ORCID researcher identifier(s) belonging to a person</prop>
-                    <prop key="description.fr">Identifiant(s) ORCID d'une personne</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonPrimaryAffiliation</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.5</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:eduPersonPrimaryAffiliation</prop>
-                    <prop key="displayName.en">Primary affiliation</prop>
-                    <prop key="displayName.de">Primäre Zugehörigkeit</prop>
-                    <prop key="displayName.fr">Affiliation principale</prop>
-                    <prop key="displayName.it">Affiliazione principale</prop>
-                    <prop key="displayName.ja">主要職位</prop>
-                    <prop key="description.en">Specifies the person's primary relationship to the institution in broad categories such as student, faculty, staff, alum, etc.</prop>
-                    <prop key="description.de">Spezifiziert der Hauptbeziehung einer Person innerhalb ihrer Organisation in groben Kategorien wie Student, Mitarbeiter, Alumni, etc.</prop>
-                    <prop key="description.fr">Spécifie la relation principale d'une personne avec l'institution selon des majeures catégories comme étudiant, collaborateur, alumni etc.</prop>
-                    <prop key="description.it">Specifica la relazione principale della persona con l'istituzione secondo le categorie studente, collaboratore, alumni, etc.</prop>
-                    <prop key="description.ja">所属機関における主要な職位(faculty,staff,student,memberなど)</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonPrimaryOrgUnitDN</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.8</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:eduPersonPrimaryOrgUnitDN</prop>
-                    <prop key="displayName.en">Primary organization unit distinguished name</prop>
-                    <prop key="displayName.fr">Structure de rattachement principal</prop>
-                    <prop key="description.en">Distinguished name (DN) of the directory entry representing the person's primary Organizational Unit</prop>
-                    <prop key="description.fr">Structure (composante, service) dans l'annuaire considérée comme affectation principale de la personne</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonPrincipalName</prop>
-                    <prop key="transcoder">SAML2ScopedStringTranscoder SAML1ScopedStringTranscoder CASScopedStringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.6</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:eduPersonPrincipalName</prop>
-                    <prop key="saml1.encodeType">false</prop>
-                    <prop key="displayName.en">Principal name</prop>
-                    <prop key="displayName.de">Persönliche ID</prop>
-                    <prop key="displayName.fr">Identifiant unique</prop>
-                    <prop key="displayName.it">ID personale</prop>
-                    <prop key="displayName.ja">プリンシパルID</prop>
-                    <prop key="description.en">A unique identifier for a person, mainly for inter-institutional user identification</prop>
-                    <prop key="description.de">Eindeutige Benutzeridentifikation</prop>
-                    <prop key="description.de-ch">Eindeutige Benützeridentifikation</prop>
-                    <prop key="description.fr">L'identifiant unique de l'utilisateur</prop>
-                    <prop key="description.it">Un ID personale che identifica chiaramente l'utente in seno alla sua organizzazione</prop>
-                    <prop key="description.ja">フェデレーション内で一意かつ永続的な利用者識別子</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonPrincipalNamePrior</prop>
-                    <prop key="transcoder">SAML2ScopedStringTranscoder SAML1ScopedStringTranscoder CASScopedStringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.12</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.12</prop>
-                    <prop key="saml1.encodeType">false</prop>
-                    <prop key="displayName.en">Prior principal name(s)</prop>
-                    <prop key="displayName.fr">Anciens identifiants EPPN</prop>
-                    <prop key="description.en">eduPersonPrincipalName value(s) previously associated with the entry</prop>
-                    <prop key="description.fr">Liste des valeurs de l'attribut eduPersonPrincipalName précédemment attribuées à la personne</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonScopedAffiliation</prop>
-                    <prop key="transcoder">SAML2ScopedStringTranscoder SAML1ScopedStringTranscoder CASScopedStringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.9</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:eduPersonScopedAffiliation</prop>
-                    <prop key="saml1.encodeType">false</prop>
-                    <prop key="displayName.en">Scoped affiliation</prop>
-                    <prop key="displayName.de">Zugehörigkeit</prop>
-                    <prop key="displayName.fr">Affiliation</prop>
-                    <prop key="displayName.it">Affiliazione</prop>
-                    <prop key="displayName.ja">スコープ付き職位</prop>
-                    <prop key="description.en">Specifies the person's affiliation within a particular security domain</prop>
-                    <prop key="description.de">Art der Zugehörigkeit zur Heimatorganisation</prop>
-                    <prop key="description.de-ch">Art der Zugehörigkeit zur Heimorganisation</prop>
-                    <prop key="description.fr">Type d'affiliation dans l'organisation</prop>
-                    <prop key="description.it">Affiliazione: Tipo di affiliazione pressocon l'organizzazione</prop>
-                    <prop key="description.ja">セキュリティドメインのスコープが付いた所属機関における職位</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonUniqueId</prop>
-                    <prop key="transcoder">SAML2ScopedStringTranscoder SAML1ScopedStringTranscoder CASScopedStringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.13</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.13</prop>
-                    <prop key="saml1.encodeType">false</prop>
-                    <prop key="displayName.en">Unique ID</prop>
-                    <prop key="displayName.de">Eindeutige ID</prop>
-                    <prop key="displayName.fr">ID unique</prop>
-                    <prop key="displayName.it">ID univoco</prop>
-                    <prop key="displayName.ja">ユニークID</prop>
-                    <prop key="description.en">A unique identifier for a person, mainly for inter-institutional user identification</prop>
-                    <prop key="description.de">Eindeutige Benutzeridentifikation</prop>
-                    <prop key="description.de-ch">Eindeutige Benützeridentifikation</prop>
-                    <prop key="description.fr">Identifiant unique de l'utilisateur</prop>
-                    <prop key="description.it">Un identificativo univoco che identifica chiaramente l'utente in seno alla sua organizzazione</prop>
-                    <prop key="description.ja">フェデレーション内で一意で永続的かつ難読化された利用者識別子(後継はサブジェクトID)</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonAnalyticsTag</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder CASStringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.17</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.17</prop>
-                    <prop key="saml1.encodeType">false</prop>
-                    <prop key="displayName.en">Aggregated analytics tag</prop>
-                    <prop key="description.en">Opaque string that aggregates the use of a service by a set of subjects for the purpose of reporting or analytics</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">eduPersonDisplayPronouns</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder CASStringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.18</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.5923.1.1.1.18</prop>
-                    <prop key="saml1.encodeType">false</prop>
-                    <prop key="displayName.en">Display Pronouns</prop>
-                    <prop key="description.en">Personal pronouns by which the person prefers to be identified</prop>
-                </props>
-            </property>
-        </bean>
-
-    </list>
-    </constructor-arg>
-    </bean>
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/inetOrgPerson.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/inetOrgPerson.xml
deleted file mode 100644
index 2ab78ef..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/inetOrgPerson.xml
+++ /dev/null
@@ -1,525 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-
-    <!--
-    Note that all built-in rules rely on URI-naming and thus include the implied settings:
-    
-    <prop key="saml2.nameFormat">urn:oasis:names:tc:SAML:2.0:attrname-format:uri</prop>
-    <prop key="saml1.namespace">urn:mace:shibboleth:1.0:attributeNamespace:uri</prop>
-    -->
-
-    <!-- https://tools.ietf.org/html/rfc2798 -->
-
-    <bean parent="shibboleth.TranscodingRuleLoader">
-    <constructor-arg>
-    <list>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">cn</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.3</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:cn</prop>
-                    <prop key="displayName.en">Common name</prop>
-                    <prop key="displayName.fr">Nom et Prénom</prop>
-                    <prop key="description.en">Common name of a person</prop>
-                    <prop key="description.fr">Nom complet sans accent d'une personne</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">departmentNumber</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.16.840.1.113730.3.1.2</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:departmentNumber</prop>
-                    <prop key="displayName.en">Department number</prop>
-                    <prop key="displayName.fr">departmentNumber</prop>
-                    <prop key="displayName.de">Abteilungsnummer</prop>
-                    <prop key="description.en">Department number</prop>
-                    <prop key="description.de">Nummer der Abteilung</prop>
-                    <prop key="description.fr">Identifiant du département dans l'organisation</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">displayName</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.16.840.1.113730.3.1.241</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:displayName</prop>
-                    <prop key="displayName.en">Display name</prop>
-                    <prop key="displayName.de">Anzeigename</prop>
-                    <prop key="displayName.fr">Nom</prop>
-                    <prop key="displayName.it">Nome</prop>
-                    <prop key="displayName.ja">表示名</prop>
-                    <prop key="description.en">The name that should appear in white-pages-like applications for this person</prop>
-                    <prop key="description.de">Anzeigename</prop>
-                    <prop key="description.fr">Nom complet d'affichage</prop>
-                    <prop key="description.it">Nome</prop>
-                    <prop key="description.ja">アプリケーションでの表示に用いられる英字氏名</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">employeeNumber</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.16.840.1.113730.3.1.3</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:employeeNumber</prop>
-                    <prop key="displayName.en">Employee number</prop>
-                    <prop key="displayName.de">Mitarbeiternummer</prop>
-                    <prop key="displayName.fr">Numéro d'employé</prop>
-                    <prop key="displayName.it">Numero dell'utente</prop>
-                    <prop key="displayName.ja">従業員番号</prop>
-                    <prop key="description.en">Identifies an employee within an organization</prop>
-                    <prop key="description.de">Identifiziert einen Mitarbeiter innerhalb der Organisation</prop>
-                    <prop key="description.fr">Identifie un employé au sein de l'organisation</prop>
-                    <prop key="description.it">Identifica l' utente presso l'organizzazione</prop>
-                    <prop key="description.ja">所属機関における利用者の従業員番号</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">employeeType</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.16.840.1.113730.3.1.4</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:employeeType</prop>
-                    <prop key="displayName.en">Employee type</prop>
-                    <prop key="displayName.fr">Type d'employé</prop>
-                    <prop key="description.en">Employee type</prop>
-                    <prop key="description.fr">Catégorie d'employé dans l'organisation</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">givenName</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.42</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:givenName</prop>
-                    <prop key="displayName.en">Given name</prop>
-                    <prop key="displayName.de">Vorname</prop>
-                    <prop key="displayName.fr">Prénom</prop>
-                    <prop key="displayName.it">Nome</prop>
-                    <prop key="displayName.ja">名</prop>
-                    <prop key="description.en">Given name of a person</prop>
-                    <prop key="description.de">Vorname</prop>
-                    <prop key="description.fr">Prénom de l'utilisateur</prop>
-                    <prop key="description.it">Nome</prop>
-                    <prop key="description.ja">氏名(名)の英語表記</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">homePhone</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:0.9.2342.19200300.100.1.20</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:homePhone</prop>
-                    <prop key="displayName.en">Private phone number</prop>
-                    <prop key="displayName.de">Telefon Privat</prop>
-                    <prop key="displayName.fr">Teléphone personnel</prop>
-                    <prop key="displayName.it">Numero di telefono privato</prop>
-                    <prop key="displayName.ja">自宅電話番号</prop>
-                    <prop key="description.en">Private phone number</prop>
-                    <prop key="description.de">Private Telefonnummer</prop>
-                    <prop key="description.fr">Numéro de téléphone de domicile de la personne</prop>
-                    <prop key="description.it">Numero di telefono privato</prop>
-                    <prop key="description.ja">自宅の電話番号</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">homePostalAddress</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:0.9.2342.19200300.100.1.39</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:homePostalAddress</prop>
-                    <prop key="displayName.en">Home postal address</prop>
-                    <prop key="displayName.de">Heimatadresse</prop>
-                    <prop key="displayName.de-ch">Heimadresse</prop>
-                    <prop key="displayName.fr">Adresse personnelle</prop>
-                    <prop key="displayName.it">Indirizzo personale</prop>
-                    <prop key="displayName.ja">自宅住所</prop>
-                    <prop key="description.en">Home postal address: Home address of the user</prop>
-                    <prop key="description.de">Heimatadresse</prop>
-                    <prop key="description.de-ch">Heimadresse</prop>
-                    <prop key="description.fr">Adresse postale de domicile de la personne</prop>
-                    <prop key="description.it">Indirizzo personale: indirizzo dove abita l'utente</prop>
-                    <prop key="description.ja">自宅の住所</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">initials</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.43</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:initials</prop>
-                    <prop key="displayName.en">Initials</prop>
-                    <prop key="displayName.de">Initialen</prop>
-                    <prop key="displayName.fr">Initiales</prop>
-                    <prop key="displayName.ja">イニシャル</prop>
-                    <prop key="description.en">Initials</prop>
-                    <prop key="description.de">Anfangsbuchstaben des Namens</prop>
-                    <prop key="description.de-ch">Die Anfangsbuchstaben</prop>
-                    <prop key="description.fr">L' initiales</prop>
-                    <prop key="description.ja">イニシャル</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">l</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.7</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:l</prop>
-                    <prop key="displayName.en">Locality name</prop>
-                    <prop key="displayName.de">Ort</prop>
-                    <prop key="displayName.fr">Localité</prop>
-                    <prop key="displayName.ja">場所(L)</prop>
-                    <prop key="description.en">Locality name</prop>
-                    <prop key="description.de">Ort</prop>
-                    <prop key="description.fr">Nom de la localité où réside l'objet</prop>
-                    <prop key="description.ja">場所の名前 日本の場合は市区町村名</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">mail</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:0.9.2342.19200300.100.1.3</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:mail</prop>
-                    <prop key="displayName.en">E-mail</prop>
-                    <prop key="displayName.de">E-Mail</prop>
-                    <prop key="displayName.fr">Email</prop>
-                    <prop key="displayName.it">E-mail</prop>
-                    <prop key="displayName.ja">メールアドレス</prop>
-                    <prop key="description.en">E-Mail: Preferred address for e-mail to be sent to this person</prop>
-                    <prop key="description.de">E-Mail-Adresse</prop>
-                    <prop key="description.de-ch">E-Mail Adresse</prop>
-                    <prop key="description.fr">Adresse de courrier électronique</prop>
-                    <prop key="description.it">E-Mail: l'indirizzo e-mail preferito dall'utente</prop>
-                    <prop key="description.ja">メールアドレス</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">mobile</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:0.9.2342.19200300.100.1.41</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:mobile</prop>
-                    <prop key="displayName.en">Mobile phone number</prop>
-                    <prop key="displayName.de">Telefon Mobil</prop>
-                    <prop key="displayName.fr">Numéro de mobile</prop>
-                    <prop key="displayName.it">Numero di cellulare</prop>
-                    <prop key="displayName.ja">携帯電話番号</prop>
-                    <prop key="description.en">Mobile phone number</prop>
-                    <prop key="description.de">Mobile Telefonnummer</prop>
-                    <prop key="description.fr">Numéro de teléphone mobile</prop>
-                    <prop key="description.it">Numero di cellulare</prop>
-                    <prop key="description.ja">携帯電話の電話番号</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">o</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.10</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:o</prop>
-                    <prop key="displayName.en">Organization name</prop>
-                    <prop key="displayName.de">Organisationsname</prop>
-                    <prop key="displayName.fr">Nom de l'organisation</prop>
-                    <prop key="displayName.ja">所属機関名</prop>
-                    <prop key="description.en">Organization name</prop>
-                    <prop key="description.de">Name der Organisation</prop>
-                    <prop key="description.fr">Nom de l'organisation</prop>
-                    <prop key="description.ja">所属機関名称の英語表記</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">ou</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.11</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:ou</prop>
-                    <prop key="displayName.en">Organizational unit</prop>
-                    <prop key="displayName.de">Organisationseinheit</prop>
-                    <prop key="displayName.fr">Unité organisationnelle</prop>
-                    <prop key="displayName.ja">機関内所属名</prop>
-                    <prop key="description.en">Organizational unit</prop>
-                    <prop key="description.de">Name der Organisationseinheit</prop>
-                    <prop key="description.fr">Nom de l'unité organisationnelle</prop>
-                    <prop key="description.ja">機関内所属名称の英語表記</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">pager</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:0.9.2342.19200300.100.1.42</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:pager</prop>
-                    <prop key="displayName.en">Pager number</prop>
-                    <prop key="description.en">Pager number</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">postalAddress</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.16</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:postalAddress</prop>
-                    <prop key="displayName.en">Business postal address</prop>
-                    <prop key="displayName.de">Geschäftsadresse</prop>
-                    <prop key="displayName.fr">Adresse professionnelle</prop>
-                    <prop key="displayName.it">Indirizzo professionale</prop>
-                    <prop key="displayName.ja">所属機関住所</prop>
-                    <prop key="description.en">Business postal address: Campus or office address</prop>
-                    <prop key="description.de">Geschäftliche Adresse</prop>
-                    <prop key="description.de-ch">Adresse am Arbeitsplatz</prop>
-                    <prop key="description.fr">Adresse de l'institut, de l'université</prop>
-                    <prop key="description.it">Indirizzo professionale: indirizzo dell'istituto o dell'ufficio</prop>
-                    <prop key="description.ja">所属機関の住所</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">postalCode</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.17</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:postalCode</prop>
-                    <prop key="displayName.en">Postal code</prop>
-                    <prop key="displayName.en-us">ZIP code</prop>
-                    <prop key="displayName.de">Postleitzahl</prop>
-                    <prop key="displayName.fr">Code postal</prop>
-                    <prop key="displayName.ja">郵便番号</prop>
-                    <prop key="description.en">Postal code</prop>
-                    <prop key="description.en-us">ZIP code</prop>
-                    <prop key="description.de">Postleitzahl</prop>
-                    <prop key="description.fr">Code postal</prop>
-                    <prop key="description.ja">郵便番号</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">postOfficeBox</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:mace:dir:attribute-def:postOfficeBox</prop>
-                    <prop key="saml1.name">urn:oid:2.5.4.18</prop>
-                    <prop key="displayName.en">Postal box</prop>
-                    <prop key="displayName.de">Postfach</prop>
-                    <prop key="displayName.fr">Boite postale</prop>
-                    <prop key="displayName.fr-ch">Case postale</prop>
-                    <prop key="displayName.ja">私書箱</prop>
-                    <prop key="description.en">Postal box identifier</prop>
-                    <prop key="description.de">Postfach</prop>
-                    <prop key="description.fr">Boite postale</prop>
-                    <prop key="description.fr-ch">Case postale</prop>
-                    <prop key="description.ja">私書箱</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">preferredLanguage</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.16.840.1.113730.3.1.39</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:preferredLanguage</prop>
-                    <prop key="displayName.en">Preferred Language</prop>
-                    <prop key="displayName.de">Bevorzugte Sprache</prop>
-                    <prop key="displayName.fr">Langue préférée</prop>
-                    <prop key="displayName.it">Lingua preferita</prop>
-                    <prop key="displayName.ja">希望言語</prop>
-                    <prop key="description.en">Preferred language: Users preferred language (see RFC1766)</prop>
-                    <prop key="description.de">Bevorzugte Sprache (siehe RFC1766)</prop>
-                    <prop key="description.fr">Exemple: fr, de, it, en, ... (voir RFC1766)</prop>
-                    <prop key="description.it">Lingua preferita: la lingua preferita dall'utente (cfr. RFC1766)</prop>
-                    <prop key="description.ja">利用者が希望する言語(RFC1766 を参照)</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">sn</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.4</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:sn</prop>
-                    <prop key="displayName.en">Surname</prop>
-                    <prop key="displayName.de">Nachname</prop>
-                    <prop key="displayName.fr">Nom de famille</prop>
-                    <prop key="displayName.it">Cognome</prop>
-                    <prop key="displayName.ja">姓</prop>
-                    <prop key="description.en">Surname or family name</prop>
-                    <prop key="description.de">Familienname</prop>
-                    <prop key="description.fr">Nom de famille de l'utilisateur</prop>
-                    <prop key="description.it">Cognome dell'utilizzatore</prop>
-                    <prop key="description.ja">氏名(姓)の英語表記</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">st</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.8</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:st</prop>
-                    <prop key="displayName.en">State or province name</prop>
-                    <prop key="displayName.fr">Etat ou nom de province</prop>
-                    <prop key="displayName.ja">都道府県もしくは州や省(ST)</prop>
-                    <prop key="description.en">State or province name</prop>
-                    <prop key="description.fr">Etat ou nom de province</prop>
-                    <prop key="description.ja">州名や省名 国によって異なり日本の場合は都道府県名</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">street</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.9</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:street</prop>
-                    <prop key="displayName.en">Street</prop>
-                    <prop key="displayName.de">Straße</prop>
-                    <prop key="displayName.de-ch">Strasse</prop>
-                    <prop key="displayName.fr">Rue</prop>
-                    <prop key="displayName.ja">通り</prop>
-                    <prop key="description.en">Street address</prop>
-                    <prop key="description.de">Name der Straße</prop>
-                    <prop key="description.de-ch">Strassenadresse</prop>
-                    <prop key="description.fr">Nom de rue</prop>
-                    <prop key="description.ja">通りおよび番地</prop>
-                </props>
-            </property>
-        </bean>
-
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">telephoneNumber</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.20</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:telephoneNumber</prop>
-                    <prop key="displayName.en">Business phone number</prop>
-                    <prop key="displayName.de">Telefon Geschäft</prop>
-                    <prop key="displayName.fr">Teléphone professionnel</prop>
-                    <prop key="displayName.it">Numero di telefono dell'ufficio</prop>
-                    <prop key="displayName.ja">所属機関内電話番号</prop>
-                    <prop key="description.en">Business phone number: Office or campus phone number</prop>
-                    <prop key="description.de">Telefonnummer am Arbeitsplatz</prop>
-                    <prop key="description.fr">Teléphone de l'institut, de l'université</prop>
-                    <prop key="description.it">Numero di telefono dell'ufficio</prop>
-                    <prop key="description.ja">所属機関での利用者の電話番号</prop>
-                </props>
-            </property>
-        </bean>
-        
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">title</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:2.5.4.12</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:title</prop>
-                    <prop key="displayName.en">Title</prop>
-                    <prop key="displayName.de">Titel</prop>
-                    <prop key="displayName.fr">Title</prop>
-                    <prop key="displayName.ja">肩書き</prop>
-                    <prop key="description.en">Title of a person</prop>
-                    <prop key="description.de">Titel der Person</prop>
-                    <prop key="description.fr">Titre de la personne</prop>
-                    <prop key="description.ja">利用者の肩書き</prop>
-                </props>
-            </property>
-        </bean>
-        
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">uid</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:0.9.2342.19200300.100.1.1</prop>
-                    <prop key="saml1.name">urn:mace:dir:attribute-def:uid</prop>
-                    <prop key="displayName.en">User ID</prop>
-                    <prop key="displayName.de">Benutzer-ID</prop>
-                    <prop key="displayName.fr">ID utilisateur</prop>
-                    <prop key="displayName.it">ID dell'utente</prop>
-                    <prop key="displayName.ja">ユーザID</prop>
-                    <prop key="description.en">A unique identifier for a person, mainly used for user identification within the user's home organization</prop>
-                    <prop key="description.de">Eine eindeutige Nummer für eine Person, welche hauptsächlich zur Identifikation innerhalb der Organisation benutzt wird</prop>
-                    <prop key="description.fr">Identifiant de connexion d'une personnes sur les systèmes informatiques</prop>
-                    <prop key="description.it">Identificativo unico della persona, usato per l'identificazione dell'utente all'interno della organizzazione di appartenenza</prop>
-                    <prop key="description.ja">所属機関内で一意の利用者識別子</prop>
-                </props>
-            </property>
-        </bean>
-
-    </list>
-    </constructor-arg>
-    </bean>
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/samlSubject.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/samlSubject.xml
deleted file mode 100644
index 3ffa3cc..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/samlSubject.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-
-    <!--
-    Note that all built-in rules rely on URI-naming and thus include the implied settings:
-    
-    <prop key="saml2.nameFormat">urn:oasis:names:tc:SAML:2.0:attrname-format:uri</prop>
-    -->
-
-    <!-- https://wiki.oasis-open.org/security/SAMLSubjectIDAttr -->
-
-    <bean parent="shibboleth.TranscodingRuleLoader">
-    <constructor-arg>
-    <list>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">samlSubjectID</prop>
-                    <prop key="transcoder">SAML2ScopedStringTranscoder</prop>
-                    <prop key="saml2.name">urn:oasis:names:tc:SAML:attribute:subject-id</prop>
-                    <prop key="displayName.en">Unique ID</prop>
-                    <prop key="displayName.de">Eindeutige ID</prop>
-                    <prop key="displayName.fr">ID unique</prop>
-                    <prop key="displayName.it">ID unico</prop>
-                    <prop key="displayName.ja">サブジェクトID</prop>
-                    <prop key="description.en">A unique identifier for a person, mainly for inter-institutional user identification</prop>
-                    <prop key="description.de">Eindeutige Benutzeridentifikation</prop>
-                    <prop key="description.de-ch">Eindeutige Benützeridentifikation</prop>
-                    <prop key="description.fr">Identifiant unique de l'utilisateur</prop>
-                    <prop key="description.it">Un identificativo personale che identifica chiaramente l'utente in seno alla sua organizzazione</prop>
-                    <prop key="description.ja">フェデレーション内で一意で永続的かつ難読化された利用者識別子(eduPersonUniqueIdの後継)</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">samlPairwiseID</prop>
-                    <prop key="transcoder">SAML2ScopedStringTranscoder</prop>
-                    <prop key="saml2.name">urn:oasis:names:tc:SAML:attribute:pairwise-id</prop>
-                    <prop key="displayName.en">Pairwise ID</prop>
-                    <prop key="displayName.de">Pairwise ID</prop>
-                    <prop key="displayName.fr">Pairwise ID</prop>
-                    <prop key="displayName.it">Pairwise ID</prop>
-                    <prop key="displayName.ja">ペアワイズID</prop>
-                    <prop key="description.en">Pairwise ID: A unique identifier for a person, different for each service provider</prop>
-                    <prop key="description.de">Pairwise ID: Eindeutige Benutzeridentifikation, unterschiedlich pro Service Provider</prop>
-                    <prop key="description.de-ch">Pairwise ID: Eindeutige Benützeridentifikation, unterschiedlich pro Service Provider</prop>
-                    <prop key="description.fr">Pairwise ID: Un identifiant unique de l'utilisateur, différent pour chaque fournisseur de service</prop>
-                    <prop key="description.it">Pairwise ID: identificativo unico della persona, differente per ogni fornitore di servizio</prop>
-                    <prop key="description.ja">フェデレーション内で一意かつSP毎に送出される値が異なる利用者識別子(eduPersonTargetedIDの後継)</prop>
-                </props>
-            </property>
-        </bean>
-
-    </list>
-    </constructor-arg>
-    </bean>
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/schac.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/schac.xml
deleted file mode 100644
index 2e0db26..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/attributes/schac.xml
+++ /dev/null
@@ -1,382 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-
-    <!--
-    Note that all built-in rules rely on URI-naming and thus include the implied settings:
-    
-    <prop key="saml2.nameFormat">urn:oasis:names:tc:SAML:2.0:attrname-format:uri</prop>
-    <prop key="saml1.namespace">urn:mace:shibboleth:1.0:attributeNamespace:uri</prop>
-    -->
-
-    <bean parent="shibboleth.TranscodingRuleLoader">
-    <constructor-arg>
-    <list>
-	<bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacMotherTongue</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.1</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.1</prop>
-                    <prop key="displayName.en">Mother Tongue</prop>
-                    <prop key="displayName.fr">Langue maternelle</prop>
-                    <prop key="displayName.it">Lingua Madre</prop>
-                    <prop key="description.en">Mother Tongue of the user</prop>
-                    <prop key="description.fr">Langue maternelle (la langue apprise en premier par une personne : fr</prop>
-                    <prop key="description.it">Lingua Madre dell'utente</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacGender</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.2</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.2</prop>
-                    <prop key="displayName.en">Gender</prop>
-                    <prop key="displayName.fr">Genre</prop>
-                    <prop key="displayName.it">Genere</prop>
-                    <prop key="description.en">Gender of the user</prop>
-                    <prop key="description.fr">Genre de la personne : un chiffre (0 "Not known, 1 "Male", 2 "Female", 9 "Not specified")</prop>
-                    <prop key="description.it">Genere dell'utente</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacDateOfBirth</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.3</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.3</prop>
-                    <prop key="displayName.en">Date or Birth</prop>
-                    <prop key="displayName.fr">Date de naissance</prop>
-                    <prop key="displayName.it">Giorno di nascita</prop>
-                    <prop key="description.en">The date of birth for the subject it is associated with</prop>
-                    <prop key="description.fr">Date de naissance au format "YYYYMMJJ"</prop>
-                    <prop key="description.it">Giorno di nascita del soggetto</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacYearOfBirth</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.0.2.3</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.0.2.3</prop>
-                    <prop key="displayName.en">Year of birth</prop>
-                    <prop key="displayName.fr">Année de naissance</prop>
-                    <prop key="displayName.it">Anno di nascita</prop>
-                    <prop key="description.en">The year of birth for the subject it is associated with</prop>
-                    <prop key="description.fr">Année de naissance au format "YYYY"</prop>
-                    <prop key="description.it">Anno di nascita del soggetto</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacPlaceOfBirth</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.4</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.4</prop>
-                    <prop key="displayName.en">Place of Birth</prop>
-                    <prop key="displayName.fr">Lieu de naissance</prop>
-                    <prop key="displayName.it">Luogo di nascita</prop>
-                    <prop key="description.en">The place of birth for the subject it is associated with</prop>
-                    <prop key="description.fr">Lieu de naissance</prop>
-                    <prop key="description.it">Luogo di nascita del soggetto</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacCountryOfCitizenship</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.5</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.5</prop>
-                    <prop key="displayName.en">Country of Citizenship</prop>
-                    <prop key="displayName.fr">Nationalité</prop>
-                    <prop key="description.en">The countries of citizenship for the subject it is associated with</prop>
-                    <prop key="description.fr">Pays où une personne est un citoyen : 2 lettres au format ISO 3166 (fr, es...)</prop>
-                    <prop key="description.it">Cittadinanza</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacSn1</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.6</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.6</prop>
-                    <prop key="displayName.en">First Surname</prop>
-                    <prop key="displayName.fr">Premier nom</prop>
-                    <prop key="displayName.it">Primo Cognome</prop>
-                    <prop key="description.en">First surname of a person ("the surname" in international terms)</prop>
-                    <prop key="description.fr">Premier nom d'une personne</prop>
-                    <prop key="description.it">Il cognome di una persona</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacSn2</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.7</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.7</prop>
-                    <prop key="displayName.en">Second Surname</prop>
-                    <prop key="displayName.fr">Second nom</prop>
-                    <prop key="displayName.it">Secondo Cognome</prop>
-                    <prop key="description.en">Second surname of a person</prop>
-                    <prop key="description.fr">Second nom d'une personne</prop>
-                    <prop key="description.it">Secondo cognome di una persona</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacPersonalTitle</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.8</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.8</prop>
-                    <prop key="displayName.en">Personal Title</prop>
-                    <prop key="displayName.fr">Titre</prop>
-                    <prop key="displayName.it">Soprannome</prop>
-                    <prop key="description.en">Nice name used for the user</prop>
-                    <prop key="description.fr">Titre de la personne</prop>
-                    <prop key="description.it">Titolo usato per salutare l'utente</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacHomeOrganization</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.9</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.9</prop>
-                    <prop key="displayName.en">Home Organization</prop>
-                    <prop key="displayName.fi">Kotiorganisaatio</prop>
-                    <prop key="displayName.fr">Organisme</prop>
-                    <prop key="displayName.it">Dominio dell'istituzione</prop>
-                    <prop key="description.en">The domain name of the person's home organisation</prop>
-                    <prop key="description.fi">Henkilön kotiorganisaation domain-nimi</prop>
-                    <prop key="description.fr">Nom de domaine DNS de l'organisme d'origine d'une personne</prop>
-                    <prop key="description.it">Dominio dell'istituzione</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacHomeOrganizationType</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.10</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.10</prop>
-                    <prop key="displayName.en">Home organization type</prop>
-                    <prop key="displayName.fi">Kotiorganisaation tyyppi</prop>
-                    <prop key="displayName.fr">Type d'organisme</prop>
-                    <prop key="displayName.it">Tipo di organizzazione di appartenenza (internazionale)</prop>
-                    <prop key="description.en">Home organisation type: university, polytechnic, etc</prop>
-                    <prop key="description.fi">Kotiorganisaation tyyppi: yliopisto, ammattikorkeakoulu jne</prop>
-                    <prop key="description.fr">Type d'organisme d'origine d'une personne</prop>
-                    <prop key="description.it">Tipo di organizzazione di appartenenza</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacCountryOfResidence</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.11</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.11</prop>
-                    <prop key="displayName.en">Country of Residence</prop>
-                    <prop key="displayName.fr">Pays de résidence</prop>
-                    <prop key="displayName.it">Residenza</prop>
-                    <prop key="description.en">The country of residence for the subject</prop>
-                    <prop key="description.fr">Pays de résidence : fr, es...</prop>
-                    <prop key="description.it">Paese di residenza dell'utente</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacUserPresenceID</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.12</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.12</prop>
-                    <prop key="displayName.en">User Presence ID</prop>
-                    <prop key="displayName.fr">Identifiant de présence</prop>
-                    <prop key="displayName.it">ID utente sulla rete</prop>
-                    <prop key="description.en">Identifiers that user collect on the net</prop>
-                    <prop key="description.fr">Ensemble de valeurs liées aux protocoles de présence réseau (sip, xmpp, h323...)</prop>
-                    <prop key="description.it">Identificativi usati dall'utente sulla rete</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacPersonalPosition</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.13</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.13</prop>
-                    <prop key="displayName.en">Personal Position</prop>
-                    <prop key="displayName.fr">Position/Rôle</prop>
-                    <prop key="displayName.it">Ruolo ricoperto</prop>
-                    <prop key="description.en">Personal Position of the user for the institution</prop>
-                    <prop key="description.fr">Position/Rôle de la personne au sein d'une institution</prop>
-                    <prop key="description.it">Ruolo dell'utente nell'istituzione</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacPersonalUniqueCode</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.14</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.14</prop>
-                    <prop key="displayName.en">Personal Unique Code</prop>
-                    <prop key="displayName.fr">Code personnel unique</prop>
-                    <prop key="displayName.it">Codice Univoco</prop>
-                    <prop key="description.en">Unique code for the subject it is associated with</prop>
-                    <prop key="description.fr">"Code unique" pour le sujet auquel il est associé (peut être le numéro d'étudiant, le numéro d'employé, ...)</prop>
-                    <prop key="description.it">Codice Univoco legato al soggetto</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacPersonalUniqueID</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.15</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.15</prop>
-                    <prop key="displayName.en">Personal Unique ID</prop>
-                    <prop key="displayName.fr">Identifiant personnel unique</prop>
-                    <prop key="displayName.it">ID Legale Univoco</prop>
-                    <prop key="description.en">Unique Legal Identifier of a person</prop>
-                    <prop key="description.fr">identifiant unique légal (DNI en espagne)</prop>
-                    <prop key="description.it">Identificativo Univoco Legale associato alla persona</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacExpiryDate</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.17</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.17</prop>
-                    <prop key="displayName.en">Expiry Date</prop>
-                    <prop key="displayName.fr">Date d'expiration</prop>
-                    <prop key="description.en">The date from which the set of data is to be considered invalid (specifically, in what refers to rights and entitlements)</prop>
-                    <prop key="description.fr">Date à partir de laquelle l'ensemble de données de la personne doit être considéré comme invalide, au format "YYYYMMDDhhmmssZ"</prop>
-                    <prop key="description.it">Data di scadenza dei dati utente (diritti e titoli)</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacUserPrivateAttribute</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.18</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.18</prop>
-                    <prop key="displayName.en">User Private Attribute</prop>
-                    <prop key="displayName.fr">Exigences de confidentialité</prop>
-                    <prop key="description.en">Datas that the user and/or organization policies want to keep private</prop>
-                    <prop key="description.fr">Exigences de confidentialité, telles qu'exprimées par l'utilisateur et / ou les stratégies de l'entreprise</prop>
-                    <prop key="description.it">Dati che l'utente o le policy organizzative vogliono tenere private</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacUserStatus</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.19</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.19</prop>
-                    <prop key="displayName.en">User Status</prop>
-                    <prop key="displayName.fr">Status utilisateur</prop>
-                    <prop key="description.en">Set of status of a person as user of services</prop>
-                    <prop key="description.fr">Ensemble de status d'une personne en tant qu'utilisateur de services</prop>
-                    <prop key="description.it">Stato di attivita' per l'utente sui diversi servizi</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacProjectMembership</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.20</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.20</prop>
-                    <prop key="displayName.en">Project Membership</prop>
-                    <prop key="displayName.fr">Appartenance au projet</prop>
-                    <prop key="description.en">Name of the project the user belongs to</prop>
-                    <prop key="description.fr">Nom du projet auquel l'utilisateur appartient</prop>
-                    <prop key="description.it">Nome del progetto a cui l'utente appartiene</prop>
-                </props>
-            </property>
-        </bean>
-
-        <bean parent="shibboleth.TranscodingProperties">
-            <property name="properties">
-                <props merge="true">
-                    <prop key="id">schacProjectSpecificRole</prop>
-                    <prop key="transcoder">SAML2StringTranscoder SAML1StringTranscoder</prop>
-                    <prop key="saml2.name">urn:oid:1.3.6.1.4.1.25178.1.2.21</prop>
-                    <prop key="saml1.name">urn:oid:1.3.6.1.4.1.25178.1.2.21</prop>
-                    <prop key="displayName.en">Project Specific Role</prop>
-                    <prop key="displayName.fr">Roles spécifiques au projet</prop>
-                    <prop key="description.en">Set of roles inside specific projects for the user</prop>
-                    <prop key="description.fr">Ensemble de rôles dans des projets spécifiques</prop>
-                    <prop key="description.it">Insieme dei ruoli svolti dall'utente su specifici progetti</prop>
-                </props>
-            </property>
-        </bean>
-    </list>
-    </constructor-arg>
-    </bean>
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/audit.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/audit.xml
deleted file mode 100644
index 3c9c408..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/audit.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-    xmlns:context="http://www.springframework.org/schema/context"
-    xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
-    xmlns:c="http://www.springframework.org/schema/c" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-
-    default-init-method="initialize"
-    default-destroy-method="destroy">
-
-    <!--
-    This bean defines a mapping between audit log categories and formatting strings.
-    -->
-    <util:map id="shibboleth.AuditFormattingMap">
-        <entry key="Shibboleth-Audit" value="%a|%ST|%T|%u|%SP|%i|%ac|%t|%attr|%n|%f|%SSO|%XX|%XA|%b|%bb|%e|%S|%SS|%s|%UA" />
-    </util:map>
-
-    <!-- Override the format of date/time fields in the log and/or convert to default time zone. -->
-    <!--
-    <bean id="shibboleth.AuditDateTimeFormat" class="java.lang.String" c:_0="yyyy-MM-dd'T'HH:mm:ss.SSSZZ" />
-    <util:constant id="shibboleth.AuditDefaultTimeZone" static-field="java.lang.Boolean.TRUE" />
-    -->
-
-    <!-- Allows auditing to be disabled selectively for particular profiles/flows. -->
-    <util:list id="shibboleth.AuditSuppressedProfiles">
-        <value>http://shibboleth.net/ns/profiles/status</value>
-        <value>http://shibboleth.net/ns/profiles/mdquery</value>
-    </util:list>
-
-    <!--
-    You can freely add/change this map to map constants or frequently appearing strings into
-    shorter values in the audit log.
-    -->
-    <util:map id="shibboleth.AuditFieldReplacementMap">
-        <entry key="urn:oasis:names:tc:SAML:1.0:am:password" value="password" />
-        <entry key="urn:oasis:names:tc:SAML:2.0:ac:classes:Password" value="password" />
-        <entry key="urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" value="password" />
-        <entry key="urn:mace:shibboleth:1.0:nameIdentifier" value="transient" />
-        <entry key="urn:oasis:names:tc:SAML:2.0:nameid-format:transient" value="transient" />
-        <entry key="urn:oasis:names:tc:SAML:2.0:nameid-format:persistent" value="persistent" />
-        <entry key="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress" value="emailAddress" />
-        <entry key="urn:oasis:names:tc:SAML:2.0:status:Success" value="Success" />
-        <entry key="urn:oasis:names:tc:SAML:2.0:status:Requester" value="Requester" />
-        <entry key="urn:oasis:names:tc:SAML:2.0:status:Responder" value="Responder" />
-        <entry key="http://www.w3.org/2009/xmlenc11#aes128-gcm" value="AES128-GCM" />
-        <entry key="http://www.w3.org/2009/xmlenc11#aes192-gcm" value="AES192-GCM" />
-        <entry key="http://www.w3.org/2009/xmlenc11#aes256-gcm" value="AES256-GCM" />
-        <entry key="http://www.w3.org/2001/04/xmlenc#aes128-cbc" value="AES128-CBC" />
-        <entry key="http://www.w3.org/2001/04/xmlenc#aes192-cbc" value="AES192-CBC" />
-        <entry key="http://www.w3.org/2001/04/xmlenc#aes256-cbc" value="AES256-CBC" />
-    </util:map>
-
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/authn-comparison.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/authn-comparison.xml
deleted file mode 100644
index 0730bcb..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/authn-comparison.xml
+++ /dev/null
@@ -1,117 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-
-    <!--
-    This is a map used to "weight" particular methods above others if the IdP has to randomly select one
-    to insert into a SAML authentication statement. The typical use shown below is to bias the IdP in favor
-    of expressing the SAML 2 PasswordProtectedTransport class over the more vanilla Password class on the
-    assumption that the IdP doesn't accept passwords via an insecure channel. This map never causes the IdP
-    to violate its matching rules if an RP requests a particular value; it only matters when nothing specific
-    is chosen. Anything not in the map has a weight of zero.
-    -->
-    
-    <util:map id="shibboleth.AuthenticationPrincipalWeightMap">
-        <entry>
-            <key>
-                <bean parent="shibboleth.SAML2AuthnContextClassRef"
-                    c:classRef="urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" />
-            </key>
-            <value>1</value>
-        </entry>
-    </util:map>
-
-    <!--
-    Uncomment and add entries to this map to support "inexact" SAML RequestedAuthnContext operators.
-    Please refer to the AuthenticationFlowSelection documentation topic for details and examples. 
-    -->
-    <!--
-    <util:map id="shibboleth.AuthnComparisonRules">
-    </util:map>
-    -->
-
-    <!-- List of context classes or declarations to ignore if an SP requests them. -->
-
-    <util:list id="shibboleth.IgnoredContexts">
-        <value>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</value>
-    </util:list>
-    
-    <!--
-    Mappings to transform custom Principals for proxied AuthnRequests.
-    Key is the input, value is a collection of possibly empty outputs.
-    Used by default to transform authentication type values from
-    SPs -> Proxied IdPs.
-    -->
-    <util:map id="shibboleth.PrincipalProxyRequestMappings">
-        <!--
-        <entry>
-            <key>
-                <bean parent="shibboleth.SAML1AuthenticationMethod"
-                    c:classRef="https://sp.example.org/context" />
-            </key>
-            <list>
-                <bean parent="shibboleth.SAML2AuthnContextClassRef"
-                    c:classRef="https://proxy.example.org/context1" />
-                <bean parent="shibboleth.SAML2AuthnContextClassRef"
-                    c:classRef="https://proxy.example.org/context2" />
-            </list>
-        </entry>
-        <entry>
-            <key>
-                <bean parent="shibboleth.SAML2AuthnContextClassRef"
-                    c:classRef="https://sp.example.org/context" />
-            </key>
-            <list>
-                <bean parent="shibboleth.SAML2AuthnContextClassRef"
-                    c:classRef="https://proxy.example.org/context1" />
-                <bean parent="shibboleth.SAML2AuthnContextClassRef"
-                    c:classRef="https://proxy.example.org/context2" />
-            </list>
-        </entry>
-        -->
-    </util:map>
-
-    <!--
-    Mappings to transform proxied Principals for inclusion in Subjects.
-    Key is the input, value is a collection of possibly empty outputs.
-    Used by default to transform values from Proxied IdP. -> 
-    -->
-    <util:map id="shibboleth.PrincipalProxyResponseMappings">
-        <!--
-        <entry>
-            <key>
-                <bean parent="shibboleth.SAML2AuthnContextClassRef"
-                    c:classRef="https://proxy.example.org/context1" />
-            </key>
-            <list>
-                <bean parent="shibboleth.SAML1AuthenticationMethod"
-                    c:classRef="https://sp.example.org/context" />
-                <bean parent="shibboleth.SAML2AuthnContextClassRef"
-                    c:classRef="https://sp.example.org/context" />
-            </list>
-        </entry>
-        <entry>
-            <key>
-                <bean parent="shibboleth.SAML2AuthnContextClassRef"
-                    c:classRef="https://proxy.example.org/context2" />
-            </key>
-            <list>
-                <bean parent="shibboleth.SAML1AuthenticationMethod"
-                    c:classRef="https://sp.example.org/context" />
-                <bean parent="shibboleth.SAML2AuthnContextClassRef"
-                    c:classRef="https://sp.example.org/context" />
-            </list>
-        </entry>
-        -->
-    </util:map>
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/authn-events-flow.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/authn-events-flow.xml
deleted file mode 100644
index 8846677..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/authn-events-flow.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<flow xmlns="http://www.springframework.org/schema/webflow"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow.xsd"
-      abstract="true">
-
-    <!-- ADVANCED USE ONLY -->
-    
-    <!--
-    You can ignore this file unless you are creating your own custom login subflows that want to
-    report custom events in response to unusual error or warning conditions.
-    -->
-
-    <!-- Custom error events to reflect back from user-supplied login subflows. -->
-
-    <!-- <end-state id="MyCustomEvent" /> -->
-
-    <global-transitions>
-        <!-- <transition on="MyCustomEvent" to="MyCustomEvent" /> -->
-        <transition on="#{!'proceed'.equals(currentEvent.id)}" to="InvalidEvent" />
-    </global-transitions>
-
-</flow>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/authn.properties b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/authn.properties
deleted file mode 100644
index 405c522..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/authn.properties
+++ /dev/null
@@ -1,227 +0,0 @@
-# Properties that control authentication generally and the behavior of
-# specific methods.
-
-# Regular expression matching login flows to enable, e.g. IPAddress|Password
-#idp.authn.flows = Password
-
-# Default settings for most authentication methods.
-#idp.authn.defaultLifetime = PT1H
-#idp.authn.defaultTimeout = PT30M
-#idp.authn.proxyRestrictionsEnforced = true
-
-# Whether to populate relying party user interface information for display
-# during authentication, consent, terms-of-use.
-#idp.authn.rpui = true
-
-# Whether to prioritize "active" results when an SP requests more than
-# one possible matching login method (V2 behavior was to favor them)
-#idp.authn.favorSSO = false
-
-# Whether to fail requests when a user identity after authentication
-# doesn't match the identity in a pre-existing session.
-#idp.authn.identitySwitchIsError = false
-
-# If using IdP discovery feature, provides a discovery location to use.
-#idp.authn.discoveryURL = https://ds.example.org/shibboleth-ds/index.html
-
-# Login flow audit logging (defaults false for log compatibility)
-#idp.authn.audit.enabled = false
-
-# Revocation (administrative logout)
-#idp.authn.revocation = false
-#idp.authn.revocation.lifetime = %{idp.authn.defaultAuthnLifetime:PT12H}
-# Name of BiCondition to apply for check
-#idp.authn.revocation.Condition = shibboleth.RevocationCacheCondition
-# Set to true to treat lookup failures as being revoked.
-#idp.authn.revocation.strict = false
-# Set to true to check for address-based revocation.
-#idp.authn.revocation.addressBased = false
-# Default implementation based on a StorageService bean.
-#idp.authn.revocation.cache = shibboleth.AuthnRevocationCache
-#idp.authn.revocation.StorageService = shibboleth.StorageService
-
-
-# Properties below override specific method behavior, as an alternative
-# to defining Spring beans in XML. Refer to the documentation for a complete
-# list. Many of the properties below are mentioned only because they are
-# atypical defaults assumed for a given method.
-
-# Flow selection among multiple equivalent options can be managed with
-# the order properties, lower will be tried first.
-
-#### Password ####
-
-#idp.authn.Password.order = 1000
-#idp.authn.Password.passiveAuthenticationSupported = true
-#idp.authn.Password.forcedAuthenticationSupported = true
-# Override this and removeAfterValidation to require all validators to succeed
-#idp.authn.Password.requireAll = false
-# Override to keep the password around
-#idp.authn.Password.removeAfterValidation = true
-# Override to store password in Java Subject
-#idp.authn.Password.retainAsPrivateCredential = false
-# Simple username transforms before validation
-#idp.authn.Password.trim = true
-#idp.authn.Password.lowercase = false
-#idp.authn.Password.uppercase = false
-#idp.authn.Password.matchExpression = 
-# Override default form field names
-#idp.authn.Password.usernameFieldName = j_username
-#idp.authn.Password.passwordFieldName = j_password
-#idp.authn.Password.ssoBypassFieldName = donotcache
-# Unset if using customized Principals per validator
-#idp.authn.Password.addDefaultPrincipals = true
-# The Principal collection below is the typical default if not otherwise noted.
-#idp.authn.Password.supportedPrincipals = \
-#    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport, \
-#    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:Password, \
-#    saml1/urn:oasis:names:tc:SAML:1.0:am:password
-# Validators are controlled in password-authn-config.xml
-
-#### Password Backends ####
-
-# See ldap.properties for LDAP authn properties
-# Kerberos settings
-#idp.authn.Krb5.refreshConfig = false
-#idp.authn.Krb5.preserveTicket = false
-# Set next two for KDC verification
-#idp.authn.Krb5.servicePrincipal = 
-#idp.authn.Krb5.keytab = 
-# JAAS settings
-#idp.authn.JAAS.loginConfigNames = ShibUserPassAuth
-#idp.authn.JAAS.loginConfig = %{idp.home}/conf/authn/jaas.config
-
-#### External ####
-
-#idp.authn.External.order = 1000
-#idp.authn.External.nonBrowserSupported = false
-#idp.authn.External.matchExpression = 
-# Unset if you plan to return full Java Subject from external source
-#idp.authn.External.addDefaultPrincipals = true
-# Servlet context-relative path to wherever your implementation lives
-idp.authn.External.externalAuthnPath = contextRelative:external.jsp
-
-#### RemoteUser ####
-
-#idp.authn.RemoteUser.order = 1000
-#idp.authn.RemoteUser.nonBrowserSupported = false
-#idp.authn.RemoteUser.matchExpression = 
-# Unset in most cases only if using the authnMethodHeader or
-# subjectAttribute settings
-#idp.authn.RemoteUser.addDefaultPrincipals = true
-#idp.authn.RemoteUser.checkRemoteUser = true
-# Comma-delimited lists of attributes or headers to pull from
-#idp.authn.RemoteUser.checkAttributes = 
-#idp.authn.RemoteUser.checkHeaders = 
-# Advanced settings
-#idp.authn.RemoteUser.subjectAttribute =
-#idp.authn.RemoteUser.authnMethodHeader =
-#idp.authn.RemoteUser.authnAuthorityHeader =
-
-#### RemoteUserInternal ####
-
-#idp.authn.RemoteUserInternal.order = 1000
-#idp.authn.RemoteUserInternal.nonBrowserSupported = true
-# Unset in most cases only if using the authnMethodHeader feature
-#idp.authn.RemoteUserInternal.addDefaultPrincipals = true
-#idp.authn.RemoteUserInternal.checkRemoteUser = true
-# Comma-delimited lists of attributes or headers to pull from
-#idp.authn.RemoteUserInternal.checkAttributes = 
-#idp.authn.RemoteUserInternal.checkHeaders = 
-# Simple transforms to apply
-#idp.authn.RemoteUserInternal.trim = true
-#idp.authn.RemoteUserInternal.lowercase = false
-#idp.authn.RemoteUserInternal.uppercase = false
-#idp.authn.RemoteUserInternal.matchExpression = 
-#idp.authn.RemoteUserInternal.allowedUsernames = 
-#idp.authn.RemoteUserInternal.deniedUsernames = 
-
-#### SPNEGO ####
-
-#idp.authn.SPNEGO.order = 1000
-#idp.authn.SPNEGO.nonBrowserSupported = false
-#idp.authn.SPNEGO.enforceRun = false
-#idp.authn.SPNEGO.refreshKrbConfig = false
-#idp.authn.SPNEGO.matchExpression = 
-idp.authn.SPNEGO.supportedPrincipals = \
-    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:Kerberos, \
-    saml1/urn:ietf:rfc:1510
-
-#### X509 ####
-
-#idp.authn.X509.order = 1000
-#idp.authn.X509.nonBrowserSupported = false
-#idp.authn.X509.saveCertificateToCredentialSet = true
-# Servlet context-relative path to wherever your implementation lives
-#idp.authn.X509.externalAuthnPath = contextRelative:x509-prompt.jsp
-idp.authn.X509.supportedPrincipals = \
-    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:X509, \
-    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient, \
-    saml1/urn:ietf:rfc:2246
-
-#### X509Internal ####
-
-#idp.authn.X509Internal.order = 1000
-#idp.authn.X509Internal.nonBrowserSupported = false
-#idp.authn.X509Internal.saveCertificateToCredentialSet = true
-idp.authn.X509Internal.supportedPrincipals = \
-    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:X509, \
-    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:TLSClient, \
-    saml1/urn:ietf:rfc:2246
-
-#### IPAddress ####
-
-#idp.authn.IPAddress.order = 1000
-#idp.authn.IPAddress.passiveAuthenticationSupported = true
-#idp.authn.IPAddress.lifetime = PT60S
-#idp.authn.IPAddress.inactivityTimeout = PT60S
-idp.authn.IPAddress.supportedPrincipals = \
-   saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocol
-
-#### Function ####
-
-#idp.authn.Function.order = 1000
-#idp.authn.Function.passiveAuthenticationSupported = true
-# Unset if you plan to return full Java Subject from function
-#idp.authn.Function.addDefaultPrincipals = true
-
-#### SAML ####
-
-#idp.authn.SAML.order = 1000
-#idp.authn.SAML.nonBrowserSupported = false
-#idp.authn.SAML.passiveAuthenticationSupported = true
-#idp.authn.SAML.forcedAuthenticationSupported = true
-#idp.authn.SAML.proxyScopingEnforced = true
-# Discovery options:
-#   Define shibboleth.authn.SAML.discoveryFunction bean
-#   Set proxyEntityID property
-#   Fall through to discovery via discoveryRequired property
-#idp.authn.SAML.proxyEntityID = https://idp.example.org/idp/shibboleth
-#idp.authn.SAML.discoveryRequired = true
-# Generally left false with bidirectional mappings in
-# conf/authn/authn-comparison.xml across the proxy boundary.
-# Adjust as needed to reflect IdP's capabilities/support.
-#idp.authn.SAML.addDefaultPrincipals = false
-#idp.authn.SAML.supportedPrincipals = \
-#    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport, \
-#    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:Password, \
-#    saml1/urn:oasis:names:tc:SAML:1.0:am:password
-
-#### MFA ####
-
-#idp.authn.MFA.order = 1000
-#idp.authn.MFA.passiveAuthenticationSupported = true
-#idp.authn.MFA.forcedAuthenticationSupported = true
-#idp.authn.MFA.validateLoginTransitions = true
-# Defaults to set AuthnInstant based on oldest component result
-#idp.authn.MFA.useLatestTimestamp = false
-# The list below almost certainly requires changes, and should generally be the
-# union of any of the separate factors you combine in your particular MFA flow
-# rules. The example corresponds to the example in mfa-authn-config.xml that
-# combines IPAddress with Password.
-idp.authn.MFA.supportedPrincipals = \
-    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:InternetProtocol, \
-    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport, \
-    saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:Password, \
-    saml1/urn:oasis:names:tc:SAML:1.0:am:password
-# Most actual setup via mfa-authn-config.xml
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/password-authn-config.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/password-authn-config.xml
deleted file mode 100644
index dc10fa1..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/authn/password-authn-config.xml
+++ /dev/null
@@ -1,105 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-    
-    <!--
-    Ordered list of CredentialValidators to apply to a request.
-    
-    The four supplied variants are shown below; the HTPasswd option
-    is an OOB default for demo account purposes, and you will
-    want to remove it after initial install and testing.
-    -->
-    <util:list id="shibboleth.authn.Password.Validators">
-        <ref bean="shibboleth.LDAPValidator" />
-        <!-- <ref bean="shibboleth.KerberosValidator" /> -->
-        <!-- <ref bean="shibboleth.JAASValidator" /> -->
-        <!-- <bean parent="shibboleth.HTPasswdValidator" p:resource="%{idp.home}/credentials/demo.htpasswd" /> -->
-    </util:list>
-
-    <!-- Apply any regular expression replacement pairs to username before validation. -->
-    <util:list id="shibboleth.authn.Password.Transforms">
-        <!--
-        <bean parent="shibboleth.Pair" p:first="^(.+)@example\.org$" p:second="$1" />
-        -->
-    </util:list>
-    
-    <!-- Uncomment to configure account lockout backed by in-memory storage. -->
-    <!--
-    <bean id="shibboleth.authn.Password.AccountLockoutManager"
-        parent="shibboleth.StorageBackedAccountLockoutManager"
-        p:maxAttempts="5"
-        p:counterInterval="PT5M"
-        p:lockoutDuration="PT5M"
-        p:extendLockoutDuration="false" />
-    -->
-      
-    <!--
-    Define entries here to map error messages detected by validation actions and classify them as particular
-    kinds of errors for use in your templates and as events in flows.
-
-    Keys are events to signal, values are error codes.
-    -->
-    <util:map id="shibboleth.authn.Password.ClassifiedMessageMap">
-        <entry key="UnknownUsername">
-            <list>
-                <value>NoCredentials</value>
-                <value>CLIENT_NOT_FOUND</value>
-                <value>Client not found</value>
-                <value>Cannot get kdc for realm</value>
-                <value>Client not found in Kerberos database</value>
-                <value>DN_RESOLUTION_FAILURE</value>
-                <value>Cannot authenticate dn, invalid dn</value>
-                <value>Cannot authenticate dn, invalid credential</value>
-                <value>AcceptSecurityContext error, data 525</value>
-            </list>
-        </entry>
-        <entry key="InvalidPassword">
-            <list>
-                <value>InvalidCredentials</value>
-                <value>PREAUTH_FAILED</value>
-                <value>INVALID_CREDENTIALS</value>
-                <value>Checksum failed</value>
-                <value>Integrity check on decrypted field failed</value>
-                <value>Pre-authentication information was invalid</value>
-                <value>Key bytes cannot be null</value>
-                <value>AcceptSecurityContext error, data 52e</value>
-            </list>
-        </entry>
-        <entry key="AccountLocked">
-            <list>
-                <value>Clients credentials have been revoked</value>
-                <value>AcceptSecurityContext error, data 775</value>
-            </list>
-        </entry>
-        <entry key="AccountDisabled">
-            <list>
-                <value>AcceptSecurityContext error, data 533</value>
-            </list>
-        </entry>
-        <entry key="ExpiredPassword">
-            <list>
-                <value>PASSWORD_EXPIRED</value>
-                <value>CLIENT KEY EXPIRED</value>
-                <value>AcceptSecurityContext error, data 532</value>
-                <value>AcceptSecurityContext error, data 773</value>
-                <value>AcceptSecurityContext error, data 701</value>
-            </list>
-        </entry>
-        <entry key="ExpiringPassword">
-            <list>
-                <value>ACCOUNT_WARNING</value>
-            </list>
-        </entry>
-    </util:map>
-
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/c14n/subject-c14n-events-flow.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/c14n/subject-c14n-events-flow.xml
deleted file mode 100644
index c4936f3..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/c14n/subject-c14n-events-flow.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<flow xmlns="http://www.springframework.org/schema/webflow"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow.xsd"
-      abstract="true">
-
-    <!-- ADVANCED USE ONLY -->
-    
-    <!--
-    You can ignore this file unless you are creating your own custom c14n subflows that want to
-    report custom events in response to unusual error or warning conditions.
-    -->
-
-    <!-- Custom error events to reflect back from user-supplied c14n subflows. -->
-    
-    <!-- <end-state id="MyCustomEvent" /> -->
-
-    <global-transitions>
-        <!-- <transition on="MyCustomEvent" to="MyCustomEvent" /> -->
-        <transition on="#{!'proceed'.equals(currentEvent.id)}" to="InvalidEvent" />
-    </global-transitions>
-
-</flow>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/c14n/subject-c14n.properties b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/c14n/subject-c14n.properties
deleted file mode 100644
index 3811493..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/c14n/subject-c14n.properties
+++ /dev/null
@@ -1,40 +0,0 @@
-# Properties that control the behavior of post-login subject c14n flows.
-# A few more advanced settings require XML configuration, see flow-specific docs.
-
-
-# Simple username -> principal name c14n
-#idp.c14n.simple.lowercase = false
-#idp.c14n.simple.uppercase = false
-#idp.c14n.simple.trim = true
-
-
-# Attribute resolution -> principal name c14n
-#idp.c14n.attribute.lowercase = false
-#idp.c14n.attribute.uppercase = false
-#idp.c14n.attribute.trim = true
-# Lists of attributes to resolve...
-#idp.c14n.attribute.attributesToResolve =
-#  and then select a principal name from
-#idp.c14n.attribute.attributeSourceIds =
-# Allows direct use of attributes via SAML proxy authn, bypasses resolver
-#idp.c14n.attribute.resolveFromSubject = false
-#idp.c14n.attribute.resolutionCondition = shibboleth.Conditions.TRUE
-
-# X.509 certificate -> principal name c14n
-#idp.c14n.x500.lowercase = false
-#idp.c14n.x500.uppercase = false
-#idp.c14n.x500.trim = true
-# Precedence is to check for a subjectAltName and then an OID RDN
-# Comma-delimited list of subjectAltName type numbers
-#  (See https://tools.ietf.org/html/rfc5280#section-4.2.1.6)
-#idp.c14n.x500.subjectAltNameTypes = 
-# Comma-delimited list of OIDS
-#idp.c14n.x500.objectIDs = 
-
-# Proxied SAML NameID -> principal name c14n
-#idp.c14n.saml.proxy.lowercase = false
-#idp.c14n.saml.proxy.uppercase = false
-
-# NameID consumption from SAML requests
-#idp.c14n.saml.lowercase = false
-#idp.c14n.saml.uppercase = false
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/c14n/subject-c14n.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/c14n/subject-c14n.xml
deleted file mode 100644
index b354535..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/c14n/subject-c14n.xml
+++ /dev/null
@@ -1,151 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-    
-    <!-- ========================= Java Subject -> Principal Mapping ========================= -->
-
-    <!--
-    These are lists of Subject Canonicalization flows that turn complex Subject data into a string-based
-    principal name that the rest of the IdP can operate on. They're used primarily after authentication
-    and also during less common operations like SAML attribute queries, to map the SAML Subject into a
-    principal name.
-    
-    Flows are identified with an ID that corresponds to a Spring Web Flow subflow name.
-    
-    Most of the simple settings that configure these flows are in subject-c14n.properties.
-    -->
-
-    <!--
-    ====================================================================
-    Flows used after authentication to produce canonical principal name.
-    ====================================================================
-    -->
-    <util:list id="shibboleth.PostLoginSubjectCanonicalizationFlows">
-        <!--
-        This is an advanced post-login step that performs attribute resolution and then produces a username
-        from an attribute value. To enable universally, just uncomment, but if you want it to run under more
-        specific conditions, set an activationCondition property to a condition to apply. 
-        -->
-        <!-- <bean id="c14n/attribute" parent="shibboleth.PostLoginSubjectCanonicalizationFlow" /> -->
-
-        <!--
-        This is an advanced option for use with SAML 2 proxy authentication to a second IdP that
-        derives the principal name semi-directly from the incoming NameID value. It is functionally
-        akin to the c14n/SAML2Transform flow for SAML Request scenarios, but separately defined so
-        a suitably restrictive format list and/or condition can be applied to it. 
-        -->
-        <!-- <ref bean="c14n/SAML2ProxyTransform" /> -->
-
-        <!--
-        This is an alternative that handles Subjects containing an X500Principal object and
-        allows extraction from the DN.
-        -->
-        <ref bean="c14n/x500" />
-
-        <!--
-        This is the standard post-login step that returns a username derived from the login process. If you
-        have more complex needs such as mapping a certificate DN into a principal name, an alternative may
-        be required such as that above, but you can use this for simple transforms.
-        -->
-        <ref bean="c14n/simple" />
-    </util:list>
-    
-    <!-- What SAML NameID formats do you want to support direct transformations for while proxying? -->
-    <util:list id="shibboleth.ProxyNameTransformFormats">
-        <value>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</value>
-        <value>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</value>
-        <value>urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName</value>
-        <value>urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName</value>
-        <value>urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos</value>
-    </util:list>
-    
-    <!--
-    Under what conditions should direct NameID mapping during proxying be allowed? By default, never.
-    Any condition can be used here; the example is suitable for enumerating a number of IdPs to allow.
-    -->
-    <bean id="shibboleth.ProxyNameTransformPredicate" parent="shibboleth.Conditions.ProxyAuthentication">
-        <constructor-arg name="collection">
-            <list>
-                <!-- <value>https://idp-proxy.example.org</value> -->
-            </list>
-        </constructor-arg>
-    </bean>
-    
-    <!--
-    Regular expression transforms to apply to incoming proxied subject names. The default empty list just
-    echoes the name through unmodified.
-    -->
-    <util:list id="shibboleth.ProxyNameTransforms">
-        <!--
-        <bean parent="shibboleth.Pair" p:first="^(.+)@example\.org$" p:second="$1" />
-        -->
-    </util:list>
-    
-    
-    <!--
-    =======================================================================
-    Flows used during SAML requests to reverse-map NameIdentifiers/NameIDs.
-    Below the list are some settings that might be useful to adjust.
-    =======================================================================
-    -->
-    <util:list id="shibboleth.SAMLSubjectCanonicalizationFlows">
-
-        <!-- The next four are for handling transient IDs (in-storage and stateless variants). -->
-        <ref bean="c14n/SAML2Transient" />
-        <ref bean="c14n/SAML2CryptoTransient" />
-        <ref bean="c14n/SAML1Transient" /> 
-        <ref bean="c14n/SAML1CryptoTransient" /> 
-        
-        <!-- Handle a SAML 2 persistent ID, provided a stored strategy is in use. -->
-        <!-- <ref bean="c14n/SAML2Persistent" /> -->
-        
-        <!--
-        Finally we have beans for decoding arbitrary SAML formats directly. By default, these are turned off,
-        having *no* circumstances for which they apply (see shibboleth.TransformNamePredicate below).
-        -->
-        <ref bean="c14n/SAML2Transform" />
-        <ref bean="c14n/SAML1Transform" />
-    </util:list>
-    
-    <!-- What SAML NameID formats do you want to support direct transformations for? -->
-    <util:list id="shibboleth.NameTransformFormats">
-        <value>urn:oasis:names:tc:SAML:1.1:nameid-format:unspecified</value>
-        <value>urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress</value>
-        <value>urn:oasis:names:tc:SAML:1.1:nameid-format:X509SubjectName</value>
-        <value>urn:oasis:names:tc:SAML:1.1:nameid-format:WindowsDomainQualifiedName</value>
-        <value>urn:oasis:names:tc:SAML:2.0:nameid-format:kerberos</value>
-    </util:list>
-
-    <!--
-    Under what conditions should direct NameID mapping be allowed? By default, never.
-    Any condition can be used here; the example is suitable for enumerating a number of SPs to allow.
-    -->
-    <bean id="shibboleth.NameTransformPredicate" parent="shibboleth.Conditions.RelyingPartyId">
-        <constructor-arg name="candidates">
-            <list>
-                <!-- <value>https://sp.example.org</value> -->
-            </list>
-        </constructor-arg>
-    </bean>
-    
-    <!--
-    Regular expression transforms to apply to incoming subject names. The default empty list just
-    echoes the name through unmodified.
-    -->
-    <util:list id="shibboleth.NameTransforms">
-        <!--
-        <bean parent="shibboleth.Pair" p:first="^(.+)@example\.org$" p:second="$1" />
-        -->
-    </util:list>
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/errors.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/errors.xml
deleted file mode 100644
index 8d629ab..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/errors.xml
+++ /dev/null
@@ -1,127 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-    xmlns:context="http://www.springframework.org/schema/context"
-    xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
-    xmlns:c="http://www.springframework.org/schema/c" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-
-    default-init-method="initialize"
-    default-destroy-method="destroy">
-
-    <bean id="shibboleth.DefaultErrorView" class="java.lang.String" c:_0="%{idp.errors.defaultView:error}" />
-
-    <!-- Map local events to alternate view templates. -->
-    <util:map id="shibboleth.EventViewMap">
-        <!-- <entry key="EventToChange" value="viewname" /> -->
-    </util:map>
-
-    <!--
-    Map of events to trap and handle with local views, without returning to SPs.
-    The map values are flags indicating whether to write an audit log record.
-    -->
-    <util:map id="shibboleth.LocalEventMap">
-        <entry key="ContextCheckDenied" value="true" />
-        <entry key="ImpersonationViolation" value="true" />
-        <entry key="AttributeReleaseRejected" value="true" />
-        <entry key="TermsRejected" value="true" />
-        <entry key="EndpointResolutionFailed" value="true" />
-        <entry key="MessageAuthenticationError" value="true" />
-        <entry key="RuntimeException" value="false" />
-        <entry key="InvalidEvent" value="false" />
-        <entry key="InvalidCSRFToken" value="false" />
-        <!--
-        <entry key="IdentitySwitch" value="false" />
-        <entry key="NoPotentialFlow" value="false" />
-        -->
-    </util:map>
-    
-    <!-- Mappings of error events during requests to SAML status codes and SOAP fault codes. -->
-
-    <util:map id="shibboleth.SAML1StatusMappings">
-        <entry key="InvalidMessageVersion" value-ref="shibboleth.SAML1Status.VersionMismatch" />
-        
-        <entry key="UnableToDecode" value-ref="shibboleth.SAML1Status.Requester" />
-        
-        <entry key="UnableToEncode" value-ref="shibboleth.SAML1Status.Requester" />
-
-        <entry key="MessageReplay" value-ref="shibboleth.SAML1Status.Requester" />
-        <entry key="MessageExpired" value-ref="shibboleth.SAML1Status.Requester" />
-        <entry key="MessageAuthenticationError" value-ref="shibboleth.SAML1Status.Requester" />
-
-        <entry key="RequestUnsupported" value-ref="shibboleth.SAML1Status.Requester" />
-        
-        <entry key="NoPassive" value-ref="shibboleth.SAML1Status.Requester" />
-        <entry key="NoPotentialFlow" value-ref="shibboleth.SAML1Status.Requester" />
-        <entry key="NoCredentials" value-ref="shibboleth.SAML1Status.Requester" />
-        <entry key="InvalidCredentials" value-ref="shibboleth.SAML1Status.Requester" />
-        <entry key="AccountError" value-ref="shibboleth.SAML1Status.Requester" />
-        <entry key="IdentitySwitch" value-ref="shibboleth.SAML1Status.Requester" />
-        <entry key="AuthenticationException" value-ref="shibboleth.SAML1Status.Requester" />
-        
-        <entry key="InvalidSubject" value-ref="shibboleth.SAML1Status.Requester" />
-        <entry key="SubjectCanonicalizationError" value-ref="shibboleth.SAML1Status.Requester" />
-    </util:map>
-    
-    <util:map id="shibboleth.SAML2StatusMappings">
-        <entry key="InvalidMessageVersion" value-ref="shibboleth.SAML2Status.VersionMismatch" />
-        
-        <entry key="UnableToDecode" value-ref="shibboleth.SAML2Status.RequestUnsupported" />
-        
-        <entry key="UnableToEncode" value-ref="shibboleth.SAML2Status.UnsupportedBinding" />
-
-        <entry key="AccessDenied" value-ref="shibboleth.SAML2Status.RequestDenied" />
-        <entry key="MessageReplay" value-ref="shibboleth.SAML2Status.RequestDenied" />
-        <entry key="MessageExpired" value-ref="shibboleth.SAML2Status.RequestDenied" />
-        <entry key="MessageAuthenticationError" value-ref="shibboleth.SAML2Status.RequestDenied" />
-        
-        <entry key="RequestUnsupported" value-ref="shibboleth.SAML2Status.NoAuthnContext" />
-        
-        <entry key="NoPassive" value-ref="shibboleth.SAML2Status.NoPassive" />
-        
-        <entry key="NoPotentialFlow" value-ref="shibboleth.SAML2Status.AuthnFailed" />
-        <entry key="NoCredentials" value-ref="shibboleth.SAML2Status.AuthnFailed" />
-        <entry key="InvalidCredentials" value-ref="shibboleth.SAML2Status.AuthnFailed" />
-        <entry key="AccountError" value-ref="shibboleth.SAML2Status.AuthnFailed" />
-        <entry key="IdentitySwitch" value-ref="shibboleth.SAML2Status.AuthnFailed" />
-        <entry key="AuthenticationException" value-ref="shibboleth.SAML2Status.AuthnFailed" />
-        
-        <entry key="InvalidSubject" value-ref="shibboleth.SAML2Status.UnknownPrincipal" />
-        <entry key="SubjectCanonicalizationError" value-ref="shibboleth.SAML2Status.UnknownPrincipal" />
-        <entry key="SessionNotFound" value-ref="shibboleth.SAML2Status.UnknownPrincipal" />
-        
-        <entry key="InvalidNameIDPolicy" value-ref="shibboleth.SAML2Status.InvalidNameIDPolicy" />
-        <entry key="ProxyCountExceeded" value-ref="shibboleth.SAML2Status.ProxyCountExceeded" />
-        
-        <entry key="ChannelBindingsError" value-ref="shibboleth.SAML2Status.ChannelBindingsError" />
-    </util:map>
-
-    <util:map id="shibboleth.SOAPFaultCodeMappings">
-        <entry key="InvalidMessageVersion" value-ref="shibboleth.SOAP.VersionMismatch" />
-        
-        <entry key="UnableToDecode" value-ref="shibboleth.SOAP.Client" />
-
-        <entry key="MessageReplay" value-ref="shibboleth.SOAP.Client" />
-        <entry key="MessageExpired" value-ref="shibboleth.SOAP.Client" />
-        <entry key="MessageAuthenticationError" value-ref="shibboleth.SOAP.Client" />
-        
-        <entry key="RequestUnsupported" value-ref="shibboleth.SOAP.Client" />
-    
-        <entry key="NoPassive" value-ref="shibboleth.SOAP.Client" />
-        
-        <entry key="NoPotentialFlow" value-ref="shibboleth.SOAP.Client" />
-        <entry key="NoCredentials" value-ref="shibboleth.SOAP.Client" />
-        <entry key="InvalidCredentials" value-ref="shibboleth.SOAP.Client" />
-        <entry key="AccountError" value-ref="shibboleth.SOAP.Client" />
-        <entry key="AuthenticationException" value-ref="shibboleth.SOAP.Client" />
-
-        <entry key="InvalidSubject" value-ref="shibboleth.SOAP.Client" />
-        <entry key="SubjectCanonicalizationError" value-ref="shibboleth.SOAP.Client" />
-        
-        <entry key="InvalidNameIDPolicy" value-ref="shibboleth.SOAP.Client" />
-        
-        <entry key="ChannelBindingsError" value-ref="shibboleth.SOAP.Client" />
-    </util:map>
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/examples/attribute-resolver-ldap.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/examples/attribute-resolver-ldap.xml
deleted file mode 100644
index 74b3033..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/examples/attribute-resolver-ldap.xml
+++ /dev/null
@@ -1,108 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-    This file is an EXAMPLE configuration file containing some example attributes
-    based on some commonly used approaches when LDAP is the principal data source.
-     
-    Not all attribute definitions or data connectors are demonstrated, but some
-    LDAP attributes common to Shibboleth deployments (and some not so common) are
-    included.
-
-    This example is in no way usable as a substitute for reading the documentation.    
--->
-<AttributeResolver
-        xmlns="urn:mace:shibboleth:2.0:resolver"
-        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-        xsi:schemaLocation="urn:mace:shibboleth:2.0:resolver http://shibboleth.net/schema/idp/shibboleth-attribute-resolver.xsd">
-
-    <!-- ========================================== -->
-    <!--      Attribute Definitions                 -->
-    <!-- ========================================== -->
-
-    <!-- Simple attributes are exported directly from the LDAP connector. -->
-
-    <!-- eduPerson attributes requiring post-lookup manipulation -->
-<!-- 
-
-    <AttributeDefinition xsi:type="Prescoped" id="eduPersonPrincipalName">
-        <InputDataConnector ref="myLDAP" attributeNames="eduPersonPrincipalName"/>
-    </AttributeDefinition>
-
-    <AttributeDefinition xsi:type="Prescoped" id="eduPersonPrincipalNamePrior">
-        <InputDataConnector ref="myLDAP" attributeNames="eduPersonPrincipalNamePrior"/>
-    </AttributeDefinition>
-
-    <AttributeDefinition xsi:type="Scoped" id="eduPersonScopedAffiliation" scope="%{idp.scope}">
-        <InputDataConnector ref="myLDAP" attributeNames="eduPersonAffiliation"/>
-    </AttributeDefinition>
--->
-
-    <!-- Schema: SAML Subject ID Attributes -->
-<!--
-    <AttributeDefinition xsi:type="Scoped" id="samlSubjectID" scope="%{idp.scope}">
-        <InputDataConnector ref="myLDAP" attributeNames="%{idp.persistentId.sourceAttribute}"/>
-    </AttributeDefinition>
-
-    <AttributeDefinition xsi:type="Scoped" id="samlPairwiseID" scope="%{idp.scope}">
-        <InputDataConnector ref="computed" attributeNames="computedId"/>
-    </AttributeDefinition>
--->
-
-    <!-- ========================================== -->
-    <!--      Data Connectors                       -->
-    <!-- ========================================== -->
-
-    <!-- Example LDAP Connector -->
-
-    <DataConnector id="myLDAP" xsi:type="LDAPDirectory"
-        ldapURL="%{idp.attribute.resolver.LDAP.ldapURL}"
-        baseDN="%{idp.attribute.resolver.LDAP.baseDN}" 
-        principal="%{idp.attribute.resolver.LDAP.bindDN}"
-        principalCredential="%{idp.attribute.resolver.LDAP.bindDNCredential}"
-        useStartTLS="%{idp.attribute.resolver.LDAP.useStartTLS:true}"
-        startTLSTimeout="%{idp.attribute.resolver.LDAP.startTLSTimeout}"
-        connectTimeout="%{idp.attribute.resolver.LDAP.connectTimeout}"
-        trustFile="%{idp.attribute.resolver.LDAP.trustCertificates}"
-        responseTimeout="%{idp.attribute.resolver.LDAP.responseTimeout}"
-        connectionStrategy="%{idp.attribute.resolver.LDAP.connectionStrategy}"
-        noResultIsError="true"
-        multipleResultsIsError="true"
-        excludeResolutionPhases="c14n/attribute"
-        exportAttributes="mail displayName sn givenName departmentNumber employeeNumber eduPersonEntitlement eduPersonAssurance">
-        <FilterTemplate>
-            <![CDATA[
-                %{idp.attribute.resolver.LDAP.searchFilter}
-            ]]>
-        </FilterTemplate>
-        <ConnectionPool
-            minPoolSize="%{idp.pool.LDAP.minSize:3}"
-            maxPoolSize="%{idp.pool.LDAP.maxSize:10}"
-            blockWaitTime="%{idp.pool.LDAP.blockWaitTime:PT3S}"
-            validatePeriodically="%{idp.pool.LDAP.validatePeriodically:true}"
-            validateTimerPeriod="%{idp.pool.LDAP.validatePeriod:PT5M}"
-            validateDN="%{idp.pool.LDAP.validateDN:}"
-            validateOnCheckout="%{idp.pool.LDAP.validateOnCheckout:false}"
-            validateFilter="%{idp.pool.LDAP.validateFilter:(objectClass=*)}"
-            prunePeriod="%{idp.pool.LDAP.prunePeriod:PT5M}"
-            expirationTime="%{idp.pool.LDAP.idleTime:PT10M}"/>
-    </DataConnector>
-
-    <!--
-    DataConnector for pairwise-id (example depends in part on saml-nameid.properties).
-    Note that this relies on BASE32 encoding in accordance with the attribute definition.
-    Older uses of this plugin for legacy eduPersonTargetedID/NameID values may require
-    different settings.
-    -->
-<!-- 
-    <DataConnector id="computed" xsi:type="ComputedId"
-        excludeResolutionPhases="c14n/attribute"
-	    generatedAttributeID="computedId"
-	    salt="%{idp.persistentId.salt}"
-	    algorithm="%{idp.persistentId.algorithm:SHA}"
-        encoding="BASE32">
-	    
-        <InputDataConnector ref="myLDAP" attributeNames="%{idp.persistentId.sourceAttribute}" />
-        
-	</DataConnector>
--->
-
-</AttributeResolver>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/examples/oidc-attribute-filter.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/examples/oidc-attribute-filter.xml
deleted file mode 100644
index cdd4293..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/examples/oidc-attribute-filter.xml
+++ /dev/null
@@ -1,168 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<AttributeFilterPolicyGroup id="ShibbolethFilterPolicy" xmlns="urn:mace:shibboleth:2.0:afp"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:oidc="urn:mace:shibboleth:2.0:afp:oidc"
-    xsi:schemaLocation="urn:mace:shibboleth:2.0:afp http://shibboleth.net/schema/idp/shibboleth-afp.xsd
-                        urn:mace:shibboleth:2.0:afp:oidc http://shibboleth.net/schema/oidc/shibboleth-afp-oidc.xsd">
-
-
-    <!--
-    The convention in the rules below is to use pre-existing attributeID defaults where appropriate
-    and to use OIDC claim names where no existing ID makes sense. You're free to adjust all this
-    as long as the resolver and/or registry rules match.
-    -->
-
-    <!--
-    This demonstrates how subject is set when 'openid' -scope is involved. That scope is required in
-    OIDC sequences.
-    -->
-    <AttributeFilterPolicy id="OPENID_SCOPE">
-        <PolicyRequirementRule xsi:type="oidc:OIDCScope" value="openid" />
-        <!-- May adjust to taste depending on strategy used to produce sub claim. -->
-        <AttributeRule attributeID="subject">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="subject-public">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="subject-pairwise">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-    </AttributeFilterPolicy>
-
-    <!--
-    This demonstrates how subject is set with "plain" OAuth authorization sequences, i.e. when 'openid'
-    scope is not involved.
-    -->
-    <AttributeFilterPolicy id="OAUTH_SUBJECT">
-        <PolicyRequirementRule xsi:type="AND">
-            <Rule xsi:type="NOT">
-                <Rule xsi:type="oidc:OIDCScope" value="openid" />
-            </Rule>
-            <Rule xsi:type="Profile" value="http://shibboleth.net/ns/profiles/oidc/sso/browser" />
-        </PolicyRequirementRule>
-        <AttributeRule attributeID="subject">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="subject-public">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="subject-pairwise">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-    </AttributeFilterPolicy>
-
-    <!--
-    This demonstrates a rule that releases email claims in response to requests having the 'email' scope.
-    The requester needs to have that as a registered scope.
-    -->
-    <AttributeFilterPolicy id="OPENID_SCOPE_EMAIL">
-        <PolicyRequirementRule xsi:type="oidc:OIDCScope" value="email" />
-        <AttributeRule attributeID="mail">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="email_verified">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-    </AttributeFilterPolicy>
-
-    <!--
-    This demonstrates a rule that releases address claim in response to requests having the 'address' scope.
-    The requester needs to have that as a registered scope.
-    -->
-    <AttributeFilterPolicy id="OPENID_SCOPE_ADDRESS">
-        <PolicyRequirementRule xsi:type="oidc:OIDCScope" value="address" />
-        <AttributeRule attributeID="address">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-    </AttributeFilterPolicy>
-
-    <!--
-    This demonstrates a rule that releases phone claims in response to requests having the 'phone' scope.
-    The requester needs to have that as a registered scope.
-    -->
-    <AttributeFilterPolicy id="OPENID_SCOPE_PHONE">
-        <PolicyRequirementRule xsi:type="oidc:OIDCScope" value="phone" />
-        <AttributeRule attributeID="telephoneNumber">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="phone_number_verified">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-    </AttributeFilterPolicy>
-
-    <!--
-    This demonstrates a rule that releases profile claims in response to requests having the 'profile' scope.
-    The requester needs to have that as a registered scope.
-    -->
-    <AttributeFilterPolicy id="OPENID_SCOPE_PROFILE">
-        <PolicyRequirementRule xsi:type="oidc:OIDCScope" value="profile" />
-        <AttributeRule attributeID="displayName">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="sn">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="givenName">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="preferredLanguage">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="eduPersonNickname">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="uid">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="middle_name">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="profile">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="picture">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="website">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="gender">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="birthdate">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="zoneinfo">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-        <AttributeRule attributeID="updated_at">
-            <PermitValueRule xsi:type="ANY" />
-        </AttributeRule>
-    </AttributeFilterPolicy>
-
-
-    <!-- Example rules for honoring requested claims and splitting claims between ID and UserInfo tokens. -->
-    
-    <AttributeFilterPolicy id="REQUESTED_CLAIMS">
-        <PolicyRequirementRule xsi:type="ANY" />
-        <!-- Release picture if asked. -->
-        <AttributeRule attributeID="picture">
-            <PermitValueRule xsi:type="oidc:AttributeInOIDCRequestedClaims" />
-        </AttributeRule>
-        <!-- Release email in ID token if specifically asked for in ID token. -->
-        <AttributeRule attributeID="mail">
-            <PermitValueRule xsi:type="oidc:AttributeInOIDCRequestedClaims" matchOnlyIDToken="true" />
-        </AttributeRule>
-        <!-- Release phone_number in UserInfo token if specifically asked for in UserInfo token. -->
-        <AttributeRule attributeID="telephoneNumber">
-            <PermitValueRule xsi:type="oidc:AttributeInOIDCRequestedClaims" matchOnlyUserInfo="true" />
-        </AttributeRule>
-        <!-- Release name if specifically asked for in UserInfo token and flagged as essential. -->
-        <AttributeRule attributeID="displayName">
-            <PermitValueRule xsi:type="oidc:AttributeInOIDCRequestedClaims" matchOnlyUserInfo="true"
-                onlyIfEssential="true" />
-        </AttributeRule>
-    </AttributeFilterPolicy>
-
-</AttributeFilterPolicyGroup>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/examples/oidc-attribute-resolver.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/examples/oidc-attribute-resolver.xml
deleted file mode 100644
index 22a353d..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/examples/oidc-attribute-resolver.xml
+++ /dev/null
@@ -1,191 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<AttributeResolver xmlns="urn:mace:shibboleth:2.0:resolver"
-    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:oidc="urn:mace:shibboleth:2.0:resolver:oidc"
-    xsi:schemaLocation="urn:mace:shibboleth:2.0:resolver http://shibboleth.net/schema/idp/shibboleth-attribute-resolver.xsd
-                        urn:mace:shibboleth:2.0:resolver:oidc http://shibboleth.net/schema/oidc/shibboleth-attribute-encoder-oidc.xsd">
-
-    <!--
-    Some of the examples assume conf/attributes/oidc-claim-rules.xml is loaded
-    into the registry service.
-    -->
-
-    <!--
-    Exactly one attribute needs to supply the "sub" claim, but this can't be
-    fully standardized. There are suggested approaches below. Using the Scoped
-    definition is recommended to ensure intrinsic uniqueness.
-    -->
-    
-    <!--
-    These two examples use activation conditions and filter rules elsewhere to
-    allow for different public and pairwise behavior. This is a nice strategy
-    because using a "knowable" value for public sub claims is easier to support,
-    and allows provisioning by out of band systems.
-    
-    While these examples do expose "uid" as the value for public sub claims,
-    this is simply to provide a "working" out of the box example. Using something
-    more stable, managed by IDM infrastructure, is the advisable approach.
-    -->
-    <AttributeDefinition id="subject-public" xsi:type="Scoped" scope="%{idp.scope}"
-            activationConditionRef="shibboleth.oidc.Conditions.PublicRequired">
-        <InputAttributeDefinition ref="uid" />
-        <AttributeEncoder xsi:type="oidc:OIDCScopedString" name="sub" />
-    </AttributeDefinition>
-
-    <AttributeDefinition id="subject-pairwise" xsi:type="Scoped" scope="%{idp.scope}"
-            activationConditionRef="shibboleth.oidc.Conditions.PairwiseRequired">
-        <InputDataConnector ref="computedSubjectId" attributeNames="subjectId"/>
-        <AttributeEncoder xsi:type="oidc:OIDCScopedString" name="sub" />
-    </AttributeDefinition>
-
-    <!-- 
-    This example (the data connector in particular) will generate public or
-    pairwise values depending on client registration. The public values will
-    depend on, but not expose, an underlying value, which is again set to "uid"
-    for simplicity, but this is not a good strategy unless "uid" itself is a
-    stable, managed value.
-    -->
-    <!--
-    <AttributeDefinition id="subject" xsi:type="Scoped" scope="%{idp.scope}"
-            activationConditionRef="shibboleth.oidc.Conditions.SubjectRequired">
-        <InputDataConnector ref="computedSubjectId" attributeNames="subjectId"/>
-        <AttributeEncoder xsi:type="oidc:OIDCScopedString" name="sub" />
-    </AttributeDefinition>
-    -->
-    
-    <!--
-    The EPPN is the most common federated username in higher education.
-    For guidelines on the implementation of this attribute, refer to eduPerson
-    and/or federation documentation. Above all, do not expose a value for this
-    attribute without considering the long term implications.
-    -->
-    <AttributeDefinition id="eduPersonPrincipalName" xsi:type="Scoped" scope="%{idp.scope}">
-        <InputAttributeDefinition ref="uid" />
-        <AttributeEncoder xsi:type="oidc:OIDCScopedString" name="eppn" />
-    </AttributeDefinition>
-
-    <!--
-    The uid is the closest thing to a "standard" LDAP attribute representing
-    a local username, but you should generally *never* expose uid to federated
-    services, as it is rarely globally unique. The default mapping for OIDC is
-    to preferred_username, which seems suitably meaningless.
-    -->
-    <AttributeDefinition id="uid" xsi:type="PrincipalName" />
-
-    <!-- This is just for illustrative purposes given that the connector is static.  -->
-    <AttributeDefinition id="mail" xsi:type="Template">
-        <InputAttributeDefinition ref="uid" />
-        <Template><![CDATA[
-               ${uid}@%{idp.scope}
-          ]]></Template>
-    </AttributeDefinition>
-
-    <!--
-    Start of static attributes. In actual deployment you would use a real source
-    for most of these attributes/claims.
-    -->
-
-    <AttributeDefinition id="eduPersonScopedAffiliation" xsi:type="Scoped" scope="%{idp.scope}">
-        <InputDataConnector ref="staticAttributes" attributeNames="affiliation" />
-    </AttributeDefinition>
-
-    <!--
-    This demonstrates a complex claim constructed by forming a JSON structure.
-    The default transcoding rule for the address claim expects such a structure.
-    -->
-    <AttributeDefinition id="address" xsi:type="Template">
-        <InputDataConnector ref="staticAttributes" attributeNames="street_address locality region postal_code country"/>
-        <Template><![CDATA[
-            {"street_address":"${street_address}", "locality":"${locality}","region":"${region}","postal_code":"${postal_code}","country":"${country}" }
-        ]]></Template>
-    </AttributeDefinition>
-
-    <!--
-    Data Connector for generating 'sub' claim. It may be used to generate both
-    public and pairwise subject values because it recognizes the OIDC sector_id
-    if used during client registration.
-    -->
-    <DataConnector id="computedSubjectId" xsi:type="ComputedId"
-            generatedAttributeID="subjectId"
-            salt="%{idp.oidc.subject.salt}"
-            algorithm="%{idp.oidc.subject.algorithm:SHA}"
-            encoding="BASE32">
-        <InputAttributeDefinition ref="%{idp.oidc.subject.sourceAttribute}"/>
-    </DataConnector>
-
-    <!--
-    Static example to populate default claims. Most of these are directly exposed and
-    handled by the default set of transcoding rules provided for optional inclusion.
-    -->
-    <DataConnector id="staticAttributes" xsi:type="Static"
-            exportAttributes="telephoneNumber phone_number_verified email_verified displayName sn givenName middle_name eduPersonNickname profile picture website gender birthdate zoneinfo preferredLanguage updated_at">
-        <Attribute id="affiliation">
-            <Value>member</Value>
-            <Value>staff</Value>
-        </Attribute>
-        <Attribute id="telephoneNumber">
-            <Value>+1 (604) 555-1234;ext=5678</Value>
-        </Attribute>
-        <Attribute id="phone_number_verified">
-            <Value>true</Value>
-        </Attribute>
-        <Attribute id="email_verified">
-            <Value>false</Value>
-        </Attribute>
-        <Attribute id="displayName">
-            <Value>Mr.Teppo Matias Testaaja</Value>
-        </Attribute>
-        <Attribute id="sn">
-            <Value>Testaaja</Value>
-        </Attribute>
-        <Attribute id="givenName">
-            <Value>Teppo Matias</Value>
-        </Attribute>
-        <Attribute id="middle_name">
-            <Value>Matias</Value>
-        </Attribute>
-        <Attribute id="eduPersonNickname">
-            <Value>TT</Value>
-        </Attribute>
-        <Attribute id="profile">
-            <Value>https://fi.wikipedia.org/wiki/Tom_Cruise</Value>
-        </Attribute>
-        <Attribute id="picture">
-            <Value>https://pixabay.com/fi/pentu-kissa-kukka-potin-tabby-pentu-2766820/</Value>
-        </Attribute>
-        <Attribute id="website">
-            <Value>https://www.facebook.com/officialtomcruise/</Value>
-        </Attribute>
-        <Attribute id="gender">
-            <Value>male</Value>
-        </Attribute>
-        <Attribute id="birthdate">
-            <Value>1969-07-20</Value>
-        </Attribute>
-        <Attribute id="zoneinfo">
-            <Value>America/Los_Angeles</Value>
-        </Attribute>
-        <Attribute id="preferredLanguage">
-            <Value>en-US</Value>
-        </Attribute>
-        <Attribute id="updated_at">
-            <Value>1509450347</Value>
-        </Attribute>
-        <Attribute id="street_address">
-            <Value>234 Hollywood Blvd.</Value>
-        </Attribute>
-        <Attribute id="locality">
-            <Value>Los Angeles</Value>
-        </Attribute>
-        <Attribute id="region">
-            <Value>CA</Value>
-        </Attribute>
-        <Attribute id="postal_code">
-            <Value>90210</Value>
-        </Attribute>
-        <Attribute id="country">
-            <Value>US</Value>
-        </Attribute>
-    </DataConnector>
-    
-</AttributeResolver>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/global.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/global.xml
deleted file mode 100644
index 0bfa7bc..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/global.xml
+++ /dev/null
@@ -1,55 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-
-    <!-- Use this file to define any custom beans needed globally. -->
-
-    <!--
-    Algorithm include/exclude sets that override or merge with library defaults. Normally you can leave these
-    empty or commented and use the system defaults, but you can override those defaults using these beans.
-    Each <value> element is an algorithm URI; you can also use <util:constant> elements in place of literal values.
-    -->
-    
-    <!--
-    <util:set id="shibboleth.IncludedSignatureAlgorithms">
-    </util:set>
-
-    <util:set id="shibboleth.ExcludedSignatureAlgorithms">
-    </util:set>
-
-    <util:set id="shibboleth.IncludedEncryptionAlgorithms">
-    </util:set>
-
-    <util:set id="shibboleth.ExcludedEncryptionAlgorithms">
-    </util:set>
-    -->
-
-    <!--
-    If you need to define and inject custom Java object(s) into the various views used throughout the
-    system (errors, login, logout, etc.), you can uncomment and define the bean below to be of any
-    type required. It will appear in the view scope as a variable named "custom".
-    
-    The example below defines the bean as a map, which allows you to inject multiple objects under
-    named keys to expand the feature to support multiple injected objects.
-    
-    You MUST NOT change the bean(s) referenced in this way, they should be treated as read-only from
-    within views.
-    -->
-    
-    <!--
-    <util:map id="shibboleth.CustomViewContext">
-        <entry key="foo" value="bar"/>
-    </util:map>
-    -->
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/intercept/intercept-events-flow.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/intercept/intercept-events-flow.xml
deleted file mode 100644
index 6214e80..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/intercept/intercept-events-flow.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<flow xmlns="http://www.springframework.org/schema/webflow"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow.xsd"
-      abstract="true">
-
-    <!-- ADVANCED USE ONLY -->
-    
-    <!--
-    You can ignore this file unless you are creating your own custom intercept subflows that want to
-    report custom events in response to unusual conditions.
-    -->
-
-    <!-- <end-state id="MyCustomEvent" /> -->
-
-    <global-transitions>
-        <!-- <transition on="MyCustomEvent" to="MyCustomEvent" /> -->
-        <transition on="#{!'proceed'.equals(currentEvent.id)}" to="InvalidEvent" />
-    </global-transitions>
-
-</flow>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/ldap.properties b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/ldap.properties
index f0bfc65..97e20b5 100644
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/ldap.properties
+++ b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/ldap.properties
@@ -5,7 +5,7 @@
 idp.authn.LDAP.authenticator                   = bindSearchAuthenticator
 
 ## Connection properties ##
-idp.authn.LDAP.ldapURL                          = ldaps://directory
+idp.authn.LDAP.ldapURL                          = ldap://directory
 idp.authn.LDAP.useStartTLS                     = false
 # Time to wait for startTLS responses
 #idp.authn.LDAP.startTLSTimeout                 = PT3S
@@ -17,11 +17,11 @@ idp.authn.LDAP.useStartTLS                     = false
 #idp.authn.LDAP.connectionStrategy               = ACTIVE_PASSIVE
 
 ## SSL configuration, either jvmTrust, certificateTrust, or keyStoreTrust
-idp.authn.LDAP.sslConfig                       = certificateTrust
+#idp.authn.LDAP.sslConfig                       = certificateTrust
 ## If using certificateTrust above, set to the trusted certificate's path
-idp.authn.LDAP.trustCertificates                = %{idp.home}/credentials/ldap-server.crt
+#idp.authn.LDAP.trustCertificates                = %{idp.home}/credentials/ldap-server.crt
 ## If using keyStoreTrust above, set to the truststore path
-idp.authn.LDAP.trustStore                       = %{idp.home}/credentials/ldap-server.truststore
+#idp.authn.LDAP.trustStore                       = %{idp.home}/credentials/ldap-server.truststore
 
 ## Return attributes during authentication
 idp.authn.LDAP.returnAttributes                 = passwordExpirationTime,loginGraceRemaining
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/logback.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/logback.xml
deleted file mode 100644
index ffff922..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/logback.xml
+++ /dev/null
@@ -1,226 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<configuration>
-
-    <!--
-    Variables for simplifying logging configuration.
-    http://logback.qos.ch/manual/configuration.html#variableSubstitution
-    -->
-
-    <!--
-    If you want to use custom properties in this config file,
-    we load the main property file for you.
-    -->
-    <variable file="${idp.home}/conf/idp.properties" />
-
-    <!-- Location and retention. -->
-    
-    <variable name="idp.logfiles" value="${idp.logfiles:-${idp.home}/logs}" />
-    <variable name="idp.loghistory" value="${idp.loghistory:-180}" />
-    
-    <!-- Much higher performance if you operate on DEBUG. -->
-    <!-- <variable name="idp.process.appender" value="ASYNC_PROCESS" /> -->
-    
-    <!-- Logging level shortcuts. -->
-    <variable name="idp.loglevel.idp" value="${idp.loglevel.idp:-INFO}" />
-    <variable name="idp.loglevel.ldap" value="${idp.loglevel.ldap:-WARN}" />
-    <variable name="idp.loglevel.messages" value="${idp.loglevel.messages:-INFO}" />
-    <variable name="idp.loglevel.encryption" value="${idp.loglevel.encryption:-INFO}" />
-    <variable name="idp.loglevel.opensaml" value="${idp.loglevel.opensaml:-INFO}" />
-    <variable name="idp.loglevel.props" value="${idp.loglevel.props:-INFO}" />
-    <variable name="idp.loglevel.httpclient" value="${idp.loglevel.httpclient:-INFO}" />
-    
-    <!-- Don't turn these up unless you want a *lot* of noise. -->
-    <variable name="idp.loglevel.spring" value="${idp.loglevel.spring:-ERROR}" />
-    <variable name="idp.loglevel.container" value="${idp.loglevel.container:-ERROR}" />
-    <variable name="idp.loglevel.xmlsec" value="${idp.loglevel.xmlsec:-INFO}" />
-
-    <!-- =========================================================== -->
-    <!-- ============== Logging Categories and Levels ============== -->
-    <!-- =========================================================== -->
-
-    <!-- Logs IdP, but not OpenSAML, messages -->
-    <logger name="net.shibboleth.idp" level="${idp.loglevel.idp}"/>
-
-    <!-- Logs OpenSAML, but not IdP, messages -->
-    <logger name="org.opensaml.saml" level="${idp.loglevel.opensaml}"/>
-    
-    <!-- Logs LDAP related messages -->
-    <logger name="org.ldaptive" level="${idp.loglevel.ldap}"/>
-
-    <!-- Logs embedded HTTP client messages -->
-    <logger name="org.apache.hc" level="${idp.loglevel.httpclient}"/>
-    
-    <!-- Logs inbound and outbound protocols messages at DEBUG level -->
-    <logger name="PROTOCOL_MESSAGE" level="${idp.loglevel.messages}" />
-
-    <!-- Logs unencrypted SAML at DEBUG level -->
-    <logger name="org.opensaml.saml.saml2.encryption.Encrypter" level="${idp.loglevel.encryption}" />
-    <logger name="org.opensaml.saml.saml2.encryption.Decrypter" level="${idp.loglevel.encryption}" />
-
-    <!-- Logs system properties during startup at DEBUG level -->
-    <logger name="net.shibboleth.idp.admin.impl.LogImplementationDetails" level="${idp.loglevel.props}" />
-
-    <!-- Especially chatty. -->
-    <logger name="org.apache.xml.security" level="${idp.loglevel.xmlsec}" />
-    <logger name="org.springframework" level="${idp.loglevel.spring}"/>
-    <logger name="org.apache.catalina" level="${idp.loglevel.container}"/>
-    <logger name="org.eclipse.jetty" level="${idp.loglevel.container}"/>
-
-
-    <!-- =========================================================== -->
-    <!-- ============== Low Level Details or Changes =============== -->
-    <!-- =========================================================== -->
-    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
-        <!-- encoders are assigned the type
-             ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
-        <encoder>
-            <pattern>%-4relative [%thread] %-5level %logger{35} -%kvp- %msg %n</pattern>
-        </encoder>
-    </appender>
-
-    <!-- Process log. -->
-    <appender name="IDP_PROCESS" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${idp.logfiles}/idp-process.log</File>
-        
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${idp.logfiles}/idp-process-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
-            <maxHistory>${idp.loghistory}</maxHistory>
-        </rollingPolicy>
-
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>UTF-8</charset>
-            <Pattern>%date{ISO8601} - %mdc{idp.remote_addr} - %level [%logger:%line] - %msg%n%ex{short}</Pattern>
-        </encoder>
-
-        <!-- Ignore Velocity status page error. -->
-        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
-            <evaluator>
-                <matcher>
-                    <Name>VelocityStatusMatcher</Name>
-                    <regex>ResourceManager\s*: unable to find resource 'status\.vm' in any resource loader\.</regex>
-                </matcher>
-                <expression>VelocityStatusMatcher.matches(formattedMessage)</expression>
-            </evaluator>
-            <OnMatch>DENY</OnMatch>
-        </filter>
-    </appender>
-
-    <appender name="ASYNC_PROCESS" class="ch.qos.logback.classic.AsyncAppender">
-        <appender-ref ref="IDP_PROCESS" />
-        <discardingThreshold>0</discardingThreshold>
-    </appender>
-
-    <appender name="IDP_WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <!-- Suppress anything below WARN. -->
-        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
-            <level>WARN</level>
-        </filter>
-        
-        <File>${idp.logfiles}/idp-warn.log</File>
-        
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${idp.logfiles}/idp-warn-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
-            <maxHistory>${idp.loghistory}</maxHistory>
-        </rollingPolicy>
-        
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>UTF-8</charset>
-            <Pattern>%date{ISO8601} - %mdc{idp.remote_addr} - %level [%logger:%line] - %msg%n%ex{full}</Pattern>
-        </encoder>
-        
-        <!-- Ignore Velocity status page error. -->
-        <filter class="ch.qos.logback.core.filter.EvaluatorFilter">
-            <evaluator>
-                <matcher>
-                    <Name>VelocityStatusMatcher</Name>
-                    <regex>ResourceManager\s*: unable to find resource 'status\.vm' in any resource loader\.</regex>
-                </matcher>
-                <expression>VelocityStatusMatcher.matches(formattedMessage)</expression>
-            </evaluator>
-            <OnMatch>DENY</OnMatch>
-        </filter>
-    </appender>
-    
-    <!-- Audit log. -->
-    <appender name="IDP_AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${idp.logfiles}/idp-audit.log</File>
-
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${idp.logfiles}/idp-audit-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
-            <maxHistory>${idp.loghistory}</maxHistory>
-        </rollingPolicy>
-
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>UTF-8</charset>
-            <Pattern>%msg%n</Pattern>
-        </encoder>
-    </appender>
-    
-    <!-- Consent audit log. -->
-    <appender name="IDP_CONSENT_AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${idp.logfiles}/idp-consent-audit.log</File>
-
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${idp.logfiles}/idp-consent-audit-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
-            <maxHistory>${idp.loghistory}</maxHistory>
-        </rollingPolicy>
-
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>UTF-8</charset>
-            <Pattern>%msg%n</Pattern>
-        </encoder>
-    </appender>
-
-    <!-- F-TICKS syslog destination. -->
-    <appender name="IDP_FTICKS" class="ch.qos.logback.classic.net.SyslogAppender">
-        <syslogHost>${idp.fticks.loghost:-localhost}</syslogHost>
-        <port>${idp.fticks.logport:-514}</port>
-        <facility>AUTH</facility>
-        <suffixPattern>[%thread] %logger %msg</suffixPattern>
-    </appender>
-
-    <!-- Top level loggers. -->
-
-    <logger name="Shibboleth-Audit" level="ALL">
-        <appender-ref ref="${idp.audit.appender:-IDP_AUDIT}"/>
-        <appender-ref ref="STDOUT" />
-    </logger>
-
-    <logger name="Shibboleth-FTICKS" level="ALL" additivity="false">
-        <appender-ref ref="${idp.fticks.appender:-IDP_FTICKS}"/>
-    </logger>
-
-    <logger name="Shibboleth-Consent-Audit" level="ALL">
-        <appender-ref ref="${idp.consent.appender:-IDP_CONSENT_AUDIT}"/>
-        <appender-ref ref="STDOUT" />
-    </logger>
-    
-    <root level="${idp.loglevel.root:-INFO}">
-        <appender-ref ref="${idp.process.appender:-IDP_PROCESS}"/>
-        <appender-ref ref="${idp.warn.appender:-IDP_WARN}" />
-        <appender-ref ref="STDOUT" />
-    </root>
-
-    <!-- Example routing Password flow auditing to separate location (extend to other flows as needed). -->
-    
-    <!--
-    <appender name="IDP_PASSWORD_AUDIT" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <File>${idp.logfiles}/idp-password-audit.log</File>
-
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>${idp.logfiles}/idp-password-audit-%d{yyyy-MM-dd}.log.gz</fileNamePattern>
-            <maxHistory>${idp.loghistory}</maxHistory>
-        </rollingPolicy>
-
-        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
-            <charset>UTF-8</charset>
-            <Pattern>%msg%n</Pattern>
-        </encoder>
-    </appender>
-    
-    <logger name="Shibboleth-Audit.Password" level="ALL" additivity="false">
-        <appender-ref ref="IDP_PASSWORD_AUDIT"/>
-    </logger>
-    -->
-    
-</configuration>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/saml-nameid.properties b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/saml-nameid.properties
deleted file mode 100644
index 08b66c5..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/saml-nameid.properties
+++ /dev/null
@@ -1,31 +0,0 @@
-# Properties involving SAML NameIdentifier/NameID generation/consumption
-
-# For the most part these settings only deal with "transient" and "persistent"
-# identifiers. See saml-nameid.xml and c14n/subject-c14n.xml for advanced
-# settings
-
-# Default NameID Formats to use when nothing else is called for.
-# Don't change these just to change the Format used for a single SP!
-#idp.nameid.saml2.default = urn:oasis:names:tc:SAML:2.0:nameid-format:transient
-#idp.nameid.saml1.default = urn:mace:shibboleth:1.0:nameIdentifier
-
-# Set to shibboleth.StoredTransientIdGenerator for server-side transient ID storage
-#idp.transientId.generator = shibboleth.CryptoTransientIdGenerator
-
-# Persistent IDs can be computed on the fly with a hash, or managed in a database
-
-# For computed IDs, set a source attribute, and a secret salt in secrets.properties
-#idp.persistentId.sourceAttribute = changethistosomethingreal
-#idp.persistentId.useUnfilteredAttributes = true
-#idp.persistentId.algorithm = SHA
-# BASE64 will match V2 values, we recommend BASE32 encoding for new installs.
-idp.persistentId.encoding = BASE32
-
-# To use a database, use shibboleth.StoredPersistentIdGenerator
-#idp.persistentId.generator = shibboleth.ComputedPersistentIdGenerator
-# For basic use, set this to a JDBC DataSource bean name:
-#idp.persistentId.dataSource = PersistentIdDataSource
-# Controls which JDBC error codes are treated as retryable
-#idp.persistentId.retryableErrors = 23000,23505
-# Set to an empty property to skip hash-based generation of first stored ID
-#idp.persistentId.computed = shibboleth.ComputedPersistentIdGenerator
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/saml-nameid.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/saml-nameid.xml
deleted file mode 100644
index 7d82cf5..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/saml-nameid.xml
+++ /dev/null
@@ -1,64 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<beans xmlns="http://www.springframework.org/schema/beans"
-       xmlns:context="http://www.springframework.org/schema/context"
-       xmlns:util="http://www.springframework.org/schema/util"
-       xmlns:p="http://www.springframework.org/schema/p"
-       xmlns:c="http://www.springframework.org/schema/c"
-       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-       default-init-method="initialize"
-       default-destroy-method="destroy">
-
-    <!-- ========================= SAML NameID Generation ========================= -->
-
-    <!--
-    These generator lists handle NameID/Nameidentifier generation going forward. By default,
-    transient IDs for both SAML versions are enabled. The commented examples are for persistent IDs
-    and generating more one-off formats based on resolved attributes. The suggested approach is to
-    control their use via release of the underlying source attribute in the filter policy rather
-    than here, but you can set a property on any generator called "activationCondition" to limit
-    use in the most generic way.
-    
-    Most of the relevant configuration settings are controlled using properties; an exception is
-    the generation of arbitrary/custom formats based on attribute information, examples of which
-    are shown below.
-    
-    -->
-    
-    <!-- SAML 2 NameID Generation -->
-    <util:list id="shibboleth.SAML2NameIDGenerators">
-    
-        <ref bean="shibboleth.SAML2TransientGenerator" />
-        
-        <!-- Uncommenting this bean requires configuration in saml-nameid.properties. -->
-        <!--
-        <ref bean="shibboleth.SAML2PersistentGenerator" />
-        -->
-
-        <!--
-        <bean parent="shibboleth.SAML2AttributeSourcedGenerator"
-            p:omitQualifiers="true"
-            p:format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
-            p:attributeSourceIds="#{ {'mail'} }" />
-        -->
-                
-    </util:list>
-
-    <!-- SAML 1 NameIdentifier Generation -->
-    <util:list id="shibboleth.SAML1NameIdentifierGenerators">
-
-        <ref bean="shibboleth.SAML1TransientGenerator" />
-
-        <!--
-        <bean parent="shibboleth.SAML1AttributeSourcedGenerator"
-            p:omitQualifiers="true"
-            p:format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress"
-            p:attributeSourceIds="#{ {'mail'} }" />
-        -->
-                
-    </util:list>
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/services.properties b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/services.properties
deleted file mode 100644
index 6e507a2..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/services.properties
+++ /dev/null
@@ -1,72 +0,0 @@
-# Configure the resources to load for various services,
-# and the settings for failure handling and auto-reload.
-
-# failFast=true prevents IdP startup if a configuration is bad
-# checkInterval = PT0S means never reload (this is the default)
-
-# Global default for fail-fast behavior of most subsystems
-# with individual override possible below.
-#idp.service.failFast = false
-
-#idp.service.logging.resource = %{idp.home}/conf/logback.xml
-#idp.service.logging.failFast = true
-idp.service.logging.checkInterval = PT5M
-
-#idp.service.relyingparty.resources = shibboleth.RelyingPartyResolverResources
-#idp.service.relyingparty.failFast = false
-idp.service.relyingparty.checkInterval = PT15M
-# See MetadataDrivenConfiguration wiki topic for details
-idp.service.relyingparty.ignoreUnmappedEntityAttributes=true
-
-#idp.service.metadata.resources = shibboleth.MetadataResolverResources
-#idp.service.metadata.failFast = false
-#idp.service.metadata.checkInterval = PT0S
-# Set to false if not using ByReference MetadataFilters for a small perf gain
-#idp.service.metadata.enableByReferenceFilters = true
-
-#idp.service.attribute.registry.resources = shibboleth.AttributeRegistryResources
-#idp.service.attribute.registry.failFast = false
-idp.service.attribute.registry.checkInterval = PT15M
-# Default control of whether to encode XML attribute data with xsi:type
-idp.service.attribute.registry.encodeType = false
-
-#idp.service.attribute.resolver.resources = shibboleth.AttributeResolverResources
-#idp.service.attribute.resolver.failFast = false
-idp.service.attribute.resolver.checkInterval = PT15M
-#idp.service.attribute.resolver.maskFailures = true
-#idp.service.attribute.resolver.stripNulls = false
-
-#idp.service.attribute.filter.resources = shibboleth.AttributeFilterResources
-# NOTE: Failing the filter fast leaves no filters enabled.
-#idp.service.attribute.filter.failFast = false
-idp.service.attribute.filter.checkInterval = PT15M
-#idp.service.attribute.filter.maskFailures = true
-
-#idp.service.nameidGeneration.resources = shibboleth.NameIdentifierGenerationResources
-#idp.service.nameidGeneration.failFast = false
-idp.service.nameidGeneration.checkInterval = PT15M
-
-#idp.service.access.resources = shibboleth.AccessControlResources
-#idp.service.access.failFast = true
-idp.service.access.checkInterval = PT5M
-
-#idp.service.cas.registry.resources = shibboleth.CASServiceRegistryResources
-#idp.service.cas.registry.failFast = false
-idp.service.cas.registry.checkInterval = PT15M
-
-#idp.service.managedBean.resources = shibboleth.ManagedBeanResources
-#idp.service.managedBean.failFast = false
-idp.service.managedBean.checkInterval = PT15M
-
-#idp.message.resources = shibboleth.MessageSourceResources
-#idp.message.cacheSeconds = 300
-
-# These settings impact the behavior of the internal HTTP Client used by default
-# with some internal components, but notably *not* for metadata acquisition.
-#idp.httpclient.useSecurityEnhancedTLSSocketFactory = false
-#idp.httpclient.connectionDisregardTLSCertificate = false
-#idp.httpclient.connectionRequestTimeout = PT1M
-#idp.httpclient.connectionTimeout = PT1M
-#idp.httpclient.socketTimeout = PT1M
-#idp.httpclient.maxConnectionsTotal = 100
-#idp.httpclient.maxConnectionsPerRoute = 100
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/services.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/services.xml
deleted file mode 100644
index 24e2b1e..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/conf/services.xml
+++ /dev/null
@@ -1,58 +0,0 @@
-<beans xmlns="http://www.springframework.org/schema/beans"
-    xmlns:context="http://www.springframework.org/schema/context"
-    xmlns:util="http://www.springframework.org/schema/util" xmlns:p="http://www.springframework.org/schema/p"
-    xmlns:c="http://www.springframework.org/schema/c" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
-                           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-                           http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"
-                           
-    default-init-method="initialize"
-    default-destroy-method="destroy">
-                               
-    <!-- By default we look at resources whose names are derived from %{idp.home}. -->
-
-    <util:list id="shibboleth.RelyingPartyResolverResources">
-        <value>%{idp.home}/conf/relying-party.xml</value>
-        <value>%{idp.home}/conf/credentials.xml</value>
-    </util:list>
-
-    <util:list id="shibboleth.MetadataResolverResources">
-        <value>%{idp.home}/conf/metadata-providers.xml</value>
-    </util:list>
-
-    <util:list id ="shibboleth.AttributeResolverResources">
-        <value>%{idp.home}/conf/attribute-resolver.xml</value>
-    </util:list>
-
-    <!--
-    This is suitable for new installs but will usually produce duplicate Attribute
-    output if a legacy resolver file is used that contains AttributeEncoders.
-    -->
-    <util:list id ="shibboleth.AttributeRegistryResources">
-        <value>%{idp.home}/conf/attribute-registry.xml</value>
-        <value>%{idp.home}/conf/attributes/default-rules.xml</value>
-        <value>%{idp.home}/conf/attribute-resolver.xml</value>
-    </util:list>
-
-    <util:list id ="shibboleth.AttributeFilterResources">
-        <value>%{idp.home}/conf/attribute-filter.xml</value>
-    </util:list>
-
-    <util:list id ="shibboleth.NameIdentifierGenerationResources">
-        <value>%{idp.home}/conf/saml-nameid.xml</value>
-    </util:list>
-    
-    <util:list id="shibboleth.AccessControlResources">
-        <value>%{idp.home}/conf/access-control.xml</value>
-    </util:list>
-
-    <!--
-    This collection of resources differs slightly in that it should not include the file extension.
-    Message sources are internationalized, and Spring will search for a compatible language extension
-    and fall back to one with only a .properties extension.
-    -->
-    <util:list id="shibboleth.MessageSourceResources">
-        <value>%{idp.home}/messages/messages</value>
-    </util:list>
-    
-</beans>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/idp-backchannel.crt b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/idp-backchannel.crt
deleted file mode 100644
index 19044c9..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/idp-backchannel.crt
+++ /dev/null
@@ -1,25 +0,0 @@
------BEGIN CERTIFICATE-----
-MIIELDCCApSgAwIBAgIVAKMEwvKmJlWLzwBBxhMJZ/zi+0nbMA0GCSqGSIb3DQEB
-CwUAMBsxGTAXBgNVBAMMEGlkcC51bmljb24ubG9jYWwwHhcNMjMxMTA2MTc0ODM0
-WhcNNDMxMTA2MTc0ODM0WjAbMRkwFwYDVQQDDBBpZHAudW5pY29uLmxvY2FsMIIB
-ojANBgkqhkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAps8AP8KgLOtdERP1lLztwBT7
-tnmeBrQnWoX/MHs1K79HyzOpUw6j4Bm5MmJcTJxeK9kJiuLzHJ4G5kkMbmpMwhJj
-H21fBqibwraVMH+cBbD18QEqErE8mlJ+uN9AHYHaFV5O4ppaiesYSQnqvFjSILad
-5yJ3xNJwYfoeIc/E0alFuDVBvVhNqk32za6JJMiWLK08AJgUcGOtRU9q/Y7h2q73
-eygCtjDvFnCpPE/mGx5SwKu9N2+kotp0xkIiDliZ9wZFL6kTNkiQ94GJz6P+5j1v
-c3c3Sfth8+/f+S/idByzxTiX6gOf5b3nDT5mFgoLcOrilLfPEg/sDiv0jKjasNYR
-MlHe5a9xBe+gI3Y3M+0vppWfvJwh2l2fhoZqJC8zyTQz7TlEsC0hsOv70wgRAWmz
-OI4zDV4vL4/LrI2vPMt7uZFuC3DV0+XeUr5FZvFZKrsXCMB4cBkMEPCOYe31JT5y
-UxGtJEQOvl1ObKru4FNhrjcxXxCQMnA0oYnwUcHJAgMBAAGjZzBlMB0GA1UdDgQW
-BBS5vNUOpOMY7meBwaqoTN0wIq6myTBEBgNVHREEPTA7ghBpZHAudW5pY29uLmxv
-Y2FshidodHRwczovL2lkcC51bmljb24ubG9jYWwvaWRwL3NoaWJib2xldGgwDQYJ
-KoZIhvcNAQELBQADggGBADgeksdk7No8yusABD8DBxVOytOUg8ZHjjohbfUVJAet
-Y4HzX5/zJoU9EPeOOWHE6Zp1XkCk+ArYEJI53pj2+4S7fC6aw3n89wV2D0VLW/tb
-/MCAoc1Is/ALFw7PArHtozz2cWcd5B6DBJVBFvThQf/L39+vCTXt9+AgjpIt24BT
-zn8G5Nc3BHijW8pXfYreNHJYf6WuNZaay0374X14MwupMMPtCzliWlVORkjghZZB
-yNGf7S/GZ+AsCbv7PJEWvHekUfGccOGYBW3I9mU/ZAOiWZALQhqXO9nLCtuA/ues
-qhhg99IGrb+ZEjtdFKEnAS2XIcs0c37lfMSdiEOHa+Z0DlLK29OaikeSnLuRFP67
-xCeWT75C4XFYoFlpryC1bR694xDwuc865Z0uvMjtJ83AAenbg1bf9FX82CWYXDns
-jk7lubigoNxmFbllzDszYADlQt3v38rPucvbmWoayb88+Z614mNvIWTeWhAUEii4
-5hDBkVJuN/XCFdW+4Fq8nA==
------END CERTIFICATE-----
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/idp-backchannel.p12 b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/idp-backchannel.p12
deleted file mode 100644
index b639a42..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/idp-backchannel.p12 and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.nashorn/truststore.asc b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.nashorn/truststore.asc
deleted file mode 100644
index f5bc0f7..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.nashorn/truststore.asc
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
Rod Widdowson <rdw@steadingsoftware.com>	id	2A4B3FF0
-
-----BEGIN PGP PUBLIC KEY BLOCK-----
-Version: BCPG v1.76.0
-
-mQINBF2CHx4BEADfUvo4sPc8a8uQjfvoHdBY0qmgwXlcAOyllBKZ5g/wYKZO1Lkp
-LZh/dQFBK4AjqRnzs0dq0arK0W5WijOYjQ+s5cd1MMXmzqgXG02eAS4ooK6KsSwv
-mo2FydddQKFbwLkGdS/UXcENWNnzGeJhmjmcPSLgRo2hsSh63cFltq2+8fwl1fQ9
-FzZwscOOkJGBb7/nqdHdnvL9yrRameYFo2iWF9P52cjfv5NiNklkDBUHeISuX48I
-pI+kSOz2b7/aP4vKOKOpOaas0MAdcYT8AcwrCD9OhFFzfuIs/S9+rHGs/+M0vcWG
-DPR+IY0L7Stgkc2Hz1gazuqHBiOBq5VnDOE9nkZ/mY/HwMJzYCtuwQSPyidY7sRk
-lrD5NzXVXGtUri/vghOgRcT3PG8P6zL3UrJi+XgwNSmNHfWQR+wt2Rs9SqrHav+g
-xqHHxCmcH/7HSZEAFi0ooxybOCLeKuAuu94TWi/KAF6/d9iNLekXpuodKl/ceO6d
-9h8791Rjh9a2BR6+VkIxf2zSzb0IPrmGfCjq5Jhc7m3AzAYNWJs0e/FK6G3FYfIS
-TYAGEUJgiWkm7zpV8eDiUo7Qjs9YTQPuuVjtdVCzt3BNm5NUKyrssDxYFs6ryFop
-FDoFewGPhFTnh8wTo0PUYpVj6ZUC8YniFE+XAOq8hufgbiqMcFn+2A/qMQARAQAB
-tChSb2QgV2lkZG93c29uIDxyZHdAc3RlYWRpbmdzb2Z0d2FyZS5jb20+iQJOBBMB
-CAA4FiEESvTYPu3fQ9o8BssxAUg/JipLP/AFAl2CHx4CGwMFCwkIBwIGFQoJCAsC
-BBYCAwECHgECF4AACgkQAUg/JipLP/Cr6hAA0RQyvAvWXnVNA+js6aNpqNO+rGyw
-sm+ajSuPNCyrkELlR08qpTxaezQ3soDJ9iWYgpPV767szs0yZmbnEEq1QAJXYsq6
-0pGVtuEtTmqRYcxuZwwqfkGJhs8p2C7/U5IcbvrvlUpHD6G4CEaH/CHthOpyVtBV
-7cHqt1l0+6+928UTdkZl3OPrbQloHHgHN14LPWY2MiGCDIbLx5wOrwrJ8hoiGeK3
-npfUZsrothsh/hClMWB4jf5sM/fltr/dT+Vi09JjE7/2wDTIq1R7UsAUte6sfhb/
-GLTVdQmG8jsWfMWP3rKDFBRiXHNzM/gNP2mHnXLO6UlSkV2JuJ9fgSKiBpXhtrI3
-7PTNnJdZz1Lm6rl1T9jgWdzRkl4x17bBzgU8GkTsRBS2vuRFDdsoywPJJgw7sdP3
-FTVBFfCGil9DAzKjGtbeIM2UBfx/7ltqVrHMR5pgto7aXpAt7N1X4ocTL/BSlZCk
-nFXnMIpW+Vsg6NDg5bRyC3adaReL3APnMkmBSSiqu4hFwrD6MVXcLN9tQ70sW3QT
-e1lOiUMeGQkVhiRWiZLeQd9jIeN1hoDGBnBYBgAeawGO5fGAJCTosXLP07C8lFLF
-5SYN8pBx0acuZMVwG0NKGcYyP/3Z+3j4kWIlpN+x455nQs/n/ZBGLlkVygtlXCC5
-YXIbnFuzOi3Lofg=
-=W9I3
------END PGP PUBLIC KEY BLOCK-----
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.nashorn/truststore.asc.backup b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.nashorn/truststore.asc.backup
deleted file mode 100644
index e69de29..0000000
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.oidc.config/truststore.asc.backup b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.oidc.config/truststore.asc.backup
deleted file mode 100644
index e69de29..0000000
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.oidc.op/truststore.asc.backup b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.oidc.op/truststore.asc.backup
deleted file mode 100644
index e69de29..0000000
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.oidc.common/truststore.asc.backup b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.oidc.common/truststore.asc.backup
deleted file mode 100644
index e69de29..0000000
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/ant-1.10.14.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/ant-1.10.14.jar
deleted file mode 100644
index d175341..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/ant-1.10.14.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/ant-launcher-1.10.14.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/ant-launcher-1.10.14.jar
deleted file mode 100644
index 54c10ad..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/ant-launcher-1.10.14.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/bcpg-jdk18on-1.76.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/bcpg-jdk18on-1.76.jar
deleted file mode 100644
index f478624..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/bcpg-jdk18on-1.76.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/commons-compress-1.23.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/commons-compress-1.23.0.jar
deleted file mode 100644
index 38e5505..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/commons-compress-1.23.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/idp-cli-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/idp-cli-5.0.0.jar
deleted file mode 100644
index 5c25632..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/idp-cli-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/idp-installer-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/idp-installer-5.0.0.jar
deleted file mode 100644
index 1a901cf..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/idp-installer-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/jcommander-1.81.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/jcommander-1.81.jar
deleted file mode 100644
index 699c543..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/jcommander-1.81.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/shib-cli-9.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/shib-cli-9.0.0.jar
deleted file mode 100644
index e0c2f2a..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/binlib/shib-cli-9.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/idp.installed.version b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/idp.installed.version
deleted file mode 100644
index 3ccd980..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/idp.installed.version
+++ /dev/null
@@ -1,4 +0,0 @@
-#Version file written at 2023-11-06T17:48:23.270808669Z
-#Mon Nov 06 17:48:23 UTC 2023
-idp.installed.version=5.0.0
-idp.previous.installed.version=
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.idp.plugin.nashorn b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.idp.plugin.nashorn
deleted file mode 100644
index ce35636..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.idp.plugin.nashorn
+++ /dev/null
@@ -1,12 +0,0 @@
-#Files Copied 2023-11-08T14:10:20.094540150Z
-#Wed Nov 08 14:10:20 UTC 2023
-idp.plugin.file.1=dist/plugin-webapp/WEB-INF/lib/asm-util-7.3.1.jar
-idp.plugin.version=2.0.0
-idp.plugin.file.2=dist/plugin-webapp/WEB-INF/lib/asm-analysis-7.3.1.jar
-idp.plugin.file.3=dist/plugin-webapp/WEB-INF/lib/asm-commons-7.3.1.jar
-idp.plugin.relativePaths=true
-idp.plugin.file.4=dist/plugin-webapp/WEB-INF/lib/idp-plugin-nashorn-jdk-impl-2.0.0.jar
-idp.plugin.file.5=dist/plugin-webapp/WEB-INF/lib/asm-7.3.1.jar
-idp.plugin.file.6=dist/plugin-webapp/WEB-INF/lib/nashorn-core-15.4.jar
-idp.plugin.file.7=dist/plugin-webapp/WEB-INF/lib/idp-plugin-scripting-api-2.0.0.jar
-idp.plugin.file.8=dist/plugin-webapp/WEB-INF/lib/asm-tree-7.3.1.jar
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.idp.plugin.oidc.config b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.idp.plugin.oidc.config
deleted file mode 100644
index 6c18d98..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.idp.plugin.oidc.config
+++ /dev/null
@@ -1,5 +0,0 @@
-#Files Copied 2023-11-06T17:58:18.554634463Z
-#Mon Nov 06 17:58:18 UTC 2023
-idp.plugin.file.1=dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-config-impl-2.0.0.jar
-idp.plugin.version=2.0.0
-idp.plugin.relativePaths=true
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.idp.plugin.oidc.op b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.idp.plugin.oidc.op
deleted file mode 100644
index ca5c5e8..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.idp.plugin.oidc.op
+++ /dev/null
@@ -1,6 +0,0 @@
-#Files Copied 2023-11-06T18:03:52.222771240Z
-#Mon Nov 06 18:03:52 UTC 2023
-idp.plugin.file.1=dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-op-api-4.0.0.jar
-idp.plugin.version=4.0.0
-idp.plugin.file.2=dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-op-impl-4.0.0.jar
-idp.plugin.relativePaths=true
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.oidc.common b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.oidc.common
deleted file mode 100644
index b4a2c12..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-contents/net.shibboleth.oidc.common
+++ /dev/null
@@ -1,21 +0,0 @@
-#Files Copied 2023-11-06T17:57:25.550970856Z
-#Mon Nov 06 17:57:25 UTC 2023
-idp.plugin.file.11=dist/plugin-webapp/WEB-INF/lib/oidc-common-profile-impl-3.0.0.jar
-idp.plugin.file.12=dist/plugin-webapp/WEB-INF/lib/oidc-common-profile-api-3.0.0.jar
-idp.plugin.file.13=dist/plugin-webapp/WEB-INF/lib/oidc-common-attribute-impl-3.0.0.jar
-idp.plugin.file.14=dist/plugin-webapp/WEB-INF/lib/oidc-common-crypto-api-3.0.0.jar
-idp.plugin.file.15=dist/plugin-webapp/WEB-INF/lib/json-smart-2.4.8.jar
-idp.plugin.file.16=dist/plugin-webapp/WEB-INF/lib/oidc-common-saml-api-3.0.0.jar
-idp.plugin.file.17=dist/plugin-webapp/WEB-INF/lib/lang-tag-1.7.jar
-idp.plugin.file.1=dist/plugin-webapp/WEB-INF/lib/oidc-common-crypto-impl-3.0.0.jar
-idp.plugin.version=3.0.0
-idp.plugin.file.2=dist/plugin-webapp/WEB-INF/lib/accessors-smart-1.2.jar
-idp.plugin.file.3=dist/plugin-webapp/WEB-INF/lib/oidc-common-metadata-api-3.0.0.jar
-idp.plugin.relativePaths=true
-idp.plugin.file.4=dist/plugin-webapp/WEB-INF/lib/oidc-common-metadata-impl-3.0.0.jar
-idp.plugin.file.5=dist/plugin-webapp/WEB-INF/lib/nimbus-jose-jwt-9.29.jar
-idp.plugin.file.6=dist/plugin-webapp/WEB-INF/lib/oauth2-oidc-sdk-10.5.1.jar
-idp.plugin.file.7=dist/plugin-webapp/WEB-INF/lib/oidc-common-attribute-api-3.0.0.jar
-idp.plugin.file.10=dist/plugin-webapp/WEB-INF/lib/oidc-common-plugin-3.0.0.jar
-idp.plugin.file.8=dist/plugin-webapp/WEB-INF/lib/content-type-2.2.jar
-idp.plugin.file.9=dist/plugin-webapp/WEB-INF/lib/oidc-common-saml-impl-3.0.0.jar
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/accessors-smart-1.2.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/accessors-smart-1.2.jar
deleted file mode 100644
index f4505e9..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/accessors-smart-1.2.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-7.3.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-7.3.1.jar
deleted file mode 100644
index 8a50266..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-7.3.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-analysis-7.3.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-analysis-7.3.1.jar
deleted file mode 100644
index 1f83a5e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-analysis-7.3.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-commons-7.3.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-commons-7.3.1.jar
deleted file mode 100644
index 65fb30e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-commons-7.3.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-tree-7.3.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-tree-7.3.1.jar
deleted file mode 100644
index 28858f4..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-tree-7.3.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-util-7.3.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-util-7.3.1.jar
deleted file mode 100644
index 4fe6c52..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/asm-util-7.3.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/content-type-2.2.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/content-type-2.2.jar
deleted file mode 100644
index 40463fc..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/content-type-2.2.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-nashorn-jdk-impl-2.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-nashorn-jdk-impl-2.0.0.jar
deleted file mode 100644
index fa7afa7..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-nashorn-jdk-impl-2.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-config-impl-2.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-config-impl-2.0.0.jar
deleted file mode 100644
index 3f0389a..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-config-impl-2.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-op-api-4.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-op-api-4.0.0.jar
deleted file mode 100644
index b98ae9b..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-op-api-4.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-op-impl-4.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-op-impl-4.0.0.jar
deleted file mode 100644
index 33ccb2d..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-oidc-op-impl-4.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-scripting-api-2.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-scripting-api-2.0.0.jar
deleted file mode 100644
index 43527d0..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/idp-plugin-scripting-api-2.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/json-smart-2.4.8.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/json-smart-2.4.8.jar
deleted file mode 100644
index 213ffe0..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/json-smart-2.4.8.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/lang-tag-1.7.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/lang-tag-1.7.jar
deleted file mode 100644
index c089707..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/lang-tag-1.7.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/nashorn-core-15.4.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/nashorn-core-15.4.jar
deleted file mode 100644
index b472660..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/nashorn-core-15.4.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/nimbus-jose-jwt-9.29.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/nimbus-jose-jwt-9.29.jar
deleted file mode 100644
index 5f801ca..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/nimbus-jose-jwt-9.29.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oauth2-oidc-sdk-10.5.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oauth2-oidc-sdk-10.5.1.jar
deleted file mode 100644
index 949d0a0..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oauth2-oidc-sdk-10.5.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-attribute-api-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-attribute-api-3.0.0.jar
deleted file mode 100644
index fca1d1e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-attribute-api-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-attribute-impl-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-attribute-impl-3.0.0.jar
deleted file mode 100644
index e53395e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-attribute-impl-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-crypto-api-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-crypto-api-3.0.0.jar
deleted file mode 100644
index 95d122b..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-crypto-api-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-crypto-impl-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-crypto-impl-3.0.0.jar
deleted file mode 100644
index e610ff5..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-crypto-impl-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-metadata-api-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-metadata-api-3.0.0.jar
deleted file mode 100644
index 10ec24d..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-metadata-api-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-metadata-impl-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-metadata-impl-3.0.0.jar
deleted file mode 100644
index 38d1716..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-metadata-impl-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-plugin-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-plugin-3.0.0.jar
deleted file mode 100644
index 0aa4465..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-plugin-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-profile-api-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-profile-api-3.0.0.jar
deleted file mode 100644
index 4de6fa7..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-profile-api-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-profile-impl-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-profile-impl-3.0.0.jar
deleted file mode 100644
index cb03d54..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-profile-impl-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-saml-api-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-saml-api-3.0.0.jar
deleted file mode 100644
index f57dcdc..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-saml-api-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-saml-impl-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-saml-impl-3.0.0.jar
deleted file mode 100644
index 087db21..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/plugin-webapp/WEB-INF/lib/oidc-common-saml-impl-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/META-INF/MANIFEST.MF b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/META-INF/MANIFEST.MF
deleted file mode 100644
index 5205f28..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,4 +0,0 @@
-Manifest-Version: 1.0
-Created-By: Maven WAR Plugin 3.3.2
-Build-Jdk-Spec: 17
-
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/idpui.tld b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/idpui.tld
deleted file mode 100644
index 0193edb..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/idpui.tld
+++ /dev/null
@@ -1,257 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" ?>
-<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
-    version="2.0">
-    
-  <tlib-version>1.0</tlib-version>
-  <short-name>idpui</short-name>
-  <uri>urn:mace:shibboleth:2.0:idp:ui</uri>
-  
-  <tag>
-    <description>Service Name - some user friendly description about the relying party</description>
-    <name>serviceName</name>
-    <tag-class>net.shibboleth.idp.ui.taglib.ServiceNameTag</tag-class>
-    <body-content>empty</body-content>
-    <attribute>
-      <name>defaultValue</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>uiContext</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-      <type>net.shibboleth.idp.ui.context.RelyingPartyUIContext</type>
-    </attribute>
-  </tag>
-  
-  <tag>
-    <description>Service Description - taken from the mdui statement</description>
-    <name>serviceDescription</name>
-    <tag-class>net.shibboleth.idp.ui.taglib.ServiceDescriptionTag</tag-class>
-    <body-content>scriptless</body-content>
-    <attribute>
-      <name>uiContext</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-      <type>net.shibboleth.idp.ui.context.RelyingPartyUIContext</type>
-    </attribute>
-  </tag>
-  
-  <tag>
-    <description>Service Contact - information about the contact at the SP</description>
-    <name>serviceContact</name>
-    <tag-class>net.shibboleth.idp.ui.taglib.ServiceContactTag</tag-class>
-    <body-content>scriptless</body-content>
-    <attribute>
-      <name>contactType</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>name</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssId</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssClass</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssStyle</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>uiContext</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-      <type>net.shibboleth.idp.ui.context.RelyingPartyUIContext</type>
-    </attribute>
-  </tag>
-  
-  <tag>
-    <description>Service Privacy URL - directly from the metadata if present</description>
-    <name>servicePrivacyURL</name>
-    <tag-class>net.shibboleth.idp.ui.taglib.ServicePrivacyURLTag</tag-class>
-    <body-content>scriptless</body-content>
-    <attribute>
-      <name>linkText</name>
-      <required>true</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssId</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssClass</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssStyle</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>uiContext</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-      <type>net.shibboleth.idp.ui.context.RelyingPartyUIContext</type>
-    </attribute>
-  </tag>
-  
-  <tag>
-    <description>Service Information URL - directly from the metadata if present</description>
-    <name>serviceInformationURL</name>
-    <tag-class>net.shibboleth.idp.ui.taglib.ServiceInformationURLTag</tag-class>
-    <body-content>scriptless</body-content>
-    <attribute>
-      <name>linkText</name>
-      <required>true</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssId</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssClass</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssStyle</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>uiContext</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-      <type>net.shibboleth.idp.ui.context.RelyingPartyUIContext</type>
-    </attribute>
-  </tag>
-  
-  <tag>
-    <description>Logo for the SP</description>
-    <name>serviceLogo</name>
-    <tag-class>net.shibboleth.idp.ui.taglib.ServiceLogoTag</tag-class>
-    <body-content>scriptless</body-content>
-    <attribute>
-      <name>alt</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>minHeight</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>maxHeight</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>minWidth</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>maxWidth</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssId</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssClass</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssStyle</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>uiContext</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-      <type>net.shibboleth.idp.ui.context.RelyingPartyUIContext</type>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>Service Organization Name - directly from the metadata if present</description>
-    <name>organizationName</name>
-    <tag-class>net.shibboleth.idp.ui.taglib.OrganizationNameTag</tag-class>
-    <body-content>scriptless</body-content>
-    <attribute>
-      <name>uiContext</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-      <type>net.shibboleth.idp.ui.context.RelyingPartyUIContext</type>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>Service Organization Display Name - directly from the metadata if present</description>
-    <name>organizationDisplayName</name>
-    <tag-class>net.shibboleth.idp.ui.taglib.OrganizationDisplayNameTag</tag-class>
-    <body-content>scriptless</body-content>
-    <attribute>
-      <name>uiContext</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-      <type>net.shibboleth.idp.ui.context.RelyingPartyUIContext</type>
-    </attribute>
-  </tag>
-
-  <tag>
-    <description>Service Organization URL - directly from the metadata if present</description>
-    <name>organizationURL</name>
-    <tag-class>net.shibboleth.idp.ui.taglib.OrganizationURLTag</tag-class>
-    <body-content>scriptless</body-content>
-    <attribute>
-      <name>linkText</name>
-      <required>true</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssId</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssClass</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>cssStyle</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-    </attribute>
-    <attribute>
-      <name>uiContext</name>
-      <required>false</required>
-      <rtexprvalue>true</rtexprvalue>
-      <type>net.shibboleth.idp.ui.context.RelyingPartyUIContext</type>
-    </attribute>
-  </tag>
-
-</taglib>
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/jsp/metadata.jsp b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/jsp/metadata.jsp
deleted file mode 100644
index b7ab312..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/jsp/metadata.jsp
+++ /dev/null
@@ -1,41 +0,0 @@
-<%
-final org.springframework.web.context.WebApplicationContext springContext =
-    org.springframework.web.context.support.WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
-
-String path = springContext.getEnvironment().getProperty("idp.entityID.metadataFile");
-if (path != null) {
-    path = springContext.getEnvironment().resolvePlaceholders(path.replace("%{", "${"));
-} else {
-    path = springContext.getEnvironment().getProperty("idp.home") + "/metadata/idp-metadata.xml";	
-}
-
-if (path.isEmpty()) {
-    response.sendError(404);
-} else {
-    final String acceptHeader = request.getHeader("Accept");
-    if (acceptHeader != null && !acceptHeader.contains("application/samlmetadata+xml")) {
-        response.setContentType("application/xml");
-    } else {
-        response.setContentType("application/samlmetadata+xml");
-    }
-
-    java.io.InputStreamReader in = null;
-    try {
-        in = new java.io.InputStreamReader(new java.io.FileInputStream(path),"UTF8");
-        int i;
-        while ((i = in.read()) != -1) {
-            out.write(i);
-        }
-    } catch (final java.io.IOException e) {
-        out.println(e.getMessage());
-        return;
-    } finally {
-        if (null != in) {
-            try {
-                in.close();
-            } catch (java.io.IOException e) {
-            }
-        }
-    }
-}
-%>
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/jsp/status.jsp b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/jsp/status.jsp
deleted file mode 100644
index 69f1992..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/jsp/status.jsp
+++ /dev/null
@@ -1,161 +0,0 @@
-<%@ page language="java" contentType="text/plain; charset=UTF-8" pageEncoding="UTF-8"%>
-<%@ page trimDirectiveWhitespaces="true" %>
-<%@ page import="java.util.ArrayList" %>
-<%@ page import="java.util.Map" %>
-<%@ page import="java.util.Set" %>
-<%@ page import="java.util.Map.Entry" %>
-<%@ page import="java.util.Collection" %>
-<%@ page import="java.util.Collections" %>
-<%@ page import="java.util.Optional" %>
-<%@ page import="java.util.ServiceLoader" %>
-<%@ page import="java.util.ServiceLoader.Provider" %>
-<%@ page import="java.time.Duration" %>
-<%@ page import="java.time.Instant" %>
-<%@ page import="java.time.format.DateTimeFormatter" %>
-<%@ page import="org.springframework.core.env.Environment" %>
-<%@ page import="org.springframework.webflow.execution.RequestContext" %>
-<%@ page import="net.shibboleth.idp.Version" %>
-<%@ page import="com.codahale.metrics.MetricSet" %>
-<%@ page import="com.codahale.metrics.Gauge" %>
-<%@ page import="net.shibboleth.idp.module.IdPModule" %>
-<%@ page import="net.shibboleth.idp.plugin.IdPPlugin" %>
-<%@ page import="net.shibboleth.profile.module.ModuleContext" %>
-<%@ page import="net.shibboleth.shared.component.IdentifiedComponent" %>
-<%@ page import="net.shibboleth.shared.service.ReloadableService" %>
-<%
-final RequestContext requestContext = (RequestContext) request.getAttribute("flowRequestContext");
-final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ISO_INSTANT;
-final Instant now = Instant.now();
-final Instant startupTime = Instant.ofEpochMilli(requestContext.getActiveFlow().getApplicationContext().getParent().getStartupDate());
-%>### Operating Environment Information
-operating_system: <%= System.getProperty("os.name") %>
-operating_system_version: <%= System.getProperty("os.version") %>
-operating_system_architecture: <%= System.getProperty("os.arch") %>
-jdk_version: <%= System.getProperty("java.version") %>
-available_cores: <%= Runtime.getRuntime().availableProcessors() %>
-used_memory: <%= (Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory()) / 1048576 %> MB
-maximum_memory: <%= Runtime.getRuntime().maxMemory() / 1048576 %> MB
-
-### Identity Provider Information
-idp_version: <%= Version.getVersion() %>
-start_time: <%= dateTimeFormatter.format(startupTime) %>
-current_time: <%= dateTimeFormatter.format(now) %>
-uptime: <%= Duration.ofMillis(now.toEpochMilli() - startupTime.toEpochMilli()).toString() %>
-
-<%
-out.println();
-out.println();
-out.println("enabled modules: ");
-final ModuleContext moduleContext =
-    new ModuleContext(((Environment) request.getAttribute("environment")).getProperty("idp.home"));
-for (final IdPModule module : ServiceLoader.load(IdPModule.class)) {
-    if (module.isEnabled(moduleContext)) {
-        out.println("\t" + module.getId() + " (" + module.getName(moduleContext) + ")");
-    }
-}
-out.println();
-
-out.println("installed plugins: ");
-for (final IdPPlugin plugin : ServiceLoader.load(IdPPlugin.class)) {
-    out.println("\t" + plugin.getPluginId() + " Version " + plugin.getMajorVersion() + "." + plugin.getMinorVersion() + "." + plugin.getPatchVersion());
-}
-out.println();
-
-
-for (final ReloadableService service : (Collection<ReloadableService>) request.getAttribute("services")) {
-    final Instant successfulReload = service.getLastSuccessfulReloadInstant();
-    final Instant lastReload = service.getLastReloadAttemptInstant();
-    final Throwable cause = service.getReloadFailureCause();
-
-    out.println("service: " + ((IdentifiedComponent) service).getId());
-    if (successfulReload != null) {
-        out.println("last successful reload attempt: " + dateTimeFormatter.format(successfulReload));
-    }
-    if (lastReload != null) {
-        out.println("last reload attempt: " + dateTimeFormatter.format(lastReload));
-    }
-    if (cause != null) {
-        out.println("last failure cause: " + cause.getClass().getName() + ": " + cause.getMessage());
-    }
-    
-    out.println();
-    
-    if (((IdentifiedComponent) service).getId().contains("Metadata")) {
-    
-    	final MetricSet metrics = (MetricSet) request.getAttribute("metadataResolverGaugeSet");
-    	if (metrics == null || metrics.getMetrics().get("net.shibboleth.idp.metadata.refresh") == null) {
-    		out.println("No Metadata Resolver Gauge Set Found");
-    		continue;
-    	}
-    	final Gauge<Map<String,Instant>> refreshes = (Gauge<Map<String,Instant>>) metrics.getMetrics().get("net.shibboleth.idp.metadata.refresh");
-    	final Gauge<Map<String,Instant>> updates = (Gauge<Map<String,Instant>>) metrics.getMetrics().get("net.shibboleth.idp.metadata.update");
-    	final Gauge<Map<String,Instant>> successes = (Gauge<Map<String,Instant>>) metrics.getMetrics().get("net.shibboleth.idp.metadata.successfulRefresh");
-    	final Gauge<Map<String,Instant>> rootValids = (Gauge<Map<String,Instant>>) metrics.getMetrics().get("net.shibboleth.idp.metadata.rootValidUntil");
-    	final Gauge<Map<String,String>> errors = (Gauge<Map<String,String>>) metrics.getMetrics().get("net.shibboleth.idp.metadata.error");
-    	
-		Set<Entry<String, Instant>> entrySet = refreshes.getValue().entrySet();
-    	if (entrySet.isEmpty()) {
-	    	out.println("\tNo Metadata Resolver has ever attempted a reload");
-			out.println();
-			continue;
-		}
-		for (final Entry<String, Instant> mr : entrySet) {
-			final String resolverId = mr.getKey();
-			final Instant lastRefresh = mr.getValue();
-            final Instant lastUpdate = updates == null ? null : updates.getValue().get(resolverId);
-			final Instant lastSuccessfulRefresh = successes == null ? null : successes.getValue().get(resolverId);
-			final Instant rootValidUntil = rootValids == null ? null : rootValids.getValue().get(resolverId);
-		    final String lastError = errors == null ? null : errors.getValue().get(resolverId);
- 
-            out.println("\tmetadata source: " + resolverId);
-            if (lastRefresh != null) {
-                out.println("\tlast refresh attempt: " + dateTimeFormatter.format(lastRefresh));
-            }
-            if (lastSuccessfulRefresh != null) {
-                out.println("\tlast successful refresh: " + dateTimeFormatter.format(lastSuccessfulRefresh));
-            }
-            if (lastUpdate != null) {
-                out.println("\tlast update: " + dateTimeFormatter.format(lastUpdate));
-            }
-            if (lastError != null) {
-                out.println("\tlast error: " + lastError);
-            }
-            if (rootValidUntil != null) {
-                out.println("\troot validUntil: " + dateTimeFormatter.format(rootValidUntil));
-            }
-            out.println();
-		}		    
-    } else if (((IdentifiedComponent) service).getId().contains("AttributeResolver")) {
-    
-    	final MetricSet metrics = (MetricSet) request.getAttribute("attributeResolverGaugeSet");
-    	if (metrics == null || metrics.getMetrics().get("net.shibboleth.idp.attribute.resolver.failure") == null) {
-    		out.println("No Attribute Resolver Gauge Set Found");
-    		continue;
-    	}
-    	final Gauge<Map<String,Instant>> failGauge =
-    	        (Gauge<Map<String,Instant>>) metrics.getMetrics().get("net.shibboleth.idp.attribute.resolver.failure");
-    	final Set<Entry<String,Instant>> failSet = failGauge.getValue().entrySet();
-    	if (failSet.isEmpty()) {
-	    	out.println("\tNo Data Connector has ever failed");
-			out.println();
-			continue;
-		}
-        final Gauge<Map<String,Instant>> successGauge =
-                (Gauge<Map<String,Instant>>) metrics.getMetrics().get("net.shibboleth.idp.attribute.resolver.success");
-        final Map<String,Instant> successMap = successGauge.getValue();
-        final ArrayList<String> failingConnectors = new ArrayList<>();
-    	for (final Entry<String, Instant> en : failSet) {
-			final String connectorId = en.getKey();
-            final Instant lastFail = en.getValue();
-			out.println("\tDataConnector " +  connectorId + ": last failed at " + dateTimeFormatter.format(lastFail));
-            out.println();
-            final Instant lastSuccess = successMap.get(connectorId);
-            if (lastSuccess == null || lastSuccess.isBefore(lastFail)) {
-                failingConnectors.add(connectorId);
-            }
-        }
-        out.println("\tCurrently failing: " + failingConnectors);
-        out.println();
-    }
-}
-%>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/annotations-17.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/annotations-17.0.0.jar
deleted file mode 100644
index 477f7d0..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/annotations-17.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/bcpkix-jdk18on-1.76.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/bcpkix-jdk18on-1.76.jar
deleted file mode 100644
index 16c2f0b..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/bcpkix-jdk18on-1.76.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/bcprov-jdk18on-1.76.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/bcprov-jdk18on-1.76.jar
deleted file mode 100644
index c0c8994..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/bcprov-jdk18on-1.76.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/bcutil-jdk18on-1.76.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/bcutil-jdk18on-1.76.jar
deleted file mode 100644
index 2c2ab91..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/bcutil-jdk18on-1.76.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/checker-qual-3.33.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/checker-qual-3.33.0.jar
deleted file mode 100644
index 61761fd..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/checker-qual-3.33.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-codec-1.16.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-codec-1.16.0.jar
deleted file mode 100644
index 854fc7e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-codec-1.16.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-compiler-3.1.10.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-compiler-3.1.10.jar
deleted file mode 100644
index 0f6dfe2..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-compiler-3.1.10.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-dbcp2-2.9.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-dbcp2-2.9.0.jar
deleted file mode 100644
index ddfd42c..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-dbcp2-2.9.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-lang3-3.13.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-lang3-3.13.0.jar
deleted file mode 100644
index 891540f..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-lang3-3.13.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-pool2-2.10.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-pool2-2.10.0.jar
deleted file mode 100644
index 4f8e0df..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/commons-pool2-2.10.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/cryptacular-1.2.6.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/cryptacular-1.2.6.jar
deleted file mode 100644
index 2a30d70..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/cryptacular-1.2.6.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/error_prone_annotations-2.18.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/error_prone_annotations-2.18.0.jar
deleted file mode 100644
index e072fe0..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/error_prone_annotations-2.18.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/failureaccess-1.0.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/failureaccess-1.0.1.jar
deleted file mode 100644
index 9b56dc7..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/failureaccess-1.0.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/guava-32.1.2-jre.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/guava-32.1.2-jre.jar
deleted file mode 100644
index e71fd46..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/guava-32.1.2-jre.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpclient5-5.2.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpclient5-5.2.1.jar
deleted file mode 100644
index b9cdadc..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpclient5-5.2.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpclient5-cache-5.2.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpclient5-cache-5.2.1.jar
deleted file mode 100644
index b5421d0..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpclient5-cache-5.2.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpcore5-5.2.2.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpcore5-5.2.2.jar
deleted file mode 100644
index d6582fa..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpcore5-5.2.2.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpcore5-h2-5.2.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpcore5-h2-5.2.jar
deleted file mode 100644
index eada8eb..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/httpcore5-h2-5.2.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-admin-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-admin-api-5.0.0.jar
deleted file mode 100644
index 3405153..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-admin-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-admin-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-admin-impl-5.0.0.jar
deleted file mode 100644
index c47674f..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-admin-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-authn-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-authn-api-5.0.0.jar
deleted file mode 100644
index b30f214..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-authn-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-authn-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-authn-impl-5.0.0.jar
deleted file mode 100644
index aa89042..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-authn-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-cas-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-cas-api-5.0.0.jar
deleted file mode 100644
index dfd1bd1..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-cas-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-cas-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-cas-impl-5.0.0.jar
deleted file mode 100644
index 4c2451a..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-cas-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-conf-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-conf-impl-5.0.0.jar
deleted file mode 100644
index be2fd09..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-conf-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-consent-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-consent-api-5.0.0.jar
deleted file mode 100644
index 2270219..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-consent-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-consent-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-consent-impl-5.0.0.jar
deleted file mode 100644
index f4f52f6..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-consent-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-core-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-core-5.0.0.jar
deleted file mode 100644
index 652270e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-core-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-profile-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-profile-api-5.0.0.jar
deleted file mode 100644
index a32cc4e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-profile-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-profile-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-profile-impl-5.0.0.jar
deleted file mode 100644
index 97c2d60..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-profile-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-saml-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-saml-api-5.0.0.jar
deleted file mode 100644
index 6483d10..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-saml-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-saml-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-saml-impl-5.0.0.jar
deleted file mode 100644
index fa2bbf9..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-saml-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-schema-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-schema-5.0.0.jar
deleted file mode 100644
index 1980fae..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-schema-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-session-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-session-api-5.0.0.jar
deleted file mode 100644
index 0d9bcc7..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-session-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-session-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-session-impl-5.0.0.jar
deleted file mode 100644
index a59113a..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-session-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-spring-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-spring-5.0.0.jar
deleted file mode 100644
index 7fa620b..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-spring-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-ui-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-ui-5.0.0.jar
deleted file mode 100644
index 18c9535..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/idp-ui-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/j2objc-annotations-2.8.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/j2objc-annotations-2.8.jar
deleted file mode 100644
index 3595c4f..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/j2objc-annotations-2.8.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-annotations-2.15.2.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-annotations-2.15.2.jar
deleted file mode 100644
index f8799c3..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-annotations-2.15.2.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-core-2.15.2.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-core-2.15.2.jar
deleted file mode 100644
index a0e7486..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-core-2.15.2.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-databind-2.15.2.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-databind-2.15.2.jar
deleted file mode 100644
index 86f9a86..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-databind-2.15.2.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-datatype-jsr310-2.15.2.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-datatype-jsr310-2.15.2.jar
deleted file mode 100644
index 8fa20e9..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jackson-datatype-jsr310-2.15.2.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jakarta.activation-2.0.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jakarta.activation-2.0.1.jar
deleted file mode 100644
index 521c7c4..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jakarta.activation-2.0.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jakarta.json-2.0.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jakarta.json-2.0.1.jar
deleted file mode 100644
index e6d094a..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jakarta.json-2.0.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jakarta.mail-2.0.1.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jakarta.mail-2.0.1.jar
deleted file mode 100644
index 17e07cc..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jakarta.mail-2.0.1.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/janino-3.1.10.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/janino-3.1.10.jar
deleted file mode 100644
index a876fbd..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/janino-3.1.10.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jsonapi-converter-0.13.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jsonapi-converter-0.13.jar
deleted file mode 100644
index 36fbfb4..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jsonapi-converter-0.13.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jsr305-3.0.2.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jsr305-3.0.2.jar
deleted file mode 100644
index 59222d9..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jsr305-3.0.2.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jul-to-slf4j-2.0.7.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jul-to-slf4j-2.0.7.jar
deleted file mode 100644
index 11ed9ff..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/jul-to-slf4j-2.0.7.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/ldaptive-2.2.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/ldaptive-2.2.0.jar
deleted file mode 100644
index fafab70..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/ldaptive-2.2.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar
deleted file mode 100644
index 45832c0..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/log4j-over-slf4j-2.0.7.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/log4j-over-slf4j-2.0.7.jar
deleted file mode 100644
index 894ad61..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/log4j-over-slf4j-2.0.7.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/logback-classic-1.4.11.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/logback-classic-1.4.11.jar
deleted file mode 100644
index c6a0353..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/logback-classic-1.4.11.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/logback-core-1.4.11.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/logback-core-1.4.11.jar
deleted file mode 100644
index fa630c9..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/logback-core-1.4.11.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/metrics-core-4.2.19.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/metrics-core-4.2.19.jar
deleted file mode 100644
index e424746..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/metrics-core-4.2.19.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/metrics-json-4.2.19.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/metrics-json-4.2.19.jar
deleted file mode 100644
index 6621aeb..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/metrics-json-4.2.19.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/metrics-jvm-4.2.19.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/metrics-jvm-4.2.19.jar
deleted file mode 100644
index 2b1538e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/metrics-jvm-4.2.19.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/micrometer-commons-1.10.9.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/micrometer-commons-1.10.9.jar
deleted file mode 100644
index 5aab282..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/micrometer-commons-1.10.9.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/micrometer-observation-1.10.9.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/micrometer-observation-1.10.9.jar
deleted file mode 100644
index c1765b0..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/micrometer-observation-1.10.9.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-buffer-4.1.96.Final.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-buffer-4.1.96.Final.jar
deleted file mode 100644
index 354486b..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-buffer-4.1.96.Final.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-codec-4.1.96.Final.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-codec-4.1.96.Final.jar
deleted file mode 100644
index 7101971..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-codec-4.1.96.Final.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-common-4.1.96.Final.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-common-4.1.96.Final.jar
deleted file mode 100644
index c9eff76..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-common-4.1.96.Final.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-handler-4.1.96.Final.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-handler-4.1.96.Final.jar
deleted file mode 100644
index ec36faa..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-handler-4.1.96.Final.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-resolver-4.1.96.Final.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-resolver-4.1.96.Final.jar
deleted file mode 100644
index 29e08ed..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-resolver-4.1.96.Final.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-4.1.96.Final.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-4.1.96.Final.jar
deleted file mode 100644
index ddf8deb..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-4.1.96.Final.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-classes-epoll-4.1.96.Final.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-classes-epoll-4.1.96.Final.jar
deleted file mode 100644
index dad7911..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-classes-epoll-4.1.96.Final.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-classes-kqueue-4.1.96.Final.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-classes-kqueue-4.1.96.Final.jar
deleted file mode 100644
index a5f6a8e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-classes-kqueue-4.1.96.Final.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-epoll-4.1.96.Final-linux-aarch_64.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-epoll-4.1.96.Final-linux-aarch_64.jar
deleted file mode 100644
index b631cce..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-epoll-4.1.96.Final-linux-aarch_64.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-epoll-4.1.96.Final-linux-x86_64.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-epoll-4.1.96.Final-linux-x86_64.jar
deleted file mode 100644
index 1252ab3..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-epoll-4.1.96.Final-linux-x86_64.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-kqueue-4.1.96.Final-osx-aarch_64.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-kqueue-4.1.96.Final-osx-aarch_64.jar
deleted file mode 100644
index c9d0213..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-kqueue-4.1.96.Final-osx-aarch_64.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-kqueue-4.1.96.Final-osx-x86_64.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-kqueue-4.1.96.Final-osx-x86_64.jar
deleted file mode 100644
index 4ef4beb..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-kqueue-4.1.96.Final-osx-x86_64.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-unix-common-4.1.96.Final.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-unix-common-4.1.96.Final.jar
deleted file mode 100644
index f8dfc95..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/netty-transport-native-unix-common-4.1.96.Final.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-core-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-core-api-5.0.0.jar
deleted file mode 100644
index f2904fe..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-core-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-core-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-core-impl-5.0.0.jar
deleted file mode 100644
index c95d7f2..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-core-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-messaging-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-messaging-api-5.0.0.jar
deleted file mode 100644
index 8416122..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-messaging-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-messaging-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-messaging-impl-5.0.0.jar
deleted file mode 100644
index 5c3650d..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-messaging-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-profile-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-profile-api-5.0.0.jar
deleted file mode 100644
index c76ceff..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-profile-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-profile-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-profile-impl-5.0.0.jar
deleted file mode 100644
index a738b7f..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-profile-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-saml-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-saml-api-5.0.0.jar
deleted file mode 100644
index adc8114..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-saml-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-saml-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-saml-impl-5.0.0.jar
deleted file mode 100644
index 394401c..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-saml-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-security-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-security-api-5.0.0.jar
deleted file mode 100644
index 241f727..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-security-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-security-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-security-impl-5.0.0.jar
deleted file mode 100644
index 054b998..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-security-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-soap-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-soap-api-5.0.0.jar
deleted file mode 100644
index 7517aad..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-soap-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-soap-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-soap-impl-5.0.0.jar
deleted file mode 100644
index afa9a8a..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-soap-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-spring-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-spring-5.0.0.jar
deleted file mode 100644
index e927908..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-spring-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-storage-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-storage-api-5.0.0.jar
deleted file mode 100644
index 33efa55..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-storage-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-storage-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-storage-impl-5.0.0.jar
deleted file mode 100644
index a36b309..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-storage-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-xmlsec-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-xmlsec-api-5.0.0.jar
deleted file mode 100644
index 022b670..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-xmlsec-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-xmlsec-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-xmlsec-impl-5.0.0.jar
deleted file mode 100644
index eee6cb2..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/opensaml-xmlsec-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-api-5.0.0.jar
deleted file mode 100644
index 22a36d6..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-filter-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-filter-api-5.0.0.jar
deleted file mode 100644
index 2165593..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-filter-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-filter-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-filter-impl-5.0.0.jar
deleted file mode 100644
index 58b0076..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-filter-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-filter-spring-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-filter-spring-5.0.0.jar
deleted file mode 100644
index 8eb3118..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-filter-spring-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-impl-5.0.0.jar
deleted file mode 100644
index 58b184f..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-resolver-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-resolver-api-5.0.0.jar
deleted file mode 100644
index 52a7d74..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-resolver-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-resolver-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-resolver-impl-5.0.0.jar
deleted file mode 100644
index c73807e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-resolver-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-resolver-spring-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-resolver-spring-5.0.0.jar
deleted file mode 100644
index 1d8a4e1..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-attribute-resolver-spring-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-metadata-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-metadata-api-5.0.0.jar
deleted file mode 100644
index 6737038..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-metadata-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-metadata-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-metadata-impl-5.0.0.jar
deleted file mode 100644
index af21162..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-metadata-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-metadata-spring-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-metadata-spring-5.0.0.jar
deleted file mode 100644
index b8cff51..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-metadata-spring-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-networking-9.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-networking-9.0.0.jar
deleted file mode 100644
index 1546f93..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-networking-9.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-networking-spring-9.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-networking-spring-9.0.0.jar
deleted file mode 100644
index 042fd83..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-networking-spring-9.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-profile-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-profile-api-5.0.0.jar
deleted file mode 100644
index f6a4d89..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-profile-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-profile-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-profile-impl-5.0.0.jar
deleted file mode 100644
index 8a2abbb..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-profile-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-saml-attribute-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-saml-attribute-api-5.0.0.jar
deleted file mode 100644
index 43cf985..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-saml-attribute-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-saml-attribute-impl-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-saml-attribute-impl-5.0.0.jar
deleted file mode 100644
index 0b65d0f..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-saml-attribute-impl-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-saml-profile-api-5.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-saml-profile-api-5.0.0.jar
deleted file mode 100644
index 6cf87cd..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-saml-profile-api-5.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-security-9.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-security-9.0.0.jar
deleted file mode 100644
index 039d3b2..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-security-9.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-security-spring-9.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-security-spring-9.0.0.jar
deleted file mode 100644
index 3a98139..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-security-spring-9.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-service-9.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-service-9.0.0.jar
deleted file mode 100644
index 607ecdc..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-service-9.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-spring-9.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-spring-9.0.0.jar
deleted file mode 100644
index 75f8899..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-spring-9.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-support-9.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-support-9.0.0.jar
deleted file mode 100644
index 083378e..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-support-9.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-velocity-9.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-velocity-9.0.0.jar
deleted file mode 100644
index 12fc8ee..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-velocity-9.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-velocity-spring-9.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-velocity-spring-9.0.0.jar
deleted file mode 100644
index 83f7e61..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/shib-velocity-spring-9.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/slf4j-api-2.0.7.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/slf4j-api-2.0.7.jar
deleted file mode 100644
index be5447c..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/slf4j-api-2.0.7.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-aop-6.0.11.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-aop-6.0.11.jar
deleted file mode 100644
index b85ac74..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-aop-6.0.11.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-beans-6.0.11.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-beans-6.0.11.jar
deleted file mode 100644
index 1d04717..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-beans-6.0.11.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-binding-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-binding-3.0.0.jar
deleted file mode 100644
index 30411bd..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-binding-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-context-6.0.11.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-context-6.0.11.jar
deleted file mode 100644
index 3cf20fd..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-context-6.0.11.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-core-6.0.11.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-core-6.0.11.jar
deleted file mode 100644
index aa98cb5..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-core-6.0.11.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-expression-6.0.11.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-expression-6.0.11.jar
deleted file mode 100644
index b7ec1ec..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-expression-6.0.11.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-jcl-6.0.11.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-jcl-6.0.11.jar
deleted file mode 100644
index 634f654..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-jcl-6.0.11.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-web-6.0.11.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-web-6.0.11.jar
deleted file mode 100644
index 45d0248..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-web-6.0.11.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-webflow-3.0.0.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-webflow-3.0.0.jar
deleted file mode 100644
index 749e092..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-webflow-3.0.0.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-webmvc-6.0.11.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-webmvc-6.0.11.jar
deleted file mode 100644
index 8dc88a0..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spring-webmvc-6.0.11.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spymemcached-2.12.3.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spymemcached-2.12.3.jar
deleted file mode 100644
index 5635944..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/spymemcached-2.12.3.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/velocity-engine-core-2.3.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/velocity-engine-core-2.3.jar
deleted file mode 100644
index 879a7b4..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/velocity-engine-core-2.3.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/xmlsec-3.0.2.jar b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/xmlsec-3.0.2.jar
deleted file mode 100644
index aca0482..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/lib/xmlsec-3.0.2.jar and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/spring.tld b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/spring.tld
deleted file mode 100644
index 33eeaf1..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/spring.tld
+++ /dev/null
@@ -1,467 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
-		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-		xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee https://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
-		version="2.0">
-
-	<description>Spring Framework JSP Tag Library</description>
-	<tlib-version>4.0</tlib-version>
-	<short-name>spring</short-name>
-	<uri>http://www.springframework.org/tags</uri>
-
-	<tag>
-		<description>Sets default HTML escape value for the current page.
-		Overrides a "defaultHtmlEscape" context-param in web.xml, if any.</description>
-		<name>htmlEscape</name>
-		<tag-class>org.springframework.web.servlet.tags.HtmlEscapeTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<description>Set the default value for HTML escaping, to be put
-			into the current PageContext.</description>
-			<name>defaultHtmlEscape</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>Escapes its enclosed body content, applying HTML escaping and/or JavaScript
-		escaping. The HTML escaping flag participates in a page-wide or application-wide setting
-		(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).</description>
-		<name>escapeBody</name>
-		<tag-class>org.springframework.web.servlet.tags.EscapeBodyTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<description>Set HTML escaping for this tag, as boolean value. Overrides the
-			default HTML escaping setting for the current page.</description>
-			<name>htmlEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set JavaScript escaping for this tag, as boolean value.
-			Default is 'false'.</description>
-			<name>javaScriptEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>Retrieves the message with the given code, or text if code isn't resolvable.
-		The HTML escaping flag participates in a page-wide or application-wide setting
-		(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).</description>
-		<name>message</name>
-		<tag-class>org.springframework.web.servlet.tags.MessageTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<description>A MessageSourceResolvable argument (direct or through JSP EL).
-			Fits nicely when used in conjunction with Spring's own validation error classes
-			which all implement the MessageSourceResolvable interface. For example, this
-			allows you to iterate over all of the errors in a form, passing each error
-			(using a runtime expression) as the value of this 'message' attribute, thus
-			effecting the easy display of such error messages.</description>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The code (key) to use when looking up the message.
-			If code is not provided, the text attribute will be used.</description>
-			<name>code</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set optional message arguments for this tag, as a (comma-)
-			delimited String (each String argument can contain JSP EL), an Object array
-			(used as argument array), or a single Object (used as single argument).
-			You can additionally use nested spring:argument tags.</description>
-			<name>arguments</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The separator character to be used for splitting the
-			arguments string value; defaults to a 'comma' (',').</description>
-			<name>argumentSeparator</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Default text to output when a message for the given code
-			could not be found. If both text and code are not set, the tag will
-			output null.</description>
-			<name>text</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The string to use when binding the result to the page,
-			request, session or application scope. If not specified, the result
-			gets outputted to the writer (i.e. typically directly to the JSP).</description>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The scope to use when exporting the result to a variable.
-			This attribute is only used when var is also set. Possible values are
-			page, request, session and application.</description>
-			<name>scope</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set HTML escaping for this tag, as boolean value.
-			Overrides the default HTML escaping setting for the current page.</description>
-			<name>htmlEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set JavaScript escaping for this tag, as boolean value.
-			Default is 'false'.</description>
-			<name>javaScriptEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>Retrieves the theme message with the given code, or text if code isn't
-		resolvable. The HTML escaping flag participates in a page-wide or application-wide setting
-		(i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml).</description>
-		<name>theme</name>
-		<tag-class>org.springframework.web.servlet.tags.ThemeTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<description>A MessageSourceResolvable argument (direct or through JSP EL).</description>
-			<name>message</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The code (key) to use when looking up the message.
-			If code is not provided, the text attribute will be used.</description>
-			<name>code</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set optional message arguments for this tag, as a (comma-)
-			delimited String (each String argument can contain JSP EL), an Object array
-			(used as argument array), or a single Object (used as single argument).
-			You can additionally use nested spring:argument tags.</description>
-			<name>arguments</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The separator character to be used for splitting the
-			arguments string value; defaults to a 'comma' (',').</description>
-			<name>argumentSeparator</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Default text to output when a message for the given code
-			could not be found. If both text and code are not set, the tag will
-			output null.</description>
-			<name>text</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The string to use when binding the result to the page,
-			request, session or application scope. If not specified, the result
-			gets outputted to the writer (i.e. typically directly to the JSP).</description>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The scope to use when exporting the result to a variable.
-			This attribute is only used when var is also set. Possible values are
-			page, request, session and application.</description>
-			<name>scope</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set HTML escaping for this tag, as boolean value.
-			Overrides the default HTML escaping setting for the current page.</description>
-			<name>htmlEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set JavaScript escaping for this tag, as boolean value.
-			Default is 'false'.</description>
-			<name>javaScriptEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>Argument tag based on the JSTL fmt:param tag. The purpose is to
-		support arguments inside the spring:message and spring:theme tags.</description>
-		<name>argument</name>
-		<tag-class>org.springframework.web.servlet.tags.ArgumentTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<description>The value of the argument.</description>
-			<name>value</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-			<type>java.lang.Object</type>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>Provides Errors instance in case of bind errors. The HTML escaping
-		flag participates in a page-wide or application-wide setting (i.e. by HtmlEscapeTag
-		or a "defaultHtmlEscape" context-param in web.xml).</description>
-		<name>hasBindErrors</name>
-		<tag-class>org.springframework.web.servlet.tags.BindErrorsTag</tag-class>
-		<body-content>JSP</body-content>
-		<variable>
-			<name-given>errors</name-given>
-			<variable-class>org.springframework.validation.Errors</variable-class>
-		</variable>
-		<attribute>
-			<description>The name of the bean in the request, that needs to be
-			inspected for errors. If errors are available for this bean, they
-			will be bound under the 'errors' key.</description>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set HTML escaping for this tag, as boolean value.
-			Overrides the default HTML escaping setting for the current page.</description>
-			<name>htmlEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>Sets a nested path to be used by the bind tag's path.</description>
-		<name>nestedPath</name>
-		<tag-class>org.springframework.web.servlet.tags.NestedPathTag</tag-class>
-		<body-content>JSP</body-content>
-		<variable>
-			<name-given>nestedPath</name-given>
-			<variable-class>java.lang.String</variable-class>
-		</variable>
-		<attribute>
-			<description>Set the path that this tag should apply. E.g. 'customer'
-			to allow bind paths like 'address.street' rather than
-			'customer.address.street'.</description>
-			<name>path</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>Provides BindStatus object for the given bind path. The HTML escaping
-		flag participates in a page-wide or application-wide setting (i.e. by HtmlEscapeTag
-		or a "defaultHtmlEscape" context-param in web.xml).</description>
-		<name>bind</name>
-		<tag-class>org.springframework.web.servlet.tags.BindTag</tag-class>
-		<body-content>JSP</body-content>
-		<variable>
-			<name-given>status</name-given>
-			<variable-class>org.springframework.web.servlet.support.BindStatus</variable-class>
-		</variable>
-		<attribute>
-			<description>The path to the bean or bean property to bind status
-			information for. For instance account.name, company.address.zipCode
-			or just employee. The status object will exported to the page scope,
-			specifically for this bean or bean property.</description>
-			<name>path</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set whether to ignore a nested path, if any.
-			Default is to not ignore.</description>
-			<name>ignoreNestedPath</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set HTML escaping for this tag, as boolean value. Overrides
-			the default HTML escaping setting for the current page.</description>
-			<name>htmlEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>Provides transformation of variables to Strings, using an appropriate
-		custom PropertyEditor from BindTag (can only be used inside BindTag). The HTML
-		escaping flag participates in a page-wide or application-wide setting (i.e. by
-		HtmlEscapeTag or a 'defaultHtmlEscape' context-param in web.xml).</description>
-		<name>transform</name>
-		<tag-class>org.springframework.web.servlet.tags.TransformTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<description>The value to transform. This is the actual object you want
-			to have transformed (for instance a Date). Using the PropertyEditor that
-			is currently in use by the 'spring:bind' tag.</description>
-			<name>value</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The string to use when binding the result to the page,
-			request, session or application scope. If not specified, the result gets
-			outputted to the writer (i.e. typically directly to the JSP).</description>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The scope to use when exported the result to a variable.
-			This attribute is only used when var is also set. Possible values are
-			page, request, session and application.</description>
-			<name>scope</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set HTML escaping for this tag, as boolean value. Overrides
-			the default HTML escaping setting for the current page.</description>
-			<name>htmlEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>URL tag based on the JSTL c:url tag. This variant is fully
-		backwards compatible with the standard tag. Enhancements include support
-		for URL template parameters.</description>
-		<name>url</name>
-		<tag-class>org.springframework.web.servlet.tags.UrlTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<description>The URL to build. This value can include template place holders
-			that are replaced with the URL encoded value of the named parameter. Parameters
-			must be defined using the param tag inside the body of this tag.</description>
-			<name>value</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Specifies a remote application context path. The default is the
-			current application context path.</description>
-			<name>context</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The name of the variable to export the URL value to.</description>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The scope for the var. 'application', 'session', 'request' and
-			'page' scopes are supported. Defaults to page scope. This attribute has no
-			effect unless the var attribute is also defined.</description>
-			<name>scope</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set HTML escaping for this tag, as a boolean value. Overrides the
-			default HTML escaping setting for the current page.</description>
-			<name>htmlEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set JavaScript escaping for this tag, as a boolean value.
-			Default is 'false'.</description>
-			<name>javaScriptEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>Parameter tag based on the JSTL c:param tag. The sole purpose is to
-		support params inside the spring:url tag.</description>
-		<name>param</name>
-		<tag-class>org.springframework.web.servlet.tags.ParamTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<description>The name of the parameter.</description>
-			<name>name</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The value of the parameter.</description>
-			<name>value</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-	<tag>
-		<description>Evaluates a Spring expression (SpEL) and either prints the result
-		or assigns it to a variable.</description>
-		<name>eval</name>
-		<tag-class>org.springframework.web.servlet.tags.EvalTag</tag-class>
-		<body-content>JSP</body-content>
-		<attribute>
-			<description>The expression to evaluate.</description>
-			<name>expression</name>
-			<required>true</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The name of the variable to export the evaluation result to.</description>
-			<name>var</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>The scope for the var. 'application', 'session', 'request' and
-			'page' scopes are supported. Defaults to page scope. This attribute has no
-			effect unless the var attribute is also defined.</description>
-			<name>scope</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set HTML escaping for this tag, as a boolean value. Overrides the
-			default HTML escaping setting for the current page.</description>
-			<name>htmlEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-		<attribute>
-			<description>Set JavaScript escaping for this tag, as a boolean value.
-			Default is 'false'.</description>
-			<name>javaScriptEscape</name>
-			<required>false</required>
-			<rtexprvalue>true</rtexprvalue>
-		</attribute>
-	</tag>
-
-    <function>
-        <description>Helps to prepare a URL to a Spring MVC controller method.</description>
-        <name>mvcUrl</name>
-        <function-class>org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder</function-class>
-        <function-signature>org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.MethodArgumentBuilder fromMappingName(java.lang.String)</function-signature>
-    </function>
-
-</taglib>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/web.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/web.xml
deleted file mode 100644
index 13335b2..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/WEB-INF/web.xml
+++ /dev/null
@@ -1,150 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
- 
-    <display-name>Shibboleth Identity Provider</display-name>
-
-    <!--
-    The context parameters below control V5+ auto-registration support.
-    Those desiring complete control over all of these steps can disable them
-    but this is not generally recommended, apart from toggling the optional
-    servlets that may not be needed.
-    -->
-
-    <!-- Registers Spring support. -->
-    <context-param>
-        <param-name>net.shibboleth.idp.registerSpringConfig</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <!-- Auto-registers Java filter chain required by IdP. -->
-    <context-param>
-        <param-name>net.shibboleth.idp.registerFilterChain</param-name>
-        <param-value>true</param-value>
-    </context-param>
-
-    <!-- Auto-registers IdP dispatcher servlet. -->
-    <context-param>
-        <param-name>net.shibboleth.idp.registerIdPServlet</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    
-    <!-- Registers optional servlets used for RemoteUser and X509 login flows. -->
-    <context-param>
-        <param-name>net.shibboleth.idp.registerRemoteUserServlet</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    <context-param>
-        <param-name>net.shibboleth.idp.registerX509Servlet</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    
-    <!-- Registers /shibboleth to return metadata file. -->
-    <context-param>
-        <param-name>net.shibboleth.idp.registerMetadataServlet</param-name>
-        <param-value>true</param-value>
-    </context-param>
-    
-    <!-- Send servlet errors through the IdP's MVC error handling. -->
-    <error-page>
-        <exception-type>net.shibboleth.idp.authn.ExternalAuthenticationException</exception-type>
-        <location>/profile/RaiseError</location>
-    </error-page>
-
-    <session-config>
-        <session-timeout>15</session-timeout>
-        <cookie-config>
-            <!-- Comment name and path to revert __Host- protection. -->
-            <name>__Host-JSESSIONID</name>
-            <path>/</path>
-            <secure>true</secure>
-            <http-only>true</http-only>
-        </cookie-config>
-        <tracking-mode>COOKIE</tracking-mode>
-    </session-config>
-
-    <!-- Allow intended methods by using an absent auth-constraint. -->
-    <security-constraint>
-        <web-resource-collection>
-            <web-resource-name>Non-API Content</web-resource-name>
-            <url-pattern>/*</url-pattern>
-            <http-method>GET</http-method>
-            <http-method>HEAD</http-method>
-            <http-method>OPTIONS</http-method>
-            <http-method>POST</http-method>
-        </web-resource-collection>
-        <!-- no auth-constraint tag here -->
-    </security-constraint>
-
-    <!-- Disallow other methods by using an empty auth-constraint. -->
-    <security-constraint>
-        <web-resource-collection>
-            <web-resource-name>Non-API Content</web-resource-name>
-            <url-pattern>/*</url-pattern>
-            <http-method-omission>GET</http-method-omission>
-            <http-method-omission>HEAD</http-method-omission>
-            <http-method-omission>OPTIONS</http-method-omission>
-            <http-method-omission>POST</http-method-omission>
-        </web-resource-collection>
-        <auth-constraint/>
-    </security-constraint>
-
-    <!-- Allow any HTTP methods to the API flows. -->
-    <security-constraint>
-        <web-resource-collection>
-            <web-resource-name>Administrative APIs</web-resource-name>
-            <url-pattern>/profile/admin/*</url-pattern>
-        </web-resource-collection>
-        <!-- no auth-constraint tag here -->
-    </security-constraint>
-
-    <!--
-    Uncomment to use container managed authentication. The new servlet spec (3.1)
-    supports "**" as a wildcard syntax to avoid role usage, which is normally desirable.
-    Older containers usually support "*" when proprietary options are used (e.g., Jetty
-    requires setting the Strict property on the SecurityManager.)
-    -->
-    <!--
-    <security-constraint>
-        <display-name>Web Login Service</display-name>
-        <web-resource-collection>
-            <web-resource-name>user authentication</web-resource-name>
-            <url-pattern>/Authn/RemoteUser</url-pattern>
-            <url-pattern>/profile/SAML2/SOAP/ECP</url-pattern>
-            <http-method>POST</http-method> 
-        </web-resource-collection>
-        <auth-constraint>
-            <role-name>**</role-name>
-        </auth-constraint>
-        <user-data-constraint>
-            <transport-guarantee>CONFIDENTIAL</transport-guarantee> 
-        </user-data-constraint>
-    </security-constraint>
-    -->
-
-    <!-- Uncomment if you want BASIC auth managed by the container. -->
-    <!--
-    <login-config>
-        <auth-method>BASIC</auth-method>
-        <realm-name>Web Login Service</realm-name>
-    </login-config>
-    -->
-     
-    <!--
-    Uncomment if you want form-based auth managed by the container.
-    NOTE that the default form-login UI in the IdP is not compatible
-    with this option, and you will need to supply your own JSP form
-    and error page. This is not a recommended approach and is severely
-    limited in functionality as compared to using the IdP's own UI.
-    -->
-    <!--
-    <login-config>
-        <auth-method>FORM</auth-method>
-        <realm-name>Web Login Service</realm-name>
-        <form-login-config> 
-            <form-login-page>/login.jsp</form-login-page>
-            <form-error-page>/login-error.jsp</form-error-page>
-        </form-login-config>
-    </login-config>
-    -->
-</web-app>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/css/logout.css b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/css/logout.css
deleted file mode 100644
index 5cd06c1..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/css/logout.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Success/Failure indicators for logout propagation. */
-ol li:before {
-    content: ''
-}
-li.logout {
-    line-height: 36px;
-    padding-left: 36px;
-}
-li.logout.success {
-    background: url(../images/success-32x32.png) no-repeat left center;
-}
-li.logout.failure {
-    background: url(../images/failure-32x32.png) no-repeat left center;
-}
-li.logout.pending{
-
-}
-li.logout.na {
-    background: url(../images/failure-32x32.png) no-repeat left center;
-}
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/css/placeholder.css b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/css/placeholder.css
deleted file mode 100644
index c1dbe1c..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/css/placeholder.css
+++ /dev/null
@@ -1,802 +0,0 @@
-/* Colours pallet
-
-To change the colours, use find and replace with the values below:
-
- #ECEFF1 - Body background, header / section border, read only / disabled input fields.
-
- #1534E3 - Links, buttons, list items, selected radio, selected checkbox.
-
- #1A237E - Hover buttons.
-
- #32424A - Body text, input fields border.
- 
- #7A2D00 - Output message.
- 
- #B50024 - Error messages / fields.
- 
- #1C7D40 - Success messages / fields.
- 
- #999999 - read only / disabled input fields.
-
-*/
-
-html, html * {
-  margin: 0;
-  padding: 0;
-  border: 0;
-  font-size: 100%;
-  font: inherit;
-  vertical-align: baseline;
-  box-sizing: border-box;
-  background: none;
-  background-repeat: no-repeat;
-  background-position: left top;
-  border: 0;
-  outline: 0;
-}
-
-html {
-  height: 100%;
-}
-
-/* HTML5 display-role reset for older browsers */
-article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, main {
-  display: block;
-}
-
-/* Default document styles - fonts, font sizes, text colours, font weight */
-body {
-  font-family: Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;
-  font-size: 16px;
-  font-size: 1rem;
-  line-height: 24px;
-  line-height: 1.5rem;
-  color: #32424a;
-  font-weight: 400;
-  max-width: 3000px;
-  margin: 0 auto;
-  background-color: #eceff1;
-  padding: 24px;
-}
-
-/* Links */
-a[href] {
-  text-decoration: none;
-  color: #1534e3;
-}
-
-/* Link hover states */
-a[href]:hover, a[href]:active, a[href]:focus {
-  text-decoration: underline;
-  color: #1534e3;
-}
-
-/* Heading styles */
-h1 {
-  font-size: 24px;
-  font-size: 1.5rem;
-  line-height: 28px;
-  line-height: 1.75rem;
-  font-weight: 700;
-}
-
-h2 {
-  font-size: 20px;
-  font-size: 1.25rem;
-  line-height: 25px;
-  line-height: 1.5rem;
-  font-weight: 400;
-}
-
-h3 {
-  font-size: 16px;
-  font-size: 1rem;
-  line-height: 22px;
-  line-height: 1.375rem;
-  font-weight: 700;
-}
-
-h4 {
-  font-size: 14px;
-  font-size: 0.875rem;
-  line-height: 18px;
-  line-height: 1.125rem;
-  font-weight: 700;
-  margin-bottom: 0.5em;
-}
-
-h5 {
-  font-size: 14px;
-  font-size: 0.875rem;
-  line-height: 18px;
-  line-height: 1.125rem;
-  font-weight: 400;
-}
-
-h1, h2, h3, h4, h5, h6, p {
-  margin-bottom: 1em;
-}
-
-h1:last-child, h2:last-child, h3:last-child, h4:last-child, h5:last-child, h6:last-child, p:last-child {
-  margin-bottom: 0px;
-}
-
-/* List styles */
-ol, ul {
-  list-style: none;
-  margin: 20px 0;
-}
-
-ol:before, ol:after,
-ul:before, ul:after {
-  content: " ";
-  display: table;
-}
-
-ol:after,
-ul:after {
-  clear: both;
-}
-
-ol:last-child,
-ul:last-child {
-  margin-bottom: 0px;
-}
-
-ol:first-child,
-ul:first-child {
-  margin-top: 0px;
-}
-
-ul li {
-  padding-left: 22px;
-  margin-bottom: 4px;
-  position: relative;
-  list-style: none;
-}
-
-ul li:last-child {
-  margin-bottom: 0px;
-}
-
-ul li:before {
-  content: '';
-  -webkit-border-radius: 2px;
-  -ms-border-radius: 2px;
-  -moz-border-radius: 2px;
-  -o-border-radius: 2px;
-  border-radius: 2px;
-  background-color: #1534e3;
-  height: 7px;
-  width: 7px;
-  display: block;
-  position: absolute;
-  left: 0;
-  top: 7px;
-}
-
-ol {
-  counter-reset: item;
-}
-
-ol li {
-  padding-left: 22px;
-  margin-bottom: 10px;
-  position: relative;
-  list-style: none;
-}
-
-ol li:last-child {
-  margin-bottom: 0px;
-}
-
-ol li:before {
-  color: #1534e3;
-  position: absolute;
-  left: 0;
-  content: counter(item) ". ";
-  counter-increment: item;
-  font-weight: 700;
-  top: 1px;
-}
-
-ol li:nth-child(n+10) {
-  padding-left: 30px;
-}
-
-ol li:nth-child(n+100) {
-  padding-left: 38px;
-}
-
-hr {
-  width: 100%;
-  clear: both;
-  border: 0;
-  outline: 0;
-  background-color: #eceff1;
-  height: 1px;
-  display: block;
-  margin: 30px 0;
-}
-
-b, strong {
-  font-weight: 700;
-}
-
-i, em {
-  font-style: italic;
-}
-
-small {
-  font-size: 0.8em;
-}
-
-big {
-  font-size: 1.2em;
-}
-
-.cc {
-  clear: both;
-  margin: 0 auto;
-  width: 100%;
-  max-width: 649px;
-  padding: 0 0;
-}
-
-.cc:before, .cc:after {
-  content: " ";
-  display: table;
-}
-
-.cc:after {
-  clear: both;
-}
-
-img {
-  max-width: 100%;
-  height: auto;
-}
-
-/* Main content area */
-main {
-  clear: both;
-  margin: 0 auto;
-  width: 100%;
-  max-width: 800px;
-  background-color: #fff;
-  -webkit-border-radius: 8px;
-  -ms-border-radius: 8px;
-  -moz-border-radius: 8px;
-  -o-border-radius: 8px;
-  border-radius: 8px;
-  -webkit-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -ms-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -moz-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -o-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-}
-
-/* Add a border top when 2 sections are together */
-main section + section {
-  border-top: 1px solid #eceff1;
-}
-
-/* Header */
-header {
-  display: block; /* Change to display: none to hide */
-  border-bottom: 1px solid #eceff1;
-  text-align: center;
-  padding: 6% 8%;
-}
-
-header .main-logo {
-  display: block;
-  margin: 0 auto;
-}
-
-.service-logo {
-	display: block;
-	margin: 24px 0;
-}
-
-section {
-  padding: 4% 8% 4% 8%;
-}
-
-/* Output Messages */
-.output-message {
-  font-size: 14px;
-  font-size: 0.875rem;
-  line-height: 18px;
-  line-height: 1.125rem;
-  font-style: italic;
-  -webkit-border-radius: 4px;
-  -ms-border-radius: 4px;
-  -moz-border-radius: 4px;
-  -o-border-radius: 4px;
-  border-radius: 4px;
-  background-color: #FFD8C2;
-  display: block;
-  padding: 4%;
-  margin-bottom: 20px;
-  color: #7A2D00;
-}
-
-.output-message:last-child {
-  margin-bottom: 0px;
-}
-
-/* Output Message Success */
-.output-message.output--success {
-  background-color: #DCF9E7;
-  color: #1C7D40;
-}
-
-/* Output Message Error */
-.output-message.output--error {
-  background-color: #FFF0F3;
-  color: #B50024;
-}
-
-.boxed {
-  -webkit-border-radius: 4px;
-  -ms-border-radius: 4px;
-  -moz-border-radius: 4px;
-  -o-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -ms-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -moz-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -o-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  background-color: #fff;
-  padding: 6%;
-  margin: 30px 0;
-}
-
-.boxed:last-child {
-  margin-bottom: 0px;
-}
-
-.boxed:first-child {
-  margin-top: 0px;
-}
-
-/* Footer style */
-footer {
-  z-index: 1;
-  position: relative;
-  text-align: center;
-  margin-top: 20px;
-  font-size: 12px;
-  font-size: 0.75rem;
-  line-height: 16px;
-  line-height: 1rem;
-}
-
-/* Forms styles */
-fieldset {
-  display: block;
-  margin-bottom: 20px;
-}
-
-fieldset:last-child {
-  margin-bottom: 0px;
-}
-
-fieldset .field-validation {
-  display: block;
-  margin-top: 10px;
-}
-
-fieldset .error {
-  color: #B50024;
-}
-
-fieldset legend span {
-  display: block;
-  text-indent: 100%;
-  white-space: nowrap;
-  overflow: hidden;
-  height: 0;
-}
-
-/* Form labels */
-label {
-  vertical-align: top;
-  font-size: 14px;
-  font-size: 0.875rem;
-  line-height: 18px;
-  line-height: 1.125rem;
-  font-weight: 700;
-  display: block;
-  color: #32424a;
-  margin-bottom: 6px;
-}
-
-label:focus {
-  color: #1534E3;
-}
-
-/* Form input fields */
-input[type="text"], 
-input[type="email"], 
-input[type="password"], 
-input[type="telephone"], 
-input[type="tel"], 
-input[type="url"], 
-textarea, 
-select {
-  background-color: #fff;
-  border: 2px solid #32424a;
-  -webkit-transition: all 0.3s ease-in-out;
-  -moz-transition: all 0.3s ease-in-out;
-  -ms-transition: all 0.3s ease-in-out;
-  -o-transition: all 0.3s ease-in-out;
-  transition: all 0.3s ease-in-out;
-  color: #32424a;
-  padding: 13px 20px;
-  display: block;
-  width: 100%;
-  -webkit-appearance: none;
-  -ms-appearance: none;
-  -moz-appearance: none;
-  -o-appearance: none;
-  appearance: none;
-  -webkit-border-radius: 4px;
-  -ms-border-radius: 4px;
-  -moz-border-radius: 4px;
-  -o-border-radius: 4px;
-  border-radius: 4px;
-}
-
-/* Form input focus */
-input[type="text"]:focus, 
-input[type="email"]:focus, 
-input[type="password"]:focus, 
-input[type="telephone"]:focus, 
-input[type="tel"]:focus, 
-input[type="url"]:focus, 
-textarea:focus, 
-select:focus,
-input[type="text"]:active, 
-input[type="email"]:active, 
-input[type="password"]:active, 
-input[type="telephone"]:active, 
-input[type="tel"]:active, 
-input[type="url"]:active, 
-textarea:active, 
-select:active {
-  border-color: #1534e3;
-  background-color: #fff;
-}
-
-/* Form input errors */
-input[type="text"].error, 
-input[type="email"].error, 
-input[type="password"].error, 
-input[type="telephone"].error, 
-input[type="tel"].error, 
-input[type="url"].error, 
-textarea.error, 
-select.error {
-  border-color: #B50024;
-}
-
-/* Form input read only / disabled */
-input[type="text"]:read-only, 
-input[type="email"]:read-only, 
-input[type="password"]:read-only, 
-input[type="telephone"]:read-only,
-input[type="tel"]:read-only, 
-input[type="url"]:read-only, 
-textarea:read-only, 
-select:read-only, 
-input[type="text"]:disabled, 
-input[type="email"]:disabled, 
-input[type="password"]:disabled, 
-input[type="telephone"]:disabled, 
-input[type="tel"]:disabled, 
-input[type="url"]:disabled, 
-textarea:disabled, 
-select:disabled {
-  background-color: #ECEFF1;
-  pointer-events: none;
-}
-
-/* Text areas */
-textarea {
-  height: 124px;
-  resize: none;
-}
-
-
-/* Dropdowns */
-select {
-  -webkit-appearance: auto;
-  -ms-appearance: auto;
-  -moz-appearance: auto;
-  -o-appearance: auto;
-  appearance: auto;
-}
-
-select:read-only {
-  background-color: #fff;
-  pointer-events: unset;
-}
-
-select::-ms-expand {
-  display: none;
-}
-
-/* Checkboxes / Radio buttons */
-input[type="checkbox"], input[type="radio"] {
-  position : absolute;
-  opacity: 0;
-  height: 0;
-  width: 0;
-}
-
-input[type="checkbox"] + label, input[type="radio"] + label {
-  display: block;
-  font-weight: 400;
-  font-size: 16px;
-  font-size: 1rem;
-  line-height: 24px;
-  line-height: 1.5rem;
-  cursor: pointer;
-  position: relative;
-  padding-left: 30px;
-  padding-top: 3px;
-  margin-bottom: 4px;
-  margin-right: 12px;
-  display: inline-block;
-}
-
-input[type="checkbox"] + label:before, input[type="radio"] + label:before {
-  content: "";
-  position: absolute;
-  top: 2px;
-  left: 0;
-  height: 20px;
-  width: 20px;
-  background-color: #fff;
-  border: 2px solid #32424a;
-  -webkit-transition: all 0.2s ease-out;
-  -ms-transition: all 0.2s ease-out;
-  -moz-transition: all 0.2s ease-out;
-  -o-transition: all 0.2s ease-out;
-  transition: all 0.2s ease-out;
-}
-
-input[type="checkbox"] + label:after, input[type="radio"] + label:after {
-  content: "";
-  position: absolute;
-  -webkit-transform: rotate(45deg);
-  -ms-transform: rotate(45deg);
-  -moz-transform: rotate(45deg);
-  -o-transform: rotate(45deg);
-  transform: rotate(45deg);
-  display: none;
-}
-
-input[type="checkbox"]:checked + label, input[type="radio"]:checked + label,
-input[type="checkbox"]:focus + label, input[type="radio"]:focus + label {
-  color: #1534e3;
-}
-
-input[type="checkbox"]:checked + label:before, input[type="radio"]:checked + label:before,
-input[type="checkbox"]:focus + label:before, input[type="radio"]:focus + label:before {
-  border-color: #1534e3;
-}
-
-input[type="checkbox"]:checked + label:after, input[type="radio"]:checked + label:after {
-  display: block;
-}
-
-input[type="checkbox"] + label:before {
-  -webkit-border-radius: 4px;
-  -ms-border-radius: 4px;
-  -moz-border-radius: 4px;
-  -o-border-radius: 4px;
-  border-radius: 4px;
-}
-
-input[type="checkbox"] + label:after {
-  left: 8px;
-  top: 5px;
-  width: 4px;
-  height: 10px;
-  border: solid #1534e3;
-  border-width: 0 4px 4px 0;
-}
-
-input[type="radio"] + label:before {
-  -webkit-border-radius: 100%;
-  -ms-border-radius: 100%;
-  -moz-border-radius: 100%;
-  -o-border-radius: 100%;
-  border-radius: 100%;
-}
-
-input[type="radio"] + label:after {
-  background-color: #1534e3;
-  height: 12px;
-  width: 12px;
-  -webkit-border-radius: 100%;
-  -ms-border-radius: 100%;
-  -moz-border-radius: 100%;
-  -o-border-radius: 100%;
-  border-radius: 100%;
-  left: 6px;
-  top: 8px;
-}
-
-/* Buttons / Submit buttons */
-button, input[type=button], 
-input[type=submit], 
-a.button, 
-.button {
-  display: inline-block;
-  text-align: center;
-  background-color: #1534e3;
-  border: 4px solid #1534e3;
-  font-weight: 700;
-  padding: 11px 74px;
-  cursor: pointer;
-  color: #fff;
-  -webkit-appearance: none;
-  -ms-appearance: none;
-  -moz-appearance: none;
-  -o-appearance: none;
-  appearance: none;
-  -webkit-border-radius: 4px;
-  -ms-border-radius: 4px;
-  -moz-border-radius: 4px;
-  -o-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-transition: all 0.2s ease-out;
-  -ms-transition: all 0.2s ease-out;
-  -moz-transition: all 0.2s ease-out;
-  -o-transition: all 0.2s ease-out;
-  transition: all 0.2s ease-out;
-}
-
-/* Button hover & focus states */
-button:hover, 
-input[type=button]:hover, 
-input[type=submit]:hover, 
-a.button:hover, 
-.button:hover, 
-button:focus, 
-input[type=button]:focus, 
-input[type=submit]:focus, 
-a.button:focus, 
-.button:focus {
-  background: #1a237e;
-  color: #fff !important;
-  text-decoration: none !important;
-  border-color: #1a237e;
-}
-
-/* Secondary button styles */
-button.button--secondary, 
-input[type=button].button--secondary, 
-input[type=submit].button--secondary, 
-a.button.button--secondary, 
-.button.button--secondary {
-  background-color: transparent;
-  border-color: #1534e3;
-  color: #1534e3;
-}
-
-/* Secondary button hover & focus states */
-button.button--secondary:hover, 
-input[type=button].button--secondary:hover, 
-input[type=submit].button--secondary:hover, 
-a.button.button--secondary:hover, 
-.button.button--secondary:hover,
-button.button--secondary:focus, 
-input[type=button].button--secondary:focus, 
-input[type=submit].button--secondary:focus, 
-a.button.button--secondary:focus, 
-.button.button--secondary:focus {
-  background: #1a237e;
-  border-color: #1a237e;
-}
-
-/* Secondary button disabled states */
-button.button--secondary:disabled, 
-input[type=button].button--secondary:disabled, 
-input[type=submit].button--secondary:disabled, 
-a.button.button--secondary:disabled, 
-.button.button--secondary:disabled {
-  background-color: transparent;
-  color: #999999;
-}
-
-/* Full width buttons */
-button.button--full, 
-input[type=button].button--full, 
-input[type=submit].button--full, 
-a.button.button--full, 
-.button.button--full {
-  width: 100%;
-  padding-left: 30px;
-  padding-right: 30px;
-}
-
-/* Button disabled states */
-button:disabled, 
-input[type=button]:disabled, 
-input[type=submit]:disabled, 
-a.button:disabled, 
-.button:disabled {
-  pointer-events: none;
-  background-color: #999999;
-  border-color: #999999;
-}
-
-/* Placeholder styles */
-::-webkit-input-placeholder {
-  color: #a9b0b4;
-}
-
-:-moz-placeholder {
-  color: #a9b0b4;
-}
-
-::-moz-placeholder {
-  color: #a9b0b4;
-}
-
-:-ms-input-placeholder {
-  color: #a9b0b4;
-}
-
-.grid {
-  margin-top: 12px;
-}
-
-/* Grid (used for 2 columns) */
-.grid:before, .grid:after {
-  content: " ";
-  display: table;
-}
-
-.grid:after {
-  clear: both;
-}
-
-.grid > .grid-item {
-  margin-bottom: 18px;
-  min-height: 1px;
-  width: 100%;
-}
-
-.grid:last-child > .item:last-child {
-  margin-bottom: 0px;
-}
-
-@media screen and (min-width: 760px) {
-	
-  .grid.md-2 > .grid-item {
-    float: left;
-    width: 48.34436%;
-    margin-right: 3.31126%;
-  }
-  
-  .grid.md-2 > .grid-item:nth-child(n), .grid.md-2 > .grid-item:nth-of-type(n) {
-    margin-right: 3.31126%;
-    clear: none;
-  }
-  
-  .grid.md-2 > .grid-item:nth-child(2n) {
-    margin-right: 0;
-  }
-  
-  .grid.md-2 > .grid-item:nth-child(2n+1) {
-    clear: both;
-  }
-  
-}
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/images/failure-32x32.png b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/images/failure-32x32.png
deleted file mode 100644
index 3c48e46..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/images/failure-32x32.png and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/images/placeholder-logo.png b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/images/placeholder-logo.png
deleted file mode 100644
index f5807ed..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/images/placeholder-logo.png and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/images/success-32x32.png b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/images/success-32x32.png
deleted file mode 100644
index aa51204..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/images/success-32x32.png and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/index.jsp b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/index.jsp
deleted file mode 100644
index 087cee2..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/index.jsp
+++ /dev/null
@@ -1,31 +0,0 @@
-<%@ page pageEncoding="UTF-8" %>
-<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
-<!DOCTYPE html>
-<html>
-  <head>
-    <meta charset="utf-8">
-    <title><spring:message code="root.title" text="Shibboleth IdP" /></title>
-    <link rel="stylesheet" type="text/css" href="<%= request.getContextPath()%><spring:message code="root.css" text="/css/placeholder.css" />">
-  </head>
-
-  <body>
-    <div class="wrapper">
-      <div class="container">
-        <header>
-          <img src="<%= request.getContextPath() %><spring:message code="idp.logo" />" alt="<spring:message code="idp.logo.alt-text" text="logo" />">
-        </header>
-    
-        <div class="content">
-          <h2><spring:message code="root.message" text="No services are available at this location." /></h2>
-        </div>
-      </div>
-
-      <footer>
-        <div class="container container-footer">
-          <p class="footer-text"><spring:message code="root.footer" text="Insert your footer text here." /></p>
-        </div>
-      </footer>
-    </div>
-
-  </body>
-</html>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/js/jquery-3.6.0.min.js b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/js/jquery-3.6.0.min.js
deleted file mode 100644
index c4c6022..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/dist/webapp/js/jquery-3.6.0.min.js
+++ /dev/null
@@ -1,2 +0,0 @@
-/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */
-!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0<t&&t-1 in e)}S.fn=S.prototype={jquery:f,constructor:S,length:0,toArray:function(){return s.call(this)},get:function(e){return null==e?s.call(this):e<0?this[e+this.length]:this[e]},pushStack:function(e){var t=S.merge(this.constructor(),e);return t.prevObject=this,t},each:function(e){return S.each(this,e)},map:function(n){return this.pushStack(S.map(this,function(e,t){return n.call(e,t,e)}))},slice:function(){return this.pushStack(s.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},even:function(){return this.pushStack(S.grep(this,function(e,t){return(t+1)%2}))},odd:function(){return this.pushStack(S.grep(this,function(e,t){return t%2}))},eq:function(e){var t=this.length,n=+e+(e<0?t:0);return this.pushStack(0<=n&&n<t?[this[n]]:[])},end:function(){return this.prevObject||this.constructor()},push:u,sort:t.sort,splice:t.splice},S.extend=S.fn.extend=function(){var e,t,n,r,i,o,a=arguments[0]||{},s=1,u=arguments.length,l=!1;for("boolean"==typeof a&&(l=a,a=arguments[s]||{},s++),"object"==typeof a||m(a)||(a={}),s===u&&(a=this,s--);s<u;s++)if(null!=(e=arguments[s]))for(t in e)r=e[t],"__proto__"!==t&&a!==r&&(l&&r&&(S.isPlainObject(r)||(i=Array.isArray(r)))?(n=a[t],o=i&&!Array.isArray(n)?[]:i||S.isPlainObject(n)?n:{},i=!1,a[t]=S.extend(l,o,r)):void 0!==r&&(a[t]=r));return a},S.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),isReady:!0,error:function(e){throw new Error(e)},noop:function(){},isPlainObject:function(e){var t,n;return!(!e||"[object Object]"!==o.call(e))&&(!(t=r(e))||"function"==typeof(n=v.call(t,"constructor")&&t.constructor)&&a.call(n)===l)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},globalEval:function(e,t,n){b(e,{nonce:t&&t.nonce},n)},each:function(e,t){var n,r=0;if(p(e)){for(n=e.length;r<n;r++)if(!1===t.call(e[r],r,e[r]))break}else for(r in e)if(!1===t.call(e[r],r,e[r]))break;return e},makeArray:function(e,t){var n=t||[];return null!=e&&(p(Object(e))?S.merge(n,"string"==typeof e?[e]:e):u.call(n,e)),n},inArray:function(e,t,n){return null==t?-1:i.call(t,e,n)},merge:function(e,t){for(var n=+t.length,r=0,i=e.length;r<n;r++)e[i++]=t[r];return e.length=i,e},grep:function(e,t,n){for(var r=[],i=0,o=e.length,a=!n;i<o;i++)!t(e[i],i)!==a&&r.push(e[i]);return r},map:function(e,t,n){var r,i,o=0,a=[];if(p(e))for(r=e.length;o<r;o++)null!=(i=t(e[o],o,n))&&a.push(i);else for(o in e)null!=(i=t(e[o],o,n))&&a.push(i);return g(a)},guid:1,support:y}),"function"==typeof Symbol&&(S.fn[Symbol.iterator]=t[Symbol.iterator]),S.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(e,t){n["[object "+t+"]"]=t.toLowerCase()});var d=function(n){var e,d,b,o,i,h,f,g,w,u,l,T,C,a,E,v,s,c,y,S="sizzle"+1*new Date,p=n.document,k=0,r=0,m=ue(),x=ue(),A=ue(),N=ue(),j=function(e,t){return e===t&&(l=!0),0},D={}.hasOwnProperty,t=[],q=t.pop,L=t.push,H=t.push,O=t.slice,P=function(e,t){for(var n=0,r=e.length;n<r;n++)if(e[n]===t)return n;return-1},R="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",I="(?:\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+",W="\\["+M+"*("+I+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+I+"))|)"+M+"*\\]",F=":("+I+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+W+")*)|.*)\\)|)",B=new RegExp(M+"+","g"),$=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),_=new RegExp("^"+M+"*,"+M+"*"),z=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="<a id='"+S+"'></a><select id='"+S+"-\r\\' msallowcapture=''><option selected=''></option></select>",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0<se(t,C,null,[e]).length},se.contains=function(e,t){return(e.ownerDocument||e)!=C&&T(e),y(e,t)},se.attr=function(e,t){(e.ownerDocument||e)!=C&&T(e);var n=b.attrHandle[t.toLowerCase()],r=n&&D.call(b.attrHandle,t.toLowerCase())?n(e,t,!E):void 0;return void 0!==r?r:d.attributes||!E?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},se.escape=function(e){return(e+"").replace(re,ie)},se.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},se.uniqueSort=function(e){var t,n=[],r=0,i=0;if(l=!d.detectDuplicates,u=!d.sortStable&&e.slice(0),e.sort(j),l){while(t=e[i++])t===e[i]&&(r=n.push(i));while(r--)e.splice(n[r],1)}return u=null,e},o=se.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else while(t=e[r++])n+=o(t);return n},(b=se.selectors={cacheLength:50,createPseudo:le,match:G,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1<t.indexOf(i):"$="===r?i&&t.slice(-i.length)===i:"~="===r?-1<(" "+t.replace(B," ")+" ").indexOf(i):"|="===r&&(t===i||t.slice(0,i.length+1)===i+"-"))}},CHILD:function(h,e,t,g,v){var y="nth"!==h.slice(0,3),m="last"!==h.slice(-4),x="of-type"===e;return 1===g&&0===v?function(e){return!!e.parentNode}:function(e,t,n){var r,i,o,a,s,u,l=y!==m?"nextSibling":"previousSibling",c=e.parentNode,f=x&&e.nodeName.toLowerCase(),p=!n&&!x,d=!1;if(c){if(y){while(l){a=e;while(a=a[l])if(x?a.nodeName.toLowerCase()===f:1===a.nodeType)return!1;u=l="only"===h&&!u&&"nextSibling"}return!0}if(u=[m?c.firstChild:c.lastChild],m&&p){d=(s=(r=(i=(o=(a=c)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1])&&r[2],a=s&&c.childNodes[s];while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if(1===a.nodeType&&++d&&a===e){i[h]=[k,s,d];break}}else if(p&&(d=s=(r=(i=(o=(a=e)[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]||[])[0]===k&&r[1]),!1===d)while(a=++s&&a&&a[l]||(d=s=0)||u.pop())if((x?a.nodeName.toLowerCase()===f:1===a.nodeType)&&++d&&(p&&((i=(o=a[S]||(a[S]={}))[a.uniqueID]||(o[a.uniqueID]={}))[h]=[k,d]),a===e))break;return(d-=v)===g||d%g==0&&0<=d/g}}},PSEUDO:function(e,o){var t,a=b.pseudos[e]||b.setFilters[e.toLowerCase()]||se.error("unsupported pseudo: "+e);return a[S]?a(o):1<a.length?(t=[e,e,"",o],b.setFilters.hasOwnProperty(e.toLowerCase())?le(function(e,t){var n,r=a(e,o),i=r.length;while(i--)e[n=P(e,r[i])]=!(t[n]=r[i])}):function(e){return a(e,0,t)}):a}},pseudos:{not:le(function(e){var r=[],i=[],s=f(e.replace($,"$1"));return s[S]?le(function(e,t,n,r){var i,o=s(e,null,r,[]),a=e.length;while(a--)(i=o[a])&&(e[a]=!(t[a]=i))}):function(e,t,n){return r[0]=e,s(r,null,n,i),r[0]=null,!i.pop()}}),has:le(function(t){return function(e){return 0<se(t,e).length}}),contains:le(function(t){return t=t.replace(te,ne),function(e){return-1<(e.textContent||o(e)).indexOf(t)}}),lang:le(function(n){return V.test(n||"")||se.error("unsupported lang: "+n),n=n.replace(te,ne).toLowerCase(),function(e){var t;do{if(t=E?e.lang:e.getAttribute("xml:lang")||e.getAttribute("lang"))return(t=t.toLowerCase())===n||0===t.indexOf(n+"-")}while((e=e.parentNode)&&1===e.nodeType);return!1}}),target:function(e){var t=n.location&&n.location.hash;return t&&t.slice(1)===e.id},root:function(e){return e===a},focus:function(e){return e===C.activeElement&&(!C.hasFocus||C.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:ge(!1),disabled:ge(!0),checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,!0===e.selected},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!b.pseudos.empty(e)},header:function(e){return J.test(e.nodeName)},input:function(e){return Q.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:ve(function(){return[0]}),last:ve(function(e,t){return[t-1]}),eq:ve(function(e,t,n){return[n<0?n+t:n]}),even:ve(function(e,t){for(var n=0;n<t;n+=2)e.push(n);return e}),odd:ve(function(e,t){for(var n=1;n<t;n+=2)e.push(n);return e}),lt:ve(function(e,t,n){for(var r=n<0?n+t:t<n?t:n;0<=--r;)e.push(r);return e}),gt:ve(function(e,t,n){for(var r=n<0?n+t:n;++r<t;)e.push(r);return e})}}).pseudos.nth=b.pseudos.eq,{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})b.pseudos[e]=de(e);for(e in{submit:!0,reset:!0})b.pseudos[e]=he(e);function me(){}function xe(e){for(var t=0,n=e.length,r="";t<n;t++)r+=e[t].value;return r}function be(s,e,t){var u=e.dir,l=e.next,c=l||u,f=t&&"parentNode"===c,p=r++;return e.first?function(e,t,n){while(e=e[u])if(1===e.nodeType||f)return s(e,t,n);return!1}:function(e,t,n){var r,i,o,a=[k,p];if(n){while(e=e[u])if((1===e.nodeType||f)&&s(e,t,n))return!0}else while(e=e[u])if(1===e.nodeType||f)if(i=(o=e[S]||(e[S]={}))[e.uniqueID]||(o[e.uniqueID]={}),l&&l===e.nodeName.toLowerCase())e=e[u]||e;else{if((r=i[c])&&r[0]===k&&r[1]===p)return a[2]=r[2];if((i[c]=a)[2]=s(e,t,n))return!0}return!1}}function we(i){return 1<i.length?function(e,t,n){var r=i.length;while(r--)if(!i[r](e,t,n))return!1;return!0}:i[0]}function Te(e,t,n,r,i){for(var o,a=[],s=0,u=e.length,l=null!=t;s<u;s++)(o=e[s])&&(n&&!n(o,r,i)||(a.push(o),l&&t.push(s)));return a}function Ce(d,h,g,v,y,e){return v&&!v[S]&&(v=Ce(v)),y&&!y[S]&&(y=Ce(y,e)),le(function(e,t,n,r){var i,o,a,s=[],u=[],l=t.length,c=e||function(e,t,n){for(var r=0,i=t.length;r<i;r++)se(e,t[r],n);return n}(h||"*",n.nodeType?[n]:n,[]),f=!d||!e&&h?c:Te(c,s,d,n,r),p=g?y||(e?d:l||v)?[]:t:f;if(g&&g(f,p,n,r),v){i=Te(p,u),v(i,[],n,r),o=i.length;while(o--)(a=i[o])&&(p[u[o]]=!(f[u[o]]=a))}if(e){if(y||d){if(y){i=[],o=p.length;while(o--)(a=p[o])&&i.push(f[o]=a);y(null,p=[],i,r)}o=p.length;while(o--)(a=p[o])&&-1<(i=y?P(e,a):s[o])&&(e[i]=!(t[i]=a))}}else p=Te(p===t?p.splice(l,p.length):p),y?y(null,t,p,r):H.apply(t,p)})}function Ee(e){for(var i,t,n,r=e.length,o=b.relative[e[0].type],a=o||b.relative[" "],s=o?1:0,u=be(function(e){return e===i},a,!0),l=be(function(e){return-1<P(i,e)},a,!0),c=[function(e,t,n){var r=!o&&(n||t!==w)||((i=t).nodeType?u(e,t,n):l(e,t,n));return i=null,r}];s<r;s++)if(t=b.relative[e[s].type])c=[be(we(c),t)];else{if((t=b.filter[e[s].type].apply(null,e[s].matches))[S]){for(n=++s;n<r;n++)if(b.relative[e[n].type])break;return Ce(1<s&&we(c),1<s&&xe(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace($,"$1"),t,s<n&&Ee(e.slice(s,n)),n<r&&Ee(e=e.slice(n)),n<r&&xe(e))}c.push(t)}return we(c)}return me.prototype=b.filters=b.pseudos,b.setFilters=new me,h=se.tokenize=function(e,t){var n,r,i,o,a,s,u,l=x[e+" "];if(l)return t?0:l.slice(0);a=e,s=[],u=b.preFilter;while(a){for(o in n&&!(r=_.exec(a))||(r&&(a=a.slice(r[0].length)||a),s.push(i=[])),n=!1,(r=z.exec(a))&&(n=r.shift(),i.push({value:n,type:r[0].replace($," ")}),a=a.slice(n.length)),b.filter)!(r=G[o].exec(a))||u[o]&&!(r=u[o](r))||(n=r.shift(),i.push({value:n,type:o,matches:r}),a=a.slice(n.length));if(!n)break}return t?a.length:a?se.error(e):x(e,s).slice(0)},f=se.compile=function(e,t){var n,v,y,m,x,r,i=[],o=[],a=A[e+" "];if(!a){t||(t=h(e)),n=t.length;while(n--)(a=Ee(t[n]))[S]?i.push(a):o.push(a);(a=A(e,(v=o,m=0<(y=i).length,x=0<v.length,r=function(e,t,n,r,i){var o,a,s,u=0,l="0",c=e&&[],f=[],p=w,d=e||x&&b.find.TAG("*",i),h=k+=null==p?1:Math.random()||.1,g=d.length;for(i&&(w=t==C||t||i);l!==g&&null!=(o=d[l]);l++){if(x&&o){a=0,t||o.ownerDocument==C||(T(o),n=!E);while(s=v[a++])if(s(o,t||C,n)){r.push(o);break}i&&(k=h)}m&&((o=!s&&o)&&u--,e&&c.push(o))}if(u+=l,m&&l!==u){a=0;while(s=y[a++])s(c,f,t,n);if(e){if(0<u)while(l--)c[l]||f[l]||(f[l]=q.call(r));f=Te(f)}H.apply(r,f),i&&!e&&0<f.length&&1<u+y.length&&se.uniqueSort(r)}return i&&(k=h,w=p),c},m?le(r):r))).selector=e}return a},g=se.select=function(e,t,n,r){var i,o,a,s,u,l="function"==typeof e&&e,c=!r&&h(e=l.selector||e);if(n=n||[],1===c.length){if(2<(o=c[0]=c[0].slice(0)).length&&"ID"===(a=o[0]).type&&9===t.nodeType&&E&&b.relative[o[1].type]){if(!(t=(b.find.ID(a.matches[0].replace(te,ne),t)||[])[0]))return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}i=G.needsContext.test(e)?0:o.length;while(i--){if(a=o[i],b.relative[s=a.type])break;if((u=b.find[s])&&(r=u(a.matches[0].replace(te,ne),ee.test(o[0].type)&&ye(t.parentNode)||t))){if(o.splice(i,1),!(e=r.length&&xe(o)))return H.apply(n,r),n;break}}}return(l||f(e,c))(r,t,!E,n,!t||ee.test(e)&&ye(t.parentNode)||t),n},d.sortStable=S.split("").sort(j).join("")===S,d.detectDuplicates=!!l,T(),d.sortDetached=ce(function(e){return 1&e.compareDocumentPosition(C.createElement("fieldset"))}),ce(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||fe("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),d.attributes&&ce(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||fe("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),ce(function(e){return null==e.getAttribute("disabled")})||fe(R,function(e,t,n){var r;if(!n)return!0===e[t]?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),se}(C);S.find=d,S.expr=d.selectors,S.expr[":"]=S.expr.pseudos,S.uniqueSort=S.unique=d.uniqueSort,S.text=d.getText,S.isXMLDoc=d.isXML,S.contains=d.contains,S.escapeSelector=d.escape;var h=function(e,t,n){var r=[],i=void 0!==n;while((e=e[t])&&9!==e.nodeType)if(1===e.nodeType){if(i&&S(e).is(n))break;r.push(e)}return r},T=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},k=S.expr.match.needsContext;function A(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()}var N=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1<i.call(n,e)!==r}):S.filter(n,e,r)}S.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?S.find.matchesSelector(r,e)?[r]:[]:S.find.matches(e,S.grep(t,function(e){return 1===e.nodeType}))},S.fn.extend({find:function(e){var t,n,r=this.length,i=this;if("string"!=typeof e)return this.pushStack(S(e).filter(function(){for(t=0;t<r;t++)if(S.contains(i[t],this))return!0}));for(n=this.pushStack([]),t=0;t<r;t++)S.find(e,i[t],n);return 1<r?S.uniqueSort(n):n},filter:function(e){return this.pushStack(j(this,e||[],!1))},not:function(e){return this.pushStack(j(this,e||[],!0))},is:function(e){return!!j(this,"string"==typeof e&&k.test(e)?S(e):e||[],!1).length}});var D,q=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e<n;e++)if(S.contains(this,t[e]))return!0})},closest:function(e,t){var n,r=0,i=this.length,o=[],a="string"!=typeof e&&S(e);if(!k.test(e))for(;r<i;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(n.nodeType<11&&(a?-1<a.index(n):1===n.nodeType&&S.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(1<o.length?S.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?i.call(S(e),this[0]):i.call(this,e.jquery?e[0]:e):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(S.uniqueSort(S.merge(this.get(),S(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),S.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return h(e,"parentNode")},parentsUntil:function(e,t,n){return h(e,"parentNode",n)},next:function(e){return O(e,"nextSibling")},prev:function(e){return O(e,"previousSibling")},nextAll:function(e){return h(e,"nextSibling")},prevAll:function(e){return h(e,"previousSibling")},nextUntil:function(e,t,n){return h(e,"nextSibling",n)},prevUntil:function(e,t,n){return h(e,"previousSibling",n)},siblings:function(e){return T((e.parentNode||{}).firstChild,e)},children:function(e){return T(e.firstChild)},contents:function(e){return null!=e.contentDocument&&r(e.contentDocument)?e.contentDocument:(A(e,"template")&&(e=e.content||e),S.merge([],e.childNodes))}},function(r,i){S.fn[r]=function(e,t){var n=S.map(this,i,e);return"Until"!==r.slice(-5)&&(t=e),t&&"string"==typeof t&&(n=S.filter(t,n)),1<this.length&&(H[r]||S.uniqueSort(n),L.test(r)&&n.reverse()),this.pushStack(n)}});var P=/[^\x20\t\r\n\f]+/g;function R(e){return e}function M(e){throw e}function I(e,t,n,r){var i;try{e&&m(i=e.promise)?i.call(e).done(t).fail(n):e&&m(i=e.then)?i.call(e,t,n):t.apply(void 0,[e].slice(r))}catch(e){n.apply(void 0,[e])}}S.Callbacks=function(r){var e,n;r="string"==typeof r?(e=r,n={},S.each(e.match(P)||[],function(e,t){n[t]=!0}),n):S.extend({},r);var i,t,o,a,s=[],u=[],l=-1,c=function(){for(a=a||r.once,o=i=!0;u.length;l=-1){t=u.shift();while(++l<s.length)!1===s[l].apply(t[0],t[1])&&r.stopOnFalse&&(l=s.length,t=!1)}r.memory||(t=!1),i=!1,a&&(s=t?[]:"")},f={add:function(){return s&&(t&&!i&&(l=s.length-1,u.push(t)),function n(e){S.each(e,function(e,t){m(t)?r.unique&&f.has(t)||s.push(t):t&&t.length&&"string"!==w(t)&&n(t)})}(arguments),t&&!i&&c()),this},remove:function(){return S.each(arguments,function(e,t){var n;while(-1<(n=S.inArray(t,s,n)))s.splice(n,1),n<=l&&l--}),this},has:function(e){return e?-1<S.inArray(e,s):0<s.length},empty:function(){return s&&(s=[]),this},disable:function(){return a=u=[],s=t="",this},disabled:function(){return!s},lock:function(){return a=u=[],t||i||(s=t=""),this},locked:function(){return!!a},fireWith:function(e,t){return a||(t=[e,(t=t||[]).slice?t.slice():t],u.push(t),i||c()),this},fire:function(){return f.fireWith(this,arguments),this},fired:function(){return!!o}};return f},S.extend({Deferred:function(e){var o=[["notify","progress",S.Callbacks("memory"),S.Callbacks("memory"),2],["resolve","done",S.Callbacks("once memory"),S.Callbacks("once memory"),0,"resolved"],["reject","fail",S.Callbacks("once memory"),S.Callbacks("once memory"),1,"rejected"]],i="pending",a={state:function(){return i},always:function(){return s.done(arguments).fail(arguments),this},"catch":function(e){return a.then(null,e)},pipe:function(){var i=arguments;return S.Deferred(function(r){S.each(o,function(e,t){var n=m(i[t[4]])&&i[t[4]];s[t[1]](function(){var e=n&&n.apply(this,arguments);e&&m(e.promise)?e.promise().progress(r.notify).done(r.resolve).fail(r.reject):r[t[0]+"With"](this,n?[e]:arguments)})}),i=null}).promise()},then:function(t,n,r){var u=0;function l(i,o,a,s){return function(){var n=this,r=arguments,e=function(){var e,t;if(!(i<u)){if((e=a.apply(n,r))===o.promise())throw new TypeError("Thenable self-resolution");t=e&&("object"==typeof e||"function"==typeof e)&&e.then,m(t)?s?t.call(e,l(u,o,R,s),l(u,o,M,s)):(u++,t.call(e,l(u,o,R,s),l(u,o,M,s),l(u,o,R,o.notifyWith))):(a!==R&&(n=void 0,r=[e]),(s||o.resolveWith)(n,r))}},t=s?e:function(){try{e()}catch(e){S.Deferred.exceptionHook&&S.Deferred.exceptionHook(e,t.stackTrace),u<=i+1&&(a!==M&&(n=void 0,r=[e]),o.rejectWith(n,r))}};i?t():(S.Deferred.getStackHook&&(t.stackTrace=S.Deferred.getStackHook()),C.setTimeout(t))}}return S.Deferred(function(e){o[0][3].add(l(0,e,m(r)?r:R,e.notifyWith)),o[1][3].add(l(0,e,m(t)?t:R)),o[2][3].add(l(0,e,m(n)?n:M))}).promise()},promise:function(e){return null!=e?S.extend(e,a):a}},s={};return S.each(o,function(e,t){var n=t[2],r=t[5];a[t[1]]=n.add,r&&n.add(function(){i=r},o[3-e][2].disable,o[3-e][3].disable,o[0][2].lock,o[0][3].lock),n.add(t[3].fire),s[t[0]]=function(){return s[t[0]+"With"](this===s?void 0:this,arguments),this},s[t[0]+"With"]=n.fireWith}),a.promise(s),e&&e.call(s,s),s},when:function(e){var n=arguments.length,t=n,r=Array(t),i=s.call(arguments),o=S.Deferred(),a=function(t){return function(e){r[t]=this,i[t]=1<arguments.length?s.call(arguments):e,--n||o.resolveWith(r,i)}};if(n<=1&&(I(e,o.done(a(t)).resolve,o.reject,!n),"pending"===o.state()||m(i[t]&&i[t].then)))return o.then();while(t--)I(i[t],a(t),o.reject);return o.promise()}});var W=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;S.Deferred.exceptionHook=function(e,t){C.console&&C.console.warn&&e&&W.test(e.name)&&C.console.warn("jQuery.Deferred exception: "+e.message,e.stack,t)},S.readyException=function(e){C.setTimeout(function(){throw e})};var F=S.Deferred();function B(){E.removeEventListener("DOMContentLoaded",B),C.removeEventListener("load",B),S.ready()}S.fn.ready=function(e){return F.then(e)["catch"](function(e){S.readyException(e)}),this},S.extend({isReady:!1,readyWait:1,ready:function(e){(!0===e?--S.readyWait:S.isReady)||(S.isReady=!0)!==e&&0<--S.readyWait||F.resolveWith(E,[S])}}),S.ready.then=F.then,"complete"===E.readyState||"loading"!==E.readyState&&!E.documentElement.doScroll?C.setTimeout(S.ready):(E.addEventListener("DOMContentLoaded",B),C.addEventListener("load",B));var $=function(e,t,n,r,i,o,a){var s=0,u=e.length,l=null==n;if("object"===w(n))for(s in i=!0,n)$(e,t,s,n[s],!0,o,a);else if(void 0!==r&&(i=!0,m(r)||(a=!0),l&&(a?(t.call(e,r),t=null):(l=t,t=function(e,t,n){return l.call(S(e),n)})),t))for(;s<u;s++)t(e[s],n,a?r:r.call(e[s],s,t(e[s],n)));return i?e:l?t.call(e):u?t(e[0],n):o},_=/^-ms-/,z=/-([a-z])/g;function U(e,t){return t.toUpperCase()}function X(e){return e.replace(_,"ms-").replace(z,U)}var V=function(e){return 1===e.nodeType||9===e.nodeType||!+e.nodeType};function G(){this.expando=S.expando+G.uid++}G.uid=1,G.prototype={cache:function(e){var t=e[this.expando];return t||(t={},V(e)&&(e.nodeType?e[this.expando]=t:Object.defineProperty(e,this.expando,{value:t,configurable:!0}))),t},set:function(e,t,n){var r,i=this.cache(e);if("string"==typeof t)i[X(t)]=n;else for(r in t)i[X(r)]=t[r];return i},get:function(e,t){return void 0===t?this.cache(e):e[this.expando]&&e[this.expando][X(t)]},access:function(e,t,n){return void 0===t||t&&"string"==typeof t&&void 0===n?this.get(e,t):(this.set(e,t,n),void 0!==n?n:t)},remove:function(e,t){var n,r=e[this.expando];if(void 0!==r){if(void 0!==t){n=(t=Array.isArray(t)?t.map(X):(t=X(t))in r?[t]:t.match(P)||[]).length;while(n--)delete r[t[n]]}(void 0===t||S.isEmptyObject(r))&&(e.nodeType?e[this.expando]=void 0:delete e[this.expando])}},hasData:function(e){var t=e[this.expando];return void 0!==t&&!S.isEmptyObject(t)}};var Y=new G,Q=new G,J=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,K=/[A-Z]/g;function Z(e,t,n){var r,i;if(void 0===n&&1===e.nodeType)if(r="data-"+t.replace(K,"-$&").toLowerCase(),"string"==typeof(n=e.getAttribute(r))){try{n="true"===(i=n)||"false"!==i&&("null"===i?null:i===+i+""?+i:J.test(i)?JSON.parse(i):i)}catch(e){}Q.set(e,t,n)}else n=void 0;return n}S.extend({hasData:function(e){return Q.hasData(e)||Y.hasData(e)},data:function(e,t,n){return Q.access(e,t,n)},removeData:function(e,t){Q.remove(e,t)},_data:function(e,t,n){return Y.access(e,t,n)},_removeData:function(e,t){Y.remove(e,t)}}),S.fn.extend({data:function(n,e){var t,r,i,o=this[0],a=o&&o.attributes;if(void 0===n){if(this.length&&(i=Q.get(o),1===o.nodeType&&!Y.get(o,"hasDataAttrs"))){t=a.length;while(t--)a[t]&&0===(r=a[t].name).indexOf("data-")&&(r=X(r.slice(5)),Z(o,r,i[r]));Y.set(o,"hasDataAttrs",!0)}return i}return"object"==typeof n?this.each(function(){Q.set(this,n)}):$(this,function(e){var t;if(o&&void 0===e)return void 0!==(t=Q.get(o,n))?t:void 0!==(t=Z(o,n))?t:void 0;this.each(function(){Q.set(this,n,e)})},null,e,1<arguments.length,null,!0)},removeData:function(e){return this.each(function(){Q.remove(this,e)})}}),S.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=Y.get(e,t),n&&(!r||Array.isArray(n)?r=Y.access(e,t,S.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=S.queue(e,t),r=n.length,i=n.shift(),o=S._queueHooks(e,t);"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,function(){S.dequeue(e,t)},o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return Y.get(e,n)||Y.access(e,n,{empty:S.Callbacks("once memory").add(function(){Y.remove(e,[t+"queue",n])})})}}),S.fn.extend({queue:function(t,n){var e=2;return"string"!=typeof t&&(n=t,t="fx",e--),arguments.length<e?S.queue(this[0],t):void 0===n?this:this.each(function(){var e=S.queue(this,t,n);S._queueHooks(this,t),"fx"===t&&"inprogress"!==e[0]&&S.dequeue(this,t)})},dequeue:function(e){return this.each(function(){S.dequeue(this,e)})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,t){var n,r=1,i=S.Deferred(),o=this,a=this.length,s=function(){--r||i.resolveWith(o,[o])};"string"!=typeof e&&(t=e,e=void 0),e=e||"fx";while(a--)(n=Y.get(o[a],e+"queueHooks"))&&n.empty&&(r++,n.empty.add(s));return s(),i.promise(t)}});var ee=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,te=new RegExp("^(?:([+-])=|)("+ee+")([a-z%]*)$","i"),ne=["Top","Right","Bottom","Left"],re=E.documentElement,ie=function(e){return S.contains(e.ownerDocument,e)},oe={composed:!0};re.getRootNode&&(ie=function(e){return S.contains(e.ownerDocument,e)||e.getRootNode(oe)===e.ownerDocument});var ae=function(e,t){return"none"===(e=t||e).style.display||""===e.style.display&&ie(e)&&"none"===S.css(e,"display")};function se(e,t,n,r){var i,o,a=20,s=r?function(){return r.cur()}:function(){return S.css(e,t,"")},u=s(),l=n&&n[3]||(S.cssNumber[t]?"":"px"),c=e.nodeType&&(S.cssNumber[t]||"px"!==l&&+u)&&te.exec(S.css(e,t));if(c&&c[3]!==l){u/=2,l=l||c[3],c=+u||1;while(a--)S.style(e,t,c+l),(1-o)*(1-(o=s()/u||.5))<=0&&(a=0),c/=o;c*=2,S.style(e,t,c+l),n=n||[]}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}var ue={};function le(e,t){for(var n,r,i,o,a,s,u,l=[],c=0,f=e.length;c<f;c++)(r=e[c]).style&&(n=r.style.display,t?("none"===n&&(l[c]=Y.get(r,"display")||null,l[c]||(r.style.display="")),""===r.style.display&&ae(r)&&(l[c]=(u=a=o=void 0,a=(i=r).ownerDocument,s=i.nodeName,(u=ue[s])||(o=a.body.appendChild(a.createElement(s)),u=S.css(o,"display"),o.parentNode.removeChild(o),"none"===u&&(u="block"),ue[s]=u)))):"none"!==n&&(l[c]="none",Y.set(r,"display",n)));for(c=0;c<f;c++)null!=l[c]&&(e[c].style.display=l[c]);return e}S.fn.extend({show:function(){return le(this,!0)},hide:function(){return le(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){ae(this)?S(this).show():S(this).hide()})}});var ce,fe,pe=/^(?:checkbox|radio)$/i,de=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="<textarea>x</textarea>",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="<option></option>",y.option=!!ce.lastChild;var ge={thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n<r;n++)Y.set(e[n],"globalEval",!t||Y.get(t[n],"globalEval"))}ge.tbody=ge.tfoot=ge.colgroup=ge.caption=ge.thead,ge.th=ge.td,y.option||(ge.optgroup=ge.option=[1,"<select multiple='multiple'>","</select>"]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d<h;d++)if((o=e[d])||0===o)if("object"===w(o))S.merge(p,o.nodeType?[o]:o);else if(me.test(o)){a=a||f.appendChild(t.createElement("div")),s=(de.exec(o)||["",""])[1].toLowerCase(),u=ge[s]||ge._default,a.innerHTML=u[1]+S.htmlPrefilter(o)+u[2],c=u[0];while(c--)a=a.lastChild;S.merge(p,a.childNodes),(a=f.firstChild).textContent=""}else p.push(t.createTextNode(o));f.textContent="",d=0;while(o=p[d++])if(r&&-1<S.inArray(o,r))i&&i.push(o);else if(l=ie(o),a=ve(f.appendChild(o),"script"),l&&ye(a),n){c=0;while(o=a[c++])he.test(o.type||"")&&n.push(o)}return f}var be=/^([^.]*)(?:\.(.+)|)/;function we(){return!0}function Te(){return!1}function Ce(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ee(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ee(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Te;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return S().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=S.guid++)),e.each(function(){S.event.add(this,t,i,r,n)})}function Se(e,i,o){o?(Y.set(e,i,!1),S.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Y.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(S.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Y.set(this,i,r),t=o(this,i),this[i](),r!==(n=Y.get(this,i))||t?Y.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n&&n.value}else r.length&&(Y.set(this,i,{value:S.event.trigger(S.extend(r[0],S.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Y.get(e,i)&&S.event.add(e,i,we)}S.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.get(t);if(V(t)){n.handler&&(n=(o=n).handler,i=o.selector),i&&S.find.matchesSelector(re,i),n.guid||(n.guid=S.guid++),(u=v.events)||(u=v.events=Object.create(null)),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof S&&S.event.triggered!==e.type?S.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(P)||[""]).length;while(l--)d=g=(s=be.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=S.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=S.event.special[d]||{},c=S.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&S.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),S.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Y.hasData(e)&&Y.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(P)||[""]).length;while(l--)if(d=g=(s=be.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=S.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||S.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)S.event.remove(e,d+t[l],n,r,!0);S.isEmptyObject(u)&&Y.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=new Array(arguments.length),u=S.event.fix(e),l=(Y.get(this,"events")||Object.create(null))[u.type]||[],c=S.event.special[u.type]||{};for(s[0]=u,t=1;t<arguments.length;t++)s[t]=arguments[t];if(u.delegateTarget=this,!c.preDispatch||!1!==c.preDispatch.call(this,u)){a=S.event.handlers.call(this,u,l),t=0;while((i=a[t++])&&!u.isPropagationStopped()){u.currentTarget=i.elem,n=0;while((o=i.handlers[n++])&&!u.isImmediatePropagationStopped())u.rnamespace&&!1!==o.namespace&&!u.rnamespace.test(o.namespace)||(u.handleObj=o,u.data=o.data,void 0!==(r=((S.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s))&&!1===(u.result=r)&&(u.preventDefault(),u.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,u),u.result}},handlers:function(e,t){var n,r,i,o,a,s=[],u=t.delegateCount,l=e.target;if(u&&l.nodeType&&!("click"===e.type&&1<=e.button))for(;l!==this;l=l.parentNode||this)if(1===l.nodeType&&("click"!==e.type||!0!==l.disabled)){for(o=[],a={},n=0;n<u;n++)void 0===a[i=(r=t[n]).selector+" "]&&(a[i]=r.needsContext?-1<S(i,this).index(l):S.find(i,this,null,[l]).length),a[i]&&o.push(r);o.length&&s.push({elem:l,handlers:o})}return l=this,u<t.length&&s.push({elem:l,handlers:t.slice(u)}),s},addProp:function(t,e){Object.defineProperty(S.Event.prototype,t,{enumerable:!0,configurable:!0,get:m(e)?function(){if(this.originalEvent)return e(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[t]},set:function(e){Object.defineProperty(this,t,{enumerable:!0,configurable:!0,writable:!0,value:e})}})},fix:function(e){return e[S.expando]?e:new S.Event(e)},special:{load:{noBubble:!0},click:{setup:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click",we),!1},trigger:function(e){var t=this||e;return pe.test(t.type)&&t.click&&A(t,"input")&&Se(t,"click"),!0},_default:function(e){var t=e.target;return pe.test(t.type)&&t.click&&A(t,"input")&&Y.get(t,"click")||A(t,"a")}},beforeunload:{postDispatch:function(e){void 0!==e.result&&e.originalEvent&&(e.originalEvent.returnValue=e.result)}}}},S.removeEvent=function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n)},S.Event=function(e,t){if(!(this instanceof S.Event))return new S.Event(e,t);e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||void 0===e.defaultPrevented&&!1===e.returnValue?we:Te,this.target=e.target&&3===e.target.nodeType?e.target.parentNode:e.target,this.currentTarget=e.currentTarget,this.relatedTarget=e.relatedTarget):this.type=e,t&&S.extend(this,t),this.timeStamp=e&&e.timeStamp||Date.now(),this[S.expando]=!0},S.Event.prototype={constructor:S.Event,isDefaultPrevented:Te,isPropagationStopped:Te,isImmediatePropagationStopped:Te,isSimulated:!1,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=we,e&&!this.isSimulated&&e.preventDefault()},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=we,e&&!this.isSimulated&&e.stopPropagation()},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=we,e&&!this.isSimulated&&e.stopImmediatePropagation(),this.stopPropagation()}},S.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,code:!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:!0},S.event.addProp),S.each({focus:"focusin",blur:"focusout"},function(e,t){S.event.special[e]={setup:function(){return Se(this,e,Ce),!1},trigger:function(){return Se(this,e),!0},_default:function(){return!0},delegateType:t}}),S.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(e,i){S.event.special[e]={delegateType:i,bindType:i,handle:function(e){var t,n=e.relatedTarget,r=e.handleObj;return n&&(n===this||S.contains(this,n))||(e.type=r.origType,t=r.handler.apply(this,arguments),e.type=i),t}}}),S.fn.extend({on:function(e,t,n,r){return Ee(this,e,t,n,r)},one:function(e,t,n,r){return Ee(this,e,t,n,r,1)},off:function(e,t,n){var r,i;if(e&&e.preventDefault&&e.handleObj)return r=e.handleObj,S(e.delegateTarget).off(r.namespace?r.origType+"."+r.namespace:r.origType,r.selector,r.handler),this;if("object"==typeof e){for(i in e)this.off(i,t,e[i]);return this}return!1!==t&&"function"!=typeof t||(n=t,t=void 0),!1===n&&(n=Te),this.each(function(){S.event.remove(this,e,n,t)})}});var ke=/<script|<style|<link/i,Ae=/checked\s*(?:[^=]|=\s*.checked.)/i,Ne=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n<r;n++)S.event.add(t,i,s[i][n]);Q.hasData(e)&&(o=Q.access(e),a=S.extend({},o),Q.set(t,a))}}function He(n,r,i,o){r=g(r);var e,t,a,s,u,l,c=0,f=n.length,p=f-1,d=r[0],h=m(d);if(h||1<f&&"string"==typeof d&&!y.checkClone&&Ae.test(d))return n.each(function(e){var t=n.eq(e);h&&(r[0]=d.call(this,e,t.html())),He(t,r,i,o)});if(f&&(t=(e=xe(r,n[0].ownerDocument,!1,n,o)).firstChild,1===e.childNodes.length&&(e=t),t||o)){for(s=(a=S.map(ve(e,"script"),De)).length;c<f;c++)u=e,c!==p&&(u=S.clone(u,!0,!0),s&&S.merge(a,ve(u,"script"))),i.call(n[c],u,c);if(s)for(l=a[a.length-1].ownerDocument,S.map(a,qe),c=0;c<s;c++)u=a[c],he.test(u.type||"")&&!Y.access(u,"globalEval")&&S.contains(l,u)&&(u.src&&"module"!==(u.type||"").toLowerCase()?S._evalUrl&&!u.noModule&&S._evalUrl(u.src,{nonce:u.nonce||u.getAttribute("nonce")},l):b(u.textContent.replace(Ne,""),u,l))}return n}function Oe(e,t,n){for(var r,i=t?S.filter(t,e):e,o=0;null!=(r=i[o]);o++)n||1!==r.nodeType||S.cleanData(ve(r)),r.parentNode&&(n&&ie(r)&&ye(ve(r,"script")),r.parentNode.removeChild(r));return e}S.extend({htmlPrefilter:function(e){return e},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=ie(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||S.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r<i;r++)s=o[r],u=a[r],void 0,"input"===(l=u.nodeName.toLowerCase())&&pe.test(s.type)?u.checked=s.checked:"input"!==l&&"textarea"!==l||(u.defaultValue=s.defaultValue);if(t)if(n)for(o=o||ve(e),a=a||ve(c),r=0,i=o.length;r<i;r++)Le(o[r],a[r]);else Le(e,c);return 0<(a=ve(c,"script")).length&&ye(a,!f&&ve(e,"script")),c},cleanData:function(e){for(var t,n,r,i=S.event.special,o=0;void 0!==(n=e[o]);o++)if(V(n)){if(t=n[Y.expando]){if(t.events)for(r in t.events)i[r]?S.event.remove(n,r):S.removeEvent(n,r,t.handle);n[Y.expando]=void 0}n[Q.expando]&&(n[Q.expando]=void 0)}}}),S.fn.extend({detach:function(e){return Oe(this,e,!0)},remove:function(e){return Oe(this,e)},text:function(e){return $(this,function(e){return void 0===e?S.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=e)})},null,e,arguments.length)},append:function(){return He(this,arguments,function(e){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||je(this,e).appendChild(e)})},prepend:function(){return He(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=je(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return He(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++)1===e.nodeType&&(S.cleanData(ve(e,!1)),e.textContent="");return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return S.clone(this,e,t)})},html:function(e){return $(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e&&1===t.nodeType)return t.innerHTML;if("string"==typeof e&&!ke.test(e)&&!ge[(de.exec(e)||["",""])[1].toLowerCase()]){e=S.htmlPrefilter(e);try{for(;n<r;n++)1===(t=this[n]||{}).nodeType&&(S.cleanData(ve(t,!1)),t.innerHTML=e);t=0}catch(e){}}t&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var n=[];return He(this,arguments,function(e){var t=this.parentNode;S.inArray(this,n)<0&&(S.cleanData(ve(this)),t&&t.replaceChild(e,this))},n)}}),S.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,a){S.fn[e]=function(e){for(var t,n=[],r=S(e),i=r.length-1,o=0;o<=i;o++)t=o===i?this:this.clone(!0),S(r[o])[a](t),u.apply(n,t.get());return this.pushStack(n)}});var Pe=new RegExp("^("+ee+")(?!px)[a-z%]+$","i"),Re=function(e){var t=e.ownerDocument.defaultView;return t&&t.opener||(t=C),t.getComputedStyle(e)},Me=function(e,t,n){var r,i,o={};for(i in t)o[i]=e.style[i],e.style[i]=t[i];for(i in r=n.call(e),t)e.style[i]=o[i];return r},Ie=new RegExp(ne.join("|"),"i");function We(e,t,n){var r,i,o,a,s=e.style;return(n=n||Re(e))&&(""!==(a=n.getPropertyValue(t)||n[t])||ie(e)||(a=S.style(e,t)),!y.pixelBoxStyles()&&Pe.test(a)&&Ie.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o)),void 0!==a?a+"":a}function Fe(e,t){return{get:function(){if(!e())return(this.get=t).apply(this,arguments);delete this.get}}}!function(){function e(){if(l){u.style.cssText="position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0",l.style.cssText="position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%",re.appendChild(u).appendChild(l);var e=C.getComputedStyle(l);n="1%"!==e.top,s=12===t(e.marginLeft),l.style.right="60%",o=36===t(e.right),r=36===t(e.width),l.style.position="absolute",i=12===t(l.offsetWidth/3),re.removeChild(u),l=null}}function t(e){return Math.round(parseFloat(e))}var n,r,i,o,a,s,u=E.createElement("div"),l=E.createElement("div");l.style&&(l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",y.clearCloneStyle="content-box"===l.style.backgroundClip,S.extend(y,{boxSizingReliable:function(){return e(),r},pixelBoxStyles:function(){return e(),o},pixelPosition:function(){return e(),n},reliableMarginLeft:function(){return e(),s},scrollboxSize:function(){return e(),i},reliableTrDimensions:function(){var e,t,n,r;return null==a&&(e=E.createElement("table"),t=E.createElement("tr"),n=E.createElement("div"),e.style.cssText="position:absolute;left:-11111px;border-collapse:separate",t.style.cssText="border:1px solid",t.style.height="1px",n.style.height="9px",n.style.display="block",re.appendChild(e).appendChild(t).appendChild(n),r=C.getComputedStyle(t),a=parseInt(r.height,10)+parseInt(r.borderTopWidth,10)+parseInt(r.borderBottomWidth,10)===t.offsetHeight,re.removeChild(e)),a}}))}();var Be=["Webkit","Moz","ms"],$e=E.createElement("div").style,_e={};function ze(e){var t=S.cssProps[e]||_e[e];return t||(e in $e?e:_e[e]=function(e){var t=e[0].toUpperCase()+e.slice(1),n=Be.length;while(n--)if((e=Be[n]+t)in $e)return e}(e)||e)}var Ue=/^(none|table(?!-c[ea]).+)/,Xe=/^--/,Ve={position:"absolute",visibility:"hidden",display:"block"},Ge={letterSpacing:"0",fontWeight:"400"};function Ye(e,t,n){var r=te.exec(t);return r?Math.max(0,r[2]-(n||0))+(r[3]||"px"):t}function Qe(e,t,n,r,i,o){var a="width"===t?1:0,s=0,u=0;if(n===(r?"border":"content"))return 0;for(;a<4;a+=2)"margin"===n&&(u+=S.css(e,n+ne[a],!0,i)),r?("content"===n&&(u-=S.css(e,"padding"+ne[a],!0,i)),"margin"!==n&&(u-=S.css(e,"border"+ne[a]+"Width",!0,i))):(u+=S.css(e,"padding"+ne[a],!0,i),"padding"!==n?u+=S.css(e,"border"+ne[a]+"Width",!0,i):s+=S.css(e,"border"+ne[a]+"Width",!0,i));return!r&&0<=o&&(u+=Math.max(0,Math.ceil(e["offset"+t[0].toUpperCase()+t.slice(1)]-o-u-s-.5))||0),u}function Je(e,t,n){var r=Re(e),i=(!y.boxSizingReliable()||n)&&"border-box"===S.css(e,"boxSizing",!1,r),o=i,a=We(e,t,r),s="offset"+t[0].toUpperCase()+t.slice(1);if(Pe.test(a)){if(!n)return a;a="auto"}return(!y.boxSizingReliable()&&i||!y.reliableTrDimensions()&&A(e,"tr")||"auto"===a||!parseFloat(a)&&"inline"===S.css(e,"display",!1,r))&&e.getClientRects().length&&(i="border-box"===S.css(e,"boxSizing",!1,r),(o=s in e)&&(a=e[s])),(a=parseFloat(a)||0)+Qe(e,t,n||(i?"border":"content"),o,r,a)+"px"}function Ke(e,t,n,r,i){return new Ke.prototype.init(e,t,n,r,i)}S.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=We(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,gridArea:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnStart:!0,gridRow:!0,gridRowEnd:!0,gridRowStart:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=X(t),u=Xe.test(t),l=e.style;if(u||(t=ze(s)),a=S.cssHooks[t]||S.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:l[t];"string"===(o=typeof n)&&(i=te.exec(n))&&i[1]&&(n=se(e,t,i),o="number"),null!=n&&n==n&&("number"!==o||u||(n+=i&&i[3]||(S.cssNumber[s]?"":"px")),y.clearCloneStyle||""!==n||0!==t.indexOf("background")||(l[t]="inherit"),a&&"set"in a&&void 0===(n=a.set(e,n,r))||(u?l.setProperty(t,n):l[t]=n))}},css:function(e,t,n,r){var i,o,a,s=X(t);return Xe.test(t)||(t=ze(s)),(a=S.cssHooks[t]||S.cssHooks[s])&&"get"in a&&(i=a.get(e,!0,n)),void 0===i&&(i=We(e,t,r)),"normal"===i&&t in Ge&&(i=Ge[t]),""===n||n?(o=parseFloat(i),!0===n||isFinite(o)?o||0:i):i}}),S.each(["height","width"],function(e,u){S.cssHooks[u]={get:function(e,t,n){if(t)return!Ue.test(S.css(e,"display"))||e.getClientRects().length&&e.getBoundingClientRect().width?Je(e,u,n):Me(e,Ve,function(){return Je(e,u,n)})},set:function(e,t,n){var r,i=Re(e),o=!y.scrollboxSize()&&"absolute"===i.position,a=(o||n)&&"border-box"===S.css(e,"boxSizing",!1,i),s=n?Qe(e,u,n,a,i):0;return a&&o&&(s-=Math.ceil(e["offset"+u[0].toUpperCase()+u.slice(1)]-parseFloat(i[u])-Qe(e,u,"border",!1,i)-.5)),s&&(r=te.exec(t))&&"px"!==(r[3]||"px")&&(e.style[u]=t,t=S.css(e,u)),Ye(0,t,s)}}}),S.cssHooks.marginLeft=Fe(y.reliableMarginLeft,function(e,t){if(t)return(parseFloat(We(e,"marginLeft"))||e.getBoundingClientRect().left-Me(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}))+"px"}),S.each({margin:"",padding:"",border:"Width"},function(i,o){S.cssHooks[i+o]={expand:function(e){for(var t=0,n={},r="string"==typeof e?e.split(" "):[e];t<4;t++)n[i+ne[t]+o]=r[t]||r[t-2]||r[0];return n}},"margin"!==i&&(S.cssHooks[i+o].set=Ye)}),S.fn.extend({css:function(e,t){return $(this,function(e,t,n){var r,i,o={},a=0;if(Array.isArray(t)){for(r=Re(e),i=t.length;a<i;a++)o[t[a]]=S.css(e,t[a],!1,r);return o}return void 0!==n?S.style(e,t,n):S.css(e,t)},e,t,1<arguments.length)}}),((S.Tween=Ke).prototype={constructor:Ke,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||S.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(S.cssNumber[n]?"":"px")},cur:function(){var e=Ke.propHooks[this.prop];return e&&e.get?e.get(this):Ke.propHooks._default.get(this)},run:function(e){var t,n=Ke.propHooks[this.prop];return this.options.duration?this.pos=t=S.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):Ke.propHooks._default.set(this),this}}).init.prototype=Ke.prototype,(Ke.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=S.css(e.elem,e.prop,""))&&"auto"!==t?t:0},set:function(e){S.fx.step[e.prop]?S.fx.step[e.prop](e):1!==e.elem.nodeType||!S.cssHooks[e.prop]&&null==e.elem.style[ze(e.prop)]?e.elem[e.prop]=e.now:S.style(e.elem,e.prop,e.now+e.unit)}}}).scrollTop=Ke.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},S.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},S.fx=Ke.prototype.init,S.fx.step={};var Ze,et,tt,nt,rt=/^(?:toggle|show|hide)$/,it=/queueHooks$/;function ot(){et&&(!1===E.hidden&&C.requestAnimationFrame?C.requestAnimationFrame(ot):C.setTimeout(ot,S.fx.interval),S.fx.tick())}function at(){return C.setTimeout(function(){Ze=void 0}),Ze=Date.now()}function st(e,t){var n,r=0,i={height:e};for(t=t?1:0;r<4;r+=2-t)i["margin"+(n=ne[r])]=i["padding"+n]=e;return t&&(i.opacity=i.width=e),i}function ut(e,t,n){for(var r,i=(lt.tweeners[t]||[]).concat(lt.tweeners["*"]),o=0,a=i.length;o<a;o++)if(r=i[o].call(n,t,e))return r}function lt(o,e,t){var n,a,r=0,i=lt.prefilters.length,s=S.Deferred().always(function(){delete u.elem}),u=function(){if(a)return!1;for(var e=Ze||at(),t=Math.max(0,l.startTime+l.duration-e),n=1-(t/l.duration||0),r=0,i=l.tweens.length;r<i;r++)l.tweens[r].run(n);return s.notifyWith(o,[l,n,t]),n<1&&i?t:(i||s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l]),!1)},l=s.promise({elem:o,props:S.extend({},e),opts:S.extend(!0,{specialEasing:{},easing:S.easing._default},t),originalProperties:e,originalOptions:t,startTime:Ze||at(),duration:t.duration,tweens:[],createTween:function(e,t){var n=S.Tween(o,l.opts,e,t,l.opts.specialEasing[e]||l.opts.easing);return l.tweens.push(n),n},stop:function(e){var t=0,n=e?l.tweens.length:0;if(a)return this;for(a=!0;t<n;t++)l.tweens[t].run(1);return e?(s.notifyWith(o,[l,1,0]),s.resolveWith(o,[l,e])):s.rejectWith(o,[l,e]),this}}),c=l.props;for(!function(e,t){var n,r,i,o,a;for(n in e)if(i=t[r=X(n)],o=e[n],Array.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),(a=S.cssHooks[r])&&"expand"in a)for(n in o=a.expand(o),delete e[r],o)n in e||(e[n]=o[n],t[n]=i);else t[r]=i}(c,l.opts.specialEasing);r<i;r++)if(n=lt.prefilters[r].call(l,o,c,l.opts))return m(n.stop)&&(S._queueHooks(l.elem,l.opts.queue).stop=n.stop.bind(n)),n;return S.map(c,ut,l),m(l.opts.start)&&l.opts.start.call(o,l),l.progress(l.opts.progress).done(l.opts.done,l.opts.complete).fail(l.opts.fail).always(l.opts.always),S.fx.timer(S.extend(u,{elem:o,anim:l,queue:l.opts.queue})),l}S.Animation=S.extend(lt,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return se(n.elem,e,te.exec(t),n),n}]},tweener:function(e,t){m(e)?(t=e,e=["*"]):e=e.match(P);for(var n,r=0,i=e.length;r<i;r++)n=e[r],lt.tweeners[n]=lt.tweeners[n]||[],lt.tweeners[n].unshift(t)},prefilters:[function(e,t,n){var r,i,o,a,s,u,l,c,f="width"in t||"height"in t,p=this,d={},h=e.style,g=e.nodeType&&ae(e),v=Y.get(e,"fxshow");for(r in n.queue||(null==(a=S._queueHooks(e,"fx")).unqueued&&(a.unqueued=0,s=a.empty.fire,a.empty.fire=function(){a.unqueued||s()}),a.unqueued++,p.always(function(){p.always(function(){a.unqueued--,S.queue(e,"fx").length||a.empty.fire()})})),t)if(i=t[r],rt.test(i)){if(delete t[r],o=o||"toggle"===i,i===(g?"hide":"show")){if("show"!==i||!v||void 0===v[r])continue;g=!0}d[r]=v&&v[r]||S.style(e,r)}if((u=!S.isEmptyObject(t))||!S.isEmptyObject(d))for(r in f&&1===e.nodeType&&(n.overflow=[h.overflow,h.overflowX,h.overflowY],null==(l=v&&v.display)&&(l=Y.get(e,"display")),"none"===(c=S.css(e,"display"))&&(l?c=l:(le([e],!0),l=e.style.display||l,c=S.css(e,"display"),le([e]))),("inline"===c||"inline-block"===c&&null!=l)&&"none"===S.css(e,"float")&&(u||(p.done(function(){h.display=l}),null==l&&(c=h.display,l="none"===c?"":c)),h.display="inline-block")),n.overflow&&(h.overflow="hidden",p.always(function(){h.overflow=n.overflow[0],h.overflowX=n.overflow[1],h.overflowY=n.overflow[2]})),u=!1,d)u||(v?"hidden"in v&&(g=v.hidden):v=Y.access(e,"fxshow",{display:l}),o&&(v.hidden=!g),g&&le([e],!0),p.done(function(){for(r in g||le([e]),Y.remove(e,"fxshow"),d)S.style(e,r,d[r])})),u=ut(g?v[r]:0,r,p),r in v||(v[r]=u.start,g&&(u.end=u.start,u.start=0))}],prefilter:function(e,t){t?lt.prefilters.unshift(e):lt.prefilters.push(e)}}),S.speed=function(e,t,n){var r=e&&"object"==typeof e?S.extend({},e):{complete:n||!n&&t||m(e)&&e,duration:e,easing:n&&t||t&&!m(t)&&t};return S.fx.off?r.duration=0:"number"!=typeof r.duration&&(r.duration in S.fx.speeds?r.duration=S.fx.speeds[r.duration]:r.duration=S.fx.speeds._default),null!=r.queue&&!0!==r.queue||(r.queue="fx"),r.old=r.complete,r.complete=function(){m(r.old)&&r.old.call(this),r.queue&&S.dequeue(this,r.queue)},r},S.fn.extend({fadeTo:function(e,t,n,r){return this.filter(ae).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(t,e,n,r){var i=S.isEmptyObject(t),o=S.speed(e,n,r),a=function(){var e=lt(this,S.extend({},t),o);(i||Y.get(this,"finish"))&&e.stop(!0)};return a.finish=a,i||!1===o.queue?this.each(a):this.queue(o.queue,a)},stop:function(i,e,o){var a=function(e){var t=e.stop;delete e.stop,t(o)};return"string"!=typeof i&&(o=e,e=i,i=void 0),e&&this.queue(i||"fx",[]),this.each(function(){var e=!0,t=null!=i&&i+"queueHooks",n=S.timers,r=Y.get(this);if(t)r[t]&&r[t].stop&&a(r[t]);else for(t in r)r[t]&&r[t].stop&&it.test(t)&&a(r[t]);for(t=n.length;t--;)n[t].elem!==this||null!=i&&n[t].queue!==i||(n[t].anim.stop(o),e=!1,n.splice(t,1));!e&&o||S.dequeue(this,i)})},finish:function(a){return!1!==a&&(a=a||"fx"),this.each(function(){var e,t=Y.get(this),n=t[a+"queue"],r=t[a+"queueHooks"],i=S.timers,o=n?n.length:0;for(t.finish=!0,S.queue(this,a,[]),r&&r.stop&&r.stop.call(this,!0),e=i.length;e--;)i[e].elem===this&&i[e].queue===a&&(i[e].anim.stop(!0),i.splice(e,1));for(e=0;e<o;e++)n[e]&&n[e].finish&&n[e].finish.call(this);delete t.finish})}}),S.each(["toggle","show","hide"],function(e,r){var i=S.fn[r];S.fn[r]=function(e,t,n){return null==e||"boolean"==typeof e?i.apply(this,arguments):this.animate(st(r,!0),e,t,n)}}),S.each({slideDown:st("show"),slideUp:st("hide"),slideToggle:st("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,r){S.fn[e]=function(e,t,n){return this.animate(r,e,t,n)}}),S.timers=[],S.fx.tick=function(){var e,t=0,n=S.timers;for(Ze=Date.now();t<n.length;t++)(e=n[t])()||n[t]!==e||n.splice(t--,1);n.length||S.fx.stop(),Ze=void 0},S.fx.timer=function(e){S.timers.push(e),S.fx.start()},S.fx.interval=13,S.fx.start=function(){et||(et=!0,ot())},S.fx.stop=function(){et=null},S.fx.speeds={slow:600,fast:200,_default:400},S.fn.delay=function(r,e){return r=S.fx&&S.fx.speeds[r]||r,e=e||"fx",this.queue(e,function(e,t){var n=C.setTimeout(e,r);t.stop=function(){C.clearTimeout(n)}})},tt=E.createElement("input"),nt=E.createElement("select").appendChild(E.createElement("option")),tt.type="checkbox",y.checkOn=""!==tt.value,y.optSelected=nt.selected,(tt=E.createElement("input")).value="t",tt.type="radio",y.radioValue="t"===tt.value;var ct,ft=S.expr.attrHandle;S.fn.extend({attr:function(e,t){return $(this,S.attr,e,t,1<arguments.length)},removeAttr:function(e){return this.each(function(){S.removeAttr(this,e)})}}),S.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?S.prop(e,t,n):(1===o&&S.isXMLDoc(e)||(i=S.attrHooks[t.toLowerCase()]||(S.expr.match.bool.test(t)?ct:void 0)),void 0!==n?null===n?void S.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:null==(r=S.find.attr(e,t))?void 0:r)},attrHooks:{type:{set:function(e,t){if(!y.radioValue&&"radio"===t&&A(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r=0,i=t&&t.match(P);if(i&&1===e.nodeType)while(n=i[r++])e.removeAttribute(n)}}),ct={set:function(e,t,n){return!1===t?S.removeAttr(e,n):e.setAttribute(n,n),n}},S.each(S.expr.match.bool.source.match(/\w+/g),function(e,t){var a=ft[t]||S.find.attr;ft[t]=function(e,t,n){var r,i,o=t.toLowerCase();return n||(i=ft[o],ft[o]=r,r=null!=a(e,t,n)?o:null,ft[o]=i),r}});var pt=/^(?:input|select|textarea|button)$/i,dt=/^(?:a|area)$/i;function ht(e){return(e.match(P)||[]).join(" ")}function gt(e){return e.getAttribute&&e.getAttribute("class")||""}function vt(e){return Array.isArray(e)?e:"string"==typeof e&&e.match(P)||[]}S.fn.extend({prop:function(e,t){return $(this,S.prop,e,t,1<arguments.length)},removeProp:function(e){return this.each(function(){delete this[S.propFix[e]||e]})}}),S.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&S.isXMLDoc(e)||(t=S.propFix[t]||t,i=S.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=S.find.attr(e,"tabindex");return t?parseInt(t,10):pt.test(e.nodeName)||dt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),y.optSelected||(S.propHooks.selected={get:function(e){var t=e.parentNode;return t&&t.parentNode&&t.parentNode.selectedIndex,null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),S.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){S.propFix[this.toLowerCase()]=this}),S.fn.extend({addClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).addClass(t.call(this,e,gt(this)))});if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])r.indexOf(" "+o+" ")<0&&(r+=o+" ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},removeClass:function(t){var e,n,r,i,o,a,s,u=0;if(m(t))return this.each(function(e){S(this).removeClass(t.call(this,e,gt(this)))});if(!arguments.length)return this.attr("class","");if((e=vt(t)).length)while(n=this[u++])if(i=gt(n),r=1===n.nodeType&&" "+ht(i)+" "){a=0;while(o=e[a++])while(-1<r.indexOf(" "+o+" "))r=r.replace(" "+o+" "," ");i!==(s=ht(r))&&n.setAttribute("class",s)}return this},toggleClass:function(i,t){var o=typeof i,a="string"===o||Array.isArray(i);return"boolean"==typeof t&&a?t?this.addClass(i):this.removeClass(i):m(i)?this.each(function(e){S(this).toggleClass(i.call(this,e,gt(this),t),t)}):this.each(function(){var e,t,n,r;if(a){t=0,n=S(this),r=vt(i);while(e=r[t++])n.hasClass(e)?n.removeClass(e):n.addClass(e)}else void 0!==i&&"boolean"!==o||((e=gt(this))&&Y.set(this,"__className__",e),this.setAttribute&&this.setAttribute("class",e||!1===i?"":Y.get(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;t=" "+e+" ";while(n=this[r++])if(1===n.nodeType&&-1<(" "+ht(gt(n))+" ").indexOf(t))return!0;return!1}});var yt=/\r/g;S.fn.extend({val:function(n){var r,e,i,t=this[0];return arguments.length?(i=m(n),this.each(function(e){var t;1===this.nodeType&&(null==(t=i?n.call(this,e,S(this).val()):n)?t="":"number"==typeof t?t+="":Array.isArray(t)&&(t=S.map(t,function(e){return null==e?"":e+""})),(r=S.valHooks[this.type]||S.valHooks[this.nodeName.toLowerCase()])&&"set"in r&&void 0!==r.set(this,t,"value")||(this.value=t))})):t?(r=S.valHooks[t.type]||S.valHooks[t.nodeName.toLowerCase()])&&"get"in r&&void 0!==(e=r.get(t,"value"))?e:"string"==typeof(e=t.value)?e.replace(yt,""):null==e?"":e:void 0}}),S.extend({valHooks:{option:{get:function(e){var t=S.find.attr(e,"value");return null!=t?t:ht(S.text(e))}},select:{get:function(e){var t,n,r,i=e.options,o=e.selectedIndex,a="select-one"===e.type,s=a?null:[],u=a?o+1:i.length;for(r=o<0?u:a?o:0;r<u;r++)if(((n=i[r]).selected||r===o)&&!n.disabled&&(!n.parentNode.disabled||!A(n.parentNode,"optgroup"))){if(t=S(n).val(),a)return t;s.push(t)}return s},set:function(e,t){var n,r,i=e.options,o=S.makeArray(t),a=i.length;while(a--)((r=i[a]).selected=-1<S.inArray(S.valHooks.option.get(r),o))&&(n=!0);return n||(e.selectedIndex=-1),o}}}}),S.each(["radio","checkbox"],function(){S.valHooks[this]={set:function(e,t){if(Array.isArray(t))return e.checked=-1<S.inArray(S(e).val(),t)}},y.checkOn||(S.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})}),y.focusin="onfocusin"in C;var mt=/^(?:focusinfocus|focusoutblur)$/,xt=function(e){e.stopPropagation()};S.extend(S.event,{trigger:function(e,t,n,r){var i,o,a,s,u,l,c,f,p=[n||E],d=v.call(e,"type")?e.type:e,h=v.call(e,"namespace")?e.namespace.split("."):[];if(o=f=a=n=n||E,3!==n.nodeType&&8!==n.nodeType&&!mt.test(d+S.event.triggered)&&(-1<d.indexOf(".")&&(d=(h=d.split(".")).shift(),h.sort()),u=d.indexOf(":")<0&&"on"+d,(e=e[S.expando]?e:new S.Event(d,"object"==typeof e&&e)).isTrigger=r?2:3,e.namespace=h.join("."),e.rnamespace=e.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,e.result=void 0,e.target||(e.target=n),t=null==t?[e]:S.makeArray(t,[e]),c=S.event.special[d]||{},r||!c.trigger||!1!==c.trigger.apply(n,t))){if(!r&&!c.noBubble&&!x(n)){for(s=c.delegateType||d,mt.test(s+d)||(o=o.parentNode);o;o=o.parentNode)p.push(o),a=o;a===(n.ownerDocument||E)&&p.push(a.defaultView||a.parentWindow||C)}i=0;while((o=p[i++])&&!e.isPropagationStopped())f=o,e.type=1<i?s:c.bindType||d,(l=(Y.get(o,"events")||Object.create(null))[e.type]&&Y.get(o,"handle"))&&l.apply(o,t),(l=u&&o[u])&&l.apply&&V(o)&&(e.result=l.apply(o,t),!1===e.result&&e.preventDefault());return e.type=d,r||e.isDefaultPrevented()||c._default&&!1!==c._default.apply(p.pop(),t)||!V(n)||u&&m(n[d])&&!x(n)&&((a=n[u])&&(n[u]=null),S.event.triggered=d,e.isPropagationStopped()&&f.addEventListener(d,xt),n[d](),e.isPropagationStopped()&&f.removeEventListener(d,xt),S.event.triggered=void 0,a&&(n[u]=a)),e.result}},simulate:function(e,t,n){var r=S.extend(new S.Event,n,{type:e,isSimulated:!0});S.event.trigger(r,null,t)}}),S.fn.extend({trigger:function(e,t){return this.each(function(){S.event.trigger(e,t,this)})},triggerHandler:function(e,t){var n=this[0];if(n)return S.event.trigger(e,t,n,!0)}}),y.focusin||S.each({focus:"focusin",blur:"focusout"},function(n,r){var i=function(e){S.event.simulate(r,e.target,S.event.fix(e))};S.event.special[r]={setup:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r);t||e.addEventListener(n,i,!0),Y.access(e,r,(t||0)+1)},teardown:function(){var e=this.ownerDocument||this.document||this,t=Y.access(e,r)-1;t?Y.access(e,r,t):(e.removeEventListener(n,i,!0),Y.remove(e,r))}}});var bt=C.location,wt={guid:Date.now()},Tt=/\?/;S.parseXML=function(e){var t,n;if(!e||"string"!=typeof e)return null;try{t=(new C.DOMParser).parseFromString(e,"text/xml")}catch(e){}return n=t&&t.getElementsByTagName("parsererror")[0],t&&!n||S.error("Invalid XML: "+(n?S.map(n.childNodes,function(e){return e.textContent}).join("\n"):e)),t};var Ct=/\[\]$/,Et=/\r?\n/g,St=/^(?:submit|button|image|reset|file)$/i,kt=/^(?:input|select|textarea|keygen)/i;function At(n,e,r,i){var t;if(Array.isArray(e))S.each(e,function(e,t){r||Ct.test(n)?i(n,t):At(n+"["+("object"==typeof t&&null!=t?e:"")+"]",t,r,i)});else if(r||"object"!==w(e))i(n,e);else for(t in e)At(n+"["+t+"]",e[t],r,i)}S.param=function(e,t){var n,r=[],i=function(e,t){var n=m(t)?t():t;r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(null==n?"":n)};if(null==e)return"";if(Array.isArray(e)||e.jquery&&!S.isPlainObject(e))S.each(e,function(){i(this.name,this.value)});else for(n in e)At(n,e[n],t,i);return r.join("&")},S.fn.extend({serialize:function(){return S.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=S.prop(this,"elements");return e?S.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!S(this).is(":disabled")&&kt.test(this.nodeName)&&!St.test(e)&&(this.checked||!pe.test(e))}).map(function(e,t){var n=S(this).val();return null==n?null:Array.isArray(n)?S.map(n,function(e){return{name:t.name,value:e.replace(Et,"\r\n")}}):{name:t.name,value:n.replace(Et,"\r\n")}}).get()}});var Nt=/%20/g,jt=/#.*$/,Dt=/([?&])_=[^&]*/,qt=/^(.*?):[ \t]*([^\r\n]*)$/gm,Lt=/^(?:GET|HEAD)$/,Ht=/^\/\//,Ot={},Pt={},Rt="*/".concat("*"),Mt=E.createElement("a");function It(o){return function(e,t){"string"!=typeof e&&(t=e,e="*");var n,r=0,i=e.toLowerCase().match(P)||[];if(m(t))while(n=i[r++])"+"===n[0]?(n=n.slice(1)||"*",(o[n]=o[n]||[]).unshift(t)):(o[n]=o[n]||[]).push(t)}}function Wt(t,i,o,a){var s={},u=t===Pt;function l(e){var r;return s[e]=!0,S.each(t[e]||[],function(e,t){var n=t(i,o,a);return"string"!=typeof n||u||s[n]?u?!(r=n):void 0:(i.dataTypes.unshift(n),l(n),!1)}),r}return l(i.dataTypes[0])||!s["*"]&&l("*")}function Ft(e,t){var n,r,i=S.ajaxSettings.flatOptions||{};for(n in t)void 0!==t[n]&&((i[n]?e:r||(r={}))[n]=t[n]);return r&&S.extend(!0,e,r),e}Mt.href=bt.href,S.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:bt.href,type:"GET",isLocal:/^(?:about|app|app-storage|.+-extension|file|res|widget):$/.test(bt.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Rt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":S.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?Ft(Ft(e,S.ajaxSettings),t):Ft(S.ajaxSettings,e)},ajaxPrefilter:It(Ot),ajaxTransport:It(Pt),ajax:function(e,t){"object"==typeof e&&(t=e,e=void 0),t=t||{};var c,f,p,n,d,r,h,g,i,o,v=S.ajaxSetup({},t),y=v.context||v,m=v.context&&(y.nodeType||y.jquery)?S(y):S.event,x=S.Deferred(),b=S.Callbacks("once memory"),w=v.statusCode||{},a={},s={},u="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(h){if(!n){n={};while(t=qt.exec(p))n[t[1].toLowerCase()+" "]=(n[t[1].toLowerCase()+" "]||[]).concat(t[2])}t=n[e.toLowerCase()+" "]}return null==t?null:t.join(", ")},getAllResponseHeaders:function(){return h?p:null},setRequestHeader:function(e,t){return null==h&&(e=s[e.toLowerCase()]=s[e.toLowerCase()]||e,a[e]=t),this},overrideMimeType:function(e){return null==h&&(v.mimeType=e),this},statusCode:function(e){var t;if(e)if(h)T.always(e[T.status]);else for(t in e)w[t]=[w[t],e[t]];return this},abort:function(e){var t=e||u;return c&&c.abort(t),l(0,t),this}};if(x.promise(T),v.url=((e||v.url||bt.href)+"").replace(Ht,bt.protocol+"//"),v.type=t.method||t.type||v.method||v.type,v.dataTypes=(v.dataType||"*").toLowerCase().match(P)||[""],null==v.crossDomain){r=E.createElement("a");try{r.href=v.url,r.href=r.href,v.crossDomain=Mt.protocol+"//"+Mt.host!=r.protocol+"//"+r.host}catch(e){v.crossDomain=!0}}if(v.data&&v.processData&&"string"!=typeof v.data&&(v.data=S.param(v.data,v.traditional)),Wt(Ot,v,t,T),h)return T;for(i in(g=S.event&&v.global)&&0==S.active++&&S.event.trigger("ajaxStart"),v.type=v.type.toUpperCase(),v.hasContent=!Lt.test(v.type),f=v.url.replace(jt,""),v.hasContent?v.data&&v.processData&&0===(v.contentType||"").indexOf("application/x-www-form-urlencoded")&&(v.data=v.data.replace(Nt,"+")):(o=v.url.slice(f.length),v.data&&(v.processData||"string"==typeof v.data)&&(f+=(Tt.test(f)?"&":"?")+v.data,delete v.data),!1===v.cache&&(f=f.replace(Dt,"$1"),o=(Tt.test(f)?"&":"?")+"_="+wt.guid+++o),v.url=f+o),v.ifModified&&(S.lastModified[f]&&T.setRequestHeader("If-Modified-Since",S.lastModified[f]),S.etag[f]&&T.setRequestHeader("If-None-Match",S.etag[f])),(v.data&&v.hasContent&&!1!==v.contentType||t.contentType)&&T.setRequestHeader("Content-Type",v.contentType),T.setRequestHeader("Accept",v.dataTypes[0]&&v.accepts[v.dataTypes[0]]?v.accepts[v.dataTypes[0]]+("*"!==v.dataTypes[0]?", "+Rt+"; q=0.01":""):v.accepts["*"]),v.headers)T.setRequestHeader(i,v.headers[i]);if(v.beforeSend&&(!1===v.beforeSend.call(y,T,v)||h))return T.abort();if(u="abort",b.add(v.complete),T.done(v.success),T.fail(v.error),c=Wt(Pt,v,t,T)){if(T.readyState=1,g&&m.trigger("ajaxSend",[T,v]),h)return T;v.async&&0<v.timeout&&(d=C.setTimeout(function(){T.abort("timeout")},v.timeout));try{h=!1,c.send(a,l)}catch(e){if(h)throw e;l(-1,e)}}else l(-1,"No Transport");function l(e,t,n,r){var i,o,a,s,u,l=t;h||(h=!0,d&&C.clearTimeout(d),c=void 0,p=r||"",T.readyState=0<e?4:0,i=200<=e&&e<300||304===e,n&&(s=function(e,t,n){var r,i,o,a,s=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),void 0===r&&(r=e.mimeType||t.getResponseHeader("Content-Type"));if(r)for(i in s)if(s[i]&&s[i].test(r)){u.unshift(i);break}if(u[0]in n)o=u[0];else{for(i in n){if(!u[0]||e.converters[i+" "+u[0]]){o=i;break}a||(a=i)}o=o||a}if(o)return o!==u[0]&&u.unshift(o),n[o]}(v,T,n)),!i&&-1<S.inArray("script",v.dataTypes)&&S.inArray("json",v.dataTypes)<0&&(v.converters["text script"]=function(){}),s=function(e,t,n,r){var i,o,a,s,u,l={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)l[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!u&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),u=o,o=c.shift())if("*"===o)o=u;else if("*"!==u&&u!==o){if(!(a=l[u+" "+o]||l["* "+o]))for(i in l)if((s=i.split(" "))[1]===o&&(a=l[u+" "+s[0]]||l["* "+s[0]])){!0===a?a=l[i]:!0!==l[i]&&(o=s[0],c.unshift(s[1]));break}if(!0!==a)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(e){return{state:"parsererror",error:a?e:"No conversion from "+u+" to "+o}}}return{state:"success",data:t}}(v,s,T,i),i?(v.ifModified&&((u=T.getResponseHeader("Last-Modified"))&&(S.lastModified[f]=u),(u=T.getResponseHeader("etag"))&&(S.etag[f]=u)),204===e||"HEAD"===v.type?l="nocontent":304===e?l="notmodified":(l=s.state,o=s.data,i=!(a=s.error))):(a=l,!e&&l||(l="error",e<0&&(e=0))),T.status=e,T.statusText=(t||l)+"",i?x.resolveWith(y,[o,l,T]):x.rejectWith(y,[T,l,a]),T.statusCode(w),w=void 0,g&&m.trigger(i?"ajaxSuccess":"ajaxError",[T,v,i?o:a]),b.fireWith(y,[T,l]),g&&(m.trigger("ajaxComplete",[T,v]),--S.active||S.event.trigger("ajaxStop")))}return T},getJSON:function(e,t,n){return S.get(e,t,n,"json")},getScript:function(e,t){return S.get(e,void 0,t,"script")}}),S.each(["get","post"],function(e,i){S[i]=function(e,t,n,r){return m(t)&&(r=r||n,n=t,t=void 0),S.ajax(S.extend({url:e,type:i,dataType:r,data:t,success:n},S.isPlainObject(e)&&e))}}),S.ajaxPrefilter(function(e){var t;for(t in e.headers)"content-type"===t.toLowerCase()&&(e.contentType=e.headers[t]||"")}),S._evalUrl=function(e,t,n){return S.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,converters:{"text script":function(){}},dataFilter:function(e){S.globalEval(e,t,n)}})},S.fn.extend({wrapAll:function(e){var t;return this[0]&&(m(e)&&(e=e.call(this[0])),t=S(e,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstElementChild)e=e.firstElementChild;return e}).append(this)),this},wrapInner:function(n){return m(n)?this.each(function(e){S(this).wrapInner(n.call(this,e))}):this.each(function(){var e=S(this),t=e.contents();t.length?t.wrapAll(n):e.append(n)})},wrap:function(t){var n=m(t);return this.each(function(e){S(this).wrapAll(n?t.call(this,e):t)})},unwrap:function(e){return this.parent(e).not("body").each(function(){S(this).replaceWith(this.childNodes)}),this}}),S.expr.pseudos.hidden=function(e){return!S.expr.pseudos.visible(e)},S.expr.pseudos.visible=function(e){return!!(e.offsetWidth||e.offsetHeight||e.getClientRects().length)},S.ajaxSettings.xhr=function(){try{return new C.XMLHttpRequest}catch(e){}};var Bt={0:200,1223:204},$t=S.ajaxSettings.xhr();y.cors=!!$t&&"withCredentials"in $t,y.ajax=$t=!!$t,S.ajaxTransport(function(i){var o,a;if(y.cors||$t&&!i.crossDomain)return{send:function(e,t){var n,r=i.xhr();if(r.open(i.type,i.url,i.async,i.username,i.password),i.xhrFields)for(n in i.xhrFields)r[n]=i.xhrFields[n];for(n in i.mimeType&&r.overrideMimeType&&r.overrideMimeType(i.mimeType),i.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest"),e)r.setRequestHeader(n,e[n]);o=function(e){return function(){o&&(o=a=r.onload=r.onerror=r.onabort=r.ontimeout=r.onreadystatechange=null,"abort"===e?r.abort():"error"===e?"number"!=typeof r.status?t(0,"error"):t(r.status,r.statusText):t(Bt[r.status]||r.status,r.statusText,"text"!==(r.responseType||"text")||"string"!=typeof r.responseText?{binary:r.response}:{text:r.responseText},r.getAllResponseHeaders()))}},r.onload=o(),a=r.onerror=r.ontimeout=o("error"),void 0!==r.onabort?r.onabort=a:r.onreadystatechange=function(){4===r.readyState&&C.setTimeout(function(){o&&a()})},o=o("abort");try{r.send(i.hasContent&&i.data||null)}catch(e){if(o)throw e}},abort:function(){o&&o()}}}),S.ajaxPrefilter(function(e){e.crossDomain&&(e.contents.script=!1)}),S.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return S.globalEval(e),e}}}),S.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET")}),S.ajaxTransport("script",function(n){var r,i;if(n.crossDomain||n.scriptAttrs)return{send:function(e,t){r=S("<script>").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="<form></form><form></form>",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1<s&&(r=ht(e.slice(s)),e=e.slice(0,s)),m(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),0<a.length&&S.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?S("<div>").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0<arguments.length?this.on(n,null,e,t):this.trigger(n)}});var Xt=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;S.proxy=function(e,t){var n,r,i;if("string"==typeof t&&(n=e[t],t=e,e=n),m(e))return r=s.call(arguments,2),(i=function(){return e.apply(t||this,r.concat(s.call(arguments)))}).guid=e.guid=e.guid||S.guid++,i},S.holdReady=function(e){e?S.readyWait++:S.ready(!0)},S.isArray=Array.isArray,S.parseJSON=JSON.parse,S.nodeName=A,S.isFunction=m,S.isWindow=x,S.camelCase=X,S.type=w,S.now=Date.now,S.isNumeric=function(e){var t=S.type(e);return("number"===t||"string"===t)&&!isNaN(e-parseFloat(e))},S.trim=function(e){return null==e?"":(e+"").replace(Xt,"")},"function"==typeof define&&define.amd&&define("jquery",[],function(){return S});var Vt=C.jQuery,Gt=C.$;return S.noConflict=function(e){return C.$===S&&(C.$=Gt),e&&C.jQuery===S&&(C.jQuery=Vt),S},"undefined"==typeof e&&(C.jQuery=C.$=S),S});
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/css/logout.css b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/css/logout.css
deleted file mode 100644
index 5cd06c1..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/css/logout.css
+++ /dev/null
@@ -1,20 +0,0 @@
-/* Success/Failure indicators for logout propagation. */
-ol li:before {
-    content: ''
-}
-li.logout {
-    line-height: 36px;
-    padding-left: 36px;
-}
-li.logout.success {
-    background: url(../images/success-32x32.png) no-repeat left center;
-}
-li.logout.failure {
-    background: url(../images/failure-32x32.png) no-repeat left center;
-}
-li.logout.pending{
-
-}
-li.logout.na {
-    background: url(../images/failure-32x32.png) no-repeat left center;
-}
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/css/placeholder.css b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/css/placeholder.css
deleted file mode 100644
index c1dbe1c..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/css/placeholder.css
+++ /dev/null
@@ -1,802 +0,0 @@
-/* Colours pallet
-
-To change the colours, use find and replace with the values below:
-
- #ECEFF1 - Body background, header / section border, read only / disabled input fields.
-
- #1534E3 - Links, buttons, list items, selected radio, selected checkbox.
-
- #1A237E - Hover buttons.
-
- #32424A - Body text, input fields border.
- 
- #7A2D00 - Output message.
- 
- #B50024 - Error messages / fields.
- 
- #1C7D40 - Success messages / fields.
- 
- #999999 - read only / disabled input fields.
-
-*/
-
-html, html * {
-  margin: 0;
-  padding: 0;
-  border: 0;
-  font-size: 100%;
-  font: inherit;
-  vertical-align: baseline;
-  box-sizing: border-box;
-  background: none;
-  background-repeat: no-repeat;
-  background-position: left top;
-  border: 0;
-  outline: 0;
-}
-
-html {
-  height: 100%;
-}
-
-/* HTML5 display-role reset for older browsers */
-article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, main {
-  display: block;
-}
-
-/* Default document styles - fonts, font sizes, text colours, font weight */
-body {
-  font-family: Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;
-  font-size: 16px;
-  font-size: 1rem;
-  line-height: 24px;
-  line-height: 1.5rem;
-  color: #32424a;
-  font-weight: 400;
-  max-width: 3000px;
-  margin: 0 auto;
-  background-color: #eceff1;
-  padding: 24px;
-}
-
-/* Links */
-a[href] {
-  text-decoration: none;
-  color: #1534e3;
-}
-
-/* Link hover states */
-a[href]:hover, a[href]:active, a[href]:focus {
-  text-decoration: underline;
-  color: #1534e3;
-}
-
-/* Heading styles */
-h1 {
-  font-size: 24px;
-  font-size: 1.5rem;
-  line-height: 28px;
-  line-height: 1.75rem;
-  font-weight: 700;
-}
-
-h2 {
-  font-size: 20px;
-  font-size: 1.25rem;
-  line-height: 25px;
-  line-height: 1.5rem;
-  font-weight: 400;
-}
-
-h3 {
-  font-size: 16px;
-  font-size: 1rem;
-  line-height: 22px;
-  line-height: 1.375rem;
-  font-weight: 700;
-}
-
-h4 {
-  font-size: 14px;
-  font-size: 0.875rem;
-  line-height: 18px;
-  line-height: 1.125rem;
-  font-weight: 700;
-  margin-bottom: 0.5em;
-}
-
-h5 {
-  font-size: 14px;
-  font-size: 0.875rem;
-  line-height: 18px;
-  line-height: 1.125rem;
-  font-weight: 400;
-}
-
-h1, h2, h3, h4, h5, h6, p {
-  margin-bottom: 1em;
-}
-
-h1:last-child, h2:last-child, h3:last-child, h4:last-child, h5:last-child, h6:last-child, p:last-child {
-  margin-bottom: 0px;
-}
-
-/* List styles */
-ol, ul {
-  list-style: none;
-  margin: 20px 0;
-}
-
-ol:before, ol:after,
-ul:before, ul:after {
-  content: " ";
-  display: table;
-}
-
-ol:after,
-ul:after {
-  clear: both;
-}
-
-ol:last-child,
-ul:last-child {
-  margin-bottom: 0px;
-}
-
-ol:first-child,
-ul:first-child {
-  margin-top: 0px;
-}
-
-ul li {
-  padding-left: 22px;
-  margin-bottom: 4px;
-  position: relative;
-  list-style: none;
-}
-
-ul li:last-child {
-  margin-bottom: 0px;
-}
-
-ul li:before {
-  content: '';
-  -webkit-border-radius: 2px;
-  -ms-border-radius: 2px;
-  -moz-border-radius: 2px;
-  -o-border-radius: 2px;
-  border-radius: 2px;
-  background-color: #1534e3;
-  height: 7px;
-  width: 7px;
-  display: block;
-  position: absolute;
-  left: 0;
-  top: 7px;
-}
-
-ol {
-  counter-reset: item;
-}
-
-ol li {
-  padding-left: 22px;
-  margin-bottom: 10px;
-  position: relative;
-  list-style: none;
-}
-
-ol li:last-child {
-  margin-bottom: 0px;
-}
-
-ol li:before {
-  color: #1534e3;
-  position: absolute;
-  left: 0;
-  content: counter(item) ". ";
-  counter-increment: item;
-  font-weight: 700;
-  top: 1px;
-}
-
-ol li:nth-child(n+10) {
-  padding-left: 30px;
-}
-
-ol li:nth-child(n+100) {
-  padding-left: 38px;
-}
-
-hr {
-  width: 100%;
-  clear: both;
-  border: 0;
-  outline: 0;
-  background-color: #eceff1;
-  height: 1px;
-  display: block;
-  margin: 30px 0;
-}
-
-b, strong {
-  font-weight: 700;
-}
-
-i, em {
-  font-style: italic;
-}
-
-small {
-  font-size: 0.8em;
-}
-
-big {
-  font-size: 1.2em;
-}
-
-.cc {
-  clear: both;
-  margin: 0 auto;
-  width: 100%;
-  max-width: 649px;
-  padding: 0 0;
-}
-
-.cc:before, .cc:after {
-  content: " ";
-  display: table;
-}
-
-.cc:after {
-  clear: both;
-}
-
-img {
-  max-width: 100%;
-  height: auto;
-}
-
-/* Main content area */
-main {
-  clear: both;
-  margin: 0 auto;
-  width: 100%;
-  max-width: 800px;
-  background-color: #fff;
-  -webkit-border-radius: 8px;
-  -ms-border-radius: 8px;
-  -moz-border-radius: 8px;
-  -o-border-radius: 8px;
-  border-radius: 8px;
-  -webkit-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -ms-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -moz-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -o-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-}
-
-/* Add a border top when 2 sections are together */
-main section + section {
-  border-top: 1px solid #eceff1;
-}
-
-/* Header */
-header {
-  display: block; /* Change to display: none to hide */
-  border-bottom: 1px solid #eceff1;
-  text-align: center;
-  padding: 6% 8%;
-}
-
-header .main-logo {
-  display: block;
-  margin: 0 auto;
-}
-
-.service-logo {
-	display: block;
-	margin: 24px 0;
-}
-
-section {
-  padding: 4% 8% 4% 8%;
-}
-
-/* Output Messages */
-.output-message {
-  font-size: 14px;
-  font-size: 0.875rem;
-  line-height: 18px;
-  line-height: 1.125rem;
-  font-style: italic;
-  -webkit-border-radius: 4px;
-  -ms-border-radius: 4px;
-  -moz-border-radius: 4px;
-  -o-border-radius: 4px;
-  border-radius: 4px;
-  background-color: #FFD8C2;
-  display: block;
-  padding: 4%;
-  margin-bottom: 20px;
-  color: #7A2D00;
-}
-
-.output-message:last-child {
-  margin-bottom: 0px;
-}
-
-/* Output Message Success */
-.output-message.output--success {
-  background-color: #DCF9E7;
-  color: #1C7D40;
-}
-
-/* Output Message Error */
-.output-message.output--error {
-  background-color: #FFF0F3;
-  color: #B50024;
-}
-
-.boxed {
-  -webkit-border-radius: 4px;
-  -ms-border-radius: 4px;
-  -moz-border-radius: 4px;
-  -o-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -ms-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -moz-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  -o-box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  box-shadow: 0px 0px 10px 0px rgba(38, 50, 56, 0.11);
-  background-color: #fff;
-  padding: 6%;
-  margin: 30px 0;
-}
-
-.boxed:last-child {
-  margin-bottom: 0px;
-}
-
-.boxed:first-child {
-  margin-top: 0px;
-}
-
-/* Footer style */
-footer {
-  z-index: 1;
-  position: relative;
-  text-align: center;
-  margin-top: 20px;
-  font-size: 12px;
-  font-size: 0.75rem;
-  line-height: 16px;
-  line-height: 1rem;
-}
-
-/* Forms styles */
-fieldset {
-  display: block;
-  margin-bottom: 20px;
-}
-
-fieldset:last-child {
-  margin-bottom: 0px;
-}
-
-fieldset .field-validation {
-  display: block;
-  margin-top: 10px;
-}
-
-fieldset .error {
-  color: #B50024;
-}
-
-fieldset legend span {
-  display: block;
-  text-indent: 100%;
-  white-space: nowrap;
-  overflow: hidden;
-  height: 0;
-}
-
-/* Form labels */
-label {
-  vertical-align: top;
-  font-size: 14px;
-  font-size: 0.875rem;
-  line-height: 18px;
-  line-height: 1.125rem;
-  font-weight: 700;
-  display: block;
-  color: #32424a;
-  margin-bottom: 6px;
-}
-
-label:focus {
-  color: #1534E3;
-}
-
-/* Form input fields */
-input[type="text"], 
-input[type="email"], 
-input[type="password"], 
-input[type="telephone"], 
-input[type="tel"], 
-input[type="url"], 
-textarea, 
-select {
-  background-color: #fff;
-  border: 2px solid #32424a;
-  -webkit-transition: all 0.3s ease-in-out;
-  -moz-transition: all 0.3s ease-in-out;
-  -ms-transition: all 0.3s ease-in-out;
-  -o-transition: all 0.3s ease-in-out;
-  transition: all 0.3s ease-in-out;
-  color: #32424a;
-  padding: 13px 20px;
-  display: block;
-  width: 100%;
-  -webkit-appearance: none;
-  -ms-appearance: none;
-  -moz-appearance: none;
-  -o-appearance: none;
-  appearance: none;
-  -webkit-border-radius: 4px;
-  -ms-border-radius: 4px;
-  -moz-border-radius: 4px;
-  -o-border-radius: 4px;
-  border-radius: 4px;
-}
-
-/* Form input focus */
-input[type="text"]:focus, 
-input[type="email"]:focus, 
-input[type="password"]:focus, 
-input[type="telephone"]:focus, 
-input[type="tel"]:focus, 
-input[type="url"]:focus, 
-textarea:focus, 
-select:focus,
-input[type="text"]:active, 
-input[type="email"]:active, 
-input[type="password"]:active, 
-input[type="telephone"]:active, 
-input[type="tel"]:active, 
-input[type="url"]:active, 
-textarea:active, 
-select:active {
-  border-color: #1534e3;
-  background-color: #fff;
-}
-
-/* Form input errors */
-input[type="text"].error, 
-input[type="email"].error, 
-input[type="password"].error, 
-input[type="telephone"].error, 
-input[type="tel"].error, 
-input[type="url"].error, 
-textarea.error, 
-select.error {
-  border-color: #B50024;
-}
-
-/* Form input read only / disabled */
-input[type="text"]:read-only, 
-input[type="email"]:read-only, 
-input[type="password"]:read-only, 
-input[type="telephone"]:read-only,
-input[type="tel"]:read-only, 
-input[type="url"]:read-only, 
-textarea:read-only, 
-select:read-only, 
-input[type="text"]:disabled, 
-input[type="email"]:disabled, 
-input[type="password"]:disabled, 
-input[type="telephone"]:disabled, 
-input[type="tel"]:disabled, 
-input[type="url"]:disabled, 
-textarea:disabled, 
-select:disabled {
-  background-color: #ECEFF1;
-  pointer-events: none;
-}
-
-/* Text areas */
-textarea {
-  height: 124px;
-  resize: none;
-}
-
-
-/* Dropdowns */
-select {
-  -webkit-appearance: auto;
-  -ms-appearance: auto;
-  -moz-appearance: auto;
-  -o-appearance: auto;
-  appearance: auto;
-}
-
-select:read-only {
-  background-color: #fff;
-  pointer-events: unset;
-}
-
-select::-ms-expand {
-  display: none;
-}
-
-/* Checkboxes / Radio buttons */
-input[type="checkbox"], input[type="radio"] {
-  position : absolute;
-  opacity: 0;
-  height: 0;
-  width: 0;
-}
-
-input[type="checkbox"] + label, input[type="radio"] + label {
-  display: block;
-  font-weight: 400;
-  font-size: 16px;
-  font-size: 1rem;
-  line-height: 24px;
-  line-height: 1.5rem;
-  cursor: pointer;
-  position: relative;
-  padding-left: 30px;
-  padding-top: 3px;
-  margin-bottom: 4px;
-  margin-right: 12px;
-  display: inline-block;
-}
-
-input[type="checkbox"] + label:before, input[type="radio"] + label:before {
-  content: "";
-  position: absolute;
-  top: 2px;
-  left: 0;
-  height: 20px;
-  width: 20px;
-  background-color: #fff;
-  border: 2px solid #32424a;
-  -webkit-transition: all 0.2s ease-out;
-  -ms-transition: all 0.2s ease-out;
-  -moz-transition: all 0.2s ease-out;
-  -o-transition: all 0.2s ease-out;
-  transition: all 0.2s ease-out;
-}
-
-input[type="checkbox"] + label:after, input[type="radio"] + label:after {
-  content: "";
-  position: absolute;
-  -webkit-transform: rotate(45deg);
-  -ms-transform: rotate(45deg);
-  -moz-transform: rotate(45deg);
-  -o-transform: rotate(45deg);
-  transform: rotate(45deg);
-  display: none;
-}
-
-input[type="checkbox"]:checked + label, input[type="radio"]:checked + label,
-input[type="checkbox"]:focus + label, input[type="radio"]:focus + label {
-  color: #1534e3;
-}
-
-input[type="checkbox"]:checked + label:before, input[type="radio"]:checked + label:before,
-input[type="checkbox"]:focus + label:before, input[type="radio"]:focus + label:before {
-  border-color: #1534e3;
-}
-
-input[type="checkbox"]:checked + label:after, input[type="radio"]:checked + label:after {
-  display: block;
-}
-
-input[type="checkbox"] + label:before {
-  -webkit-border-radius: 4px;
-  -ms-border-radius: 4px;
-  -moz-border-radius: 4px;
-  -o-border-radius: 4px;
-  border-radius: 4px;
-}
-
-input[type="checkbox"] + label:after {
-  left: 8px;
-  top: 5px;
-  width: 4px;
-  height: 10px;
-  border: solid #1534e3;
-  border-width: 0 4px 4px 0;
-}
-
-input[type="radio"] + label:before {
-  -webkit-border-radius: 100%;
-  -ms-border-radius: 100%;
-  -moz-border-radius: 100%;
-  -o-border-radius: 100%;
-  border-radius: 100%;
-}
-
-input[type="radio"] + label:after {
-  background-color: #1534e3;
-  height: 12px;
-  width: 12px;
-  -webkit-border-radius: 100%;
-  -ms-border-radius: 100%;
-  -moz-border-radius: 100%;
-  -o-border-radius: 100%;
-  border-radius: 100%;
-  left: 6px;
-  top: 8px;
-}
-
-/* Buttons / Submit buttons */
-button, input[type=button], 
-input[type=submit], 
-a.button, 
-.button {
-  display: inline-block;
-  text-align: center;
-  background-color: #1534e3;
-  border: 4px solid #1534e3;
-  font-weight: 700;
-  padding: 11px 74px;
-  cursor: pointer;
-  color: #fff;
-  -webkit-appearance: none;
-  -ms-appearance: none;
-  -moz-appearance: none;
-  -o-appearance: none;
-  appearance: none;
-  -webkit-border-radius: 4px;
-  -ms-border-radius: 4px;
-  -moz-border-radius: 4px;
-  -o-border-radius: 4px;
-  border-radius: 4px;
-  -webkit-transition: all 0.2s ease-out;
-  -ms-transition: all 0.2s ease-out;
-  -moz-transition: all 0.2s ease-out;
-  -o-transition: all 0.2s ease-out;
-  transition: all 0.2s ease-out;
-}
-
-/* Button hover & focus states */
-button:hover, 
-input[type=button]:hover, 
-input[type=submit]:hover, 
-a.button:hover, 
-.button:hover, 
-button:focus, 
-input[type=button]:focus, 
-input[type=submit]:focus, 
-a.button:focus, 
-.button:focus {
-  background: #1a237e;
-  color: #fff !important;
-  text-decoration: none !important;
-  border-color: #1a237e;
-}
-
-/* Secondary button styles */
-button.button--secondary, 
-input[type=button].button--secondary, 
-input[type=submit].button--secondary, 
-a.button.button--secondary, 
-.button.button--secondary {
-  background-color: transparent;
-  border-color: #1534e3;
-  color: #1534e3;
-}
-
-/* Secondary button hover & focus states */
-button.button--secondary:hover, 
-input[type=button].button--secondary:hover, 
-input[type=submit].button--secondary:hover, 
-a.button.button--secondary:hover, 
-.button.button--secondary:hover,
-button.button--secondary:focus, 
-input[type=button].button--secondary:focus, 
-input[type=submit].button--secondary:focus, 
-a.button.button--secondary:focus, 
-.button.button--secondary:focus {
-  background: #1a237e;
-  border-color: #1a237e;
-}
-
-/* Secondary button disabled states */
-button.button--secondary:disabled, 
-input[type=button].button--secondary:disabled, 
-input[type=submit].button--secondary:disabled, 
-a.button.button--secondary:disabled, 
-.button.button--secondary:disabled {
-  background-color: transparent;
-  color: #999999;
-}
-
-/* Full width buttons */
-button.button--full, 
-input[type=button].button--full, 
-input[type=submit].button--full, 
-a.button.button--full, 
-.button.button--full {
-  width: 100%;
-  padding-left: 30px;
-  padding-right: 30px;
-}
-
-/* Button disabled states */
-button:disabled, 
-input[type=button]:disabled, 
-input[type=submit]:disabled, 
-a.button:disabled, 
-.button:disabled {
-  pointer-events: none;
-  background-color: #999999;
-  border-color: #999999;
-}
-
-/* Placeholder styles */
-::-webkit-input-placeholder {
-  color: #a9b0b4;
-}
-
-:-moz-placeholder {
-  color: #a9b0b4;
-}
-
-::-moz-placeholder {
-  color: #a9b0b4;
-}
-
-:-ms-input-placeholder {
-  color: #a9b0b4;
-}
-
-.grid {
-  margin-top: 12px;
-}
-
-/* Grid (used for 2 columns) */
-.grid:before, .grid:after {
-  content: " ";
-  display: table;
-}
-
-.grid:after {
-  clear: both;
-}
-
-.grid > .grid-item {
-  margin-bottom: 18px;
-  min-height: 1px;
-  width: 100%;
-}
-
-.grid:last-child > .item:last-child {
-  margin-bottom: 0px;
-}
-
-@media screen and (min-width: 760px) {
-	
-  .grid.md-2 > .grid-item {
-    float: left;
-    width: 48.34436%;
-    margin-right: 3.31126%;
-  }
-  
-  .grid.md-2 > .grid-item:nth-child(n), .grid.md-2 > .grid-item:nth-of-type(n) {
-    margin-right: 3.31126%;
-    clear: none;
-  }
-  
-  .grid.md-2 > .grid-item:nth-child(2n) {
-    margin-right: 0;
-  }
-  
-  .grid.md-2 > .grid-item:nth-child(2n+1) {
-    clear: both;
-  }
-  
-}
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/images/failure-32x32.png b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/images/failure-32x32.png
deleted file mode 100644
index 3c48e46..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/images/failure-32x32.png and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/images/placeholder-logo.png b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/images/placeholder-logo.png
deleted file mode 100644
index f5807ed..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/images/placeholder-logo.png and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/images/success-32x32.png b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/images/success-32x32.png
deleted file mode 100644
index aa51204..0000000
Binary files a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/edit-webapp/images/success-32x32.png and /dev/null differ
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/account-locked/account-locked-flow.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/account-locked/account-locked-flow.xml
deleted file mode 100644
index 5fe7523..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/account-locked/account-locked-flow.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<flow xmlns="http://www.springframework.org/schema/webflow"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow.xsd">
-
-    <!-- This is a placeholder flow that does nothing out of the box but reserves a subflow ID. -->
-
-    <!-- Rudimentary impediment to direct execution of subflow. -->
-    <input name="calledAsSubflow" type="boolean" required="true" />
-
-    <on-start>
-        <evaluate expression="'proceed'" />
-    </on-start>    
-
-    <end-state id="proceed" />
-
-</flow>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/conditions-flow.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/conditions-flow.xml
deleted file mode 100644
index 53c4994..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/conditions-flow.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<flow xmlns="http://www.springframework.org/schema/webflow"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow.xsd"
-      abstract="true">
-
-    <!-- Rudimentary impediment to direct execution of subflow. -->
-    <input name="calledAsSubflow" type="boolean" required="true" />
-
-    <action-state id="ValidateUsernamePassword">
-        
-        <!-- Call outs for exceptional conditions. -->
-        <transition on="AccountWarning" to="CallExpiringPassword" />
-        <transition on="ExpiringPassword" to="CallExpiringPassword" />
-        <transition on="ExpiredPassword" to="CallExpiredPassword" />
-        <transition on="AccountLocked" to="CallAccountLocked" />
-        
-        <transition to="DisplayUsernamePasswordPage" />
-    </action-state>
-
-    <subflow-state id="CallExpiringPassword" subflow="authn/conditions/expiring-password">
-        <input name="calledAsSubflow" value="true" />
-        <transition on="proceed" to="ContinueSuccessfulAuthentication" />
-    </subflow-state>
-
-    <subflow-state id="CallExpiredPassword" subflow="authn/conditions/expired-password">
-        <input name="calledAsSubflow" value="true" />
-        <transition on="proceed" to="DisplayUsernamePasswordPage" />
-    </subflow-state>
-
-    <subflow-state id="CallAccountLocked" subflow="authn/conditions/account-locked">
-        <input name="calledAsSubflow" value="true" />
-        <transition on="proceed" to="DisplayUsernamePasswordPage" />
-    </subflow-state>
-
-</flow>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/expired-password/expired-password-flow.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/expired-password/expired-password-flow.xml
deleted file mode 100644
index 5fe7523..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/expired-password/expired-password-flow.xml
+++ /dev/null
@@ -1,16 +0,0 @@
-<flow xmlns="http://www.springframework.org/schema/webflow"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow.xsd">
-
-    <!-- This is a placeholder flow that does nothing out of the box but reserves a subflow ID. -->
-
-    <!-- Rudimentary impediment to direct execution of subflow. -->
-    <input name="calledAsSubflow" type="boolean" required="true" />
-
-    <on-start>
-        <evaluate expression="'proceed'" />
-    </on-start>    
-
-    <end-state id="proceed" />
-
-</flow>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/expiring-password/expiring-password-flow.xml b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/expiring-password/expiring-password-flow.xml
deleted file mode 100644
index 75bb86a..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/flows/authn/conditions/expiring-password/expiring-password-flow.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<flow xmlns="http://www.springframework.org/schema/webflow"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow.xsd">
-
-    <!--
-    This is an example flow that displays a view template in response to an expiring password.
-    The view might display a pointer to the password change portal while automatically continuing
-    after a few seconds.
-    -->
-
-    <!-- Rudimentary impediment to direct execution of subflow. -->
-    <input name="calledAsSubflow" type="boolean" required="true" />
-
-    <view-state id="ExpiringPassword" view="intercept/expiring-password">
-    	<attribute name="csrf_excluded" value="true" type="boolean"/>
-        <on-render>
-            <evaluate expression="environment" result="viewScope.environment" />
-            <evaluate expression="opensamlProfileRequestContext" result="viewScope.profileRequestContext" />
-            <evaluate expression="opensamlProfileRequestContext.getSubcontext(T(net.shibboleth.idp.authn.context.AuthenticationContext))" result="viewScope.authenticationContext" />
-            <evaluate expression="authenticationContext.getSubcontext(T(net.shibboleth.idp.authn.context.AuthenticationErrorContext))" result="viewScope.authenticationErrorContext" />
-            <evaluate expression="authenticationContext.getSubcontext(T(net.shibboleth.idp.authn.context.AuthenticationWarningContext))" result="viewScope.authenticationWarningContext" />
-            <evaluate expression="authenticationContext.getSubcontext(T(net.shibboleth.idp.authn.context.LDAPResponseContext))" result="viewScope.ldapResponseContext" />
-            <evaluate expression="T(net.shibboleth.shared.codec.HTMLEncoder)" result="viewScope.encoder" />
-            <evaluate expression="flowRequestContext.getExternalContext().getNativeRequest()" result="viewScope.request" />
-            <evaluate expression="flowRequestContext.getExternalContext().getNativeResponse()" result="viewScope.response" />
-            <evaluate expression="flowRequestContext.getActiveFlow().getApplicationContext().containsBean('shibboleth.CustomViewContext') ? flowRequestContext.getActiveFlow().getApplicationContext().getBean('shibboleth.CustomViewContext') : null" result="viewScope.custom" />
-        </on-render>
-        <transition on="proceed" to="proceed" />
-    </view-state>
-
-    <end-state id="proceed" />
-
-</flow>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/messages/messages.properties b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/messages/messages.properties
deleted file mode 100644
index b59fc89..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/messages/messages.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-# You can define message properties here to override messages defined in
-# the system-supplied message file or to add your own messages.
-
-# You should alter these to point to different files of your own choosing.
-#idp.css = /css/placeholder.css
-#idp.logo = /images/placeholder-logo.png
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/admin/hello.vm b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/admin/hello.vm
deleted file mode 100644
index 6268c6c..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/admin/hello.vm
+++ /dev/null
@@ -1,68 +0,0 @@
-##
-## Velocity Template for Hello World page.
-##
-## Velocity context will contain the following properties
-## flowRequestContext - the Spring Web Flow RequestContext
-## encoder - HTMLEncoder class
-## request - HttpServletRequest
-## response - HttpServletResponse
-## profileRequestContext - root of context tree
-## subjectContext - ProfileRequestContext -> SubjectContext
-## attributeContext - ProfileRequestContext -> AttributeContext
-## environment - Spring Environment object for property resolution
-## custom - arbitrary object injected by deployer
-##
-<!DOCTYPE html>
-<html>
-    <head>
-        <title>#springMessageText("idp.title", "Web Login Service") - #springMessageText("hello-world.title", "Hello World")</title>
-        <meta charset="UTF-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        <link rel="stylesheet" type="text/css" href="$request.getContextPath()#springMessageText("idp.css", "/css/placeholder.css")" media="all">
-    </head>
-  
-    <body>
-        <main class="main">
-            <header>
-                <img class="main-logo" src="$request.getContextPath()#springMessageText("idp.logo", "/images/placeholder-logo.png")" alt="#springMessageText("idp.logo.alt-text", "logo")">
-            </header>
-                
-            <section>
-                <h1>#springMessageText("hello-world.greeting", "Greetings"), <em>$encoder.encodeForHTML($subjectContext.getPrincipalName())</em></h1>
-                <p><strong>Authenticated by</strong><br />
-                  #foreach ($result in $subjectContext.getAuthenticationResults().entrySet())
-                   <small>$encoder.encodeForHTML($result.getKey())</small><br/>
-                  #end</p>
-                  
-                <p><strong>Java Principals in Subjects</strong><br/>
-                #foreach ($s in $subjectContext.getSubjects())
-                    #foreach ($p in $s.getPrincipals())
-                      <small>$encoder.encodeForHTML($p)</small></br/>
-                    #end
-                  #end</p>
-                
-                #if ($attributeContext && !$attributeContext.getUnfilteredIdPAttributes().isEmpty())
-
-                    <p><strong>Attributes</strong><br/>
-                        #foreach ($a in $attributeContext.getUnfilteredIdPAttributes())
-                          #if (!$a.getValues().isEmpty())
-                            <small><strong>$encoder.encodeForHTML($a.getId())</strong></small><br/>
-                              #foreach ($v in $a.getValues())
-                                <small>$encoder.encodeForHTML($v.getDisplayValue())</small><br/>
-                              #end
-                          #end
-                        #end
-                      #end
-                    </p>
-                    
-                <a class="button button--secondary" href="$request.getContextPath()/profile/admin/hello">#springMessageText("hello-world.reload", "Reload the Page")</a>
-            </section>
-        </main>
-        <footer class="footer">
-            <div class="cc">
-                <p>#springMessageText("idp.footer", "Insert your footer text here.")</p>
-            </div>
-        </footer>
-    </body>
-</html>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/client-storage/client-storage-read.vm b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/client-storage/client-storage-read.vm
deleted file mode 100644
index 1afe818..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/client-storage/client-storage-read.vm
+++ /dev/null
@@ -1,48 +0,0 @@
-##
-## Velocity template to read from local storage.
-##
-## Velocity context will contain the following properties
-## flowExecutionUrl - the form action location
-## flowRequestContext - the Spring Web Flow RequestContext
-## flowExecutionKey - the SWF execution key (this is built into the flowExecutionUrl)
-## profileRequestContext - root of context tree
-## loadContext - context with details about the storage keys to load
-## encoder - HTMLEncoder class
-## request - HttpServletRequest
-## response - HttpServletResponse
-## environment - Spring Environment object for property resolution
-#set ($title = $springMacroRequestContext.getMessage("idp.title", "Web Login Service"))
-#set ($titleSuffix = $springMacroRequestContext.getMessage("idp.client-storage-read.suffix", "Loading Session Information"))
-##
-<!DOCTYPE html>
-<html>
-    <head>
-        <title>$title - $titleSuffix</title>
-        <meta charset="UTF-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        <link rel="stylesheet" type="text/css" href="$request.getContextPath()#springMessageText("idp.css", "/css/placeholder.css")">
-        <script>
-        <!--
-        #include("client-storage/local-storage-read.js")
-        // -->
-        </script>
-    </head>
-    <body onload="doLoad()">        
-        <main class="main">
-            <section>
-                <h1>$title - $titleSuffix</h1>
-                <p>$springMacroRequestContext.getMessage("idp.client-storage-read.text", "Loading login session information from the browser...")</p>
-                <noscript>
-                    $springMacroRequestContext.getMessage("idp.client-storage.no-js", "Since your browser does not support JavaScript, you must press the Continue button once to proceed.")
-                </noscript>
-                #parse("client-storage/read.vm")
-            </section>
-        </main>
-        <footer class="footer">
-            <div class="cc">
-                <p>#springMessageText("idp.footer", "Insert your footer text here.")</p>
-            </div>
-        </footer>
-    </body>
-</html>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/client-storage/client-storage-write.vm b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/client-storage/client-storage-write.vm
deleted file mode 100644
index 066cbdb..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/client-storage/client-storage-write.vm
+++ /dev/null
@@ -1,50 +0,0 @@
-##
-## Velocity template to write to local storage.
-##
-## Velocity context will contain the following properties
-## flowExecutionUrl - the form action location
-## flowRequestContext - the Spring Web Flow RequestContext
-## flowExecutionKey - the SWF execution key (this is built into the flowExecutionUrl)
-## profileRequestContext - root of context tree
-## saveContext - context with details about the storage data to save
-## encoder - HTMLEncoder class
-## request - HttpServletRequest
-## response - HttpServletResponse
-## environment - Spring Environment object for property resolution
-#set ($title = $springMacroRequestContext.getMessage("idp.title", "Web Login Service"))
-#set ($titleSuffix = $springMacroRequestContext.getMessage("idp.client-storage-write.suffix", "Saving Session Information..."))
-##
-<!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
-    <head>
-        <title>$title - $titleSuffix</title>
-        <meta charset="UTF-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        <link rel="stylesheet" type="text/css" href="$request.getContextPath()#springMessageText("idp.css", "/css/placeholder.css")">
-        <script>
-        <!--
-        #include("client-storage/local-storage-write.js")
-        // -->
-        </script>
-    </head>
-    <body onload="doSave()">    
-        <main class="main">
-            <section>
-                <h1>$title - $titleSuffix</h1>
-                <p>$springMacroRequestContext.getMessage("idp.client-storage-write.text", "Saving login session information to the browser...")</p>
-                <noscript>
-                    <div class="content">
-                    $springMacroRequestContext.getMessage("idp.client-storage.no-js", "Since your browser does not support JavaScript, you must press the Continue button once to proceed.")
-                    </div>
-                </noscript>
-                #parse("client-storage/write.vm")
-            </section>
-        </main>
-        <footer class="footer">
-            <div class="cc">
-                <p>#springMessageText("idp.footer", "Insert your footer text here.")</p>
-            </div>
-        </footer>
-    </body>
-</html>
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/error.vm b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/error.vm
deleted file mode 100644
index 0f01e89..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/error.vm
+++ /dev/null
@@ -1,74 +0,0 @@
-##
-## Velocity Template for error end-state
-##
-## Velocity context will contain the following variables during controlled errors.
-## Some error paths involve runtime exceptions handled outside Spring Web Flow by the
-## MVC layer and will not generally populate most of these variables.
-##
-## flowRequestContext - the Spring Web Flow RequestContext
-## profileRequestContext - root of context tree
-## encoder - HTMLEncoder class
-## request - HttpServletRequest
-## response - HttpServletResponse
-## environment - Spring Environment object for property resolution
-## custom - arbitrary object injected by deployer
-##
-#set ($title = $springMacroRequestContext.getMessage("idp.title", "Web Login Service"))
-#set ($defaultTitleSuffix = $springMacroRequestContext.getMessage("idp.title.suffix", "Error"))
-##
-#if ($flowRequestContext)
-	## This handles flow events, the most common case.
-    #set ($eventId = $flowRequestContext.getCurrentEvent().getId())
-    #set ($eventKey = $springMacroRequestContext.getMessage("$eventId", "error"))
-    #set ($titleSuffix = $springMacroRequestContext.getMessage("${eventKey}.title", "$defaultTitleSuffix"))
-    #set ($message = $springMacroRequestContext.getMessage("${eventKey}.message", "$defaultTitleSuffix: $eventId"))
-    #if ($eventId == "AccessDenied" or $eventId == "ContextCheckDenied")
-        $response.setStatus(403)
-    #elseif ($eventId == "AttributeReleaseRejected" || $eventId == "TermsRejected")
-        $response.setStatus(200)
-    #elseif ($eventKey == "unexpected" || $eventKey == "runtime-error" || $eventKey == "error")
-        $response.setStatus(500)
-    #else
-        $response.setStatus(400)
-    #end
-#elseif ($exception)
-	## This handles exceptions that reach the Spring-MVC exception handler.
-    #set ($eventId = $exception.getClass().getSimpleName())
-    #set ($eventKey = $springMacroRequestContext.getMessage("$eventId", "error"))
-    #set ($titleSuffix = $springMacroRequestContext.getMessage("${eventKey}.title", "$defaultTitleSuffix"))
-    #set ($message = $springMacroRequestContext.getMessage("${eventKey}.message", "$defaultTitleSuffix: $eventId"))
-    $response.setStatus(500)
-#else
-	## This is a catch-all that theoretically shouldn't happen?
-    #set ($titleSuffix = $defaultTitleSuffix)
-    #set ($message = $springMacroRequestContext.getMessage("idp.message", "An unidentified error occurred."))
-    $response.setStatus(500)
-#end
-##
-<!DOCTYPE html>
-<html>
-    <head>
-        <meta charset="UTF-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        <link rel="stylesheet" type="text/css" href="$request.getContextPath()#springMessageText("idp.css", "/css/placeholder.css")">
-    </head>
-  	
-    <body>
-        <main class="main">
-            <header>
-                <img class="main-logo" src="$request.getContextPath()#springMessageText("idp.logo", "/images/placeholder-logo.png")" alt="#springMessageText("idp.logo.alt-text", "logo")" />
-            </header>
-            
-            <section>
-                <h1>$title - $titleSuffix</h1>
-                <p>#evaluate($message)</p>
-            </section>
-        </main>
-        <footer class="footer">
-            <div class="cc">
-                <p>#springMessageText("idp.footer", "Insert your footer text here.")</p>
-            </div>
-        </footer>
-    </body>
-</html>
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/login-error.vm b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/login-error.vm
deleted file mode 100644
index 4a9e641..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/login-error.vm
+++ /dev/null
@@ -1,24 +0,0 @@
-## Velocity Template for login error message production, included by login.vm
-##
-## authenticationErrorContext - context containing error data, if available
-##
-#if ($authenticationErrorContext && $authenticationErrorContext.getClassifiedErrors().size() > 0 && !$authenticationErrorContext.getClassifiedErrors().contains('AuthenticationException'))
-    ## This handles errors that are classified by the message maps in the authentication config.
-    #set ($eventId = $authenticationErrorContext.getClassifiedErrors().iterator().next())
-    #if ($eventId != "ReselectFlow")
-        #set ($eventKey = $springMacroRequestContext.getMessage("$eventId", "authn"))
-        #set ($message = $springMacroRequestContext.getMessage("${eventKey}.message", "Login Failure: $eventId"))
-    #end
-#elseif ($authenticationErrorContext && $authenticationErrorContext.getExceptions().size() > 0)
-    ## This handles login exceptions that are left unclassified.
-    #set ($loginException = $authenticationErrorContext.getExceptions().get(0))
-    #if ($loginException.getMessage())
-        #set ($message = "Login Failure: $loginException.getMessage()")
-    #else
-    	#set ($message = $loginException.toString())
-    #end
-#end
-
-#if ($message)
-    <p class="output-message output--error">$encoder.encodeForHTML($message)</p>
-#end
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/login.vm b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/login.vm
deleted file mode 100644
index 20ed38e..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/login.vm
+++ /dev/null
@@ -1,106 +0,0 @@
-##
-## Velocity Template for DisplayUsernamePasswordPage view-state
-##
-## Velocity context will contain the following properties
-## flowExecutionUrl - the form action location
-## flowRequestContext - the Spring Web Flow RequestContext
-## flowExecutionKey - the SWF execution key (this is built into the flowExecutionUrl)
-## profileRequestContext - root of context tree
-## authenticationContext - context with authentication request information
-## authenticationErrorContext - context with login error state
-## authenticationWarningContext - context with login warning state
-## ldapResponseContext - context with LDAP state (if using native LDAP)
-## rpUIContext - the context with SP UI information from the metadata
-## encoder - HTMLEncoder class
-## request - HttpServletRequest
-## response - HttpServletResponse
-## environment - Spring Environment object for property resolution
-## custom - arbitrary object injected by deployer
-##
-#set ($rpContext = $profileRequestContext.getSubcontext('net.shibboleth.profile.context.RelyingPartyContext'))
-#set ($username = $authenticationContext.getSubcontext('net.shibboleth.idp.authn.context.UsernamePasswordContext', true).getUsername())
-##
-<!DOCTYPE html>
-<html>
-    <head>
-        <title>#springMessageText("idp.title", "Web Login Service")</title>
-        <meta charset="UTF-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        <link rel="stylesheet" type="text/css" href="$request.getContextPath()#springMessageText("idp.css", "/css/placeholder.css")">
-    </head>
-    <body>
-        <main class="main">
-            <header>
-                <img class="main-logo" src="$request.getContextPath()#springMessageText("idp.logo", "/images/placeholder-logo.png")" alt="#springMessageText("idp.logo.alt-text", "logo")" />
-                
-                #set ($serviceName = $rpUIContext.serviceName)
-                #if ($serviceName && !$rpContext.getRelyingPartyId().contains($serviceName))
-                    <h1>#springMessageText("idp.login.loginTo", "Login to") $encoder.encodeForHTML($serviceName)</h1>
-                #end
-            </header>
-            
-            <section>
-                <form action="$flowExecutionUrl" method="post">
-                    #parse("csrf/csrf.vm")
-
-                    #*
-                    //
-                    //    SP Description & Logo (optional)
-                    //    These idpui lines will display added information (if available
-                    //    in the metadata) about the Service Provider (SP) that requested
-                    //    authentication. These idpui lines are "active" in this example
-                    //    (not commented out) - this extra SP info will be displayed.
-                    //    Remove or comment out these lines to stop the display of the
-                    //    added SP information.
-                    //
-                    *#
-                    #set ($logo = $rpUIContext.getLogo())
-                    #if ($logo)
-                        <img class="service-logo" src= "$encoder.encodeForHTMLAttribute($logo)" alt="$encoder.encodeForHTMLAttribute($serviceName)">
-                    #end
-                    #set ($desc = $rpUIContext.getServiceDescription())
-                    #if ($desc)
-                        <p>$encoder.encodeForHTML($desc)</p>
-                    #end
-                            
-                    #parse("login-error.vm")
-
-                    <label for="username">#springMessageText("idp.login.username", "Username")</label>
-                    <input id="username" name="j_username" type="text"
-                        value="#if($username)$encoder.encodeForHTML($username)#end" />
-                        
-                    <label for="password">#springMessageText("idp.login.password", "Password")</label>
-                    <input type="password" name="j_password" id="password" value="" />
-    
-                    ## You may need to modify this to taste, such as changing the flow name checked to authn/MFA.
-                    #if (!$authenticationContext.getActiveResults().containsKey('authn/Password'))
-                        <input type="checkbox" name="donotcache" value="1" id="donotcache" />
-                        <label for="donotcache">#springMessageText("idp.login.donotcache", "Don't Remember Login")</label>
-                    #end
-    
-                    <input id="_shib_idp_revokeConsent" type="checkbox" name="_shib_idp_revokeConsent" value="true" />
-                    <label for="_shib_idp_revokeConsent">#springMessageText("idp.attribute-release.revoke", "Clear prior granting of permission for release of your information to this service.")</label>
-    
-                    <div class="grid">
-                        <div class="grid-item">
-                            <button type="submit" name="_eventId_proceed"
-                                onClick="this.childNodes[0].nodeValue='#springMessageText("idp.login.pleasewait", "Logging in, please wait...")'"
-                                >#springMessageText("idp.login.login", "Login")</button>
-                        </div>
-                    </div>
-                </form>
-    
-                <ul>
-                    <li><a href="#springMessageText("idp.url.password.reset", '#')">#springMessageText("idp.login.forgotPassword", "Forgot your password?")</a></li>
-                    <li><a href="#springMessageText("idp.url.helpdesk", '#')">#springMessageText("idp.login.needHelp", "Need Help?")</a></li>
-                </ul>
-            </section>
-        </main>
-        <footer class="footer">
-            <div class="cc">
-                <p>#springMessageText("idp.footer", "Insert your footer text here.")</p>
-            </div>
-        </footer>
-     </body>
-</html>
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/logout-complete.vm b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/logout-complete.vm
deleted file mode 100644
index 2d332ea..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/logout-complete.vm
+++ /dev/null
@@ -1,61 +0,0 @@
-##
-## Velocity Template for logout flow's concluding view-state (no propagation)
-##
-## Velocity context will contain the following properties
-## flowExecutionUrl - the form action location
-## flowRequestContext - the Spring Web Flow RequestContext
-## flowExecutionKey - the SWF execution key (this is built into the flowExecutionUrl)
-## profileRequestContext - root of context tree
-## logoutContext - context with SPSession details for logout operation
-## multiRPContext - context with RelyingPartyContexts and possibly SP UI information from the metadata
-## encoder - HTMLEncoder class
-## request - HttpServletRequest
-## response - HttpServletResponse
-## environment - Spring Environment object for property resolution
-## custom - arbitrary object injected by deployer
-##
-#set ($activeIdPSessions = $logoutContext and !$logoutContext.getIdPSessions().isEmpty())
-#set ($activeSPSessions = $logoutContext and !$logoutContext.getSessionMap().isEmpty())
-<!DOCTYPE html>
-<html>
-    <head>
-        <title>#springMessageText("idp.title", "Web Login Service")</title>
-        <meta charset="UTF-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        <link rel="stylesheet" type="text/css" href="$request.getContextPath()#springMessageText("idp.css", "/css/placeholder.css")">
-    </head>
-
-    <body>
-        <main class="main">
-            <header>
-                <img class="main-logo" src="$request.getContextPath()#springMessageText("idp.logo", "/images/placeholder-logo.png")" alt="#springMessageText("idp.logo.alt-text", "logo")" />
-            </header>
-            
-            <section>
-            #if ($activeIdPSessions)
-                <h2>#springMessageText("idp.logout.cancelled", "Logout has been cancelled.")</h2>
-            #elseif ($activeSPSessions)
-                <p>#springMessageText("idp.logout.local", "You elected not to log out of all the applications accessed during your session.")</p>
-            #else
-                <p>#springMessageText("idp.logout.complete", "The logout operation is complete, and no other services appear to have been accessed during this session.")</p>
-            #end
-            
-                <ul>
-                    <li><a href="#springMessageText("idp.url.password.reset", '#')">#springMessageText("idp.login.forgotPassword", "Forgot your password?")</a></li>
-                    <li><a href="#springMessageText("idp.url.helpdesk", '#')">#springMessageText("idp.login.needHelp", "Need Help?")</a></li>
-                </ul>
-                
-              <!-- If SAML logout, complete the flow by adding a hidden iframe. -->
-              #if ( $profileRequestContext.getProfileId().contains("saml2/logout") )
-                  <iframe style="display:none" src="$flowExecutionUrl&_eventId=proceed"></iframe>
-              #end
-            </section>
-        </main>
-        <footer class="footer">
-            <div class="cc">
-                <p>#springMessageText("idp.footer", "Insert your footer text here.")</p>
-            </div>
-        </footer>
- 	</body>
-</html>
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/logout-propagate.vm b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/logout-propagate.vm
deleted file mode 100644
index ab73382..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/logout-propagate.vm
+++ /dev/null
@@ -1,57 +0,0 @@
-##
-## Velocity Template for logout flow's concluding view-state (with propagation)
-##
-## Velocity context will contain the following properties
-## flowExecutionUrl - the form action location
-## flowRequestContext - the Spring Web Flow RequestContext
-## flowExecutionKey - the SWF execution key (this is built into the flowExecutionUrl)
-## profileRequestContext - root of context tree
-## logoutContext - context with SPSession details for logout operation
-## multiRPContext - context with RelyingPartyContexts and possibly SP UI information from the metadata
-## htmlEncoder - HTMLEncoder class
-## urlEncoder - urlEncoder class
-## codecUtil - CodecUtil class
-## request - HttpServletRequest
-## response - HttpServletResponse
-## environment - Spring Environment object for property resolution
-## custom - arbitrary object injected by deployer
-##
-#set ($hidden = $environment.getProperty("idp.logout.propagationHidden", "false"))
-<!DOCTYPE html>
-<html>
-    <head>
-        <title>#springMessageText("idp.title", "Web Login Service")</title>
-        <meta charset="UTF-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        <link rel="stylesheet" type="text/css" href="$request.getContextPath()#springMessageText("idp.css", "/css/placeholder.css")">
-        <link rel="stylesheet" type="text/css" href="$request.getContextPath()/css/logout.css">
-    </head>
-
-    <body>
-        <main class="main">
-            <header>
-                <img class="main-logo" src="$request.getContextPath()#springMessageText("idp.logo", "/images/placeholder-logo.png")" alt="#springMessageText("idp.logo.alt-text", "logo")" />
-            </header>
-            
-            <section>
-                #if($hidden == "true")
-                <p>#springMessageText("idp.logout.hidden", "Your single sign-on session has been terminated, but you are still logged into many of the services you have accessed during your session.")</p>
-                #else
-                <h1>#springMessageText("idp.logout.attempt", "Attempting to log out of the following services:")</h1>
-                #end
-                #parse("logout/propagate.vm")
-                
-                <ul>
-                    <li><a href="#springMessageText("idp.url.password.reset", '#')">#springMessageText("idp.login.forgotPassword", "Forgot your password?")</a></li>
-                    <li><a href="#springMessageText("idp.url.helpdesk", '#')">#springMessageText("idp.login.needHelp", "Need Help?")</a></li>
-                </ul>
-            </section>
-        </main>
-        <footer class="footer">
-            <div class="cc">
-                <p>#springMessageText("idp.footer", "Insert your footer text here.")</p>
-            </div>
-        </footer>
- 	</body>
-</html>
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/logout.vm b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/logout.vm
deleted file mode 100644
index ab01600..0000000
--- a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/views/logout.vm
+++ /dev/null
@@ -1,118 +0,0 @@
-##
-## Velocity Template for logout flow's starting view-state
-##
-## Velocity context will contain the following properties
-## flowExecutionUrl - the form action location
-## flowRequestContext - the Spring Web Flow RequestContext
-## flowExecutionKey - the SWF execution key (this is built into the flowExecutionUrl)
-## profileRequestContext - root of context tree
-## logoutContext - context with SPSession details for logout operation
-## multiRPContext - context with RelyingPartyContexts and possibly SP UI information from the metadata
-## encoder - HTMLEncoder class
-## request - HttpServletRequest
-## response - HttpServletResponse
-## environment - Spring Environment object for property resolution
-## custom - arbitrary object injected by deployer
-##
-#set ($rpContext = $profileRequestContext.getSubcontext("net.shibboleth.profile.context.RelyingPartyContext"))
-#if ($rpContext)
-#set ($rpUIContext = $rpContext.getSubcontext("net.shibboleth.idp.ui.context.RelyingPartyUIContext"))
-#end
-#set ($promptForIdP = $logoutContext and !$logoutContext.getIdPSessions().isEmpty())
-#set ($promptForSP = $logoutContext and !$logoutContext.getSessionMap().isEmpty())
-<!DOCTYPE html>
-<html>
-    <head>
-        <title>#springMessageText("idp.title", "Web Login Service")</title>
-        <meta charset="UTF-8" />
-        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0">
-        #if ($promptForSP)
-            <meta http-equiv="refresh" content="10;url=$flowExecutionUrl&_eventId=propagate">
-        #elseif ($promptForIdP)
-            <meta http-equiv="refresh" content="10;url=$flowExecutionUrl&_eventId=local">
-        #end
-        <link rel="stylesheet" type="text/css" href="$request.getContextPath()#springMessageText("idp.css", "/css/placeholder.css")">
-    </head>
-
-   <body>
-        <main class="main">
-            <header>
-                <img class="main-logo" src="$request.getContextPath()#springMessageText("idp.logo", "/images/placeholder-logo.png")" alt="#springMessageText("idp.logo.alt-text", "logo")" />
-            </header>
-
-            <section>
-                <div class="output-message">
-                    <p><strong>Note for deployers:</strong> This page is displayed when a logout operation at the Identity Provider completes.
-                    This page is an example and should be customized. It is not fully internationalized because the presentation will be a highly localized decision,
-                    and we don't have a good suggestion for a default.</p>
-                </div>
-    
-            #if ($rpContext)
-              <p>#springMessageText("idp.logout.sp-initiated", "You have been logged out of the following service:")</p>
-              <blockquote>
-              #if ($rpUIContext)
-                  $encoder.encodeForHTML($rpUIContext.getServiceName())
-              #else
-                  $encoder.encodeForHTML($rpContext.getRelyingPartyId())
-              #end
-              </blockquote>
-              <br>
-            #end
-            
-            #if ($promptForIdP or $promptForSP)
-              <p>#springMessageText("idp.logout.prompt", "Choose one of the following, or wait a few seconds for the default.")</p>
-              <br>
-
-              <form id="propagate_form" method="POST" action="$flowExecutionUrl">
-                
-                  <p><button id="logout_local" type="submit" name="_eventId" value="local">#springMessageText("idp.logout.idponly", "Logout Locally")</button></p>
-                  <p>#springMessageText("idp.logout.idponly.caption", "End your SSO session.")</p>
-            #end
-
-            #if ($promptForSP)
-                  <p><button id="logout_propagate" type="submit" name="_eventId" value="propagate">#springMessageText("idp.logout.global", "Logout Globally")</button></p>
-                  <p>#springMessageText("idp.logout.global.caption", "End your SSO session and attempt logout of services accessed during session.")</p>
-                  <p>#springMessageText("idp.logout.contactServices", "If instructed, the system will attempt to contact the following services:")</p>
-                  <ol>
-                  #foreach ($sp in $logoutContext.getSessionMap().keySet())
-                    #set ($rpCtx = $multiRPContext.getRelyingPartyContextById($sp))
-                    #if ($rpCtx)
-                      #set ($rpUIContext = $rpCtx.getSubcontext("net.shibboleth.idp.ui.context.RelyingPartyUIContext"))
-                    #end
-                    #if ($rpUIContext and $rpUIContext.getServiceName())
-                      <li>$encoder.encodeForHTML($rpUIContext.getServiceName())</li>
-                    #else
-                      <li>$encoder.encodeForHTML($sp)</li>
-                    #end
-                  #end
-                  </ol>
-            #end
-
-            #if ($promptForIdP)
-                  <p><button class="button--secondary" id="logout_cancel" type="submit" name="_eventId" value="end">#springMessageText("idp.logout.cancel", "Cancel")</button></p>
-                  <p>#springMessageText("idp.logout.cancel.caption", "Cancel logout and retain your SSO session.")</p>
-            #end
-            
-            #if ($promptForIdP or $promptForSP)
-              </form>
-            #else
-                <p><strong>#springMessageText("idp.logout.complete", "The logout operation is complete, and no other services appear to have been accessed during this session.")</strong></p>
-                <!-- Complete the flow by adding a hidden iframe. -->
-                <iframe style="display:none" src="$flowExecutionUrl&_eventId=proceed"></iframe>
-            #end
-
-                <ul>
-                    <li><a href="#springMessageText("idp.url.password.reset", '#')">#springMessageText("idp.login.forgotPassword", "Forgot your password?")</a></li>
-                    <li><a href="#springMessageText("idp.url.helpdesk", '#')">#springMessageText("idp.login.needHelp", "Need Help?")</a></li>
-                </ul>
-            </section>
-            
-        </main>
-        <footer class="footer">
-            <div class="cc">
-                <p>#springMessageText("idp.footer", "Insert your footer text here.")</p>
-            </div>
-        </footer>
-    </body>
-</html>
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/war/.gitkeep b/src/test/docker/shibboleth-idp/opt-shibboleth-idp/war/.gitkeep
deleted file mode 100644
index e69de29..0000000
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.oidc.config/truststore.asc b/src/test/docker/shibboleth-idp/plugin-truststore/net.shibboleth.idp.plugin.oidc.config/truststore.asc
similarity index 100%
rename from src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.oidc.config/truststore.asc
rename to src/test/docker/shibboleth-idp/plugin-truststore/net.shibboleth.idp.plugin.oidc.config/truststore.asc
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.oidc.op/truststore.asc b/src/test/docker/shibboleth-idp/plugin-truststore/net.shibboleth.idp.plugin.oidc.op/truststore.asc
similarity index 100%
rename from src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.idp.plugin.oidc.op/truststore.asc
rename to src/test/docker/shibboleth-idp/plugin-truststore/net.shibboleth.idp.plugin.oidc.op/truststore.asc
diff --git a/src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.oidc.common/truststore.asc b/src/test/docker/shibboleth-idp/plugin-truststore/net.shibboleth.oidc.common/truststore.asc
similarity index 100%
rename from src/test/docker/shibboleth-idp/opt-shibboleth-idp/credentials/net.shibboleth.oidc.common/truststore.asc
rename to src/test/docker/shibboleth-idp/plugin-truststore/net.shibboleth.oidc.common/truststore.asc
diff --git a/src/test/docker/shibboleth-idp/tomcat/idp.xml b/src/test/docker/shibboleth-idp/tomcat/idp.xml
deleted file mode 100644
index 6262af6..0000000
--- a/src/test/docker/shibboleth-idp/tomcat/idp.xml
+++ /dev/null
@@ -1,3 +0,0 @@
-<Context docBase="${idp.home}/war/idp.war"
-    privileged="true"
-    swallowOutput="true" />
\ No newline at end of file
diff --git a/src/test/docker/shibboleth-idp/tomcat/server.xml b/src/test/docker/shibboleth-idp/tomcat/server.xml
index 77476e1..90ead0d 100644
--- a/src/test/docker/shibboleth-idp/tomcat/server.xml
+++ b/src/test/docker/shibboleth-idp/tomcat/server.xml
@@ -1,162 +1,27 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
-  contributor license agreements.  See the NOTICE file distributed with
-  this work for additional information regarding copyright ownership.
-  The ASF licenses this file to You under the Apache License, Version 2.0
-  (the "License"); you may not use this file except in compliance with
-  the License.  You may obtain a copy of the License at
-
-      http://www.apache.org/licenses/LICENSE-2.0
-
-  Unless required by applicable law or agreed to in writing, software
-  distributed under the License is distributed on an "AS IS" BASIS,
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-  See the License for the specific language governing permissions and
-  limitations under the License.
--->
-<!-- Note:  A "Server" is not itself a "Container", so you may not
-     define subcomponents such as "Valves" at this level.
-     Documentation at /docs/config/server.html
- -->
+<?xml version='1.0' encoding='utf-8'?>
 <Server port="8005" shutdown="SHUTDOWN">
-    <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
-    <!-- Security listener. Documentation at /docs/config/listeners.html
-    <Listener className="org.apache.catalina.security.SecurityListener" />
-    -->
-    <!-- APR library loader. Documentation at /docs/apr.html -->
-    <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
-    <!-- Prevent memory leaks due to use of particular java/javax APIs-->
-    <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
-    <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
-    <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />
-
-    <!-- Global JNDI resources
-         Documentation at /docs/jndi-resources-howto.html
-    -->
-    <GlobalNamingResources>
-        <!-- Editable user database that can also be used by
-             UserDatabaseRealm to authenticate users
-        -->
-        <Resource name="UserDatabase" auth="Container"
-                  type="org.apache.catalina.UserDatabase"
-                  description="User database that can be updated and saved"
-                  factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
-                  pathname="conf/tomcat-users.xml" />
-    </GlobalNamingResources>
-
-    <!-- A "Service" is a collection of one or more "Connectors" that share
-         a single "Container" Note:  A "Service" is not itself a "Container",
-         so you may not define subcomponents such as "Valves" at this level.
-         Documentation at /docs/config/service.html
-     -->
-    <Service name="Catalina">
-
-        <!--The connectors can use a shared executor, you can define one or more named thread pools-->
-        <!--
-        <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"
-            maxThreads="150" minSpareThreads="4"/>
-        -->
-
+  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
 
-        <!-- A "Connector" represents an endpoint by which requests are received
-             and responses are returned. Documentation at :
-             HTTP Connector: /docs/config/http.html
-             AJP  Connector: /docs/config/ajp.html
-             Define a non-SSL/TLS HTTP/1.1 Connector on port 8080
-        -->
-        <Connector port="8080" protocol="HTTP/1.1"
-                   connectionTimeout="20000"
-                   redirectPort="8443"
-                   maxParameterCount="1000"
-                   scheme="https"
-                   secure="true"
-        />
-        <!-- A "Connector" using the shared thread pool-->
-        <!--
-        <Connector executor="tomcatThreadPool"
-                   port="8080" protocol="HTTP/1.1"
-                   connectionTimeout="20000"
-                   redirectPort="8443"
-                   maxParameterCount="1000"
-                   />
-        -->
-        <!-- Define an SSL/TLS HTTP/1.1 Connector on port 8443 with HTTP/2
-             This connector uses the NIO implementation. The default
-             SSLImplementation will depend on the presence of the APR/native
-             library and the useOpenSSL attribute of the AprLifecycleListener.
-             Either JSSE or OpenSSL style configuration may be used regardless of
-             the SSLImplementation selected. JSSE style configuration is used below.
-        -->
-        <!--
-        <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
-                   maxThreads="150" SSLEnabled="true"
-                   maxParameterCount="1000"
-                   >
-            <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
-            <SSLHostConfig>
-                <Certificate certificateKeystoreFile="conf/localhost-rsa.jks"
-                             type="RSA" />
-            </SSLHostConfig>
-        </Connector>
-        -->
+  <Service name="Catalina">
 
-        <!-- Define an AJP 1.3 Connector on port 8009 -->
-        <!--
-        <Connector protocol="AJP/1.3"
-                   address="::1"
-                   port="8009"
-                   redirectPort="8443"
-                   maxParameterCount="1000"
-                   />
-        -->
+    <Connector
+        protocol="org.apache.coyote.http11.Http11NioProtocol"
+        port="8080" maxThreads="200"
+        scheme="https" secure="true">
+    </Connector>
 
-        <!-- An Engine represents the entry point (within Catalina) that processes
-             every request.  The Engine implementation for Tomcat stand alone
-             analyzes the HTTP headers included with the request, and passes them
-             on to the appropriate Host (virtual host).
-             Documentation at /docs/config/engine.html -->
+    <Engine name="Catalina" defaultHost="localhost">
 
-        <!-- You should set jvmRoute to support load-balancing via AJP ie :
-        <Engine name="Catalina" defaultHost="localhost" jvmRoute="jvm1">
-        -->
-        <Engine name="Catalina" defaultHost="localhost">
+      <Host name="localhost"  appBase="webapps"
+            unpackWARs="true" autoDeploy="true">
 
-            <!--For clustering, please take a look at documentation at:
-                /docs/cluster-howto.html  (simple how to)
-                /docs/config/cluster.html (reference documentation) -->
-            <!--
-            <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"/>
-            -->
+        <Valve className="org.apache.catalina.valves.AccessLogValve"
+               directory="/tmp" prefix="tomcat_access_log" 
+               rotatable="false" pattern="%h %l %u %t &quot;%r&quot; %s %b" />
 
-            <!-- Use the LockOutRealm to prevent attempts to guess user passwords
-                 via a brute-force attack -->
-            <Realm className="org.apache.catalina.realm.LockOutRealm">
-                <!-- This Realm uses the UserDatabase configured in the global JNDI
-                     resources under the key "UserDatabase".  Any edits
-                     that are performed against this UserDatabase are immediately
-                     available for use by the Realm.  -->
-                <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
-                       resourceName="UserDatabase"/>
-            </Realm>
-
-            <Host name="localhost"  appBase="webapps"
-                  unpackWARs="true" autoDeploy="true">
-
-                <!-- SingleSignOn valve, share authentication between web applications
-                     Documentation at: /docs/config/valve.html -->
-                <!--
-                <Valve className="org.apache.catalina.authenticator.SingleSignOn" />
-                -->
-
-                <!-- Access log processes all example.
-                     Documentation at: /docs/config/valve.html
-                     Note: The pattern used is equivalent to using pattern="common" -->
-                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
-                       prefix="localhost_access_log" suffix=".txt"
-                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
-
-            </Host>
-        </Engine>
-    </Service>
+      </Host>
+    </Engine>
+  </Service>
 </Server>
+
diff --git a/src/test/docker/shibboleth-idp/tomcat/setenv.sh b/src/test/docker/shibboleth-idp/tomcat/setenv.sh
deleted file mode 100644
index a88f2b6..0000000
--- a/src/test/docker/shibboleth-idp/tomcat/setenv.sh
+++ /dev/null
@@ -1,3 +0,0 @@
-#!/bin/sh
-
-export "CATALINA_OPTS=$CATALINA_OPTS -Didp.home=/opt/shibboleth-idp"
\ No newline at end of file