From 5b0a9142a0e00fa528f86f8fe432c0e44ed4ae8e Mon Sep 17 00:00:00 2001
From: Thomas <>
Date: Mon, 7 Feb 2022 15:19:56 +0100
Subject: refactor(matching): change 'kitt' and 'update' steps in
'InitialSearchTask'
- Update MDS in case of changes eIDAS data and already existing ERnP entry
- Add additional attributes in case of new eIDAS attributes outside of MDS
---
...rsonalId_only_resp_no_additional_attributes.xml | 221 +++++++++++++++++++++
1 file changed, 221 insertions(+)
create mode 100644 eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml
(limited to 'eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr')
diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml
new file mode 100644
index 00000000..6551cdd3
--- /dev/null
+++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp_no_additional_attributes.xml
@@ -0,0 +1,221 @@
+
+
+
+ GP_EIDAS
+ 367100000000079
+ 0
+
+
+ ZMR-Server Version: 5.9.0.0-SNAPSHOT
+ 2021-11-12T08:24:40.985
+ 1877300000000139
+
+
+
+
+ Searching PersonIdentifier
+
+ true
+ false
+
+
+ false
+
+ 10
+
+
+
+
+ 5020
+ Person gefunden.
+
+
+ 1
+ 0
+ 0
+ 1
+
+
+
+
+ 2021-11-12T08:24:39.695
+
+
+
+ 44453600000000697
+ 2020-02-05T13:07:06.311
+
+ 2020-02-05T13:07:06.311
+ SONSTIGES
+ Sonstiges
+ Testerperson
+
+
+ 109091
+
+
+
+ 000430320173
+
+
+ UgeknNsc26lVuB7U/uYGVmWtnnA=
+ urn:publicid:gv.at:cdid+ZP
+
+
+ XXXClaus - Maria
+ XXXvon Brandenburg
+
+ unbekannt
+ männlich
+ 1994-12-31
+ Wien
+ Wien
+ Österreich
+
+ AUT
+ Österreich
+
+
+ 44453600000000727
+ 2020-02-05T13:07:06.311
+
+ 2020-02-05T13:07:06.311
+ STAATSANGEH_ANLEGEN
+ Staatsangehörigkeit anlegen
+ Testerperson
+
+
+ 109091
+
+
+
+
+
+
+
+
+ 1879000000000001
+ 2021-11-12T08:24:39.695
+
+ 2021-11-12T08:24:39.695
+ EIDAS_ANLEGEN
+ KITT for eIDAS Matching
+
+
+ 101179
+
+ eidtapp@bmi.gv.at
+
+
+ http://eidas.europa.eu/attributes/naturalperson/BirthName
+ DE
+
+ XXXvon Heuburg
+ 9999-12-31
+ 9999-12-31
+
+
+
+
+ 1879000000000005
+ 2021-11-12T08:24:39.695
+
+ 2021-11-12T08:24:39.695
+ EIDAS_ANLEGEN
+ KITT for eIDAS Matching
+
+
+ 101179
+
+ eidtapp@bmi.gv.at
+
+
+ http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier
+ DE
+
+ 7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit
+ 9999-12-31
+ 9999-12-31
+
+
+
+
+
+
+ 2020-02-05T13:07:06.311
+
+
+
+ 44453500000005242
+ 2020-02-05T13:07:06.311
+
+ 2020-02-05T13:07:06.311
+ WSANM
+ Wohnsitz anmelden
+
+
+ 109091
+
+
+
+
+
+ 0088
+ Testgemeinde
+ 09988
+ Testort A
+
+ Testgasse
+ 1a-2b
+ Stg. 3c-4d
+ 5
+ H
+ false
+ 0001
+
+ T800001
+ 001
+ T800001
+
+
+
+ HST111WWW
+
+ T8001
+ T80001
+ T80000000001
+ T80000000002
+
+ H
+ Testpostort
+
+ 2020-02-05T13:07:06.311
+ WSANM
+ Wohnsitz anmelden
+
+
+
+ 44453500000005262
+ 2020-02-05T13:07:06.311
+
+ 2020-02-05T13:07:06.311
+ AUSK_SPERRE_SETZ
+ Auskunftssperre setzen
+
+
+ 109091
+
+
+
+ 2020-02-05T13:07:06.311
+ 9999-12-31T23:59:59.000
+ ASMG
+ Auskunftssperre nach § 18 / 2ff MeldeG
+ automatische Auskunftssperre
+
+
+
+
+
+
+
--
cgit v1.2.3
From e4ccd3df84e7ea509e66f2f832719529fe408839 Mon Sep 17 00:00:00 2001
From: Thomas <>
Date: Wed, 9 Feb 2022 08:34:26 +0100
Subject: feature(zmr): add MDS attributes as 'eIdAS-Documents' too
ZMR does not allow MDS update on regular places. Therefore, we add it as 'eIDAS-Documents' for later usage.
---
.../specific/modules/auth/eidas/v2/Constants.java | 8 ++-
.../auth/eidas/v2/clients/zmr/ZmrSoapClient.java | 12 ++++
.../auth/eidas/v2/test/clients/ZmrClientTest.java | 13 ++--
.../AlternativeSearchTaskWithRegisterTest.java | 24 +++++++-
.../tasks/InitialSearchTaskWithRegistersTest.java | 8 +--
.../seq_1-8_search_with_personalId_only_resp.xml | 71 +++++++++++++++++++++-
.../zmr/seq_3-8_kitt_get_latest_version_resp.xml | 71 +++++++++++++++++++++-
7 files changed, 193 insertions(+), 14 deletions(-)
(limited to 'eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr')
diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java
index e642c5ec..272d79c4 100644
--- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java
+++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/Constants.java
@@ -268,7 +268,13 @@ public class Constants {
public static final String eIDAS_ATTRURN_PREFIX_NATURAL = eIDAS_ATTRURN_PREFIX + "naturalperson/";
public static final String eIDAS_ATTRURN_PERSONALIDENTIFIER =
- eIDAS_ATTRURN_PREFIX_NATURAL + eIDAS_ATTR_PERSONALIDENTIFIER;
+ eIDAS_ATTRURN_PREFIX_NATURAL + eIDAS_ATTR_PERSONALIDENTIFIER;
+ public static final String eIDAS_ATTRURN_CURRENTGIVENNAME =
+ eIDAS_ATTRURN_PREFIX_NATURAL + "CurrentGivenName";
+ public static final String eIDAS_ATTRURN_CURRENTFAMILYNAME =
+ eIDAS_ATTRURN_PREFIX_NATURAL + "CurrentFamilyName";
+ public static final String eIDAS_ATTRURN_DATEOFBIRTH =
+ eIDAS_ATTRURN_PREFIX_NATURAL + eIDAS_ATTR_DATEOFBIRTH;
public static final String eIDAS_ATTRURN_PLACEOFBIRTH =
eIDAS_ATTRURN_PREFIX_NATURAL + eIDAS_ATTR_PLACEOFBIRTH;
public static final String eIDAS_ATTRURN_BIRTHNAME =
diff --git a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrSoapClient.java b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrSoapClient.java
index f24c75eb..8dbd0632 100644
--- a/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrSoapClient.java
+++ b/eidas_modules/authmodule-eIDAS-v2/src/main/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/clients/zmr/ZmrSoapClient.java
@@ -264,6 +264,10 @@ public class ZmrSoapClient extends AbstractSoapClient implements IZmrClient {
Collection extends EidasIdentitaetAnlageType> eidasDocumentToAdd =
selectEidasDocumentsToAdd(zmrPersonToKitt, eidData);
+ /*TODO: Is there a requirement to change 'eIDAS-Documents'?
+ * We add MDS information as 'eIDAS-Documents' too. Maybe, we should update that in a later version.
+ */
+
if (eidasDocumentToAdd.isEmpty()) {
log.info("Find no eIDAS document for update during: {}. Nothing todo on ZMR side",
PROCESS_KITT_GENERAL);
@@ -766,6 +770,14 @@ public class ZmrSoapClient extends AbstractSoapClient implements IZmrClient {
Constants.eIDAS_ATTRURN_PLACEOFBIRTH, eidData.getPlaceOfBirth(), false);
addEidasDocumentIfNotAvailable(result, zmrPersonToKitt, eidData.getCitizenCountryCode(),
Constants.eIDAS_ATTRURN_BIRTHNAME, eidData.getBirthName(), false);
+
+ // add MDS attributes as 'eIDAS-Documents' too, because ZMR does not allow a MDS update on regular places.
+ addEidasDocumentIfNotAvailable(result, zmrPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_CURRENTGIVENNAME, eidData.getGivenName(), false);
+ addEidasDocumentIfNotAvailable(result, zmrPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_CURRENTFAMILYNAME, eidData.getFamilyName(), false);
+ addEidasDocumentIfNotAvailable(result, zmrPersonToKitt, eidData.getCitizenCountryCode(),
+ Constants.eIDAS_ATTRURN_DATEOFBIRTH, eidData.getDateOfBirth(), false);
return result;
diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientTest.java
index 290eefe4..2ff9f0cb 100644
--- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientTest.java
+++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/clients/ZmrClientTest.java
@@ -940,13 +940,19 @@ public class ZmrClientTest {
assertEquals("2 req. tech. Ref. date", "2020-02-05T13:07:06.311",
secondpSuche.getPersonReferenz().getTechnisch().getLetzteAenderung().toString());
- assertEquals("eidas Docs. size", 3, secondpSuche.getEidasIdentitaetAnlage().size());
+ assertEquals("eidas Docs. size", 6, secondpSuche.getEidasIdentitaetAnlage().size());
checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
"http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth", cc, eidasData.getPlaceOfBirth());
checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
"http://eidas.europa.eu/attributes/naturalperson/BirthName", cc, eidasData.getBirthName());
checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
- "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, eidasData.getPseudonym());
+ "http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, eidasData.getPseudonym());
+ checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/CurrentGivenName", cc, eidasData.getGivenName());
+ checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/CurrentFamilyName", cc, eidasData.getFamilyName());
+ checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/DateOfBirth", cc, eidasData.getDateOfBirth());
// validate state
@@ -1110,8 +1116,7 @@ public class ZmrClientTest {
assertEquals("eidas Docs. size", 1, secondpSuche.getEidasIdentitaetAnlage().size());
checkEidasDocumentAdd(secondpSuche.getEidasIdentitaetAnlage(),
"http://eidas.europa.eu/attributes/naturalperson/PersonIdentifier", cc, eidasData.getPseudonym());
-
-
+
// validate state
assertNotNull("no ZMR response", resp);
assertEquals("wrong processId", "366200000000082", resp.getProcessId().toString());
diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/AlternativeSearchTaskWithRegisterTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/AlternativeSearchTaskWithRegisterTest.java
index 66807ee0..3814c632 100644
--- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/AlternativeSearchTaskWithRegisterTest.java
+++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/AlternativeSearchTaskWithRegisterTest.java
@@ -71,6 +71,7 @@ import at.asitplus.eidas.specific.modules.auth.eidas.v2.utils.MatchingTaskUtils;
import at.gv.bmi.namespace.zmr_su.base._20040201.RequestType;
import at.gv.bmi.namespace.zmr_su.base._20040201.ResponseType;
import at.gv.bmi.namespace.zmr_su.base._20040201_.ServicePort;
+import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasIdentitaetAnlageType;
import at.gv.bmi.namespace.zmr_su.zmr._20040201.EidasSuchdatenType;
import at.gv.egiz.eaaf.core.api.IRequest;
import at.gv.egiz.eaaf.core.api.idp.process.ExecutionContext;
@@ -509,7 +510,16 @@ public class AlternativeSearchTaskWithRegisterTest {
assertNotNull("PersonAender KITT req.", zmrReq.getAllValues().get(2).getPersonAendernRequest());
checkBasicRequestParameters(zmrReq.getAllValues().get(2), ZmrClientTest.PROCESS_TASK_UPDATE,
new BigInteger("367100000000079"), "jUnit123456");
-
+
+ assertEquals("wrong number of eIDAS Docs to Add", 4,
+ zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage().size());
+ checkEidasDocumentAdd(zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/DateOfBirth", "DE", "1994-12-31");
+ checkEidasDocumentAdd(zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/CurrentGivenName", "DE", "XXXKlaus - Maria");
+ checkEidasDocumentAdd(zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage(),
+ "http://eidas.europa.eu/attributes/naturalperson/CurrentFamilyName", "DE", "XXXvon Brandenburg");
+
assertNotNull("Personensuche KITT req.", zmrReq.getAllValues().get(3).getPersonSuchenRequest());
checkBasicRequestParameters(zmrReq.getAllValues().get(3), ZmrClientTest.PROCESS_TASK_SEARCH,
new BigInteger("367100000000079"), "jUnit123456");
@@ -1011,6 +1021,18 @@ public class AlternativeSearchTaskWithRegisterTest {
}
+
+ private void checkEidasDocumentAdd(List list, String type, String cc, String value) {
+ Optional eidasDoc = list.stream()
+ .filter(el -> type.equals(el.getEidasArt()))
+ .findFirst();
+
+ assertTrue("eidas doc: " + type, eidasDoc.isPresent());
+ assertEquals("eIDAS docType", type, eidasDoc.get().getEidasArt());
+ assertEquals("eIDAS docValue", value, eidasDoc.get().getEidasWert());
+ assertEquals("eIDAS docCC", cc, eidasDoc.get().getStaatscode2());
+ }
+
@NotNull
private ErnpRegisterResult emptyErnpRegisterResult() {
return new ErnpRegisterResult(Collections.emptyList());
diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java
index 7f27a17c..18d76264 100644
--- a/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java
+++ b/eidas_modules/authmodule-eIDAS-v2/src/test/java/at/asitplus/eidas/specific/modules/auth/eidas/v2/test/tasks/InitialSearchTaskWithRegistersTest.java
@@ -283,12 +283,8 @@ public class InitialSearchTaskWithRegistersTest {
assertNotNull("Personenupdate req.", zmrReq.getAllValues().get(2).getPersonAendernRequest());
checkBasicRequestParameters(zmrReq.getAllValues().get(2), ZmrClientTest.PROCESS_TASK_UPDATE,
new BigInteger("367100000000079"), "jUnit123456");
- assertEquals("eIDAS attribute to add", 1,
- zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage().size());
- assertEquals("eIDAS attribute to add - Type", "http://eidas.europa.eu/attributes/naturalperson/PlaceOfBirth",
- zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage().get(0).getEidasArt());
- assertEquals("eIDAS attribute to add - Value", placeOfBirth,
- zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage().get(0).getEidasWert());
+ assertEquals("eIDAS attribute to add", 4,
+ zmrReq.getAllValues().get(2).getPersonAendernRequest().getEidasIdentitaetAnlage().size());
assertNull("ZMR update MDS", zmrReq.getAllValues().get(2).getPersonAendernRequest().getPersonAenderung());
}
diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp.xml b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp.xml
index 3fd477ee..f21c3698 100644
--- a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp.xml
+++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_1-8_search_with_personalId_only_resp.xml
@@ -182,7 +182,76 @@
7cEYWithDEElementsasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit
9999-12-31
9999-12-31
-
+
+
+
+
+ 1879000000000005
+ 2021-11-12T08:24:39.695
+
+ 2021-11-12T08:24:39.695
+ EIDAS_ANLEGEN
+ KITT for eIDAS Matching
+
+
+ 101179
+
+ eidtapp@bmi.gv.at
+
+
+ http://eidas.europa.eu/attributes/naturalperson/CurrentFamilyName
+ DE
+
+ XXXvon Brandenburg
+ 9999-12-31
+ 9999-12-31
+
+
+
+
+ 1879000000000005
+ 2021-11-12T08:24:39.695
+
+ 2021-11-12T08:24:39.695
+ EIDAS_ANLEGEN
+ KITT for eIDAS Matching
+
+
+ 101179
+
+ eidtapp@bmi.gv.at
+
+
+ http://eidas.europa.eu/attributes/naturalperson/CurrentGivenName
+ DE
+
+ XXXClaus - Maria
+ 9999-12-31
+ 9999-12-31
+
+
+
+
+ 1879000000000005
+ 2021-11-12T08:24:39.695
+
+ 2021-11-12T08:24:39.695
+ EIDAS_ANLEGEN
+ KITT for eIDAS Matching
+
+
+ 101179
+
+ eidtapp@bmi.gv.at
+
+
+ http://eidas.europa.eu/attributes/naturalperson/DateOfBirth
+ DE
+
+ 1994-12-31
+ 9999-12-31
+ 9999-12-31
+
diff --git a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-8_kitt_get_latest_version_resp.xml b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-8_kitt_get_latest_version_resp.xml
index 447d2b55..656164f2 100644
--- a/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-8_kitt_get_latest_version_resp.xml
+++ b/eidas_modules/authmodule-eIDAS-v2/src/test/resources/data/zmr/seq_3-8_kitt_get_latest_version_resp.xml
@@ -146,7 +146,76 @@
7cEYasdfsafsaf4CDVzNT4E7cjkU4VqForjUnit
9999-12-31
9999-12-31
-
+
+
+
+
+ 1879000000000005
+ 2021-11-12T08:24:39.695
+
+ 2021-11-12T08:24:39.695
+ EIDAS_ANLEGEN
+ KITT for eIDAS Matching
+
+
+ 101179
+
+ eidtapp@bmi.gv.at
+
+
+ http://eidas.europa.eu/attributes/naturalperson/CurrentFamilyName
+ DE
+
+ XXXvon Brandenburg
+ 9999-12-31
+ 9999-12-31
+
+
+
+
+ 1879000000000005
+ 2021-11-12T08:24:39.695
+
+ 2021-11-12T08:24:39.695
+ EIDAS_ANLEGEN
+ KITT for eIDAS Matching
+
+
+ 101179
+
+ eidtapp@bmi.gv.at
+
+
+ http://eidas.europa.eu/attributes/naturalperson/CurrentGivenName
+ DE
+
+ XXXClaus - Maria
+ 9999-12-31
+ 9999-12-31
+
+
+
+
+ 1879000000000005
+ 2021-11-12T08:24:39.695
+
+ 2021-11-12T08:24:39.695
+ EIDAS_ANLEGEN
+ KITT for eIDAS Matching
+
+
+ 101179
+
+ eidtapp@bmi.gv.at
+
+
+ http://eidas.europa.eu/attributes/naturalperson/DateOfBirth
+ DE
+
+ 1994-12-31
+ 9999-12-31
+ 9999-12-31
+
--
cgit v1.2.3