On one of my recent flights, I found some inspiration to work on an RDF Calendar report. In particular, I wrote up the testing framework... http://www.w3.org/2002/12/cal/report1173.html#testdr $Revision: 1.12 $ of $Date: 2005/02/26 03:30:55 $ The report was one of the things that prompted my earlier message about timezones. While I haven't completed my investigation of DAML Time and such, I'm sufficiently confident that timezones should be treated as datatype properties that I implemented the design and updated all the test materials. I haven't written the corresponding section of the report yet. Attached find ,fromtest-report which shows 29 passes out of 29 for iCalendar to RDF conversion tests. It's generated thusly: ~/w3ccvs/WWW/2002/12/cal$ make from-test >,fromtest-report 2>&1 It depends on having a bunch of swap stuff installed; I'm not sure how much. I'd like for somebody to try to reproduce my results. http://www.w3.org/2000/10/swap/ The RDF to iCalendar results aren't as good; my toIcal.py program doesn't grok X-properties, and almost all the data files have X- properties in them. The attached ,retest-report shows 19 errors in 24 tests. But I'm pretty sure X- properties are the only problem. I'm also attaching the output of my big cvs commit command, and my changelog just to show exactly what changed. I'm not sure what are the corresponding changes to the schema; I haven't made any yet. Recalling my offer to roll back some schema changes, only to discover I hadn't rolled them forward yet... http://lists.w3.org/Archives/Public/www-rdf-calendar/2004Oct/0007.html Masahide Kanzaki encouraged me to use a new namespace URI for this new design. I'm sympathetic to that, since I'm going to have to go to each of my applications that use this RDF vocabulary and update them to use timezones as datatypes; I might as well update the namespace name while I'm at it. But I wonder if anybody has changed their mind and would rather keep the old namespace. It seems a little odd to have the test data, conversion tools, and documentation use one schema but to leave another one lying around, but maybe that's the right answer. I suppose if this were a shared library I'd change the major number... The three principles of shared library building are: * Start from 1.0 * If there is a change that is backwards compatible, bump minor number (note that ELF systems ignore the minor number) * If there is an incompatible change, bump major number -- http://www.freebsd.org/doc/en_US.ISO8859-1/books/developers-handbook/policies-shlib.html What should I call the new one? perhaps I'll change ical to cal, to make it, for example... http://www.w3.org/2002/12/cal/cal#Vevent -- Dan Connolly, W3C http://www.w3.org/People/Connolly/ D3C2 887B 0F92 6005 C541 0875 0F91 96DE 6E52 C29E python fromIcalTest.py ../../../2000/10/swap fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") fromIcal.py:853: UserWarning: @@RFC2445 seems to prohibit blank lines, but we skip them. warn("@@RFC2445 seems to prohibit blank lines, but we skip them.") ==== tag-bug :thisTest a :Success . ==== TestTermin :thisTest a :Success . ==== geo1 :thisTest a :Success . ==== Todos1 :thisTest a :Success . ==== cal01 :thisTest a :Success . ==== cal02 :thisTest a :Success . ==== mtg :thisTest a :Success . ==== bus-hrs :thisTest a :Success . ==== gkexample :thisTest a :Success . ==== openingHours :thisTest a :Success . ==== spec01-conf3 :thisTest a :Success . ==== 20030423mtg :thisTest a :Success . ==== ISWC-related :thisTest a :Success . ==== MovieInfo :thisTest a :Success . ==== MozexportAsCalendar :thisTest a :Success . ==== Chiefs :thisTest a :Success . ==== 20030115mtg :thisTest a :Success . ==== 20030122mtg :thisTest a :Success . ==== 20030205mtg :thisTest a :Success . ==== 20030212mtg :thisTest a :Success . ==== 20030226mtg :thisTest a :Success . ==== 20030312mtg :thisTest a :Success . ==== 20030326mtg :thisTest a :Success . ==== 20030409mtg :thisTest a :Success . ==== 20030410querymtg :thisTest a :Success . ==== 20030416geomtg :thisTest a :Success . ==== 20030423mtg :thisTest a :Success . ==== bus-hrs :thisTest a :Success . ==== querymeetings :thisTest a :Success . =========== 29 passes out of 29. (cd test; PYTHONPATH=../../../../2000/10/swap python cal-retest.py -i -f cal-regression.n3) loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/gkexample.rdf exporting... loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/TestTermin.rdf exporting... loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/MozexportAsCalendar.rdf exporting... loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/openingHours.rdf exporting... loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/tag-bug.rdf exporting... loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030115mtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030115mtg.rdf ,temp/20030115mtg,.rdf > ,compare/20030115mtg-compare.n3 ######### test case failed: 20030115mtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030122mtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030122mtg.rdf ,temp/20030122mtg,.rdf > ,compare/20030122mtg-compare.n3 ######### test case failed: 20030122mtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030205mtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030205mtg.rdf ,temp/20030205mtg,.rdf > ,compare/20030205mtg-compare.n3 ######### test case failed: 20030205mtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030212mtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030212mtg.rdf ,temp/20030212mtg,.rdf > ,compare/20030212mtg-compare.n3 ######### test case failed: 20030212mtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030226mtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030226mtg.rdf ,temp/20030226mtg,.rdf > ,compare/20030226mtg-compare.n3 ######### test case failed: 20030226mtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030312mtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030312mtg.rdf ,temp/20030312mtg,.rdf > ,compare/20030312mtg-compare.n3 ######### test case failed: 20030312mtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030326mtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030326mtg.rdf ,temp/20030326mtg,.rdf > ,compare/20030326mtg-compare.n3 ######### test case failed: 20030326mtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030409mtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030409mtg.rdf ,temp/20030409mtg,.rdf > ,compare/20030409mtg-compare.n3 ######### test case failed: 20030409mtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030410querymtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030410querymtg.rdf ,temp/20030410querymtg,.rdf > ,compare/20030410querymtg-compare.n3 ######### test case failed: 20030410querymtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030416geomtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030416geomtg.rdf ,temp/20030416geomtg,.rdf > ,compare/20030416geomtg-compare.n3 ######### test case failed: 20030416geomtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/20030423mtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with 20030423mtg.rdf ,temp/20030423mtg,.rdf > ,compare/20030423mtg-compare.n3 ######### test case failed: 20030423mtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/Chiefs.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with Chiefs.rdf ,temp/Chiefs,.rdf > ,compare/Chiefs-compare.n3 ######### test case failed: Chiefs loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/bus-hrs.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with bus-hrs.rdf ,temp/bus-hrs,.rdf > ,compare/bus-hrs-compare.n3 ######### test case failed: bus-hrs loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/cal01.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with cal01.rdf ,temp/cal01,.rdf > ,compare/cal01-compare.n3 ######### test case failed: cal01 loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/cal02.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with cal02.rdf ,temp/cal02,.rdf > ,compare/cal02-compare.n3 ######### test case failed: cal02 loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/mtg.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with mtg.rdf ,temp/mtg,.rdf > ,compare/mtg-compare.n3 ######### test case failed: mtg loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/querymeetings.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with querymeetings.rdf ,temp/querymeetings,.rdf > ,compare/querymeetings-compare.n3 ######### test case failed: querymeetings loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/Todos1.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with Todos1.rdf ,temp/Todos1,.rdf > ,compare/Todos1-compare.n3 ######### test case failed: Todos1 loading...file:/home/connolly/w3ccvs/WWW/2002/12/cal/test/test-created.rdf exporting... Comparison fails: executing PYTHONPATH=../../../../2000/10/swap python ../../../../2000/10/swap/cwm.py graphCompare.n3 --think --purge-rules --with test-created.rdf ,temp/test-created,.rdf > ,compare/test-created-compare.n3 ######### test case failed: test-created ######### 1) Short original case; very simple ######### 2) non-ascii characters ######### 3) Minimal export from Mozilla calendar ######### 4) Trivial case; similar to gkexample, no prodid! ######### 5) tag-bug (what was the bug?@@) ######### 6) RDF calendar meet announcement 20030115 ######### 7) RDF calendar meet announcement 20030122 ######### 8) RDF calendar meet announcement 20030205 ######### 9) RDF calendar meet announcement 20030212 ######### 10) RDF calendar meet announcement 20030226 ######### 11) RDF calendar meet announcement 20030312 ######### 12) RDF calendar meet announcement 20030326 ######### 13) RDF calendar meet announcement 20030409 ######### 14) RDF calendar meet announcement 20030410query ######### 15) RDF calendar meet announcement 20030416geo ######### 16) RDF calendar meet announcement 20030423 ######### 17) A few football games ######### 18) Bus schedule (?) with timezones, an event ######### 19) One of the original cases; fairly varied ######### 20) Extended to test DIR parameter ######### 21) Original case; straightforward timezone and event ######### 22) Yet another long test case ######### 23) Trivial case; a couple of tasks ######### 24) An event with a CREATED: property Traceback (most recent call last): File "cal-retest.py", line 198, in ? main() File "cal-retest.py", line 193, in main raise RuntimeError("Total %i errors in %i tests." % (problems, tests)) RuntimeError: Total 19 errors in 24 tests. make: *** [retest] Error 1 ? rfc2445.txt ? justIcal.n3 ? fromIcal.pyc ? formatCalendar.xsl ? XMLWriter.pyc Checking in fromIcal.py; /w3ccvs/WWW/2002/12/cal/fromIcal.py,v <-- fromIcal.py new revision: 2.24; previous revision: 2.23 done Checking in fromIcalTest.py; /w3ccvs/WWW/2002/12/cal/fromIcalTest.py,v <-- fromIcalTest.py new revision: 1.8; previous revision: 1.7 done Checking in test/20030115mtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030115mtg.rdf,v <-- 20030115mtg.rdf new revision: 1.6; previous revision: 1.5 done Checking in test/20030122mtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030122mtg.rdf,v <-- 20030122mtg.rdf new revision: 1.6; previous revision: 1.5 done Checking in test/20030205mtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030205mtg.rdf,v <-- 20030205mtg.rdf new revision: 1.5; previous revision: 1.4 done Checking in test/20030212mtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030212mtg.rdf,v <-- 20030212mtg.rdf new revision: 1.5; previous revision: 1.4 done Checking in test/20030226mtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030226mtg.rdf,v <-- 20030226mtg.rdf new revision: 1.6; previous revision: 1.5 done Checking in test/20030312mtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030312mtg.rdf,v <-- 20030312mtg.rdf new revision: 1.7; previous revision: 1.6 done Checking in test/20030326mtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030326mtg.rdf,v <-- 20030326mtg.rdf new revision: 1.7; previous revision: 1.6 done Checking in test/20030409mtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030409mtg.rdf,v <-- 20030409mtg.rdf new revision: 1.5; previous revision: 1.4 done Checking in test/20030410querymtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030410querymtg.rdf,v <-- 20030410querymtg.rdf new revision: 1.5; previous revision: 1.4 done Checking in test/20030416geomtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030416geomtg.rdf,v <-- 20030416geomtg.rdf new revision: 1.5; previous revision: 1.4 done Checking in test/20030423mtg.rdf; /w3ccvs/WWW/2002/12/cal/test/20030423mtg.rdf,v <-- 20030423mtg.rdf new revision: 1.8; previous revision: 1.7 done Checking in test/Chiefs.rdf; /w3ccvs/WWW/2002/12/cal/test/Chiefs.rdf,v <-- Chiefs.rdf new revision: 1.5; previous revision: 1.4 done Checking in test/ISWC-related.rdf; /w3ccvs/WWW/2002/12/cal/test/ISWC-related.rdf,v <-- ISWC-related.rdf new revision: 1.4; previous revision: 1.3 done Checking in test/MovieInfo.rdf; /w3ccvs/WWW/2002/12/cal/test/MovieInfo.rdf,v <-- MovieInfo.rdf new revision: 1.4; previous revision: 1.3 done Checking in test/MozMulipleVcalendars.rdf; /w3ccvs/WWW/2002/12/cal/test/MozMulipleVcalendars.rdf,v <-- MozMulipleVcalendars.rdf new revision: 1.3; previous revision: 1.2 done Checking in test/MozexportAsCalendar.rdf; /w3ccvs/WWW/2002/12/cal/test/MozexportAsCalendar.rdf,v <-- MozexportAsCalendar.rdf new revision: 1.4; previous revision: 1.3 done Checking in test/TestTermin.rdf; /w3ccvs/WWW/2002/12/cal/test/TestTermin.rdf,v <-- TestTermin.rdf new revision: 1.3; previous revision: 1.2 done Checking in test/Todos1.rdf; /w3ccvs/WWW/2002/12/cal/test/Todos1.rdf,v <-- Todos1.rdf new revision: 1.3; previous revision: 1.2 done Checking in test/bus-hrs.rdf; /w3ccvs/WWW/2002/12/cal/test/bus-hrs.rdf,v <-- bus-hrs.rdf new revision: 1.7; previous revision: 1.6 done Checking in test/cal-regression.n3; /w3ccvs/WWW/2002/12/cal/test/cal-regression.n3,v <-- cal-regression.n3 new revision: 1.4; previous revision: 1.3 done Checking in test/cal-retest.py; /w3ccvs/WWW/2002/12/cal/test/cal-retest.py,v <-- cal-retest.py new revision: 1.3; previous revision: 1.2 done RCS file: /w3ccvs/WWW/2002/12/cal/test/cal-spec-examples.n3,v done Checking in test/cal-spec-examples.n3; /w3ccvs/WWW/2002/12/cal/test/cal-spec-examples.n3,v <-- cal-spec-examples.n3 initial revision: 1.1 done Checking in test/cal01.rdf; /w3ccvs/WWW/2002/12/cal/test/cal01.rdf,v <-- cal01.rdf new revision: 1.9; previous revision: 1.8 done Checking in test/cal02.rdf; /w3ccvs/WWW/2002/12/cal/test/cal02.rdf,v <-- cal02.rdf new revision: 1.3; previous revision: 1.2 done Checking in test/geo1.rdf; /w3ccvs/WWW/2002/12/cal/test/geo1.rdf,v <-- geo1.rdf new revision: 1.4; previous revision: 1.3 done Checking in test/gkexample.rdf; /w3ccvs/WWW/2002/12/cal/test/gkexample.rdf,v <-- gkexample.rdf new revision: 1.7; previous revision: 1.6 done Checking in test/graphCompare.n3; /w3ccvs/WWW/2002/12/cal/test/graphCompare.n3,v <-- graphCompare.n3 new revision: 1.5; previous revision: 1.4 done Checking in test/mtg.rdf; /w3ccvs/WWW/2002/12/cal/test/mtg.rdf,v <-- mtg.rdf new revision: 1.9; previous revision: 1.8 done Checking in test/openingHours.rdf; /w3ccvs/WWW/2002/12/cal/test/openingHours.rdf,v <-- openingHours.rdf new revision: 1.3; previous revision: 1.2 done Checking in test/querymeetings.rdf; /w3ccvs/WWW/2002/12/cal/test/querymeetings.rdf,v <-- querymeetings.rdf new revision: 1.6; previous revision: 1.5 done Checking in test/spec01-conf3.rdf; /w3ccvs/WWW/2002/12/cal/test/spec01-conf3.rdf,v <-- spec01-conf3.rdf new revision: 1.3; previous revision: 1.2 done RCS file: /w3ccvs/WWW/2002/12/cal/test/tag-bug.ics,v done Checking in test/tag-bug.ics; /w3ccvs/WWW/2002/12/cal/test/tag-bug.ics,v <-- tag-bug.ics initial revision: 1.1 done RCS file: /w3ccvs/WWW/2002/12/cal/test/tag-bug.rdf,v done Checking in test/tag-bug.rdf; /w3ccvs/WWW/2002/12/cal/test/tag-bug.rdf,v <-- tag-bug.rdf initial revision: 1.1 done fromIcal.py - revert the uid: trick; back to uids as fragids - timezones as datatypes in dates, dateTimes - Valarm supported in Vtodo as well as Vevent (@@need test smaller than MozMulipleVcalendars.ics) - re-indented Vtodo decls while I was at it - case-fold END:xyz fromIcalTest.py - base in http space - new tag-bug case test/*.rdf - base in http space - timezones as datatypes test/cal-regression.n3 - moved tests that don't use X- first - got rid of initRDF test/cal-retest.py - replace ical2rdf.pl with fromIcal.py - base in http space test/cal-spec-examples.n3 new test/graphCompare.n3 oops; extra debug crudReceived on Saturday, 26 February 2005 04:28:35 GMT
This archive was generated by hypermail 2.2.0 + w3c-0.30 : Friday, 25 March 2005 11:20:45 GMT